summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2017-09-21 00:26:03 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2017-09-21 00:26:03 +0200
commit0cd398940a316afe8fc7ec2b0102c793c3f4342b (patch)
treefe78f8109bbae1e761e79bdd7998f639d895f640 /ishtar_common
parentf46de1b6d4cbf832ce6f22fe82a5377b5e0ed6a4 (diff)
downloadIshtar-0cd398940a316afe8fc7ec2b0102c793c3f4342b.tar.bz2
Ishtar-0cd398940a316afe8fc7ec2b0102c793c3f4342b.zip
Generic manner of managing external id
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/models.py76
-rw-r--r--ishtar_common/tests.py3
2 files changed, 43 insertions, 36 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index 55795c91e..b0b050c6c 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -175,35 +175,6 @@ class ValueGetter(object):
return values
-class ExternalIdManager(object):
- EXTERNAL_ID_KEY = ''
- EXTERNAL_ID_DEPENDENCIES = []
-
- def update_external_id(self, save=True):
- if not self.EXTERNAL_ID_KEY:
- raise NotImplementedError(
- "{} should have an EXTERNAL_ID_KEY".format(self.__class__))
- if self.external_id and not self.auto_external_id:
- return
- external_id = get_external_id(self.EXTERNAL_ID_KEY, self)
- if external_id == self.external_id:
- return
- self.auto_external_id = True
- self.external_id = external_id
- if save:
- self.skip_history_when_saving = True
- self.save()
- for dep in self.EXTERNAL_ID_DEPENDENCIES:
- for obj in getattr(self, dep).all():
- obj.update_external_id()
- return external_id
-
- def save(self, *args, **kwargs):
- returned = super(ExternalIdManager, self).save(*args, **kwargs)
- self.update_external_id()
- return returned
-
-
class HistoricalRecords(BaseHistoricalRecords):
def create_historical_record(self, instance, type):
try:
@@ -931,7 +902,12 @@ class Imported(models.Model):
class BaseHistorizedItem(Imported):
+ """
+ Historized item with external ID management
+ """
IS_BASKET = False
+ EXTERNAL_ID_KEY = ''
+ EXTERNAL_ID_DEPENDENCIES = []
history_modifier = models.ForeignKey(
User, related_name='+', on_delete=models.SET_NULL,
verbose_name=_(u"Last editor"), blank=True, null=True)
@@ -942,12 +918,20 @@ class BaseHistorizedItem(Imported):
class Meta:
abstract = True
- def save(self, *args, **kwargs):
- assert hasattr(self, 'history_modifier')
- if not self.id:
- self.history_creator = self.history_modifier
- super(BaseHistorizedItem, self).save(*args, **kwargs)
- return True
+ def update_external_id(self, save=False):
+ if not self.EXTERNAL_ID_KEY or (
+ self.external_id and not self.auto_external_id):
+ return
+ external_id = get_external_id(self.EXTERNAL_ID_KEY, self)
+ if external_id == self.external_id:
+ return
+ self.auto_external_id = True
+ self.external_id = external_id
+ self._cached_label_checked = False
+ if save:
+ self.skip_history_when_saving = True
+ self.save()
+ return external_id
def get_previous(self, step=None, date=None, strict=True):
"""
@@ -1077,6 +1061,28 @@ class BaseHistorizedItem(Imported):
items.append('00000000')
return u"-".join([unicode(item) for item in items])
+ def save(self, *args, **kwargs):
+ created = not self.pk
+ if not getattr(self, 'skip_history_when_saving', False):
+ assert hasattr(self, 'history_modifier')
+ if created:
+ self.history_creator = self.history_modifier
+ # external ID can have related item not available before save
+ external_id_updated = kwargs.pop('external_id_updated') \
+ if 'external_id_updated' in kwargs else False
+ if not created and not external_id_updated:
+ self.update_external_id()
+ super(BaseHistorizedItem, self).save(*args, **kwargs)
+ if created and self.update_external_id():
+ # force resave for external ID creation
+ self.skip_history_when_saving = True
+ self._updated_id = True
+ return self.save(external_id_updated=True)
+ for dep in self.EXTERNAL_ID_DEPENDENCIES:
+ for obj in getattr(self, dep).all():
+ obj.update_external_id(save=True)
+ return True
+
class GeneralRelationType(GeneralType):
order = models.IntegerField(_(u"Order"), default=1)
diff --git a/ishtar_common/tests.py b/ishtar_common/tests.py
index 4afc74c9b..ad83b4a87 100644
--- a/ishtar_common/tests.py
+++ b/ishtar_common/tests.py
@@ -95,7 +95,8 @@ class CommandsTestCase(TestCase):
"""
from archaeological_operations.models import Parcel
p = Parcel.objects.create(
- town=models.Town.objects.create(name='test', numero_insee='25000'))
+ town=models.Town.objects.create(name='test', numero_insee='25000'),
+ )
parcel_nb = Parcel.objects.count()
out = StringIO()
call_command('clean_ishtar', stdout=out)