You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

144 lines
4.5 KiB

import os
from django.contrib import admin
from django import forms
from django.utils.translation import gettext_lazy as _
from django.db import models
from django.utils.html import format_html
from unfold.admin import ModelAdmin
from unfold.decorators import display
from unfold.contrib.forms.widgets import WysiwygWidget
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
from unfold.admin import ModelAdmin, StackedInline, TabularInline
class LessonForm(forms.ModelForm):
class Meta:
model = Lesson
fields = '__all__'
widgets = {
'content_type': UnfoldAdminRadioSelectWidget(),
}
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'),
'classes': [],
}),
)
def get_form(self, request, obj=None, change=False, **kwargs):
form = super().get_form(request, obj, change, **kwargs)
# Enhanced styling for content_type radio buttons
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(
'<span class="badge badge-info">{} min</span>',
obj.duration
)
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
fieldsets = (
(None, {
'fields': ('course', 'lesson', 'title', 'priority', 'is_active')
}),
)
@display(description=_("Duration"))
def display_duration(self, obj):
return format_html(
'<span class="badge badge-info">{} min</span>',
obj.lesson.duration
)
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):
"""
Make fields readonly if the object already exists.
"""
if obj:
return ['student', 'course_lesson', 'completed_at']
return []
# Register with both admin sites for autocomplete support
from django.contrib import admin as django_admin
django_admin.site.register(Lesson, LessonAdmin)
# Register with the project admin site
project_admin_site.register(Lesson, LessonAdmin)
project_admin_site.register(CourseLesson, CourseLessonAdmin)
project_admin_site.register(LessonCompletion, LessonCompletionAdmin)