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
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' <a class="action" href="{href}">{label}</a>' \
|
|
u' | <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)
|
|
|