59 lines
2.0 KiB
Python
59 lines
2.0 KiB
Python
from __future__ import absolute_import
|
|
|
|
import pickle
|
|
import json
|
|
|
|
from django.db import transaction
|
|
from django.core import serializers
|
|
from django.db import models
|
|
from django.db.utils import DatabaseError
|
|
|
|
from .models import HistoryType, History
|
|
from .runtime_data import history_types_dict
|
|
|
|
|
|
class EventNamespace(object):
|
|
def __init__(self, name, label):
|
|
self.name = name
|
|
self.label = label
|
|
|
|
|
|
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 commit(self, source_object=None, data=None):
|
|
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()
|