You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. from django.core.urlresolvers import resolve
  2. from oscar.core.loading import import_module
  3. import_module('shipping.repository', ['Repository'], locals())
  4. class CheckoutSessionData(object):
  5. u"""Class responsible for marshalling all the checkout session data."""
  6. SESSION_KEY = 'checkout_data'
  7. def __init__(self, request):
  8. self.request = request
  9. if self.SESSION_KEY not in self.request.session:
  10. self.request.session[self.SESSION_KEY] = {}
  11. def _check_namespace(self, namespace):
  12. if namespace not in self.request.session[self.SESSION_KEY]:
  13. self.request.session[self.SESSION_KEY][namespace] = {}
  14. def _get(self, namespace, key, default=None):
  15. u"""Return session value or None"""
  16. self._check_namespace(namespace)
  17. if key in self.request.session[self.SESSION_KEY][namespace]:
  18. return self.request.session[self.SESSION_KEY][namespace][key]
  19. return default
  20. def _set(self, namespace, key, value):
  21. u"""Set session value"""
  22. self._check_namespace(namespace)
  23. self.request.session[self.SESSION_KEY][namespace][key] = value
  24. self.request.session.modified = True
  25. def _unset(self, namespace, key):
  26. u"""Unset session value"""
  27. self._check_namespace(namespace)
  28. if key in self.request.session[self.SESSION_KEY][namespace]:
  29. del self.request.session[self.SESSION_KEY][namespace][key]
  30. self.request.session.modified = True
  31. def flush(self):
  32. u"""Delete session key"""
  33. self.request.session[self.SESSION_KEY] = {}
  34. # Shipping addresses
  35. def ship_to_user_address(self, address):
  36. u"""Set existing shipping address id to session and unset address fields from session"""
  37. self._set('shipping', 'user_address_id', address.id)
  38. self._unset('shipping', 'new_address_fields')
  39. def ship_to_new_address(self, address_fields):
  40. u"""Set new shipping address details to session and unset shipping address id"""
  41. self._set('shipping', 'new_address_fields', address_fields)
  42. self._unset('shipping', 'user_address_id')
  43. def new_shipping_address_fields(self):
  44. u"""Get shipping address fields from session"""
  45. return self._get('shipping', 'new_address_fields')
  46. def user_address_id(self):
  47. u"""Get user address id from session"""
  48. return self._get('shipping', 'user_address_id')
  49. # Shipping methods
  50. def use_free_shipping(self):
  51. u"""Set "free shipping" code to session"""
  52. self._set('shipping', 'method_code', '__free__')
  53. def use_shipping_method(self, code):
  54. u"""Set shipping method code to session"""
  55. self._set('shipping', 'method_code', code)
  56. def shipping_method(self):
  57. u"""
  58. Returns the shipping method model based on the
  59. data stored in the session.
  60. """
  61. code = self._get('shipping', 'method_code')
  62. if not code:
  63. return None
  64. return Repository().find_by_code(code)
  65. # Billing address fields
  66. def bill_to_new_address(self, address_fields):
  67. """
  68. Store address fields for a billing address.
  69. """
  70. self._set('billing', 'new_address_fields', address_fields)
  71. def new_billing_address_fields(self):
  72. """
  73. Return fields for a billing address
  74. """
  75. return self._get('billing', 'new_address_fields')
  76. def billing_address_same_as_shipping(self):
  77. """
  78. Record fact that the billing address is to be the same as
  79. the shipping address.
  80. """
  81. self._set('payment', 'billing_address_same_as_shipping', True)
  82. def is_billing_address_same_as_shipping(self):
  83. return self._get('payment', 'billing_address_same_as_shipping', False)
  84. # Payment methods
  85. def pay_by(self, method):
  86. self._set('payment', 'method', method)
  87. def payment_method(self):
  88. return self._get('payment', 'method')
  89. # Submission methods
  90. def set_order_number(self, order_number):
  91. self._set('submission', 'order_number', order_number)
  92. def get_order_number(self):
  93. return self._get('submission', 'order_number')
  94. def set_submitted_basket(self, basket):
  95. self._set('submission', 'basket_id', basket.id)
  96. def get_submitted_basket_id(self):
  97. return self._get('submission', 'basket_id')