163 lines
5.9 KiB
Python
Executable file
163 lines
5.9 KiB
Python
Executable file
from django.contrib.auth.decorators import login_required
|
|
from django.db.models import Q
|
|
from django.utils.decorators import method_decorator
|
|
from django.views.generic import DetailView, ListView
|
|
|
|
from oauth2_provider.contrib.rest_framework import TokenHasScope, IsAuthenticatedOrTokenHasScope
|
|
from rest_framework import generics, permissions
|
|
from rest_framework.response import Response
|
|
|
|
from apps.gooyal_oauth2.rest_framework import IsAuthenticatedOrTokenMatchesOASRequirements
|
|
from apps.wallet.models import Transaction
|
|
from apps.wallet.serializers import TransactionSerializer, DepositSerializer, WithdrawSerializer
|
|
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 = [IsAuthenticatedOrTokenMatchesOASRequirements]
|
|
serializer_class = TransactionSerializer
|
|
required_alternate_scopes = {
|
|
"GET": [['wallet.transaction:list']],
|
|
"POST": [['wallet.invoice:create']],
|
|
}
|
|
|
|
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 = ['wallet.transaction:retrieve']
|
|
|
|
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 = ['wallet.invoice:pay']
|
|
|
|
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 = ['wallet.invoice:receipt']
|
|
|
|
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)
|
|
|
|
|
|
class DepositSubmit(generics.CreateAPIView):
|
|
permission_classes = [TokenHasScope]
|
|
serializer_class = DepositSerializer
|
|
required_scopes = ['wallet.deposit: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):
|
|
payer = self.request.auth.application.user
|
|
serializer.save(payer=payer, application_client_id=get_application_client_id(self.request))
|
|
|
|
|
|
class DepositVerify(generics.RetrieveAPIView):
|
|
permission_classes = [TokenHasScope]
|
|
serializer_class = DepositSerializer
|
|
lookup_field = 'uuid'
|
|
required_scopes = ['wallet.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 = ['wallet.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 = ['wallet.withdraw: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)
|
|
|
|
|
|
@method_decorator(login_required, name='dispatch')
|
|
class TransactionListView(ListView):
|
|
model = Transaction
|
|
template_name = 'wallet/transaction_list.html'
|
|
|
|
def get_queryset(self):
|
|
user = self.request.user
|
|
return Transaction.objects.filter(Q(payee=user) | Q(payer=user)).all()
|