From 96367f65c96f9307e5abc34b2f0e7dcd6116afb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uro=C5=A1=20Trebec?= Date: Wed, 2 Aug 2006 14:56:58 +0000 Subject: [PATCH] [full-history] * Added some error checking in get_version() and save_new_revision() * Changed signal from signals.pre_save to signals.post_save (the instance doesn't have id otherwise) * Added logging for new objects too * Added default comments (Update|New) * Removed instance_name git-svn-id: http://code.djangoproject.com/svn/django/branches/full-history@3514 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/history/models.py | 62 ++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/django/contrib/history/models.py b/django/contrib/history/models.py index f1ce4645e5..d242438487 100644 --- a/django/contrib/history/models.py +++ b/django/contrib/history/models.py @@ -7,8 +7,7 @@ from django.contrib.contenttypes.models import ContentType # Misc stuff import cPickle as Pickle from datetime import datetime -from django.utils.text import capfirst - +#from django.utils.text import capfirst class ChangeLog(models.Model): change_time = models.DateTimeField (_('time of change'), auto_now=True) @@ -35,13 +34,13 @@ class ChangeLog(models.Model): ('Object', {'fields': ('object',),}), ) - list_display = ('object_id', 'user', 'change_time') + list_display = ('object_id', 'user', 'comment', 'content_type', 'change_time', ) def get_object(self): """ Returns unpickled object. """ return Pickle.loads(self.object) - def get_revision_number(self): + def get_rev_num(self): """ Returns the ID/revision number of ChangeLog entry. """ return self.id @@ -49,11 +48,16 @@ class ChangeLog(models.Model): # Other (API) methods # ####################### +#class ChangeLogManager(models.Manager): + def get_version(object, offset=0): """ Returns 'current-offset' revision of the 'object' """ - list = ChangeLog.objects.order_by('-id').filter(object_id=object.id)[offset] - print list.get_object() - return list + try: + list = ChangeLog.objects.order_by('-id').filter(object_id=object.id)[offset] + print list.get_object() + return list + except: + pass def list_history(parent_id, **kwargs): """ @@ -67,11 +71,17 @@ def list_history(parent_id, **kwargs): return ChangeLog.objects.filter(object_id=parent_id) -def version_by_date(object, date): +def version_by_date(self, date): """ Returns a list of revisions made at 'date'. """ - return ChangeLog.objects.filter(object_id=object.id).filter(change_time__exact=date) + return ChangeLog.objects.filter(object_id=self.id).filter(change_time__exact=date) + + +######################### +# Pre-save signal catch # +######################### + def _get_enabled_models(): """ Returns a list of History-enabled models. """ model_list = [] @@ -83,39 +93,45 @@ def _get_enabled_models(): except: pass return model_list - - -######################### -# Pre-save signal catch # -######################### def save_new_revision(sender, instance, signal, *args, **kwargs): """ Saves a old copy of the record into the History table.""" print "Sender: ",sender - instance_name = instance.__class__.__name__ + if not hasattr(instance, 'History'): + print "Not history-enabled class." + return 0 + + #instance_name = instance.__class__.__name__ #print instance_name - global m + m = None + old = None + log = None for model in _get_enabled_models(): - if model['name'] is instance_name: + if model['name'] is instance.__class__.__name__: try: m = __import__(model['module'], '', '', [model['name']]) #print model['module'],": ",model['name'],"- ",m except: print "Model import error." - if not isinstance(sender, instance_name): - print "Bad sender, exit." + if m: + try: + old = getattr(m, model['name']).objects.filter(pk=instance.id) + log = ChangeLog(parent=instance, comment="Update") + except: + old = instance + log = ChangeLog(parent=instance, comment="New") + else: return 0 - - old = getattr(m, model['name']).objects.filter(pk=instance.id) + print "Old: ",old print "Instance: ",instance.id - log = ChangeLog(parent=instance) print "Log: ",log log.object = Pickle.dumps(old[0], protocol=0) log.save() print "New change saved." + -dispatcher.connect( save_new_revision, signal=signals.pre_save ) +dispatcher.connect( save_new_revision, signal=signals.post_save )