wallet/apps/wallet/serializers.py
2025-03-09 11:00:26 +03:30

163 lines
4.5 KiB
Python
Executable file

from django.db import IntegrityError
from django.db.transaction import atomic
from rest_framework import serializers
from rest_framework.exceptions import APIException
from .constans import TypeChoices
from .models import Transaction
from ..users.models import User
class TransactionSerializer(serializers.ModelSerializer):
payee_id = serializers.UUIDField(read_only=True)
payee_type = serializers.UUIDField(read_only=True)
role = serializers.SerializerMethodField()
class Meta:
model = Transaction
fields = ('uuid',
'payer_id',
'payer_type',
'payee_id',
'payee_type',
"created_at",
"state",
'amount',
'delay',
'updated_at',
'details',
'role'
)
read_only_fields = ['uuid', 'updated_at', 'state', 'created_at', 'details', 'role']
def get_role(self, obj: Transaction) -> int:
request = self.context.get('request')
user = request.user
if obj.payer_id == user.uuid:
return 1
elif obj.payee_id == user.uuid:
return 2
else:
return 0
# def create(self, validated_data):
# 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',
"created_at",
"state",
'amount',
'delay',
'updated_at',
# 'detail_id',
)
read_only_fields = ['updated_at', 'state', 'created_at', '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',
"created_at",
"state",
'amount',
'delay',
'updated_at',
# 'detail_id',
)
read_only_fields = ['updated_at', 'state', 'created_at', '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 MyWalletSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['balance']
class WalletBalanceSerializer(serializers.ModelSerializer):
instance_id = serializers.UUIDField(required=True)
instance_type = serializers.ChoiceField(choices=TypeChoices.choices, required=True)
class Meta:
model = User
fields = ['balance', 'instance_id', 'instance_type']
class TransferSubmitSerializer(serializers.ModelSerializer):
class Meta:
model = Transaction
fields = ('uuid',
'payer_id',
'payer_type',
'payee_id',
'payee_type',
"created_at",
"state",
'amount',
# 'delay',
'updated_at',
'details',
)
read_only_fields = ['updated_at', 'state', 'created_at']
class TransferVerifySerializer(serializers.ModelSerializer):
class Meta:
model = Transaction
fields = ('uuid',
'payer_id',
'payer_type',
'payee_id',
'payee_type',
"created_at",
"state",
'amount',
# 'delay',
'updated_at',
'details',
)
read_only_fields = ['uuid', 'payer_id', 'payer_type', 'payee_id', 'payee_type', 'updated_at', 'state',
'amount', 'created_at']