diff options
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 |
commit | eb44d76df31c2ba612b4c1fb41bdf43d01fa7e22 (patch) | |
tree | 0eaed830f776d8d6dee3af1776e701bef1a1f27d | |
parent | 5a0c6185ac0e8facc3386d48d056cc537617271c (diff) | |
download | Ishtar-eb44d76df31c2ba612b4c1fb41bdf43d01fa7e22.tar.bz2 Ishtar-eb44d76df31c2ba612b4c1fb41bdf43d01fa7e22.zip |
Find search: hierarchical search by container
-rw-r--r-- | archaeological_finds/forms.py | 46 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 42 | ||||
-rw-r--r-- | ishtar_common/views_item.py | 58 |
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) |