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.
 
 
 
 

81 lines
2.9 KiB

from django.contrib import admin
from django.db.models import Q
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 apps.certificate.models import Certificate
from apps.course.models import Course
from apps.course.models.course import extract_text_from_json
from utils.admin import project_admin_site
from apps.course.admin.professor_base import CertificateBaseAdmin
def find_matching_course_ids(search_term: str):
normalized = (search_term or "").strip().lower()
if not normalized:
return []
matching_ids = list(
Course.objects.filter(
Q(title__icontains=search_term) | Q(slug__icontains=search_term)
).values_list("id", flat=True)
)
if matching_ids:
return matching_ids
for course in Course.objects.all().only("id", "title", "slug"):
title_text = extract_text_from_json(course.title).lower()
slug_text = extract_text_from_json(course.slug).lower()
if normalized in title_text or normalized in slug_text:
matching_ids.append(course.id)
return matching_ids
@admin.register(Certificate)
class CertificateAdmin(CertificateBaseAdmin):
list_display = ['student', 'course', 'certificate_status', 'created_at']
list_filter = ['status', 'created_at']
search_fields = ['id', 'student__username', 'student__email']
readonly_fields = ['created_at', 'updated_at']
autocomplete_fields = ['student',]
fieldsets = (
(None, {
'fields': ('student', 'course', 'status', 'certificate_file')
}),
(_('Timestamps'), {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
@display(description=_("Status"), ordering="status")
def certificate_status(self, obj):
status_classes = {
'pending': 'unfold-badge unfold-badge--warning',
'approved': 'unfold-badge unfold-badge--success',
'rejected': 'unfold-badge unfold-badge--danger',
'issued': 'unfold-badge unfold-badge--info',
}
status_class = status_classes.get(obj.status.lower(), 'unfold-badge')
return format_html('<span class="{}">{}</span>', status_class, obj.get_status_display())
def get_queryset(self, request):
queryset = super().get_queryset(request)
return queryset
def get_search_results(self, request, queryset, search_term):
queryset, use_distinct = super().get_search_results(request, queryset, search_term)
matching_course_ids = find_matching_course_ids(search_term)
if matching_course_ids:
queryset = queryset | self.model.objects.filter(course_id__in=matching_course_ids)
use_distinct = True
return queryset, use_distinct
project_admin_site.register(Certificate, CertificateAdmin)