diff options
| -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) | 
