gremmie@1
|
1 """
|
gremmie@1
|
2 This file contains the admin definitions for the bio application.
|
gremmie@1
|
3 """
|
bgneal@147
|
4 import datetime
|
gremmie@1
|
5
|
gremmie@1
|
6 from django.contrib import admin
|
bgneal@204
|
7
|
bgneal@347
|
8 import django.contrib.auth.models
|
bgneal@347
|
9 import django.contrib.auth.admin
|
bgneal@347
|
10
|
bgneal@147
|
11 import bio.models
|
bgneal@207
|
12 import bio.badges
|
bgneal@563
|
13 from antispam.utils import deactivate_spammer
|
bgneal@147
|
14
|
gremmie@1
|
15
|
bgneal@204
|
16 class BadgeOwnerInline(admin.TabularInline):
|
bgneal@204
|
17 model = bio.models.BadgeOwnership
|
bgneal@204
|
18 extra = 1
|
bgneal@204
|
19
|
bgneal@204
|
20
|
gremmie@1
|
21 class UserProfileAdmin(admin.ModelAdmin):
|
bgneal@663
|
22 search_fields = ['user__username', 'user__first_name', 'user__last_name',
|
bgneal@1035
|
23 'user__email']
|
bgneal@663
|
24 exclude = ['profile_html', 'signature_html']
|
bgneal@1035
|
25 list_display = ['__unicode__', 'user_is_active', 'get_status_display',
|
bgneal@1035
|
26 'status_date']
|
bgneal@663
|
27 readonly_fields = ['status', 'status_date', 'update_date']
|
bgneal@663
|
28 list_filter = ['status', ]
|
bgneal@147
|
29 date_hierarchy = 'status_date'
|
bgneal@663
|
30 inlines = [BadgeOwnerInline, ]
|
bgneal@663
|
31 actions = [
|
bgneal@347
|
32 'mark_active',
|
bgneal@147
|
33 'mark_resigned',
|
bgneal@147
|
34 'mark_removed',
|
bgneal@147
|
35 'mark_suspended',
|
bgneal@147
|
36 'mark_spammer',
|
bgneal@215
|
37 'mark_stranger',
|
bgneal@663
|
38 'unsubscribe_forums',
|
bgneal@663
|
39 ]
|
bgneal@147
|
40
|
bgneal@790
|
41 def has_delete_permission(self, request, object=None):
|
bgneal@790
|
42 # We don't want to delete a user profile; it is tied to the user object
|
bgneal@790
|
43 return False
|
bgneal@790
|
44
|
bgneal@790
|
45 def get_actions(self, request):
|
bgneal@790
|
46 # We don't want to delete a user profile; it is tied to the user object
|
bgneal@790
|
47 actions = super(UserProfileAdmin, self).get_actions(request)
|
bgneal@790
|
48 del actions['delete_selected']
|
bgneal@790
|
49 return actions
|
bgneal@790
|
50
|
bgneal@147
|
51 def get_status_display(self, obj):
|
bgneal@147
|
52 return obj.get_status_display()
|
bgneal@147
|
53 get_status_display.short_description = 'Status'
|
bgneal@147
|
54
|
bgneal@147
|
55 def mark_user_status(self, request, qs, status):
|
bgneal@147
|
56 """
|
bgneal@347
|
57 Common code for the admin actions. Updates the status field in the
|
bgneal@347
|
58 profiles to 'status'. Updates the status_date. Sets the is_active
|
bgneal@147
|
59 field to True if the status is STA_ACTIVE and False otherwise.
|
bgneal@147
|
60 """
|
bgneal@147
|
61 now = datetime.datetime.now()
|
bgneal@147
|
62 for profile in qs:
|
bgneal@215
|
63 profile.user.is_active = (status == bio.models.STA_ACTIVE or
|
bgneal@215
|
64 status == bio.models.STA_STRANGER)
|
bgneal@147
|
65 profile.user.save()
|
bgneal@147
|
66 profile.status = status
|
bgneal@147
|
67 profile.status_date = now
|
bgneal@562
|
68 profile.save(content_update=False)
|
bgneal@147
|
69
|
bgneal@398
|
70 count = len(qs)
|
bgneal@147
|
71 msg = "1 user" if count == 1 else "%d users" % count
|
bgneal@147
|
72 self.message_user(request, "%s successfully marked as %s." % (msg,
|
bgneal@147
|
73 bio.models.USER_STATUS_CHOICES[status][1]))
|
bgneal@147
|
74
|
bgneal@147
|
75 def mark_active(self, request, qs):
|
bgneal@147
|
76 """
|
bgneal@147
|
77 Marks users as active. Updates their profile status to STA_ACTIVE.
|
bgneal@147
|
78 """
|
bgneal@147
|
79 self.mark_user_status(request, qs, bio.models.STA_ACTIVE)
|
bgneal@147
|
80 mark_active.short_description = "Mark selected users as active"
|
bgneal@147
|
81
|
bgneal@147
|
82 def mark_resigned(self, request, qs):
|
bgneal@147
|
83 """
|
bgneal@147
|
84 Marks users as inactive. Updates their profile status to STA_RESIGNED.
|
bgneal@147
|
85 """
|
bgneal@147
|
86 self.mark_user_status(request, qs, bio.models.STA_RESIGNED)
|
bgneal@147
|
87 mark_resigned.short_description = "Mark selected users as resigned"
|
bgneal@147
|
88
|
bgneal@147
|
89 def mark_removed(self, request, qs):
|
bgneal@147
|
90 """
|
bgneal@147
|
91 Marks users as inactive. Updates their profile status to STA_REMOVED.
|
bgneal@147
|
92 """
|
bgneal@147
|
93 self.mark_user_status(request, qs, bio.models.STA_REMOVED)
|
bgneal@147
|
94 mark_removed.short_description = "Mark selected users as removed"
|
bgneal@147
|
95
|
bgneal@147
|
96 def mark_suspended(self, request, qs):
|
bgneal@147
|
97 """
|
bgneal@147
|
98 Marks users as inactive. Updates their profile status to STA_SUSPENDED.
|
bgneal@147
|
99 """
|
bgneal@147
|
100 self.mark_user_status(request, qs, bio.models.STA_SUSPENDED)
|
bgneal@147
|
101 mark_suspended.short_description = "Mark selected users as suspended"
|
bgneal@147
|
102
|
bgneal@147
|
103 def mark_spammer(self, request, qs):
|
bgneal@147
|
104 """
|
bgneal@563
|
105 Calls deactivate_spammer() on each user in the profile queryset.
|
bgneal@563
|
106
|
bgneal@147
|
107 """
|
bgneal@563
|
108 count = qs.count()
|
bgneal@147
|
109 for profile in qs:
|
bgneal@563
|
110 deactivate_spammer(profile.user)
|
bgneal@563
|
111
|
bgneal@563
|
112 self.message_user(request,
|
bgneal@563
|
113 "%s profile(s) successfully marked as spammers." % count)
|
bgneal@563
|
114
|
bgneal@147
|
115 mark_spammer.short_description = "Mark selected users as spammers"
|
gremmie@1
|
116
|
bgneal@215
|
117 def mark_stranger(self, request, qs):
|
bgneal@215
|
118 """
|
bgneal@215
|
119 Marks users as strangers. Updates their profile status to STA_STRANGER.
|
bgneal@215
|
120 """
|
bgneal@215
|
121 self.mark_user_status(request, qs, bio.models.STA_STRANGER)
|
bgneal@215
|
122 mark_stranger.short_description = "Mark selected users as strangers"
|
bgneal@215
|
123
|
bgneal@663
|
124 def unsubscribe_forums(self, request, qs):
|
bgneal@663
|
125 """Delete users forum topic subscriptions."""
|
bgneal@663
|
126 for profile in qs:
|
bgneal@663
|
127 profile.user.subscriptions.clear()
|
bgneal@663
|
128
|
bgneal@663
|
129 self.message_user(request, "%s subscription(s) deleted." % qs.count())
|
bgneal@663
|
130
|
bgneal@663
|
131 unsubscribe_forums.short_description = "Delete users' forum subscriptions"
|
bgneal@663
|
132
|
bgneal@138
|
133
|
bgneal@138
|
134 class UserProfileFlagAdmin(admin.ModelAdmin):
|
bgneal@563
|
135 list_display = ['__unicode__', 'flag_date', 'get_profile_url']
|
bgneal@563
|
136 actions = ['accept_flags']
|
bgneal@563
|
137 raw_id_fields = ['user', 'profile']
|
bgneal@207
|
138
|
bgneal@207
|
139 def accept_flags(self, request, qs):
|
bgneal@207
|
140 """
|
bgneal@563
|
141 This action awards a security pin to the user that reported the
|
bgneal@563
|
142 profile, deletes the flags, then deactivates the spammers.
|
bgneal@563
|
143 """
|
bgneal@563
|
144 count = qs.count()
|
bgneal@207
|
145 for flag in qs:
|
bgneal@563
|
146 deactivate_spammer(flag.profile.user)
|
bgneal@207
|
147 bio.badges.award_badge(bio.badges.SECURITY_PIN, flag.user)
|
bgneal@207
|
148 flag.delete()
|
bgneal@207
|
149
|
bgneal@563
|
150 self.message_user(request,
|
bgneal@563
|
151 "%s profile(s) successfully marked as spammers." % count)
|
bgneal@563
|
152
|
bgneal@563
|
153 accept_flags.short_description = "Mark selected profiles as spammers"
|
bgneal@207
|
154
|
bgneal@207
|
155
|
bgneal@204
|
156 class BadgeAdmin(admin.ModelAdmin):
|
bgneal@204
|
157 list_display = ('name', 'html', 'order', 'numeric_id', 'description')
|
bgneal@204
|
158 list_editable = ('order', 'numeric_id')
|
bgneal@204
|
159
|
bgneal@204
|
160
|
bgneal@347
|
161 # We like the User admin but would like a date hierarcy on date_joined.
|
bgneal@347
|
162 class UserAdmin(django.contrib.auth.admin.UserAdmin):
|
bgneal@347
|
163 date_hierarchy = 'date_joined'
|
bgneal@347
|
164
|
bgneal@347
|
165
|
bgneal@204
|
166 admin.site.register(bio.models.UserProfile, UserProfileAdmin)
|
bgneal@204
|
167 admin.site.register(bio.models.UserProfileFlag, UserProfileFlagAdmin)
|
bgneal@204
|
168 admin.site.register(bio.models.Badge, BadgeAdmin)
|
bgneal@347
|
169
|
bgneal@347
|
170 # Unregister existing ModelAdmin for User, then register ours
|
bgneal@347
|
171 admin.site.unregister(django.contrib.auth.models.User)
|
bgneal@347
|
172 admin.site.register(django.contrib.auth.models.User, UserAdmin)
|