diff options
| author | Étienne Loks <etienne.loks@iggdrasil.net> | 2020-11-13 12:40:56 +0100 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-02-28 12:15:21 +0100 | 
| commit | 448a95ee01f208122a3cddb18a0eb137f660d5d6 (patch) | |
| tree | d3468cb46fefa64abf0f5c50d687ec29d64168aa | |
| parent | b14b2251e02e0bcf0233e670a7cd1ca93cfdf3cc (diff) | |
| download | Ishtar-448a95ee01f208122a3cddb18a0eb137f660d5d6.tar.bz2 Ishtar-448a95ee01f208122a3cddb18a0eb137f660d5d6.zip  | |
Labels: fix filtering
| -rw-r--r-- | archaeological_finds/models_finds.py | 23 | ||||
| -rw-r--r-- | archaeological_finds/models_treatments.py | 3 | ||||
| -rw-r--r-- | archaeological_warehouse/models.py | 5 | ||||
| -rw-r--r-- | ishtar_common/models.py | 55 | ||||
| -rw-r--r-- | ishtar_common/models_common.py | 3 | ||||
| -rw-r--r-- | ishtar_common/utils_secretary.py | 5 | 
6 files changed, 60 insertions, 34 deletions
diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index b6dfeabfd..6e09364ac 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -363,6 +363,8 @@ class BaseFind(BulkUpdatedItem, BaseHistorizedItem, GeoItem,          no_find = kwargs.get("no_find", False)          values = super(BaseFind, self).get_values(              prefix=prefix, no_values=no_values, filtr=filtr, **kwargs) +        if not filtr or prefix + "complete_id" in filtr: +            values[prefix + "complete_id"] = self.complete_id()          if no_find:              return values          if not filtr or prefix + "finds" in filtr: @@ -1666,7 +1668,7 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem,          return _("FIND")      def __str__(self): -        return self.cached_label or u"" +        return self.cached_label or ""      @property      def short_label(self): @@ -1674,11 +1676,11 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem,      @property      def dating(self): -        return u" ; ".join([str(dating) for dating in self.datings.all()]) +        return " ; ".join([str(dating) for dating in self.datings.all()])      @property      def excavation_ids(self): -        return u" - ".join( +        return " - ".join(              [base_find['excavation_id']               for base_find in self.base_finds.values(                   'excavation_id').order_by('pk').all() @@ -1764,11 +1766,22 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem,              no_base_finds = kwargs["no_base_finds"]          values = super(Find, self).get_values(              prefix=prefix, no_values=no_values, filtr=filtr, **kwargs) -        if no_base_finds or (filtr and prefix + "base_finds" not in filtr): +        if no_base_finds: +            return values +        # by default attach first basefind data +        if filtr and prefix + "base_finds" not in filtr: +            bf = self.get_first_base_find() +            if not bf: +                return values +            v = bf.get_values( +                prefix=prefix, +                no_values=True, filtr=filtr, **kwargs) +            v.update(values) +            values = v              return values          kwargs["no_find"] = True          values[prefix + "base_finds"] = [ -            base_find.get_values(no_values=True, filtr=None, **kwargs) +            base_find.get_values(no_values=True, filtr=filtr, **kwargs)              for base_find in self.base_finds.distinct().order_by('-pk').all()          ]          return values diff --git a/archaeological_finds/models_treatments.py b/archaeological_finds/models_treatments.py index 073083af4..2bfe8d2cb 100644 --- a/archaeological_finds/models_treatments.py +++ b/archaeological_finds/models_treatments.py @@ -350,10 +350,9 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem,          if 'associatedfind_' not in prefix and self.upstream.count():              find = self.upstream.all()[0]              new_prefix = prefix + 'associatedfind_' -            new_filtr = self._get_values_update_sub_filter(filtr, new_prefix)              values.update(                  find.get_values(prefix=new_prefix, no_values=True, -                                filtr=new_filtr, **kwargs)) +                                filtr=filtr, **kwargs))          return values      def pre_save(self): diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py index b18a2df5f..5ae4de5a0 100644 --- a/archaeological_warehouse/models.py +++ b/archaeological_warehouse/models.py @@ -36,6 +36,7 @@ from django.apps import apps  from ishtar_common.data_importer import post_importer_action, \      pre_importer_action  from ishtar_common.model_managers import ExternalIdManager, UUIDModelManager +from ishtar_common.models import ValueGetter  from ishtar_common.models_common import GeneralType, \      LightHistorizedItem, OwnPerms, Address, post_save_cache, \      DashboardFormItem, document_attached_changed, SearchAltName, \ @@ -255,7 +256,7 @@ post_delete.connect(post_save_cache, sender=WarehouseType)  class Warehouse(Address, DocumentItem, GeoItem, CompleteIdentifierItem, -                OwnPerms, MainItem, DivisionContainer): +                OwnPerms, MainItem, DivisionContainer, ValueGetter):      SLUG = 'warehouse'      APP = "archaeological-warehouse"      MODEL = "warehouse" @@ -610,7 +611,7 @@ class ContainerTree(models.Model):  class Container(DocumentItem, Merge, LightHistorizedItem, CompleteIdentifierItem, GeoItem, -                OwnPerms, MainItem, DivisionContainer): +                OwnPerms, MainItem, DivisionContainer, ValueGetter):      SLUG = 'container'      APP = "archaeological-warehouse"      MODEL = "container" diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 1febb4664..89bee27cd 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -176,26 +176,17 @@ class ValueGetter(object):                  continue              if field_name in self.GET_VALUES_EXCLUDE_FIELDS:                  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: -                if hasattr(value, 'get_values'): -                    new_prefix = prefix + field_name + '_' -                    new_filtr = self._get_values_update_sub_filter(filtr, -                                                                   new_prefix) -                    values.update( -                        value.get_values(new_prefix, filtr=new_filtr, **kwargs))                  continue              if hasattr(self, "get_values_for_" + field_name):                  values[prefix + field_name] = getattr(                      self, "get_values_for_" + field_name)()              else: -                if hasattr(value, 'get_values'): -                    new_prefix = prefix + field_name + '_' -                    new_filtr = self._get_values_update_sub_filter(filtr, -                                                                   new_prefix) -                    values.update( -                        value.get_values(new_prefix, filtr=new_filtr, **kwargs)) -                else: -                    values[prefix + field_name] = value +                values[prefix + field_name] = value          values.update(self._get_values_documents(prefix=prefix, filtr=filtr))          for extra_field in self.GET_VALUES_EXTRA:              values[prefix + extra_field] = getattr(self, extra_field) or '' @@ -223,11 +214,12 @@ class ValueGetter(object):              value_list.append((key, str(values[key])))          for global_var in GlobalVar.objects.all():              values[global_var.slug] = global_var.value or "" -        values['VALUES'] = json.dumps( -            values, indent=4, sort_keys=True, -            skipkeys=True, ensure_ascii=False, -            separators=("", " : "), -        ).replace(" " * 4, "\t") +        if not filtr or 'VALUES' in filtr: +            values['VALUES'] = json.dumps( +                values, indent=4, sort_keys=True, +                skipkeys=True, ensure_ascii=False, +                separators=("", " : "), +            ).replace(" " * 4, "\t")          return values @@ -1496,7 +1488,18 @@ class DocumentTemplate(models.Model):                  key = s.groups()[0]                  if key not in filtr:                      filtr.append(key) -        return filtr +        new_filter = [] +        for fil in filtr: +            keys = fil.split('.') +            prefix = "" +            for k in keys: +                if prefix: +                    prefix += '_' +                if prefix + k in new_filter: +                    continue +                new_filter.append(prefix + k) +                prefix += k +        return new_filter      def publish_labels(self, objects):          if not objects: @@ -1509,12 +1512,18 @@ class DocumentTemplate(models.Model):          len_objects = len(objects)          names = [] +        item_re = r"items\.\d\.([A-Za-z0-9_.]*)(?:\|[^}]+)*"          filtr = self.get_filter(              self.template, -            # e.g.: {{items.4.key}} -            [r'{{ *items\.\d\.([A-Za-z0-9_.]*)(\|[A-Za-z0-9_.-]*)* *}}'] +            [ +                # {{items.4.key}} +                r'{{ *' + item_re + r' *}}', +                # {% if items.42.other_key %} +                r'{% *if ' + item_re + r' *%}', +                # {% for item in items.42.another_keys %} +                r'{% *for +[A-Za-z0-9_]+ +in +' + item_re + r' *%}', +             ]          ) -          for idx in range(int(len(objects) / self.label_per_page) + 1):              if idx * self.label_per_page >= len_objects:                  break diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index 98d435ce9..903d1d970 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -1745,7 +1745,8 @@ class Town(Imported, models.Model):                    'year': self.year or ""}          return values -    def get_values(self, prefix='', no_values=False, no_base_finds=True): +    def get_values(self, prefix='', no_values=False, filtr=None, +                   no_base_finds=True):          return {              prefix or "label": str(self),              prefix + "name": self.name, diff --git a/ishtar_common/utils_secretary.py b/ishtar_common/utils_secretary.py index 7a4e930d8..a89e4b6a0 100644 --- a/ishtar_common/utils_secretary.py +++ b/ishtar_common/utils_secretary.py @@ -43,7 +43,10 @@ def human_date_filter(value):  def splitpart(value, index, char=','):      if not value or not index:          return "" -    return value.split(char)[index] +    splited = value.split(char) +    if len(splited) > index: +        return splited[index] +    return ""  class IshtarSecretaryRenderer(Renderer):  | 
