From cbabafb4920e6e3f091510bc151f3e94c62104f3 Mon Sep 17 00:00:00 2001 From: C4 Patino Date: Tue, 23 May 2023 13:35:52 -0500 Subject: [PATCH] Added new admin commands to make next housewars easier --- CollegiateHouseWars/settings/prod.py | 2 +- housewars/admin/Activity.py | 18 ++++++++++--- housewars/admin/Teacher.py | 38 +++++++++++++++++++++++++--- housewars/utils/load_pdf.py | 10 ++++++-- housewars/views.py | 4 +-- 5 files changed, 60 insertions(+), 12 deletions(-) diff --git a/CollegiateHouseWars/settings/prod.py b/CollegiateHouseWars/settings/prod.py index 44ede0e..5867a27 100644 --- a/CollegiateHouseWars/settings/prod.py +++ b/CollegiateHouseWars/settings/prod.py @@ -6,7 +6,7 @@ from .defaults import * SECRET_KEY = os.environ.get('SECRET_KEY') # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = False +DEBUG = True ALLOWED_HOSTS = [ 'housewars.c4thebomb101.com', diff --git a/housewars/admin/Activity.py b/housewars/admin/Activity.py index 4030a82..2ebff93 100644 --- a/housewars/admin/Activity.py +++ b/housewars/admin/Activity.py @@ -8,7 +8,6 @@ import zipfile from housewars.utils import get_random_string, load_pdf from housewars.models import Activity, Award, Quota, UserEntry -from housewars.utils import load_pdf class QuotaInline(admin.TabularInline): @@ -34,7 +33,8 @@ class ActivityAdmin(admin.ModelAdmin): inlines = [QuotaInline, AwardsInline] - actions = ['generate_passwords', 'export_a1_to_pdf', 'export_a2_to_pdf'] + actions = ['generate_passwords', 'remove_room_number', + 'export_a1_to_pdf', 'export_a2_to_pdf'] @admin.display(description='Hawk') def hawk_signups(self, obj): @@ -72,6 +72,16 @@ class ActivityAdmin(admin.ModelAdmin): queryset.count(), ) % queryset.count(), messages.SUCCESS) + @admin.action(description='Remove room number from selected activities') + def remove_room_number(self, request, queryset): + queryset.update(room_number=None) + + self.message_user(request, ngettext( + 'Removed room number for %d activity.', + 'Removed room numbers for %d activities.', + queryset.count(), + ) % queryset.count(), messages.SUCCESS) + @admin.action(description='Export activity 1 attendance to pdf') def export_a1_to_pdf(self, request, queryset): file_list = {} @@ -87,7 +97,7 @@ class ActivityAdmin(admin.ModelAdmin): headers = ['first_name', 'last_name', 'grade', 'house', 'activity1', 'a1_room', 'activity2', 'a2_room'] - file = load_pdf(user_entries, headers) + file = load_pdf(user_entries, headers, f"{activity.name} - 1") file_list[f"{activity.name} - 1"] = file @@ -118,7 +128,7 @@ class ActivityAdmin(admin.ModelAdmin): headers = ['first_name', 'last_name', 'grade', 'house', 'activity1', 'a1_room', 'activity2', 'a2_room'] - file = load_pdf(user_entries, headers) + file = load_pdf(user_entries, headers, f"{activity.name} - 2") file_list[f"{activity.name} - 2"] = file diff --git a/housewars/admin/Teacher.py b/housewars/admin/Teacher.py index cc936d0..2fb2b33 100644 --- a/housewars/admin/Teacher.py +++ b/housewars/admin/Teacher.py @@ -1,6 +1,7 @@ -from django.contrib import admin +from django.contrib import admin, messages from django.http import HttpResponse from django.db.models import F +from django.utils.translation import ngettext import io import zipfile @@ -20,7 +21,37 @@ class TeacherAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name', 'house', 'grade', 'activity') - actions = ['generate_passwords', 'export_mentor_to_pdf'] + actions = ['export_mentor_to_pdf'] + + @admin.action(description='Remove activity from selected teachers') + def remove_activity(self, request, queryset): + queryset.update(activity=None) + + self.message_user(request, ngettext( + 'Removed activity for %d teacher.', + 'Removed activities for %d teachers.', + queryset.count(), + ) % queryset.count(), messages.SUCCESS) + + @admin.action(description='Remove house from selected teachers') + def remove_activity(self, request, queryset): + queryset.update(house=None) + + self.message_user(request, ngettext( + 'Removed house for %d teacher.', + 'Removed houses for %d teachers.', + queryset.count(), + ) % queryset.count(), messages.SUCCESS) + + @admin.action(description='Remove grade from selected teachers') + def remove_activity(self, request, queryset): + queryset.update(grade=None) + + self.message_user(request, ngettext( + 'Removed grade for %d teacher.', + 'Removed grades for %d teachers.', + queryset.count(), + ) % queryset.count(), messages.SUCCESS) @admin.action(description='Export mentor to pdf') def export_mentor_to_pdf(self, request, queryset): @@ -38,7 +69,8 @@ class TeacherAdmin(admin.ModelAdmin): headers = ['first_name', 'last_name', 'grade', 'house', 'activity1', 'a1_room', 'activity2', 'a2_room'] - file = load_pdf(user_entries, headers) + file = load_pdf(user_entries, headers, + f"{teacher.last_name}, {teacher.first_name}") file_list[f"{teacher.last_name}, {teacher.first_name}"] = file diff --git a/housewars/utils/load_pdf.py b/housewars/utils/load_pdf.py index 2cf2ec9..e544838 100644 --- a/housewars/utils/load_pdf.py +++ b/housewars/utils/load_pdf.py @@ -1,4 +1,4 @@ -from reportlab.platypus import Table, TableStyle, SimpleDocTemplate +from reportlab.platypus import Table, TableStyle, SimpleDocTemplate, Paragraph from reportlab.lib.pagesizes import letter from reportlab.lib.colors import black @@ -7,7 +7,7 @@ import io from housewars.utils import unpack_values -def load_pdf(data, headers): +def load_pdf(data, headers, title=""): """Loads data from queryset into a pdf file :param queryset: The queryset that will be unpacked @@ -20,6 +20,12 @@ def load_pdf(data, headers): doc = SimpleDocTemplate(buffer, pagesize=letter) elements = [] + # Create the page title + title = Paragraph(title) + + # Load title into PDF file + elements.append(title) + # Unpack queryset data data = unpack_values(data, headers) diff --git a/housewars/views.py b/housewars/views.py index 76d688b..f918aa0 100644 --- a/housewars/views.py +++ b/housewars/views.py @@ -57,7 +57,7 @@ class EntryCreateView(SessionWizardView): activity1_room = activity1.room_number if (activity1_room != None): - a1_string += f' in Room {activity1_room}' + a1_string += f' in {activity1_room}' if (hasattr(activity1, 'teacher')): activity1_teacher = activity1.teacher @@ -71,7 +71,7 @@ class EntryCreateView(SessionWizardView): activity2_room = activity2.room_number if (activity2_room != None): - a2_string += f' in Room {activity2_room}' + a2_string += f' in {activity2_room}' if (hasattr(activity2, 'teacher')): activity2_teacher = activity2.teacher.last_name a2_string += f' with {activity2_teacher}.'