wallet/apps/transactions/views.py
2020-05-20 05:59:50 +04:30

117 lines
4.2 KiB
Python
Executable file

from django.db.models import Q
from oauth2_provider.contrib.rest_framework import TokenHasScope, IsAuthenticatedOrTokenHasScope
from rest_framework import generics, permissions
from rest_framework.response import Response
from apps.transactions.models import Transaction
from apps.transactions.serializers import TransactionSerializer, ServiceTransactionSerializer
from apps.users.constans import STATE_CHOICES
def get_application_client_id(request):
try:
application = request.auth.application
if application:
application_client_id = application.client_id
else:
application_client_id = request.auth.detail.get('client_id')
except:
application_client_id = None
return application_client_id
class TransactionList(generics.ListCreateAPIView):
permission_classes = [permissions.IsAuthenticated, IsAuthenticatedOrTokenHasScope]
serializer_class = TransactionSerializer
required_scopes = []
def get_queryset(self):
user = self.request.user
return Transaction.objects.filter(Q(payee=user) | Q(payer=user)).all()
def perform_create(self, serializer):
user = self.request.user
serializer.save(payee=user, application_client_id=get_application_client_id(self.request))
class TransactionDetail(generics.RetrieveAPIView):
permission_classes = [permissions.IsAuthenticated, IsAuthenticatedOrTokenHasScope]
serializer_class = TransactionSerializer
lookup_field = 'uuid'
required_scopes = []
def get_queryset(self):
user = self.request.user
return Transaction.objects.filter(Q(payee=user) | Q(payer=user) | Q(payer__isnull=True)).all()
class TransactionPay(generics.RetrieveAPIView):
permission_classes = [permissions.IsAuthenticated, IsAuthenticatedOrTokenHasScope]
serializer_class = TransactionSerializer
lookup_field = 'uuid'
required_scopes = []
def get_queryset(self):
user = self.request.user
return Transaction.objects.filter(Q(payer=user) | Q(payer__isnull=True)).all()
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
instance.pay(payer=self.request.user)
serializer = self.get_serializer(instance)
return Response(serializer.data)
class TransactionReceipt(generics.RetrieveAPIView):
permission_classes = [permissions.IsAuthenticated, IsAuthenticatedOrTokenHasScope]
serializer_class = TransactionSerializer
lookup_field = 'uuid'
required_scopes = []
def get_queryset(self):
user = self.request.user
return Transaction.objects.filter(payer=user).all()
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
instance.receipt()
serializer = self.get_serializer(instance)
return Response(serializer.data)
# TODO: withdraw and deposit service
class ServiceTransactionSubmit(generics.CreateAPIView):
permission_classes = [IsAuthenticatedOrTokenHasScope]
serializer_class = ServiceTransactionSerializer
required_scopes = ['transaction.submit']
def get_queryset(self):
# TODO: check if application_client_id is None
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):
user = self.request.auth.application.user
serializer.save(user=user, application_client_id=get_application_client_id(self.request))
class ServiceTransactionVerify(generics.RetrieveAPIView):
permission_classes = [IsAuthenticatedOrTokenHasScope]
serializer_class = ServiceTransactionSerializer
lookup_field = 'uuid'
required_scopes = ['transaction.verify']
def get_queryset(self):
# TODO: check if application_client_id is None
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)