diff --git a/djadmin2/themes/djadmin2theme_default/templates/djadmin2theme_default/model_history.html b/djadmin2/themes/djadmin2theme_default/templates/djadmin2theme_default/model_history.html
index 3468566..d312040 100644
--- a/djadmin2/themes/djadmin2theme_default/templates/djadmin2theme_default/model_history.html
+++ b/djadmin2/themes/djadmin2theme_default/templates/djadmin2theme_default/model_history.html
@@ -32,9 +32,24 @@
History for {{ object }}
{% endblocktrans %}
-
- {% for log in object_list %}
- - {{ log }} {% trans "by" %} {{ log.user }}
- {% endfor %}
-
+
+
+
+ | {% trans "Date/Time" %} |
+ {% trans "User" %} |
+ {% trans "Action" %} |
+ {% trans "Message" %} |
+
+
+
+ {% for log in object_list %}
+
+ | {{ log.action_time }} |
+ {{ log.user }} |
+ {{ log.action_flag }} |
+ {{ log.change_message }} |
+
+ {% endfor %}
+
+
{% endblock content %}
diff --git a/djadmin2/viewmixins.py b/djadmin2/viewmixins.py
index d3af797..ecc26a7 100644
--- a/djadmin2/viewmixins.py
+++ b/djadmin2/viewmixins.py
@@ -8,6 +8,10 @@ from django.core.exceptions import PermissionDenied
from django.core.urlresolvers import reverse, reverse_lazy
from django.forms.models import modelform_factory
from django.http import HttpResponseRedirect
+from django.utils.encoding import force_text
+from django.utils.text import get_text_list
+from django.utils.translation import ugettext as _
+
from braces.views import AccessMixin
from . import settings, permissions
@@ -142,3 +146,33 @@ class Admin2ModelFormMixin(object):
# default to index view
return reverse(admin2_urlname(self, 'index'))
+
+ def construct_change_message(self, request, form, formsets):
+ """ Construct a change message from a changed object """
+ change_message = []
+ if form.changed_data:
+ change_message.append(
+ _('Changed {0}.'.format(
+ get_text_list(form.changed_data, _('and')))))
+
+ if formsets:
+ for formset in formsets:
+ for added_object in formset.new_objects:
+ change_message.append(
+ _('Added {0} "{1}".'.format(
+ force_text(added_object._meta.verbose_name),
+ force_text(added_object))))
+ for changed_object, changed_fields in formset.changed_objects:
+ change_message.append(
+ _('Changed {0} for {1} "{2}".'.format(
+ get_text_list(changed_fields, _('and')),
+ force_text(changed_object._meta.verbose_name),
+ force_text(changed_object))))
+ for deleted_object in formset.deleted_objects:
+ change_message.append(
+ _('Deleted {0} "{1}".'.format(
+ force_text(deleted_object._meta.verbose_name),
+ force_text(deleted_object))))
+
+ change_message = ' '.join(change_message)
+ return change_message or _('No fields changed.')
diff --git a/djadmin2/views.py b/djadmin2/views.py
index 3a1bfe4..4a73937 100644
--- a/djadmin2/views.py
+++ b/djadmin2/views.py
@@ -237,7 +237,10 @@ class ModelEditFormView(AdminModel2Mixin, Admin2ModelFormMixin,
def forms_valid(self, form, inlines):
response = super(ModelEditFormView, self).forms_valid(form, inlines)
LogEntry.objects.log_action(
- self.request.user.id, self.object, LogEntry.CHANGE)
+ self.request.user.id,
+ self.object,
+ LogEntry.CHANGE,
+ self.construct_change_message(self.request, form, inlines))
return response
@@ -265,7 +268,10 @@ class ModelAddFormView(AdminModel2Mixin, Admin2ModelFormMixin,
def forms_valid(self, form, inlines):
response = super(ModelAddFormView, self).forms_valid(form, inlines)
LogEntry.objects.log_action(
- self.request.user.id, self.object, LogEntry.ADDITION)
+ self.request.user.id,
+ self.object,
+ LogEntry.ADDITION,
+ 'Object created.')
return response
@@ -300,7 +306,10 @@ class ModelDeleteView(AdminModel2Mixin, generic.DeleteView):
def delete(self, request, *args, **kwargs):
LogEntry.objects.log_action(
- request.user.id, self.get_object(), LogEntry.DELETION)
+ request.user.id,
+ self.get_object(),
+ LogEntry.DELETION,
+ 'Object deleted.')
return super(ModelDeleteView, self).delete(request, *args, **kwargs)