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/models.py | |
| parent | f46de1b6d4cbf832ce6f22fe82a5377b5e0ed6a4 (diff) | |
| download | Ishtar-0cd398940a316afe8fc7ec2b0102c793c3f4342b.tar.bz2 Ishtar-0cd398940a316afe8fc7ec2b0102c793c3f4342b.zip | |
Generic manner of managing external id
Diffstat (limited to 'ishtar_common/models.py')
| -rw-r--r-- | ishtar_common/models.py | 76 | 
1 files changed, 41 insertions, 35 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) | 
