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.hourbuildings import HourBuilding, HourBuildingLegBase, HourBuildingLegFlight, HourBuildingLegStop
from ..models.weekpref import WeekPreference from ..models.weekpref import WeekPreference
from ..models.students import Student
from ..custom.student_permissions import has_edit_permission from ..custom.student_permissions import has_edit_permission
from datetime import date
class HourBuildingLegFlightForm(forms.ModelForm): class HourBuildingLegFlightForm(forms.ModelForm):
class Meta: class Meta:
model = HourBuildingLegFlight 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.contrib import admin, messages
from django.http import HttpRequest 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.utils.safestring import SafeText
from django_admin_action_forms import AdminActionFormsMixin, AdminActionForm, action_with_form 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.tmp_storages import CacheStorage
from import_export.resources import ModelResource from import_export.resources import ModelResource
from ..models.aircrafts import Aircraft from ..models.aircrafts import AircraftTypes
from ..models.missions import MissionProfile from ..models.missions import MissionProfile
from ..actions.assign_aircraft import assign_aircraft
from datetime import timedelta from datetime import timedelta
from typing import Any, Dict from typing import Any, Dict, List
# Resource Class for Student data import # Resource Class for Student data import
class MissionProfileResource(ModelResource): class MissionProfileResource(ModelResource):
@@ -40,7 +42,7 @@ class MissionProfileResource(ModelResource):
# Form class to assing aircrafts to students # Form class to assing aircrafts to students
class ChangeAircraftForm(AdminActionForm): class ChangeAircraftForm(AdminActionForm):
aircrafts = ModelMultipleChoiceField(queryset=Aircraft.objects.distinct('type').all()) aircrafts = TypedMultipleChoiceField(choices=AircraftTypes)
class MissionProfileAdmin(ImportMixin, AdminActionFormsMixin, admin.ModelAdmin): class MissionProfileAdmin(ImportMixin, AdminActionFormsMixin, admin.ModelAdmin):
list_display = ("mtype", "mnum", "assigned_aircrafts", "duration", "notes", ) 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]: def get_queryset(self, request: HttpRequest) -> QuerySet[MissionProfile]:
return super().get_queryset(request).order_by("mtype", "mnum") return super().get_queryset(request).order_by("mtype", "mnum")
@action_with_form(ChangeAircraftForm, description="Assign Aircraft") @action_with_form(ChangeAircraftForm, description="Assign Aircraft Type")
def assign_aircraft(self, request: HttpRequest, queryset: QuerySet[MissionProfile], data: Dict[str, QuerySet[Aircraft]]): def assign_aircraft(self, request: HttpRequest, queryset: QuerySet[MissionProfile], data: Dict[str, List[AircraftTypes]]):
ac_types = [t.type for t in data["aircrafts"]] i: int
ac_query: Q = Q() # Build an or query to select all aircrafts of the specified types ac_types: List[str]
for a in ac_types: i, ac_types = assign_aircraft(queryset=queryset, data=data)
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
messages.success(request, f"{i} Missions updated to {ac_types}") messages.success(request, f"{i} Missions updated to {ac_types}")
@admin.display(description="Assigned Aircrafts") @admin.display(description="Assigned Aircrafts")

View File

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