from django.db import IntegrityError from django.db.transaction import atomic from rest_framework import serializers from rest_framework.exceptions import APIException from apps.users.serializers import PublicUserSerializer from .models import Transaction class TransactionSerializer(serializers.ModelSerializer): payer = PublicUserSerializer(required=False) payee = PublicUserSerializer(required=False, read_only=True) # application_client_id = serializers.IntegerField(required=False, read_only=True) class Meta: model = Transaction fields = ('uuid', 'payer', 'payee', "create", "state", 'amount', 'delay', 'last_update', # 'detail_id', # 'application_client_id' ) read_only_fields = ['uuid', 'last_update', 'state', 'create'] # , 'detail_id'] #, 'application_client_id'] def create(self, validated_data): payer = validated_data.get('payer') request = self.context.get('request') user = request.user if request else payer if user == payer: with atomic(): transaction = Transaction.objects.create_transaction(**validated_data) transaction.pay() else: transaction = Transaction.objects.create_transaction(**validated_data) return transaction class ServiceTransactionSerializer(serializers.ModelSerializer): # payer = PublicUserSerializer(required=True) # payee = PublicUserSerializer(required=True) user = PublicUserSerializer(required=False, write_only=True) uuid = serializers.UUIDField(required=True) # application_client_id = serializers.IntegerField(required=False, read_only=True) class Meta: model = Transaction fields = ( 'user', 'uuid', 'payer', 'payee', "create", "state", 'amount', 'delay', 'last_update', # 'detail_id', # 'application_client_id' ) read_only_fields = ['last_update', 'state', 'create', 'user'] # , 'detail_id'] #, 'application_client_id'] def create(self, validated_data): payer = validated_data.get('payer') payee = validated_data.get('payee') user = validated_data.pop('user') if user not in [payee, payer]: raise APIException('user must be in payer or payee') with atomic(): try: transaction = Transaction.objects.create_transaction(**validated_data) transaction.submit() except IntegrityError as e: raise APIException('duplicate uuid') return transaction