1.2.rst 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. =========================
  2. Wagtail 1.2 release notes
  3. =========================
  4. .. contents::
  5. :local:
  6. :depth: 1
  7. What's new
  8. ==========
  9. Site settings module
  10. ~~~~~~~~~~~~~~~~~~~~
  11. Wagtail now includes a contrib module (previously available as the `wagtailsettings <https://pypi.python.org/pypi/wagtailsettings/>`_ package) to allow administrators to edit site-specific settings.
  12. See: :doc:`/reference/contrib/settings`
  13. Jinja2 support
  14. ~~~~~~~~~~~~~~
  15. The core templatetags (``pageurl``, ``slugurl``, ``image``, ``richtext`` and ``wagtailuserbar``) are now compatible with Jinja2 so it's now possible to use Jinja2 as the template engine for your Wagtail site.
  16. Note that the variable name ``self`` is reserved in Jinja2, and so Wagtail now provides alternative variable names where ``self`` was previously used: ``page`` to refer to page objects, and ``value`` to refer to StreamField blocks. All code examples in this documentation have now been updated to use the new variable names, for compatibility with Jinja2; however, users of the default Django template engine can continue to use ``self``.
  17. See: :doc:`/advanced_topics/jinja2`
  18. Site-specific redirects
  19. ~~~~~~~~~~~~~~~~~~~~~~~
  20. You can now create redirects for a particular site using the admin interface.
  21. Search API improvements
  22. ~~~~~~~~~~~~~~~~~~~~~~~
  23. Wagtail's image and document models now provide a ``search`` method on their QuerySets, making it easy to perform searches on filtered data sets. In addition, search methods now accept two new keyword arguments:
  24. * ``operator``, to determine whether multiple search terms will be treated as 'or' (any term may match) or 'and' (all terms must match);
  25. * ``order_by_relevance``, set to True (the default) to order by relevance or False to preserve the QuerySet's original ordering.
  26. See: :ref:`wagtailsearch_searching`
  27. ``max_num`` and ``min_num`` parameters on inline panels
  28. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  29. Inline panels now accept the optional parameters ``max_num`` and ``min_num``, to specify the maximum / minimum number of child items that must exist in order for the page to be valid.
  30. See: :ref:`inline_panels`
  31. ``get_context`` on StreamField blocks
  32. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  33. StreamField blocks now :ref:`provide a get_context method <streamfield_get_context>` that can be overridden to pass additional variables to the block's template.
  34. Browsable API
  35. ~~~~~~~~~~~~~
  36. The Wagtail API now incorporates the browsable front-end provided by Django REST Framework. Note that this must be enabled by adding ``'rest_framework'`` to your project's ``INSTALLED_APPS`` setting.
  37. Python 3.5 support
  38. ~~~~~~~~~~~~~~~~~~
  39. Wagtail now supports Python 3.5 when run in conjunction with Django 1.8.6 or later.
  40. Minor features
  41. ~~~~~~~~~~~~~~
  42. * WagtailRedirectMiddleware can now ignore the query string if there is no redirect that exactly matches it
  43. * Order of URL parameters now ignored by redirect middleware
  44. * Added SQL Server compatibility to image migration
  45. * Added classnames to Wagtail rich text editor buttons to aid custom styling
  46. * Simplified body_class in default homepage template
  47. * page_published signal now called with the revision object that was published
  48. * Added a favicon to the admin interface, customisable by overriding the ``branding_favicon`` block (see :ref:`custom_branding`).
  49. * Added spinner animations to long-running form submissions
  50. * The EMBEDLY_KEY setting has been renamed to WAGTAILEMBEDS_EMBEDLY_KEY
  51. * StreamField blocks are now added automatically, without showing the block types menu, if only one block type exists (Alex Gleason)
  52. * The ``first_published_at`` and ``latest_revision_created_at`` fields on page models are now available as filter fields on search queries
  53. * Wagtail admin now standardises on a single thumbnail image size, to reduce the overhead of creating multiple renditions
  54. * Rich text fields now strip out HTML comments
  55. * Page editor form now sets ``enctype="multipart/form-data"`` as appropriate, allowing FileField to be used on page models (Petr Vacha)
  56. * Explorer navigation menu on a completely empty page tree now takes you to the root level, rather than doing nothing
  57. * Added animation and fixed display issues when focusing a rich text field (Alex Gleason)
  58. * Added a system check to warn if Pillow is compiled without JPEG / PNG support
  59. * Page chooser now prevents users from selecting the root node where this would be invalid
  60. * New translations for Dutch (Netherlands), Georgian, Swedish and Turkish (Turkey)
  61. Bug fixes
  62. ~~~~~~~~~
  63. * Page slugs are no longer auto-updated from the page title if the page is already published
  64. * Deleting a page permission from the groups admin UI does not immediately submit the form
  65. * Wagtail userbar is shown on pages that do not pass a ``page`` variable to the template (e.g. because they override the ``serve`` method)
  66. * ``request.site`` now set correctly on page preview when the page is not in the default site
  67. * Project template no longer raises a deprecation warning (Maximilian Stauss)
  68. * ``PageManager.sibling_of(page)`` and ``PageManager.not_sibling_of(page)`` now default to inclusive (i.e. ``page`` is considered a sibling of itself), for consistency with other sibling methods
  69. * The "view live" button displayed after publishing a page now correctly reflects any changes made to the page slug (Ryan Pineo)
  70. * API endpoints now accept and ignore the ``_`` query parameter used by jQuery for cache-busting
  71. * Page slugs are no longer cut off when Unicode characters are expanded into multiple characters (Sævar Öfjörð Magnússon)
  72. * Searching a specific page model while filtering it by either ID or tree position no longer raises an error (Ashia Zawaduk)
  73. * Scrolling an over-long explorer menu no longer causes white background to show through (Alex Gleason)
  74. * Removed jitter when hovering over StreamField blocks (Alex Gleason)
  75. * Non-ASCII email addresses no longer throw errors when generating Gravatar URLs (Denis Voskvitsov, Kyle Stratis)
  76. * Dropdown for ``ForeignKey`` s are now styled consistently (Ashia Zawaduk)
  77. * Date choosers now appear on top of StreamField menus (Sergey Nikitin)
  78. * Fixed a migration error that was raised when block-updating from 0.8 to 1.1+
  79. * :meth:`Page.copy() <wagtail.wagtailcore.models.Page.copy>` no longer breaks on models with a ``ClusterTaggableManager`` or ``ManyToManyField``
  80. * Validation errors when inserting an embed into a rich text area are now reported back to the editor
  81. Upgrade considerations
  82. ======================
  83. ``PageManager.sibling_of(page)`` and ``PageManager.not_sibling_of(page)`` have changed behaviour
  84. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  85. In previous versions of Wagtail, the ``sibling_of`` and ``not_sibling_of`` methods behaved inconsistently depending on whether they were called on a manager (e.g. ``Page.objects.sibling_of(some_page)`` or ``EventPage.objects.sibling_of(some_page)``) or a QuerySet (e.g. ``Page.objects.all().sibling_of(some_page)`` or ``EventPage.objects.live().sibling_of(some_page)``).
  86. Previously, the manager methods behaved as *exclusive* by default; that is, they did not count the passed-in page object as a sibling of itself:
  87. .. code-block:: python
  88. >>> event_1 = EventPage.objects.get(title='Event 1')
  89. >>> EventPage.objects.sibling_of(event_1)
  90. [<EventPage: Event 2>] # OLD behaviour: Event 1 is not considered a sibling of itself
  91. This has now been changed to be *inclusive* by default; that is, the page is counted as a sibling of itself:
  92. .. code-block:: python
  93. >>> event_1 = EventPage.objects.get(title='Event 1')
  94. >>> EventPage.objects.sibling_of(event_1)
  95. [<EventPage: Event 1>, <EventPage: Event 2>] # NEW behaviour: Event 1 is considered a sibling of itself
  96. If the call to ``sibling_of`` or ``not_sibling_of`` is chained after another QuerySet method - such as ``all()``, ``filter()`` or ``live()`` - behaviour is unchanged; this behaves as *inclusive*, as it did in previous versions:
  97. .. code-block:: python
  98. >>> event_1 = EventPage.objects.get(title='Event 1')
  99. >>> EventPage.objects.all().sibling_of(event_1)
  100. [<EventPage: Event 1>, <EventPage: Event 2>] # OLD and NEW behaviour
  101. If your project includes queries that rely on the old (exclusive) behaviour, this behaviour can be restored by adding the keyword argument ``inclusive=False``:
  102. .. code-block:: python
  103. >>> event_1 = EventPage.objects.get(title='Event 1')
  104. >>> EventPage.objects.sibling_of(event_1, inclusive=False)
  105. [<EventPage: Event 2>] # passing inclusive=False restores the OLD behaviour
  106. ``Image.search`` and ``Document.search`` methods are deprecated
  107. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  108. The ``Image.search`` and ``Document.search`` methods have been deprecated in favour of the new QuerySet-based search mechanism - see :ref:`wagtailsearch_images_documents_custom_models`. Code using the old ``search`` methods should be updated to search on QuerySets instead; for example:
  109. .. code-block:: python
  110. Image.search("Hello", filters={'uploaded_by_user': user})
  111. can be rewritten as:
  112. .. code-block:: python
  113. Image.objects.filter(uploaded_by_user=user).search("Hello")
  114. Wagtail API requires adding ``rest_framework`` to INSTALLED_APPS
  115. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  116. If you have the Wagtail API (``wagtail.contrib.wagtailapi``) enabled, you must now add ``'rest_framework'`` to your project's ``INSTALLED_APPS`` setting. In the current version the API will continue to function without this app, but the browsable front-end will not be available; this ability will be dropped in a future release.
  117. :meth:`Page.get_latest_revision_as_page() <wagtail.wagtailcore.models.Page.get_latest_revision_as_page>` now returns live page object when there are no draft changes
  118. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  119. If you have any application code that makes direct updates to page data, at the model or database level, be aware that the way these edits are reflected in the page editor has changed.
  120. Previously, the ``get_latest_revision_as_page`` method - used by the page editor to return the current page revision for editing - always retrieved data from the page's revision history. Now, it will only do so if the page has unpublished changes (i.e. the page is in ``live + draft`` state) - pages which have received no draft edits since being published will return the page's live data instead.
  121. As a result, any changes made directly to a live page object will be immediately reflected in the editor without needing to update the latest revision record (but note, the old behaviour is still used for pages in ``live + draft`` state).