summaryrefslogtreecommitdiffstats
path: root/mycomments/admin.py
blob: e2be4638631da2ed9e1687e360317c75ba1e3e6b (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
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

class MyCommentsAdmin(CommentsAdmin):
    actions = ['delete_and_ban_ip', 'delete_and_ban_user', 'delete_and_ban_both']

    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"


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

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