Added edit source object attribute difference detection and logging to history app

This commit is contained in:
Roberto Rosario
2011-05-28 23:52:54 -04:00
parent 73f39494aa
commit 9ce75e4671
7 changed files with 29 additions and 25 deletions

View File

@@ -339,6 +339,7 @@ def generate_choices_w_labels(choices, display_object_type=True):
def return_diff(old_obj, new_obj, attrib_list=None): def return_diff(old_obj, new_obj, attrib_list=None):
diff_dict = {} diff_dict = {}
if not attrib_list:
attrib_list = old_obj.__dict__.keys() attrib_list = old_obj.__dict__.keys()
for attrib in attrib_list: for attrib in attrib_list:
old_val = getattr(old_obj, attrib) old_val = getattr(old_obj, attrib)

View File

@@ -19,7 +19,7 @@ from documents.literals import PERMISSION_DOCUMENT_CREATE, \
PERMISSION_DOCUMENT_TRANSFORM, PERMISSION_DOCUMENT_TOOLS, \ PERMISSION_DOCUMENT_TRANSFORM, PERMISSION_DOCUMENT_TOOLS, \
PERMISSION_DOCUMENT_EDIT PERMISSION_DOCUMENT_EDIT
from documents.literals import HISTORY_DOCUMENT_CREATED, \ from documents.literals import HISTORY_DOCUMENT_CREATED, \
HISTORY_DOCUMENT_EDITED HISTORY_DOCUMENT_EDITED, HISTORY_DOCUMENT_DELETED
# Permission setup # Permission setup
set_namespace_title('documents', _(u'documents')) set_namespace_title('documents', _(u'documents'))
@@ -35,6 +35,7 @@ register_permission(PERMISSION_DOCUMENT_TOOLS)
# History setup # History setup
register_history_type(HISTORY_DOCUMENT_CREATED) register_history_type(HISTORY_DOCUMENT_CREATED)
register_history_type(HISTORY_DOCUMENT_EDITED) register_history_type(HISTORY_DOCUMENT_EDITED)
register_history_type(HISTORY_DOCUMENT_DELETED)
document_list = {'text': _(u'documents list'), 'view': 'document_list', 'famfam': 'page', 'permissions': [PERMISSION_DOCUMENT_VIEW]} document_list = {'text': _(u'documents list'), 'view': 'document_list', 'famfam': 'page', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
document_list_recent = {'text': _(u'recent documents list'), 'view': 'document_list_recent', 'famfam': 'page', 'permissions': [PERMISSION_DOCUMENT_VIEW]} document_list_recent = {'text': _(u'recent documents list'), 'view': 'document_list_recent', 'famfam': 'page', 'permissions': [PERMISSION_DOCUMENT_VIEW]}

View File

@@ -23,13 +23,24 @@ HISTORY_DOCUMENT_CREATED = {
'label': _(u'Document creation'), 'label': _(u'Document creation'),
'summary': _(u'Document "%(content_object)s" created by %(fullname)s.'), 'summary': _(u'Document "%(content_object)s" created by %(fullname)s.'),
'details': _(u'Document "%(content_object)s" created on %(datetime)s by %(fullname)s.'), 'details': _(u'Document "%(content_object)s" created on %(datetime)s by %(fullname)s.'),
'expressions': [{'fullname': 'user.get_full_name() if user.get_full_name() else user.username'}] 'expressions': {'fullname': 'user.get_full_name() if user.get_full_name() else user.username'}
} }
HISTORY_DOCUMENT_EDITED = { HISTORY_DOCUMENT_EDITED = {
'namespace': 'documents', 'name': 'document_edited', 'namespace': 'documents', 'name': 'document_edited',
'label': _(u'Document edited'), 'label': _(u'Document edited'),
'summary': _(u'Document "%(content_object)s" edited by %(fullname)s.'), 'summary': _(u'Document "%(content_object)s" edited by %(fullname)s.'),
'details': _(u'Document "%(content_object)s" edited on %(datetime)s by %(fullname)s.'), 'details': _(u'Document "%(content_object)s" was edited on %(datetime)s by %(fullname)s. The following changes took place: %(changes)s.'),
'expressions': [{'fullname': 'user.get_full_name() if user.get_full_name() else user.username'}] 'expressions': {
'fullname': 'user.get_full_name() if user.get_full_name() else user.username',
'changes': 'u\', \'.join([\'"%s": "%s" -> "%s"\' % (key, value[\'old_value\'], value[\'new_value\']) for key, value in diff.items()])'
}
}
HISTORY_DOCUMENT_DELETED = {
'namespace': 'documents', 'name': 'document_deleted',
'label': _(u'Document deleted'),
'summary': _(u'Document "%(document)s" deleted by %(fullname)s.'),
'details': _(u'Document "%(document)s" deleted on %(datetime)s by %(fullname)s.'),
'expressions': {'fullname': 'user.get_full_name() if user.get_full_name() else user.username'}
} }

View File

@@ -60,7 +60,7 @@ from documents.literals import PERMISSION_DOCUMENT_CREATE, \
PERMISSION_DOCUMENT_TRANSFORM, \ PERMISSION_DOCUMENT_TRANSFORM, \
PERMISSION_DOCUMENT_EDIT PERMISSION_DOCUMENT_EDIT
from documents.literals import HISTORY_DOCUMENT_CREATED, \ from documents.literals import HISTORY_DOCUMENT_CREATED, \
HISTORY_DOCUMENT_EDITED HISTORY_DOCUMENT_EDITED, HISTORY_DOCUMENT_DELETED
from documents.forms import DocumentTypeSelectForm, \ from documents.forms import DocumentTypeSelectForm, \
DocumentForm, DocumentForm_edit, DocumentPropertiesForm, \ DocumentForm, DocumentForm_edit, DocumentPropertiesForm, \
@@ -275,7 +275,6 @@ def upload_document_with_type(request, source):
def document_view_simple(request, document_id): def document_view_simple(request, document_id):
check_permissions(request.user, [PERMISSION_DOCUMENT_VIEW]) check_permissions(request.user, [PERMISSION_DOCUMENT_VIEW])
#document = get_object_or_404(Document.objects.select_related(), pk=document_id) #document = get_object_or_404(Document.objects.select_related(), pk=document_id)
# Triggers a 404 error on documents uploaded via local upload # Triggers a 404 error on documents uploaded via local upload
# TODO: investigate # TODO: investigate
@@ -462,6 +461,7 @@ def document_delete(request, document_id=None, document_id_list=None):
messages.warning(request, warning) messages.warning(request, warning)
document.delete() document.delete()
#create_history(HISTORY_DOCUMENT_DELETED, data={'user': request.user, 'document': document})
messages.success(request, _(u'Document: %s deleted successfully.') % document) messages.success(request, _(u'Document: %s deleted successfully.') % document)
except Exception, e: except Exception, e:
messages.error(request, _(u'Document: %(document)s delete error: %(error)s') % { messages.error(request, _(u'Document: %(document)s delete error: %(error)s') % {
@@ -515,10 +515,7 @@ def document_edit(request, document_id):
document.file_filename = form.cleaned_data['document_type_available_filenames'].filename document.file_filename = form.cleaned_data['document_type_available_filenames'].filename
document.save() document.save()
create_history(HISTORY_DOCUMENT_EDITED, document, {'user': request.user, 'diff': return_diff(old_document, document, ['file_filename', 'description'])})
#print 'diff', return_diff(old_document, document)
create_history(HISTORY_DOCUMENT_EDITED, document, {'user': request.user})
RecentDocument.objects.add_document_for_user(request.user, document) RecentDocument.objects.add_document_for_user(request.user, document)
messages.success(request, _(u'Document "%s" edited successfully.') % document) messages.success(request, _(u'Document "%s" edited successfully.') % document)

View File

@@ -53,5 +53,5 @@ def create_history(history_type_dict, source_object=None, data=None):
new_dict[key]['type'] = pickle.dumps(type(value)) new_dict[key]['type'] = pickle.dumps(type(value))
new_history.dictionary = json.dumps(new_dict) new_history.dictionary = json.dumps(new_dict)
print 'new_history', new_history
new_history.save() new_history.save()

View File

@@ -54,7 +54,7 @@ class History(models.Model):
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].get('details', u'')
def get_expressions(self): 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].get('expressions', {})
def get_processed_summary(self): def get_processed_summary(self):
return _process_history_text(self, self.get_summary()) return _process_history_text(self, self.get_summary())
@@ -95,18 +95,13 @@ def _process_history_text(history, text):
new_dict[key] = json.loads(values['value']) new_dict[key] = json.loads(values['value'])
key_values.update(new_dict) key_values.update(new_dict)
expressions_dict = {} expressions_dict = {}
for expression_item in history.get_expressions():
key, value = expression_item.items()[0] for key, value in history.get_expressions().items():
try: try:
expressions_dict = { expressions_dict[key] = eval(value, key_values.copy())
key: eval(value, key_values.copy())
}
except Exception, e: except Exception, e:
expressions_dict = { expressions_dict[key] = e
key: e
}
key_values.update(expressions_dict) key_values.update(expressions_dict)
return text % key_values return text % key_values

View File

@@ -81,7 +81,6 @@ def history_view(request, object_id):
history = get_object_or_404(History, pk=object_id) history = get_object_or_404(History, pk=object_id)
form = HistoryDetailForm(instance=history, extra_fields=[ form = HistoryDetailForm(instance=history, extra_fields=[
{'label': _(u'Date'), 'field':lambda x: x.datetime.date()}, {'label': _(u'Date'), 'field':lambda x: x.datetime.date()},
{'label': _(u'Time'), 'field':lambda x: unicode(x.datetime.time()).split('.')[0]}, {'label': _(u'Time'), 'field':lambda x: unicode(x.datetime.time()).split('.')[0]},
@@ -93,6 +92,6 @@ def history_view(request, object_id):
return render_to_response('generic_detail.html', { return render_to_response('generic_detail.html', {
'title': _(u'details for: %s') % history.get_processed_summary(), 'title': _(u'details for: %s') % history.get_processed_summary(),
'form': form, 'form': form,
'object': history, 'object': history.content_object,
}, },
context_instance=RequestContext(request)) context_instance=RequestContext(request))