From 779cefeaadf04cc7c47bc1b0dc046df803828896 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 7 Jan 2021 15:35:38 +0100 Subject: [PATCH] Order codes: Remove character '8' from charset --- src/pretix/base/models/orders.py | 15 ++++++++++----- src/pretix/control/views/orders.py | 2 +- src/pretix/plugins/banktransfer/tasks.py | 4 ++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 8fc147e781..092d7097e1 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -615,21 +615,26 @@ class Order(LockModel, LoggedModel): return proposals @staticmethod - def normalize_code(code): - tr = str.maketrans({ + def normalize_code(code, is_fallback=False): + d = { '2': 'Z', '4': 'A', '5': 'S', '6': 'G', - }) + } + if is_fallback: + d['8'] = 'B' + # 8 has been removed from the character set only in 2021, which means there are a lot of order codes + # with an 8 in it around. We only want to replace this when this is used in a fallback. + tr = str.maketrans(d) return code.upper().translate(tr) def assign_code(self): # This omits some character pairs completely because they are hard to read even on screens (1/I and O/0) # and includes only one of two characters for some pairs because they are sometimes hard to distinguish in - # handwriting (2/Z, 4/A, 5/S, 6/G). This allows for better detection e.g. in incoming wire transfers that + # handwriting (2/Z, 4/A, 5/S, 6/G, 8/B). This allows for better detection e.g. in incoming wire transfers that # might include OCR'd handwritten text - charset = list('ABCDEFGHJKLMNPQRSTUVWXYZ3789') + charset = list('ABCDEFGHJKLMNPQRSTUVWXYZ379') iteration = 0 length = settings.ENTROPY['order_code'] while True: diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 1431662515..07437033f3 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -1974,7 +1974,7 @@ class OrderGo(EventPermissionRequiredMixin, View): try: return Order.objects.get(code=code, event=self.request.event) except Order.DoesNotExist: - return Order.objects.get(code=Order.normalize_code(code), event=self.request.event) + return Order.objects.get(code=Order.normalize_code(code, is_fallback=True), event=self.request.event) def get(self, request, *args, **kwargs): code = request.GET.get("code", "").upper().strip() diff --git a/src/pretix/plugins/banktransfer/tasks.py b/src/pretix/plugins/banktransfer/tasks.py index af31140eec..7f34ca36a3 100644 --- a/src/pretix/plugins/banktransfer/tasks.py +++ b/src/pretix/plugins/banktransfer/tasks.py @@ -72,7 +72,7 @@ def _handle_transaction(trans: BankTransaction, matches: tuple, event: Event = N try: orders.append(event.orders.get(code=code)) except Order.DoesNotExist: - normalized_code = Order.normalize_code(code) + normalized_code = Order.normalize_code(code, is_fallback=True) try: orders.append(event.orders.get(code=normalized_code)) except Order.DoesNotExist: @@ -83,7 +83,7 @@ def _handle_transaction(trans: BankTransaction, matches: tuple, event: Event = N try: orders.append(qs.get(event__slug__iexact=slug, code=code)) except Order.DoesNotExist: - normalized_code = Order.normalize_code(code) + normalized_code = Order.normalize_code(code, is_fallback=True) try: orders.append(qs.get(event__slug__iexact=slug, code=normalized_code)) except Order.DoesNotExist: