import os from django.contrib import admin from django import forms from django.utils.translation import gettext_lazy as _ from django.utils.html import format_html from unfold.admin import ModelAdmin from unfold.decorators import display from unfold.contrib.filters.admin import ( ChoicesDropdownFilter, MultipleRelatedDropdownFilter, ) from unfold.widgets import UnfoldAdminRadioSelectWidget from utils.admin import project_admin_site from .professor_base import CourseRelatedAdmin from apps.course.models.lesson import Lesson, CourseLesson, LessonCompletion class LessonForm(forms.ModelForm): class Meta: model = Lesson fields = '__all__' class CourseLessonForm(forms.ModelForm): class Meta: model = CourseLesson fields = '__all__' class LessonAdmin(ModelAdmin): form = LessonForm list_display = ('title', 'display_duration', 'content_type') list_filter = ( ('content_type', ChoicesDropdownFilter), ) search_fields = ('title',) ordering = ('title',) list_filter_submit = True radio_fields = { "content_type": admin.HORIZONTAL, } conditional_fields = { 'content_file': "content_type == 'video_file'", 'video_link': "content_type == 'youtube_link'", } fieldsets = ( (None, { 'fields': (('title', 'duration'),) }), (_('Content'), { 'fields': ('content_type', 'content_file', 'video_link'), }), ) def get_form(self, request, obj=None, change=False, **kwargs): form = super().get_form(request, obj, change, **kwargs) form.base_fields["content_type"].widget = UnfoldAdminRadioSelectWidget( choices=Lesson.ContentTypeChoices.choices, radio_style=admin.HORIZONTAL, attrs={ "class": "radio-inline flex gap-4 p-2 rounded-lg bg-gray-50 shadow-sm", "option_class": "flex items-center p-2 rounded-md hover:bg-white hover:shadow-sm transition-all duration-200", "label_class": "ml-2 font-medium text-gray-700 cursor-pointer", "input_class": "form-radio h-5 w-5 text-blue-600 transition duration-150 ease-in-out cursor-pointer", }, ) return form @display(description=_("Duration")) def display_duration(self, obj): return format_html('{} {}', obj.duration, _("min")) class CourseLessonAdmin(CourseRelatedAdmin): form = CourseLessonForm list_display = ('title', 'course', 'display_duration', 'is_active', 'priority') list_filter = ( ('course', MultipleRelatedDropdownFilter), 'is_active', ) search_fields = ('title', 'course__title') ordering = ('course', 'priority') autocomplete_fields = ('course', 'lesson') list_filter_submit = True # 🔔 REMOVES FROM "ALL APPLICATIONS" MODAL def has_module_permission(self, request): return False fieldsets = ( (None, { 'fields': ('course', 'lesson', 'title', ('priority', 'is_active')) }), ) @display(description=_("Duration")) def display_duration(self, obj): return format_html('{} {}', obj.lesson.duration, _("min")) def get_queryset(self, request): qs = super().get_queryset(request) return qs.order_by('course', 'priority') class LessonCompletionAdmin(ModelAdmin): list_display = ('student', 'course_lesson', 'completed_at') search_fields = ('student__fullname', 'student__email', 'course_lesson__title', 'course_lesson__course__title') list_filter = ('course_lesson__course', 'completed_at') ordering = ('-completed_at',) def get_readonly_fields(self, request, obj=None): if obj: return ['student', 'course_lesson', 'completed_at'] return [] # Registrations from django.contrib import admin as django_admin django_admin.site.register(Lesson, LessonAdmin) project_admin_site.register(Lesson, LessonAdmin) project_admin_site.register(CourseLesson, CourseLessonAdmin) project_admin_site.register(LessonCompletion, LessonCompletionAdmin)