Files
MathApp/subscription/serializers.py
Zareian 8cb326ba94 Grades 4 and 5, Bazaar purchase from the app, pack SKUs
- rag: MATH_4 / MATH_5 textbooks (TOC and page offsets read from the PDFs)
- content: grades 4 and 5 in the seed files: 7 units / 28 nodes each,
  204 + 194 questions (every node >= 4), all re-solved blind once
- subscription: Plan.bazaar_sku (admin); POST /api/subscription/purchase
  accepts paymentMethod=bazaar for packs, rejects unknown methods (was ignored)
- payment: idempotency key cannot switch provider; discount codes refused
  on Bazaar orders (Bazaar charges the fixed SKU price)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 20:01:44 +03:30

51 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from rest_framework import serializers
class PlanSerializer(serializers.Serializer):
id = serializers.CharField()
title = serializers.CharField()
price = serializers.IntegerField()
currency = serializers.CharField(required=False)
popular = serializers.BooleanField()
discountPercent = serializers.IntegerField(required=False)
durationDays = serializers.IntegerField(required=False)
features = serializers.ListField(child=serializers.CharField())
badge = serializers.CharField(allow_blank=True)
aiDailyQuota = serializers.IntegerField(help_text='سوال در روز از دستیار برای مشترکِ این پلن.')
kind = serializers.ChoiceField(choices=['pack', 'subscription'])
questionCredits = serializers.IntegerField(help_text='بسته: سوال‌هایی که به اعتبار اضافه می‌شود (منقضی نمی‌شود).')
heartsDays = serializers.IntegerField(help_text='بسته: روزهای قلبِ نامحدودِ هدیه.')
bazaarSku = serializers.CharField(
allow_blank=True, help_text='SKUِ همین بسته در کافه‌بازار؛ خالی یعنی در بازار خریدنی نیست.')
class PlansListResponseSerializer(serializers.Serializer):
plans = PlanSerializer(many=True)
# تا کارتِ پلن بتواند بگوید «۵ سوال در روز (رایگان: ۳)» بی‌آن‌که عدد در فرانت هاردکد شود.
freeAiDailyQuota = serializers.IntegerField()
class PurchaseRequestSerializer(serializers.Serializer):
# هدر Idempotency-Key هم روی همین درخواست لازمه (بخش ۴.۳ سند API)؛
# از request.headers خونده می‌شه، نه از بدنه.
planId = serializers.CharField()
# تا ۲۰۲۶-۱۰-۰۳ هر مقداری پذیرفته و نادیده گرفته می‌شد، پس «bazaar» بی‌صدا به زرین‌پال می‌رفت.
paymentMethod = serializers.ChoiceField(choices=['zarinpal', 'bazaar'], required=False, default='zarinpal')
class PurchaseResponseSerializer(serializers.Serializer):
orderId = serializers.CharField()
paymentUrl = serializers.CharField(
allow_null=True, help_text='زرین‌پال: آدرسی که کاربر به آن برود. بازار: null.')
bazaarSku = serializers.CharField(
required=False, help_text='فقط بازار: SKUی که اپِ اندروید با Poolakey می‌خرد؛ '
'developerPayload همان orderId باشد.')
class SubscriptionStatusResponseSerializer(serializers.Serializer):
active = serializers.BooleanField(help_text='اشتراکِ زمانی (ماهانه/سالانه‌ی قدیمی)؛ نه بسته.')
planId = serializers.CharField(allow_null=True)
expiresAt = serializers.DateTimeField(allow_null=True)
questionCredits = serializers.IntegerField(help_text='سوال‌های خریده‌شده‌ی باقی‌مانده (منقضی نمی‌شوند).')
unlimitedHeartsUntil = serializers.DateTimeField(allow_null=True, help_text='پایانِ قلبِ نامحدودِ هدیه‌ی بسته.')