import nested_admin from django import forms from django.db.models.query import QuerySet 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 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", "student",) 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): 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): 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): 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, obj=None, **kwargs): form: forms.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, obj: WeekPreference | None = None): 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, obj: WeekPreference | None = None): 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_delete_permission(self, request, obj: WeekPreference | None = None): if hasattr(request.user, 'student') and obj: current_week = date.today().isocalendar().week if current_week > obj.week: return False return True 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, obj, form, change): # 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)