Store all check-in attempts, not only successful ones (#2074)

This commit is contained in:
Raphael Michel
2021-06-05 13:00:58 +02:00
committed by GitHub
parent 9c3fc69176
commit c7ef79be90
29 changed files with 849 additions and 66 deletions

View File

@@ -22,6 +22,8 @@
import base64
import inspect
import struct
from collections import namedtuple
from typing import Optional
from cryptography.hazmat.backends.openssl.backend import Backend
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
@@ -37,6 +39,8 @@ from pretix.base.models import Item, ItemVariation, SubEvent
from pretix.base.secretgenerators import pretix_sig1_pb2
from pretix.base.signals import register_ticket_secret_generators
ParsedSecret = namedtuple('AnalyzedSecret', 'item variation subevent attendee_name opaque_id')
class BaseTicketSecretGenerator:
"""
@@ -72,6 +76,14 @@ class BaseTicketSecretGenerator:
"""
return False
def parse_secret(self, secret: str) -> Optional[ParsedSecret]:
"""
Given a ``secret``, return an ``ParsedSecret`` with the information decoded from the secret, if possible.
Any value of ``ParsedSecret`` may be ``None``, and if parsing is not possible at all, you can ``None`` (as
the default implementation does).
"""
return None
def generate_secret(self, item: Item, variation: ItemVariation = None, subevent: SubEvent = None,
attendee_name: str = None, current_secret: str = None, force_invalidate=False) -> str:
"""
@@ -181,6 +193,15 @@ class Sig1TicketSecretGenerator(BaseTicketSecretGenerator):
except:
return None
def parse_secret(self, secret: str) -> Optional[ParsedSecret]:
ticket = self._parse(secret)
if ticket:
item = self.event.items.filter(pk=ticket.item).first() if ticket.item else None
subevent = self.event.subevents.filter(pk=ticket.subevent).first() if ticket.subevent else None
variation = item.variations.filter(pk=ticket.variation).first() if item and ticket.subevent else None
opaque_id = ticket.seed
return self.ParsedSecret(item=item, subevent=subevent, variation=variation, opaque_id=opaque_id, attendee_name=None)
def generate_secret(self, item: Item, variation: ItemVariation = None, subevent: SubEvent = None,
current_secret: str = None, force_invalidate=False):
if current_secret and not force_invalidate: