Generalized aircraft assign function
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
from django.forms import ModelChoiceField, TypedMultipleChoiceField, ModelMultipleChoiceField
|
||||
from django.db.models.query import QuerySet, Q
|
||||
from django.forms import ModelChoiceField, TypedMultipleChoiceField
|
||||
from django.db.models.query import QuerySet
|
||||
from django.http import HttpRequest
|
||||
from django.contrib import admin, messages
|
||||
from django.utils.safestring import SafeText
|
||||
@@ -12,10 +12,12 @@ from import_export.forms import ConfirmImportForm, ImportForm
|
||||
|
||||
from django_admin_action_forms import AdminActionFormsMixin, AdminActionForm, action_with_form
|
||||
|
||||
from ..models.aircrafts import Aircraft, AircraftTypes
|
||||
from ..models.aircrafts import AircraftTypes
|
||||
from ..models.courses import Course
|
||||
from ..models.students import Student
|
||||
|
||||
from ..actions.assign_aircraft import assign_aircraft
|
||||
|
||||
from ..custom.colortag import course_color
|
||||
|
||||
from typing import Any, Dict, List
|
||||
@@ -60,7 +62,6 @@ class ChangeCourseForm(AdminActionForm):
|
||||
|
||||
# Form class to assing aircrafts to students
|
||||
class ChangeAircraftForm(AdminActionForm):
|
||||
#aircrafts = ModelMultipleChoiceField(queryset=Aircraft.objects.distinct("type").order_by("type"))
|
||||
aircrafts = TypedMultipleChoiceField(choices=AircraftTypes)
|
||||
|
||||
class StudentAdmin(ImportMixin, AdminActionFormsMixin, admin.ModelAdmin):
|
||||
@@ -105,18 +106,9 @@ class StudentAdmin(ImportMixin, AdminActionFormsMixin, admin.ModelAdmin):
|
||||
|
||||
@action_with_form(ChangeAircraftForm, description="Assign Aircraft Type")
|
||||
def change_aircraft(self, request: HttpRequest, queryset: QuerySet[Student], data: Dict[str, List[AircraftTypes]]):
|
||||
ac_types: List[AircraftTypes] = data["aircrafts"]
|
||||
ac_query: Q = Q() # Build an or query to select all aircrafts of the specified types
|
||||
for a in data["aircrafts"]:
|
||||
ac_query |= Q(type=a)
|
||||
aircrafts: QuerySet[Aircraft] = Aircraft.objects.filter(ac_query).order_by("type", "markings").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
|
||||
i: int
|
||||
ac_types: List[str]
|
||||
i, ac_types = assign_aircraft(queryset=queryset, data=data)
|
||||
messages.success(request, f"{i} Students updated to {ac_types}")
|
||||
|
||||
# Return the initial form for import confirmations, request course to user
|
||||
|
||||
Reference in New Issue
Block a user