Example #1
0
    def dispatch(self, request, *args, **kwargs):
        with transaction.atomic(using="payments_db"):
            self.object = self.get_object()

            # User should choose method for new payment
            if self.object.state == Payment.NEW:
                return redirect("payment", pk=self.object.pk)

            # Get backend and refetch payment from the database
            backend = get_backend(self.object.backend)(self.object)

            # Allow reprocessing of rejected payments. User might choose
            # to retry in the payment gateway and previously rejected payment
            # can be now completed.
            if backend.payment.state not in (Payment.PENDING,
                                             Payment.REJECTED):
                return self.redirect_origin()

            backend.complete(self.request)
            # If payment is still pending, display info page
            if backend.payment.state == Payment.PENDING:
                return render(
                    request,
                    "payment/pending.html",
                    {
                        "object": backend.payment,
                        "backend": backend
                    },
                )
            return self.redirect_origin()
Example #2
0
 def form_valid(self, form):
     if not self.can_pay:
         return redirect("payment", pk=self.object.pk)
     # Actualy call the payment backend
     method = form.cleaned_data["method"]
     backend = get_backend(method)(self.object)
     result = backend.initiate(
         self.request,
         self.request.build_absolute_uri(
             reverse("payment", kwargs={"pk": self.object.pk})),
         self.request.build_absolute_uri(
             reverse("payment-complete", kwargs={"pk": self.object.pk})),
     )
     if result is not None:
         return result
     backend.complete(self.request)
     return self.redirect_origin()