# ============================================ # apps/gamification/serializers.py # ============================================ from rest_framework import serializers from apps.gamification.models import Badge, UserBadge, UserPointsHistory from apps.users.models import User from apps.users.serializers import UserSerializer class BadgeSerializer(serializers.ModelSerializer): name = serializers.SerializerMethodField() description = serializers.SerializerMethodField() icon = serializers.SerializerMethodField() color = serializers.SerializerMethodField() class Meta: model = Badge fields = ['id', 'code', 'name', 'description', 'icon', 'color'] def get_name(self, obj): name = obj.names.filter(is_current=True).first() return name.name if name else obj.code def get_description(self, obj): desc = obj.descriptions.filter(is_current=True).first() return desc.description if desc else None def get_icon(self, obj): icon = obj.icons.filter(is_current=True).first() return icon.icon if icon else None def get_color(self, obj): color = obj.colors.filter(is_current=True).first() return color.color if color else None class UserBadgeSerializer(serializers.ModelSerializer): badge = BadgeSerializer(read_only=True) class Meta: model = UserBadge fields = ['id', 'badge', 'awarded_at'] class LeaderboardUserSerializer(serializers.ModelSerializer): profile = serializers.SerializerMethodField() rank = serializers.IntegerField(read_only=True) badges_count = serializers.SerializerMethodField() class Meta: model = User fields = ['id', 'email', 'profile', 'points', 'rank', 'badges_count'] def get_profile(self, obj): from apps.users.serializers import UserProfileDetailSerializer profile = obj.profiles.filter(is_current=True).first() return UserProfileDetailSerializer(profile).data if profile else None def get_badges_count(self, obj): return obj.user_badges.filter(is_active=True).count() class UserPointsHistorySerializer(serializers.ModelSerializer): class Meta: model = UserPointsHistory fields = [ 'id', 'points_change', 'previous_total', 'new_total', 'reason', 'created_at' ]