svthalia/concrexit

View on GitHub
website/education/admin.py

Summary

Maintainability
A
0 mins
Test Coverage
"""This module registers admin pages for the models."""
import csv

from django.contrib import admin
from django.contrib.admin import ModelAdmin
from django.http import HttpResponse
from django.utils.translation import gettext_lazy as _

from . import models
from .forms import SummaryAdminForm

admin.site.register(models.Category)


@admin.register(models.Course)
class CourseAdmin(ModelAdmin):
    fields = (
        "name",
        "course_code",
        "ec",
        "since",
        "until",
        "categories",
        "old_courses",
    )
    list_filter = ("categories", "ec")
    search_fields = ("name", "course_code")


class WithDownloadCsv:
    def download_csv(self, request, queryset):
        opts = queryset.model._meta
        response = HttpResponse(content_type="text/csv")
        # force download.
        response["Content-Disposition"] = "attachment;filename=export.csv"
        # the csv writer
        writer = csv.writer(response)
        field_names = [field.name for field in opts.fields]
        # Write a first row with header information
        writer.writerow(field_names)
        # Write data rows
        for obj in queryset:
            writer.writerow([getattr(obj, field) for field in field_names])
        return response

    download_csv.short_description = _("Download marked as csv")


@admin.register(models.Exam)
class ExamAdmin(ModelAdmin, WithDownloadCsv):
    list_display = (
        "type",
        "course",
        "exam_date",
        "uploader",
        "accepted",
        "language",
        "download_count",
    )
    readonly_fields = ("download_count",)
    list_filter = ("accepted", "exam_date", "type", "language")
    search_fields = (
        "name",
        "uploader__first_name",
        "uploader__last_name",
        "course__name",
    )
    actions = ["accept", "reject", "reset_download_count", "download_csv"]

    def accept(self, request, queryset):
        queryset.update(accepted=True)

    accept.short_description = _("Mark exams as accepted")

    def reject(self, request, queryset):
        queryset.update(accepted=False)

    reject.short_description = _("Mark exams as rejected")

    def reset_download_count(self, request, queryset):
        queryset.update(download_count=0)

    reset_download_count.short_description = _("Reset the marked exams download count")


@admin.register(models.Summary)
class SummaryAdmin(ModelAdmin, WithDownloadCsv):
    list_display = (
        "name",
        "course",
        "uploader",
        "accepted",
        "language",
        "download_count",
    )
    readonly_fields = ("download_count",)
    list_filter = ("accepted", "language")
    search_fields = (
        "name",
        "uploader__first_name",
        "uploader__last_name",
        "course__name",
    )
    actions = ["accept", "reject", "reset_download_count", "download_csv"]
    form = SummaryAdminForm

    def accept(self, request, queryset):
        queryset.update(accepted=True)

    accept.short_description = _("Mark summaries as accepted")

    def reject(self, request, queryset):
        queryset.update(accepted=False)

    reject.short_description = _("Mark summaries as rejected")

    def reset_download_count(self, request, queryset):
        queryset.update(download_count=0)

    reset_download_count.short_description = _(
        "Reset the marked summaries download count"
    )