Generalized aircraft assign function

This commit is contained in:
2025-12-01 15:18:30 +01:00
parent 2b1042d3a8
commit 99a8cfe482
5 changed files with 42 additions and 39 deletions

View File

@@ -0,0 +1,22 @@
from django.db.models.query import QuerySet, Q
from ..models.students import Student
from ..models.missions import MissionProfile
from ..models.aircrafts import Aircraft, AircraftTypes
from typing import List, Dict, Tuple
def assign_aircraft(queryset: QuerySet[Student] | QuerySet[MissionProfile], data: Dict[str, List[AircraftTypes]]) -> Tuple[int, List[str]]:
i: int = 0
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 ac_types:
ac_query |= Q(type=a)
aircrafts: QuerySet[Aircraft] = Aircraft.objects.filter(ac_query).all() # Execute query
for obj in queryset:
obj.aircrafts.clear()
for ac in aircrafts:
obj.aircrafts.add(ac)
obj.save()
i += 1
return i, [a for a in ac_types]

View File

@@ -9,12 +9,9 @@ from durationwidget.widgets import TimeDurationWidget
from ..models.hourbuildings import HourBuilding, HourBuildingLegBase, HourBuildingLegFlight, HourBuildingLegStop
from ..models.weekpref import WeekPreference
from ..models.students import Student
from ..custom.student_permissions import has_edit_permission
from datetime import date
class HourBuildingLegFlightForm(forms.ModelForm):
class Meta:
model = HourBuildingLegFlight

View File

@@ -1,7 +1,7 @@
from django.forms import ModelMultipleChoiceField
from django.forms import TypedMultipleChoiceField
from django.contrib import admin, messages
from django.http import HttpRequest
from django.db.models.query import QuerySet, Q
from django.db.models.query import QuerySet
from django.utils.safestring import SafeText
from django_admin_action_forms import AdminActionFormsMixin, AdminActionForm, action_with_form
@@ -11,11 +11,13 @@ from import_export.admin import ImportMixin
from import_export.tmp_storages import CacheStorage
from import_export.resources import ModelResource
from ..models.aircrafts import Aircraft
from ..models.aircrafts import AircraftTypes
from ..models.missions import MissionProfile
from ..actions.assign_aircraft import assign_aircraft
from datetime import timedelta
from typing import Any, Dict
from typing import Any, Dict, List
# Resource Class for Student data import
class MissionProfileResource(ModelResource):
@@ -40,7 +42,7 @@ class MissionProfileResource(ModelResource):
# Form class to assing aircrafts to students
class ChangeAircraftForm(AdminActionForm):
aircrafts = ModelMultipleChoiceField(queryset=Aircraft.objects.distinct('type').all())
aircrafts = TypedMultipleChoiceField(choices=AircraftTypes)
class MissionProfileAdmin(ImportMixin, AdminActionFormsMixin, admin.ModelAdmin):
list_display = ("mtype", "mnum", "assigned_aircrafts", "duration", "notes", )
@@ -53,20 +55,11 @@ class MissionProfileAdmin(ImportMixin, AdminActionFormsMixin, admin.ModelAdmin):
def get_queryset(self, request: HttpRequest) -> QuerySet[MissionProfile]:
return super().get_queryset(request).order_by("mtype", "mnum")
@action_with_form(ChangeAircraftForm, description="Assign Aircraft")
def assign_aircraft(self, request: HttpRequest, queryset: QuerySet[MissionProfile], 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 mix in queryset:
mix.aircrafts.clear()
for ac in aircrafts:
mix.aircrafts.add(ac)
mix.save()
i += 1
@action_with_form(ChangeAircraftForm, description="Assign Aircraft Type")
def assign_aircraft(self, request: HttpRequest, queryset: QuerySet[MissionProfile], data: Dict[str, List[AircraftTypes]]):
i: int
ac_types: List[str]
i, ac_types = assign_aircraft(queryset=queryset, data=data)
messages.success(request, f"{i} Missions updated to {ac_types}")
@admin.display(description="Assigned Aircrafts")

View File

@@ -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

View File

@@ -4,7 +4,6 @@ from django.db import models
from django.forms import TextInput, Textarea
from django.http import HttpRequest
from ..models.students import Student
from ..models.missions import Training
from ..models.weekpref import WeekPreference