Added edit source object attribute difference detection and logging to history app
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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]}
|
||||||
|
|||||||
@@ -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'}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
Reference in New Issue
Block a user