import nested_admin from django.forms import Form from django.db.models.query import QuerySet from django.contrib.auth.models import User from django.http import HttpRequest, HttpResponse from django.contrib import admin, messages from django.utils.translation import ngettext from django.utils.safestring import SafeText from ..models.missions import Training from ..models.weekpref import WeekPreference from .training_adm import TrainingInLIne from .hourbuilding_adm import HourBuildingInLine from ..custom.colortag import course_color from ..actions.exportweek import export_selected from datetime import date from typing import Dict, List, Any class WeekPreferenceAdmin(nested_admin.NestedPolymorphicModelAdmin): inlines = (TrainingInLIne, HourBuildingInLine, ) list_display = ("week", "student__surname","student__name", "student__course", "course_color", "student_brief_mix",) list_filter = ("week", "student__course",) search_fields = ("student__surname","student__name",) actions = ("export",) @admin.action(description="Export Selected Preferences") def export(self, request: HttpRequest, queryset: QuerySet[WeekPreference]) -> HttpResponse | None: if queryset.count() == 0: return None self.message_user(request, ngettext("Exporting %d row", "Exporting %d rows", queryset.count()) % queryset.count(), messages.SUCCESS) return export_selected(request=request, queryset=queryset) @admin.display(description="Mission Count") def student_brief_mix(self, obj: WeekPreference) -> SafeText: if not obj.student.course: return SafeText("") return SafeText(f"{Training.objects.filter(weekpref = obj.id).count()}") @admin.display(description="Color") def course_color(self, obj: WeekPreference) -> SafeText: if not obj.student.course: return SafeText("") return course_color(obj.student.course.color) # If a user is registered as student hide filters def get_list_filter(self, request: HttpRequest) -> List[str]: list_filter = super().get_list_filter(request) if hasattr(request.user, "student"): return [] return list_filter # If a user is registered as student do not show actions def get_actions(self, request: HttpRequest) -> Dict[str, Any]: actions = super().get_actions(request) if hasattr(request.user, "student"): return {} return actions # If a user is registered as student show only their preferences def get_queryset(self, request: HttpRequest) -> QuerySet[WeekPreference]: qs = super().get_queryset(request) if hasattr(request.user, "student"): return qs.filter(student=request.user.student) # If admin show everything return qs def get_form(self, request: HttpRequest, obj: WeekPreference | None = None, **kwargs: Dict[str, Any]) -> Form: form: Form = super().get_form(request, obj, **kwargs) current_week = date.today().isocalendar().week # If form contains the week field if "week" in form.base_fields: # Set default value as current week form.base_fields["week"].initial = current_week # If student is current user making request if hasattr(request.user, "student"): student = request.user.student if "student" in form.base_fields: form.base_fields["student"].initial = student form.base_fields["student"].disabled = True form.base_fields["week"].disabled = True # student cannot change week return form # 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: if hasattr(request.user, "student") and obj: current_week = date.today().isocalendar().week if current_week > obj.week: return False return True # 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 self.has_change_permission(request, 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: return self.has_change_permission(request, obj) def changeform_view(self, request: HttpRequest, object_id: int | None = None, form_url: str = "", extra_context=None): extra_context = extra_context or {} if hasattr(request.user, "student") and object_id: current_week = date.today().isocalendar().week weekpref = WeekPreference.objects.get(id=object_id) if current_week > weekpref.week: extra_context["show_save"] = False extra_context["show_save_and_continue"] = False extra_context["show_save_and_add_another"] = False 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): # Imposta automaticamente lo studente se non è già valorizzato if hasattr(request.user, "student") and not obj.student_id: obj.student = request.user.student super().save_model(request, obj, form, change)