from django.contrib import admin from django.utils.translation import gettext_lazy as _ from unfold.admin import ModelAdmin, TabularInline, StackedInline from unfold.decorators import display, action from apps.profiles.models.institution import ( Institution, InstitutionMember, InstitutionTimeline, InstitutionMedia, InstitutionFollower, ) from utils.admin import project_admin_site class InstitutionMemberInline(TabularInline): model = InstitutionMember extra = 0 fields = ('user', 'role', 'title', 'joined_at') readonly_fields = ('joined_at',) class InstitutionTimelineInline(StackedInline): model = InstitutionTimeline extra = 0 fields = ('year', 'title', 'description', 'order') class InstitutionMediaInline(TabularInline): model = InstitutionMedia extra = 0 fields = ('file', 'media_type', 'title', 'uploaded_at') readonly_fields = ('uploaded_at',) @admin.register(Institution, site=project_admin_site) class InstitutionAdmin(ModelAdmin): list_display = ( 'name', 'type_badge', 'city', 'country', 'verification_badge', 'follower_count', 'is_featured', 'is_active', 'created_at', ) list_filter = ('type', 'verification_status', 'is_featured', 'is_active', 'country') search_fields = ('name', 'city', 'country', 'description', 'email', 'phone') prepopulated_fields = {'slug': ('name',)} readonly_fields = ('follower_count', 'created_at', 'updated_at') inlines = [InstitutionMemberInline, InstitutionTimelineInline, InstitutionMediaInline] actions = ['approve_institutions', 'reject_institutions', 'toggle_featured'] fieldsets = ( (_('Identity & Classification'), { 'fields': ('name', 'slug', 'type', 'is_featured', 'is_active', 'created_by') }), (_('Location & Geo-Coordinates'), { 'fields': ('country', 'city', 'address', 'latitude', 'longitude') }), (_('Contact & Official Channels'), { 'fields': ('email', 'phone', 'website', 'established_year') }), (_('Media & Branding'), { 'fields': ('avatar', 'cover_image') }), (_('Structured JSON Metadata'), { 'fields': ('description', 'social_media', 'working_hours', 'tags') }), (_('Verification & Statistics'), { 'fields': ('verification_status', 'follower_count', 'created_at', 'updated_at') }), ) @display(description=_('Type')) def type_badge(self, obj): return obj.get_type_display() @display(description=_('Verification'), label={ Institution.VerificationStatus.APPROVED: "success", Institution.VerificationStatus.PENDING: "warning", Institution.VerificationStatus.REJECTED: "danger", }) def verification_badge(self, obj): return obj.get_verification_status_display() @action(description=_('Approve and verify selected institutions')) def approve_institutions(self, request, queryset): count = queryset.update(verification_status=Institution.VerificationStatus.APPROVED) self.message_user(request, _(f"{count} institution(s) approved and verified.")) @action(description=_('Reject selected institutions')) def reject_institutions(self, request, queryset): count = queryset.update(verification_status=Institution.VerificationStatus.REJECTED) self.message_user(request, _(f"{count} institution(s) marked as rejected.")) @action(description=_('Toggle featured status for selected institutions')) def toggle_featured(self, request, queryset): for item in queryset: item.is_featured = not item.is_featured item.save(update_fields=['is_featured']) self.message_user(request, _("Featured status updated for selected institutions.")) @admin.register(InstitutionMember, site=project_admin_site) class InstitutionMemberAdmin(ModelAdmin): list_display = ('user', 'institution', 'role_badge', 'title', 'joined_at') list_filter = ('role', 'joined_at') search_fields = ('user__email', 'user__fullname', 'institution__name', 'title') readonly_fields = ('joined_at',) @display(description=_('Role'), label={ InstitutionMember.MemberRole.ADMIN: "danger", InstitutionMember.MemberRole.EDITOR: "warning", InstitutionMember.MemberRole.VIEWER: "info", }) def role_badge(self, obj): return obj.get_role_display() @admin.register(InstitutionTimeline, site=project_admin_site) class InstitutionTimelineAdmin(ModelAdmin): list_display = ('institution', 'year', 'title', 'order', 'created_at') search_fields = ('institution__name', 'title', 'description', 'year') list_filter = ('created_at',) @admin.register(InstitutionMedia, site=project_admin_site) class InstitutionMediaAdmin(ModelAdmin): list_display = ('institution', 'title', 'media_type', 'uploaded_at') list_filter = ('media_type', 'uploaded_at') search_fields = ('institution__name', 'title', 'caption') @admin.register(InstitutionFollower, site=project_admin_site) class InstitutionFollowerAdmin(ModelAdmin): list_display = ('user', 'institution', 'created_at') search_fields = ('user__email', 'user__fullname', 'institution__name') readonly_fields = ('created_at',)