mirror of
https://github.com/django/django.git
synced 2025-07-05 02:09:13 +00:00
[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
This commit is contained in:
parent
456786ef3d
commit
96367f65c9
@ -7,8 +7,7 @@ from django.contrib.contenttypes.models import ContentType
|
|||||||
# Misc stuff
|
# Misc stuff
|
||||||
import cPickle as Pickle
|
import cPickle as Pickle
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from django.utils.text import capfirst
|
#from django.utils.text import capfirst
|
||||||
|
|
||||||
|
|
||||||
class ChangeLog(models.Model):
|
class ChangeLog(models.Model):
|
||||||
change_time = models.DateTimeField (_('time of change'), auto_now=True)
|
change_time = models.DateTimeField (_('time of change'), auto_now=True)
|
||||||
@ -35,13 +34,13 @@ class ChangeLog(models.Model):
|
|||||||
('Object', {'fields': ('object',),}),
|
('Object', {'fields': ('object',),}),
|
||||||
)
|
)
|
||||||
|
|
||||||
list_display = ('object_id', 'user', 'change_time')
|
list_display = ('object_id', 'user', 'comment', 'content_type', 'change_time', )
|
||||||
|
|
||||||
def get_object(self):
|
def get_object(self):
|
||||||
""" Returns unpickled object. """
|
""" Returns unpickled object. """
|
||||||
return Pickle.loads(self.object)
|
return Pickle.loads(self.object)
|
||||||
|
|
||||||
def get_revision_number(self):
|
def get_rev_num(self):
|
||||||
""" Returns the ID/revision number of ChangeLog entry. """
|
""" Returns the ID/revision number of ChangeLog entry. """
|
||||||
return self.id
|
return self.id
|
||||||
|
|
||||||
@ -49,11 +48,16 @@ class ChangeLog(models.Model):
|
|||||||
# Other (API) methods #
|
# Other (API) methods #
|
||||||
#######################
|
#######################
|
||||||
|
|
||||||
|
#class ChangeLogManager(models.Manager):
|
||||||
|
|
||||||
def get_version(object, offset=0):
|
def get_version(object, offset=0):
|
||||||
""" Returns 'current-offset' revision of the 'object' """
|
""" Returns 'current-offset' revision of the 'object' """
|
||||||
list = ChangeLog.objects.order_by('-id').filter(object_id=object.id)[offset]
|
try:
|
||||||
print list.get_object()
|
list = ChangeLog.objects.order_by('-id').filter(object_id=object.id)[offset]
|
||||||
return list
|
print list.get_object()
|
||||||
|
return list
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
def list_history(parent_id, **kwargs):
|
def list_history(parent_id, **kwargs):
|
||||||
"""
|
"""
|
||||||
@ -67,11 +71,17 @@ def list_history(parent_id, **kwargs):
|
|||||||
return ChangeLog.objects.filter(object_id=parent_id)
|
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'. """
|
""" 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():
|
def _get_enabled_models():
|
||||||
""" Returns a list of History-enabled models. """
|
""" Returns a list of History-enabled models. """
|
||||||
model_list = []
|
model_list = []
|
||||||
@ -84,38 +94,44 @@ def _get_enabled_models():
|
|||||||
pass
|
pass
|
||||||
return model_list
|
return model_list
|
||||||
|
|
||||||
|
|
||||||
#########################
|
|
||||||
# Pre-save signal catch #
|
|
||||||
#########################
|
|
||||||
|
|
||||||
def save_new_revision(sender, instance, signal, *args, **kwargs):
|
def save_new_revision(sender, instance, signal, *args, **kwargs):
|
||||||
""" Saves a old copy of the record into the History table."""
|
""" Saves a old copy of the record into the History table."""
|
||||||
print "Sender: ",sender
|
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
|
#print instance_name
|
||||||
global m
|
m = None
|
||||||
|
old = None
|
||||||
|
log = None
|
||||||
|
|
||||||
for model in _get_enabled_models():
|
for model in _get_enabled_models():
|
||||||
if model['name'] is instance_name:
|
if model['name'] is instance.__class__.__name__:
|
||||||
try:
|
try:
|
||||||
m = __import__(model['module'], '', '', [model['name']])
|
m = __import__(model['module'], '', '', [model['name']])
|
||||||
#print model['module'],": ",model['name'],"- ",m
|
#print model['module'],": ",model['name'],"- ",m
|
||||||
except:
|
except:
|
||||||
print "Model import error."
|
print "Model import error."
|
||||||
|
|
||||||
if not isinstance(sender, instance_name):
|
if m:
|
||||||
print "Bad sender, exit."
|
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
|
return 0
|
||||||
|
|
||||||
old = getattr(m, model['name']).objects.filter(pk=instance.id)
|
|
||||||
print "Old: ",old
|
print "Old: ",old
|
||||||
print "Instance: ",instance.id
|
print "Instance: ",instance.id
|
||||||
log = ChangeLog(parent=instance)
|
|
||||||
print "Log: ",log
|
print "Log: ",log
|
||||||
log.object = Pickle.dumps(old[0], protocol=0)
|
log.object = Pickle.dumps(old[0], protocol=0)
|
||||||
log.save()
|
log.save()
|
||||||
print "New change saved."
|
print "New change saved."
|
||||||
|
|
||||||
dispatcher.connect( save_new_revision, signal=signals.pre_save )
|
|
||||||
|
dispatcher.connect( save_new_revision, signal=signals.post_save )
|
||||||
|
Loading…
x
Reference in New Issue
Block a user