# Wagtail 1.3 release notes

*December 23, 2015*

> * [What’s new](#what-s-new)
> * [Upgrade considerations](#upgrade-considerations)

## What’s new

### Django 1.9 support

Wagtail is now compatible with Django 1.9.

### Indexing fields across relations in Elasticsearch

Fields on related objects can now be indexed in Elasticsearch using the new `indexed.RelatedFields` declaration type:

```python
class Book(models.Model, index.Indexed):
    ...

    search_fields = [
        index.SearchField('title'),
        index.FilterField('published_date'),

        index.RelatedFields('author', [
            index.SearchField('name'),
            index.FilterField('date_of_birth'),
        ]),
    ]

# Search books where their author was born after 1950
# Both the book title and the author's name will be searched
>>> Book.objects.filter(author__date_of_birth__gt=date(1950, 1, 1)).search("Hello")
```

See: [RelatedFields](../topics/search/indexing.md#wagtailsearch-index-relatedfields)

### Cross-linked admin search UI

The search interface in the Wagtail admin now includes a toolbar to quickly switch between different search types - pages, images, documents and users. A new [register_admin_search_area](../reference/hooks.md#register-admin-search-area) hook is provided for adding new search types to this toolbar.

### Minor features

* Added `WagtailPageTests`, a helper module to simplify writing tests for Wagtail sites. See [Testing your Wagtail site](../advanced_topics/testing.md)
* Added system checks to check the `subpage_types` and `parent_page_types` attributes of page models
* Added `WAGTAIL_PASSWORD_RESET_ENABLED` setting to allow password resets to be disabled independently of the password management interface (John Draper)
* Submit for moderation notification emails now include the editor name (Denis Voskvitsov)
* Updated fonts for more comprehensive Unicode support
* Added `.alt` attribute to image renditions
* The default `src`, `width`, `height` and `alt` attributes can now be overridden by attributes passed to the `{% image %}` tag
* Added keyboard shortcuts for preview and save in the page editor
* Added `Page` methods `can_exist_under`, `can_create_at`, `can_move_to` for customizing page type business rules
* `wagtailadmin.utils.send_mail` now passes extra keyword arguments to Django’s `send_mail` function (Matthew Downey)
* `page_unpublish` signal is now fired for each page that was unpublished by a call to `PageQuerySet.unpublish()`
* Add `get_upload_to` method to `AbstractImage`, to allow overriding the default image upload path (Ben Emery)
* Notification emails are now sent per user (Matthew Downey)
* Added the ability to override the default manager on Page models
* Added an optional human-friendly `site_name` field to sites (Timo Rieber)
* Added a system check to warn developers who use a custom Wagtail build but forgot to build the admin css
* Added success message after updating image from the image upload view (Christian Peters)
* Added a `request.is_preview` variable for templates to distinguish between previewing and live (Denis Voskvitsov)
* ‘Pages’ link on site stats dashboard now links to the site homepage when only one site exists, rather than the root level
* Added support for chaining multiple image operations on the `{% image %}` tag (Christian Peters)
* New translations for Arabic, Latvian and Slovak

### Bug fixes

* Images and page revisions created by a user are no longer deleted when the user is deleted (Rich Atkinson)
* HTTP cache purge now works again on Python 2 (Mitchel Cabuloy)
* Locked pages can no longer be unpublished (Alex Bridge)
* Site records now implement `get_by_natural_key`
* Creating pages at the root level (and any other instances of the base `Page` model) now properly respects the `parent_page_types` setting
* Settings menu now opens correctly from the page editor and styleguide views
* `subpage_types` / `parent_page_types` business rules are now enforced when moving pages
* Multi-word tags on images and documents are now correctly preserved as a single tag (LKozlowski)
* Changed verbose names to start with lower case where necessary (Maris Serzans)
* Invalid images no longer crash the image listing (Maris Serzans)
* `MenuItem` `url` parameter can now take a lazy URL (Adon Metcalfe, rayrayndwiga)
* Added missing translation tag to InlinePanel ‘Add’ button (jnns)
* Added missing translation tag to ‘Signing in…’ button text (Eugene MechanisM)
* Restored correct highlighting behavior of rich text toolbar buttons
* Rendering a missing image through ImageChooserBlock no longer breaks the whole page (Christian Peters)
* Filtering by popular tag in the image chooser now works when using the database search backend

## Upgrade considerations

### Jinja2 template tag modules have changed location

Due to a change in the way template tags are imported in Django 1.9, it has been necessary to move the Jinja2 template tag modules from “templatetags” to a new location, “jinja2tags”. The correct configuration settings to enable Jinja2 templates are now as follows:

```python
TEMPLATES = [
    # ...
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'APP_DIRS': True,
        'OPTIONS': {
            'extensions': [
                'wagtail.core.jinja2tags.core',
                'wagtail.wagtailadmin.jinja2tags.userbar',
                'wagtail.wagtailimages.jinja2tags.images',
            ],
        },
    }
]
```

See: [Jinja2 template support](../reference/jinja2.md)

### ContentType-returning methods in wagtailcore are deprecated

The following internal functions and methods in `wagtail.wagtailcore.models`, which return a list of `ContentType` objects, have been deprecated. Any uses of these in your code should be replaced by the corresponding new function which returns a list of model classes instead:

* `get_page_types()` - replaced by `get_page_models()`
* `Page.clean_subpage_types()` - replaced by `Page.clean_subpage_models()`
* `Page.clean_parent_page_types()` - replaced by `Page.clean_parent_page_models()`
* `Page.allowed_parent_page_types()` - replaced by `Page.allowed_parent_page_models()`
* `Page.allowed_subpage_types()` - replaced by `Page.allowed_subpage_models()`

In addition, note that these methods now return page types that are marked as `is_creatable = False`, including the base `Page` class. (Abstract models are not included, as before.)
