summaryrefslogtreecommitdiff
path: root/archaeological_finds/models.py
diff options
context:
space:
mode:
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
commit4ad9278e67d8fb024c685df03812c2e1d8313aa1 (patch)
treedde04c38350d5952174ae29f189c132e56061b3b /archaeological_finds/models.py
parent1b754a300be8844e2e0b45839639cb92002d5d5e (diff)
downloadIshtar-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.py48
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'