Withdraw and Deposit
This commit is contained in:
parent
7ca0cbbc52
commit
07184d6be0
3 changed files with 83 additions and 33 deletions
|
|
@ -46,18 +46,12 @@ class TransactionSerializer(serializers.ModelSerializer):
|
||||||
return transaction
|
return transaction
|
||||||
|
|
||||||
|
|
||||||
class ServiceTransactionSerializer(serializers.ModelSerializer):
|
class DepositSerializer(serializers.ModelSerializer):
|
||||||
# payer = PublicUserSerializer(required=True)
|
|
||||||
# payee = PublicUserSerializer(required=True)
|
|
||||||
user = PublicUserSerializer(required=False, write_only=True)
|
|
||||||
uuid = serializers.UUIDField(required=True)
|
uuid = serializers.UUIDField(required=True)
|
||||||
|
|
||||||
# application_client_id = serializers.IntegerField(required=False, read_only=True)
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Transaction
|
model = Transaction
|
||||||
fields = (
|
fields = (
|
||||||
'user',
|
|
||||||
'uuid',
|
'uuid',
|
||||||
'payer',
|
'payer',
|
||||||
'payee',
|
'payee',
|
||||||
|
|
@ -70,16 +64,40 @@ class ServiceTransactionSerializer(serializers.ModelSerializer):
|
||||||
# 'application_client_id'
|
# 'application_client_id'
|
||||||
)
|
)
|
||||||
|
|
||||||
read_only_fields = ['last_update', 'state', 'create', 'user'] # , 'detail_id'] #, 'application_client_id']
|
read_only_fields = ['last_update', 'state', 'create', 'payer'] # , 'detail_id'] #, 'application_client_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',
|
||||||
|
# 'application_client_id'
|
||||||
|
)
|
||||||
|
|
||||||
|
read_only_fields = ['last_update', 'state', 'create', 'payee'] # , 'detail_id'] #, 'application_client_id']
|
||||||
|
|
||||||
def create(self, validated_data):
|
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():
|
with atomic():
|
||||||
try:
|
try:
|
||||||
transaction = Transaction.objects.create_transaction(**validated_data)
|
transaction = Transaction.objects.create_transaction(**validated_data)
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ from rest_framework import generics, permissions
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
|
|
||||||
from apps.transactions.models import Transaction
|
from apps.transactions.models import Transaction
|
||||||
from apps.transactions.serializers import TransactionSerializer, ServiceTransactionSerializer
|
from apps.transactions.serializers import TransactionSerializer, DepositSerializer, WithdrawSerializer
|
||||||
from apps.users.constans import STATE_CHOICES
|
from apps.users.constans import STATE_CHOICES
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -80,31 +80,60 @@ class TransactionReceipt(generics.RetrieveAPIView):
|
||||||
return Response(serializer.data)
|
return Response(serializer.data)
|
||||||
|
|
||||||
|
|
||||||
# TODO: withdraw and deposit service
|
class DepositSubmit(generics.CreateAPIView):
|
||||||
|
permission_classes = [TokenHasScope]
|
||||||
class ServiceTransactionSubmit(generics.CreateAPIView):
|
serializer_class = DepositSerializer
|
||||||
permission_classes = [IsAuthenticatedOrTokenHasScope]
|
required_scopes = ['transactions.deposit:submit']
|
||||||
serializer_class = ServiceTransactionSerializer
|
|
||||||
required_scopes = ['transactions.transaction:submit']
|
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
# TODO: check if application_client_id is None
|
|
||||||
application_client_id = get_application_client_id(self.request)
|
application_client_id = get_application_client_id(self.request)
|
||||||
return Transaction.objects.filter(application_client_id=application_client_id).all()
|
return Transaction.objects.filter(application_client_id=application_client_id).all()
|
||||||
|
|
||||||
def perform_create(self, serializer):
|
def perform_create(self, serializer):
|
||||||
user = self.request.auth.application.user
|
payer = self.request.auth.application.user
|
||||||
serializer.save(user=user, application_client_id=get_application_client_id(self.request))
|
serializer.save(payer=payer, application_client_id=get_application_client_id(self.request))
|
||||||
|
|
||||||
|
|
||||||
class ServiceTransactionVerify(generics.RetrieveAPIView):
|
class DepositVerify(generics.RetrieveAPIView):
|
||||||
permission_classes = [IsAuthenticatedOrTokenHasScope]
|
permission_classes = [TokenHasScope]
|
||||||
serializer_class = ServiceTransactionSerializer
|
serializer_class = DepositSerializer
|
||||||
lookup_field = 'uuid'
|
lookup_field = 'uuid'
|
||||||
required_scopes = ['transactions.transaction:verify']
|
required_scopes = ['transactions.deposit:verify']
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
application_client_id = get_application_client_id(self.request)
|
||||||
|
return Transaction.objects.filter(application_client_id=application_client_id).all()
|
||||||
|
|
||||||
|
def retrieve(self, request, *args, **kwargs):
|
||||||
|
instance = self.get_object()
|
||||||
|
if instance.state == STATE_CHOICES.pending:
|
||||||
|
instance.verify()
|
||||||
|
|
||||||
|
serializer = self.get_serializer(instance)
|
||||||
|
return Response(serializer.data)
|
||||||
|
|
||||||
|
|
||||||
|
class WithdrawSubmit(generics.CreateAPIView):
|
||||||
|
permission_classes = [TokenHasScope]
|
||||||
|
serializer_class = WithdrawSerializer
|
||||||
|
required_scopes = ['transactions.withdraw:submit']
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
application_client_id = get_application_client_id(self.request)
|
||||||
|
return Transaction.objects.filter(application_client_id=application_client_id).all()
|
||||||
|
|
||||||
|
def perform_create(self, serializer):
|
||||||
|
payee = self.request.auth.application.user
|
||||||
|
serializer.save(payee=payee, application_client_id=get_application_client_id(self.request))
|
||||||
|
|
||||||
|
|
||||||
|
class WithdrawVerify(generics.RetrieveAPIView):
|
||||||
|
permission_classes = [TokenHasScope]
|
||||||
|
serializer_class = WithdrawSerializer
|
||||||
|
lookup_field = 'uuid'
|
||||||
|
required_scopes = ['transactions.withdraw:verify']
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
# TODO: check if application_client_id is None
|
|
||||||
application_client_id = get_application_client_id(self.request)
|
application_client_id = get_application_client_id(self.request)
|
||||||
return Transaction.objects.filter(application_client_id=application_client_id).all()
|
return Transaction.objects.filter(application_client_id=application_client_id).all()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ from django.contrib import admin
|
||||||
|
|
||||||
# from apps.gooyal_oauth2.views.introspect import introspect_token
|
# from apps.gooyal_oauth2.views.introspect import introspect_token
|
||||||
from apps.transactions.views import TransactionList, TransactionDetail, TransactionPay, TransactionReceipt, \
|
from apps.transactions.views import TransactionList, TransactionDetail, TransactionPay, TransactionReceipt, \
|
||||||
ServiceTransactionVerify, ServiceTransactionSubmit
|
WithdrawVerify, WithdrawSubmit, DepositSubmit, DepositVerify
|
||||||
from apps.users.views import UserListView, UserDetailView, AccountView, RequestOTPView, ChangePasswordView, \
|
from apps.users.views import UserListView, UserDetailView, AccountView, RequestOTPView, ChangePasswordView, \
|
||||||
OTPLoginView, home
|
OTPLoginView, home
|
||||||
from django.contrib.auth import urls as auth_urls
|
from django.contrib.auth import urls as auth_urls
|
||||||
|
|
@ -50,8 +50,11 @@ urlpatterns = [
|
||||||
path('transactions/<uuid>', TransactionDetail.as_view(), name='transaction_detail'),
|
path('transactions/<uuid>', TransactionDetail.as_view(), name='transaction_detail'),
|
||||||
path('transactions/<uuid>/pay', TransactionPay.as_view(), name='transaction_pay'),
|
path('transactions/<uuid>/pay', TransactionPay.as_view(), name='transaction_pay'),
|
||||||
|
|
||||||
path('service-transactions/', ServiceTransactionSubmit.as_view(), name='service_transaction_submit'),
|
path('deposit/', DepositSubmit.as_view(), name='deposit_submit'),
|
||||||
path('service-transactions/<uuid>/verify', ServiceTransactionVerify.as_view(), name='service_transaction_verify'),
|
path('deposit/<uuid>/verify', DepositVerify.as_view(), name='deposit_verify'),
|
||||||
|
|
||||||
|
path('withdraw/', WithdrawSubmit.as_view(), name='withdraw_submit'),
|
||||||
|
path('withdraw/<uuid>/verify', WithdrawVerify.as_view(), name='withdraw_verify'),
|
||||||
]
|
]
|
||||||
|
|
||||||
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue