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 | 774f682838f56443daf81c48ffde6377788a10f3 (patch) | |
tree | d3468cb46fefa64abf0f5c50d687ec29d64168aa | |
parent | 813045eb9613d8ee88faec69ec79bc2bcdb3e49a (diff) | |
download | Ishtar-774f682838f56443daf81c48ffde6377788a10f3.tar.bz2 Ishtar-774f682838f56443daf81c48ffde6377788a10f3.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): |