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"]