From cdf7e7c67709ad49ad3e212f817404b50402acdc Mon Sep 17 00:00:00 2001 From: Emanuele Date: Thu, 4 Dec 2025 14:51:52 +0100 Subject: [PATCH] Show only mission correct for student phase, add only one preference per week --- cntmanage/flightslot/admin.py | 6 ++-- cntmanage/flightslot/admins/training_adm.py | 34 +++++++++++++++---- cntmanage/flightslot/admins/weekpref_adm.py | 6 ++-- .../flightslot/custom/student_permissions.py | 12 ++++--- 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/cntmanage/flightslot/admin.py b/cntmanage/flightslot/admin.py index 6987d40..33a758d 100644 --- a/cntmanage/flightslot/admin.py +++ b/cntmanage/flightslot/admin.py @@ -59,8 +59,8 @@ class FlightSlotStaffSite(AdminSite): # Register only user visible models flightslot_staff = FlightSlotUserSite(name="staff_site") -flightslot_staff.register(Availability, AvailabilityAdmin) flightslot_staff.register(MissionProfile, MissionProfileAdmin) +flightslot_staff.register(Availability, AvailabilityAdmin) flightslot_staff.register(Instructor, InstructorAdmin) # Get version for debug purposes @@ -75,5 +75,5 @@ admin.site.register(Course, CourseAdmin) admin.site.register(MissionProfile, MissionProfileAdmin) admin.site.register(Student, StudentAdmin) admin.site.register(WeekPreference, WeekPreferenceAdmin) -admin.site.register(Instructor, InstructorAdmin) -admin.site.register(Availability, AvailabilityAdmin) +#admin.site.register(Instructor, InstructorAdmin) +#admin.site.register(Availability, AvailabilityAdmin) diff --git a/cntmanage/flightslot/admins/training_adm.py b/cntmanage/flightslot/admins/training_adm.py index 72b5b4a..11aef85 100644 --- a/cntmanage/flightslot/admins/training_adm.py +++ b/cntmanage/flightslot/admins/training_adm.py @@ -1,16 +1,18 @@ import nested_admin from django import forms -from django.db import models +from django.db.models import CharField, TextField +from django.db.models.query_utils import Q +from django.db.models.fields.related import ForeignKey from django.forms import TextInput, Textarea from django.http import HttpRequest -from ..models.missions import Training +from ..models.courses import Course, CourseTypes +from ..models.students import Student +from ..models.missions import Training, MissionTypes, MissionProfile from ..models.weekpref import WeekPreference from ..custom.student_permissions import has_edit_permission -from datetime import date - class TrainingForm(forms.ModelForm): model=Training @@ -23,10 +25,30 @@ class TrainingInLIne(nested_admin.NestedTabularInline): max_num = 7 formfield_overrides = { - models.CharField: {'widget': TextInput(attrs={'size':'20'})}, - models.TextField: {'widget': Textarea(attrs={'rows':4, 'cols':35})}, + CharField: {'widget': TextInput(attrs={'size':'20'})}, + TextField: {'widget': Textarea(attrs={'rows':4, 'cols':35})}, } + def formfield_for_foreignkey(self, db_field: ForeignKey, request: HttpRequest, **kwargs): + # modify entries for "mission" field, show only types compatible with student course + if not hasattr(request.user, "student") or not hasattr(request.user.student, "course"): + return super().formfield_for_foreignkey(db_field, request, **kwargs) + course: Course = request.user.student.course + if db_field.name == "mission": + match course.ctype: + case CourseTypes.PPL: + kwargs["queryset"] = MissionProfile.objects.filter(mtype=MissionTypes.PPL) + case CourseTypes.ATPL: + q: Q = Q(mtype=MissionTypes.IR) | \ + Q(mtype=MissionTypes.MEP) | \ + Q(mtype=MissionTypes.MEP_IR) | \ + Q(mtype=MissionTypes.CPL) | \ + Q(mtype=MissionTypes.CHK) + kwargs["queryset"] = MissionProfile.objects.filter(q).order_by("id") + case _: + pass + return super().formfield_for_foreignkey(db_field, request, **kwargs) + # If user is a student deny edit permission for week past the current one def has_change_permission(self, request: HttpRequest, obj: WeekPreference | None = None) -> bool: return has_edit_permission(request=request, obj=obj) diff --git a/cntmanage/flightslot/admins/weekpref_adm.py b/cntmanage/flightslot/admins/weekpref_adm.py index bdd70f5..3a1849c 100644 --- a/cntmanage/flightslot/admins/weekpref_adm.py +++ b/cntmanage/flightslot/admins/weekpref_adm.py @@ -15,7 +15,7 @@ from .training_adm import TrainingInLIne from .hourbuilding_adm import HourBuildingInLine from ..custom.colortag import course_color -from ..custom.student_permissions import has_edit_permission +from ..custom.student_permissions import has_edit_permission, has_week_add_permission from ..actions.exportweek import export_selected from datetime import date @@ -93,7 +93,7 @@ class WeekPreferenceAdmin(nested_admin.NestedPolymorphicModelAdmin): # If user is a student deny edit permission for week past the current one def has_add_permission(self, request: HttpRequest, obj: WeekPreference | None = None) -> bool: - return not obj and self.has_change_permission(request, obj) + return has_week_add_permission(request=request) and has_edit_permission(request=request, obj=obj) # If user is a student deny edit permission for week past the current one def has_delete_permission(self, request: HttpRequest, obj: WeekPreference | None = None)-> bool: @@ -110,7 +110,7 @@ class WeekPreferenceAdmin(nested_admin.NestedPolymorphicModelAdmin): extra_context["show_delete"] = False return super().changeform_view(request, object_id, form_url, extra_context) - def save_model(self, request: HttpRequest, obj, form: Form, change: bool): + def save_model(self, request: HttpRequest, obj: WeekPreference, form: Form, change: bool): # Imposta automaticamente lo studente se non è già valorizzato if hasattr(request.user, "student") and not obj.student_id: obj.student = request.user.student diff --git a/cntmanage/flightslot/custom/student_permissions.py b/cntmanage/flightslot/custom/student_permissions.py index 12b1b72..6d6a3a2 100644 --- a/cntmanage/flightslot/custom/student_permissions.py +++ b/cntmanage/flightslot/custom/student_permissions.py @@ -5,13 +5,17 @@ from ..models.weekpref import WeekPreference from datetime import date +def has_week_add_permission(request: HttpRequest): + if hasattr(request.user, 'student'): + student: Student = request.user.student + current_week: int = date.today().isocalendar().week + return student.active and not WeekPreference.objects.filter(student_id=student.id, week=current_week).count() + return True + # allow add, modify, delete depending on a set of requirements def has_edit_permission(request: HttpRequest, obj: WeekPreference | None = None) -> bool: if hasattr(request.user, 'student'): - student: Student = request.user.student - if not student.active: - return False current_week: int = date.today().isocalendar().week - if obj and (current_week > obj.week or not student.active): + if obj and current_week > obj.week: return False return True