diff options
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 |
commit | 98e6cea9d17f8029f9b1f253282b33177826edfb (patch) | |
tree | 2114fe50b6f9b8e4ac50b68801c0781af89b3615 | |
parent | 18b053f2ecbaebd14e5378157890aac0d685a2d8 (diff) | |
download | Ishtar-98e6cea9d17f8029f9b1f253282b33177826edfb.tar.bz2 Ishtar-98e6cea9d17f8029f9b1f253282b33177826edfb.zip |
Manage hierarchy of types in search (closes #347)
-rw-r--r-- | ishtar/furnitures/views.py | 21 |
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'], |