2016-09-02 19:02:42 +00:00
|
|
|
import json
|
|
|
|
|
|
|
|
|
|
from django.conf import settings
|
2018-01-02 18:50:45 +00:00
|
|
|
try:
|
|
|
|
|
from django.core import urlresolvers
|
|
|
|
|
except ImportError:
|
|
|
|
|
from django import urls as urlresolvers
|
2017-02-16 21:24:24 +00:00
|
|
|
try:
|
|
|
|
|
from django.urls.exceptions import NoReverseMatch
|
|
|
|
|
except ImportError:
|
|
|
|
|
from django.core.urlresolvers import NoReverseMatch
|
2016-09-02 19:02:42 +00:00
|
|
|
|
|
|
|
|
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])
|
2017-01-22 09:32:44 +00:00
|
|
|
return u'<a href="%s">%s</a>' % (link, obj.actor)
|
|
|
|
|
|
2016-09-02 19:02:42 +00:00
|
|
|
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)
|
2017-02-16 03:06:12 +00:00
|
|
|
try:
|
2018-01-04 16:49:39 +00:00
|
|
|
args = [obj.object_pk] if obj.object_id is None else [obj.object_id]
|
|
|
|
|
link = urlresolvers.reverse(viewname, args=args)
|
2017-02-16 03:06:12 +00:00
|
|
|
except NoReverseMatch:
|
|
|
|
|
return obj.object_repr
|
|
|
|
|
else:
|
|
|
|
|
return u'<a href="%s">%s</a>' % (link, obj.object_repr)
|
2016-09-02 19:02:42 +00:00
|
|
|
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 = '<table><tr><th>#</th><th>Field</th><th>From</th><th>To</th></tr>'
|
|
|
|
|
for i, field in enumerate(sorted(changes), 1):
|
|
|
|
|
value = [i, field] + (['***', '***'] if field == 'password' else changes[field])
|
|
|
|
|
msg += '<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>' % tuple(value)
|
|
|
|
|
msg += '</table>'
|
|
|
|
|
return msg
|
|
|
|
|
msg.allow_tags = True
|
|
|
|
|
msg.short_description = 'Changes'
|