from django.contrib import admin from .models import CallRecord, ExchangeRate, PointsLedger, PricingRule, RechargeOrder class ReadOnlyLedgerAdmin(admin.ModelAdmin): def get_readonly_fields(self, request, obj=None): return tuple(field.name for field in self.model._meta.fields) def has_add_permission(self, request): return False def has_change_permission(self, request, obj=None): return False def has_delete_permission(self, request, obj=None): return False @admin.register(PointsLedger) class PointsLedgerAdmin(ReadOnlyLedgerAdmin): list_display = ( "created_at", "user", "change_type", "points_delta", "balance_after", "ref_order_id", "ref_call", ) list_filter = ("change_type", "created_at") search_fields = ("user__username", "user__email", "=ref_order_id", "reason") ordering = ("-created_at", "-id") date_hierarchy = "created_at" list_select_related = ("user", "ref_call") @admin.register(PricingRule) class PricingRuleAdmin(admin.ModelAdmin): list_display = ( "operation_type", "alias", "resolution_display", "points_cost", "is_active", "updated_at", ) list_filter = ("operation_type", "is_active") search_fields = ("alias", "resolution") ordering = ("operation_type", "alias", "resolution") readonly_fields = ("created_at", "updated_at") list_editable = ("points_cost", "is_active") @admin.display(description="resolution") def resolution_display(self, obj): return obj.resolution or "*" @admin.register(ExchangeRate) class ExchangeRateAdmin(admin.ModelAdmin): list_display = ( "currency", "points_per_unit", "is_active", "effective_from", "updated_at", ) list_filter = ("currency", "is_active") search_fields = ("currency", "note") ordering = ("-effective_from", "-id") readonly_fields = ("created_at", "updated_at") list_editable = ("is_active",) date_hierarchy = "effective_from" @admin.register(RechargeOrder) class RechargeOrderAdmin(ReadOnlyLedgerAdmin): list_display = ( "created_at", "order_no", "user", "pay_method", "status", "amount_money", "currency", "points_granted", "payment_txn_no", "paid_at", ) list_filter = ("pay_method", "status", "currency", "created_at") search_fields = ( "order_no", "user__username", "user__email", "payment_txn_no", ) ordering = ("-created_at", "-id") date_hierarchy = "created_at" list_select_related = ("user",) @admin.register(CallRecord) class CallRecordAdmin(ReadOnlyLedgerAdmin): list_display = ( "created_at", "user", "api_key", "operation_type", "alias", "model_used", "points_cost", "status", "upstream_latency_ms", ) list_filter = ("operation_type", "status", "created_at") search_fields = ( "user__username", "user__email", "api_key__key_prefix", "alias", "model_used", "prompt", "error_message", "result_ref", "result_summary", ) ordering = ("-created_at", "-id") date_hierarchy = "created_at" list_select_related = ("user", "api_key")