diff options
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' | 
