summaryrefslogtreecommitdiff
path: root/ishtar_common/models_common.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/models_common.py')
-rw-r--r--ishtar_common/models_common.py44
1 files changed, 39 insertions, 5 deletions
diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py
index 83955ab73..3f54dd5b8 100644
--- a/ishtar_common/models_common.py
+++ b/ishtar_common/models_common.py
@@ -9,10 +9,10 @@ import copy
from collections import OrderedDict
import datetime
import json
-import locale
import logging
import os
import pyqrcode
+import re
import shutil
import tempfile
import time
@@ -37,6 +37,7 @@ from django.core.validators import validate_slug
from django.db import connection
from django.db.models import Q, Count, Max
from django.db.models.signals import post_save, post_delete, m2m_changed
+from django.template import loader
from django.template.defaultfilters import slugify
from django.utils.safestring import SafeText, mark_safe
from django.utils.translation import activate, deactivate
@@ -798,6 +799,35 @@ class TemplateItem:
return templates
+class SheetFilter(models.Model):
+ key = models.CharField(_("Key"), max_length=200)
+
+ class Meta:
+ abstract = True
+
+ def get_template(self):
+ raise NotImplemented()
+
+ def get_keys(self):
+ attrs = re.compile(r"item\.([_a-zA-Z]+)")
+ includes = re.compile(r"""\{\% *include *["'](/?(?:[^/]+/?)+)["'] *\%\}""")
+ main_template = self.get_template()
+ templates = [main_template]
+ with open(main_template, "r") as fle:
+ content = fle.read()
+ keys = attrs.findall(content)
+ for line in content.split("\n"):
+ for tpl_name in includes.findall(line):
+ if tpl_name in templates:
+ continue
+ templates.append(tpl_name)
+ tpl = loader.get_template(tpl_name)
+ with open(tpl.template.origin.name, "r") as fle:
+ sub_content = fle.read()
+ keys += attrs.findall(sub_content)
+ return sorted(set(keys))
+
+
class FullSearch(models.Model):
search_vector = SearchVectorField(
_("Search vector"), blank=True, null=True, help_text=_("Auto filled at save")
@@ -3275,16 +3305,20 @@ class SerializeItem:
SERIALIZATION_FILES = []
SERIALIZE_STRING = []
- def full_serialize(self, recursion=False) -> dict:
+ def full_serialize(self, search_model=None, recursion=False) -> dict:
"""
API serialization
:return: data dict
"""
full_result = {}
serialize_fields = []
+
+ exclude = []
+ if search_model:
+ exclude = [sf.key for sf in search_model.sheet_filters.distinct().all()]
for field in self._meta.get_fields():
field_name = field.name
- if field_name in self.SERIALIZE_EXCLUDE:
+ if field_name in self.SERIALIZE_EXCLUDE or field_name in exclude:
continue
if field.many_to_one or field.one_to_one:
try:
@@ -3298,7 +3332,7 @@ class SerializeItem:
and not recursion
):
# print(field.name, self.__class__, self)
- value = value.full_serialize(recursion=True)
+ value = value.full_serialize(search_model, recursion=True)
elif field_name in self.SERIALIZATION_FILES:
try:
value = {"url": value.url}
@@ -3320,7 +3354,7 @@ class SerializeItem:
):
# print(field.name, self.__class__, self)
values = [
- v.full_serialize(recursion=True) for v in values.all()
+ v.full_serialize(search_model, recursion=True) for v in values.all()
]
else:
if first_value in self.SERIALIZATION_FILES: