summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2026-05-06 17:12:31 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2026-05-06 17:26:01 +0200
commit8c534e377ebc3c79e06fa782e8846139043b4d64 (patch)
treed37960a6317ee75336c1f93bfce668af2bf0fa49
parent64d8d9579a367309e95b752091d70e13ee08e651 (diff)
downloadIshtar-8c534e377ebc3c79e06fa782e8846139043b4d64.tar.bz2
Ishtar-8c534e377ebc3c79e06fa782e8846139043b4d64.zip
✨ find criteria search - warehouse town of find's containers
-rw-r--r--archaeological_finds/forms.py30
-rw-r--r--archaeological_finds/models_finds.py9
-rw-r--r--ishtar_common/forms_common.py7
-rw-r--r--ishtar_common/urls.py2
-rw-r--r--ishtar_common/views.py39
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 = _(
"<p>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.</p>"
)
# !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<department_id>[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):