serializers.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from django.core.exceptions import SuspiciousOperation
  2. from rest_framework import serializers
  3. from rest_framework.serializers import ModelSerializer
  4. from djstripe.models import Plan, Customer, Product
  5. from djstripe.contrib.rest_framework.serializers import (
  6. SubscriptionSerializer as BaseSubscriptionSerializer,
  7. )
  8. from organizations_ext.models import OrganizationUserRole
  9. class PlanSerializer(ModelSerializer):
  10. class Meta:
  11. model = Plan
  12. fields = ("id", "nickname", "amount", "metadata")
  13. class ProductSerializer(ModelSerializer):
  14. plans = PlanSerializer(many=True, source="plan_set")
  15. class Meta:
  16. model = Product
  17. fields = ("id", "name", "description", "type", "plans", "metadata")
  18. class SubscriptionSerializer(BaseSubscriptionSerializer):
  19. plan = PlanSerializer(read_only=True)
  20. class OrganizationPrimaryKeySerializer(serializers.PrimaryKeyRelatedField):
  21. def get_queryset(self):
  22. user = self.context["request"].user
  23. return user.organizations_ext_organization.filter(
  24. organization_users__role=OrganizationUserRole.OWNER
  25. )
  26. class OrganizationSelectSerializer(serializers.Serializer):
  27. """ Organization in which user is owner of """
  28. organization = OrganizationPrimaryKeySerializer()
  29. class PlanForOrganizationSerializer(OrganizationSelectSerializer):
  30. plan = serializers.SlugRelatedField(queryset=Plan.objects.all(), slug_field="id")
  31. class CreateSubscriptionSerializer(PlanForOrganizationSerializer):
  32. """A serializer used to create a Subscription. Only works with free plans. """
  33. subscription = SubscriptionSerializer(read_only=True)
  34. def create(self, data):
  35. organization = data["organization"]
  36. plan = data["plan"]
  37. if plan.amount != 0.0:
  38. raise SuspiciousOperation(
  39. "Cannot subscribe to non-free plan without payment"
  40. )
  41. customer, _ = Customer.get_or_create(subscriber=organization)
  42. subscription = customer.subscribe(plan)
  43. return {
  44. "plan": plan,
  45. "organization": organization,
  46. "subscription": subscription,
  47. }