Enhance boarding poass processes

* Add a note about the creation date of boarding pass
* Add a link to ticket review page
* Try to handle some of the expected errors in the boarding pass
  sending process
* don't just 502, try to handle the error and move on.
This commit is contained in:
James Polley 2018-01-18 18:43:03 +11:00
parent 28d10ff9fc
commit dc6b7f43ef
2 changed files with 51 additions and 36 deletions

View file

@ -12,9 +12,13 @@
{% ticket_type as ticket_type %}
{% block header_title %}
<h1>Boarding Pass for {{ attendee.user.email }}</h1>
<h1>Boarding Pass for {{ attendee.user.email }}</h1>
<div class="panel panel-info">
<p>This boarding pass was prepared at {{ boardingpass.created }} and was correct at that time.</p>
<p>For an up-to-date list of paid/unpaid items please see <a href="/tickets/review">this review page.</a></p>
</div>
{% endblock %}
{% block body %}
<div>{{ boardingpass|safe }}</div>
<div>{{ boardingpass_body|safe }}</div>
{% endblock %}

View file

@ -50,15 +50,16 @@ def boardingpass(request):
return redirect('/tickets/review')
prepare_boarding_pass(request, templates[0])
boardingpass = checkin.boardingpass.html_body
boardingpass = checkin.boardingpass
qrcode_url = request.build_absolute_uri(reverse("regidesk:checkin_png", args=[checkin.code]))
qrcode = checkin.qrcode
qrcode_string ='<img src="data:image/png;base64,' + qrcode + '"/>'
not_qrcode_string = '<img src="cid:qrcode.png"/>'
boardingpass = boardingpass.replace(not_qrcode_string, qrcode_string)
boardingpass_body = boardingpass.html_body.replace(not_qrcode_string, qrcode_string)
ctx = { 'attendee': user.attendee,
'boardingpass': boardingpass
'boardingpass_body': boardingpass_body,
'boardingpass': boardingpass
}
response = render(request, "regidesk/boardingpass.html", ctx)
@ -126,19 +127,28 @@ def boarding_prepare(request):
for pk in request.POST.getlist("_selected_action"):
attendee_pks.append(int(pk))
except ValueError:
return HttpResponseBadRequest()
messages.warning(request, ValueError)
return redirect("/checkin/overview")
attendees = people.Attendee.objects.filter(pk__in=attendee_pks)
attendees = attendees.select_related(
"user", "attendeeprofilebase", "attendeeprofilebase__attendeeprofile")
sample_checkin = CheckIn.objects.get_or_create(user=attendees[0].user)[0]
try:
sample_checkin = CheckIn.objects.get_or_create(user=attendees[0].user)[0]
except:
messages.warning(request, "Couldn't find a sample checking - did you add a user?")
return redirect("/checkin/overview")
rendered_template = {}
sample_ctx = {}
bp_template_pk = request.POST.get("template", "")
if bp_template_pk:
bp_template = BoardingPassTemplate.objects.get(pk=bp_template_pk)
if not bp_template_pk:
messages.warning(request, "Need to choose a template")
return redirect("/checkin/overview")
bp_template = BoardingPassTemplate.objects.get(pk=bp_template_pk)
if bp_template:
sample_ctx = {
"user": sample_checkin.user,
"boardingpass": sample_checkin.boardingpass,
@ -156,9 +166,10 @@ def boarding_prepare(request):
subject = Template(bp_template.subject).render(ctx)
rendered_template['plain'] = Template(bp_template.body).render(ctx)
rendered_template['html'] = Template(bp_template.html_body).render(ctx)
request.session['template'] = bp_template.pk
else:
bp_template = None
subject = None
request.session['template'] = None
ctx = {
"attendees": attendees,
@ -171,10 +182,7 @@ def boarding_prepare(request):
request.session.set_expiry=(300)
request.session['boarding_attendees'] = attendee_pks
request.session['template'] = bp_template.pk
response = render(request, "regidesk/boardingpass_prepare.html", ctx)
return response
return render(request, "regidesk/boardingpass_prepare.html", ctx)
def prepare_boarding_pass(request, template, attendee=None):
@ -217,7 +225,7 @@ def prepare_boarding_pass(request, template, attendee=None):
user.checkin.boardingpass = bpass
user.checkin.save()
return body, html_body
return bpass
@permission_required("regidesk.send_boarding_pass")
def boarding_send(request):
@ -230,8 +238,9 @@ def boarding_send(request):
attendees = people.Attendee.objects.filter(pk__in=request.session['boarding_attendees'])
attendees = attendees.select_related(
"user", "attendeeprofilebase", "attendeeprofilebase__attendeeprofile")
"user", "attendeeprofilebase", "attendeeprofilebase__attendeeprofile")
logging.debug(len(attendees))
logging.debug(attendees)
template_pk = request.session['template']
@ -239,27 +248,29 @@ def boarding_send(request):
for attendee in attendees:
body, html_body = prepare_boarding_pass(attendee, template)
try:
user = attendee.user
bpass = prepare_boarding_pass(request, template, attendee)
msg = EmailMultiAlternatives(
bpass.subject,
bpass.body,
bpass.from_address,
[bpass.to_address,],
)
msg.content_subtype="plain"
msg.mixed_subtype="related"
if bpass.html_body:
msg.attach_alternative(bpass.html_body, "text/html")
msg.attach(filename="qrcode.png", content=user.checkin.qrcode, mimetype="image/png")
msg = EmailMultiAlternatives(
bpass.subject,
bpass.body,
bpass.from_address,
[bpass.to_address,],
)
msg.content_subtype="plain"
msg.mixed_subtype="related"
if html_body:
msg.attach_alternative(html_body, "text/html")
msg.attach(filename="qrcode.png", content=user.checkin.qrcode, mimetype="image/png")
if user in boarding_users:
with transaction.atomic():
msg.send()
bpass.sent = datetime.now()
bpass.save()
messages.success(request, "Sent boarding pass to %s" % attendee)
if user in boarding_users:
with transaction.atomic():
msg.send()
bpass.sent = datetime.now()
bpass.save()
messages.success(request, "Sent boarding pass to %s" % attendee)
except:
messages.warning(request, "Could not send boarding pass to %s" % attendee)
request.session['boarding_attendees'].remove(attendee.pk)