from django import forms from django.db.models.query import QuerySet from django.http import HttpRequest, HttpResponse from django.contrib import admin from django.contrib import messages from django.utils.translation import ngettext from django.utils.safestring import SafeText from durationwidget.widgets import TimeDurationWidget from datetime import date import nested_admin from .models.courses import Course from .models.hourbuildings import HourBuilding, HourBuildingLeg from .models.missions import Training, MissionProfile from .models.students import Student from .models.weekpref import WeekPreference from .custom.colortag import course_color from .custom.defpassword import default_password from .actions.exportweek import export_selected class TrainingForm(forms.ModelForm): model=Training class HourBuildingLegForm(forms.ModelForm): class Meta: model = HourBuildingLeg fields = '__all__' widgets = { 'time': TimeDurationWidget(show_days=False, show_seconds=False ) } # Register your models here. class HourBuildingLegInline(nested_admin.NestedTabularInline): model = HourBuildingLeg form = HourBuildingLegForm extra = 0 fk_name = 'hb' max_num = 5 class HourBuildingInLine(nested_admin.NestedTabularInline): model = HourBuilding extra = 0 inlines = [HourBuildingLegInline] fk_name = 'weekpref' verbose_name_plural = "Hour Building" max_num = 7 class TrainingInLIne(nested_admin.NestedTabularInline): model = Training form = TrainingForm extra = 0 fk_name = 'weekpref' verbose_name_plural = "Training Missions" max_num = 7 class WeekPreferenceAdmin(nested_admin.NestedModelAdmin): inlines = (TrainingInLIne, HourBuildingInLine,) list_display = ("week", "student__name", "student__surname", "student__course", "course_color", "student_brief_mix",) list_filter = ("week", "student__course", "student",) actions = ("export",) @admin.action(description="Export Selected Preferences") def export(weekpreferenceadmin, request: HttpRequest, queryset: QuerySet[WeekPreference]) -> HttpResponse | None: if queryset.count() == 0: return None weekpreferenceadmin.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) def has_module_permission(self, request): if hasattr(request.user, 'student'): return False return True def get_queryset(self, request): qs = super().get_queryset(request) # If a user is registered as student show only their preferences 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) # 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 # If form contains the week field if 'week' in form.base_fields: # Set default value as current week current_week = date.today().isocalendar().week form.base_fields['week'].initial = current_week return form 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) class StudentAdmin(admin.ModelAdmin): list_display = ("surname", "name", "course", "course_color", "email", "phone", "password", "active") list_filter = ("course", "active") actions = ("disable_students",) @admin.display(description="Color") def course_color(self, obj: Student) -> SafeText: if not obj.course: return SafeText("") return course_color(obj.course.color) @admin.display(description="Password") def password(self, obj: Student) -> SafeText: return SafeText(default_password(student=obj)) @admin.action(description="Disable Students") def disable_students(modeladmin, request: HttpRequest, queryset: QuerySet[Student]): queryset.update(active = False) pass class CourseAdmin(admin.ModelAdmin): list_display = ("ctype", "cnumber","color_display", "year") list_filter = ("ctype", "year") # Dinamically add color_display property to show a colored dot @admin.display(description="Color") def color_display(self, obj: Course) -> SafeText: if not obj.pk: return SafeText("") return course_color(obj.color) class MissionProfileAdmin(admin.ModelAdmin): list_display = ("mtype", "mnum",) list_filter = ("mtype",) admin.site.register(Course, CourseAdmin) admin.site.register(MissionProfile, MissionProfileAdmin) admin.site.register(Student, StudentAdmin) admin.site.register(WeekPreference, WeekPreferenceAdmin)