From 774f682838f56443daf81c48ffde6377788a10f3 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Fri, 13 Nov 2020 12:40:56 +0100 Subject: Labels: fix filtering --- ishtar_common/models.py | 55 ++++++++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 23 deletions(-) (limited to 'ishtar_common/models.py') diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 1febb4664..89bee27cd 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -176,26 +176,17 @@ class ValueGetter(object): continue if field_name in self.GET_VALUES_EXCLUDE_FIELDS: continue + if hasattr(value, 'get_values'): + new_prefix = prefix + field_name + '_' + values.update( + value.get_values(new_prefix, filtr=filtr, **kwargs)) if filtr and prefix + field_name not in filtr: - if hasattr(value, 'get_values'): - new_prefix = prefix + field_name + '_' - new_filtr = self._get_values_update_sub_filter(filtr, - new_prefix) - values.update( - value.get_values(new_prefix, filtr=new_filtr, **kwargs)) continue if hasattr(self, "get_values_for_" + field_name): values[prefix + field_name] = getattr( self, "get_values_for_" + field_name)() else: - if hasattr(value, 'get_values'): - new_prefix = prefix + field_name + '_' - new_filtr = self._get_values_update_sub_filter(filtr, - new_prefix) - values.update( - value.get_values(new_prefix, filtr=new_filtr, **kwargs)) - else: - values[prefix + field_name] = value + values[prefix + field_name] = value values.update(self._get_values_documents(prefix=prefix, filtr=filtr)) for extra_field in self.GET_VALUES_EXTRA: values[prefix + extra_field] = getattr(self, extra_field) or '' @@ -223,11 +214,12 @@ class ValueGetter(object): value_list.append((key, str(values[key]))) for global_var in GlobalVar.objects.all(): values[global_var.slug] = global_var.value or "" - values['VALUES'] = json.dumps( - values, indent=4, sort_keys=True, - skipkeys=True, ensure_ascii=False, - separators=("", " : "), - ).replace(" " * 4, "\t") + if not filtr or 'VALUES' in filtr: + values['VALUES'] = json.dumps( + values, indent=4, sort_keys=True, + skipkeys=True, ensure_ascii=False, + separators=("", " : "), + ).replace(" " * 4, "\t") return values @@ -1496,7 +1488,18 @@ class DocumentTemplate(models.Model): key = s.groups()[0] if key not in filtr: filtr.append(key) - return filtr + new_filter = [] + for fil in filtr: + keys = fil.split('.') + prefix = "" + for k in keys: + if prefix: + prefix += '_' + if prefix + k in new_filter: + continue + new_filter.append(prefix + k) + prefix += k + return new_filter def publish_labels(self, objects): if not objects: @@ -1509,12 +1512,18 @@ class DocumentTemplate(models.Model): len_objects = len(objects) names = [] + item_re = r"items\.\d\.([A-Za-z0-9_.]*)(?:\|[^}]+)*" filtr = self.get_filter( self.template, - # e.g.: {{items.4.key}} - [r'{{ *items\.\d\.([A-Za-z0-9_.]*)(\|[A-Za-z0-9_.-]*)* *}}'] + [ + # {{items.4.key}} + r'{{ *' + item_re + r' *}}', + # {% if items.42.other_key %} + r'{% *if ' + item_re + r' *%}', + # {% for item in items.42.another_keys %} + r'{% *for +[A-Za-z0-9_]+ +in +' + item_re + r' *%}', + ] ) - for idx in range(int(len(objects) / self.label_per_page) + 1): if idx * self.label_per_page >= len_objects: break -- cgit v1.2.3