1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
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:
|