From 8c534e377ebc3c79e06fa782e8846139043b4d64 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Wed, 6 May 2026 17:12:31 +0200 Subject: ✨ find criteria search - warehouse town of find's containers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- archaeological_finds/forms.py | 30 ++++++++------------------- archaeological_finds/models_finds.py | 9 +++++++++ ishtar_common/forms_common.py | 7 +++---- ishtar_common/urls.py | 2 ++ ishtar_common/views.py | 39 ++++++++++++++++++++++-------------- 5 files changed, 46 insertions(+), 41 deletions(-) diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py index 1c557c2d5..58869d108 100644 --- a/archaeological_finds/forms.py +++ b/archaeological_finds/forms.py @@ -2263,18 +2263,10 @@ class FindSelectWarehouseModule(FindSelect): ), validators=[valid_id(Warehouse)], ) - """ - container_ref__responsible = forms.IntegerField( - label=_("Reference container - Warehouse (responsible)"), - widget=widgets.JQueryAutoComplete( - reverse_lazy('autocomplete-warehouse'), - associated_model=Warehouse), - validators=[valid_id(Warehouse)]) - container_ref__index = forms.IntegerField( - label=_("Reference container ID")) - container_ref__reference = forms.CharField( - label=_("Reference container ref.")) - """ + container_ref__location__cached_town = get_town_field( + label=_("Reference container - Warehouse (location) - Town"), + simple=True + ) container = forms.IntegerField( label=_("Current container"), widget=widgets.JQueryAutoComplete( @@ -2289,16 +2281,10 @@ class FindSelectWarehouseModule(FindSelect): ), validators=[valid_id(Warehouse)], ) - """ - container__responsible = forms.IntegerField( - label=_("Current container - Warehouse (responsible)"), - widget=widgets.JQueryAutoComplete( - reverse_lazy('autocomplete-warehouse'), - associated_model=Warehouse), - validators=[valid_id(Warehouse)]) - container__index = forms.IntegerField(label=_("Current container ID")) - container__reference = forms.CharField(label=_("Current container ref.")) - """ + container__location__cached_town = get_town_field( + label=_("Current container - Warehouse (location) - Town"), + simple=True + ) class FindFormSelection(LockForm, CustomFormSearch): diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index a6f1263e1..dc62789d5 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -1658,10 +1658,19 @@ class Find( pgettext_lazy("key for text search", "location"), "container_ref__location__name__iexact", ), + "container_ref__location__cached_town": SearchAltName( + pgettext_lazy("key for text search", "container-location-town"), + "container_ref__location__cached_town__iexact", + ), "container__location": SearchAltName( pgettext_lazy("key for text search", "current-location"), "container__location__name__iexact", ), + "container__location__cached_town": SearchAltName( + pgettext_lazy("key for text search", + "current-container-location-town"), + "container__location__cached_town__iexact", + ), "container": SearchAltName( pgettext_lazy("key for text search", "current-container"), "container__cached_label__iexact", diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index d0b1183be..3243214b5 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -95,7 +95,7 @@ from archaeological_finds.models import Find, FindBasket, Treatment, TreatmentFi from archaeological_warehouse.models import Container, Warehouse -def get_town_field(label=_("Town"), required=True): +def get_town_field(label=_("Town"), simple=False, required=True): help_text = _( "

Type name, department code of the " "town you would like to select. The search is insensitive to case." @@ -106,10 +106,9 @@ def get_town_field(label=_("Town"), required=True): "department.

" ) # !FIXME hard_link, reverse_lazy doen't seem to work with formsets + url = "/autocomplete-simple-town" if simple else "/autocomplete-town" return forms.IntegerField( - widget=widgets.JQueryAutoComplete( - "/" + settings.URL_PATH + "autocomplete-town", associated_model=models.Town - ), + widget=widgets.JQueryAutoComplete(url, associated_model=models.Town), validators=[models.valid_id(models.Town)], label=label, help_text=mark_safe(help_text), diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index 5481ff25a..827e85a7a 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -565,6 +565,8 @@ urlpatterns += [ name="show-town", ), re_path(r"autocomplete-town/?$", views.autocomplete_town, name="autocomplete-town"), + re_path(r"autocomplete-simple-town/?$", views.autocomplete_simple_town, + name="autocomplete-simple-town"), re_path( r"autocomplete-advanced-town/(?P[0-9]+[ABab]?)?$", views.autocomplete_advanced_town, diff --git a/ishtar_common/views.py b/ishtar_common/views.py index e219e5633..965c9b0d1 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -1046,21 +1046,30 @@ def autocomplete_department(request): return HttpResponse(data, content_type="text/plain") -def autocomplete_town(request): - if not request.GET.get("term"): - return HttpResponse(content_type="text/plain") - q = request.GET.get("term") - q = unicodedata.normalize("NFKD", q).encode("ascii", "ignore").decode() - query = Q() - for q in q.split(" "): - extra = Q(name__unaccent__icontains=q) - if settings.COUNTRY == "fr": - extra |= Q(numero_insee__istartswith=q) - query &= extra - limit = 20 - towns = models.Town.objects.filter(query).distinct()[:limit] - data = json.dumps([{"id": town.pk, "value": str(town)} for town in towns]) - return HttpResponse(data, content_type="text/plain") +def get_autocomplete_town(cached_label=True): + def func(request): + if not request.GET.get("term"): + return HttpResponse(content_type="text/plain") + q = request.GET.get("term") + q = unicodedata.normalize("NFKD", q).encode("ascii", "ignore").decode() + query = Q() + for q in q.split(" "): + extra = Q(name__unaccent__icontains=q) + if settings.COUNTRY == "fr": + extra |= Q(numero_insee__istartswith=q) + query &= extra + limit = 20 + towns = models.Town.objects.filter(query).distinct()[:limit] + + attr = "cached_label" if cached_label else "name" + data = json.dumps([{"id": town.pk, "value": getattr(town, attr)} + for town in towns]) + return HttpResponse(data, content_type="text/plain") + return func + + +autocomplete_town = get_autocomplete_town() +autocomplete_simple_town = get_autocomplete_town(cached_label=False) def autocomplete_advanced_town(request, department_id=None, state_id=None): -- cgit v1.2.3