Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from django.contrib import messages
  2. from django import http
  3. from django.core.urlresolvers import reverse
  4. from django.conf import settings
  5. from django.utils.translation import ugettext_lazy as _
  6. from datacash.facade import Facade
  7. from oscar.apps.checkout import views
  8. from oscar.apps.payment.forms import BankcardForm
  9. from oscar.apps.payment.models import SourceType, Source
  10. # Customise the core PaymentDetailsView to integrate Datacash
  11. class PaymentDetailsView(views.PaymentDetailsView):
  12. def get_context_data(self, **kwargs):
  13. # Add bankcard form to the template context
  14. ctx = super(PaymentDetailsView, self).get_context_data(**kwargs)
  15. ctx['bankcard_form'] = kwargs.get('bankcard_form', BankcardForm())
  16. return ctx
  17. def post(self, request, *args, **kwargs):
  18. if request.POST.get('action', '') == 'place_order':
  19. return self.do_place_order(request)
  20. # Check bankcard form is valid
  21. bankcard_form = BankcardForm(request.POST)
  22. if not bankcard_form.is_valid():
  23. # Bancard form invalid, re-render the payment details template
  24. self.preview = False
  25. ctx = self.get_context_data(**kwargs)
  26. ctx['bankcard_form'] = bankcard_form
  27. return self.render_to_response(ctx)
  28. # Render preview page (with completed bankcard form hidden).
  29. # Note, we don't write the bankcard details to the session or DB
  30. # as a security precaution.
  31. return self.render_preview(request, bankcard_form=bankcard_form)
  32. def do_place_order(self, request):
  33. # Double-check the bankcard data is still valid
  34. bankcard_form = BankcardForm(request.POST)
  35. if not bankcard_form.is_valid():
  36. messages.error(request, _("Invalid submission"))
  37. return http.HttpResponseRedirect(
  38. reverse('checkout:payment-details'))
  39. # Call oscar's submit method, passing through the bankcard object so it
  40. # gets passed to the 'handle_payment' method and can be used for the
  41. # submission to Datacash.
  42. bankcard = bankcard_form.bankcard
  43. return self.submit(request.basket,
  44. payment_kwargs={'bankcard': bankcard})
  45. def handle_payment(self, order_number, total_incl_tax, **kwargs):
  46. # Make request to DataCash - if there any problems (eg bankcard
  47. # not valid / request refused by bank) then an exception would be
  48. # raised and handled by the parent PaymentDetail view)
  49. facade = Facade()
  50. datacash_ref = facade.pre_authorise(
  51. order_number, total_incl_tax, kwargs['bankcard'])
  52. # Request was successful - record the "payment source". As this
  53. # request was a 'pre-auth', we set the 'amount_allocated' - if we had
  54. # performed an 'auth' request, then we would set 'amount_debited'.
  55. source_type, _ = SourceType.objects.get_or_create(name='Datacash')
  56. source = Source(source_type=source_type,
  57. currency=settings.DATACASH_CURRENCY,
  58. amount_allocated=total_incl_tax,
  59. reference=datacash_ref)
  60. self.add_payment_source(source)
  61. # Also record payment event
  62. self.add_payment_event(
  63. 'pre-auth', total_incl_tax, reference=datacash_ref)