from django.core.exceptions import PermissionDenied from django.contrib import admin from django.contrib.comments.admin import CommentsAdmin from django.utils.encoding import force_unicode from mycomments.models import MyComment, BannedIP, BannedUserName from mycomments.utils import akismet_ham, akismet_spam class MyCommentsAdmin(CommentsAdmin): actions = ['delete_and_ban_ip', 'delete_and_ban_user', 'delete_and_ban_both', 'mark_ham', 'mark_spam'] def delete_set(self, request, objset): c = 0 for obj in objset: obj_display = force_unicode(obj) self.log_deletion(request, obj, obj_display) obj.delete() c += 1 return c def delete_and_ban(self, request, queryset, banip=False, banuser=False): """ Delete the selected comments and ban their username, IP address, or both. Cribbed slightly from Django's builtin delete_selected action. """ # Check that the user has delete permission for the actual model if not self.has_delete_permission(request): raise PermissionDenied posts = set(queryset) ipcount = 0 usercount = 0 if queryset.count(): for obj in queryset: if banip: posts |= set(MyComment.objects.filter(ip_address=obj.ip_address)) ip, created = BannedIP.objects.get_or_create( ip_address=obj.ip_address) if created: self.log_addition(request, ip) ipcount += 1 if banuser: posts |= set(MyComment.objects.filter(user_name=obj.user_name)) uname, created = BannedUserName.objects.get_or_create( user_name=obj.user_name) if created: self.log_addition(request, uname) usercount += 1 postcount = self.delete_set(request, posts) self.message_user(request, "Successfully deleted %(count)d comments, banned %(ipcount)d IPs, and banned %(usercount)d user names." % { "count": postcount, "ipcount": ipcount, "usercount": usercount }) def delete_and_ban_ip(self, request, queryset): self.delete_and_ban(request, queryset, banip=True) delete_and_ban_ip.short_description = "Delete and ban selected IP addresses" def delete_and_ban_user(self, request, queryset): self.delete_and_ban(request, queryset, banuser=True) delete_and_ban_user.short_description = "Delete and ban selected user names" def delete_and_ban_both(self, request, queryset): self.delete_and_ban(request, queryset, banip=True, banuser=True) delete_and_ban_both.short_description = "Delete and ban selected IP addresses and user names" def mark_comment(self, request, queryset, action=akismet_spam, type="spam"): if not self.has_change_permission(request): raise PermissionDenied count = queryset.count() if count: for comment in queryset: action(request, comment) self.log_change(request, comment, "Changed is_public, marked as %s." % type) self.message_user(request, "Successfully marked %(count)d comments as %(type)s." % { "count": count, "type": type }) def mark_ham(self, request, queryset): self.mark_comment(request, queryset, akismet_ham, "ham") queryset.update(is_public=True) mark_ham.short_description = \ "Mark as visible and submit to Akismet as ham" def mark_spam(self, request, queryset): self.mark_comment(request, queryset, akismet_spam, "spam") queryset.update(is_public=False) mark_spam.short_description = \ "Mark as hidden and submit to Akismet as spam" class BannedIPAdmin(admin.ModelAdmin): search_fields = ('ip_address',) pass class BannedUserNameAdmin(admin.ModelAdmin): search_fields = ('user_name',) pass admin.site.register(MyComment, MyCommentsAdmin) admin.site.register(BannedIP, BannedIPAdmin) admin.site.register(BannedUserName, BannedUserNameAdmin) # vim: set ts=4 sw=4 et: