from django.contrib import admin from django.utils.translation import gettext_lazy as _ from django.utils.html import format_html from unfold.admin import ModelAdmin, StackedInline from unfold.decorators import display from apps.transaction.models import TransactionParticipant, ParticipantInfo from utils.admin import project_admin_site class ParticipantInfoInline(StackedInline): model = ParticipantInfo extra = 1 fields = ['fullname', 'email', 'phone_number', 'gender', 'birthdate'] # readonly_fields = ['email', 'phone_number'] classes = ['collapse'] tab = True show_change_link = True @admin.register(TransactionParticipant) class TransactionParticipantAdmin(ModelAdmin): list_display = ('user', 'course', 'payment_status', 'price_display', 'created_at', 'updated_at') list_filter = ('is_paid', 'course', 'created_at') search_fields = ('user__email', 'course__title') readonly_fields = [ 'created_at', 'updated_at'] inlines = [ParticipantInfoInline] autocomplete_fields = ['user',] show_change_link = True ordering = ('-created_at',) fieldsets = ( (None, { 'fields': ('user', 'course', 'is_paid', 'price') }), (_('Timestamps'), { 'fields': ('created_at', 'updated_at'), 'classes': ('collapse',) }), ) @display(description=_("Payment Status"), ordering="is_paid") def payment_status(self, obj): if obj.is_paid: return format_html('Paid') return format_html('Unpaid') @display(description=_("Price"), ordering="price") def price_display(self, obj): return format_html('${}', obj.price) def get_queryset(self, request): queryset = super().get_queryset(request) # Add any custom queryset modifications here if needed return queryset project_admin_site.register(TransactionParticipant, TransactionParticipantAdmin)