diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-07-27 11:49:04 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-07-27 11:49:04 +0200 |
commit | 4ad9278e67d8fb024c685df03812c2e1d8313aa1 (patch) | |
tree | dde04c38350d5952174ae29f189c132e56061b3b /archaeological_finds/models.py | |
parent | 1b754a300be8844e2e0b45839639cb92002d5d5e (diff) | |
download | Ishtar-4ad9278e67d8fb024c685df03812c2e1d8313aa1.tar.bz2 Ishtar-4ad9278e67d8fb024c685df03812c2e1d8313aa1.zip |
Sync external ID on manual insert (refs #3161)
Diffstat (limited to 'archaeological_finds/models.py')
-rw-r--r-- | archaeological_finds/models.py | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/archaeological_finds/models.py b/archaeological_finds/models.py index 7d4eadbf6..dc626feee 100644 --- a/archaeological_finds/models.py +++ b/archaeological_finds/models.py @@ -23,11 +23,12 @@ from django.conf import settings from django.contrib.gis.db import models from django.core.urlresolvers import reverse from django.db.models import Max, Q +from django.db.models.signals import m2m_changed from django.utils.translation import ugettext_lazy as _, ugettext from ishtar_common.models import GeneralType, ImageModel, BaseHistorizedItem, \ ShortMenuItem, LightHistorizedItem, HistoricalRecords, OwnPerms, Source, \ - Person, Basket + Person, Basket, get_external_id from archaeological_operations.models import AdministrativeAct from archaeological_context_records.models import ContextRecord, Dating @@ -103,8 +104,9 @@ IS_ISOLATED_CHOICES = ( class BaseFind(BaseHistorizedItem, OwnPerms): IS_ISOLATED_DICT = dict(IS_ISOLATED_CHOICES) label = models.TextField(_(u"Free ID")) - external_id = models.CharField(_(u"External ID"), blank=True, null=True, - max_length=120) + external_id = models.TextField(_(u"External ID"), blank=True, null=True) + auto_external_id = models.BooleanField( + _(u"External ID is set automatically"), default=False) description = models.TextField(_(u"Description"), blank=True, null=True) comment = models.TextField(_(u"Comment"), blank=True, null=True) topographic_localisation = models.CharField( @@ -235,6 +237,20 @@ class BaseFind(BaseHistorizedItem, OwnPerms): fields['find'] = field.related.model return fields + def save(self, *args, **kwargs): + returned = super(BaseFind, self).save(*args, **kwargs) + + updated = False + if not self.external_id or self.auto_external_id: + external_id = get_external_id('base_find_external_id', self) + if external_id != self.external_id: + updated = True + self.auto_external_id = True + self.external_id = external_id + if updated: + self.save() + return returned + WEIGHT_UNIT = (('g', _(u"g")), ('kg', _(u"kg")),) @@ -287,8 +303,9 @@ class Find(BaseHistorizedItem, ImageModel, OwnPerms, ShortMenuItem): ATTRS_EQUIV = {'get_first_base_find': 'base_finds'} base_finds = models.ManyToManyField(BaseFind, verbose_name=_(u"Base find"), related_name='find') - external_id = models.CharField(_(u"External ID"), blank=True, null=True, - max_length=120) + external_id = models.TextField(_(u"External ID"), blank=True, null=True) + auto_external_id = models.BooleanField( + _(u"External ID is set automatically"), default=False) order = models.IntegerField(_(u"Order"), default=1) label = models.TextField(_(u"Free ID")) description = models.TextField(_(u"Description"), blank=True, null=True) @@ -554,6 +571,18 @@ class Find(BaseHistorizedItem, ImageModel, OwnPerms, ShortMenuItem): def save(self, *args, **kwargs): super(Find, self).save(*args, **kwargs) + + updated = False + if not self.external_id or self.auto_external_id: + external_id = get_external_id('find_external_id', self) + if external_id != self.external_id: + updated = True + self.auto_external_id = True + self.external_id = external_id + if updated: + self.save() + return + q = self.base_finds if not self.index and q.count(): operation = q.filter( @@ -600,6 +629,15 @@ class Find(BaseHistorizedItem, ImageModel, OwnPerms, ShortMenuItem): # idx and idx['material_index__max'] + 1 or 1 +def base_find_find_changed(sender, **kwargs): + obj = kwargs.get('instance', None) + if not obj: + return + # recalculate complete id and external id + obj.save() + +m2m_changed.connect(base_find_find_changed, sender=Find.base_finds.through) + class FindSource(Source): SHOW_URL = 'show-findsource' MODIFY_URL = 'find_source_modify' |