From 1d7d7a72c566d41b5ffc1e5e351f8b5d6b5c340b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=AD=C3=B0ir=20Valberg=20Gu=C3=B0mundsson?= Date: Thu, 19 Aug 2021 13:07:21 +0200 Subject: [PATCH] Search for both ticket token and badge token. Figure out if the token is for a badge after finding the ticket. --- src/backoffice/views/infodesk.py | 23 ++++++++++++++--------- src/tickets/models.py | 3 +++ 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/backoffice/views/infodesk.py b/src/backoffice/views/infodesk.py index 3de60968..dfa9d6d8 100644 --- a/src/backoffice/views/infodesk.py +++ b/src/backoffice/views/infodesk.py @@ -1,14 +1,22 @@ import logging from itertools import chain +from typing import Optional from django.contrib import messages from django.contrib.auth.mixins import LoginRequiredMixin +from django.db.models import Q from django.utils import timezone from django.views.generic import ListView, TemplateView from camps.mixins import CampViewMixin from shop.models import Order, OrderProductRelation -from tickets.models import DiscountTicket, ShopTicket, SponsorTicket, TicketType +from tickets.models import ( + DiscountTicket, + ShopTicket, + SponsorTicket, + TicketType, + TicketTypeUnion, +) from ..mixins import InfoTeamPermissionMixin @@ -49,15 +57,12 @@ class TicketCheckinView(CampViewMixin, InfoTeamPermissionMixin, ListView): return list(chain(shoptickets, sponsortickets, discounttickets)) -def _ticket_getter_by_token(token): +def _ticket_getter_by_token(token) -> Optional[TicketTypeUnion]: for ticket_class in [ShopTicket, SponsorTicket, DiscountTicket]: try: - return ticket_class.objects.get(token=token), False + return ticket_class.objects.get(Q(token=token) | Q(badge_token=token)) except ticket_class.DoesNotExist: - try: - return ticket_class.objects.get(badge_token=token), True - except ticket_class.DoesNotExist: - pass + continue def _ticket_getter_by_pk(pk): @@ -88,11 +93,11 @@ class ScanTicketsView( # Slice to get rid of the first character which is a '#' ticket_token = self.request.POST.get("ticket_token")[1:] - ticket, is_badge = _ticket_getter_by_token(ticket_token) + ticket: Optional[TicketTypeUnion] = _ticket_getter_by_token(ticket_token) if ticket: context["ticket"] = ticket - context["is_badge"] = is_badge + context["is_badge"] = ticket_token == ticket.badge_token else: messages.warning(self.request, "Ticket not found!") diff --git a/src/tickets/models.py b/src/tickets/models.py index 376ec7ea..51cff43e 100644 --- a/src/tickets/models.py +++ b/src/tickets/models.py @@ -222,3 +222,6 @@ class ShopTicket(BaseTicket): @property def order(self): return self.opr.order + + +TicketTypeUnion = Union[ShopTicket, SponsorTicket, DiscountTicket]