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 <a href=\"/handbook/troggle/namesredesign.html\">Proposal to fix this</a>)" + 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 <a href=\"/handbook/troggle/namesredesign.html\">Proposal to fix this</a>)" + 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/<str:name>', person, name="person"), # This is much more complex than it looks.. re_path(r'^person/(?P<first_name>[A-Z]*[a-z\-\'&;]*)[^a-zA-Z]*(?P<last_name>[a-z\-\']*[^a-zA-Z]*[\-]*[A-Z]*[a-zA-Z\-&;]*)/?', person, name="person"), re_path(r'^personexpedition/(?P<first_name>[A-Z]*[a-z&;]*)[^a-zA-Z]*(?P<last_name>[A-Z]*[a-zA-Z&;]*)/(?P<year>\d+)/?$', personexpedition, name="personexpedition"),