219 lines
6.0 KiB
Python
219 lines
6.0 KiB
Python
"""
|
||
Сериализаторы для реферальной системы.
|
||
"""
|
||
from rest_framework import serializers
|
||
from .models import (
|
||
ReferralLevel,
|
||
UserReferralProfile,
|
||
BonusAccount,
|
||
ReferralEarning,
|
||
PointsTransaction,
|
||
BonusTransaction,
|
||
PromoCode,
|
||
PromoCodeUsage,
|
||
ReferralSettings
|
||
)
|
||
|
||
|
||
class ReferralLevelSerializer(serializers.ModelSerializer):
|
||
"""Сериализатор уровня."""
|
||
|
||
class Meta:
|
||
model = ReferralLevel
|
||
fields = [
|
||
'id',
|
||
'level',
|
||
'name',
|
||
'points_required',
|
||
'bonus_payment_percent',
|
||
'icon'
|
||
]
|
||
|
||
|
||
class ReferralSettingsSerializer(serializers.ModelSerializer):
|
||
"""Сериализатор настроек."""
|
||
|
||
class Meta:
|
||
model = ReferralSettings
|
||
fields = [
|
||
'level1_commission',
|
||
'level2_commission',
|
||
'points_direct_referral',
|
||
'points_indirect_referral'
|
||
]
|
||
|
||
|
||
class UserReferralProfileSerializer(serializers.ModelSerializer):
|
||
"""Сериализатор реферального профиля."""
|
||
|
||
current_level = ReferralLevelSerializer(read_only=True)
|
||
referral_link = serializers.SerializerMethodField()
|
||
next_level = serializers.SerializerMethodField()
|
||
|
||
class Meta:
|
||
model = UserReferralProfile
|
||
fields = [
|
||
'id',
|
||
'referral_code',
|
||
'referral_link',
|
||
'current_level',
|
||
'next_level',
|
||
'total_points',
|
||
'direct_referrals_count',
|
||
'indirect_referrals_count',
|
||
'total_earned',
|
||
'created_at'
|
||
]
|
||
|
||
def get_referral_link(self, obj):
|
||
"""Получить реферальную ссылку (всегда используем FRONTEND_URL)."""
|
||
from django.conf import settings
|
||
return obj.get_referral_link(settings.FRONTEND_URL)
|
||
|
||
def get_next_level(self, obj):
|
||
"""Получить следующий уровень."""
|
||
if not obj.current_level:
|
||
return None
|
||
|
||
next_level = ReferralLevel.objects.filter(
|
||
level__gt=obj.current_level.level
|
||
).order_by('level').first()
|
||
|
||
if next_level:
|
||
return {
|
||
'level': next_level.level,
|
||
'name': next_level.name,
|
||
'points_required': next_level.points_required,
|
||
'points_to_next': next_level.points_required - obj.total_points
|
||
}
|
||
return None
|
||
|
||
|
||
class BonusAccountSerializer(serializers.ModelSerializer):
|
||
"""Сериализатор бонусного счета."""
|
||
|
||
class Meta:
|
||
model = BonusAccount
|
||
fields = [
|
||
'id',
|
||
'balance',
|
||
'total_earned',
|
||
'total_spent',
|
||
'created_at',
|
||
'updated_at'
|
||
]
|
||
|
||
|
||
class ReferralEarningSerializer(serializers.ModelSerializer):
|
||
"""Сериализатор заработка с реферала."""
|
||
|
||
referral_email = serializers.EmailField(source='referral.email', read_only=True)
|
||
|
||
class Meta:
|
||
model = ReferralEarning
|
||
fields = [
|
||
'id',
|
||
'referral_email',
|
||
'level',
|
||
'payment_amount',
|
||
'commission_percent',
|
||
'earned_amount',
|
||
'created_at'
|
||
]
|
||
|
||
|
||
class PointsTransactionSerializer(serializers.ModelSerializer):
|
||
"""Сериализатор транзакции очков."""
|
||
|
||
class Meta:
|
||
model = PointsTransaction
|
||
fields = [
|
||
'id',
|
||
'points',
|
||
'reason',
|
||
'balance_after',
|
||
'created_at'
|
||
]
|
||
|
||
|
||
class BonusTransactionSerializer(serializers.ModelSerializer):
|
||
"""Сериализатор транзакции бонусов."""
|
||
|
||
class Meta:
|
||
model = BonusTransaction
|
||
fields = [
|
||
'id',
|
||
'amount',
|
||
'transaction_type',
|
||
'reason',
|
||
'balance_after',
|
||
'created_at'
|
||
]
|
||
|
||
|
||
class PromoCodeSerializer(serializers.ModelSerializer):
|
||
"""Сериализатор промокода."""
|
||
|
||
is_valid_now = serializers.SerializerMethodField()
|
||
usage_count = serializers.IntegerField(source='current_uses', read_only=True)
|
||
|
||
class Meta:
|
||
model = PromoCode
|
||
fields = [
|
||
'id',
|
||
'code',
|
||
'name',
|
||
'description',
|
||
'discount_type',
|
||
'discount_value',
|
||
'max_uses',
|
||
'usage_count',
|
||
'valid_until',
|
||
'is_active',
|
||
'is_valid_now'
|
||
]
|
||
|
||
def get_is_valid_now(self, obj):
|
||
"""Проверить валидность."""
|
||
is_valid, _ = obj.is_valid()
|
||
return is_valid
|
||
|
||
|
||
class PromoCodeValidationSerializer(serializers.Serializer):
|
||
"""Сериализатор для валидации промокода."""
|
||
|
||
code = serializers.CharField(max_length=50)
|
||
plan_id = serializers.IntegerField()
|
||
|
||
|
||
class PromoCodeUsageSerializer(serializers.ModelSerializer):
|
||
"""Сериализатор использования промокода."""
|
||
|
||
promo_code_code = serializers.CharField(source='promo_code.code', read_only=True)
|
||
|
||
class Meta:
|
||
model = PromoCodeUsage
|
||
fields = [
|
||
'id',
|
||
'promo_code_code',
|
||
'original_amount',
|
||
'discount_amount',
|
||
'final_amount',
|
||
'created_at'
|
||
]
|
||
|
||
|
||
class SetReferrerSerializer(serializers.Serializer):
|
||
"""Сериализатор для установки реферера."""
|
||
|
||
referral_code = serializers.CharField(max_length=20)
|
||
|
||
def validate_referral_code(self, value):
|
||
"""Валидация реферального кода."""
|
||
try:
|
||
profile = UserReferralProfile.objects.get(referral_code=value)
|
||
return value
|
||
except UserReferralProfile.DoesNotExist:
|
||
raise serializers.ValidationError('Неверный реферальный код')
|
||
|