Files
customerTicket/apps/staff/admin.py
T
2026-10-13 16:09:45 +03:30

57 lines
3.3 KiB
Python

from django.contrib import admin
from django.utils.html import format_html
from django.urls import reverse
from .forms import StaffProfileAdminForm
from .models import OrganizationalUnit, StaffProfile, UnitMembership
class UnitMembershipInline(admin.TabularInline):
model = UnitMembership
extra = 0
filter_horizontal = ("permissions",)
@admin.register(OrganizationalUnit)
class OrganizationalUnitAdmin(admin.ModelAdmin):
list_display = ("name", "slug", "bale_chat_id", "sort_order", "show_in_customer_form", "accepts_external_tickets", "is_active", "updated_at")
list_filter = ("supervisor_sms_ticket_link_enabled", "show_in_customer_form", "accepts_external_tickets", "is_active")
search_fields = ("name", "slug", "bale_chat_id", "supervisor_mobile_1", "supervisor_mobile_2", "supervisor_mobile_3", "supervisor_mobile_4", "supervisor_mobile_5")
list_editable = ("sort_order", "show_in_customer_form", "accepts_external_tickets", "is_active")
filter_horizontal = ("permissions",)
inlines = (UnitMembershipInline,)
fieldsets = (
("مشخصات واحد", {"fields": ("name", "slug", "description", "search_keywords", "sort_order")}),
("اطلاع‌رسانی بله و سرپرستان", {"fields": ("bale_chat_id", "supervisor_mobile_1", "supervisor_mobile_2", "supervisor_mobile_3", "supervisor_mobile_4", "supervisor_mobile_5", "supervisor_sms_ticket_link_enabled")}),
("نمایش و دسترسی", {"fields": ("permissions", "show_in_customer_form", "accepts_external_tickets", "is_active")}),
)
@admin.register(UnitMembership)
class UnitMembershipAdmin(admin.ModelAdmin):
list_display = ("user", "unit", "ticket_scope", "is_primary", "is_active")
list_filter = ("unit", "ticket_scope", "is_primary", "is_active")
search_fields = ("user__username", "user__mobile", "unit__name")
filter_horizontal = ("permissions",)
@admin.register(StaffProfile)
class StaffProfileAdmin(admin.ModelAdmin):
form = StaffProfileAdminForm
list_display = ("display_name", "primary_unit", "role", "sort_order", "job_title", "mobile", "is_active", "is_customer_selectable")
list_editable = ("sort_order",)
list_filter = ("primary_unit", "role", "is_active", "is_customer_selectable", "bale_notifications_enabled")
search_fields = ("first_name", "last_name", "display_name", "mobile", "user__username")
fieldsets = (
("حساب کاربری", {"fields": ("user",)}),
("مشخصات کارشناس", {"fields": ("primary_unit", "role", "first_name", "last_name", "display_name", "job_title", "avatar_preview", "avatar", "mobile")}),
("اطلاع‌رسانی", {"fields": ("bale_chat_id", "bale_notifications_enabled")}),
("نمایش و دسترسی", {"fields": ("is_customer_selectable", "sort_order", "is_active")}),
)
readonly_fields = ("avatar_preview",)
@admin.display(description="تصویر فعلی")
def avatar_preview(self, obj):
if not obj or not obj.pk or not obj.avatar:
return "تصویری ثبت نشده است."
url = reverse("staff_tickets:expert_avatar", args=[obj.user.public_id])
return format_html('<img src="{}?v={}" alt="تصویر کارشناس" style="width:96px;height:96px;border-radius:16px;object-fit:cover;border:1px solid #ccd8e5">', url, obj.updated_at.timestamp())