From dc6b7f43ef0e2b8a7c213d09ee1ca48b25a3f575 Mon Sep 17 00:00:00 2001 From: James Polley Date: Thu, 18 Jan 2018 18:43:03 +1100 Subject: [PATCH] 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. --- .../templates/regidesk/boardingpass.html | 8 +- vendor/regidesk/regidesk/views.py | 79 +++++++++++-------- 2 files changed, 51 insertions(+), 36 deletions(-) diff --git a/vendor/regidesk/regidesk/templates/regidesk/boardingpass.html b/vendor/regidesk/regidesk/templates/regidesk/boardingpass.html index e17e3671..21adc3a3 100644 --- a/vendor/regidesk/regidesk/templates/regidesk/boardingpass.html +++ b/vendor/regidesk/regidesk/templates/regidesk/boardingpass.html @@ -12,9 +12,13 @@ {% ticket_type as ticket_type %} {% block header_title %} -

Boarding Pass for {{ attendee.user.email }}

+

Boarding Pass for {{ attendee.user.email }}

+
+

This boarding pass was prepared at {{ boardingpass.created }} and was correct at that time.

+

For an up-to-date list of paid/unpaid items please see this review page.

+
{% endblock %} {% block body %} -
{{ boardingpass|safe }}
+
{{ boardingpass_body|safe }}
{% endblock %} diff --git a/vendor/regidesk/regidesk/views.py b/vendor/regidesk/regidesk/views.py index abd4668c..daf423aa 100644 --- a/vendor/regidesk/regidesk/views.py +++ b/vendor/regidesk/regidesk/views.py @@ -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 ='' not_qrcode_string = '' - 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)