Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. =======================
  2. Oscar 2.0 release notes
  3. =======================
  4. :release: tbd
  5. Welcome to Oscar 2.0
  6. Table of contents:
  7. .. contents::
  8. :local:
  9. :depth: 1
  10. .. _compatibility_of_2.0:
  11. Compatibility
  12. -------------
  13. Oscar 2.0 is compatible with Django 1.11, Django 2.0 and Django 2.1 as well as
  14. Python 3.5 and 3.6.
  15. Support for Python 2.7 and Python 3.4 has been dropped.
  16. .. _new_in_2.0:
  17. What's new in Oscar 2.0?
  18. ------------------------
  19. - Added an ``order.OrderStatusChange`` model that is used to log order status changes
  20. applied by ``Order.set_status()``. This is a new model which will require database migrations to be applied.
  21. - Added an ``OSCAR_OFFERS_INCL_TAX`` setting which can be used to configure whether
  22. offer discounts are applied on the tax-inclusive amount. This defaults to ``False``,
  23. to preserve the original behaviour of discount application.
  24. - Added database index definitions for commonly queried fields in a range of models. See `#2875`_.
  25. This will require projects that have forked Oscar apps to generate corresponding migrations.
  26. .. _`#2875`: https://github.com/django-oscar/django-oscar/pull/2875
  27. Removal of deprecated features
  28. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  29. - Support for deprecated product alert email templates was removed The templates
  30. for these emails have been replaced as follows:
  31. - ``customer/alerts/emails/confirmation_subject.txt`` is replaced by
  32. ``customer/emails/commtype_product_alert_confirmation_subject.txt``
  33. - ``customer/alerts/emails/confirmation_body.txt`` is replaced by
  34. ``customer/emails/commtype_product_alert_confirmation_body.txt``
  35. - ``customer/alerts/emails/alert_subject.txt`` is replaced by
  36. ``customer/emails/commtype_product_alert_subject.txt``
  37. - ``customer/alerts/emails/alert_body.txt`` is replaced by
  38. ``customer/emails/commtype_product_alert_body.txt``
  39. Product alert emails are now sent as Communication Events.
  40. - Support for category URLs without a primary key was removed.
  41. Enforcement of unique slugs for categories was also removed, as enforcing
  42. this was inefficient and not threadsafe. Since a primary key is now required
  43. for category URLs, there is no need for slugs to be unique.
  44. - ``customer.forms.SetPasswordForm`` and ``customer.forms.PasswordChangeForm``
  45. have been removed. Use ``django.contrib.auth.forms.SetPasswordForm`` and
  46. ``django.contrib.auth.forms.PasswordChangeForm`` instead.
  47. - The ``views.decorators.staff_member_required`` decorator has been removed. Use
  48. ``permissions_required(['is_staff']`` instead.
  49. - The ``UserAddress.num_orders`` property has been removed. Use
  50. ``num_orders_as_shipping_address`` and ``num_orders_as_billing_address``
  51. instead.
  52. - Backward-compatible dynamic loading of formset classes that have moved in Oscar was
  53. removed. Projects must update their ``get_class`` calls to use the new paths.
  54. The paths that have changed are as follows:
  55. ================================ ================================== ================
  56. Old path New path Affected classes
  57. ================================ ================================== ================
  58. ``basket.forms`` ``basket.formsets`` ``BaseBasketLineFormSet``
  59. ``BasketLineFormSet``
  60. ``BaseSavedLineFormSet``
  61. ``SavedLineFormSet``
  62. ``dashboard.catalogue.forms`` ``dashboard.catalogue.formsets`` ``BaseStockRecordFormSet``
  63. ``StockRecordFormSet``
  64. ``BaseProductCategoryFormSet``
  65. ``ProductCategoryFormSet``
  66. ``BaseProductImageFormSet``
  67. ``ProductImageFormSet``
  68. ``BaseProductRecommendationFormSet``
  69. ``ProductRecommendationFormSet``
  70. ``ProductAttributesFormSet``
  71. ``dashboard.promotions.forms`` ``dashboard.promotions.formsets`` ``OrderedProductFormSet``
  72. ``wishlists.forms`` ``wishlists.formsets`` ``LineFormset``
  73. ================================ ================================== ================
  74. - Added the ability to manage ``catalogue.Option`` objects from the dashboard.
  75. Minor changes
  76. ~~~~~~~~~~~~~
  77. - Dropped ``action=""`` and ``action="."`` attributes, following the lead of Django
  78. and as per the HTML5 specification.
  79. - Replaced use of Django's procedural auth views with the corresponding
  80. class-based views.
  81. - ``OrderPlacementMixin.get_message_context()`` is now passed a ``code`` argument
  82. specifying the communication event type code for a message being sent.
  83. - We've dropped the dependency on Unidecode due to license incompatibilities,
  84. ``oscar.core.utils.default_slugifier`` now uses ``oscar.core.utils.cautious_slugify``
  85. to handle unicode characters in slugs when ``OSCAR_SLUG_ALLOW_UNICODE`` is ``False``.
  86. - ``OSCAR_SLUG_FUNCTION`` previously accepted a function as its value. It now
  87. only accepts a dotted path to a function as its value. Such functions must
  88. also now take a ``allow_unicode`` kwarg.
  89. - Fixed input validation for ``dashboard.offers.forms.BenefitForm`` when a ``range``
  90. was specified but other fields were empty.
  91. - Fixed calculation of weight-based shipping charges in cases where the basket
  92. weight is an exact multiple of a weight band's upper limit.
  93. - The ``sort_by`` field on ``catalogue.reviews.SortReviewsForm`` was made optional
  94. and the logic in ``ProductReviewList`` adjusted so that the form fields
  95. don't have to be rendered manually because of form errors.
  96. - Added a ``datetime_filters`` tag library that provides a ``timedelta`` template
  97. filter for rendering time deltas in human readable format.
  98. - ``OSCAR_OFFER_ROUNDING_FUNCTION`` previously accepted a function as its value. It now
  99. only accepts a dotted path to a function as its value
  100. - Fixed the logic of ``offers.Range.all_products()`` to make it consistent with
  101. ``Range.contains_product()`` in excluding products specified in ``excluded_product_ids``.
  102. - Added a ``COMPARISON_FIELDS`` constant to ``catalogue.Category`` to restrict
  103. which fields are fetched from the database when performing category comparison queries.
  104. - Significantly improved the database efficiency of the ``category_tree`` template tag.
  105. - Order confirmation emails now include an order status link for authenticated users, as well as guest users, and order status is displayed consistently in both logged-in and anonymous order detail views.
  106. - Fixed display of styled HTML emails in account email detail views, wrapping them in an iframe to avoid leakage of styles into the page.
  107. .. _incompatible_in_2.0:
  108. Backwards incompatible changes in Oscar 2.0
  109. -------------------------------------------
  110. - Redirection to the parent detail view for child products is disabled by default.
  111. Child products now have their own detail view, which allows displaying their price
  112. and images independently from the parent product. To revert to the previous behaviour
  113. of redirecting to the parent product, set
  114. ``oscar.apps.catalogue.views.ProductDetailView.enforce_parent`` to ``False``.
  115. - Renamed the modules containing the Django app config classes for Oscar apps
  116. (apart from the ``oscar`` app), from ``config`` to ``apps``.
  117. - Removed the ``app`` modules of Oscar apps, moving the configs (related to
  118. permissions, URLconfs, and feature hiding) they contained into the apps'
  119. Django app config classes. They include the following attributes: ``name``
  120. (since renamed ``namespace``), ``login_url``, ``hidable_feature_name``,
  121. ``permissions_map``, and ``default_permissions``; methods:
  122. :meth:``get_urls``, :meth:``post_process_urls``, :meth:``get_permissions``,
  123. :meth:``get_url_decorator``, and :meth:``urls``; and their respective view
  124. classes. The composite config classes for normal Oscar apps are subclasses of
  125. ``oscar.core.application.OscarConfig`` (previously
  126. ``oscar.core.application.Application``), and for Oscar Dashboard apps
  127. ``oscar.core.application.OscarDashboardConfig`` (previously
  128. ``oscar.core.application.DashboardApplication``).
  129. - Removed the ``application`` variable, which previously held an Oscar app
  130. config instance, from the Oscar app config module. A single Django/Oscar app
  131. config instance is now registered in the Django app registry, for each app
  132. label. It should be obtained by looking it up in the Django app registry.
  133. - Changed the values returned by the Oscar app config ``urls`` property. It now
  134. returns a tuple containing the list of URL patterns, the app namespace (which
  135. could previously be None, but not any more), and the instance namespace
  136. (which would previously be overiden by the app namespace, if left blank, but
  137. must now be explicitly set). To include URLs with an instance namespace, use
  138. the form ``app_config.urls``, and to include URLs without an instance
  139. namespace, use the form ``django.conf.urls.include(app_config.urls[0])``.
  140. - Removed :meth:``oscar.get_core_apps``. Overridding apps is now done by
  141. replacing the Oscar app entry in the ``INSTALLED_APPS`` setting with that of
  142. the forked app.
  143. - Changed the calling signature for the ``oscar_fork_app`` management command.
  144. The ``app_label`` argument is the Django app label of the app to be forked.
  145. ``target_path`` is the directory into which the new app shall be copied.
  146. ``new_app_subpackage`` is the optional dotted path to the subpackage of the
  147. new app, from which, together with the ``target_path``, the full Python path
  148. to the app will be derived. If a ``new_app_subpackage`` is omitted, then the
  149. subpackage of the app being forked will be used instead.
  150. Migrating forked apps
  151. ~~~~~~~~~~~~~~~~~~~~~
  152. - For each forked app:
  153. - Rename the module that contains the Django app config class, from
  154. ``config.py`` to ``apps.py``.
  155. - Change the ``default_app_config`` variable in the ``__.init__.py`` module to
  156. point to the new Django app config class.
  157. - Change the Django app config class's inheritance base class to the one in
  158. the parent app's ``apps`` module (it should be a
  159. ``oscar.core.application.OscarConfig`` or
  160. ``oscar.core.application.OscarDashboardConfig`` subclass).
  161. - Move the Oscar app configs from the ``oscar.core.application.Application``
  162. or ``oscar.core.application.DashboardApplication`` subclass in its
  163. ``app.py`` module, to the corresponding
  164. ``oscar.core.application.OscarConfig`` or
  165. ``oscar.core.application.OscarDashboardConfig`` subclass in the ``apps.py``
  166. module.
  167. - These include the following overridden attributes:
  168. - Rename ``name`` to ``namespace``
  169. - ``login_url``
  170. - ``hidable_feature_name``
  171. - ``permissions_map``
  172. - ``default_permissions``
  173. - These include the following overridden methods:
  174. - :meth:``get_urls``
  175. - :meth:``post_process_urls``
  176. - :meth:``get_permissions``
  177. - :meth:``get_url_decorator``
  178. - :meth:``urls``
  179. - For URLconfs that include Oscar app URLs (e.g. in the ``dashboard`` app):
  180. - Obtain the app's Django/Oscar app config instance from the Django app
  181. registry, instead of from the app's previous config module's (``app.py``)
  182. ``application`` variable.
  183. - If the to-be-included URLs have an instance namespace, use the form
  184. ``app_config.urls``, which passes in the list of URL patterns, the app
  185. namespace, and the instance namespace.
  186. - If the to-be-included URLs do not have an instance namespace, use the
  187. form ``include(app_config.urls[0])``, which only passes in the list of
  188. URL patterns.
  189. - For the main app's URLconf:
  190. - Obtain the ``oscar`` app's Django/Oscar app config instance from the Django
  191. app registry, instead of from the previous config module's (``config.py``)
  192. ``application`` variable.
  193. - Include the ``oscar`` app's URLs using the form
  194. ``include(app_config.urls[0])``, to only pass in the list of URL patterns,
  195. and not an app or instance namespace.
  196. Dependency changes
  197. ------------------
  198. - Upgraded TinyMCE to version 4.8.3.
  199. - Upgraded jQuery inputmask to version 4.0.2.
  200. .. _deprecated_features_in_2.0:
  201. Deprecated features
  202. ~~~~~~~~~~~~~~~~~~~
  203. - ``offer.Range.contains()`` is deprecated. Use ``contains_product()`` instead.
  204. - ``catalogue.managers.ProductManager`` is deprecated.
  205. Use ``catalogue.managers.ProductQuerySet.as_manager()`` instead.
  206. - ``catalogue.managers.BrowsableProductManager`` is deprecated.
  207. Use ``Product.objects.browsable()`` instead.