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.

helpers.py 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. from decimal import Decimal as D
  2. import random
  3. import datetime
  4. from oscar.core.loading import get_class, get_classes
  5. Basket = get_class('basket.models', 'Basket')
  6. Free = get_class('shipping.methods', 'Free')
  7. Voucher = get_class('voucher.models', 'Voucher')
  8. OrderCreator = get_class('order.utils', 'OrderCreator')
  9. OrderTotalCalculator = get_class('checkout.calculators',
  10. 'OrderTotalCalculator')
  11. Partner, StockRecord = get_classes('partner.models', ('Partner',
  12. 'StockRecord'))
  13. (ProductClass,
  14. Product,
  15. ProductAttribute,
  16. ProductAttributeValue) = get_classes('catalogue.models',
  17. ('ProductClass',
  18. 'Product',
  19. 'ProductAttribute',
  20. 'ProductAttributeValue'))
  21. (Range,
  22. ConditionalOffer,
  23. Condition,
  24. Benefit) = get_classes('offer.models', ('Range', 'ConditionalOffer',
  25. 'Condition', 'Benefit'))
  26. def create_product(price=None, title="Dummy title",
  27. product_class="Dummy item class",
  28. partner="Dummy partner", partner_sku=None, upc=None, num_in_stock=10,
  29. attributes=None, **kwargs):
  30. """
  31. Helper method for creating products that are used in tests.
  32. """
  33. ic, __ = ProductClass._default_manager.get_or_create(name=product_class)
  34. item = Product._default_manager.create(title=title, product_class=ic,
  35. upc=upc, **kwargs)
  36. if price is not None or partner_sku or num_in_stock is not None:
  37. if not partner_sku:
  38. partner_sku = 'sku_%d_%d' % (item.id, random.randint(0, 10000))
  39. if price is None:
  40. price = D('10.00')
  41. partner, __ = Partner._default_manager.get_or_create(name=partner)
  42. StockRecord._default_manager.create(product=item, partner=partner,
  43. partner_sku=partner_sku,
  44. price_excl_tax=price,
  45. num_in_stock=num_in_stock)
  46. if attributes:
  47. for key, value in attributes.items():
  48. attr, __ = ProductAttribute.objects.get_or_create(
  49. name=key, code=key)
  50. ProductAttributeValue.objects.create(
  51. product=item, attribute=attr, value=value)
  52. return item
  53. def create_order(number=None, basket=None, user=None, shipping_address=None,
  54. shipping_method=None, billing_address=None,
  55. total_incl_tax=None, total_excl_tax=None, **kwargs):
  56. """
  57. Helper method for creating an order for testing
  58. """
  59. if not basket:
  60. basket = Basket.objects.create()
  61. basket.add_product(create_product(price=D('10.00')))
  62. if not basket.id:
  63. basket.save()
  64. if shipping_method is None:
  65. shipping_method = Free()
  66. if total_incl_tax is None or total_excl_tax is None:
  67. calc = OrderTotalCalculator()
  68. total_incl_tax = calc.order_total_incl_tax(basket, shipping_method)
  69. total_excl_tax = calc.order_total_excl_tax(basket, shipping_method)
  70. order = OrderCreator().place_order(
  71. order_number=number,
  72. user=user,
  73. basket=basket,
  74. shipping_address=shipping_address,
  75. shipping_method=shipping_method,
  76. billing_address=billing_address,
  77. total_incl_tax=total_incl_tax,
  78. total_excl_tax=total_excl_tax,
  79. **kwargs)
  80. basket.set_as_submitted()
  81. return order
  82. def create_offer(name="Dummy offer", offer_type="Site",
  83. max_applications=None, range=None, condition=None,
  84. benefit=None):
  85. """
  86. Helper method for creating an offer
  87. """
  88. if range is None:
  89. range = Range.objects.create(name="All products range",
  90. includes_all_products=True)
  91. if condition is None:
  92. condition = Condition.objects.create(range=range,
  93. type=Condition.COUNT,
  94. value=1)
  95. if benefit is None:
  96. benefit = Benefit.objects.create(range=range,
  97. type=Benefit.PERCENTAGE,
  98. value=20)
  99. return ConditionalOffer.objects.create(
  100. name=name,
  101. offer_type=offer_type,
  102. condition=condition,
  103. benefit=benefit,
  104. max_applications=max_applications)
  105. def create_voucher():
  106. """
  107. Helper method for creating a voucher
  108. """
  109. voucher = Voucher.objects.create(
  110. name="Test voucher",
  111. code="test",
  112. start_date=datetime.date.today(),
  113. end_date=datetime.date.today() + datetime.timedelta(days=12))
  114. voucher.offers.add(create_offer())
  115. return voucher