From 904b6309cf131ee6fc7e2ea8ae04f27da377f66a Mon Sep 17 00:00:00 2001 From: Philip Sargent Date: Fri, 29 Sep 2023 22:00:10 +0300 Subject: [PATCH] First attempts at reforming the FirstnameSurname parsing --- core/views/logbooks.py | 31 +++++++++++++++++++++++++++++++ urls.py | 3 ++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/core/views/logbooks.py b/core/views/logbooks.py index 09cd6b4..7f435b3 100644 --- a/core/views/logbooks.py +++ b/core/views/logbooks.py @@ -1,3 +1,5 @@ +import re + from django.db.models import Q from django.shortcuts import render from django.views.generic.list import ListView @@ -151,6 +153,35 @@ class QMs_jsonListView(ListView): template_name = "core/QMs_json_list.html" model = QM +rx_person = re.compile(r"(?i)^(([A-Z]*[a-z\-\'&;]*)[^a-zA-Z]*)([a-z\-\']*[^a-zA-Z]*[\-]*[A-Z]*[a-zA-Z\-&;]*)$") +rx_simple_person = re.compile(r"^([A-Z][a-z]*)[ ]*([A-Z][a-z]*)$") + +def better_person(request, name=""): + """Attempting to replace the name parser in urls.py with a more complex but + more understandable one in the body of the code. + Unfortuantely the get_absolute_url Django funny is making life very difficult. + This is in models/troggle.py PersonExpedition and Person + We need a defined slug for a person, however complicated their name, before we can progress further, if we + insist on using get_absolute_url(). + + Probably simpler and clearer to maintainers NOT to use ANY get_absolute_url() in the templates. + """ + names = rx_simple_person.match(name.strip(" /")) + if names: + first_name = names.group(1) + last_name = names.group(2) + else: + message = f"Name not recognised '{name}' - possibly French? (See our Proposal to fix this)" + return render(request, "errors/generic.html", {"message": message}) + + try: + this_person = Person.objects.get(first_name=first_name, last_name=last_name) + except: + message = f"Person not found {name} => '{first_name} {last_name}' - possibly Scottish? (See our Proposal to fix this)" + return render(request, "errors/generic.html", {"message": message}) + + return render(request, "person.html", {"person": this_person}) + def person( request, first_name="", diff --git a/urls.py b/urls.py index 57c09de..3ef237b 100644 --- a/urls.py +++ b/urls.py @@ -121,7 +121,8 @@ trogglepatterns = [ path('accounts/login/', expologin, name='expologin'), # same as in django.contrib.auth.urls #re_path(r'^accounts/', include('django.contrib.auth.urls')), # see site-packages\registration\auth_urls_classes.py -# Persons - nasty surname recognition logic fails for 19 people! +# Persons - nasty surname recognition logic fails for 19 people! See also Wallets by person below. + # path('person/', person, name="person"), # This is much more complex than it looks.. re_path(r'^person/(?P[A-Z]*[a-z\-\'&;]*)[^a-zA-Z]*(?P[a-z\-\']*[^a-zA-Z]*[\-]*[A-Z]*[a-zA-Z\-&;]*)/?', person, name="person"), re_path(r'^personexpedition/(?P[A-Z]*[a-z&;]*)[^a-zA-Z]*(?P[A-Z]*[a-zA-Z&;]*)/(?P\d+)/?$', personexpedition, name="personexpedition"),