diff options
Diffstat (limited to 'ishtar_common/models_common.py')
-rw-r--r-- | ishtar_common/models_common.py | 44 |
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: |