# -*- 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'{alt}' \ u' {label}' \ u' | {label2}'\ .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\d+)/ajax/(?Phide|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)