summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archaeological_operations/models.py5
-rw-r--r--archaeological_operations/tests.py23
-rw-r--r--ishtar_common/templates/blocks/DataTables.html2
-rw-r--r--ishtar_common/views_item.py26
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: