From d91e22c6565b3ceffeb1e25ed2844d20c13e4a10 Mon Sep 17 00:00:00 2001 From: Philip Sargent Date: Sun, 10 May 2026 16:12:11 +0100 Subject: [PATCH] recognising names not on expo --- core/views/new_hole.py | 119 +++++++++++++++++++++++++++++++++++----- templates/new_hole.html | 5 +- 2 files changed, 109 insertions(+), 15 deletions(-) diff --git a/core/views/new_hole.py b/core/views/new_hole.py index a2f57798..bcd0a95c 100644 --- a/core/views/new_hole.py +++ b/core/views/new_hole.py @@ -1,7 +1,9 @@ import re from django import forms from django.core.exceptions import ValidationError +from django.utils.safestring import mark_safe +from troggle.parsers.people import who_is_this from core.position_utils import which_area # file-type import, not module type. class NewHoleForm(forms.Form): @@ -22,9 +24,12 @@ class NewHoleForm(forms.Form): widget=forms.TextInput(attrs={'placeholder': 'e.g. Dour, Animal, Becka'}), max_length=255, required=True) discovery_date = forms.DateField(label="Trip date", widget=forms.DateInput(attrs={'type': 'date'}), required=True) - surface_wallet = forms.CharField(label="Wallet used to find the entrance (if any)", + surface_wallet = forms.CharField(label="Old wallet used to find the entrance (if any)", widget=forms.TextInput(attrs={'placeholder': 'e.g. 2005 # 63'}), max_length=100, required=False) + survey_wallet = forms.CharField(label="New Wallet for all this data (must match date of trip)", + widget=forms.TextInput(attrs={'placeholder': 'e.g. 2029 # 88'}), + required=True) # GPS Data gps_owner = forms.CharField(label="GPS: Whose device?", @@ -56,19 +61,17 @@ class NewHoleForm(forms.Form): # Status & Surveys is_explored = forms.BooleanField(label="Exploration complete?", required=False) ug_survey_done = forms.BooleanField(label="Survex data recorded?", required=False) - ug_survey_wallet = forms.CharField(label="Wallet id for all this data", - widget=forms.TextInput(attrs={'placeholder': 'e.g. 2029 # 88'}), - required=True) # Media: Entrance Photo (Replaced dropdown with checkboxes) photo_ent_no = forms.BooleanField(label="Entrance photos ?", required=False) - photo_ent_who = forms.CharField(label="Who has entrance photos ?", required=False) - - # Media: Tag Photo (Replaced dropdown with checkboxes) - photo_tag_no = forms.BooleanField(label="Photos of tag ?", required=False) - photo_tag_who = forms.CharField(label="Who has tag photos ?", required=False) - + photo_ent_who = forms.CharField(label="Who has photos of entrance, tag and GPS?", required=False) + who_are_you = forms.CharField(strip=True, + widget=forms.TextInput( + attrs={"size": 100, "placeholder": "You are entering data, who are you ? e.g. 'Becka' or 'Animal '", + "style": "vertical-align: text-top;"} + ) + ) # VALIDATIONS # Django's validation logic will automatically trigger these. # Trigger: When form.is_valid() is called in your new_hole view, Django automatically looks @@ -86,6 +89,96 @@ class NewHoleForm(forms.Form): # Always call the parent clean() first to get cleaned_data dictionary cleaned_data = super().clean() + trip_date = cleaned_data.get("discovery_date") + wallet_id = cleaned_data.get("survey_wallet") + + if wallet_id and trip_date: + try: + clean_wallet = "".join(wallet_id.split()) # should already be cleaned + wallet_year = int(clean_wallet[:4]) + + # Get the year from the discovery_date (a datetime.date object) + trip_year = trip_date.year + + if wallet_year != trip_year: + # Point the error at the wallet field + self.add_error('ug_survey_wallet', + f"Year mismatch: Wallet year ({wallet_year}) does not match Trip date year ({trip_year}).") + + except (ValueError, IndexError): + # Individual field cleaners (regex) will handle malformed wallet strings + pass + + # 2. Extract the year from survey_wallet (YYYY#NN) + # We only proceed if wallet_id passed its own validation earlier, + # which removes whitespace and checks the year + if wallet_id and "#" in wallet_id: + year = int(clean_wallet[:4]) + + camera_persons = cleaned_data.get("photo_ent_who").split(",") + discoverers = cleaned_data.get("discoverers").split(",") + gps_owner = cleaned_data.get("gps_owner") + + # 1.Check discoverers are valid people + intrepids = [] + for caver in discoverers: + caver = caver.strip() + + try: + person_id = who_is_this(year, caver) + except (ValueError, IndexError) as e: + print(f"ERROR: {caver} {repr(e)}") + person_id = None + + if person_id: + intrepids.append(person_id) + + else: + print(f"unrecognised: {caver} ") + error_html = mark_safe( + f"'{caver}' is not a recognized explorer for the year {year}. " + f"See aliases list" + ) + self.add_error('discoverers', error_html) + + # 1.Check photographer(s) are valid people + cameramen = [] + for caver in camera_persons: + + try: + person_id = who_is_this(year, caver) + except (ValueError, IndexError) as e: + print(f"ERROR: {caver} {repr(e)}") + person_id = None + + if person_id: + cameramen.append(person_id) + + else: + print(f"unrecognised: {caver} ") + error_html = mark_safe( + f"'{caver}' is not a recognized explorer for the year {year}. " + f"See aliases list" + ) + self.add_error('photo_ent_who', error_html) + + try: + person_id = who_is_this(year, gps_owner) + except (ValueError, IndexError) as e: + print(f"ERROR: {gps_owner} {repr(e)}") + person_id = None + + if person_id: + pass + else: + print(f"unrecognised: {gps_owner} ") + error_html = mark_safe( + f"'{gps_owner}' is not a recognized explorer for the year {year}. " + f"See aliases list" + ) + self.add_error('gps_owner', error_html) + + # Entrance Photo Logic photo_ent_on_camera = cleaned_data.get("photo_ent_on_camera") gps_screenshot = cleaned_data.get("gps_screenshot") @@ -170,13 +263,13 @@ class NewHoleForm(forms.Form): raise forms.ValidationError("Bearing must be between 0 and 360 degrees.") return bearing - def clean_ug_survey_wallet(self): - data = self.cleaned_data.get('ug_survey_wallet') + def clean_survey_wallet(self): + data = self.cleaned_data.get('survey_wallet') if not data: return data # Skip if empty (assumes required=False) - # 1. Remove all whitespace + # 1. Remove all whitespace, catches tabs etc (\t), (\n) clean_text = "".join(data.split()) # 2. Check general format using Regex (4 digits, #, 2 digits) diff --git a/templates/new_hole.html b/templates/new_hole.html index b0699e7c..81716fe2 100644 --- a/templates/new_hole.html +++ b/templates/new_hole.html @@ -19,7 +19,7 @@ div.field-tag_id input, div.field-tag_text input, div.field-surface_wallet input, - div.field-ug_survey_wallet input, + div.field-survey_wallet input, div.field-gps_owner input, div.field-gps_coords input { width: 300px; } @@ -101,7 +101,8 @@ {% elif field.name == "gps_long" %}
{{ field.label_tag }} - {{ field }} E {%if areacode %} {{areacode}}{% endif %} + {{ field }} E + {%if areacode %} {{areacode}}{% endif %} {{ field.errors }}
{# Standard Checkbox rendering #}