From 8ee0dda5ac253e87cf334dd4d7fcdd8d48b522b8 Mon Sep 17 00:00:00 2001 From: Sachi King Date: Sat, 20 Jan 2018 18:21:38 +1100 Subject: [PATCH] Base flow for checkin scanning It's ugly... But it should do the job. Ref #40 --- .../migrations/0002_auto_20180120_1726.py | 25 ++++++ vendor/regidesk/regidesk/models.py | 15 ++++ .../regidesk/boardingpass_overview.html | 6 ++ .../templates/regidesk/ci_code_404.html | 11 +++ .../templates/regidesk/ci_landing.html | 26 +++++++ .../templates/regidesk/ci_overview.html | 78 +++++++++++++++++++ vendor/regidesk/regidesk/urls.py | 5 +- vendor/regidesk/regidesk/views.py | 46 +++++++++++ 8 files changed, 211 insertions(+), 1 deletion(-) create mode 100644 vendor/regidesk/regidesk/migrations/0002_auto_20180120_1726.py create mode 100644 vendor/regidesk/regidesk/templates/regidesk/ci_code_404.html create mode 100644 vendor/regidesk/regidesk/templates/regidesk/ci_landing.html create mode 100644 vendor/regidesk/regidesk/templates/regidesk/ci_overview.html diff --git a/vendor/regidesk/regidesk/migrations/0002_auto_20180120_1726.py b/vendor/regidesk/regidesk/migrations/0002_auto_20180120_1726.py new file mode 100644 index 00000000..448d2430 --- /dev/null +++ b/vendor/regidesk/regidesk/migrations/0002_auto_20180120_1726.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.9 on 2018-01-20 06:26 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('regidesk', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='checkin', + name='badge_printed', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='checkin', + name='schwag_given', + field=models.BooleanField(default=False), + ), + ] diff --git a/vendor/regidesk/regidesk/models.py b/vendor/regidesk/regidesk/models.py index 777e3057..5a339804 100644 --- a/vendor/regidesk/regidesk/models.py +++ b/vendor/regidesk/regidesk/models.py @@ -70,6 +70,8 @@ class CheckIn(models.Model): db_index=True, ) _checkin_code_png=models.TextField(max_length=512,null=True,blank=True) + badge_printed = models.BooleanField(default=False) + schwag_given = models.BooleanField(default=False) class Meta: permissions = ( @@ -83,6 +85,19 @@ class CheckIn(models.Model): self.checkin_code = checkin_code return super(CheckIn, self).save(*a, **k) + def mark_badge_printed(self): + self.badge_printed = True + self.save() + + def mark_schwag_given(self): + self.schwag_given = True + self.save() + + def bulk_mark_given(self): + self.badge_printed = True + self.schwag_given = True + self.save() + @property def code(self): return self.checkin_code diff --git a/vendor/regidesk/regidesk/templates/regidesk/boardingpass_overview.html b/vendor/regidesk/regidesk/templates/regidesk/boardingpass_overview.html index 99314765..aea7c982 100644 --- a/vendor/regidesk/regidesk/templates/regidesk/boardingpass_overview.html +++ b/vendor/regidesk/regidesk/templates/regidesk/boardingpass_overview.html @@ -22,6 +22,12 @@ {% endblock %} +{% block header_title %} +
+ Go to scanning page +
+{% endblock %} + {% block body %}

Boarding Pass Overview

diff --git a/vendor/regidesk/regidesk/templates/regidesk/ci_code_404.html b/vendor/regidesk/regidesk/templates/regidesk/ci_code_404.html new file mode 100644 index 00000000..6f9e8ebc --- /dev/null +++ b/vendor/regidesk/regidesk/templates/regidesk/ci_code_404.html @@ -0,0 +1,11 @@ +{% extends "regidesk/base.html" %} + + +{% block header_title %} +

404 code not found

+{% endblock %} + +{% block body %} + Return to scanning page + Go to overview +{% endblock %} diff --git a/vendor/regidesk/regidesk/templates/regidesk/ci_landing.html b/vendor/regidesk/regidesk/templates/regidesk/ci_landing.html new file mode 100644 index 00000000..c733ac5d --- /dev/null +++ b/vendor/regidesk/regidesk/templates/regidesk/ci_landing.html @@ -0,0 +1,26 @@ +{% extends "regidesk/base.html" %} + +{% block header_title %} +

Boarding pass lookup

+

Please scan or enter boarding pass code and click "Look Up"

+{% endblock %} + + +{% block body %} +
+
+ + +
+ + +
+ +{% endblock %} diff --git a/vendor/regidesk/regidesk/templates/regidesk/ci_overview.html b/vendor/regidesk/regidesk/templates/regidesk/ci_overview.html new file mode 100644 index 00000000..aafed23d --- /dev/null +++ b/vendor/regidesk/regidesk/templates/regidesk/ci_overview.html @@ -0,0 +1,78 @@ +{% extends "regidesk/base.html" %} + + +{% block header_title %} +

Pre-print check

+{% endblock %} + + +{% block body %} + {% load registrasion_tags %} + {% load lca2018_tags %} + {% items_purchased as purchased %} + {% items_pending as pending %} + {% items_purchased 1 as ticket %} + {% total_items_purchased 3 as penguin_dinner_count %} + {% total_items_purchased 4 as speakers_dinner_count %} + {% total_items_purchased 5 as pdns_count %} + {% ticket_type as ticket_type %} + +
+
Content Check
+
+
+
Ticket type
{{ ticket_type }}
+
Name
{{ user.attendee.attendeeprofilebase.attendeeprofile.name }}
+
Company
{% if ticket_type == "Student" or ticket_type == "Hobbyist" or "Only" in ticket_type %}{% else %}{{ user.attendee.attendeeprofilebase.attendeeprofile.company }}{% endif %}
+
Free Text 1
{{ user.attendee.attendeeprofilebase.attendeeprofile.free_text_1 }}
+
Free Text 2
{{ user.attendee.attendeeprofilebase.attendeeprofile.free_text_2 }}
+
Penguin Dinner Tickets
{{ penguin_dinner_count }}
+
Spearker Dinner Tickets
{{ speakers_dinner_count }}
+
PDNS Tickets
{{ pdns_count }}
+
Over 18 years
{% if user.attendee.attendeeprofilebase.attendeeprofile.of_legal_age %}yes{% else %}NO{% endif %}
+
+
+
+ +
+
Badge
+
+
+
Status
{% if check_in.badge_printed %}Marked{% else %}Not marked{% endif %} as printed
+
+
+ + Show Badge + +
+
+
+ +
+
Schwag
+
+
+
Status
{% if check_in.schwag_given %}Marked{% else %}Not marked{% endif %} as given
+
+
+ + +
+
+
+ +
+
Bulk actions
+
+
+
Status
{% if check_in.badge_printed or check_in.schwag_given %}One of the items in bulk action is marked as given already{% else %}Both items are marked as unrecived{% endif %}
+
+
+ + +
+
+
+ Return to scanning page + +{% endblock %} diff --git a/vendor/regidesk/regidesk/urls.py b/vendor/regidesk/regidesk/urls.py index 81de4aea..8aa1e555 100644 --- a/vendor/regidesk/regidesk/urls.py +++ b/vendor/regidesk/regidesk/urls.py @@ -9,5 +9,8 @@ urlpatterns = [ url(r"^([A-Z0-9]{6}).png$", views.checkin_png, name="checkin_png"), url(r"^overview/([a-z]+)?$", views.boarding_overview, name="boarding_overview"), url(r"^prepare_passes/", views.boarding_prepare, name="boarding_prepare"), - url(r"^send_passes/", views.boarding_send, name="boarding_send") + url(r"^send_passes/", views.boarding_send, name="boarding_send"), + 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"), ] diff --git a/vendor/regidesk/regidesk/views.py b/vendor/regidesk/regidesk/views.py index ba9e02ee..b2805046 100644 --- a/vendor/regidesk/regidesk/views.py +++ b/vendor/regidesk/regidesk/views.py @@ -8,6 +8,7 @@ from django.core.mail import EmailMultiAlternatives from django.conf import settings from django.contrib import messages from django.contrib.auth.decorators import permission_required, user_passes_test, login_required +from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.auth.models import User, Group from django.db import transaction from django.db.models import F, Q @@ -17,8 +18,11 @@ from django.http import HttpResponse, HttpResponseBadRequest from django.shortcuts import redirect, render from django.template import Template, Context from django.urls import reverse +from django.views.decorators.csrf import csrf_exempt +from django.views.generic import TemplateView from registrasion import util +from registrasion.views import render_badge from registrasion.models import commerce, people from registrasion.templatetags.registrasion_tags import items_purchased, items_pending from registrasion.templatetags.registrasion_tags import invoices, missing_categories @@ -280,3 +284,45 @@ def boarding_send(request): request.session['boarding_attendees'].remove(attendee.pk) return redirect("regidesk:boarding_overview") + + +class CheckInLanding(PermissionRequiredMixin, TemplateView): + template_name = 'regidesk/ci_landing.html' + permission_required = 'regidesk.view_boarding_pass' + + +@csrf_exempt +@permission_required("regidesk.view_boarding_pass") +def check_in_overview(request, access_code): + check_in = CheckIn.objects.filter( + checkin_code=access_code, + ) + if not check_in: + # yea it's a 200... + return render(request, "regidesk/ci_code_404.html", {}) + check_in = check_in[0] + if request.method == 'POST': + if 'badge' in request.POST: + check_in.mark_badge_printed() + elif 'schwag' in request.POST: + check_in.mark_schwag_given() + elif 'bulk' in request.POST: + check_in.bulk_mark_given() + return redirect(request.path) + ctx = { + 'check_in': check_in, + 'user': check_in.user, + } + return render(request, "regidesk/ci_overview.html", ctx) + + +@permission_required("regidesk.view_boarding_pass") +def checken_in_badge(request, access_code): + check_in = CheckIn.objects.filter( + checkin_code=access_code, + ) + if not check_in: + # yea it's a 200... + return render(request, "regidesk/ci_code_404.html", {}) + badge = render_badge(check_in[0].user, format="svg", overlay=True) + return badge