Generalized aircraft assign function
This commit is contained in:
22
cntmanage/flightslot/actions/assign_aircraft.py
Normal file
22
cntmanage/flightslot/actions/assign_aircraft.py
Normal 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]
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user