You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

97 lines
3.7 KiB

# -*- coding: utf-8 -*-
from functools import update_wrapper, partial
from django.contrib import admin
from django.contrib.admin.util import unquote
from django.conf.urls import patterns, url
from django.core.exceptions import PermissionDenied
from django.core.urlresolvers import reverse_lazy, reverse
from django.http import Http404
from django.utils.translation import ugettext_lazy as _
from django.utils.html import escape
from django.utils.encoding import force_text
from functions.admin import DefaultAdmin
from functions.http import JsonResponse
from .models import Comment
class CommentAdmin(DefaultAdmin):
class Media:
js = (
"js/jquery.truncator.js",
"admin/js/comments_manage.js",
)
# css = {
# 'all': ("admin/css/comments_manage.css",),
# }
list_display = ['text', 'ip', 'user', 'hide']
list_select_related = True
list_filter = ('hidden', )
date_hierarchy = 'created'
readonly_fields = ['ip', 'created', 'parent', 'user']
fieldsets = (
(None,
{'fields': (('created', 'hidden',),
'ip',
'user',
'text', )}),
)
def hide(self, obj):
body = u'<img src="{url}" alt={alt}>' \
u'&nbsp;<a class="action" href="{href}">{label}</a>' \
u'&nbsp;|&nbsp;<a class="action" href="{href2}">{label2}</a>'\
.format(**self.get_yesno_image_data(obj))
return body
hide.short_description = _(u'Модерирование')
hide.allow_tags = True
def urls(self):
urlpatterns = self.get_urls()
def wrap(view):
def wrapper(*args, **kwargs):
return self.admin_site.admin_view(view)(*args, **kwargs)
return update_wrapper(wrapper, view)
info = self.model._meta.app_label, self.model._meta.module_name
_urlpatterns = patterns('',
url(r'^(?P<object_id>\d+)/ajax/(?P<action>hide|show|banro|unbanro)/$',
wrap(self.ajax_view),
name='%s_%s_ajax' % info),
)
return _urlpatterns + urlpatterns
urls = property(urls)
def get_yesno_image_data(self, obj):
return {
'url': '/static/admin/img/icon-{0}.gif'.format('no' if obj.hidden else 'yes'),
'alt': str(not obj.hidden),
'href': reverse('admin:comments_comment_ajax', args=[obj.id, 'hide' if not obj.hidden else 'show']),
'label': unicode(_(u'Опубликовать') if obj.hidden else _(u'Скрыть')),
'href2': reverse('admin:comments_comment_ajax', args=[obj.id, 'banro' if not obj.user.readonly else 'unbanro']),
'label2': unicode(_(u'Снять RO') if obj.user.readonly else _(u'Наложить RO')),
}
def ajax_view(self, request, object_id, extra_context=None, *args, **kwargs):
"The 'change' admin view for this model."
action = kwargs.get('action')
model = self.model
opts = model._meta
obj = self.get_object(request, unquote(object_id))
if not self.has_change_permission(request, obj) or not request.is_ajax():
raise PermissionDenied
if obj is None:
raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_text(opts.verbose_name), 'key': escape(object_id)})
if action in ['hide', 'show']:
obj.hidden = True if action == 'hide' else False
obj.save()
else:
obj.user.readonly = True if action == 'banro' else False
obj.user.save()
return JsonResponse(dict({'success': True}, **self.get_yesno_image_data(obj)))
ajax_view.csrf_exempt = True
admin.site.register(Comment, CommentAdmin)