from django.contrib import admin from django.contrib.auth.admin import UserAdmin from apps.staff.models import StaffProfile from apps.staff.forms import StaffProfileAdminForm from .models import MagicLinkAccessLog, OTPChallenge, TicketMagicLink, User class MagicLinkAccessLogInline(admin.TabularInline): model = MagicLinkAccessLog extra = 0 can_delete = False fields = ("opened_at", "ip_address", "user_agent") readonly_fields = fields def has_add_permission(self, request, obj=None): return False @admin.register(TicketMagicLink) class TicketMagicLinkAdmin(admin.ModelAdmin): list_display = ("ticket", "recipient_name", "recipient_mobile", "created_unit", "created_by", "created_at", "expires_at", "view_count", "revoked_at") list_filter = ("created_unit", "created_reason", "revoked_at", "expires_at") search_fields = ("ticket__ticket_number", "recipient_name", "recipient_mobile", "created_by__username") readonly_fields = ("ticket", "customer", "token_hash", "created_by", "created_unit", "recipient_name", "recipient_mobile", "created_at", "expires_at", "used_at", "revoked_at", "created_reason", "last_used_ip", "last_user_agent", "view_count") inlines = (MagicLinkAccessLogInline,) def get_queryset(self, request): queryset = super().get_queryset(request).select_related("ticket", "created_unit", "created_by") if request.user.is_superuser or request.user.has_perm("accounts.view_all_magic_links"): return queryset unit_ids = request.user.unit_memberships.filter(is_active=True).values_list("unit_id", flat=True) return queryset.filter(created_unit_id__in=unit_ids) def has_add_permission(self, request): return False @admin.register(MagicLinkAccessLog) class MagicLinkAccessLogAdmin(admin.ModelAdmin): list_display = ("magic_link", "opened_at", "ip_address", "user_agent") list_filter = ("opened_at",) search_fields = ("magic_link__ticket__ticket_number", "ip_address", "user_agent") readonly_fields = ("magic_link", "opened_at", "ip_address", "user_agent") def has_add_permission(self, request): return False def has_change_permission(self, request, obj=None): return False class StaffProfileInline(admin.StackedInline): model = StaffProfile form = StaffProfileAdminForm extra = 0 max_num = 1 fields = ("primary_unit", "role", "first_name", "last_name", "display_name", "job_title", "avatar", "mobile", "bale_chat_id", "bale_notifications_enabled", "is_customer_selectable", "sort_order", "is_active") @admin.register(User) class CustomUserAdmin(UserAdmin): fieldsets = UserAdmin.fieldsets + (("سامانه تیکت", {"fields": ("mobile", "account_type")}),) add_fieldsets = UserAdmin.add_fieldsets + (("سامانه تیکت", {"fields": ("mobile", "account_type")}),) list_display = ("username", "mobile", "account_type", "is_active", "is_staff") list_filter = UserAdmin.list_filter + ("account_type",) inlines = (StaffProfileInline,) def save_model(self, request, obj, form, change): if obj.account_type == User.AccountType.STAFF: obj.is_staff = True super().save_model(request, obj, form, change) admin.site.register(OTPChallenge)