1
0
mirror of https://github.com/django/django.git synced 2025-07-04 17:59:13 +00:00

[full-history]

* get_all_models() rewrite -> _get_enabled_models()
* save_new_revision():
  + works for any object
  + imports needed classes on-the-fly
  - BUG: NOT WORKING RIGHT!!! (loops because it wants to track itself)
* dispatcher.connect gets connection from Any model



git-svn-id: http://code.djangoproject.com/svn/django/branches/full-history@3452 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Uroš Trebec 2006-07-26 10:52:08 +00:00
parent b0a11fcdc5
commit 4d8da74cdf

View File

@ -3,12 +3,12 @@ from django.db.models import signals, get_models
from django.dispatch import dispatcher from django.dispatch import dispatcher
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from tut1.polls.models import Poll #Temp import of used models #from tut1.polls.models import Poll, Choice #Temp import of used models
# 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
#from django.contrib.history.api import get_object, save_new_revision
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)
@ -16,7 +16,6 @@ class ChangeLog(models.Model):
content_type = models.ForeignKey(ContentType) content_type = models.ForeignKey(ContentType)
parent = models.GenericForeignKey() parent = models.GenericForeignKey()
object_id = models.IntegerField(_('object ID')) object_id = models.IntegerField(_('object ID'))
#parent = models.ForeignKey(Poll)
user = models.ForeignKey(User, default="1") user = models.ForeignKey(User, default="1")
object = models.TextField() object = models.TextField()
@ -63,49 +62,28 @@ def list_history(parent_id, **kwargs):
""" """
if kwargs: if kwargs:
list = ChangeLog.objects.filter(object_id=parent_id)[:kwargs['offset']] list = ChangeLog.objects.filter(object_id=parent_id)[:kwargs['offset']]
#for l in list:
# print l.parent.id
return list return list
else: else:
return ChangeLog.objects.filter(object_id=parent_id) return ChangeLog.objects.filter(object_id=parent_id)
#def version(object, num=5):
# """ Returns last 'num' revisions of the 'object'. """
# return ChangeLog.objects.order_by('-id').filter(parent=object.id)[:num]
def version_by_date(object, date): def version_by_date(object, 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=object.id).filter(change_time__exact=date)
def get_all_models(): def _get_enabled_models():
app_list = [] """ Returns a list of History-enabled models. """
model_list = []
for app in models.get_apps(): for model in models.get_models():
app_models = get_models(app) try:
app_label = app_models[0]._meta.app_label if model.History:
model_list.append({'module': model.__module__,
model_list = [] 'name': model.__name__})
except:
for m in app_models: pass
model_list.append({ return model_list
'name': capfirst(m._meta.verbose_name_plural),
})
if model_list:
model_list.sort()
app_list.append({
'name': app_label.title(),
'models': model_list,
})
for app in app_list:
#print app['name']
#print app['models']
for m in app['models']:
print m['name']
######################### #########################
# Pre-save signal catch # # Pre-save signal catch #
@ -113,20 +91,31 @@ def get_all_models():
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."""
#modelname = instance.__class__.__name__ print "Sender: ",sender
#print modelname
old = Poll.objects.filter(pk=instance.id) instance_name = instance.__class__.__name__
print old #print instance_name
if instance.History: global m
print "Admin"
print Poll._meta for model in _get_enabled_models():
print instance.id if model['name'] is instance_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."
return 0
old = getattr(m, model['name']).objects.filter(pk=instance.id)
print "Old: ",old
print "Instance: ",instance.id
log = ChangeLog(parent=instance) log = ChangeLog(parent=instance)
print log print "Log: ",log
#log.parent_id = instance.id
#log.user_id = .user_id
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, sender=Poll ) dispatcher.connect( save_new_revision, signal=signals.pre_save )