diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-04-09 12:12:47 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-04-09 12:12:47 +0200 |
commit | 00993b14812e6cc97b1e268e986884e92523f05e (patch) | |
tree | f6f3654ace92dcfb28673a4bfca1ebaded140897 /ishtar/furnitures/models.py | |
parent | 455ed98ff54131b206b045a8a6950cc3ac2e25f2 (diff) | |
download | Ishtar-00993b14812e6cc97b1e268e986884e92523f05e.tar.bz2 Ishtar-00993b14812e6cc97b1e268e986884e92523f05e.zip |
Get a previous historized item by REST request (refs #349)
Diffstat (limited to 'ishtar/furnitures/models.py')
-rw-r--r-- | ishtar/furnitures/models.py | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/ishtar/furnitures/models.py b/ishtar/furnitures/models.py index 3571256cf..2fe65b598 100644 --- a/ishtar/furnitures/models.py +++ b/ishtar/furnitures/models.py @@ -174,7 +174,40 @@ class BaseHistorizedItem(models.Model): super(BaseHistorizedItem, self).save(*args, **kwargs) return True + def get_previous(self, step, strict=True): + """ + Get a "step" previous state of the item + """ + historized = self.history.all() + assert len(historized) > step + assert not hasattr(historized, '_step') + item = historized[step] + item._step = step + model = self.__class__ + for k in model._meta.get_all_field_names(): + field = model._meta.get_field_by_name(k)[0] + if hasattr(field, 'rel') and field.rel: + if not hasattr(item, k+'_id'): + setattr(item, k, getattr(self, k)) + continue + val = getattr(item, k+'_id') + if not val: + setattr(item, k, None) + continue + try: + val = field.rel.to.objects.get(pk=val) + setattr(item, k, val) + except ObjectDoesNotExist: + if strict: + raise HistoryError(u"The class %s has no pk %d" % ( + unicode(field.rel.to), val)) + setattr(item, k, None) + return item + def rollback(self, date): + """ + Rollback to a previous state + """ to_del, new_item = [], None for item in self.history.all(): to_del.append(item) @@ -193,7 +226,7 @@ class BaseHistorizedItem(models.Model): self.save() except: raise HistoryError(u"The rollback has failed.") - # clean the non necessary steps + # clean the obsolete history for historized_item in to_del: historized_item.delete() |