Add more tolerance about handwriting in order code detection

This commit is contained in:
Raphael Michel
2016-08-29 23:01:50 +02:00
parent e5f76d92a2
commit 1cb6c0e3da
4 changed files with 46 additions and 6 deletions

View File

@@ -198,8 +198,22 @@ class Order(LoggedModel):
else:
self.payment_fee_tax_value = Decimal('0.00')
@staticmethod
def normalize_code(code):
tr = str.maketrans({
'2': 'Z',
'4': 'A',
'5': 'S',
'6': 'G',
})
return code.upper().translate(tr)
def assign_code(self):
charset = list('ABCDEFGHKLMNPQRSTUVWXYZ23456789')
# 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
# might include OCR'd handwritten text
charset = list('ABCDEFGHJKLMNPQRSTUVWXYZ3789')
while True:
code = get_random_string(length=settings.ENTROPY['order_code'], allowed_chars=charset)
if not Order.objects.filter(event=self.event, code=code).exists():

View File

@@ -468,12 +468,20 @@ class OverView(EventPermissionRequiredMixin, TemplateView):
class OrderGo(EventPermissionRequiredMixin, View):
permission = 'can_view_orders'
def get_order(self, code):
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)
def get(self, request, *args, **kwargs):
code = request.GET.get("code", "").upper().strip()
try:
if code.startswith(request.event.slug.upper()):
code = code[len(request.event.slug.upper()):]
order = Order.objects.get(code=code, event=request.event)
code = code[len(request.event.slug):]
if code.startswith('-'):
code = code[1:]
order = self.get_order(code)
return redirect('control:event.order', event=request.event.slug, organizer=request.event.organizer.slug,
code=order.code)
except Order.DoesNotExist:

View File

@@ -214,6 +214,9 @@ class ImportView(EventPermissionRequiredMixin, TemplateView):
code = match.group(1)
row['code'] = code
order_codes.append(code)
normalized_code = Order.normalize_code(code)
if normalized_code != code:
order_codes.append(normalized_code)
orders = {}
# Perform query in bulks because of SQLite's default of SQLITE_MAX_VARIABLE_NUMBER = 999
@@ -225,8 +228,9 @@ class ImportView(EventPermissionRequiredMixin, TemplateView):
for row in data:
if 'code' not in row:
continue
if row['code'] in orders:
order = orders[row['code']]
normalized_code = Order.normalize_code(row['code'])
if row['code'] in orders or normalized_code in orders:
order = orders[row['code']] if row['code'] in orders else orders[normalized_code]
row['order'] = order
if order.status == Order.STATUS_PENDING:
amount = Decimal(row['amount'])