summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2020-09-09 12:25:51 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2021-02-28 12:15:20 +0100
commitd2b8f1997ec52e8f32d6fa680d7107ee9421bd31 (patch)
tree0eaed830f776d8d6dee3af1776e701bef1a1f27d
parent1c10e26f76f7c406576091dcaf4eb94daf835797 (diff)
downloadIshtar-d2b8f1997ec52e8f32d6fa680d7107ee9421bd31.tar.bz2
Ishtar-d2b8f1997ec52e8f32d6fa680d7107ee9421bd31.zip
Find search: hierarchical search by container
-rw-r--r--archaeological_finds/forms.py46
-rw-r--r--archaeological_finds/models_finds.py42
-rw-r--r--ishtar_common/views_item.py58
3 files changed, 84 insertions, 62 deletions
diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py
index 46c388a13..eabe25fa0 100644
--- a/archaeological_finds/forms.py
+++ b/archaeological_finds/forms.py
@@ -50,7 +50,7 @@ from archaeological_finds.forms_treatments import TreatmentSelect, \
from archaeological_operations.models import Period, ArchaeologicalSite, \
RelationType as OpeRelationType
from archaeological_operations.widgets import OAWidget
-from archaeological_warehouse.models import Warehouse
+from archaeological_warehouse.models import Warehouse, Container
from bootstrap_datepicker.widgets import DatePicker
from ishtar_common import widgets
@@ -1268,36 +1268,52 @@ class FindSelectWarehouseModule(FindSelect):
reverse_lazy('autocomplete-warehouse'),
associated_model=Warehouse),
validators=[valid_id(Warehouse)])
- container_ref__location = forms.IntegerField(
- label=_(u"Reference container - Warehouse (location)"),
+ container = forms.IntegerField(
+ label=_("Current container"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-container'),
+ associated_model=Container),
+ validators=[valid_id(Container)])
+ container__location = forms.IntegerField(
+ label=_("Current container - Warehouse (location)"),
widget=widgets.JQueryAutoComplete(
reverse_lazy('autocomplete-warehouse'),
associated_model=Warehouse),
validators=[valid_id(Warehouse)])
- container_ref__responsible = forms.IntegerField(
- label=_(u"Reference container - Warehouse (responsible)"),
+ """
+ container__responsible = forms.IntegerField(
+ label=_(u"Current container - Warehouse (responsible)"),
widget=widgets.JQueryAutoComplete(
reverse_lazy('autocomplete-warehouse'),
associated_model=Warehouse),
validators=[valid_id(Warehouse)])
- container_ref__index = forms.IntegerField(
- label=_(u"Reference container ID"))
- container_ref__reference = forms.CharField(
- label=_(u"Reference container ref."))
- container__location = forms.IntegerField(
- label=_(u"Current container - Warehouse (location)"),
+ container__index = forms.IntegerField(label=_(u"Current container ID"))
+ container__reference = forms.CharField(label=_(u"Current container ref."))
+ """
+ container_ref = forms.IntegerField(
+ label=_("Reference container"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-container'),
+ associated_model=Container),
+ validators=[valid_id(Container)])
+ container_ref__location = forms.IntegerField(
+ label=_("Reference container - Warehouse (location)"),
widget=widgets.JQueryAutoComplete(
reverse_lazy('autocomplete-warehouse'),
associated_model=Warehouse),
validators=[valid_id(Warehouse)])
- container__responsible = forms.IntegerField(
- label=_(u"Current container - Warehouse (responsible)"),
+ """
+ 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__index = forms.IntegerField(label=_(u"Current container ID"))
- container__reference = forms.CharField(label=_(u"Current container ref."))
+ container_ref__index = forms.IntegerField(
+ label=_(u"Reference container ID"))
+ container_ref__reference = forms.CharField(
+ label=_(u"Reference container ref."))
+ """
class FindFormSelection(LockForm, CustomFormSearch):
diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py
index 3adaf90dd..b893951b7 100644
--- a/archaeological_finds/models_finds.py
+++ b/archaeological_finds/models_finds.py
@@ -938,8 +938,6 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem,
'documents__image__isnull': 'documents__image__isnull',
'container__location': 'container__location__pk',
'container__responsible': 'container__responsible__pk',
- 'container__index': 'container__index',
- 'container__reference': 'container__reference',
}
for table in (TABLE_COLS, TABLE_COLS_FOR_OPE):
for key in table:
@@ -1055,38 +1053,22 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem,
SearchAltName(
pgettext_lazy("key for text search", "checked"),
'checked_type__label__iexact'),
+ 'container_ref':
+ SearchAltName(
+ pgettext_lazy("key for text search", "container"),
+ 'container_ref__cached_label__iexact'),
'container_ref__location':
SearchAltName(
pgettext_lazy("key for text search", "location"),
'container_ref__location__name__iexact'),
- 'container_ref__responsible':
- SearchAltName(
- pgettext_lazy("key for text search", "warehouse"),
- 'container_ref__responsible__name__iexact'),
- 'container_ref__index':
- SearchAltName(
- pgettext_lazy("key for text search", "container-index"),
- 'container_ref__index'),
- 'container_ref__reference':
- SearchAltName(
- pgettext_lazy("key for text search", "container-ref"),
- 'container_ref__reference__iexact'),
'container__location':
SearchAltName(
pgettext_lazy("key for text search", "current-location"),
'container__location__name__iexact'),
- 'container__responsible':
- SearchAltName(
- pgettext_lazy("key for text search", "current-warehouse"),
- 'container__responsible__name__iexact'),
- 'container__index':
+ 'container':
SearchAltName(
- pgettext_lazy("key for text search", "current-container-index"),
- 'container__index'),
- 'container__reference':
- SearchAltName(
- pgettext_lazy("key for text search", "current-container-ref"),
- 'container__reference__iexact'),
+ pgettext_lazy("key for text search", "current-container"),
+ 'container__cached_label__iexact'),
'basket':
SearchAltName(
pgettext_lazy("key for text search", "basket"),
@@ -1380,6 +1362,7 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem,
ALT_NAMES.update(DocumentItem.ALT_NAMES)
ALT_NAMES.update(Dating.ASSOCIATED_ALT_NAMES)
+ """
DYNAMIC_REQUESTS = {
'current_division': DynamicRequest(
label=_("Division current -"),
@@ -1391,7 +1374,7 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem,
search_query='container__division__reference__iexact'
),
'reference_division': DynamicRequest(
- label=_(u"Division reference -"),
+ label=_("Division reference -"),
app_name='archaeological_warehouse', model_name='WarehouseDivision',
form_key='reference_division',
search_key=pgettext_lazy("key for text search",
@@ -1400,6 +1383,7 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem,
search_query='container_ref__division__reference__iexact'
),
}
+ """
PARENT_SEARCH_VECTORS = ['base_finds']
BASE_SEARCH_VECTORS = [
@@ -1677,7 +1661,7 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem,
@property
def short_class_name(self):
- return _(u"FIND")
+ return _("FIND")
def __str__(self):
return self.cached_label or u""
@@ -1698,6 +1682,10 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem,
'excavation_id').order_by('pk').all()
if base_find['excavation_id']])
+ @classmethod
+ def hierarchic_fields(cls):
+ return ["container", "container_ref"]
+
@property
def materials(self):
return " ; ".join([str(material)
diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py
index 97745921d..33d817a25 100644
--- a/ishtar_common/views_item.py
+++ b/ishtar_common/views_item.py
@@ -834,22 +834,29 @@ def _manage_facet_search(model, dct, and_reqs):
if base_k in HIERARCHIC_FIELDS: # already managed
continue
k = base_k + "__pk"
- if k not in dct or not dct[k].startswith(u'"') \
- or not dct[k].startswith(u'"'):
+ if k not in dct or not dct[k].startswith('"') \
+ or not dct[k].startswith('"'):
continue
val = _clean_type_val(dct.pop(k))
- if u'";"' in val:
+ if '";"' in val:
# OR request
- values = val.split(u";")
+ values = val.split(";")
else:
values = [val]
reqs = None
for val in values:
- if not val.endswith(u'"') or not val.startswith(u'"'):
+ if not val.endswith('"') or not val.startswith('"'):
continue
- suffix = "__label__icontains" if u"%" in val else \
- "__label__iexact"
- query = val[1:-1].replace(u'*', u"")
+ lbl_name = "__label__"
+ try:
+ rel = getattr(model, base_k).field.related_model
+ if not hasattr(rel, "label") and hasattr(rel, "cached_label"):
+ lbl_name = "__cached_label__"
+ except:
+ pass
+ suffix = "{}icontains".format(lbl_name) if "%" in val else \
+ "{}iexact".format(lbl_name)
+ query = val[1:-1].replace('*', "")
if not reqs:
reqs = Q(**{base_k + suffix: query})
else:
@@ -863,10 +870,13 @@ def _manage_facet_search(model, dct, and_reqs):
for k in dct:
if k in POST_PROCESS_REQUEST and dct[k]:
dct[k] = getattr(model, POST_PROCESS_REQUEST[k])(
- dct[k].replace(u'"', ''))
+ dct[k].replace('"', ''))
-def _manage_hierarchic_fields(dct, and_reqs):
+def _manage_hierarchic_fields(model, dct, and_reqs):
+ hierarchic_fields = HIERARCHIC_FIELDS[:]
+ if hasattr(model, "hierarchic_fields"):
+ hierarchic_fields = model.hierarchic_fields()
for reqs in dct.copy():
if type(reqs) not in (list, tuple):
reqs = [reqs]
@@ -928,7 +938,15 @@ def _manage_hierarchic_fields(dct, and_reqs):
# TODO: improve query with "IN ()"?
continue
- for k_hr in HIERARCHIC_FIELDS:
+ for k_hr in hierarchic_fields:
+ lbl_name = "label"
+ try:
+ rel = getattr(model, k_hr).field.related_model
+ if not hasattr(rel, "label") and hasattr(rel,
+ "cached_label"):
+ lbl_name = "cached_label"
+ except:
+ pass
if type(req) in (list, tuple):
val = dct.pop(req)
val = _clean_type_val(val)
@@ -942,7 +960,7 @@ def _manage_hierarchic_fields(dct, and_reqs):
and_reqs.append(q)
break
elif req.endswith(k_hr + '__pk') \
- or req.endswith(k_hr + '__label__iexact'):
+ or req.endswith(k_hr + '__{}__iexact'.format(lbl_name)):
val = _clean_type_val(dct.pop(req))
if '";"' in val:
@@ -954,21 +972,21 @@ def _manage_hierarchic_fields(dct, and_reqs):
reqs = None
if req.endswith('pk'):
base_suffix = "pk"
- elif req.endswith('label__iexact'):
- base_suffix = "label__iexact"
+ elif req.endswith('{}__iexact'.format(lbl_name)):
+ base_suffix = lbl_name + "__iexact"
else:
continue
for val in values:
suffix = base_suffix[:]
req = base_req[:]
- if val.endswith(u'"') and val.startswith(u'"'):
+ if val.endswith('"') and val.startswith('"'):
val = val[1:-1]
# manage search text by label
if "*" in val:
- suffix = "label__icontains"
- val = val.replace('*', u"")
+ suffix = lbl_name + "__icontains"
+ val = val.replace('*', "")
else:
- suffix = "label__iexact"
+ suffix = lbl_name + "__iexact"
req = req[:-(len(base_suffix))] + suffix
if not reqs:
@@ -1675,8 +1693,8 @@ def get_item(model, func_name, default_name, extra_request_keys=None,
_manage_dated_fields(my_dated_fields, dct)
_manage_dated_fields(my_dated_fields, excluded_dct)
- _manage_hierarchic_fields(dct, and_reqs)
- _manage_hierarchic_fields(excluded_dct, exc_and_reqs)
+ _manage_hierarchic_fields(model, dct, and_reqs)
+ _manage_hierarchic_fields(model, excluded_dct, exc_and_reqs)
_manage_facet_search(model, dct, and_reqs)
_manage_facet_search(model, excluded_dct, exc_and_reqs)