Adde Aircraft class and associate students with aircrafts

This commit is contained in:
2025-11-28 10:16:01 +01:00
parent 33c610dcbc
commit de39913275
11 changed files with 190 additions and 67 deletions

View File

@@ -1,5 +1,5 @@
from django import forms
from django.db.models.query import QuerySet
from django.forms import ModelChoiceField, TypedMultipleChoiceField, ModelMultipleChoiceField
from django.db.models.query import QuerySet, Q
from django.http import HttpRequest
from django.contrib import admin, messages
from django.utils.safestring import SafeText
@@ -12,16 +12,17 @@ from import_export.forms import ConfirmImportForm, ImportForm
from django_admin_action_forms import AdminActionFormsMixin, AdminActionForm, action_with_form
from typing import Any, Dict
from ..models.aircrafts import Aircraft, AircraftTypes
from ..models.courses import Course
from ..models.students import Student
from ..custom.colortag import course_color
from typing import Any, Dict
# Custom import form to select a course for student input
class StudentCustomConfirmImportForm(ConfirmImportForm):
course = forms.ModelChoiceField(
course = ModelChoiceField(
queryset=Course.objects.all(),
required=False)
@@ -55,13 +56,18 @@ class StudentResource(ModelResource):
# Form Class for Student course change
class ChangeCourseForm(AdminActionForm):
course = forms.ModelChoiceField(queryset=Course.objects.all())
course = TypedMultipleChoiceField(choices=AircraftTypes)
# Form class to assing aircrafts to students
class ChangeAircraftForm(AdminActionForm):
aircrafts = ModelMultipleChoiceField(queryset=Aircraft.objects.distinct('type').all())
class StudentAdmin(ImportMixin, AdminActionFormsMixin, admin.ModelAdmin):
list_display = ("surname", "name", "course", "course_color", "email", "phone", "username", "password", "active",)
list_filter = ("course", "active",)
search_fields = ("surname", "name", "phone", "email",)
actions = ("change_course", "disable_students",)
model = Student
list_display = ("surname", "name", "course", "course_color", "email", "phone", "username", "password", "active", )
list_filter = ("course", "active", )
search_fields = ("surname", "name", "phone", "email", )
actions = ("change_course", "disable_students", "change_aircraft", )
resource_classes = [StudentResource]
confirm_form_class = StudentCustomConfirmImportForm
tmp_storage_class = CacheStorage
@@ -89,7 +95,6 @@ class StudentAdmin(ImportMixin, AdminActionFormsMixin, admin.ModelAdmin):
q.user.save()
count: int = queryset.update(active = False)
messages.success(request, f"{count} students deactivated")
pass
@action_with_form(ChangeCourseForm, description="Change Student Course")
def change_course(self, request: HttpRequest, queryset: QuerySet[Student], data):
@@ -97,16 +102,32 @@ class StudentAdmin(ImportMixin, AdminActionFormsMixin, admin.ModelAdmin):
count: int = queryset.update(course=course)
messages.success(request, f"{count} students updated to {course}")
@action_with_form(ChangeAircraftForm, description="Assign Aircraft")
def change_aircraft(self, request: HttpRequest, queryset: QuerySet[Student], data: Dict[str, QuerySet[Aircraft]]):
ac_types = [t.type for t in data["aircrafts"]]
ac_query: Q = Q() # Build an or query to select all aircrafts of the specified types
for a in ac_types:
ac_query |= Q(type=a)
aircrafts: QuerySet[Aircraft] = Aircraft.objects.filter(ac_query).all() # Execute query
i: int = 0
for student in queryset:
student.aircrafts.clear()
for ac in aircrafts:
student.aircrafts.add(ac)
student.save()
i += 1
messages.success(request, f"{i} Students updated to {ac_types}")
# Return the initial form for import confirmations, request course to user
def get_confirm_form_initial(self, request: HttpRequest, import_form):
initial = super().get_confirm_form_initial(request, import_form)
def get_confirm_form_initial(self, request: HttpRequest, import_form) -> Dict[str, Any]:
initial: Dict[str, Any] = super().get_confirm_form_initial(request, import_form)
if import_form and hasattr(import_form.cleaned_data, "course"):
course: Course = import_form.cleaned_data["course"]
initial["course"] = course.id
return initial
# Add course to import form kwargs to be used by resource to associate course with all imported students
def get_import_data_kwargs(self, request: HttpRequest, *args, **kwargs):
def get_import_data_kwargs(self, request: HttpRequest, *args, **kwargs) -> Dict[str, Any]:
form: ImportForm | None = kwargs.get("form", None)
if form and hasattr(form, "cleaned_data"):
kwargs["course"] = form.cleaned_data.get("course", None)