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

session.py 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import logging
  2. from django.db.models import get_model
  3. from oscar.apps.shipping.methods import Free
  4. from oscar.core.loading import get_class
  5. OrderTotalCalculator = get_class('checkout.calculators', 'OrderTotalCalculator')
  6. CheckoutSessionData = get_class('checkout.utils', 'CheckoutSessionData')
  7. ShippingAddress = get_model('order', 'ShippingAddress')
  8. UserAddress = get_model('address', 'UserAddress')
  9. # Standard logger for checkout events
  10. logger = logging.getLogger('oscar.checkout')
  11. class CheckoutSessionMixin(object):
  12. """
  13. Mixin to provide common functionality shared between checkout views.
  14. """
  15. def dispatch(self, request, *args, **kwargs):
  16. self.checkout_session = CheckoutSessionData(request)
  17. return super(CheckoutSessionMixin, self).dispatch(request, *args, **kwargs)
  18. def get_shipping_address(self):
  19. """
  20. Return the current shipping address for this checkout session.
  21. This could either be a ShippingAddress model which has been
  22. pre-populated (not saved), or a UserAddress model which will
  23. need converting into a ShippingAddress model at submission
  24. """
  25. addr_data = self.checkout_session.new_shipping_address_fields()
  26. if addr_data:
  27. # Load address data into a blank address model
  28. return ShippingAddress(**addr_data)
  29. addr_id = self.checkout_session.user_address_id()
  30. if addr_id:
  31. try:
  32. return UserAddress._default_manager.get(pk=addr_id)
  33. except UserAddress.DoesNotExist:
  34. # This can happen if you reset all your tables and you still have
  35. # session data that refers to addresses that no longer exist
  36. pass
  37. return None
  38. def get_shipping_method(self, basket=None):
  39. method = self.checkout_session.shipping_method()
  40. if method:
  41. if not basket:
  42. basket = self.request.basket
  43. method.set_basket(basket)
  44. else:
  45. # We default to using free shipping
  46. method = Free()
  47. return method
  48. def get_order_totals(self, basket=None, shipping_method=None, **kwargs):
  49. """
  50. Returns the total for the order with and without tax (as a tuple)
  51. """
  52. calc = OrderTotalCalculator(self.request)
  53. if not basket:
  54. basket = self.request.basket
  55. if not shipping_method:
  56. shipping_method = self.get_shipping_method(basket)
  57. total_incl_tax = calc.order_total_incl_tax(basket, shipping_method, **kwargs)
  58. total_excl_tax = calc.order_total_excl_tax(basket, shipping_method, **kwargs)
  59. return total_incl_tax, total_excl_tax
  60. def get_context_data(self, **kwargs):
  61. """
  62. Assign common template variables to the context.
  63. """
  64. ctx = super(CheckoutSessionMixin, self).get_context_data(**kwargs)
  65. ctx['shipping_address'] = self.get_shipping_address()
  66. method = self.get_shipping_method()
  67. if method:
  68. ctx['shipping_method'] = method
  69. ctx['shipping_total_excl_tax'] = method.basket_charge_excl_tax()
  70. ctx['shipping_total_incl_tax'] = method.basket_charge_incl_tax()
  71. ctx['order_total_incl_tax'], ctx['order_total_excl_tax'] = self.get_order_totals()
  72. return ctx