diff options
| -rw-r--r-- | archaeological_operations/models.py | 5 | ||||
| -rw-r--r-- | archaeological_operations/tests.py | 23 | ||||
| -rw-r--r-- | ishtar_common/templates/blocks/DataTables.html | 2 | ||||
| -rw-r--r-- | ishtar_common/views_item.py | 26 | 
4 files changed, 54 insertions, 2 deletions
| diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py index 912351f9b..b1fa4fcd8 100644 --- a/archaeological_operations/models.py +++ b/archaeological_operations/models.py @@ -380,6 +380,11 @@ class Operation(ClosedItem, BaseHistorizedItem, OwnPerms, ValueGetter,                  "key for text search (no accent, no spaces)", u"remain"),              'remains__pk'          ), +        'year': ( +            pgettext_lazy( +                "key for text search (no accent, no spaces)", u"year"), +            'year' +        ),      }      for v in ALT_NAMES.values():          EXTRA_REQUEST_KEYS[v[0]] = v[1] diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py index 4a27660d0..19724ff8b 100644 --- a/archaeological_operations/tests.py +++ b/archaeological_operations/tests.py @@ -1559,6 +1559,10 @@ class OperationSearchTest(TestCase, OperationInitTest):          final_neo = models.Period.objects.get(txt_idx='final-neolithic')          gallo = models.Period.objects.get(txt_idx="gallo-roman")          ope1.periods.add(final_neo) +        ope1.year = 2042 +        ope1.save() +        ope2.year = 2020 +        ope2.save()          ope1.periods.add(gallo)          ope2.periods.add(neo)          ope3.periods.add(gallo) @@ -1576,6 +1580,23 @@ class OperationSearchTest(TestCase, OperationInitTest):          result = json.loads(response.content)          self.assertEqual(result['recordsTotal'], 1) +        # integer field +        search_year_q = unicode( +            pgettext("key for text search (no accent, no spaces)", u"year") +        ) +        search = {'search_vector': u'{}="2042"'.format(search_year_q)} +        response = c.get(reverse('get-operation'), search) +        self.assertEqual(response.status_code, 200) +        result = json.loads(response.content) +        self.assertEqual(result['recordsTotal'], 1) + +        # many integer field +        search = {'search_vector': u'{}="2042";"2020"'.format(search_year_q)} +        response = c.get(reverse('get-operation'), search) +        self.assertEqual(response.status_code, 200) +        result = json.loads(response.content) +        self.assertEqual(result['recordsTotal'], 2) +          # hierarchic          search = {'search_vector': u'{}="{}"'.format(search_q, neo.label)}          response = c.get(reverse('get-operation'), search) @@ -1648,7 +1669,7 @@ class OperationSearchTest(TestCase, OperationInitTest):          response = c.get(reverse('get-operation'), search)          self.assertEqual(json.loads(response.content)['recordsTotal'], 2) -    def testHierarchicSearch(self): +    def test_hierarchic_search(self):          ope = self.operations[1]          c = Client() diff --git a/ishtar_common/templates/blocks/DataTables.html b/ishtar_common/templates/blocks/DataTables.html index e3e8b6a39..fdd358363 100644 --- a/ishtar_common/templates/blocks/DataTables.html +++ b/ishtar_common/templates/blocks/DataTables.html @@ -117,7 +117,7 @@ jQuery(document).ready(function(){          }          if (val){              if (data) data += "&"; -            data += key + "=" + val; +            data += key + "=" + encodeURIComponent(val);          }      }      var mygrid = jQuery("#grid_{{name}}"); diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index d19cbf7ff..d2e66ae69 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -592,6 +592,12 @@ def _manage_hierarchic_fields(dct, and_reqs):                  break +def _manage_clean_search_field(dct): +    for k in dct: +        # clean quoted search field +        dct[k] = dct[k].replace(u'"', '') + +  def _manage_relation_types(relation_types, dct, query, or_reqs):      for rtype_prefix in relation_types:          vals = list(relation_types[rtype_prefix]) @@ -633,6 +639,23 @@ def _manage_relation_types(relation_types, dct, query, or_reqs):  def _contruct_query(relation_types, dct, or_reqs, and_reqs): + +    # manage multi value not already managed +    for key in dct.keys(): +        if ";" in dct[key]: +            print(key, dct[key]) +            values = [v for v in dct[key].split(u';') if v] +            if not values: +                dct.pop(key) +                continue +            dct[key] = values[0] +            if len(values) == 1: +                continue +            for v in values[1:]: +                or_reqs.append( +                    (key, {key: v}) +                ) +      query = Q(**dct)      for k, or_req in or_reqs:          alt_dct = dct.copy() @@ -907,6 +930,9 @@ def get_item(model, func_name, default_name, extra_request_keys=[],          extras = dct.pop('extras') +        _manage_clean_search_field(dct) +        _manage_clean_search_field(excluded_dct) +          query = _contruct_query(relation_types, dct, or_reqs, and_reqs)          exc_query = None          if excluded_dct or exc_and_reqs or exc_or_reqs: | 
