diff options
| -rw-r--r-- | archaeological_warehouse/forms.py | 2 | ||||
| -rw-r--r-- | archaeological_warehouse/models.py | 10 | ||||
| -rw-r--r-- | ishtar_common/views_item.py | 86 | 
3 files changed, 74 insertions, 24 deletions
| diff --git a/archaeological_warehouse/forms.py b/archaeological_warehouse/forms.py index e25161fef..1a1b2df1b 100644 --- a/archaeological_warehouse/forms.py +++ b/archaeological_warehouse/forms.py @@ -302,6 +302,8 @@ class ContainerSelect(HistorySelect):      reference = forms.CharField(label=_(u"Ref."))      old_reference = forms.CharField(label=_(u"Old reference"))      comment = forms.CharField(label=_(u"Comment")) +    no_finds = forms.NullBooleanField(label=_(u"No associated finds")) +    empty = forms.NullBooleanField(label=_(u"Currently empty"))      archaeological_sites = forms.IntegerField(          label=_("Archaeological site (attached to the operation)"), diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py index 08d773a4f..0df76875f 100644 --- a/archaeological_warehouse/models.py +++ b/archaeological_warehouse/models.py @@ -472,8 +472,18 @@ class Container(DocumentItem, LightHistorizedItem, QRCodeItem, GeoItem,              SearchAltName(                  pgettext_lazy("key for text search", u"find-description"),                  'finds__description__iexact'), +        'empty': SearchAltName( +            pgettext_lazy("key for text search", u"empty"), +            'finds' +        ), +        'no_finds': SearchAltName( +            pgettext_lazy("key for text search", u"no-associated-finds"), +            'finds_ref' +        ),      } +    REVERSED_MANY_COUNTED_FIELDS = ['finds', 'finds_ref'] +      ALT_NAMES.update(LightHistorizedItem.ALT_NAMES)      DYNAMIC_REQUESTS = { diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index d54c7d15b..1dcb01b34 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -624,31 +624,54 @@ def _search_manage_search_vector(model, dct, exc_dct, distinct_queries,  def _manage_bool_fields(model, bool_fields, reversed_bool_fields, dct, or_reqs):      bool_fields = list(bool_fields) + list(reversed_bool_fields)      for k in bool_fields: -        if k in dct: -            if dct[k] == u"1": -                dct.pop(k) -            else: -                dct[k] = dct[k].replace(u'"', u'') -                if dct[k] in [u"2", u"yes", unicode(_(u"Yes")).lower()]: -                    dct[k] = True +        if k not in dct: +            continue +        elif dct[k] == u"1": +            dct.pop(k) +            continue +        dct[k] = dct[k].replace(u'"', u'') +        if dct[k] in [u"2", u"yes", unicode(_(u"Yes")).lower()]: +            dct[k] = True +        else: +            dct[k] = False +        if k in reversed_bool_fields: +            dct[k] = not dct[k] +        # check also for empty value with image field +        field_name = k.split('__')[0] +        # TODO: can be improved in later version of Django +        try: +            c_field = model._meta.get_field(field_name) +            if k.endswith('__isnull') and \ +                    isinstance(c_field, ImageField): +                if dct[k]: +                    or_reqs.append( +                        (k, {k.split('__')[0] + '__exact': ''}))                  else: -                    dct[k] = False -                if k in reversed_bool_fields: -                    dct[k] = not dct[k] -                # check also for empty value with image field -                field_name = k.split('__')[0] -                # TODO: can be improved in later version of Django -                try: -                    c_field = model._meta.get_field(field_name) -                    if k.endswith('__isnull') and \ -                            isinstance(c_field, ImageField): -                        if dct[k]: -                            or_reqs.append( -                                (k, {k.split('__')[0] + '__exact': ''})) -                        else: -                            dct[k.split('__')[0] + '__regex'] = '.{1}.*' -                except FieldDoesNotExist: -                    pass +                    dct[k.split('__')[0] + '__regex'] = '.{1}.*' +        except FieldDoesNotExist: +            pass + + +def _manage_many_counted_fields(fields, reversed_fields, dct, excluded_dct): +    bool_fields = list(fields or []) + list(reversed_fields or []) +    for k in bool_fields: +        if k not in dct: +            continue +        elif dct[k] == u"1": +            dct.pop(k) +            continue +        dct[k] = dct[k].replace(u'"', u'') +        if dct[k] in [u"2", u"yes", unicode(_(u"Yes")).lower()]: +            dct[k] = True +        else: +            dct[k] = None +        if k in reversed_fields: +            dct[k] = True if not dct[k] else None +        if dct[k]: +            dct.pop(k) +            excluded_dct[k] = None +        else: +            dct[k] = None  today_lbl = pgettext_lazy("key for text search", u"today"), @@ -1289,6 +1312,11 @@ def get_item(model, func_name, default_name, extra_request_keys=None,          else:              my_reversed_bool_fields = reversed_bool_fields[:] \                  if reversed_bool_fields else [] + +        many_counted_fields = getattr(model, "MANY_COUNTED_FIELDS", None) +        reversed_many_counted_fields = getattr( +            model, "REVERSED_MANY_COUNTED_FIELDS", None) +          if not dated_fields and hasattr(model, 'DATED_FIELDS'):              my_dated_fields = model.DATED_FIELDS[:]          else: @@ -1476,6 +1504,16 @@ def get_item(model, func_name, default_name, extra_request_keys=None,          _manage_bool_fields(model, my_bool_fields, my_reversed_bool_fields,                              excluded_dct, exc_or_reqs) +        tmp_excluded = {} +        _manage_many_counted_fields( +            many_counted_fields, reversed_many_counted_fields, +            dct, tmp_excluded) +        _manage_many_counted_fields( +            many_counted_fields, reversed_many_counted_fields, +            excluded_dct, dct) +        if tmp_excluded: +            excluded_dct.update(tmp_excluded) +          _manage_dated_fields(my_dated_fields, dct)          _manage_dated_fields(my_dated_fields, excluded_dct) | 
