view gpp/bio/admin.py @ 204:b4305e18d3af

Resolve ticket #74. Add user badges. Some extra credit was done here: also refactored how pending news, links, and downloads are handled.
author Brian Neal <bgneal@gmail.com>
date Sat, 01 May 2010 21:53:59 +0000
parents 152d77265da6
children 8bbefaa3e408
line wrap: on
line source
"""
This file contains the admin definitions for the bio application.
"""
import datetime

from django.contrib import admin

import bio.models
from comments.models import Comment
from forums.tools import delete_user_posts


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__', 'get_status_display', 'status_date')
    list_filter = ('status', )
    date_hierarchy = 'status_date'
    inlines = (BadgeOwnerInline, )
    actions = (
        'mark_active', 
        'mark_resigned',
        'mark_removed',
        'mark_suspended',
        'mark_spammer',
    )

    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
            profile.user.save()
            profile.status = status
            profile.status_date = now
            profile.save()

        count = qs.count()
        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):
        """
        Marks users as inactive. Updates their profile status to STA_SPAMMER.
        Deletes all their comments and forum posts.
        """
        self.mark_user_status(request, qs, bio.models.STA_SPAMMER)
        for profile in qs:
            Comment.objects.filter(user=profile.user).delete()
            delete_user_posts(profile.user)
    mark_spammer.short_description = "Mark selected users as spammers"


class UserProfileFlagAdmin(admin.ModelAdmin):
    list_display = ('__unicode__', 'flag_date', 'get_profile_url')


class BadgeAdmin(admin.ModelAdmin):
    list_display = ('name', 'html', 'order', 'numeric_id', 'description')
    list_editable = ('order', 'numeric_id')


admin.site.register(bio.models.UserProfile, UserProfileAdmin)
admin.site.register(bio.models.UserProfileFlag, UserProfileFlagAdmin)
admin.site.register(bio.models.Badge, BadgeAdmin)