diff --git a/pinaxcon/templates/symposion/dashboard/_categories.html b/pinaxcon/templates/symposion/dashboard/_categories.html
index 60011c25..1dc96b01 100644
--- a/pinaxcon/templates/symposion/dashboard/_categories.html
+++ b/pinaxcon/templates/symposion/dashboard/_categories.html
@@ -66,6 +66,9 @@
{% flag "badge_preview" %}
Preview my badge
{% endflag %}
+ {% flag "view_boardingpass" %}
+ View Boarding Pass
+ {% endflag %}
diff --git a/requirements.txt b/requirements.txt
index e685351a..9a1d1c56 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -44,6 +44,9 @@ pinax-stripe==4.4.0
requests==2.24.0
stripe==2.55.0
+# Regidesk
+python-barcode==0.15.1
+
# SASS Compiler and template tags
libsass==0.20.1
django-sass-processor==0.8.2
diff --git a/vendor/regidesk/regidesk/models.py b/vendor/regidesk/regidesk/models.py
index 846d3210..372e38a1 100644
--- a/vendor/regidesk/regidesk/models.py
+++ b/vendor/regidesk/regidesk/models.py
@@ -17,6 +17,8 @@ from django.db.models import Count
from django.db.models.signals import post_save
from django.contrib.auth import get_user_model
import pyqrcode
+from barcode import Code128
+from barcode.writer import ImageWriter
from symposion import constants
from symposion.text_parser import parse
@@ -155,6 +157,19 @@ class CheckIn(models.Model):
return self._checkin_code_png
+ @property
+ def barcode(self):
+ """Generates a Code 128 barcode of the checkin code.
+
+ Returns the base64 encoded raw PNG blob for the barcode.
+ """
+ barcode = Code128(self.code, writer=ImageWriter())
+ barcode_io = BytesIO()
+ barcode.write(barcode_io)
+ barcode_io.seek(0)
+ b64_barcode = base64.b64encode(barcode_io.read()).decode('UTF-8')
+ return b64_barcode
+
@property
def venueless_token(self):
"""Returns the Venueless JWT token for this checkin's code."""
diff --git a/vendor/regidesk/regidesk/templates/regidesk/_bp_prepare_help.html b/vendor/regidesk/regidesk/templates/regidesk/_bp_prepare_help.html
index 1385b679..3974412d 100644
--- a/vendor/regidesk/regidesk/templates/regidesk/_bp_prepare_help.html
+++ b/vendor/regidesk/regidesk/templates/regidesk/_bp_prepare_help.html
@@ -2,8 +2,9 @@
specific to each proposal:
{% templatetag openvariable %} user {% templatetag closevariable %} e.g. {{ sample.user }}
- {% templatetag openvariable %} qrcode {% templatetag closevariable %} e.g. {% templatetag openvariable %} qrcode|safe {% templatetag closevariable %} produces {{ sample.qrcode|safe }}
+ {% templatetag openvariable %} qrcode {% templatetag closevariable %} e.g. {% templatetag openvariable %} qrcode|safe {% templatetag closevariable %} produces Base64 encoded PNG data, to be used in an image tag. For example:

{% templatetag openvariable %} qrcode_url {% templatetag closevariable %} e.g. {{ sample.qrcode_url }}
+ {% templatetag openvariable %} barcode {% templatetag closevariable %} e.g. {% templatetag openvariable %} barcode|safe {% templatetag closevariable %} produces Base64 encoded PNG data, to be used in an image tag. For example:

{% templatetag openvariable %} code {% templatetag closevariable %} e.g. {{ sample.code }}
{% templatetag openvariable %} user.attendee.ticket_type {% templatetag closevariable %} e.g. {{ sample.user.attendee.ticket_type }}
- The variables
invoices, items_pending, items_purchased, categories_missing all return lists of the relevant things
diff --git a/vendor/regidesk/regidesk/urls.py b/vendor/regidesk/regidesk/urls.py
index d05dd326..ac5b369d 100644
--- a/vendor/regidesk/regidesk/urls.py
+++ b/vendor/regidesk/regidesk/urls.py
@@ -13,5 +13,6 @@ urlpatterns = [
url(r"^checkin/$", views.CheckInLanding.as_view(), name="check_in_scanner"),
url(r"^checkin/(?P[A-Z0-9]{6})/$", views.check_in_overview, name="check_in_user_view"),
url(r"^checkin/([A-Z0-9]{6})/badge$", views.checken_in_badge, name="check_in_badge"),
+ url(r"^checkin/([A-Z0-9]{6})/barcode.png$", views.checkin_barcode_png, name="checkin_barcode_png"),
url(r"^$", views.redir_main, name="checkin_choose"),
]
diff --git a/vendor/regidesk/regidesk/views.py b/vendor/regidesk/regidesk/views.py
index ca0ff886..9d5cbff2 100644
--- a/vendor/regidesk/regidesk/views.py
+++ b/vendor/regidesk/regidesk/views.py
@@ -58,12 +58,20 @@ def boardingpass(request):
checkin = CheckIn.objects.get_or_create(user=user)[0]
boardingpass = checkin.boardingpass
+
+ # QR code
qrcode_url = request.build_absolute_uri(reverse("regidesk:checkin_png", args=[checkin.code]))
qrcode = checkin.qrcode
qrcode_string ='
'
not_qrcode_string = '
'
+ # Barcode
+ barcode = checkin.barcode
+ barcode_string ='
'
+ not_barcode_string = '
'
+
boardingpass_body = boardingpass.html_body.replace(not_qrcode_string, qrcode_string)
+ boardingpass_body = boardingpass.html_body.replace(not_barcode_string, barcode_string)
ctx = { 'attendee': user.attendee,
'boardingpass_body': boardingpass_body,
'boardingpass': boardingpass
@@ -113,6 +121,7 @@ def boarding_overview(request, boarding_state="pending"):
return render(request, "regidesk/boardingpass_overview.html", ctx)
+
def checkin_png(request, checkin_code):
checkin = CheckIn.objects.get(checkin_code=checkin_code)
@@ -144,6 +153,22 @@ def checkin_qrcode_url(code):
return qrcode_url
+def checkin_barcode_png(request, checkin_code):
+
+ checkin = CheckIn.objects.get(checkin_code=checkin_code)
+ if not checkin:
+ raise Http404()
+
+ response = HttpResponse()
+ response["Content-Type"] = "image/png"
+ response["Content-Disposition"] = 'inline; filename="barcode.png"'
+
+ barcode = base64.b64decode(checkin.barcode)
+ response.write(barcode)
+
+ return response
+
+
@permission_required("regidesk.send_boarding_pass")
def boarding_prepare(request):
@@ -178,8 +203,9 @@ def boarding_prepare(request):
"user": sample_checkin.user,
"boardingpass": sample_checkin.boardingpass,
"code": sample_checkin.code,
- "qrcode": '
',
+ "qrcode": sample_checkin.qrcode,
"qrcode_url": checkin_qrcode_url(sample_checkin.code),
+ "barcode": sample_checkin.barcode,
}
ctx = Context(sample_ctx)
ctx["invoices"] = invoices(ctx)
@@ -222,6 +248,7 @@ def prepare_boarding_pass(user, template, attendee=None):
"code": user.checkin.code,
"qrcode": user.checkin.qrcode,
"qrcode_url": checkin_qrcode_url(user.checkin.code),
+ "barcode": user.checkin.barcode,
}
ctx = Context(ctx)
ctx["invoices"] = invoices(ctx)
@@ -264,6 +291,9 @@ def send_boarding_pass(bpass, user):
qrcode = base64.b64decode(user.checkin.qrcode)
msg.attach(filename="qrcode.png", content=qrcode, mimetype="image/png")
+ barcode = base64.b64decode(user.checkin.barcode)
+ msg.attach(filename="barcode.png", content=barcode, mimetype="image/png")
+
msg.send()
bpass.sent = datetime.now()
bpass.save()
@@ -350,6 +380,7 @@ def checken_in_badge(request, access_code):
badge = render_badge(check_in[0].user, format="svg", overlay=True)
return badge
+
@login_required
def redir_main(request):
if request.user.has_perm('regidesk.view_boarding_pass'):
diff --git a/vendor/regidesk/requirements.txt b/vendor/regidesk/requirements.txt
index a4af7f31..165a9dc3 100644
--- a/vendor/regidesk/requirements.txt
+++ b/vendor/regidesk/requirements.txt
@@ -2,3 +2,5 @@ django-countries>=6.1.3
requests>=2.24.0
pypng
pyqrcode
+python-barcode
+python-barcode[images]