moderator/moderate/admin.py (92 lines of code) (raw):

import csv from django.contrib import admin from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import User from django.db.models import Count from django.http import HttpResponse from moderator.moderate.models import Event, MozillianProfile, Question, Vote # Unregister User from admin to attach MozillianProfile admin.site.unregister(User) def export_questions_csv(modeladmin, request, queryset): """Export questions csv.""" filename = "questions.csv" response = HttpResponse(mimetype="text/csv") response["Content-Disposition"] = 'attachment; filename="%s"' % filename writer = csv.writer(response) for e in queryset: writer.writerow([e.name]) questions = e.questions.annotate(vote_count=Count("votes")).order_by( "-vote_count" ) for q in questions: writer.writerow([q.question.encode("utf-8"), q.votes.count()]) return response class MozillianProfileInline(admin.StackedInline): model = MozillianProfile fk_name = "user" class UserAdmin(UserAdmin): inlines = [MozillianProfileInline] list_display = ( "username", "email", "first_name", "last_name", "is_nda_member", "is_staff", ) search_fields = ["email", "first_name", "last_name"] def is_nda_member(self, obj): return obj.userprofile.is_nda_member is_nda_member.boolean = True class QuestionInline(admin.StackedInline): model = Question fields = ( "addressed", "question", "asked_by", ) readonly_fields = ( "question", "asked_by", ) extra = 0 class EventAdmin(admin.ModelAdmin): inlines = [QuestionInline] list_display = ( "name", "slug", "questions_count", "created_at", "event_date", "archived", "is_nda", ) actions = [export_questions_csv] date_hierarchy = "created_at" search_fields = [ "name", "moderators__username", "moderators__email", "moderators__first_name", "moderators__last_name", ] ordering = ["-created_at"] list_filter = ["archived", "is_nda"] autocomplete_fields = ["moderators"] class QuestionAdmin(admin.ModelAdmin): list_display = ( "id", "asked_by", "event", "question", "is_accepted", "is_anonymous", "has_contact_info", ) list_filter = ["is_accepted", "is_anonymous", "event__name"] search_fields = ["event__name", "asked_by__username", "asked_by__email", "question"] def has_contact_info(self, obj): return obj.has_contact_info has_contact_info.boolean = True admin.site.register(User, UserAdmin) admin.site.register(Event, EventAdmin) admin.site.register(Question, QuestionAdmin) admin.site.register(Vote)