import json from django.conf import settings try: from django.core import urlresolvers except ImportError: from django import urls as urlresolvers try: from django.urls.exceptions import NoReverseMatch except ImportError: from django.core.urlresolvers import NoReverseMatch MAX = 75 class LogEntryAdminMixin(object): def created(self, obj): return obj.timestamp.strftime('%Y-%m-%d %H:%M:%S') created.short_description = 'Created' def user_url(self, obj): if obj.actor: app_label, model = settings.AUTH_USER_MODEL.split('.') viewname = 'admin:%s_%s_change' % (app_label, model.lower()) link = urlresolvers.reverse(viewname, args=[obj.actor.id]) return u'%s' % (link, obj.actor) return 'system' user_url.allow_tags = True user_url.short_description = 'User' def resource_url(self, obj): app_label, model = obj.content_type.app_label, obj.content_type.model viewname = 'admin:%s_%s_change' % (app_label, model) try: args = [obj.object_pk] if obj.object_id is None else [obj.object_id] link = urlresolvers.reverse(viewname, args=args) except NoReverseMatch: return obj.object_repr else: return u'%s' % (link, obj.object_repr) resource_url.allow_tags = True resource_url.short_description = 'Resource' def msg_short(self, obj): if obj.action == 2: return '' # delete changes = json.loads(obj.changes) s = '' if len(changes) == 1 else 's' fields = ', '.join(changes.keys()) if len(fields) > MAX: i = fields.rfind(' ', 0, MAX) fields = fields[:i] + ' ..' return '%d change%s: %s' % (len(changes), s, fields) msg_short.short_description = 'Changes' def msg(self, obj): if obj.action == 2: return '' # delete changes = json.loads(obj.changes) msg = '' for i, field in enumerate(sorted(changes), 1): value = [i, field] + (['***', '***'] if field == 'password' else changes[field]) msg += '' % tuple(value) msg += '
#FieldFromTo
%s%s%s%s
' return msg msg.allow_tags = True msg.short_description = 'Changes'