diff --git a/cntmanage/flightslot/actions/assign_aircraft.py b/cntmanage/flightslot/actions/assign_aircraft.py new file mode 100644 index 0000000..1e3a624 --- /dev/null +++ b/cntmanage/flightslot/actions/assign_aircraft.py @@ -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] diff --git a/cntmanage/flightslot/admins/hourbuilding_adm.py b/cntmanage/flightslot/admins/hourbuilding_adm.py index 921fbfd..6a35c20 100644 --- a/cntmanage/flightslot/admins/hourbuilding_adm.py +++ b/cntmanage/flightslot/admins/hourbuilding_adm.py @@ -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 diff --git a/cntmanage/flightslot/admins/mission_adm.py b/cntmanage/flightslot/admins/mission_adm.py index 3ca336a..a601b29 100644 --- a/cntmanage/flightslot/admins/mission_adm.py +++ b/cntmanage/flightslot/admins/mission_adm.py @@ -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") diff --git a/cntmanage/flightslot/admins/student_adm.py b/cntmanage/flightslot/admins/student_adm.py index 7ce11b1..efb7c12 100644 --- a/cntmanage/flightslot/admins/student_adm.py +++ b/cntmanage/flightslot/admins/student_adm.py @@ -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 diff --git a/cntmanage/flightslot/admins/training_adm.py b/cntmanage/flightslot/admins/training_adm.py index 1170f07..72b5b4a 100644 --- a/cntmanage/flightslot/admins/training_adm.py +++ b/cntmanage/flightslot/admins/training_adm.py @@ -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