diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2020-10-06 19:44:11 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-02-28 12:15:21 +0100 |
commit | 9f8e22e404f30b0c26933ebc85efdb416cc7bca4 (patch) | |
tree | 04961ac0119f44f5c46cb4356733f8bf2b5b0c1d /ishtar_common | |
parent | 8b11f10de8259e2c0108434b15f97a968f5ccd93 (diff) | |
download | Ishtar-9f8e22e404f30b0c26933ebc85efdb416cc7bca4.tar.bz2 Ishtar-9f8e22e404f30b0c26933ebc85efdb416cc7bca4.zip |
Complete identifier field: database - profile settings - save
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/migrations/0206_auto_20201007_1215.py | 101 | ||||
-rw-r--r-- | ishtar_common/models.py | 59 | ||||
-rw-r--r-- | ishtar_common/models_common.py | 27 | ||||
-rw-r--r-- | ishtar_common/utils.py | 3 |
4 files changed, 175 insertions, 15 deletions
diff --git a/ishtar_common/migrations/0206_auto_20201007_1215.py b/ishtar_common/migrations/0206_auto_20201007_1215.py new file mode 100644 index 000000000..5e6d32c9a --- /dev/null +++ b/ishtar_common/migrations/0206_auto_20201007_1215.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.27 on 2020-10-07 12:15 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('ishtar_common', '0205_auto_20200527_1500'), + ] + + operations = [ + migrations.AddField( + model_name='document', + name='complete_identifier', + field=models.TextField(blank=True, verbose_name='Complete identifier'), + ), + migrations.AddField( + model_name='ishtarsiteprofile', + name='basefind_complete_identifier', + field=models.TextField(default='', help_text='Formula to manage base find complete identifier.', verbose_name='Base find complete identifier'), + ), + migrations.AddField( + model_name='ishtarsiteprofile', + name='container_complete_identifier', + field=models.TextField(default='', help_text='Formula to manage container complete identifier.', verbose_name='Container complete identifier'), + ), + migrations.AddField( + model_name='ishtarsiteprofile', + name='context_record_complete_identifier', + field=models.TextField(default='', help_text='Formula to manage context record complete identifier.', verbose_name='Context record complete identifier'), + ), + migrations.AddField( + model_name='ishtarsiteprofile', + name='document_complete_identifier', + field=models.TextField(default='', help_text='Formula to manage document complete identifier.', verbose_name='Document complete identifier'), + ), + migrations.AddField( + model_name='ishtarsiteprofile', + name='file_complete_identifier', + field=models.TextField(default='', help_text='Formula to manage archaeological file complete identifier.', verbose_name='Archaeological file complete identifier'), + ), + migrations.AddField( + model_name='ishtarsiteprofile', + name='find_complete_identifier', + field=models.TextField(default='', help_text='Formula to manage find complete identifier.', verbose_name='Find complete identifier'), + ), + migrations.AddField( + model_name='ishtarsiteprofile', + name='operation_complete_identifier', + field=models.TextField(default='', help_text='Formula to manage operation complete identifier.', verbose_name='Operation complete identifier'), + ), + migrations.AddField( + model_name='ishtarsiteprofile', + name='site_complete_identifier', + field=models.TextField(default='', help_text='Formula to manage archaeological site complete identifier.', verbose_name='Archaeological site complete identifier'), + ), + migrations.AddField( + model_name='ishtarsiteprofile', + name='warehouse_complete_identifier', + field=models.TextField(default='', help_text='Formula to manage warehouse complete identifier.', verbose_name='Warehouse complete identifier'), + ), + migrations.AlterField( + model_name='document', + name='format_type', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ishtar_common.Format', verbose_name='Medium'), + ), + migrations.AlterField( + model_name='document', + name='publisher', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='publish', to='ishtar_common.Organization', verbose_name='Publisher'), + ), + migrations.AlterField( + model_name='importercolumn', + name='regexp_pre_filter', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='columns', to='ishtar_common.Regexp'), + ), + migrations.AlterField( + model_name='importercolumn', + name='value_format', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='columns', to='ishtar_common.ValueFormater'), + ), + migrations.AlterField( + model_name='importertype', + name='associated_models', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='importer_type_associated', to='ishtar_common.ImporterModel', verbose_name='Associated model'), + ), + migrations.AlterField( + model_name='importertype', + name='created_models', + field=models.ManyToManyField(blank=True, help_text='Leave blank for no restrictions', related_name='importer_type_created', to='ishtar_common.ImporterModel', verbose_name='Models that can accept new items'), + ), + migrations.AlterField( + model_name='importtarget', + name='formater_type', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='targets', to='ishtar_common.FormaterType'), + ), + ] diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 483e15786..07a052470 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -62,7 +62,7 @@ from django.db.utils import DatabaseError from django.template.defaultfilters import slugify from django.utils.functional import lazy from ishtar_common.utils import ugettext_lazy as _, ugettext, \ - pgettext_lazy, get_external_id, get_current_profile, duplicate_item, \ + pgettext_lazy, get_generated_id, get_current_profile, duplicate_item, \ get_image_path from ishtar_common.utils_secretary import IshtarSecretaryRenderer @@ -87,21 +87,22 @@ from ishtar_common.models_common import GeneralType, HierarchicalType, \ FixAssociated, SearchAltName, HistoryError, OwnPerms, Cached, \ Address, post_save_cache, TemplateItem, SpatialReferenceSystem, \ DashboardFormItem, document_attached_changed, SearchAltName, \ - DynamicRequest, GeoItem, QRCodeItem, SearchVectorConfig, DocumentItem, \ - QuickAction, MainItem, Merge, ShortMenuItem, Town, ImageContainerModel, \ - StatisticItem, CachedGen, CascasdeUpdate, Department, State + DynamicRequest, GeoItem, CompleteIdentifierItem, SearchVectorConfig, \ + DocumentItem, QuickAction, MainItem, Merge, ShortMenuItem, Town, \ + ImageContainerModel, StatisticItem, CachedGen, CascasdeUpdate, \ + Department, State __all__ = [ 'ImporterModel', 'ImporterType', 'ImporterDefault', 'ImporterDefaultValues', 'ImporterColumn', 'ImporterDuplicateField', 'Regexp', 'ImportTarget', 'TargetKey', 'FormaterType', 'Import', 'TargetKeyGroup', 'ValueFormater', 'Organization', 'Person', 'valid_id', 'Town', 'SpatialReferenceSystem', - 'OrganizationType', 'Document', 'GeneralType', 'get_external_id', + 'OrganizationType', 'Document', 'GeneralType', 'get_generated_id', 'LightHistorizedItem', 'OwnPerms', 'Address', 'post_save_cache', 'DashboardFormItem', 'ShortMenuItem', 'document_attached_changed', - 'SearchAltName', 'DynamicRequest', 'GeoItem', 'QRCodeItem', + 'SearchAltName', 'DynamicRequest', 'GeoItem', 'SearchVectorConfig', 'DocumentItem', 'CachedGen', 'StatisticItem', - 'CascasdeUpdate', 'Department', 'State' + 'CascasdeUpdate', 'Department', 'State', 'CompleteIdentifierItem' ] logger = logging.getLogger(__name__) @@ -816,6 +817,15 @@ class IshtarSiteProfile(models.Model, Cached): _("Operation region code"), null=True, blank=True, max_length=5 ) + operation_complete_identifier = models.TextField( + _("Operation complete identifier"), + default="", + help_text=_("Formula to manage operation complete identifier.")) + site_complete_identifier = models.TextField( + _("Archaeological site complete identifier"), + default="", + help_text=_("Formula to manage archaeological site complete" + " identifier.")) file_external_id = models.TextField( _("File external id"), default="{year}-{numeric_reference}", @@ -823,6 +833,11 @@ class IshtarSiteProfile(models.Model, Cached): "Change this with care. With incorrect formula, the " "application might be unusable and import of external " "data can be destructive.")) + file_complete_identifier = models.TextField( + _("Archaeological file complete identifier"), + default="", + help_text=_("Formula to manage archaeological file complete " + "identifier.")) parcel_external_id = models.TextField( _("Parcel external id"), default="{associated_file__external_id}{operation__code_patriarche}-" @@ -838,6 +853,10 @@ class IshtarSiteProfile(models.Model, Cached): "Change this with care. With incorrect formula, the " "application might be unusable and import of external " "data can be destructive.")) + context_record_complete_identifier = models.TextField( + _("Context record complete identifier"), + default="", + help_text=_("Formula to manage context record complete identifier.")) base_find_external_id = models.TextField( _("Base find external id"), default="{context_record__external_id}-{label}", @@ -845,6 +864,10 @@ class IshtarSiteProfile(models.Model, Cached): "Change this with care. With incorrect formula, the " "application might be unusable and import of external " "data can be destructive.")) + basefind_complete_identifier = models.TextField( + _("Base find complete identifier"), + default="", + help_text=_("Formula to manage base find complete identifier.")) find_external_id = models.TextField( _("Find external id"), default="{get_first_base_find__context_record__external_id}-{label}", @@ -852,6 +875,10 @@ class IshtarSiteProfile(models.Model, Cached): "Change this with care. With incorrect formula, the " "application might be unusable and import of external " "data can be destructive.")) + find_complete_identifier = models.TextField( + _("Find complete identifier"), + default="", + help_text=_("Formula to manage find complete identifier.")) container_external_id = models.TextField( _("Container external id"), default="{parent_external_id}-{container_type__txt_idx}-" @@ -860,6 +887,10 @@ class IshtarSiteProfile(models.Model, Cached): "Change this with care. With incorrect formula, the " "application might be unusable and import of external " "data can be destructive.")) + container_complete_identifier = models.TextField( + _("Container complete identifier"), + default="", + help_text=_("Formula to manage container complete identifier.")) warehouse_external_id = models.TextField( _("Warehouse external id"), default="{name|slug}", @@ -867,6 +898,10 @@ class IshtarSiteProfile(models.Model, Cached): "Change this with care. With incorrect formula, the " "application might be unusable and import of external " "data can be destructive.")) + warehouse_complete_identifier = models.TextField( + _("Warehouse complete identifier"), + default="", + help_text=_("Formula to manage warehouse complete identifier.")) document_external_id = models.TextField( _("Document external id"), default="{index}", @@ -874,6 +909,10 @@ class IshtarSiteProfile(models.Model, Cached): "Change this with care. With incorrect formula, the " "application might be unusable and import of external " "data can be destructive.")) + document_complete_identifier = models.TextField( + _("Document complete identifier"), + default="", + help_text=_("Formula to manage document complete identifier.")) person_raw_name = models.TextField( _("Raw name for person"), default="{name|upper} {surname}", @@ -1902,7 +1941,7 @@ class Person(Address, Merge, OwnPerms, ValueGetter, MainItem): return self.cached_label or "" def _generate_cached_label(self): - lbl = get_external_id('person_raw_name', self) + lbl = get_generated_id('person_raw_name', self) if not lbl: return "-" if self.attached_to: @@ -2044,7 +2083,7 @@ class Person(Address, Merge, OwnPerms, ValueGetter, MainItem): def save(self, *args, **kwargs): super(Person, self).save(*args, **kwargs) - raw_name = get_external_id('person_raw_name', self) + raw_name = get_generated_id('person_raw_name', self) if raw_name and self.raw_name != raw_name: self.raw_name = raw_name self.save() @@ -2581,7 +2620,7 @@ post_save.connect(post_save_cache, sender=LicenseType) post_delete.connect(post_save_cache, sender=LicenseType) -class Document(BaseHistorizedItem, QRCodeItem, OwnPerms, ImageModel, +class Document(BaseHistorizedItem, CompleteIdentifierItem, OwnPerms, ImageModel, ValueGetter, MainItem): APP = "ishtar-common" MODEL = "document" diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index 20809e38e..8c5d60637 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -60,7 +60,7 @@ from ishtar_common.models_imports import Import from ishtar_common.templatetags.link_to_window import simple_link_to_window 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_external_id, get_current_profile + task, duplicate_item, get_generated_id, get_current_profile """ from ishtar_common.models import get_external_id, \ @@ -1224,7 +1224,7 @@ class BaseHistorizedItem(StatisticItem, TemplateItem, FullSearch, Imported, self.external_id and not getattr(self, 'auto_external_id', False)): return - external_id = get_external_id(self.EXTERNAL_ID_KEY, self) + external_id = get_generated_id(self.EXTERNAL_ID_KEY, self) if external_id == self.external_id: return self.auto_external_id = True @@ -2641,8 +2641,9 @@ class ImageContainerModel: return "upload/{}/{:02d}/{:02d}".format(n.year, n.month, n.day) -class QRCodeItem(models.Model, ImageContainerModel): +class CompleteIdentifierItem(models.Model, ImageContainerModel): HAS_QR_CODE = True + complete_identifier = models.TextField(_("Complete identifier"), blank=True) qrcode = models.ImageField(upload_to=get_image_path, blank=True, null=True, max_length=255) @@ -2689,6 +2690,26 @@ class QRCodeItem(models.Model, ImageContainerModel): if tmpdir_created: shutil.rmtree(tmpdir) + def generate_complete_identifier(self): + SLUG = getattr(self, "SLUG", None) + if not SLUG: + return "" + complete_identifier = get_generated_id( + SLUG + "_complete_identifier", self) + if complete_identifier: + return complete_identifier + cached_label_key = 'cached_label' + if getattr(self, 'GEO_LABEL', None): + cached_label_key = getattr(self, 'GEO_LABEL', None) + if getattr(self, "CACHED_LABELS", None): + cached_label_key = getattr(self, "CACHED_LABELS")[-1] + complete_identifier = getattr(self, cached_label_key) + return complete_identifier + + def save(self, *args, **kwargs): + self.complete_identifier = self.generate_complete_identifier() + super(CompleteIdentifierItem, self).save(*args, **kwargs) + class SearchVectorConfig: def __init__(self, key, language=None, func=None): diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py index 31459f861..70c374731 100644 --- a/ishtar_common/utils.py +++ b/ishtar_common/utils.py @@ -1782,8 +1782,7 @@ FORMULA_FILTERS = { 'deduplicate': _deduplicate } - -def get_external_id(key, item): +def get_generated_id(key, item): profile = get_current_profile() if not hasattr(profile, key): return |