52 lines
2.6 KiB
Python
52 lines
2.6 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", "sort_order", "show_in_customer_form", "accepts_external_tickets", "is_active", "updated_at")
|
|
list_filter = ("show_in_customer_form", "accepts_external_tickets", "is_active")
|
|
search_fields = ("name", "slug")
|
|
list_editable = ("sort_order", "show_in_customer_form", "accepts_external_tickets", "is_active")
|
|
filter_horizontal = ("permissions",)
|
|
inlines = (UnitMembershipInline,)
|
|
|
|
|
|
@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())
|