Wagtail 1.3 release notes

December 23, 2015

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:

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 authors name will be searched
>>> Book.objects.filter(author__date_of_birth__gt=date(1950, 1, 1)).search("Hello")

See: 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 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

  • 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 customising 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 behaviour 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:

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

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.)