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.

factories.py 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. from decimal import Decimal as D
  2. import random
  3. import datetime
  4. from django.db.models import get_model
  5. from django.conf import settings
  6. from oscar.apps.partner import strategy, availability, prices
  7. from oscar.core.loading import get_class
  8. from oscar.apps.offer import models
  9. Basket = get_model('basket', 'Basket')
  10. Free = get_class('shipping.methods', 'Free')
  11. Voucher = get_model('voucher', 'Voucher')
  12. OrderCreator = get_class('order.utils', 'OrderCreator')
  13. OrderTotalCalculator = get_class('checkout.calculators',
  14. 'OrderTotalCalculator')
  15. Partner = get_model('partner', 'Partner')
  16. StockRecord = get_model('partner', 'StockRecord')
  17. Product = get_model('catalogue', 'Product')
  18. ProductClass = get_model('catalogue', 'ProductClass')
  19. ProductAttribute = get_model('catalogue', 'ProductAttribute')
  20. ProductAttributeValue = get_model('catalogue', 'ProductAttributeValue')
  21. def create_stockrecord(product=None, price_excl_tax=None, partner_sku=None,
  22. num_in_stock=None, partner_name="Dummy partner",
  23. currency=settings.OSCAR_DEFAULT_CURRENCY):
  24. if product is None:
  25. product = create_product()
  26. partner, __ = Partner.objects.get_or_create(
  27. name=partner_name)
  28. if not price_excl_tax:
  29. price_excl_tax = D('9.99')
  30. if not partner_sku:
  31. partner_sku = 'sku_%d_%d' % (product.id, random.randint(0, 10000))
  32. return product.stockrecords.create(
  33. partner=partner, partner_sku=partner_sku,
  34. price_currency=currency,
  35. price_excl_tax=price_excl_tax, num_in_stock=num_in_stock)
  36. def create_stockinfo(record):
  37. return strategy.StockInfo(
  38. price=prices.FixedPrice(
  39. record.price_currency,
  40. record.price_excl_tax,
  41. D('0.00') # Default to no tax
  42. ),
  43. availability=availability.DelegateToStockRecord(record),
  44. stockrecord=record
  45. )
  46. def create_product(upc=None, title=u"Dummy title",
  47. product_class=u"Dummy item class",
  48. partner=u"Dummy partner", partner_sku=None, price=None,
  49. num_in_stock=None, attributes=None, **kwargs):
  50. """
  51. Helper method for creating products that are used in tests.
  52. """
  53. product_class, __ = ProductClass._default_manager.get_or_create(
  54. name=product_class)
  55. product = product_class.products.model(
  56. product_class=product_class,
  57. title=title, upc=upc, **kwargs)
  58. if attributes:
  59. for code, value in attributes.items():
  60. # Ensure product attribute exists
  61. product_class.attributes.get_or_create(
  62. name=code, code=code)
  63. setattr(product.attr, code, value)
  64. product.save()
  65. # Shortcut for creating stockrecord
  66. if price is not None or partner_sku or num_in_stock is not None:
  67. create_stockrecord(product, price_excl_tax=price,
  68. partner_sku=partner_sku, num_in_stock=num_in_stock)
  69. return product
  70. def create_basket(empty=False):
  71. basket = Basket.objects.create()
  72. basket.strategy = strategy.Default()
  73. if not empty:
  74. product = create_product()
  75. create_stockrecord(product)
  76. basket.add_product(product)
  77. return basket
  78. def create_order(number=None, basket=None, user=None, shipping_address=None,
  79. shipping_method=None, billing_address=None,
  80. total=None, **kwargs):
  81. """
  82. Helper method for creating an order for testing
  83. """
  84. if not basket:
  85. basket = Basket.objects.create()
  86. basket.strategy = strategy.Default()
  87. product = create_product()
  88. create_stockrecord(
  89. product, num_in_stock=10, price_excl_tax=D('10.00'))
  90. basket.add_product(product)
  91. if not basket.id:
  92. basket.save()
  93. if shipping_method is None:
  94. shipping_method = Free()
  95. if total is None:
  96. total = OrderTotalCalculator().calculate(basket, shipping_method)
  97. order = OrderCreator().place_order(
  98. order_number=number,
  99. user=user,
  100. basket=basket,
  101. shipping_address=shipping_address,
  102. shipping_method=shipping_method,
  103. billing_address=billing_address,
  104. total=total,
  105. **kwargs)
  106. basket.set_as_submitted()
  107. return order
  108. def create_offer(name="Dummy offer", offer_type="Site",
  109. max_basket_applications=None, range=None, condition=None,
  110. benefit=None):
  111. """
  112. Helper method for creating an offer
  113. """
  114. if range is None:
  115. range = models.Range.objects.create(name="All products range",
  116. includes_all_products=True)
  117. if condition is None:
  118. condition = models.Condition.objects.create(
  119. range=range, type=models.Condition.COUNT, value=1)
  120. if benefit is None:
  121. benefit = models.Benefit.objects.create(
  122. range=range, type=models.Benefit.PERCENTAGE, value=20)
  123. return models.ConditionalOffer.objects.create(
  124. name=name,
  125. offer_type=offer_type,
  126. condition=condition,
  127. benefit=benefit,
  128. max_basket_applications=max_basket_applications)
  129. def create_voucher():
  130. """
  131. Helper method for creating a voucher
  132. """
  133. voucher = Voucher.objects.create(
  134. name="Test voucher",
  135. code="test",
  136. start_date=datetime.date.today(),
  137. end_date=datetime.date.today() + datetime.timedelta(days=12))
  138. voucher.offers.add(create_offer(offer_type='Voucher'))
  139. return voucher