diff options
| -rw-r--r-- | archaeological_operations/forms.py | 15 | ||||
| -rw-r--r-- | archaeological_operations/models.py | 26 | ||||
| -rw-r--r-- | ishtar_common/models.py | 2 | ||||
| -rw-r--r-- | ishtar_common/views_item.py | 81 | 
4 files changed, 69 insertions, 55 deletions
diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py index 866700871..63b350f28 100644 --- a/archaeological_operations/forms.py +++ b/archaeological_operations/forms.py @@ -524,9 +524,8 @@ class OperationSelect(TableSelect):      start_after = DateField(label=_(u"Started after"))      end_before = DateField(label=_(u"Ended before"))      end_after = DateField(label=_(u"Ended after")) -    relation_types = forms.MultipleChoiceField( -        label=_(u"Search within relations"), choices=[], -        widget=forms.CheckboxSelectMultiple) +    relation_types = forms.ChoiceField( +        label=_(u"Search within relations"), choices=[])      comment = forms.CharField(label=_(u"Comment"), max_length=500)      abstract = forms.CharField(label=_(u"Abstract (full text search)"))      scientific_documentation_comment = forms.CharField( @@ -594,15 +593,7 @@ class OperationSelect(TableSelect):              k = 'towns__numero_insee__startswith'              self.fields[k].choices = [                  ('', '--')] + list(settings.ISHTAR_DPTS) -        self.fields['relation_types'].choices = models.RelationType.get_types( -            empty_first=False) - -    def get_input_ids(self): -        ids = super(OperationSelect, self).get_input_ids() -        ids.pop(ids.index('relation_types')) -        for idx, c in enumerate(self.fields['relation_types'].choices): -            ids.append('relation_types_{}'.format(idx)) -        return ids +        self.fields['relation_types'].choices = models.RelationType.get_types()  class OperationFormSelection(IshtarForm): diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py index dd3302251..6f083fe7f 100644 --- a/archaeological_operations/models.py +++ b/archaeological_operations/models.py @@ -410,14 +410,34 @@ class Operation(ClosedItem, BaseHistorizedItem, OwnPerms, ValueGetter,              pgettext_lazy(TXT_SEARCH_COMMENT, u"operator"),              'operator__cached_label__iexact'          ), +        'remains': ( +            pgettext_lazy(TXT_SEARCH_COMMENT, u"remain"), +            'remains__pk' +        ),          'periods': (              pgettext_lazy(TXT_SEARCH_COMMENT, u"period"),              'periods__pk'          ), -        'remains': ( -            pgettext_lazy(TXT_SEARCH_COMMENT, u"remain"), -            'remains__pk' +        'start_before': ( +            pgettext_lazy(TXT_SEARCH_COMMENT, u"start-before"), +            'start_date__lte' +        ), +        'start_after': ( +            pgettext_lazy(TXT_SEARCH_COMMENT, u"start-after"), +            'start_date__gte' +        ), +        'end_before': ( +            pgettext_lazy(TXT_SEARCH_COMMENT, u"end-before"), +            'excavation_end_date__lte'          ), +        'end_after': ( +            pgettext_lazy(TXT_SEARCH_COMMENT, u"end-after"), +            'excavation_end_date__gte' +        ), +        'relation_types': ( +            pgettext_lazy(TXT_SEARCH_COMMENT, u"relation-types"), +            'relation_types' +        )      }      for v in ALT_NAMES.values():          EXTRA_REQUEST_KEYS[v[0]] = v[1] diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 10939deea..e2b1d5b02 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -3557,7 +3557,7 @@ class Town(Imported, models.Model):          if settings.COUNTRY == "fr":              cached_label = u"%s - %s" % (self.name, self.numero_insee[:2])          if self.year and self.children.count(): -            cached_label += " ({})".format(self.year) +            cached_label += u" ({})".format(self.year)          return cached_label diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index 0b36b9bc1..746d359c1 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -483,7 +483,7 @@ def _manage_dated_fields(dated_fields, dct):              if not dct[k]:                  dct.pop(k)              try: -                items = dct[k].split('/') +                items = dct[k].replace('"', '').split('/')                  assert len(items) == 3                  dct[k] = datetime.date(*map(lambda x: int(x),                                              reversed(items))) \ @@ -623,30 +623,33 @@ def _manage_clean_search_field(dct):  def _manage_relation_types(relation_types, dct, query, or_reqs):      for rtype_prefix in relation_types: -        vals = list(relation_types[rtype_prefix]) +        vals = relation_types[rtype_prefix]          if not vals:              continue -        alt_dct = { -            rtype_prefix + 'right_relations__relation_type__pk__in': vals} -        for k in dct: -            val = dct[k] -            if rtype_prefix: -                # only get conditions related to the object -                if rtype_prefix not in k: -                    continue -                # tricky: reconstruct the key to make sense - remove the -                # prefix from the key -                k = k[0:k.index(rtype_prefix)] + \ -                    k[k.index(rtype_prefix) + len(rtype_prefix):] -            if k.endswith('year'): -                k += '__exact' -            alt_dct[rtype_prefix + 'right_relations__right_record__' + k] = \ -                val -        if not dct: -            # fake condition to trick Django (1.4): without it only the -            # alt_dct is managed -            query &= Q(pk__isnull=False) -        query |= Q(**alt_dct) +        vals = list(vals)[0].split(';') +        for v in vals: +            alt_dct = { +                rtype_prefix + 'right_relations__relation_type__label__iexact': +                    v.replace('"', '')} +            for k in dct: +                val = dct[k] +                if rtype_prefix: +                    # only get conditions related to the object +                    if rtype_prefix not in k: +                        continue +                    # tricky: reconstruct the key to make sense - remove the +                    # prefix from the key +                    k = k[0:k.index(rtype_prefix)] + \ +                        k[k.index(rtype_prefix) + len(rtype_prefix):] +                if k.endswith('year'): +                    k += '__exact' +                alt_dct[rtype_prefix + 'right_relations__right_record__' + k] = \ +                    val +            if not dct: +                # fake condition to trick Django (1.4): without it only the +                # alt_dct is managed +                query &= Q(pk__isnull=False) +            query |= Q(**alt_dct)          for k, or_req in or_reqs:              altor_dct = alt_dct.copy()              altor_dct.pop(k) @@ -661,7 +664,7 @@ def _manage_relation_types(relation_types, dct, query, or_reqs):      return query -def _contruct_query(relation_types, dct, or_reqs, and_reqs): +def _construct_query(relation_types, dct, or_reqs, and_reqs):      # manage multi value not already managed      for key in dct.keys(): @@ -869,18 +872,6 @@ def get_item(model, func_name, default_name, extra_request_keys=[],          except ValueError:              return HttpResponse('[]', content_type='text/plain') -        # manage relations types -        if 'relation_types' not in my_relation_types_prefix: -            my_relation_types_prefix['relation_types'] = '' -        relation_types = {} -        for rtype_key in my_relation_types_prefix: -            relation_types[my_relation_types_prefix[rtype_key]] = set() -            for k in request_items: -                if k.startswith(rtype_key): -                    relation_types[my_relation_types_prefix[rtype_key]].add( -                        request_items[k]) -                    continue -          for k in request_keys:              val = request_items.get(k)              if not val: @@ -947,6 +938,18 @@ def get_item(model, func_name, default_name, extra_request_keys=[],          if 'search_vector' in dct:              search_vector = dct.pop('search_vector') +        # manage relations types +        if 'relation_types' not in my_relation_types_prefix: +            my_relation_types_prefix['relation_types'] = '' +        relation_types = {} +        for rtype_key in my_relation_types_prefix: +            relation_types[my_relation_types_prefix[rtype_key]] = set() +            for k in list(dct.keys()): +                if k.startswith(rtype_key): +                    relation_types[my_relation_types_prefix[rtype_key]].add( +                        dct.pop(k) +                    ) +          _manage_bool_fields(model, my_bool_fields, my_reversed_bool_fields,                              dct, or_reqs)          _manage_bool_fields(model, my_bool_fields, my_reversed_bool_fields, @@ -966,10 +969,10 @@ def get_item(model, func_name, default_name, extra_request_keys=[],          _manage_clean_search_field(dct)          _manage_clean_search_field(excluded_dct) -        query = _contruct_query(relation_types, dct, or_reqs, and_reqs) +        query = _construct_query(relation_types, dct, or_reqs, and_reqs)          exc_query = None          if excluded_dct or exc_and_reqs or exc_or_reqs: -            exc_query = _contruct_query( +            exc_query = _construct_query(                  relation_types, excluded_dct, exc_or_reqs, exc_and_reqs)          if query_own: @@ -986,7 +989,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[],                  upper_model, upper_key = ASSOCIATED_ITEMS[model]                  model_name = upper_model.SLUG                  current = model_name in request.session \ -                          and request.session[model_name] +                    and request.session[model_name]                  if current:                      dct = {upper_key: current}                      query &= Q(**dct)  | 
