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 from ..users.models import User class TransactionSerializer(serializers.ModelSerializer): payer = PublicUserSerializer(required=False) payee = PublicUserSerializer(required=False, read_only=True) class Meta: model = Transaction fields = ('uuid', 'payer', 'payee', "create", "state", 'amount', 'delay', 'last_update', # 'detail_id', ) read_only_fields = ['uuid', 'last_update', 'state', 'create'] # , 'detail_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 DepositSerializer(serializers.ModelSerializer): uuid = serializers.UUIDField(required=True) class Meta: model = Transaction fields = ( 'uuid', 'payer', 'payee', "create", "state", 'amount', 'delay', 'last_update', # 'detail_id', ) read_only_fields = ['last_update', 'state', 'create', 'payer'] # , 'detail_id'] def create(self, validated_data): with atomic(): try: transaction = Transaction.objects.create_transaction(**validated_data) transaction.submit() except IntegrityError as e: raise APIException('duplicate uuid') return transaction class WithdrawSerializer(serializers.ModelSerializer): uuid = serializers.UUIDField(required=True) class Meta: model = Transaction fields = ( 'uuid', 'payer', 'payee', "create", "state", 'amount', 'delay', 'last_update', # 'detail_id', ) read_only_fields = ['last_update', 'state', 'create', 'payee'] # , 'detail_id'] def create(self, validated_data): with atomic(): try: transaction = Transaction.objects.create_transaction(**validated_data) transaction.submit() except IntegrityError as e: raise APIException('duplicate uuid') return transaction class WalletSerializer(serializers.ModelSerializer): class Meta: model=User fields = ['balance']