Refactor history events to be class based

This commit is contained in:
Roberto Rosario
2012-07-06 02:52:50 -04:00
parent c2773615ce
commit f42d681f85
2 changed files with 51 additions and 49 deletions

View File

@@ -13,45 +13,49 @@ from .models import HistoryType, History
from .runtime_data import history_types_dict
@transaction.commit_on_success
def register_history_type(history_type_dict):
namespace = history_type_dict['namespace']
name = history_type_dict['name']
try:
history_type_obj, created = HistoryType.objects.get_or_create(
namespace=namespace, name=name)
history_type_obj.save()
except DatabaseError:
# Special case for syncdb
transaction.rollback()
class EventNamespace(object):
def __init__(self, name, label):
self.name = name
self.label = label
# Runtime
history_types_dict.setdefault(namespace, {})
history_types_dict[namespace][name] = {
'label': history_type_dict['label'],
'summary': history_type_dict.get('summary', u''),
'details': history_type_dict.get('details', u''),
'expressions': history_type_dict.get('expressions', {}),
}
class Event(object):
@transaction.commit_on_success
def __init__(self, namespace, name, label, summary=None, details=None, expressions=None):
self.namespace = namespace
self.name = name
self.label = label
self.summary = summary or ''
self.details = details or ''
self.expressions = expressions or {}
try:
self.history_type_obj, created = HistoryType.objects.get_or_create(
namespace=self.namespace.name, name=self.name)
self.history_type_obj.save()
history_types_dict.setdefault(self.namespace.name, {})
history_types_dict[self.namespace.name][self.name] = self
except DatabaseError:
# Special case for syncdb
transaction.rollback()
def create_history(history_type_dict, source_object=None, data=None):
history_type = get_object_or_404(HistoryType, namespace=history_type_dict['namespace'], name=history_type_dict['name'])
new_history = History(history_type=history_type)
if source_object:
new_history.content_object = source_object
if data:
new_dict = {}
for key, value in data.items():
new_dict[key] = {}
if isinstance(value, models.Model):
new_dict[key]['value'] = serializers.serialize('json', [value])
elif isinstance(value, models.query.QuerySet):
new_dict[key]['value'] = serializers.serialize('json', value)
else:
new_dict[key]['value'] = json.dumps(value)
new_dict[key]['type'] = pickle.dumps(type(value))
def commit(self, source_object=None, data=None):
print 'OBJ', self.history_type_obj
new_history = History(history_type=self.history_type_obj)
if source_object:
new_history.content_object = source_object
if data:
new_dict = {}
for key, value in data.items():
new_dict[key] = {}
if isinstance(value, models.Model):
new_dict[key]['value'] = serializers.serialize('json', [value])
elif isinstance(value, models.query.QuerySet):
new_dict[key]['value'] = serializers.serialize('json', value)
else:
new_dict[key]['value'] = json.dumps(value)
new_dict[key]['type'] = pickle.dumps(type(value))
new_history.dictionary = json.dumps(new_dict)
new_history.save()
new_history.dictionary = json.dumps(new_dict)
new_history.save()

View File

@@ -20,7 +20,7 @@ class HistoryType(models.Model):
def __unicode__(self):
try:
return unicode(history_types_dict[self.namespace][self.name]['label'])
return unicode(history_types_dict[self.namespace][self.name].label)
except KeyError:
return u'obsolete history type: %s - %s' % (self.namespace, self.name)
@@ -36,7 +36,7 @@ class HistoryType(models.Model):
class History(models.Model):
datetime = models.DateTimeField(verbose_name=_(u'date time'))
datetime = models.DateTimeField(verbose_name=_(u'date time'), default=lambda: datetime.now())
content_type = models.ForeignKey(ContentType, blank=True, null=True)
object_id = models.PositiveIntegerField(blank=True, null=True)
content_object = generic.GenericForeignKey('content_type', 'object_id')
@@ -46,22 +46,17 @@ class History(models.Model):
def __unicode__(self):
return u'%s - %s - %s' % (self.datetime, self.content_object, self.history_type)
def save(self, *args, **kwargs):
if not self.pk:
self.datetime = datetime.now()
super(History, self).save(*args, **kwargs)
def get_label(self):
return history_types_dict[self.history_type.namespace][self.history_type.name]['label']
return history_types_dict[self.history_type.namespace][self.history_type.name].label
def get_summary(self):
return history_types_dict[self.history_type.namespace][self.history_type.name].get('summary', u'')
return history_types_dict[self.history_type.namespace][self.history_type.name].summary
def get_details(self):
return history_types_dict[self.history_type.namespace][self.history_type.name].get('details', u'')
return history_types_dict[self.history_type.namespace][self.history_type.name].details
def get_expressions(self):
return history_types_dict[self.history_type.namespace][self.history_type.name].get('expressions', {})
return history_types_dict[self.history_type.namespace][self.history_type.name].expressions
def get_processed_summary(self):
return _process_history_text(self, self.get_summary())
@@ -86,10 +81,12 @@ def _process_history_text(history, text):
}
loaded_dictionary = json.loads(history.dictionary)
print 'loaded_dictionary', loaded_dictionary
new_dict = {}
for key, values in loaded_dictionary.items():
value_type = pickle.loads(str(values['type']))
print 'value_type', value_type
if isinstance(value_type, models.base.ModelBase):
for deserialized in serializers.deserialize('json', values['value']):
new_dict[key] = deserialized.object
@@ -102,6 +99,7 @@ def _process_history_text(history, text):
new_dict[key] = json.loads(values['value'])
key_values.update(new_dict)
print 'key_values', key_values
expressions_dict = {}
for key, value in history.get_expressions().items():