from django.contrib import admin from django.utils.html import format_html from django.utils.translation import gettext_lazy as _ from unfold.admin import ModelAdmin, TabularInline from unfold.decorators import display from apps.support.models import SupportMessage, SupportRoom from utils.admin import dovoodi_admin_site, project_admin_site class SupportMessageInline(TabularInline): model = SupportMessage extra = 1 fields = ('sender_type', 'sender', 'content', 'is_read', 'created_at') readonly_fields = ('created_at',) class SupportRoomAdmin(ModelAdmin): list_display = ( 'id', 'display_user', 'display_status', 'unread_by_admin', 'unread_by_user', 'last_message_at', 'created_at', ) list_filter = ('status', 'created_at', 'last_message_at') search_fields = ('user__email', 'user__fullname', 'user__device_id') readonly_fields = ('created_at', 'updated_at', 'last_message_at') inlines = [SupportMessageInline] list_per_page = 25 @display(description=_('User / Guest')) def display_user(self, obj: SupportRoom): if obj.user.email: return f"{obj.user.fullname or ''} ({obj.user.email})".strip() return f"Guest ({str(obj.user.device_id or obj.user_id)[:12]})" @display(description=_('Status')) def display_status(self, obj: SupportRoom): colors = { 'open': '#3B82F6', 'pending': '#F59E0B', 'answered': '#10B981', 'closed': '#6B7280', } color = colors.get(obj.status, '#6B7280') return format_html( '{}', color, obj.get_status_display(), ) def save_formset(self, request, form, formset, change): instances = formset.save(commit=False) for instance in instances: if isinstance(instance, SupportMessage) and not instance.pk: if not instance.sender_id: instance.sender = request.user instance.sender_type = SupportMessage.SenderType.SUPPORT instance.save() formset.save_m2m() dovoodi_admin_site.register(SupportRoom, SupportRoomAdmin) project_admin_site.register(SupportRoom, SupportRoomAdmin)