diff options
| author | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-04-09 00:35:53 +0200 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-04-09 00:35:53 +0200 | 
| commit | 455ed98ff54131b206b045a8a6950cc3ac2e25f2 (patch) | |
| tree | f9001acc59e9cc546f3dc44879d29d9ab3f04f62 /ishtar/furnitures/models.py | |
| parent | 7755ab38c3a92ba55ac3eed92a40f19a9cd8ee40 (diff) | |
| download | Ishtar-455ed98ff54131b206b045a8a6950cc3ac2e25f2.tar.bz2 Ishtar-455ed98ff54131b206b045a8a6950cc3ac2e25f2.zip | |
Manage the rollback on historized items (refs #349)
Diffstat (limited to 'ishtar/furnitures/models.py')
| -rw-r--r-- | ishtar/furnitures/models.py | 50 | 
1 files changed, 42 insertions, 8 deletions
| diff --git a/ishtar/furnitures/models.py b/ishtar/furnitures/models.py index 144ada31a..3571256cf 100644 --- a/ishtar/furnitures/models.py +++ b/ishtar/furnitures/models.py @@ -157,19 +157,53 @@ class GeneralType(models.Model):              for child in cls._get_childs(item, dct):                  yield child +class HistoryError(Exception): +    def __init__(self, value): +        self.value = value +    def __str__(self): +        return repr(self.value) +  class BaseHistorizedItem(models.Model):      history_modifier = models.ForeignKey(User, related_name='+',                                        verbose_name=_(u"Last modifier")) +    class Meta: +        abstract = True +      def save(self, *args, **kwargs): -        try: -            self.history_modifier -        except ObjectDoesNotExist: -            return +        assert hasattr(self, 'history_modifier') == True          super(BaseHistorizedItem, self).save(*args, **kwargs)          return True -    class Meta: -        abstract = True +    def rollback(self, date): +        to_del, new_item = [], None +        for item in self.history.all(): +            to_del.append(item) +            if item.history_date == date: +                new_item = item +                break +        if not new_item: +            raise HistoryError(u"The date to rollback to doesn't exist.") +        try: +            for f in self._meta.fields: +                k = f.name +                if k != 'id' and hasattr(self, k): +                    if not hasattr(new_item, k): +                        k = k + "_id" +                    setattr(self, k, getattr(new_item, k)) +            self.save() +        except: +            raise HistoryError(u"The rollback has failed.") +        # clean the non necessary steps +        for historized_item in to_del: +            historized_item.delete() + +    def values(self): +        values = {} +        for f in self._meta.fields: +            k = f.name +            if k != 'id': +                values[k] = getattr(self, k) +        return values  class LightHistorizedItem(BaseHistorizedItem):      history_date = models.DateTimeField(default=datetime.datetime.now) @@ -266,7 +300,7 @@ class Person(Address, OwnPerms) :          lbl = u"%s %s - " % (self.name, self.surname)          if self.attached_to:              lbl += unicode(self.attached_to) -        else: +        elif self.email:              lbl += self.email          return lbl @@ -331,7 +365,7 @@ class File(BaseHistorizedItem, OwnPerms):      is_active = models.BooleanField(_(u"Is active?"), default=True)      towns = models.ManyToManyField("Town", verbose_name=_(u"Towns"))      creation_date = models.DateField(_(u"Creation date"), -                                     default=datetime.datetime.now) +                                     default=datetime.date.today)      reception_date = models.DateField(_(u'Reception date'), blank=True,                                        null=True)      related_file = models.ForeignKey("File", verbose_name=_(u"Related file"), | 
