From 4fa501cb189c61d94a2ca53a604f3db7a212153c Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Tue, 17 Nov 2020 15:37:22 +0100 Subject: Manage a "custom_index" for base types --- ishtar_common/models_common.py | 84 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 73 insertions(+), 11 deletions(-) (limited to 'ishtar_common/models_common.py') diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index d2e118c7a..4abc81a76 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -42,7 +42,7 @@ from django.core.serializers import serialize from django.core.urlresolvers import reverse, NoReverseMatch from django.core.validators import validate_slug from django.db import connection -from django.db.models import Q, Count +from django.db.models import Q, Count, Max from django.db.models.signals import post_save, post_delete, m2m_changed from django.template.defaultfilters import slugify from django.utils.safestring import SafeText, mark_safe @@ -62,15 +62,6 @@ from ishtar_common.utils import get_cache, disable_for_loaddata, \ get_all_field_names, merge_tsvectors, cached_label_changed, post_save_geo, \ task, duplicate_item, get_generated_id, get_current_profile -""" -from ishtar_common.models import get_external_id, \ - LightHistorizedItem, OwnPerms, Address, post_save_cache, \ - DashboardFormItem, document_attached_changed, SearchAltName, \ - DynamicRequest, GeoItem, QRCodeItem, SearchVectorConfig, DocumentItem, \ - QuickAction, MainItem, Merge - - -""" logger = logging.getLogger(__name__) @@ -637,6 +628,18 @@ class HierarchicalType(GeneralType): lbls.append(item.label) return " > ".join(reversed(lbls)) + @property + def first_parent(self): + parent = self.parent + parents = [] + while parent: + if parent in parents: # prevent circular + return parent + parents.append(parent) + if not parent.parent: + return parent + parent = parent.parent + class StatisticItem: STATISTIC_MODALITIES = [] # example: "year", "operation_type__label" @@ -2645,6 +2648,7 @@ class CompleteIdentifierItem(models.Model, ImageContainerModel): HAS_QR_CODE = True complete_identifier = models.TextField(_("Complete identifier"), blank=True, null=True) + custom_index = models.IntegerField("Custom index", blank=True, null=True) qrcode = models.ImageField(upload_to=get_image_path, blank=True, null=True, max_length=255) @@ -2707,9 +2711,67 @@ class CompleteIdentifierItem(models.Model, ImageContainerModel): complete_identifier = getattr(self, cached_label_key) return complete_identifier + def generate_custom_index(self, force=False): + if not self.pk: + return + if self.custom_index and not force: + return self.custom_index + SLUG = getattr(self, "SLUG", None) + if not SLUG: + return + k = SLUG + "_custom_index" + profile = get_current_profile() + if not hasattr(profile, k): + return + key = getattr(profile, k) + if not key or not key.strip(): + return + keys = key.strip().split(";") + if len(key) == 1 and hasattr(self, "get_index_" + key): # custom index + # generation + return getattr(self, "get_index_" + key)() + model = self.__class__ + try: + self_keys = set( + list(model.objects.filter(pk=self.pk).values_list(*keys))) + except Exception: # bad settings - not managed here + return + if len(self_keys) != 1: # key is not distinct + return + self_key = self_keys.pop() + return self._get_index(keys, self_key) + + def _get_index(self, keys: list, self_keys: list): + model = self.__class__ + q = model.objects + if self.pk: + q = model.objects.exclude(pk=self.pk) + for idx, key in enumerate(keys): + q = q.filter(**{key: self_keys[idx]}) + try: + r = q.aggregate(max_index=Max('custom_index')) + except Exception: # bad settings + return + if not r['max_index']: + return 1 + return r['max_index'] + 1 + def save(self, *args, **kwargs): - self.complete_identifier = self.generate_complete_identifier() super(CompleteIdentifierItem, self).save(*args, **kwargs) + if getattr(self, "_prevent_loop", False): + return + modified = False + custom_index = self.generate_custom_index() + if custom_index != self.custom_index: + modified = True + self.custom_index = custom_index + complete_id = self.generate_complete_identifier() + if complete_id: + modified = True + self.complete_identifier = complete_id + if modified: + self._prevent_loop = True + self.save() class SearchVectorConfig: -- cgit v1.2.3