summaryrefslogtreecommitdiffstats
path: root/mycomments/admin.py
blob: bad9ebd3d3d2f79b190c3a3ae51c2f0d4a759dac (plain)
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
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.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"

admin.site.register(MyComment, MyCommentsAdmin)
admin.site.register(BannedIP)
admin.site.register(BannedUserName)

# vim: set ts=4 sw=4 et: