Source code for payments.api.v1.viewsets.payments
from django.apps import apps
from django.urls import reverse
from rest_framework import status
from rest_framework.exceptions import PermissionDenied, ValidationError
from rest_framework.mixins import ListModelMixin, RetrieveModelMixin
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.viewsets import GenericViewSet
from payments import services
from payments.api.v1.serializers import PaymentSerializer, PaymentCreateSerializer
from payments.exceptions import PaymentError
from payments.models import Payment, PaymentUser
[docs]class PaymentViewset(ListModelMixin, RetrieveModelMixin, GenericViewSet):
"""The viewset to list retrieve and create payments."""
queryset = Payment.objects.all()
permission_classes = [IsAuthenticated]
[docs] def get_serializer_class(self):
if self.action == "create":
return PaymentCreateSerializer
return PaymentSerializer
[docs] def get_queryset(self):
user = self.request.user
return Payment.objects.filter(paid_by=user)
[docs] def create(self, request):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
app_label = serializer.data["app_label"]
model_name = serializer.data["model_name"]
payable_pk = serializer.data["payable_pk"]
payable_model = apps.get_model(app_label=app_label, model_name=model_name)
payable = payable_model.objects.get(pk=payable_pk)
if (
payable.payment_payer.pk
!= PaymentUser.objects.get(pk=self.request.user.pk).pk
):
raise PermissionDenied(
detail="You are not allowed to process this payment."
)
if payable.payment:
return Response(
data={"detail": "This object has already been paid for."},
status=status.HTTP_409_CONFLICT,
)
try:
services.create_payment(
payable, PaymentUser.objects.get(pk=request.user.pk), Payment.TPAY,
)
payable.save()
except PaymentError as e:
raise ValidationError(detail=str(e))
headers = {
"Location": reverse("v1:payment-detail", kwargs={"pk": payable.payment.pk})
}
return Response(
serializer.data, status=status.HTTP_201_CREATED, headers=headers
)