import nested_admin from django import forms 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.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 class TrainingForm(forms.ModelForm): model=Training class TrainingInLIne(nested_admin.NestedTabularInline): model = Training form = TrainingForm extra = 0 fk_name = 'weekpref' verbose_name_plural = "Training Missions" max_num = 7 formfield_overrides = { 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) def has_delete_permission(self, request: HttpRequest, obj: WeekPreference | None = None) -> bool: return self.has_change_permission(request=request, obj=obj) def has_add_permission(self, request: HttpRequest, obj: WeekPreference | None = None) -> bool: return self.has_change_permission(request=request, obj=obj)