From 62ebb037781a1df38191823cc44a06726bc28683 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Tue, 16 Feb 2021 19:44:31 +0100 Subject: Improve document generation perf --- ishtar_common/models.py | 66 +++++++++++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 24 deletions(-) (limited to 'ishtar_common/models.py') diff --git a/ishtar_common/models.py b/ishtar_common/models.py index bf8c8c19c..2df42bc05 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -174,16 +174,17 @@ class ValueGetter(object): value = getattr(self, field_name) except (AttributeError, MultipleObjectsReturned): continue - if field_name in self.GET_VALUES_EXCLUDE_FIELDS: + if field_name in self.GET_VALUES_EXCLUDE_FIELDS or \ + prefix + field_name in exclude: continue - if prefix + field_name in exclude: + if filtr and not any( + field_name for f in filtr + if f.startswith(prefix + field_name)): 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: - continue if hasattr(self, "get_values_for_" + field_name): values[prefix + field_name] = getattr( self, "get_values_for_" + field_name)() @@ -1575,19 +1576,22 @@ class DocumentTemplate(models.Model): slugify(self.name.replace(' ', '_').lower()) + '-' + \ datetime.date.today().strftime('%Y-%m-%d') + \ "." + self.template.name.split('.')[-1] - """ - # to be tested + item_re = r"([A-Za-z0-9_.]*)(\|[A-Za-z0-9_.-]*)*[|]*" filtr = self.get_filter( self.template, - [r'{{ *([A-Za-z0-9_.]*)(\|[A-Za-z0-9_.-]*)* *}}', - r'{% *for +[A-Za-z0-9_]+ +in +' - r'([A-Za-z0-9_.]*)(\|[A-Za-z0-9_.-]*)* *%}', - r'{% *if +([A-Za-z0-9_.]*)(\|[A-Za-z0-9_.-]*)* *%}', - ] + [ + # {{ key1.key2 }} + r'{{ *' + item_re + ' *}}', + # {% for item in key1.key2 %} + r'{% *for +[A-Za-z0-9_]+ +in +' + item_re + r' *%}', + # {% if ** %} + r'{% (?:el)*if ([^}]*)%}', + ] ) - """ - filtr = [] - values = c_object.get_values() + # values = c_object.get_values(filtr=[]) + if "VALUES" in filtr: + filtr = [] + values = c_object.get_values(filtr=filtr) if not filtr or 'VALUES' in filtr: values['VALUES'] = json.dumps( values, indent=4, sort_keys=True, @@ -1624,16 +1628,37 @@ class DocumentTemplate(models.Model): filtr.append(key) new_filter = [] for fil in filtr: - keys = fil.split('.') + if not fil: + continue + new_filter += [f for f in fil.split(" ") + if f and f not in ( + "==", "not", "in", ">", "<", "!=", + ">", "<", ">=", "<=", "or", ">=", + "<=" + )] + filtr = new_filter + new_filter = [] + for fil in filtr: + if not fil or fil in ("in", "not", "el") or fil.startswith("|"): + continue + try: + int(fil) + continue + except ValueError: # not a single int + pass + keys = fil.split("|")[0].split('.') + new_filter += keys prefix = "" for k in keys: + if not k: + continue if prefix: prefix += '_' if prefix + k in new_filter: continue new_filter.append(prefix + k) prefix += k - return new_filter + return list(set(new_filter)) def publish_labels(self, objects): if not objects: @@ -1653,7 +1678,7 @@ class DocumentTemplate(models.Model): # {{items.4.key}} r'{{ *' + item_re + r' *}}', # {% if items.42.other_key %} - r'{% *if ' + item_re + r' *%}', + r'{% *(el)*if ' + item_re + r' *%}', # {% for item in items.42.another_keys %} r'{% *for +[A-Za-z0-9_]+ +in +' + item_re + r' *%}', ] @@ -2666,13 +2691,6 @@ class Basket(FullSearch, OwnPerms, ValueGetter, TemplateItem): return Q(user=ishtaruser) | Q( shared_write_with=ishtaruser) - def get_values(self, prefix='', no_values=False, filtr=None, **kwargs): - values = super(Basket, self).get_values( - prefix=prefix, no_values=no_values, filtr=filtr, **kwargs) - if not filtr or "items" in filtr: - values["items"] = [item.get_values() for item in self.items.all()] - return values - def duplicate(self, label=None, ishtaruser=None): """ Duplicate the basket. Items in basket are copied but not shared users -- cgit v1.2.3