Allow for charging customers

This commit is contained in:
fnux 2020-03-03 18:16:25 +01:00
commit e0cb6ac670
4 changed files with 32 additions and 20 deletions

View file

@ -63,6 +63,8 @@ class PaymentMethodViewSet(viewsets.ModelViewSet):
def get_serializer_class(self):
if self.action == 'create':
return CreatePaymentMethodSerializer
elif self.action == 'charge':
return ChargePaymentMethodSerializer
else:
return PaymentMethodSerializer
@ -99,18 +101,18 @@ class PaymentMethodViewSet(viewsets.ModelViewSet):
output_serializer = PaymentMethodSerializer(payment_method)
return Response(output_serializer.data)
# TODO: find a way to customize serializer for actions.
# drf-action-serializer module seems to do that.
@action(detail=True, methods=['post'])
def charge(self, request, pk=None):
payment_method = self.get_object()
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
amount = serializer.data['amount']
if payment_method.charge(amount):
return Response({'charged', amount})
else:
return Response(status=status.HTTP_500_INTERNAL_ERROR)
amount = serializer.validated_data['amount']
try:
payment = payment_method.charge(amount)
output_serializer = PaymentSerializer(payment)
return Response(output_serializer.data)
except Exception as e:
return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
###
# Admin views.