summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commit448a95ee01f208122a3cddb18a0eb137f660d5d6 (patch)
treed3468cb46fefa64abf0f5c50d687ec29d64168aa
parentb14b2251e02e0bcf0233e670a7cd1ca93cfdf3cc (diff)
downloadIshtar-448a95ee01f208122a3cddb18a0eb137f660d5d6.tar.bz2
Ishtar-448a95ee01f208122a3cddb18a0eb137f660d5d6.zip
Labels: fix filtering
-rw-r--r--archaeological_finds/models_finds.py23
-rw-r--r--archaeological_finds/models_treatments.py3
-rw-r--r--archaeological_warehouse/models.py5
-rw-r--r--ishtar_common/models.py55
-rw-r--r--ishtar_common/models_common.py3
-rw-r--r--ishtar_common/utils_secretary.py5
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):