58 lines
2.0 KiB
Python
58 lines
2.0 KiB
Python
from rest_framework import serializers
|
|
|
|
from apps.billing.api.services import REFERRAL_MILESTONES, FeatureAccessService
|
|
from apps.billing.models import FeaturePlan, FeaturePlanTier, GemPack
|
|
|
|
|
|
class WalletSerializer(serializers.Serializer):
|
|
gem_balance = serializers.IntegerField()
|
|
is_in_trial = serializers.BooleanField()
|
|
trial_expires_at = serializers.DateTimeField()
|
|
referral_code = serializers.CharField()
|
|
referral_count = serializers.IntegerField()
|
|
next_referral_milestone = serializers.SerializerMethodField()
|
|
|
|
def get_next_referral_milestone(self, obj):
|
|
count = obj["referral_count"]
|
|
for milestone, bonus in sorted(REFERRAL_MILESTONES.items()):
|
|
if count < milestone:
|
|
return {"referrals_needed": milestone, "referrals_remaining": milestone - count, "bonus_gems": bonus}
|
|
return None
|
|
|
|
|
|
class FeaturePlanTierSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = FeaturePlanTier
|
|
fields = ["duration_months", "gem_price"]
|
|
|
|
|
|
class FeaturePlanSerializer(serializers.ModelSerializer):
|
|
tiers = FeaturePlanTierSerializer(many=True, read_only=True)
|
|
is_active = serializers.SerializerMethodField()
|
|
expires_at = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = FeaturePlan
|
|
fields = ["key", "name", "tiers", "is_active", "expires_at"]
|
|
|
|
def get_is_active(self, obj: FeaturePlan) -> bool:
|
|
return FeatureAccessService.is_active(self.context["request"].user, obj.key)
|
|
|
|
def get_expires_at(self, obj: FeaturePlan):
|
|
return FeatureAccessService.expires_at(self.context["request"].user, obj.key)
|
|
|
|
|
|
class GemPackSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = GemPack
|
|
fields = ["id", "bazaar_sku", "display_name", "gem_amount"]
|
|
|
|
|
|
class ActivateFeatureSerializer(serializers.Serializer):
|
|
duration_months = serializers.IntegerField(min_value=1)
|
|
|
|
|
|
class CreatePurchaseSerializer(serializers.Serializer):
|
|
gem_pack_id = serializers.IntegerField()
|
|
purchase_token = serializers.CharField(max_length=255)
|