annotate bio/admin.py @ 697:67f8d49a9377

Cleaned up the code a bit. Separated the S3 stuff out into its own class. This class maybe should be in core. Still want to do some kind of context manager around the temporary file we are creating to ensure it gets deleted.
author Brian Neal <bgneal@gmail.com>
date Sun, 08 Sep 2013 21:02:58 -0500
parents 84865fcd7c26
children 6a06080e7ca8
rev   line source
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@663 23 'user__email']
bgneal@663 24 exclude = ['profile_html', 'signature_html']
bgneal@663 25 list_display = ['__unicode__', 'user_is_active', 'get_status_display', 'status_date']
bgneal@663 26 readonly_fields = ['status', 'status_date', 'update_date']
bgneal@663 27 list_filter = ['status', ]
bgneal@147 28 date_hierarchy = 'status_date'
bgneal@663 29 inlines = [BadgeOwnerInline, ]
bgneal@663 30 actions = [
bgneal@347 31 'mark_active',
bgneal@147 32 'mark_resigned',
bgneal@147 33 'mark_removed',
bgneal@147 34 'mark_suspended',
bgneal@147 35 'mark_spammer',
bgneal@215 36 'mark_stranger',
bgneal@663 37 'unsubscribe_forums',
bgneal@663 38 ]
bgneal@147 39
bgneal@147 40 def get_status_display(self, obj):
bgneal@147 41 return obj.get_status_display()
bgneal@147 42 get_status_display.short_description = 'Status'
bgneal@147 43
bgneal@147 44 def mark_user_status(self, request, qs, status):
bgneal@147 45 """
bgneal@347 46 Common code for the admin actions. Updates the status field in the
bgneal@347 47 profiles to 'status'. Updates the status_date. Sets the is_active
bgneal@147 48 field to True if the status is STA_ACTIVE and False otherwise.
bgneal@147 49 """
bgneal@147 50 now = datetime.datetime.now()
bgneal@147 51 for profile in qs:
bgneal@215 52 profile.user.is_active = (status == bio.models.STA_ACTIVE or
bgneal@215 53 status == bio.models.STA_STRANGER)
bgneal@147 54 profile.user.save()
bgneal@147 55 profile.status = status
bgneal@147 56 profile.status_date = now
bgneal@562 57 profile.save(content_update=False)
bgneal@147 58
bgneal@398 59 count = len(qs)
bgneal@147 60 msg = "1 user" if count == 1 else "%d users" % count
bgneal@147 61 self.message_user(request, "%s successfully marked as %s." % (msg,
bgneal@147 62 bio.models.USER_STATUS_CHOICES[status][1]))
bgneal@147 63
bgneal@147 64 def mark_active(self, request, qs):
bgneal@147 65 """
bgneal@147 66 Marks users as active. Updates their profile status to STA_ACTIVE.
bgneal@147 67 """
bgneal@147 68 self.mark_user_status(request, qs, bio.models.STA_ACTIVE)
bgneal@147 69 mark_active.short_description = "Mark selected users as active"
bgneal@147 70
bgneal@147 71 def mark_resigned(self, request, qs):
bgneal@147 72 """
bgneal@147 73 Marks users as inactive. Updates their profile status to STA_RESIGNED.
bgneal@147 74 """
bgneal@147 75 self.mark_user_status(request, qs, bio.models.STA_RESIGNED)
bgneal@147 76 mark_resigned.short_description = "Mark selected users as resigned"
bgneal@147 77
bgneal@147 78 def mark_removed(self, request, qs):
bgneal@147 79 """
bgneal@147 80 Marks users as inactive. Updates their profile status to STA_REMOVED.
bgneal@147 81 """
bgneal@147 82 self.mark_user_status(request, qs, bio.models.STA_REMOVED)
bgneal@147 83 mark_removed.short_description = "Mark selected users as removed"
bgneal@147 84
bgneal@147 85 def mark_suspended(self, request, qs):
bgneal@147 86 """
bgneal@147 87 Marks users as inactive. Updates their profile status to STA_SUSPENDED.
bgneal@147 88 """
bgneal@147 89 self.mark_user_status(request, qs, bio.models.STA_SUSPENDED)
bgneal@147 90 mark_suspended.short_description = "Mark selected users as suspended"
bgneal@147 91
bgneal@147 92 def mark_spammer(self, request, qs):
bgneal@147 93 """
bgneal@563 94 Calls deactivate_spammer() on each user in the profile queryset.
bgneal@563 95
bgneal@147 96 """
bgneal@563 97 count = qs.count()
bgneal@147 98 for profile in qs:
bgneal@563 99 deactivate_spammer(profile.user)
bgneal@563 100
bgneal@563 101 self.message_user(request,
bgneal@563 102 "%s profile(s) successfully marked as spammers." % count)
bgneal@563 103
bgneal@147 104 mark_spammer.short_description = "Mark selected users as spammers"
gremmie@1 105
bgneal@215 106 def mark_stranger(self, request, qs):
bgneal@215 107 """
bgneal@215 108 Marks users as strangers. Updates their profile status to STA_STRANGER.
bgneal@215 109 """
bgneal@215 110 self.mark_user_status(request, qs, bio.models.STA_STRANGER)
bgneal@215 111 mark_stranger.short_description = "Mark selected users as strangers"
bgneal@215 112
bgneal@663 113 def unsubscribe_forums(self, request, qs):
bgneal@663 114 """Delete users forum topic subscriptions."""
bgneal@663 115 for profile in qs:
bgneal@663 116 profile.user.subscriptions.clear()
bgneal@663 117
bgneal@663 118 self.message_user(request, "%s subscription(s) deleted." % qs.count())
bgneal@663 119
bgneal@663 120 unsubscribe_forums.short_description = "Delete users' forum subscriptions"
bgneal@663 121
bgneal@138 122
bgneal@138 123 class UserProfileFlagAdmin(admin.ModelAdmin):
bgneal@563 124 list_display = ['__unicode__', 'flag_date', 'get_profile_url']
bgneal@563 125 actions = ['accept_flags']
bgneal@563 126 raw_id_fields = ['user', 'profile']
bgneal@207 127
bgneal@207 128 def accept_flags(self, request, qs):
bgneal@207 129 """
bgneal@563 130 This action awards a security pin to the user that reported the
bgneal@563 131 profile, deletes the flags, then deactivates the spammers.
bgneal@563 132 """
bgneal@563 133 count = qs.count()
bgneal@207 134 for flag in qs:
bgneal@563 135 deactivate_spammer(flag.profile.user)
bgneal@207 136 bio.badges.award_badge(bio.badges.SECURITY_PIN, flag.user)
bgneal@207 137 flag.delete()
bgneal@207 138
bgneal@563 139 self.message_user(request,
bgneal@563 140 "%s profile(s) successfully marked as spammers." % count)
bgneal@563 141
bgneal@563 142 accept_flags.short_description = "Mark selected profiles as spammers"
bgneal@207 143
bgneal@207 144
bgneal@204 145 class BadgeAdmin(admin.ModelAdmin):
bgneal@204 146 list_display = ('name', 'html', 'order', 'numeric_id', 'description')
bgneal@204 147 list_editable = ('order', 'numeric_id')
bgneal@204 148
bgneal@204 149
bgneal@347 150 # We like the User admin but would like a date hierarcy on date_joined.
bgneal@347 151 class UserAdmin(django.contrib.auth.admin.UserAdmin):
bgneal@347 152 date_hierarchy = 'date_joined'
bgneal@347 153
bgneal@347 154
bgneal@204 155 admin.site.register(bio.models.UserProfile, UserProfileAdmin)
bgneal@204 156 admin.site.register(bio.models.UserProfileFlag, UserProfileFlagAdmin)
bgneal@204 157 admin.site.register(bio.models.Badge, BadgeAdmin)
bgneal@347 158
bgneal@347 159 # Unregister existing ModelAdmin for User, then register ours
bgneal@347 160 admin.site.unregister(django.contrib.auth.models.User)
bgneal@347 161 admin.site.register(django.contrib.auth.models.User, UserAdmin)