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('{}', 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)