========================================== Wagtail 1.2 release notes - IN DEVELOPMENT ========================================== .. contents:: :local: :depth: 1 What's new ========== Site settings module ~~~~~~~~~~~~~~~~~~~~ Wagtail now includes a contrib module (previously available as the `wagtailsettings `_ package) to allow administrators to edit site-specific settings. See: :doc:`/reference/contrib/settings` Jinja2 support ~~~~~~~~~~~~~~ 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. 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``. See: :doc:`/advanced_topics/jinja2` Search API improvements ~~~~~~~~~~~~~~~~~~~~~~~ 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: * ``operator``, to determine whether multiple search terms will be treated as 'or' (any term may match) or 'and' (all terms must match); * ``order_by_relevance``, set to True (the default) to order by relevance or False to preserve the QuerySet's original ordering. See: :ref:`wagtailsearch_searching` ``max_num`` and ``min_num`` parameters on inline panels ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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. See: :ref:`inline_panels` ``get_context`` on StreamField blocks ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ StreamField blocks now :ref:`provide a get_context method ` that can be overridden to pass additional variables to the block's template. Browsable API ~~~~~~~~~~~~~ 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. Minor features ~~~~~~~~~~~~~~ * WagtailRedirectMiddleware can now ignore the query string if there is no redirect that exactly matches it * Order of URL parameters now ignored by redirect middleware * Added SQL Server compatibility to image migration * Added classnames to Wagtail rich text editor buttons to aid custom styling * Simplified body_class in default homepage template * page_published signal now called with the revision object that was published * Added a favicon to the admin interface, customisable by overriding the ``branding_favicon`` block (see :ref:`custom_branding`). * Added spinner animations to long-running form submissions * The EMBEDLY_KEY setting has been renamed to WAGTAILEMBEDS_EMBEDLY_KEY * StreamField blocks are now added automatically, without showing the block types menu, if only one block type exists (Alex Gleason) * The ``first_published_at`` and ``latest_revision_created_at`` fields on page models are now available as filter fields on search queries * Wagtail admin now standardises on a single thumbnail image size, to reduce the overhead of creating multiple renditions * Rich text fields now strip out HTML comments * Page editor form now sets ``enctype="multipart/form-data"`` as appropriate, allowing FileField to be used on page models (Petr Vacha) * Explorer navigation menu on a completely empty page tree now takes you to the root level, rather than doing nothing Bug fixes ~~~~~~~~~ * Page slugs are no longer auto-updated from the page title if the page is already published * Deleting a page permission from the groups admin UI does not immediately submit the form * Wagtail userbar is shown on pages that do not pass a ``page`` variable to the template (e.g. because they override the ``serve`` method) * ``request.site`` now set correctly on page preview when the page is not in the default site * Project template no longer raises a deprecation warning (Maximilian Stauss) * ``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 * The "view live" button displayed after publishing a page now correctly reflects any changes made to the page slug (Ryan Pineo) * API endpoints now accept and ignore the ``_`` query parameter used by jQuery for cache-busting * Page slugs are no longer cut off when Unicode characters are expanded into multiple characters (Sævar Öfjörð Magnússon) * Searching a specific page model while filtering it by either ID or tree position no longer raises an error (Ashia Zawaduk) * Scrolling an over-long explorer menu no longer causes white background to show through (Alex Gleason) * Removed jitter when hovering over StreamField blocks (Alex Gleason) * Non-ASCII email addresses no longer throw errors when generating Gravatar URLs (Denis Voskvitsov, Kyle Stratis) Upgrade considerations ====================== ``PageManager.sibling_of(page)`` and ``PageManager.not_sibling_of(page)`` have changed behaviour ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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)``). 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: .. code-block:: python >>> event_1 = EventPage.objects.get(title='Event 1') >>> EventPage.objects.sibling_of(event_1) [] # OLD behaviour: Event 1 is not considered a sibling of itself This has now been changed to be *inclusive* by default; that is, the page is counted as a sibling of itself: .. code-block:: python >>> event_1 = EventPage.objects.get(title='Event 1') >>> EventPage.objects.sibling_of(event_1) [, ] # NEW behaviour: Event 1 is considered a sibling of itself 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: .. code-block:: python >>> event_1 = EventPage.objects.get(title='Event 1') >>> EventPage.objects.all().sibling_of(event_1) [, ] # OLD and NEW behaviour If your project includes queries that rely on the old (exclusive) behaviour, this behaviour can be restored by adding the keyword argument ``inclusive=False``: .. code-block:: python >>> event_1 = EventPage.objects.get(title='Event 1') >>> EventPage.objects.sibling_of(event_1, inclusive=False) [] # passing inclusive=False restores the OLD behaviour ``Image.search`` and ``Document.search`` methods are deprecated ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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: .. code-block:: python Image.search("Hello", filters={'uploaded_by_user': user}) can be rewritten as: .. code-block:: python Image.objects.filter(uploaded_by_user=user).search("Hello") Wagtail API requires adding ``rest_framework`` to INSTALLED_APPS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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.