Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

v0.6.rst 24KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. =======================
  2. Oscar 0.6 release notes
  3. =======================
  4. Welcome to Oscar 0.6!
  5. These release notes cover the `new features`_ as well as `backwards incompatible changes`_
  6. that you'll want to be aware of when upgrading from Oscar 0.5 or
  7. earlier. This release contains some major changes to core APIs which means
  8. many old APIs are to be dropped - see the `deprecation plan`_ to avoid any
  9. nasty surprises.
  10. To upgrade your Oscar site, make sure you study both the `backwards incompatible changes`_
  11. and the `deprecated features`_. If you have any undocumented issues, please
  12. let us know on the mailing list.
  13. .. _`new features`: `What's new in Oscar 0.6?`_
  14. .. _`upgrading advice`: `Upgrading notes`_
  15. .. _`deprecation plan`: `Features deprecated in 0.6`_
  16. .. _`deprecated features`: `Features deprecated in 0.6`_
  17. .. _`backwards incompatible changes`: `Backwards incompatible changes in 0.6`_
  18. Overview
  19. ========
  20. The biggest change in Oscar 0.6 is the reworking of `pricing and availability`_, which
  21. builds on top of the change to allow `multiple stockrecords per product`_. The
  22. charge is largely backwards compatible with the old system of "partner
  23. wrappers" but it is recommended to upgrade to the new system. Support for
  24. partner wrappers will be removed for Oscar 0.7.
  25. Oscar 0.6 also introduces better support for marketplace-like functionality
  26. with the so-called permission-based dashboard. It is now possible to give
  27. non-staff users access to a subset of the dashboard's views (products and
  28. orders) by setting the new ``dashboard_access`` permission.
  29. `Oscar now supports Django 1.5`_ and its custom user model. This has been only
  30. tested in the context of starting a new Oscar project with a custom model.
  31. Switching from a separate "profile" model to the new system is not recommended
  32. at this point.
  33. Other notable new features include:
  34. * A feature-rich `demo site`_ that illustrates how Oscar can be customised. It
  35. uses several of Oscar's many extensions, such as django-oscar-paypal_,
  36. django-oscar-datacash_ and django-oscar-stores_. It is intended as a
  37. reference site for Oscar.
  38. * `Partners can now have addresses`_.
  39. * `Customer wishlists`_
  40. * `New helper methods`_ in the ``EventHandler`` class for order processing.
  41. * `Reworked seach app`_ with support for easy faceting.
  42. .. _`Oscar now supports Django 1.5`: `Django 1.5 and custom user model support`_
  43. .. _`Partners can now have addresses`: `Partner addresses`_
  44. .. _`Customer wishlists`: `Wishlists`_
  45. .. _`New helper methods`: `Order processing changes`_
  46. What's new in Oscar 0.6?
  47. ========================
  48. Multiple stockrecords per product
  49. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  50. Products can now have multiple stockrecords rather than just one. This allows a
  51. product to be fulfilled by one of several partners. This is a key requirement
  52. for large-scale e-commerce sites selling millions of products, that use many
  53. different fulfillment partners. It also allows products to be sold in
  54. different currencies.
  55. This changes means several APIs are `deprecated`_ as they assume there is only
  56. one stockrecord per product.
  57. .. _`deprecated`: `Features deprecated in 0.6`_
  58. Pricing and availability
  59. ~~~~~~~~~~~~~~~~~~~~~~~~
  60. When products can have many stockrecords, a process needs to be in place to
  61. choose which one is selected for a given customer and product. To handle this,
  62. a new "strategy" class has been introduced which selects the appropriate
  63. stockrecord for a given customer and product.
  64. This change also paved the way for reworking how prices, taxes and availability
  65. are handled. Instead of using `"partner wrappers"`_, the strategy class is
  66. responsible for returning availability details and prices for a particular
  67. product. New classes known as pricing and availabiliy policies are used to
  68. encapsulate this information.
  69. These changes allows Oscar to dynamically choose which stockrecord to use for a
  70. given customer and product. This enables several advanced features such as:
  71. * Fulfilling a product from the partner that offers the best margin.
  72. * Fulfilling a product from the partner geographically closest to the customer.
  73. * Supporting transactions in multiple currencies on the same site.
  74. * Supporting different tax treatments on the same site (eg UK VAT and US sales
  75. tax)
  76. * Having different pricing policies for different customers.
  77. It also provides a customisation layer for custom price and availability logic.
  78. There's a great deal of flexibility. See the guide to
  79. :doc:`prices and availability </topics/prices_and_availability>`
  80. for more information.
  81. Note that the :func:`oscar.templatetags.currency_filters.currency` now
  82. accepts an optional currency parameter.
  83. Permission-based dashboard
  84. ~~~~~~~~~~~~~~~~~~~~~~~~~~
  85. Three changes were necessary to better support marketplace scenarios within
  86. Oscar:
  87. * Oscar's core :class:`oscar.core.application.Application` class now supports
  88. specifying permissions on a per-view basis. This is done via a new default
  89. decorator. Legacy behaviour is unchanged.
  90. * The dashboard's menu's are now built dynamically. If the current user does
  91. not have access to some views in :ref:`OSCAR_DASHBOARD_NAVIGATION`, they will
  92. be omitted in the menu returned by
  93. :meth:`oscar.apps.dashboard.nav.create_menu`.
  94. * The index, catalogue and order dashboard views have been modified to allow
  95. access to non-staff users. See :doc:`/ref/apps/dashboard` for details.
  96. * :attr:`oscar.apps.partner.abstract_models.AbstractPartner.users` was not
  97. used by core Oscar prior 0.6. It is now used to model access for the
  98. permission-based dashboard.
  99. Payment models have abstract versions
  100. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  101. The :doc:`payment models </ref/apps/payment>` have been split into abstract- and
  102. concrete versions. This brings them inline with other Oscar apps and allows
  103. them to be customised.
  104. Wishlists
  105. ~~~~~~~~~
  106. Wishlist functionality has finally landed. Signed in customers are now able to
  107. create multiple named wishlists and add products to them. There is a new
  108. section in the customer's account where wishlists can be managed.
  109. Partner addresses
  110. ~~~~~~~~~~~~~~~~~
  111. Partners can now have addresses. These are useful for US sales tax where tax
  112. calculations need to know the origin of a product being shipped. The dashboard
  113. has been extended to allow partner addresses to be edited.
  114. Checkout
  115. ~~~~~~~~
  116. The :class:`~oscar.apps.checkout.views.PaymentDetailsView` checkout view has
  117. been restructured slightly to be more flexible. There is a new
  118. ``build_submission`` method which is responsible for building a dict of all data
  119. for passing to the ``submit`` method. This includes the shipping address and
  120. shipping method which were previously loaded indirectly within the ``submit``
  121. method. The ``submit`` method has also been extended to take additional parameters.
  122. Demo site
  123. ~~~~~~~~~
  124. Oscar now ships with a demo site along side the sandbox site. While the sandbox
  125. is a minimal Django project that uses Oscar with all its defaults, the demo site
  126. is a more realistic example of an Oscar project. It has a custom skin and makes
  127. many alterations to the default Oscar behaviour.
  128. It's features include:
  129. * A range of different product types: books, downloads, clothing
  130. * PayPal Express integration using django-oscar-paypal_
  131. * Datacash integration using django-oscar-datacash_
  132. .. _django-oscar-paypal: https://github.com/tangentlabs/django-oscar-paypal
  133. .. _django-oscar-datacash: https://github.com/tangentlabs/django-oscar-datacash
  134. .. _django-oscar-stores: https://github.com/tangentlabs/django-oscar-stores
  135. Further reading:
  136. * :doc:`The demo site </internals/sandbox>`.
  137. Django 1.5 and custom user model support
  138. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  139. Oscar now supports `custom user models`_, the headline new feature in Django
  140. 1.5. These can be used standalone or with a one-to-one profile model: Oscar's
  141. account forms inspect the model fields to dynamically pick up the fields for
  142. editing and display.
  143. There are some restrictions on what fields a custom user model must have. For
  144. instance, Oscar's default auth backend requires the user model to have an email
  145. and password field. New Oscar projects are encouraged to use the provided
  146. abstract user model as the base for their users.
  147. Further reading:
  148. * :doc:`How to use a custom user model </howto/use_a_custom_user_model>`.
  149. .. _`custom user models`: https://docs.djangoproject.com/en/dev/topics/auth/customizing/#specifying-a-custom-user-model
  150. .. _`documentation on user models`: https://docs.djangoproject.com/en/dev/topics/auth/customizing/#specifying-a-custom-user-model
  151. Accounts
  152. ~~~~~~~~
  153. The views and templates of the accounts section have been reworked to be clearer
  154. and easier to extend.
  155. Bootstrap-WYSIHTML5 replaced by TinyMCE
  156. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  157. TinyMCE 4.0 is now used in the dashboard for all textareas with class
  158. ``wysiwyg``. This has better browser support and is easier to customise than
  159. bootstrap-wysihtml5.
  160. It is easy to configure or replace with the HTML editor of your choice.
  161. Better bankcard handling
  162. ~~~~~~~~~~~~~~~~~~~~~~~~
  163. The bankcard model in the payment app has been greatly improved.
  164. Customer-facing range pages
  165. ~~~~~~~~~~~~~~~~~~~~~~~~~~~
  166. Ranges can now be flagged as public which means they can be browsed by
  167. customers. They can be used to created curated collections of products.
  168. The core :class:`~oscar.apps.offer.models.Range` model has been extended with a
  169. HTML description field also.
  170. Reworked search app
  171. ~~~~~~~~~~~~~~~~~~~
  172. Oscar's search app has been reviewed and simplified. The main view class has
  173. been reworked to provide better support for faceting, which can be easily
  174. specified using the ``OSCAR_SEARCH_FACETS`` setting.
  175. The ``SuggestionsView`` has been removed as it wasn't being used. A later
  176. version of Oscar will include a replacement.
  177. Order processing changes
  178. ~~~~~~~~~~~~~~~~~~~~~~~~
  179. There are changes to order processing methods
  180. Minor changes
  181. ~~~~~~~~~~~~~
  182. * detox_ is a new dependency, which allows running `tox` tests in parallel.
  183. .. _detox: https://pypi.python.org/pypi/detox
  184. * ``OSCAR_ALLOW_ANON_REVIEWS`` has been a documented setting since Oscar 0.4.
  185. But there's never been any code to support this, so the setting has been
  186. dropped.
  187. Backwards incompatible changes in 0.6
  188. =====================================
  189. Checkout
  190. ~~~~~~~~
  191. Several changes have been made to the checkout classes.
  192. * The ``submit`` method in
  193. :class:`~oscar.apps.checkout.views.PaymentDetailsView` now accepts several
  194. new parameters.
  195. * The ``handle_payment`` method in
  196. :class:`~oscar.apps.checkout.views.PaymentDetailsView` now accepts a
  197. :class:`~oscar.core.prices.Price`` instance instead of a Decimal.
  198. Signature changes
  199. ~~~~~~~~~~~~~~~~~
  200. Several classes and functions have had signature changes:
  201. * The ``basket_form`` templatetag has been altered to take the ``request`` as the
  202. first argument, not ``request.basket``.
  203. * The :class:`oscar.apps.customer.forms.EmailAuthenticationForm` form needs to
  204. be instantated with a host name so prevent redirects to external sites.
  205. * The :class:`oscar.apps.customer.forms.EmailAuthenticationForm` form needs to
  206. be instantated with a host name so prevent redirects to external sites.
  207. * The two product review forms, ``SignedInUserProductReviewForm`` and
  208. ``AnonymousUserProductReviewForm``, have been replaced by a new
  209. :class:`oscar.apps.catalogue.reviews.forms.ProductReviewForm``.
  210. * 3 properties have been removed from
  211. :class:`oscar.apps.catalogue.abstract_models.AbstractProductImage` as they
  212. were unused: ``resized_image_url``, ``fullsize_url`` and ``thumbnail_url``.
  213. Thumbnailing is instead achieved in templates with Sorl.
  214. Loading shipping methods
  215. ~~~~~~~~~~~~~~~~~~~~~~~~
  216. The default implementation of the shipping method repository has been adjusted
  217. to avoid thread-safety issues. If you define your own shipping ``Repository``
  218. class, ensure that your shipping methods are instantiated per-request and not
  219. at compile time.
  220. For example, avoid this:
  221. .. code-block:: python
  222. from oscar.apps.shipping import repository
  223. class Repository(repository.Repository)
  224. methods = [SomeMethod(), AnotherMethod()]
  225. Instead, instantiate the methods within ``get_shipping_methods``:
  226. .. code-block:: python
  227. from oscar.apps.shipping import repository
  228. class Repository(repository.Repository)
  229. # Note, methods are not instantiated
  230. methods = [SomeMethod, AnotherMethod]
  231. Beware of shipping methods that are configured via constructor arguments, like
  232. :class:`~oscar.apps.shipping.methods.FixedPrice`. Shipping methods will be
  233. reworked for Oscar 0.7.
  234. Basket model changes
  235. ~~~~~~~~~~~~~~~~~~~~~
  236. Several properties of the basket ``Line`` model have been renamed:
  237. * ``Line.line_price_excl_tax_and_discounts`` has been renamed to
  238. ``Line.line_price_exlc_tax_incl_discounts``.
  239. * ``Line.line_price_incl_tax_and_discounts`` has been renamed to
  240. ``Line.line_price_inlc_tax_incl_discounts``.
  241. Address model changes
  242. ~~~~~~~~~~~~~~~~~~~~~
  243. * The ``UserAddress.salutation`` and ``UserAddress.name`` methods are now
  244. properties.
  245. * The ``Country`` model's `is_highlighted` column is now an integer field to allow
  246. fine-grained country selection.
  247. Search app changes
  248. ~~~~~~~~~~~~~~~~~~
  249. Some of the names have been simplified.
  250. * The ``MultiFacetedSearchView`` and ``SuggestionsView`` view classes have been
  251. removed. The ``MultiFacetedSeachView`` class is replaced by ``FacetedSearchView``.
  252. * The ``MultiFacetedSearchForm`` has been removed in favour of
  253. ``SearchForm``.
  254. Renamed templates
  255. ~~~~~~~~~~~~~~~~~
  256. Some templates have been renamed for greater consistency. If you are overriding
  257. these templates, ensure you rename your corresponding project templates.
  258. Many of the profile templates have been reorganised:
  259. * ``customer/address_list.html`` is renamed to
  260. ``customer/address/address_list.html``
  261. * ``customer/address_form.html`` is renamed to
  262. ``customer/address/address_form.html``
  263. * ``customer/address_delete.html`` is renamed to
  264. ``customer/address/address_delete.html``
  265. * ``customer/email.html`` is renamed to
  266. ``customer/email/email_detail.html``
  267. * ``customer/email_list.html`` is renamed to
  268. ``customer/email/email_list.html``
  269. * ``customer/order.html`` is renamed to
  270. ``customer/order/order_detail.html``
  271. * ``customer/order_list.html`` is renamed to
  272. ``customer/order/order_list.html``
  273. * ``customer/profile.html`` is renamed to
  274. ``customer/profile/profile.html``
  275. * ``customer/profile_form.html`` is renamed to
  276. ``customer/profile/profile_form.html``
  277. * ``customer/change_password_form.html`` is renamed to
  278. ``customer/profile/change_password_form.html``
  279. * ``partials/nav_profile.html`` has been removed.
  280. Template block changes
  281. ~~~~~~~~~~~~~~~~~~~~~~
  282. * The template ``dashboard/orders/order_detail.html`` has been reorganised. The
  283. ``tab_transactions`` block has been renamed to ``payment_transactions``.
  284. * In ``checkout/checkout.html``, the ``checkout-nav`` block has been renamed
  285. ``checkout_nav``.
  286. Account templates
  287. ~~~~~~~~~~~~~~~~~
  288. The templates for the customer account section have been reworked so that the
  289. profile page is much simpler. Content is no longer loaded into tabs on a single
  290. page; instead, separate pages are used to each section.
  291. Additional apps
  292. ~~~~~~~~~~~~~~~
  293. To enable dynamic loading of dashboard `Application` classes, two new apps are required
  294. in your ``INSTALLED_APPS``:
  295. .. code-block:: python
  296. INSTALLED_APPS = (
  297. ...
  298. 'oscar.apps.dashboard.pages',
  299. 'oscar.apps.dashboard.reviews',
  300. ...
  301. )
  302. If you are using the ``get_core_apps`` helper function, then these new apps
  303. will be added automatically. Neither of these apps contains models so no
  304. database schema changes are required.
  305. Changes to Partner permissions
  306. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  307. The following permissions on the
  308. :class:`~oscar.apps.partner.abstract_models.AbstractPartner` model were not
  309. used in Oscar and have been removed to avoid confusion with the newly
  310. introduced permission-based dashboard:
  311. * ``can_edit_stock_records``
  312. * ``can_view_stock_records``
  313. * ``can_edit_product_range``
  314. * ``can_view_product_range``
  315. * ``can_edit_order_lines``
  316. * ``can_view_order_lines``
  317. The permission-based dashboard introduced a new permission:
  318. * ``dashboard_access``
  319. Upgrading notes
  320. ===============
  321. * Alternative product class templates now use ``slug` field instead of
  322. ``name.lower()`` to determine their filename. If you have templates for
  323. specific product classes, please update your filenames accordingly
  324. Checkout app:
  325. * Checkout has a new option "Register and continue". Option value `new` in
  326. `GatewayForm` has changed to `guest` as `new` option is used for this feature.
  327. * Payment details - create_billing_address accepts kwargs so data can be passed
  328. to it from the final page of checkout.
  329. * The session methods for loading shipping addresses and methods have been made
  330. explicit. The relevant basket *has* to be passed in now.
  331. Payment app:
  332. * The `balance` method on the source object is not a property not a method.
  333. URLs
  334. ~~~~
  335. Migrations
  336. ~~~~~~~~~~
  337. There are new migrations in the following apps to be aware of.
  338. * Catalogue:
  339. - ``0011``: Higher ``max_length`` on FileFields and ImageFields
  340. * Promotions:
  341. - ``0003``: Higher ``max_length`` on FileFields and ImageFields
  342. * Address:
  343. - ``0003``: ``Country``'s ``is_highlighted`` is now an integer to allow
  344. finer control.
  345. * ShippingAddress:
  346. - ``0018``: ``ShippingAddress``'s ``phone_number`` is now a PhoneNumberField
  347. to allow fine validation.
  348. * Order app:
  349. - The `date` field of the ``order.AbstractCommunicationEvent``, ``order.AbstractPaymentEvent`` and
  350. ``order.AbstractShippingEvent`` models have been renamed to ``date_created`` for
  351. consistency with the rest of Oscar.
  352. Order app:
  353. * ``0015``: Unused ``sequence_number`` and ``is_required`` deleted from
  354. ``ShippingEventType``. Unused ``sequence_number`` deleted from
  355. ``PaymentEventType``.
  356. Offer app:
  357. * ``0021``: Add a ``slug`` field to the :class:`~oscar.apps.offer.models.Range` model.
  358. * ``0022``: A data migration to populate the new range slug field.
  359. * ``0023``: Add a ``is_public`` field to the :class:`~oscar.apps.offer.models.Range` model.
  360. * ``0024``: Add a ``description`` field to the :class:`~oscar.apps.offer.models.Range` model.
  361. Features deprecated in 0.6
  362. ==========================
  363. Accessing a product's stockrecords
  364. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  365. Several properties and methods of the core
  366. :class:`~oscar.apps.catalogue.abstract_models.AbstractProduct` class have been
  367. deprecated following the change to allow multiple stockrecords per product.
  368. * :attr:`~oscar.apps.catalogue.abstract_models.AbstractProduct.has_stockrecord`
  369. no longer makes sense when there can be more than one stockrecord. It is
  370. replaced by
  371. :attr:`~oscar.apps.catalogue.abstract_models.AbstractProduct.has_stockrecords`
  372. * :attr:`~oscar.apps.catalogue.abstract_models.AbstractProduct.stockrecord` is
  373. deprecated since it presumes there is only one stockrecord per product.
  374. Choosing the appropriate stockrecord is now the responsiblity of the
  375. :ref:`strategy class <strategy_class>`. A backward compatible version has
  376. been kept in place that selects the first stockrecord for a product. This
  377. will continue to work for sites that only have one stockrecord per product.
  378. All availability logic has been moved to :ref:`availability policies<availability_policies>`
  379. which are determined by the :ref:`strategy class <strategy_class>`.
  380. * :attr:`~oscar.apps.catalogue.abstract_models.AbstractProduct.is_available_to_buy`
  381. is deprecated. The functionality is now part of availability policies.
  382. * :meth:`~oscar.apps.catalogue.abstract_models.AbstractProduct.is_purchase_permitted`
  383. is deprecated. The functionality is now part of availability policies.
  384. Checkout session manager
  385. ~~~~~~~~~~~~~~~~~~~~~~~~
  386. The ``shipping_method`` method of the
  387. :class:`~oscar.apps.checkout.utils.CheckoutSessionData` is now deprecated in
  388. favour of using ``shipping_method_code``. It is being removed as the
  389. ``CheckoutSessionData`` class should only be responsible for retriving data
  390. from the session, not loading shipping method instances.
  391. "Partner wrappers"
  392. ~~~~~~~~~~~~~~~~~~
  393. Before Oscar 0.6, availability and pricing logic was encapsulated in "partner
  394. wrappers". A partner wrapper was a class that provided availability and price
  395. information for a particular partner, as specified by the
  396. ``OSCAR_PARTNER_WRAPPERS`` setting. The stockrecord model had several
  397. properties and methods
  398. which delegated to the appropriate wrapper for the record's partner.
  399. This functionailty is now deprecated in favour of using :ref:`strategy classes <strategy_class>`.
  400. How prices and taxes are determined is not generally a function of the partner,
  401. and so this system was not a good model. Strategy classes are much more
  402. flexible and allow better modelling of taxes and availability.
  403. The following attributes and methods from :class:`~oscar.apps.partner.abstract_models.StockRecord`
  404. are deprecated and will be removed for Oscar 0.7.
  405. * :attr:`AbstractStockRecord.is_available_to_buy <oscar.apps.partner.abstract_models.AbstractStockRecord.is_available_to_buy>`
  406. * :meth:`AbstractStockRecord.is_purchase_permitted <oscar.apps.partner.abstract_models.AbstractStockRecord.is_purchase_permitted>`
  407. * :attr:`AbstractStockRecord.availability_code <oscar.apps.partner.abstract_models.AbstractStockRecord.availability_code>`
  408. * :attr:`AbstractStockRecord.availability <oscar.apps.partner.abstract_models.AbstractStockRecord.availability>`
  409. * :attr:`AbstractStockRecord.max_purchase_quantity <oscar.apps.partner.abstract_models.AbstractStockRecord.max_purchase_quantity>`
  410. * :attr:`AbstractStockRecord.dispatch_date <oscar.apps.partner.abstract_models.AbstractStockRecord.dispatch_date>`
  411. * :attr:`AbstractStockRecord.lead_time <oscar.apps.partner.abstract_models.AbstractStockRecord.lead_time>`
  412. * :attr:`AbstractStockRecord.price_incl_tax <oscar.apps.partner.abstract_models.AbstractStockRecord.price_incl_tax>`
  413. * :attr:`AbstractStockRecord.price_tax <oscar.apps.partner.abstract_models.AbstractStockRecord.price_tax>`
  414. All the above properties and methods have effectively been moved to the availability and pricing
  415. policies that a strategy class is responsible for loading. To upgrade your
  416. codebase, replcae your partner wrapper classes with equivalent
  417. :doc:`availability and pricing policies </topics/prices_and_availability>`.
  418. Basket
  419. ~~~~~~~
  420. Now that products can have multiple stockrecords, several changes have been made
  421. to baskets to allow the appropriate stockrecord to be tracked for each basket
  422. line. The basket line model has a new field that links to the selected
  423. stockrecord and the basket itself requires an instance of the strategy class so
  424. that prices can be calculated for each line. Hence, if you are manipulating
  425. baskets directly, you need to assign a strategy class in order for prices to
  426. calculate correctly:
  427. .. code-block:: python
  428. from oscar.apps.basket import models
  429. basket = models.Basket.objects.get(id=1)
  430. basket.strategy = request.strategy
  431. With an assigned strategy class, a basket will raise a ``RuntimeError`` when
  432. attempting to calculate totals.
  433. The way a product is added to a basket has also been changed as a ``StockInfo``
  434. instance is also required.
  435. .. code-block:: python
  436. from oscar.apps.basket import models
  437. from oscar.apps.catalogue import models as product_models
  438. basket = models.Basket.objects.get(id=1)
  439. basket.strategy = request.strategy
  440. product = product_models.Product.objects.get(id=1)
  441. stockinfo = request.strategy.fetch(product)
  442. basket.
  443. Test support extension brought back into core
  444. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  445. The `Oscar test support library`_ has been ported back into Oscar core. This
  446. simplifies things and avoids circular dependency issues. If your project is
  447. using this extension, you should remove it as a dependency and use the
  448. analogous functionality from ``oscar/test/``.
  449. .. _`Oscar test support library`: https://github.com/tangentlabs/django-oscar-testsupport