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.

utils.py 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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. def ship_to_new_address(self, address_fields):
  50. u"""Set new shipping address details to session and unset shipping address id"""
  51. self._set('shipping', 'new_address_fields', address_fields)
  52. self._unset('shipping', 'user_address_id')
  53. # Shipping methods
  54. def use_free_shipping(self):
  55. u"""Set "free shipping" code to session"""
  56. self._set('shipping', 'method_code', '__free__')
  57. def use_shipping_method(self, code):
  58. u"""Set shipping method code to session"""
  59. self._set('shipping', 'method_code', code)
  60. def shipping_method(self):
  61. u"""
  62. Returns the shipping method model based on the
  63. data stored in the session.
  64. """
  65. code = self._get('shipping', 'method_code')
  66. if not code:
  67. return None
  68. return Repository().find_by_code(code)
  69. # Billing address fields
  70. def bill_to_new_address(self, address_fields):
  71. """
  72. Store address fields for a billing address.
  73. """
  74. self._set('billing', 'new_address_fields', address_fields)
  75. def new_billing_address_fields(self):
  76. """
  77. Return fields for a billing address
  78. """
  79. return self._get('billing', 'new_address_fields')
  80. def billing_address_same_as_shipping(self):
  81. """
  82. Record fact that the billing address is to be the same as
  83. the shipping address.
  84. """
  85. self._set('payment', 'billing_address_same_as_shipping', True)
  86. def is_billing_address_same_as_shipping(self):
  87. return self._get('payment', 'billing_address_same_as_shipping', False)
  88. # Payment methods
  89. def pay_by(self, method):
  90. self._set('payment', 'method', method)
  91. def payment_method(self):
  92. return self._get('payment', 'method')
  93. # Submission methods
  94. def set_order_number(self, order_number):
  95. self._set('submission', 'order_number', order_number)
  96. def get_order_number(self):
  97. return self._get('submission', 'order_number')
  98. def set_submitted_basket(self, basket):
  99. self._set('submission', 'basket_id', basket.id)
  100. def get_submitted_basket_id(self):
  101. return self._get('submission', 'basket_id')