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 21KB

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