diff options
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 |
commit | 0cd398940a316afe8fc7ec2b0102c793c3f4342b (patch) | |
tree | fe78f8109bbae1e761e79bdd7998f639d895f640 /ishtar_common | |
parent | f46de1b6d4cbf832ce6f22fe82a5377b5e0ed6a4 (diff) | |
download | Ishtar-0cd398940a316afe8fc7ec2b0102c793c3f4342b.tar.bz2 Ishtar-0cd398940a316afe8fc7ec2b0102c793c3f4342b.zip |
Generic manner of managing external id
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/models.py | 76 | ||||
-rw-r--r-- | ishtar_common/tests.py | 3 |
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) |