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: |