Files
mayan-edms/apps/history/api.py
2012-07-26 22:42:36 -04:00

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()