summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@peacefrogs.net>2011-04-29 23:35:55 +0200
committerÉtienne Loks <etienne.loks@peacefrogs.net>2011-04-29 23:35:55 +0200
commit98e6cea9d17f8029f9b1f253282b33177826edfb (patch)
tree2114fe50b6f9b8e4ac50b68801c0781af89b3615
parent18b053f2ecbaebd14e5378157890aac0d685a2d8 (diff)
downloadIshtar-98e6cea9d17f8029f9b1f253282b33177826edfb.tar.bz2
Ishtar-98e6cea9d17f8029f9b1f253282b33177826edfb.zip
Manage hierarchy of types in search (closes #347)
-rw-r--r--ishtar/furnitures/views.py21
1 files changed, 19 insertions, 2 deletions
diff --git a/ishtar/furnitures/views.py b/ishtar/furnitures/views.py
index 107d9f3ea..66dfb7e8f 100644
--- a/ishtar/furnitures/views.py
+++ b/ishtar/furnitures/views.py
@@ -158,8 +158,10 @@ def format_val(val):
return unicode(_(u"False"))
return unicode(val)
+HIERARCHIC_LEVELS = 5
+HIERARCHIC_FIELDS = ['period', 'unit', 'material']
def get_item(model, func_name, default_name, extra_request_keys=[],
- bool_fields=[]):
+ bool_fields=[]):
"""
Generic treatment of tables
"""
@@ -199,7 +201,22 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
dct.pop(k)
else:
dct[k] = dct[k] == u"2" and True or False
+ # manage hierarchic conditions
+ or_reqs = []
+ for k in HIERARCHIC_FIELDS:
+ for req in dct.copy():
+ if req.startswith(k):
+ val = dct.pop(req)
+ reqs = Q(**{req:val})
+ req = req[:-2] + '__'
+ for idx in xrange(HIERARCHIC_LEVELS):
+ req = req[:-2] + 'parent__pk'
+ q = Q(**{req:val})
+ reqs = reqs | q
+ or_reqs.append(reqs)
query = Q(**dct)
+ for or_req in or_reqs:
+ query = query & or_req
items = model.objects.filter(query)
q = request_items.get('sidx')
# manage tables
@@ -456,7 +473,7 @@ get_contextrecord = get_item(models.ContextRecord,
'get_contextrecord', 'contextrecord',
extra_request_keys={'parcel__town':'parcel__town__pk',
'parcel__operation__year':'parcel__operation__year__contains',
- 'datings__period':'datings__period__pk'})
+ 'datings__period':'datings__period__pk'},)
get_archaeologicalitem = get_item(models.Item,
'get_archaeologicalitem', 'item',
bool_fields = ['base_items__is_isolated'],