| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- import xadmin
- from xadmin.layout import *
- from xadmin.util import username_field
- from django.conf import settings
- from django.contrib.comments.models import Comment
- from django.utils.translation import ugettext_lazy as _, ungettext
- from django.contrib.comments import get_model
- from django.contrib.comments.views.moderation import perform_flag, perform_approve, perform_delete
- class UsernameSearch(object):
- """The User object may not be auth.User, so we need to provide
- a mechanism for issuing the equivalent of a .filter(user__username=...)
- search in CommentAdmin.
- """
- def __str__(self):
- return 'user__%s' % username_field
- class CommentsAdmin(object):
- form_layout = (
- Main(
- Fieldset(None,
- 'content_type', 'object_pk', 'site',
- css_class='unsort no_title'
- ),
- Fieldset('Content',
- 'user', 'user_name', 'user_email', 'user_url', 'comment'
- ),
- ),
- Side(
- Fieldset(_('Metadata'),
- 'submit_date', 'ip_address', 'is_public', 'is_removed'
- ),
- )
- )
- list_display = ('name', 'content_type', 'object_pk', 'ip_address', 'submit_date', 'is_public', 'is_removed')
- list_filter = ('submit_date', 'site', 'is_public', 'is_removed')
- ordering = ('-submit_date',)
- search_fields = ('comment', UsernameSearch(), 'user_name', 'user_email', 'user_url', 'ip_address')
- actions = ["flag_comments", "approve_comments", "remove_comments"]
- model_icon = 'fa fa-comment'
- def get_actions(self):
- actions = super(CommentsAdmin, self).get_actions()
- # Only superusers should be able to delete the comments from the DB.
- if not self.user.is_superuser and 'delete_selected' in actions:
- actions.pop('delete_selected')
- if not self.user.has_perm('comments.can_moderate'):
- if 'approve_comments' in actions:
- actions.pop('approve_comments')
- if 'remove_comments' in actions:
- actions.pop('remove_comments')
- return actions
- def flag_comments(self, request, queryset):
- self._bulk_flag(queryset, perform_flag,
- lambda n: ungettext('flagged', 'flagged', n))
- flag_comments.short_description = _("Flag selected comments")
- flag_comments.icon = 'flag'
- def approve_comments(self, request, queryset):
- self._bulk_flag(queryset, perform_approve,
- lambda n: ungettext('approved', 'approved', n))
- approve_comments.short_description = _("Approve selected comments")
- approve_comments.icon = 'ok'
- def remove_comments(self, request, queryset):
- self._bulk_flag(queryset, perform_delete,
- lambda n: ungettext('removed', 'removed', n))
- remove_comments.short_description = _("Remove selected comments")
- remove_comments.icon = 'remove-circle'
- def _bulk_flag(self, queryset, action, done_message):
- """
- Flag, approve, or remove some comments from an admin action. Actually
- calls the `action` argument to perform the heavy lifting.
- """
- n_comments = 0
- for comment in queryset:
- action(self.request, comment)
- n_comments += 1
- msg = ungettext('1 comment was successfully %(action)s.',
- '%(count)s comments were successfully %(action)s.',
- n_comments)
- self.message_user(msg % {'count': n_comments, 'action': done_message(n_comments)}, 'success')
- # Only register the default admin if the model is the built-in comment model
- # (this won't be true if there's a custom comment app).
- if 'django.contrib.comments' in settings.INSTALLED_APPS and (get_model() is Comment):
- xadmin.site.register(Comment, CommentsAdmin)
|