Refactor history events to be class based
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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():
|
||||
|
||||
Reference in New Issue
Block a user