From f42d681f85753671d4882fac90e8bd81db1556dc Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Fri, 6 Jul 2012 02:52:50 -0400 Subject: [PATCH] Refactor history events to be class based --- apps/history/api.py | 80 ++++++++++++++++++++++-------------------- apps/history/models.py | 20 +++++------ 2 files changed, 51 insertions(+), 49 deletions(-) diff --git a/apps/history/api.py b/apps/history/api.py index eacf65b257..64175da400 100644 --- a/apps/history/api.py +++ b/apps/history/api.py @@ -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() diff --git a/apps/history/models.py b/apps/history/models.py index 56906a4fde..470b5ce2cc 100644 --- a/apps/history/models.py +++ b/apps/history/models.py @@ -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():