Wagtail 7.1 release notes - IN DEVELOPMENT

Unreleased

What’s new

Site setting permissions

The Settings app now allows permission over site settings to be granted on a per-site basis. This makes it possible to give non-superuser accounts full control over the configuration of an individual site. This feature was developed by Matt Westcott.

List layout for images

Image listings now support both grid and list layouts, with a simple toggle for users to switch between the two. This helps CMS users manage larger collections of images, and makes it possible to display more metadata about images in the future.

Thank you to Joel William for implementing this as part of the Google Summer of Code program, with support from Coen van der Kamp, Sage Abdullah, Thibaud Colas, Ben Enright.

Collapsible StructBlock for block settings

To make it easier to navigate complex structured content, blocks created with StructBlock can now be collapsed and expanded like other structured block types. This is an opt-in feature, requiring developers to set collapsed=False or collapsed=True when reusing the block, or as part of its Meta class. A common need for this is block settings, where the block supports a lot of optional fields:

class BlockQuote(StructBlock):
    text = TextBlock()
    attribute_name = CharBlock(blank=True, required=False, label="e.g. Mary Berry")
    # Fields within the settings block will be available but hidden by default.
    settings = ThemeSettingsBlock(collapsed=True)

For more information, see Custom editing interfaces for StructBlock and StreamField block reference. This feature was implemented by Sage Abdullah, with support from the Wagtail UI team.

Preview and user bar improvements for headless setups

The live preview and user bar features have been improved to work better in headless setups. The preview panel can now load a cross-domain headless frontend (provided by the wagtail-headless-preview package). The Wagtail user bar has been refactored into a template component, allowing it to be rendered independently and loaded by the headless frontend. Incorporating the user bar into the frontend enables features in the page editor, such as:

  • Live preview scroll restoration

  • Accessibility checks

  • Content metrics (word count, reading time)

For more details, see the documentation on enabling the user bar and accessibility checker in headless setups. This feature was developed by Sage Abdullah.

Other features

  • Add iHeart oEmbed provider (Storm Heg)

  • Add locale-aware NumberColumn to display numbers in universal listings (Baptiste Mispelon)

  • Add ability for the header breadcrumbs to save their open/closed state across navigation & refresh (Srishti Jaiswal)

  • Render listing buttons as template components (Sage Abdullah)

  • Define default GenericRelations for RevisionMixin and WorkflowMixin, to avoid issues with deletion cascades (Sage Abdullah)

  • Update Twitter oEmbed provider to recognize x.com links (manu)

  • Document and relocate the init_new_page signal (Maciek Baron)

  • Use requests to access oEmbed endpoints, for more robust SSL certificate handling (Matt Westcott)

  • Ensure that bulk deletion views respect protected foreign keys (Sage Abdullah)

  • Add minimum length validation for RichTextBlock and RichTextField (Alec Baron)

  • Allow SnippetChooserBlock’s icon to take precedence over SnippetViewSet.icon (Matt Westcott)

  • Allow searching the users index on custom fields (Paul Craciunoiu, Sage Abdullah)

  • Support preserve-svg in Jinja2 image tags (Vishesh Garg)

  • Recognize preserve-svg as a filter when calling Image.get_rendition directly (Richard Allen)

  • Add support for preserve-svg for Image.get_renditions, picture, and srcset_image tags (Matt Westcott)

  • Include TypedTableBlock content when indexing for search (Charan T M)

  • Preserve query parameters when redirecting from the API find view to the detail view (Andrew Hosgood)

  • Add ‘Edit’ button to success message after copying page (Dhruvi Patel)

  • Restrict file dialog in multiple image uploader to the allowed image file types (Mustopha Mubarak O)

  • Raise clear error when non-StreamBlock is used as top-level block in StreamField (Clifford Gama)

  • Refactor userbar rendering to better support headless websites (Sage Abdullah)

  • Add type-to-confirm step when deleting large numbers of pages through bulk actions (Rachel Smith)

  • Add NoFutureDateValidator to validate against dates in the future (Talha Rizwan)

  • Extract separate background_position_x and background_position_y properties from AbstractRendition.background_position_style (Chiemezuo Akujobi)

  • Add support for translated string concatenation in the locale selector when switching between a model’s language in the admin (Matt Westcott, Ellie Walsh-O’Neill)

  • Switch to check / cross icons for users’ active state in users listing (Sage Abdullah)

  • Add a keyboard shortcut to easily toggle the visibility of the minimap side panel (Dhruvi Patel)

  • Add API for extracting preview page content (Sage Abdullah)

Bug fixes

  • Handle lazy translation strings as preview_value for RichTextBlock (Seb Corbin)

  • Fix handling of newline-separated choices in form builder when using non-windows newline characters (Baptiste Mispelon)

  • Ensure WAGTAILADMIN_LOGIN_URL is respected when logging out of the admin (Antoine Rodriguez, Ramon de Jezus)

  • Fix behavior of ViewSet.inject_view_methods with multiple methods (Gorlik)

  • Preserve query strings in URLs submitted to CloudFront for invalidation (Jigyasu Rajput)

  • Handle non-JSON-safe fields in exclude_fields_in_copy (Matt Westcott)

  • Allow upload of AVIF images through image chooser on Firefox (Matt Westcott)

  • Accept any string beginning with ‘y’ as confirmation for import_redirects command (Matt Westcott)

  • Fix error when accessing the submissions listing view with a non-form page (Sage Abdullah)

  • Replace inline styles with CSS classes in HTML files (Srishti Jaiswal)

  • Refactor remaining inline styles to avoid unsafe-inline style-src CSP (Chiemezuo Akujobi)

  • Avoid breaking words in listing table cells unless specifically enabled (Ziyao Yan)

  • Ensure that “all items in listing” option on image / document bulk actions respects user permissions (Alex Morega)

  • Adjust accessibility dialog position based on userbar position (Anees Asghar, Sage Abdullah)

  • Correctly handle ordering API results by mixed ascending and descending order (Rohit Sharma, Mahmoud Nasser)

  • Ensure that draft changes to an editable first_published_at field are preserved on reloading (Talha Rizwan)

  • Remove ngram parser on MySQL that prevented autocomplete search from returning results (Vince Salvino)

  • Only enable ManifestStaticFilesStorage in production settings, to aid test running (M. Sumair Khokhar)

  • Update BooleanColumn icons so they can be distinguished without relying on color (Sage Abdullah)

  • Do not delete default homepage by ID in home app migration (Matt Westcott)

  • Update the start project template to align with Django’s recommendation to have the django.middleware.security.SecurityMiddleware first (Brylie Christopher Oxley)

  • Ensure keyboard usage will correctly focus on new comments, including replies, when the side panel is open or closed (Dhruvi Patel)

  • Handle help_text kwarg in FloatBlock (Nick Smith)

  • Set aria-invalid on StreamField widgets input when there is an error (Sage Abdullah)

  • Make sure the label of panel collapse buttons is translatable (Thibaud Colas)

Documentation

  • Add missing tag library imports to footer template code in tutorial (Dimaco)

  • Improve documentation around securing user-uploaded files (Jake Howard)

  • Introduce search_fields in a dedicated tutorial section instead of the introduction (Matt Westcott)

  • Add note about PDF XSS to security page (Matt Westcott)

  • Add documentation for how to group blocks within the StreamField picker (Gaurav Verma)

  • Clarify the user bar does not have moderation features (Sage Abdullah)

Maintenance

  • Refactor get_embed to remove finder argument which was only used for mocking in unit tests (Jigyasu Rajput)

  • Simplify handling of None values in TypedTableBlock (Jigyasu Rajput)

  • Remove squash.io configuration (Sage Abdullah)

  • Use utf8mb4 charset and collation for MySQL test database (Sage Abdullah)

  • Add django.contrib.postgres to test settings INSTALLED_APPS (Sage Abdullah)

  • Add integrity & resolved checksums to package-lock.json (Sylvain Fankhauser)

  • Replace SlugController with more generic and reusable CleanController (LB (Ben) Johnston)

  • Remove outdated nginx / uWSGI example config files from /etc (LB (Ben) Johnston)

  • Use browser built-in EventTarget instead of events.EventEmitter from Webpack (Sage Abdullah)

Upgrade considerations - changes affecting all projects

Upgrade considerations - deprecation of old functionality

Upgrade considerations - changes affecting Wagtail customizations

Deprecation of PageListingButton, SnippetListingButton, and UserListingButton

The PageListingButton, SnippetListingButton, and UserListingButton classes have been deprecated in favour of the generic ListingButton and Button classes.

The PageListingButton class was previously documented as part of the register_page_listing_buttons hook. If you used this hook to add buttons to the page listing, you should now replace wagtail.admin.widgets.PageListingButton with wagtail.admin.widgets.ListingButton. Using the PageListingButton class will continue to work for now, but will raise a deprecation warning.

The SnippetListingButton and UserListingButton classes were previously documented as part of the register_snippet_listing_buttons and register_user_listing_buttons hooks, respectively. If you used these hooks to add buttons to the snippet or user listing, you should now replace wagtail.snippets.widgets.SnippetListingButton and wagtail.users.widgets.UserListingButton with one of the following:

  • Use wagtail.admin.widgets.Button if you want the button to appear as an item inside the “More” actions dropdown in the listing.

  • Use wagtail.admin.widgets.ListingButton if you want the button to appear as a top-level button in the listing.

Using the SnippetListingButton or UserListingButton classes will continue to work for now, but will raise a deprecation warning.

The PageListingButton, SnippetListingButton, and UserListingButton classes will be removed in a future release.

Using ListingButton in IndexView.get_list_more_buttons now renders the button as a top-level button

If you have overridden the undocumented get_list_more_buttons method on a generic IndexView subclass (e.g. for a ModelViewSet) and used the ListingButton class to add buttons to the “More” actions dropdown, these buttons will now be rendered as top-level buttons in the listing. If you want the buttons to appear inside the “More” actions dropdown, you should use the Button class instead.

init_new_page moved to wagtail.signals

The init_new_page signal, previously defined in wagtail.admin.signals, has now been moved to wagtail.signals. Any import lines referencing the old location need to be updated.

AccessibilityItem now accepts an in_editor argument

The AccessibilityItem user bar item now accepts an in_editor argument, which is set to True when it is instantiated within the page editor. If you customized the accessibility checker, you should update your code to pass this argument when creating an instance of your AccessibilityItem subclass.

 @hooks.register('construct_wagtail_userbar')
 def replace_userbar_accessibility_item(request, items, page):
     items[:] = [
-        CustomAccessibilityItem()
+        CustomAccessibilityItem(in_editor=item.in_editor)
         if isinstance(item, AccessibilityItem) else item
         for item in items
     ]

If you do not update your code, the AccessibilityItem will continue to work, but the in_editor argument will always be False. Wagtail does not currently use this argument, but it may do so in the future. It may also be utilized by users for cross-domain headless setups.

Upgrade considerations - changes to undocumented internals

List view for image listings

The wagtailimages listing view templates have been adapted to support both list and grid layout. Those adaptations should be replicated for any overrides or reuse of those templates.