Mercurial > public > sg101
diff bio/admin.py @ 581:ee87ea74d46b
For Django 1.4, rearranged project structure for new manage.py.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Sat, 05 May 2012 17:10:48 -0500 |
parents | gpp/bio/admin.py@93f049a241ff |
children | 84865fcd7c26 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bio/admin.py Sat May 05 17:10:48 2012 -0500 @@ -0,0 +1,151 @@ +""" +This file contains the admin definitions for the bio application. +""" +import datetime + +from django.contrib import admin + +import django.contrib.auth.models +import django.contrib.auth.admin + +import bio.models +import bio.badges +from antispam.utils import deactivate_spammer + + +class BadgeOwnerInline(admin.TabularInline): + model = bio.models.BadgeOwnership + extra = 1 + + +class UserProfileAdmin(admin.ModelAdmin): + search_fields = ('user__username', 'user__first_name', 'user__last_name', + 'user__email') + exclude = ('profile_html', 'signature_html') + list_display = ('__unicode__', 'user_is_active', 'get_status_display', 'status_date') + readonly_fields = ('status', 'status_date', 'update_date') + list_filter = ('status', ) + date_hierarchy = 'status_date' + inlines = (BadgeOwnerInline, ) + actions = ( + 'mark_active', + 'mark_resigned', + 'mark_removed', + 'mark_suspended', + 'mark_spammer', + 'mark_stranger', + ) + + def get_status_display(self, obj): + return obj.get_status_display() + get_status_display.short_description = 'Status' + + def mark_user_status(self, request, qs, status): + """ + Common code for the admin actions. Updates the status field in the + profiles to 'status'. Updates the status_date. Sets the is_active + field to True if the status is STA_ACTIVE and False otherwise. + """ + now = datetime.datetime.now() + for profile in qs: + profile.user.is_active = (status == bio.models.STA_ACTIVE or + status == bio.models.STA_STRANGER) + profile.user.save() + profile.status = status + profile.status_date = now + profile.save(content_update=False) + + count = len(qs) + msg = "1 user" if count == 1 else "%d users" % count + self.message_user(request, "%s successfully marked as %s." % (msg, + bio.models.USER_STATUS_CHOICES[status][1])) + + def mark_active(self, request, qs): + """ + Marks users as active. Updates their profile status to STA_ACTIVE. + """ + self.mark_user_status(request, qs, bio.models.STA_ACTIVE) + mark_active.short_description = "Mark selected users as active" + + def mark_resigned(self, request, qs): + """ + Marks users as inactive. Updates their profile status to STA_RESIGNED. + """ + self.mark_user_status(request, qs, bio.models.STA_RESIGNED) + mark_resigned.short_description = "Mark selected users as resigned" + + def mark_removed(self, request, qs): + """ + Marks users as inactive. Updates their profile status to STA_REMOVED. + """ + self.mark_user_status(request, qs, bio.models.STA_REMOVED) + mark_removed.short_description = "Mark selected users as removed" + + def mark_suspended(self, request, qs): + """ + Marks users as inactive. Updates their profile status to STA_SUSPENDED. + """ + self.mark_user_status(request, qs, bio.models.STA_SUSPENDED) + mark_suspended.short_description = "Mark selected users as suspended" + + def mark_spammer(self, request, qs): + """ + Calls deactivate_spammer() on each user in the profile queryset. + + """ + count = qs.count() + for profile in qs: + deactivate_spammer(profile.user) + + self.message_user(request, + "%s profile(s) successfully marked as spammers." % count) + + mark_spammer.short_description = "Mark selected users as spammers" + + def mark_stranger(self, request, qs): + """ + Marks users as strangers. Updates their profile status to STA_STRANGER. + """ + self.mark_user_status(request, qs, bio.models.STA_STRANGER) + mark_stranger.short_description = "Mark selected users as strangers" + + +class UserProfileFlagAdmin(admin.ModelAdmin): + list_display = ['__unicode__', 'flag_date', 'get_profile_url'] + actions = ['accept_flags'] + raw_id_fields = ['user', 'profile'] + + def accept_flags(self, request, qs): + """ + This action awards a security pin to the user that reported the + profile, deletes the flags, then deactivates the spammers. + """ + count = qs.count() + for flag in qs: + deactivate_spammer(flag.profile.user) + bio.badges.award_badge(bio.badges.SECURITY_PIN, flag.user) + flag.delete() + + self.message_user(request, + "%s profile(s) successfully marked as spammers." % count) + + accept_flags.short_description = "Mark selected profiles as spammers" + + +class BadgeAdmin(admin.ModelAdmin): + list_display = ('name', 'html', 'order', 'numeric_id', 'description') + list_editable = ('order', 'numeric_id') + + +# We like the User admin but would like a date hierarcy on date_joined. +class UserAdmin(django.contrib.auth.admin.UserAdmin): + date_hierarchy = 'date_joined' + + +admin.site.register(bio.models.UserProfile, UserProfileAdmin) +admin.site.register(bio.models.UserProfileFlag, UserProfileFlagAdmin) +admin.site.register(bio.models.Badge, BadgeAdmin) + +# Unregister existing ModelAdmin for User, then register ours +admin.site.unregister(django.contrib.auth.models.User) +admin.site.register(django.contrib.auth.models.User, UserAdmin)