=========================
Wagtail 1.7 release notes
=========================

.. contents::
    :local:
    :depth: 1


What's new
==========


Elasticsearch 2 support
~~~~~~~~~~~~~~~~~~~~~~~

Wagtail now supports Elasticsearch 2. Note that you need to change backend in ``WAGTAILSEARCH_BACKENDS``, if you wish to switch to Elasticsearch 2. This feature was developed by Karl Hobley.

See: :ref:`wagtailsearch_backends_elasticsearch`


New image tag options for file type and JPEG compression level
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The ``{% image %}`` tag now supports extra parameters for specifying the image file type and JPEG compression level on a per-tag basis. See :ref:`output_image_format` and :ref:`jpeg_image_quality`. This feature was developed by Karl Hobley.


AWS CloudFront support added to cache invalidation module
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Wagtail's cache invalidation module can now invalidate pages cached in AWS CloudFront when they are updated or unpublished.
This feature was developed by Rob Moorman.

See: :ref:`frontendcache_aws_cloudfront`


Unpublishing subpages
~~~~~~~~~~~~~~~~~~~~~

Unpublishing a page now gives the option to unpublish its subpages at the same time. This feature was developed by Jordi Joan.


Minor features
~~~~~~~~~~~~~~

 * The ``|embed`` filter has been converted into a templatetag ``{% embed %}`` (Janneke Janssen)
 * The ``wagtailforms`` module now provides a ``FormSubmissionPanel`` for displaying details of form submissions; see :ref:`wagtailforms_formsubmissionpanel` for documentation. (João Luiz Lorencetti)
 * The Wagtail version number can now be obtained as a tuple using ``from wagtail import VERSION`` (Tim Heap)
 * ``send_mail`` logic has been moved from ``AbstractEmailForm.process_form_submission`` into ``AbstractEmailForm.send_mail``. Now it's easier to override this logic (Tim Leguijt)
 * Added ``before_create_page``, ``before_edit_page``, ``before_delete_page`` hooks (Karl Hobley)
 * Updated font sizes and colours to improve legibility of admin menu and buttons (Stein Strindhaug)
 * Added pagination to "choose destination" view when moving pages (Nick Smith, Žan Anderle)
 * Added ability to annotate search results with score - see :ref:`wagtailsearch_annotating_results_with_score` (Karl Hobley)
 * Added ability to limit access to form submissions - see :ref:`filter_form_submissions_for_user` (Mikalai Radchuk)
 * Added the ability to configure the number of days search logs are kept for, through the :ref:`WAGTAILSEARCH_HITS_MAX_AGE <wagtailsearch_hits_max_age>` setting (Stephen Rice)
 * ``SnippetChooserBlock`` now supports passing the model name as a string (Nick Smith)
 * Redesigned account settings / logout area in the sidebar for better clarity (Janneke Janssen)
 * Pillow's image optimisation is now applied when saving JPEG images (Karl Hobley)


Bug fixes
~~~~~~~~~

 * Migrations for wagtailcore and project template are now reversible (Benjamin Bach)
 * Migrations no longer depend on wagtailcore and taggit's ``__latest__`` migration, logically preventing those apps from receiving new migrations (Matt Westcott)
 * The default image format label text ('Full width', 'Left-aligned', 'Right-aligned') is now localised (Mikalai Radchuk)
 * Text on the front-end 'password required' form is now marked for translation (Janneke Janssen)
 * Text on the page view restriction form is now marked for translation (Luiz Boaretto)
 * Fixed toggle behaviour of userbar on mobile (Robert Rollins)
 * Image rendition / document file deletion now happens on a post_delete signal, so that files are not lost if the deletion does not proceed (Janneke Janssen)
 * "Your recent edits" list on dashboard no longer leaves out pages that another user has subsequently edited (Michael Cordover, Kees Hink, João Luiz Lorencetti)
 * ``InlinePanel`` now accepts a ``classname`` parameter as per the documentation (emg36, Matt Westcott)
 * Disabled use of escape key to revert content of rich text fields, which could cause accidental data loss (Matt Westcott)
 * Setting ``USE_THOUSAND_SEPARATOR = True`` no longer breaks the rendering of numbers in JS code for InlinePanel (Mattias Loverot, Matt Westcott)
 * Images / documents pagination now preserves GET parameters (Bojan Mihelac)
 * Wagtail's UserProfile model now sets a related_name of ``wagtail_userprofile`` to avoid naming collisions with other user profile models (Matt Westcott)
 * Non-text content is now preserved when adding or editing a link within rich text (Matt Westcott)
 * Fixed preview when ``SECURE_SSL_REDIRECT = True`` (Aymeric Augustin)
 * Prevent hang when truncating an image filename without an extension (Ricky Robinett)


Upgrade considerations
======================

Project template's initial migration should not depend on ``wagtailcore.__latest__``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

On projects created under previous releases of Wagtail, the ``home/migrations/0001_initial.py`` migration created by the ``wagtail start`` command contains the following dependency line:

.. code-block:: python

    dependencies = [
        ('wagtailcore', '__latest__'),
    ]

This may produce ``InconsistentMigrationHistory`` errors under Django 1.10 when upgrading Wagtail, since Django interprets this to mean that no new migrations can legally be added to wagtailcore after this migration is applied. This line should be changed to:

.. code-block:: python

    dependencies = [
        ('wagtailcore', '0029_unicode_slugfield_dj19'),
    ]


.. _filter_spec_migration:

Custom image models require a data migration for the new ``filter_spec`` field
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The data model for image renditions will be changed in Wagtail 1.8 to eliminate ``Filter`` as a model. Wagtail sites using a custom image model (see :ref:`custom_image_model`) need to have a schema and data migration in place prior to upgrading to Wagtail 1.8. To create these migrations:

 * Run ``manage.py makemigrations`` to create the schema migration
 * Run ``manage.py makemigrations --empty myapp`` (replacing ``myapp`` with the name of the app containing the custom image model) to create an empty migration
 * Edit the created migration to contain:

   .. code-block:: python

       from wagtail.wagtailimages.utils import get_fill_filter_spec_migrations

   and, for the ``operations`` list:

   .. code-block:: python

       forward, reverse = get_fill_filter_spec_migrations('myapp', 'CustomRendition')
       operations = [
           migrations.RunPython(forward, reverse),
       ]

   replacing ``myapp`` and ``CustomRendition`` with the app and model name for the custom rendition model.


``embed`` template filter is now a template tag
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The ``embed`` template filter, used to translate the URL of a media resource (such as a YouTube video) into a corresponding embeddable HTML fragment, has now been converted to a template tag. Any template code such as:

.. code-block:: html+django

    {% load wagtailembeds_tags %}
    ...
    {{ my_media_url|embed }}

should now be rewritten as:

.. code-block:: html+django

    {% load wagtailembeds_tags %}
    ...
    {% embed my_media_url %}
