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:  | 
