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.

v0.6.rst 25KB

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