Files

143 lines
3.6 KiB
Python

from django.contrib import admin
from .models import (
CallRecord,
ExchangeRate,
PointsLedger,
PricingRule,
RechargeOrder,
SignupBonusGrant,
)
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")
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="分辨率")
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",)
@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")
list_select_related = ("user",)
@admin.register(CallRecord)
class CallRecordAdmin(ReadOnlyLedgerAdmin):
list_display = (
"created_at",
"user",
"api_key",
"client_device",
"operation_type",
"alias",
"model_used",
"points_cost",
"status",
"upstream_latency_ms",
)
list_filter = ("operation_type", "status", "client_device", "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")
list_select_related = ("user", "api_key", "client_device")
@admin.register(SignupBonusGrant)
class SignupBonusGrantAdmin(ReadOnlyLedgerAdmin):
list_display = ("created_at", "user", "points_granted")
list_filter = ("created_at",)
search_fields = ("user__username", "user__email")
ordering = ("-created_at", "-id")
list_select_related = ("user",)