69 lines
2.1 KiB
Python
69 lines
2.1 KiB
Python
from rest_framework import serializers
|
|
|
|
from .models import CreditAccount, CreditLedger, CreditReservation, QuotaPolicy
|
|
|
|
|
|
class CreditAccountSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = CreditAccount
|
|
fields = ["id", "balance", "reserved_balance", "currency", "updated_at"]
|
|
read_only_fields = fields
|
|
|
|
|
|
class CreditLedgerSerializer(serializers.ModelSerializer):
|
|
# 成员展示名:优先真实姓名 → 用户名 → 邮箱;系统流水(无 user)留空
|
|
user_label = serializers.SerializerMethodField()
|
|
# 扣费项目:与任务监控类型列同源,供账户中心流水展示
|
|
task_type = serializers.SerializerMethodField()
|
|
project_title = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = CreditLedger
|
|
fields = [
|
|
"id",
|
|
"user",
|
|
"user_label",
|
|
"project",
|
|
"project_title",
|
|
"task",
|
|
"task_type",
|
|
"ledger_type",
|
|
"amount",
|
|
"balance_after",
|
|
"reason",
|
|
"metadata",
|
|
"created_at",
|
|
]
|
|
read_only_fields = fields
|
|
|
|
def get_user_label(self, obj):
|
|
user = obj.user
|
|
if user is None:
|
|
return ""
|
|
return user.first_name or user.username or user.email or ""
|
|
|
|
def get_task_type(self, obj):
|
|
task = getattr(obj, "task", None)
|
|
return getattr(task, "task_type", "") or ""
|
|
|
|
def get_project_title(self, obj):
|
|
project = getattr(obj, "project", None)
|
|
if project is None:
|
|
return ""
|
|
return getattr(project, "title", None) or getattr(project, "name", None) or ""
|
|
|
|
|
|
class CreditReservationSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = CreditReservation
|
|
fields = ["id", "user", "project", "task", "amount", "status", "expires_at", "created_at"]
|
|
read_only_fields = fields
|
|
|
|
|
|
class QuotaPolicySerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = QuotaPolicy
|
|
fields = ["id", "user", "project", "monthly_limit", "project_limit", "per_task_limit", "is_active"]
|
|
read_only_fields = ["id"]
|
|
|