summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/models.py66
1 files changed, 42 insertions, 24 deletions
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", "&gt;=",
+ "&lt;="
+ )]
+ 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