From f384337ef0d9d2e40d09204f18c4a486e925132c Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Sun, 17 Jan 2016 18:09:26 +0100 Subject: Include django-simple-history - fix install script --- django-simple-history/simple_history/manager.py | 75 +++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100755 django-simple-history/simple_history/manager.py (limited to 'django-simple-history/simple_history/manager.py') diff --git a/django-simple-history/simple_history/manager.py b/django-simple-history/simple_history/manager.py new file mode 100755 index 000000000..923b310eb --- /dev/null +++ b/django-simple-history/simple_history/manager.py @@ -0,0 +1,75 @@ +from django.db import models + + +class HistoryDescriptor(object): + def __init__(self, model): + self.model = model + + def __get__(self, instance, owner): + if instance is None: + return HistoryManager(self.model) + return HistoryManager(self.model, instance) + + +class HistoryManager(models.Manager): + def __init__(self, model, instance=None): + super(HistoryManager, self).__init__() + self.model = model + self.instance = instance + + def get_query_set(self): + if self.instance is None: + return super(HistoryManager, self).get_query_set() + + if isinstance(self.instance._meta.pk, models.OneToOneField): + filter = {self.instance._meta.pk.name + "_id": self.instance.pk} + else: + filter = {self.instance._meta.pk.name: self.instance.pk} + return super(HistoryManager, self).get_query_set().filter(**filter) + + def most_recent(self): + """ + Returns the most recent copy of the instance available in the history. + """ + if not self.instance: + raise TypeError("Can't use most_recent() without a %s instance." % + self.instance._meta.object_name) + tmp = [] + for field in self.instance._meta.fields: + if isinstance(field, models.ForeignKey): + tmp.append(field.name + "_id") + else: + tmp.append(field.name) + fields = tuple(tmp) + try: + values = self.values_list(*fields)[0] + except IndexError: + raise self.instance.DoesNotExist("%s has no historical record." % + self.instance._meta.object_name) + return self.instance.__class__(*values) + + def as_of(self, date): + """ + Returns an instance of the original model with all the attributes set + according to what was present on the object on the date provided. + """ + if not self.instance: + raise TypeError("Can't use as_of() without a %s instance." % + self.instance._meta.object_name) + tmp = [] + for field in self.instance._meta.fields: + if isinstance(field, models.ForeignKey): + tmp.append(field.name + "_id") + else: + tmp.append(field.name) + fields = tuple(tmp) + qs = self.filter(history_date__lte=date) + try: + values = qs.values_list('history_type', *fields)[0] + except IndexError: + raise self.instance.DoesNotExist("%s had not yet been created." % + self.instance._meta.object_name) + if values[0] == '-': + raise self.instance.DoesNotExist("%s had already been deleted." % + self.instance._meta.object_name) + return self.instance.__class__(*values[1:]) -- cgit v1.2.3