Merge branch 'master' into author-specific-locking

This commit is contained in:
Karl Hobley 2019-11-26 15:55:49 +00:00
commit 5f68627950
1500 changed files with 13834 additions and 13595 deletions

View file

@ -10,12 +10,12 @@ documentation, translations or just feature requests.
The [issue tracker](https://github.com/wagtail/wagtail/issues) is
the preferred channel for [bug reports](#bugs), [features requests](#features)
and [submitting pull requests](#pull-requests). Please don't use the issue tracker
for support - use [the 'wagtail' tag on Stack Overflow](http://stackoverflow.com/questions/tagged/wagtail) (preferred) or our [Wagtail support group](https://groups.google.com/forum/#!forum/wagtail).
for support - use [the 'wagtail' tag on Stack Overflow](https://stackoverflow.com/questions/tagged/wagtail) (preferred) or our [Wagtail support group](https://groups.google.com/forum/#!forum/wagtail).
## New code
Please review the
[contributing guidelines](http://docs.wagtail.io/en/latest/contributing/index.html).
[contributing guidelines](https://docs.wagtail.io/en/latest/contributing/index.html).
You might like to start by checking issues with the
[good first issue](https://github.com/wagtail/wagtail/labels/good%20first%20issue) label.

View file

@ -30,4 +30,4 @@ Any other relevant information. For example, why do you consider this a bug and
* Python version: Run `python --version`.
* Django version: Look in your requirements.txt, or run `pip show django | grep Version`.
* Wagtail version: Look at the bottom of the Settings menu in the Wagtail admin, or run `pip show wagtail | grep Version:`.
* Browser version: You can use http://www.whatsmybrowser.org/ to find this out.
* Browser version: You can use https://www.whatsmybrowser.org/ to find this out.

View file

@ -1,8 +1,8 @@
Thanks for contributing to Wagtail! 🎉
Before submitting, please review the contributor guidelines <http://docs.wagtail.io/en/latest/contributing/index.html> and check the following:
Before submitting, please review the contributor guidelines <https://docs.wagtail.io/en/latest/contributing/index.html> and check the following:
* Do the tests still pass? (http://docs.wagtail.io/en/latest/contributing/developing.html#testing)
* Do the tests still pass? (https://docs.wagtail.io/en/latest/contributing/developing.html#testing)
* Does the code comply with the style guide? (Run `make lint` from the Wagtail root)
* For Python changes: Have you added tests to cover the new/fixed behaviour?
* For front-end changes: Did you test on all of Wagtails supported browsers? **Please list the exact versions you tested**.

1
.github/squash-logo.svg vendored Normal file
View file

@ -0,0 +1 @@
<svg width="56" height="56" id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 88 88"><style>.st0{fill:#c6032b}.st1{fill:#fff}</style><circle class="st0" cx="44.4" cy="45.2" r="36.2"/><path class="st1" d="M67.7 52.6c0 2.6-1.1 4.9-3.2 6.8-2.2 1.9-5.1 3.3-8.7 4.3-3.7 1-7.7 1.5-12.1 1.5-5.2 0-9.7-.4-13.5-1.2-3.8-.8-7.2-2.1-10.2-4.1l9.8-6.3c1.5 1 3.6 1.7 6.1 2.2 2.5.4 5.1.7 7.8.7 6 0 8.9-1.2 8.9-3.6 0-1-.4-1.8-1.2-2.4-.8-.5-2.2-.9-4.1-1.1l-7.5-.7c-5.5-.5-9.7-1.7-12.5-3.5-2.9-1.9-4.3-4.6-4.3-8 0-2.4.9-4.6 2.8-6.5 1.8-1.9 4.5-3.4 7.9-4.5 3.4-1.1 7.5-1.6 12.1-1.6s8.6.4 12 1.1c3.4.8 6.4 2 9 3.6l-9.6 6.2c-1.6-1-3.3-1.7-5.2-1.9-1.9-.3-4.1-.4-6.7-.4-2.5 0-4.3.4-5.6 1.1-1.3.8-1.9 1.6-1.9 2.6 0 .7.4 1.3 1.2 1.9 1 .6 2.4 1 4.3 1.2l7.5.7c5.5.5 9.6 1.6 12.3 3.3 1.6 1 2.8 2.2 3.5 3.7.7 1.2 1.1 2.9 1.1 4.9z"/></svg>

After

Width:  |  Height:  |  Size: 819 B

View file

@ -7,12 +7,8 @@ addons:
matrix:
include:
- env: TOXENV=py35-dj20-sqlite-noelasticsearch
python: 3.5
- env: TOXENV=py35-dj21-mysql-noelasticsearch
python: 3.5
- env: TOXENV=py36-dj20-postgres-noelasticsearch
python: 3.6
- env: TOXENV=py36-dj21-postgres-noelasticsearch
python: 3.6
- env: TOXENV=py37-dj21-postgres-noelasticsearch
@ -25,18 +21,16 @@ matrix:
python: 3.7
- env: TOXENV=py37-dj22stable-postgres-noelasticsearch
python: 3.7
- env: TOXENV=py37-dj30stable-postgres-noelasticsearch
python: 3.7
- env: TOXENV=py37-djmaster-postgres-noelasticsearch
python: 3.7
- env: TOXENV=py38-dj22-postgres-noelasticsearch
python: 3.8
- env: TOXENV=py36-dj20-sqlite-elasticsearch2 INSTALL_ELASTICSEARCH2=yes
python: 3.6
- env: TOXENV=py36-dj21-sqlite-elasticsearch2 INSTALL_ELASTICSEARCH2=yes
python: 3.6
- env: TOXENV=py36-dj21-postgres-elasticsearch5 INSTALL_ELASTICSEARCH5=yes
python: 3.6
- env: TOXENV=py36-dj20-postgres-elasticsearch6 INSTALL_ELASTICSEARCH6=yes
python: 3.6
- env: TOXENV=py36-dj21-postgres-elasticsearch6 INSTALL_ELASTICSEARCH6=yes
python: 3.6
- env: TOXENV=py37-dj22-postgres-elasticsearch6 INSTALL_ELASTICSEARCH6=yes
@ -47,16 +41,16 @@ matrix:
python: 3.8
allow_failures:
# Ignore failures on Elasticsearch tests because ES on Travis is intermittently flaky
- env: TOXENV=py36-dj20-sqlite-elasticsearch2 INSTALL_ELASTICSEARCH2=yes
- env: TOXENV=py36-dj21-sqlite-elasticsearch2 INSTALL_ELASTICSEARCH2=yes
- env: TOXENV=py36-dj21-postgres-elasticsearch5 INSTALL_ELASTICSEARCH5=yes
- env: TOXENV=py36-dj20-postgres-elasticsearch6 INSTALL_ELASTICSEARCH6=yes
- env: TOXENV=py36-dj21-postgres-elasticsearch6 INSTALL_ELASTICSEARCH6=yes
- env: TOXENV=py37-dj22-postgres-elasticsearch6 INSTALL_ELASTICSEARCH6=yes
- env: TOXENV=py37-dj22-postgres-elasticsearch7 INSTALL_ELASTICSEARCH7=yes
- env: TOXENV=py38-dj22-postgres-elasticsearch7 INSTALL_ELASTICSEARCH7=yes
# allow failures against Django 2.2.x stable branch
- env: TOXENV=py37-dj22stable-postgres-noelasticsearch
# allow failures against Django 3.0.x stable branch
- env: TOXENV=py37-dj30stable-postgres-noelasticsearch
# allow failures against Django master
- env: TOXENV=py37-djmaster-postgres-noelasticsearch

View file

@ -1,10 +1,32 @@
Changelog
=========
2.7 LTS (xx.xx.xxxx) - IN DEVELOPMENT
2.8 (xx.xx.xxxx) - IN DEVELOPMENT
~~~~~~~~~~~~~~~~
* Removed support for Django 2.0
* Removed leftover Python 2.x compatibility code (Sergey Fedoseev)
* Combine flake8 configurations (Sergey Fedoseev)
* Improved diffing behavior for text fields (Aliosha Padovani)
* Improve contrast of disabled inputs (Nick Smith)
* Added `get_document_model_string` function (Andrey Smirnov)
* Added support for Cloudflare API tokens for frontend cache invalidation (Tom Usher)
* Cloudflare frontend cache invalidation requests are now sent in chunks of 30 to fit within API limits (Tom Usher)
* Added `ancestors` field to pages endpoint in admin API (Karl Hobley)
* Removed Django admin management of `Page` & `Site` models (Andreas Bernacca)
* Fix: Rename documents listing column 'uploaded' to 'created' (LB (Ben Johnston))
* Fix: Submenu items longer then the page height are no longer broken by the submenu footer (Igor van Spengen)
* Fix: Unbundle the l18n library as it was bundled to avoid installation errors which have been resolved (Matt Westcott)
* Fix: Prevent error when comparing pages that reference a model with a custom primary key (Fidel Ramos)
* Fix: Moved `get_document_model` location so it can be imported when Models are not yet loaded (Andrey Smirnov)
* Fix: Fixed incorrect HTML escaping of Jinja2 form templates for StructBlocks (Brady Moe)
* Fix: All templates with wagtailsettings and modeladmin now use `block.super` for `extra_js` & `extra_css` (Timothy Bautista)
2.7 LTS (06.11.2019)
~~~~~~~~~~~~~~~~~~~~
* Improved StreamField design (Bertrand Bordage)
* Added WebP image support (frmdstryr, Karl Hobley, Matt Westcott)
* Added Elasticsearch 7 support (pySilver)
* Added Python 3.8 support (John Carter, Matt Westcott)
* Added `construct_page_listing_buttons` hook (Michael van Tellingen)
@ -24,10 +46,7 @@ Changelog
* Added ARIA role to TableBlock output (Matt Westcott)
* Added cache-busting query parameters to static files within the Wagtail admin (Matt Westcott)
* Allow `register_page_action_menu_item` and `construct_page_action_menu` hooks to override the default menu action (Rahmi Pruitt, Matt Westcott)
* Add docs table template rendering example (Matt Westcott)
* Add blog about image uploads in Wagtail forms to third party tutorial documentation (a-mere-peasant)
* Clean up multiple minor documentation issues (David T Thompson, ryanomor, kailwallin)
* Add AbstractUser import to custom user model documentation (LB (Ben Johnston))
* `WAGTAILIMAGES_MAX_IMAGE_PIXELS` limit now takes the number of animation frames into account (Karl Hobley)
* Fix: Added line breaks to long filenames on multiple image / document uploader (Kevin Howbrook)
* Fix: Added https support for Scribd oEmbed provider (Rodrigo)
* Fix: Changed StreamField group labels color so labels are visible (Catherine Farman)
@ -50,6 +69,14 @@ Changelog
* Fix: Replace styleguide example avatar with default image to avoid issues when custom user model is used (Matt Westcott)
* Fix: `DraftailRichTextArea` is no longer treated as a hidden field by Django's form logic (Sergey Fedoseev)
* Fix: Replace format() placeholders in translatable strings with % formatting (Matt Westcott)
* Fix: Altering Django REST Framework's `DEFAULT_AUTHENTICATION_CLASSES` setting no longer breaks the page explorer menu and admin API (Matt Westcott)
* Fix: Regression - missing label for external link URL field in link chooser (Stefani Castellanos)
2.6.3 (22.10.2019)
~~~~~~~~~~~~~~~~~~
* Fix: Altering Django REST Framework's `DEFAULT_AUTHENTICATION_CLASSES` setting no longer breaks the page explorer menu and admin API (Matt Westcott)
2.6.2 (19.09.2019)

View file

@ -68,7 +68,7 @@ members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at [http://contributor-covenant.org/version/1/4][version]
available at [https://www.contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
[homepage]: https://www.contributor-covenant.org/
[version]: https://www.contributor-covenant.org/version/1/4/

View file

@ -20,6 +20,7 @@ Core team
* Jonny Scholes (Neon Jungle)
* Andy Babic (Torchbox)
* Dan Braghis (Torchbox)
* Dawn Wages
Core team alumni
================
@ -255,7 +256,7 @@ Contributors
* Lucas Moeskops
* Rob van der Linde
* Paul Kamp
* dwasyl
* David Wasylciw
* Eugene Morozov
* Levi Adler
* Edwar Baron
@ -405,7 +406,6 @@ Contributors
* Kiril Staikov
* Saptak Sengupta
* Dawid Bugajewski
* Dawn Wages
* Jacob Topp-Mugglestone
* Brian Whitton
* Tim White
@ -416,6 +416,14 @@ Contributors
* David T Thompson
* kailwallin
* ryanomor
* Thijs Baaijen
* Igor van Spengen
* Stefani Castellanos
* Aliosha Padovani
* Tom Readings
* Andrey Smirnov
* Tim Gates
* Timothy Bautista
Translators
===========
@ -440,14 +448,14 @@ Translators
* French: Adrien, Timothy Allen, Sebastien Andrivet, Bertrand Bordage, André Bouatchidzé, Aurélien Debord, Romain Dorgueil, Tom Dyson, Antonin Enfrun, Axel Haustant, Léo, Pierre Marfoure, nahuel, Sophy O, Dominique Peretti, fpoulain, Loïc Teixeira, Benoît Vogel
* Galician: fooflare
* Georgian: André Bouatchidzé
* German: Ettore Atalan, Patrick Craston, Peter Dreuw, Henrik Kröger, Tammo van Lessen, Martin Löhle, Wasilis Mandratzis-Walz, Daniel Manser, m0rph3u5, Max Pfeiffer, Moritz Pfeiffer, Herbert Poul, Karl Sander, Tobias Schmidt, Johannes Spielmann, Raphael Stolt, Benjamin Thurm, Norman Uekermann, Jannis Vajen, Vorlif, Matthew Westcott
* German: Ettore Atalan, Patrick Craston, Peter Dreuw, Johannes Fleck, Henrik Kröger, Tammo van Lessen, Martin Löhle, Wasilis Mandratzis-Walz, Daniel Manser, Matthias Martin, m0rph3u5, Max Pfeiffer, Moritz Pfeiffer, Herbert Poul, Karl Sander, Tobias Schmidt, Johannes Spielmann, Raphael Stolt, Benjamin Thurm, Norman Uekermann, Jannis Vajen, Vorlif, Matthew Westcott
* Greek: Jim Dal, George Giannoulopoulos, Yiannis Inglessis, Wasilis Mandratzis-Walz, Nick Mavrakis, NeotheOne, Serafeim Papastefanos
* Hebrew (Israel): Lior Abazon, bjesus, Yossi Lalum, Adi Ron, Oleg Sverdlov
* Hungarian: Istvan Farkas, Laszlo Molnar, Kornél Novák Mergulhão, BN
* Hungarian: Istvan Farkas, Laszlo Molnar, Kornél Novák Mergulhão, BN, Aron Santa
* Icelandic (Iceland): Arnar Tumi Þorsteinsson, Kjartan Sverrisson, Sævar Öfjörð Magnússon
* Indonesian (Indonesia): atmosuwiryo, Sutrisno Efendi, Dzikri Hakim, Geek Pantura, Ronggo Radityo, M. Febrian Ramadhana
* Italian: Sandro Badalamenti, Edd Baldry, Claudio Bantaloukas, Guglielmo Celata, Gian-Maria Daffre, Giacomo Ghizzani, Carlo Miron, Alessio Di Stasio, Andrea Tagliazucchi
* Japanese: Sangmin Ahn, Shuhei Hirota, Shu Ishida, Yudai Kobayashi, Tri Minh, Hideaki Oguchi, Tomo Mizoe, Daigo Shitara, Shimizu Taku, umepon0626, Takuya Yamamoto
* Italian: Sandro Badalamenti, Edd Baldry, Claudio Bantaloukas, Guglielmo Celata, Gian-Maria Daffre, Giacomo Ghizzani, LB (Ben Johnston), Carlo Miron, Alessio Di Stasio, Andrea Tagliazucchi
* Japanese: Sangmin Ahn, Shuhei Hirota, Shu Ishida, Yudai Kobayashi, Tri Minh, Hideaki Oguchi, Tomo Mizoe, Safu9, Daigo Shitara, Shimizu Taku, umepon0626, Takuya Yamamoto
* Korean: Kyungil Choi, Jihan Chung
* Latvian: Reinis Rozenbergs, Maris Serzans
* Lithuanian: Matas Dailyda

View file

@ -1,12 +1,12 @@
<h1 align="center">
<img width="343" src="https://cdn.rawgit.com/wagtail/wagtail/master/.github/wagtail.svg" alt="Wagtail">
<br>
<br>
<img width="343" src="https://cdn.jsdelivr.net/gh/wagtail/wagtail@master/.github/wagtail.svg" alt="Wagtail">
<br>
<br>
</h1>
Wagtail is an open source content management system built on Django, with a strong community and commercial support. It's focused on user experience, and offers precise control for designers and developers.
![Wagtail screenshot](https://cdn.rawgit.com/wagtail/wagtail/master/.github/wagtail-screenshot-with-browser.png)
![Wagtail screenshot](https://cdn.jsdelivr.net/gh/wagtail/wagtail@master/.github/wagtail-screenshot-with-browser.png)
### Features
@ -40,15 +40,15 @@ python manage.py createsuperuser
python manage.py runserver
```
For detailed installation and setup docs, see [docs.wagtail.io](http://docs.wagtail.io/).
For detailed installation and setup docs, see [docs.wagtail.io](https://docs.wagtail.io/).
### Whos using it?
Wagtail is used by NASA, Google, Oxfam, the NHS, Mozilla, MIT, the Red Cross, Salesforce, NBC, BMW, and the US and UK governments. Add your own Wagtail site to [madewithwagtail.org](http://madewithwagtail.org).
Wagtail is used by NASA, Google, Oxfam, the NHS, Mozilla, MIT, the Red Cross, Salesforce, NBC, BMW, and the US and UK governments. Add your own Wagtail site to [madewithwagtail.org](https://madewithwagtail.org).
### Documentation
[docs.wagtail.io](http://docs.wagtail.io/) is the full reference for Wagtail, and includes guides for developers, designers and editors, alongside release notes and our roadmap.
[docs.wagtail.io](https://docs.wagtail.io/) is the full reference for Wagtail, and includes guides for developers, designers and editors, alongside release notes and our roadmap.
### Compatibility
@ -64,7 +64,7 @@ Previous versions of Wagtail (1.13 and earlier) additionally supported Python 2.
### Community Support
There is an active community of Wagtail users and developers responding to questions on [Stack Overflow](http://stackoverflow.com/questions/tagged/wagtail). When posting questions, please read Stack Overflow's advice on [how to ask questions](http://stackoverflow.com/help/how-to-ask) and remember to tag your question "wagtail".
There is an active community of Wagtail users and developers responding to questions on [Stack Overflow](https://stackoverflow.com/questions/tagged/wagtail). When posting questions, please read Stack Overflow's advice on [how to ask questions](https://stackoverflow.com/help/how-to-ask) and remember to tag your question "wagtail".
For topics and discussions that do not fit Stack Overflow's question and answer format, we have a [Slack workspace](https://github.com/wagtail/wagtail/wiki/Slack) and a [Wagtail Support mailing list](https://groups.google.com/forum/#!forum/wagtail). Please respect the time and effort of volunteers by not asking the same question in multiple places.
@ -92,7 +92,7 @@ To try out the latest features before a release, we also create builds from mast
If you're a Python or Django developer, fork the repo and get stuck in! We run a separate group for developers of Wagtail itself at https://groups.google.com/forum/#!forum/wagtail-developers (please note that this is not for support requests).
You might like to start by reviewing the [contributing guidelines](http://docs.wagtail.io/en/latest/contributing/index.html) and checking issues with the [good first issue](https://github.com/wagtail/wagtail/labels/good%20first%20issue) label.
You might like to start by reviewing the [contributing guidelines](https://docs.wagtail.io/en/latest/contributing/index.html) and checking issues with the [good first issue](https://github.com/wagtail/wagtail/labels/good%20first%20issue) label.
We also welcome translations for Wagtail's interface. Translation work should be submitted through [Transifex](https://www.transifex.com/projects/p/wagtail/).
@ -101,12 +101,17 @@ We also welcome translations for Wagtail's interface. Translation work should be
### Thanks
We thank [BrowserStack](https://www.browserstack.com/), who provides the project with free access to their live web-based browser testing tool, and automated Selenium cloud testing.
We thank the following organisations for their services used in Wagtail's development:
[![Browserstack](https://cdn.jsdelivr.net/gh/wagtail/wagtail@master/.github/browserstack-logo.svg)](https://www.browserstack.com/)<br>
[BrowserStack](https://www.browserstack.com/) provides the project with free access to their live web-based browser testing tool, and automated Selenium cloud testing.
[![squash.io](https://cdn.jsdelivr.net/gh/wagtail/wagtail@master/.github/squash-logo.svg)](https://www.squash.io/)<br>
[Squash](https://www.squash.io/) provides the project with free test environments for reviewing pull requests.
[![Browserstack](https://cdn.rawgit.com/wagtail/wagtail/master/.github/browserstack-logo.svg)](https://www.browserstack.com/)
[![Build Status](https://api.travis-ci.org/wagtail/wagtail.svg?branch=master)](https://travis-ci.org/wagtail/wagtail)
[![License](https://img.shields.io/badge/license-BSD-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
[![Version](https://img.shields.io/pypi/v/wagtail.svg)](https://pypi.python.org/pypi/wagtail/)
[![Coverage](http://codecov.io/github/wagtail/wagtail/coverage.svg?branch=master)](http://codecov.io/github/wagtail/wagtail?branch=master)
[![Coverage](https://codecov.io/github/wagtail/wagtail/coverage.svg?branch=master)](https://codecov.io/github/wagtail/wagtail?branch=master)
[![Slack](https://wagtail-slack.now.sh/badge.svg)](https://wagtail-slack.now.sh)

View file

@ -7,11 +7,11 @@ The following organisations and individuals supported the [Wagtail's First Hatch
- [Ambient Innovation](https://ambient-innovation.com/)
- [Shenberger Technology](http://shenbergertech.com/)
- [Type/Code](https://typecode.com/)
- [SharperTool](http://sharpertool.com/)
- [SharperTool](https://sharpertool.com/)
- [Overcast Software](https://www.overcast.io/)
- [Octave](https://octave.nz/)
- [Taywa](https://www.taywa.ch/)
- [Rock Kitchen Harris](https://www.rkh.co.uk/)
- [The Motley Fool](http://www.fool.com/)
- [The Motley Fool](https://www.fool.com/)
- [R Strother Scott](https://twitter.com/rstrotherscott)
- [Beyond Media](http://beyond.works/)
- [Beyond Media](https://www.beyond.works/)

View file

@ -388,6 +388,10 @@ body.explorer-open {
width: $menu-width;
}
ul {
position: relative;
}
h2 {
display: block;
padding: 0.2em 0;
@ -409,6 +413,11 @@ body.explorer-open {
.footer {
position: absolute;
&-submenu {
position: sticky;
max-height: unset;
}
}
}

View file

@ -94,9 +94,9 @@ select,
&[disabled],
&:disabled:hover,
&[disabled]:hover {
background-color: inherit;
cursor: default;
color: $color-grey-4;
background-color: $color-grey-4;
cursor: not-allowed;
color: $color-grey-2;
}
}

View file

@ -1,44 +1,44 @@
/**
* Returns collection of currently selected blocks.
* See https://github.com/jpuri/draftjs-utils/blob/e81c0ae19c3b0fdef7e0c1b70d924398956be126/js/block.js#L19.
*/
const getSelectedBlocksList = (editorState) => {
const selectionState = editorState.getSelection();
const content = editorState.getCurrentContent();
const startKey = selectionState.getStartKey();
const endKey = selectionState.getEndKey();
const blockMap = content.getBlockMap();
const blocks = blockMap
.toSeq()
.skipUntil((_, k) => k === startKey)
.takeUntil((_, k) => k === endKey)
.concat([[endKey, blockMap.get(endKey)]]);
return blocks.toList();
};
/**
* Returns collection of currently selected blocks.
* See https://github.com/jpuri/draftjs-utils/blob/e81c0ae19c3b0fdef7e0c1b70d924398956be126/js/block.js#L19.
*/
const getSelectedBlocksList = (editorState) => {
const selectionState = editorState.getSelection();
const content = editorState.getCurrentContent();
const startKey = selectionState.getStartKey();
const endKey = selectionState.getEndKey();
const blockMap = content.getBlockMap();
const blocks = blockMap
.toSeq()
.skipUntil((_, k) => k === startKey)
.takeUntil((_, k) => k === endKey)
.concat([[endKey, blockMap.get(endKey)]]);
return blocks.toList();
};
/**
* Returns the currently selected text in the editor.
* See https://github.com/jpuri/draftjs-utils/blob/e81c0ae19c3b0fdef7e0c1b70d924398956be126/js/block.js#L106.
*/
export const getSelectionText = (editorState) => {
const selection = editorState.getSelection();
let start = selection.getAnchorOffset();
let end = selection.getFocusOffset();
const selectedBlocks = getSelectedBlocksList(editorState);
/**
* Returns the currently selected text in the editor.
* See https://github.com/jpuri/draftjs-utils/blob/e81c0ae19c3b0fdef7e0c1b70d924398956be126/js/block.js#L106.
*/
export const getSelectionText = (editorState) => {
const selection = editorState.getSelection();
let start = selection.getAnchorOffset();
let end = selection.getFocusOffset();
const selectedBlocks = getSelectedBlocksList(editorState);
if (selection.getIsBackward()) {
const temp = start;
start = end;
end = temp;
}
if (selection.getIsBackward()) {
const temp = start;
start = end;
end = temp;
}
let selectedText = '';
for (let i = 0; i < selectedBlocks.size; i += 1) {
const blockStart = i === 0 ? start : 0;
const blockEnd = i === (selectedBlocks.size - 1) ? end : selectedBlocks.get(i).getText().length;
selectedText += selectedBlocks.get(i).getText().slice(blockStart, blockEnd);
}
let selectedText = '';
for (let i = 0; i < selectedBlocks.size; i += 1) {
const blockStart = i === 0 ? start : 0;
const blockEnd = i === (selectedBlocks.size - 1) ? end : selectedBlocks.get(i).getText().length;
selectedText += selectedBlocks.get(i).getText().slice(blockStart, blockEnd);
}
return selectedText;
};
return selectedText;
};

View file

@ -1,6 +1,6 @@
import {
EditorState,
convertFromRaw,
EditorState,
convertFromRaw,
} from 'draft-js';
import { getSelectionText } from './DraftUtils';

View file

@ -57,7 +57,6 @@ const defaultState = {};
*/
export default function nodes(state = defaultState, { type, payload }) {
switch (type) {
case 'OPEN_EXPLORER':
case 'GET_PAGE_SUCCESS':
case 'GET_CHILDREN_START':

View file

@ -31,10 +31,10 @@ const initUpgradeNotification = () => {
container.style.display = '';
}
})
.catch(err => {
// eslint-disable-next-line no-console
console.log(`Error fetching ${releasesUrl}. Error: ${err}`);
});
.catch(err => {
// eslint-disable-next-line no-console
console.log(`Error fetching ${releasesUrl}. Error: ${err}`);
});
};
export { initUpgradeNotification };

View file

@ -1,5 +1,5 @@
function compareVersion(versionA, versionB) {
const re = /(\.0)+[^\.]*$/;
const re = /(\.0)+[^.]*$/;
const va = (versionA + '').replace(re, '').split('.');
const vb = (versionB + '').replace(re, '').split('.');
const len = Math.min(va.length, vb.length);

View file

@ -9,7 +9,7 @@ BUILDDIR = _build
# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from https://www.sphinx-doc.org/)
endif
# Internal variables.

View file

@ -1,6 +1,6 @@
# Wagtail docs
These are Sphinx docs, automatically built at http://docs.wagtail.io when the master branch is committed to Github. To build them locally, install Wagtail's development requirements (in the root Wagtail directory):
These are Sphinx docs, automatically built at https://docs.wagtail.io when the master branch is committed to Github. To build them locally, install Wagtail's development requirements (in the root Wagtail directory):
pip install -e .[testing,docs]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 163 KiB

View file

@ -0,0 +1,408 @@
==================================================
How to add Wagtail into an existing Django project
==================================================
To install Wagtail completely from scratch, create a new Django project and an app within that project. For instructions on these tasks, see :doc:`Writing your first Django app <django:intro/tutorial01>`. Your project directory will look like the following::
myproject/
myproject/
__init__.py
settings.py
urls.py
wsgi.py
myapp/
__init__.py
models.py
tests.py
admin.py
views.py
manage.py
From your app directory, you can safely remove ``admin.py`` and ``views.py``, since Wagtail will provide this functionality for your models. Configuring Django to load Wagtail involves adding modules and variables to ``settings.py`` and URL configuration to ``urls.py``. For a more complete view of what's defined in these files, see :doc:`Django Settings <django:topics/settings>` and :doc:`Django URL Dispatcher <django:topics/http/urls>`.
What follows is a settings reference which skips many boilerplate Django settings. If you just want to get your Wagtail install up quickly without fussing with settings at the moment, see :ref:`complete_example_config`.
Middleware (``settings.py``)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: python
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
'wagtail.core.middleware.SiteMiddleware',
'wagtail.contrib.redirects.middleware.RedirectMiddleware',
]
Wagtail requires several common Django middleware modules to work and cover basic security. Wagtail provides its own middleware to cover these tasks:
``SiteMiddleware``
Wagtail routes pre-defined hosts to pages within the Wagtail tree using this middleware.
``RedirectMiddleware``
Wagtail provides a simple interface for adding arbitrary redirects to your site and this module makes it happen.
Apps (``settings.py``)
~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: python
INSTALLED_APPS = [
'myapp', # your own app
'wagtail.contrib.forms',
'wagtail.contrib.redirects',
'wagtail.embeds',
'wagtail.sites',
'wagtail.users',
'wagtail.snippets',
'wagtail.documents',
'wagtail.images',
'wagtail.search',
'wagtail.admin',
'wagtail.core',
'taggit',
'modelcluster',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
Wagtail requires several Django app modules, third-party apps, and defines several apps of its own. Wagtail was built to be modular, so many Wagtail apps can be omitted to suit your needs. Your own app (here ``myapp``) is where you define your models, templates, static assets, template tags, and other custom functionality for your site.
Wagtail Apps
------------
``wagtailcore``
The core functionality of Wagtail, such as the ``Page`` class, the Wagtail tree, and model fields.
``wagtailadmin``
The administration interface for Wagtail, including page edit handlers.
``wagtaildocs``
The Wagtail document content type.
``wagtailsnippets``
Editing interface for non-Page models and objects. See :ref:`Snippets`.
``wagtailusers``
User editing interface.
``wagtailimages``
The Wagtail image content type.
``wagtailembeds``
Module governing oEmbed and Embedly content in Wagtail rich text fields. See :ref:`inserting_videos`.
``wagtailsearch``
Search framework for Page content. See :ref:`wagtailsearch`.
``wagtailredirects``
Admin interface for creating arbitrary redirects on your site.
``wagtailforms``
Models for creating forms on your pages and viewing submissions. See :ref:`form_builder`.
Third-Party Apps
----------------
``taggit``
Tagging framework for Django. This is used internally within Wagtail for image and document tagging and is available for your own models as well. See :ref:`tagging` for a Wagtail model recipe or the `Taggit Documentation`_.
.. _Taggit Documentation: https://django-taggit.readthedocs.org/en/latest/index.html
``modelcluster``
Extension of Django ForeignKey relation functionality, which is used in Wagtail pages for on-the-fly related object creation. For more information, see :ref:`inline_panels` or `the django-modelcluster github project page`_.
.. _the django-modelcluster github project page: https://github.com/torchbox/django-modelcluster
URL Patterns
~~~~~~~~~~~~
.. code-block:: python
from django.contrib import admin
from wagtail.core import urls as wagtail_urls
from wagtail.admin import urls as wagtailadmin_urls
from wagtail.documents import urls as wagtaildocs_urls
urlpatterns = [
re_path(r'^django-admin/', include(admin.site.urls)),
re_path(r'^admin/', include(wagtailadmin_urls)),
re_path(r'^documents/', include(wagtaildocs_urls)),
# Optional URL for including your own vanilla Django urls/views
re_path(r'', include('myapp.urls')),
# For anything not caught by a more specific rule above, hand over to
# Wagtail's serving mechanism
re_path(r'', include(wagtail_urls)),
]
This block of code for your project's ``urls.py`` does a few things:
* Load the vanilla Django admin interface to ``/django-admin/``
* Load the Wagtail admin and its various apps
* Dispatch any vanilla Django apps you're using other than Wagtail which require their own URL configuration (this is optional, since Wagtail might be all you need)
* Lets Wagtail handle any further URL dispatching.
That's not everything you might want to include in your project's URL configuration, but it's what's necessary for Wagtail to flourish.
.. _complete_example_config:
Ready to Use Example Configuration Files
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
These two files should reside in your project directory (``myproject/myproject/``).
``settings.py``
---------------
.. code-block:: python
import os
PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
BASE_DIR = os.path.dirname(PROJECT_DIR)
DEBUG = True
# Application definition
INSTALLED_APPS = [
'myapp',
'wagtail.contrib.forms',
'wagtail.contrib.redirects',
'wagtail.embeds',
'wagtail.sites',
'wagtail.users',
'wagtail.snippets',
'wagtail.documents',
'wagtail.images',
'wagtail.search',
'wagtail.admin',
'wagtail.core',
'taggit',
'modelcluster',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
'wagtail.core.middleware.SiteMiddleware',
'wagtail.contrib.redirects.middleware.RedirectMiddleware',
]
ROOT_URLCONF = 'myproject.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(PROJECT_DIR, 'templates'),
],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'myproject.wsgi.application'
# Database
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myprojectdb',
'USER': 'postgres',
'PASSWORD': '',
'HOST': '', # Set to empty string for localhost.
'PORT': '', # Set to empty string for default.
'CONN_MAX_AGE': 600, # number of seconds database connections should persist for
}
}
# Internationalization
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]
STATICFILES_DIRS = [
os.path.join(PROJECT_DIR, 'static'),
]
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
ADMINS = [
# ('Your Name', 'your_email@example.com'),
]
MANAGERS = ADMINS
# Default to dummy email backend. Configure dev/production/local backend
# as per https://docs.djangoproject.com/en/dev/topics/email/#email-backends
EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'
# Hosts/domain names that are valid for this site; required if DEBUG is False
ALLOWED_HOSTS = []
# Make this unique, and don't share it with anybody.
SECRET_KEY = 'change-me'
EMAIL_SUBJECT_PREFIX = '[Wagtail] '
INTERNAL_IPS = ('127.0.0.1', '10.0.2.2')
# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See https://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging configuration.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}
# WAGTAIL SETTINGS
# This is the human-readable name of your Wagtail install
# which welcomes users upon login to the Wagtail admin.
WAGTAIL_SITE_NAME = 'My Project'
# Override the search results template for wagtailsearch
# WAGTAILSEARCH_RESULTS_TEMPLATE = 'myapp/search_results.html'
# WAGTAILSEARCH_RESULTS_TEMPLATE_AJAX = 'myapp/includes/search_listing.html'
# Replace the search backend
#WAGTAILSEARCH_BACKENDS = {
# 'default': {
# 'BACKEND': 'wagtail.search.backends.elasticsearch2',
# 'INDEX': 'myapp'
# }
#}
# Wagtail email notifications from address
# WAGTAILADMIN_NOTIFICATION_FROM_EMAIL = 'wagtail@myhost.io'
# Wagtail email notification format
# WAGTAILADMIN_NOTIFICATION_USE_HTML = True
# Reverse the default case-sensitive handling of tags
TAGGIT_CASE_INSENSITIVE = True
``urls.py``
-----------
.. code-block:: python
from django.conf.urls import include, re_path
from django.conf.urls.static import static
from django.views.generic.base import RedirectView
from django.contrib import admin
from django.conf import settings
import os.path
from wagtail.core import urls as wagtail_urls
from wagtail.admin import urls as wagtailadmin_urls
from wagtail.documents import urls as wagtaildocs_urls
urlpatterns = [
re_path(r'^django-admin/', include(admin.site.urls)),
re_path(r'^admin/', include(wagtailadmin_urls)),
re_path(r'^documents/', include(wagtaildocs_urls)),
# For anything not caught by a more specific rule above, hand over to
# Wagtail's serving mechanism
re_path(r'', include(wagtail_urls)),
]
if settings.DEBUG:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns() # tell gunicorn where static files are in dev mode
urlpatterns += static(settings.MEDIA_URL + 'images/', document_root=os.path.join(settings.MEDIA_ROOT, 'images'))
urlpatterns += [
re_path(r'^favicon\.ico$', RedirectView.as_view(url=settings.STATIC_URL + 'myapp/images/favicon.ico'))
]

View file

@ -0,0 +1,340 @@
Building a site with AMP support
================================
This recipe document describes a method for creating an
`AMP <https://amp.dev/>`_ version of a Wagtail site and hosting it separately
to the rest of the site on a URL prefix. It also describes how to make Wagtail
render images with the ``<amp-img>`` tag when a user is visiting a page on the
AMP version of the site.
Overview
--------
In the next section, we will add a new URL entry that points at Wagtail's
internal ``serve()`` view which will have the effect of rendering the whole
site again under the ``/amp`` prefix.
Then, we will add some utilities that will allow us to track whether the
current request is in the ``/amp`` prefixed version of the site without needing
a request object.
After that, we will add a template context processor to allow us to check from
within templates which version of the site is being rendered.
Then, finally, we will modify the behaviour of the ``{% image %}`` tag to make it
render ``<amp-img>`` tags when rendering the AMP version of the site.
Creating the second page tree
-----------------------------
We can render the whole site at a different prefix by duplicating the Wagtail
URL in the project ``urls.py`` file and giving it a prefix. This must be before
the default URL from Wagtail, or it will try to find ``/amp`` as a page:
.. code-block:: python
# <project>/urls.py
urlpatterns += [
# Add this line just before the default ``include(wagtail_urls)`` line
url(r'amp/', include(wagtail_urls)),
url(r'', include(wagtail_urls)),
]
If you now open ``http://localhost:8000/amp/`` in your browser, you should see
the homepage.
Making pages aware of "AMP mode"
--------------------------------
All the pages will now render under the ``/amp`` prefix, but right now there
isn't any difference between the AMP version and the normal version.
To make changes, we need to add a way to detect which URL was used to render
the page. To do this, we will have to wrap Wagtail's ``serve()`` view and
set a thread-local to indicate to all downstream code that AMP mode is active.
.. note:: Why a thread-local?
(feel free to skip this part if you're not interested)
Modifying the ``request`` object would be the most common way to do this.
However, the image tag rendering is performed in a part of Wagtail that
does not have access to the request.
Thread-locals are global variables that can have a different value for each
running thread. As each thread only handles one request at a time, we can
use it as a way to pass around data that is specific to that request
without having to pass the request object everywhere.
Django uses thread-locals internally to track the currently active language
for the request.
Please be aware though: In Django 3.x and above, you will need to use an
``asgiref.Local`` instead.
This is because Django 3.x handles multiple requests in a single thread
so thread-locals will no longer be unique to a single request.
Now let's create that thread-local and some utility functions to interact with it,
save this module as ``amp_utils.py`` in an app in your project:
.. code-block:: python
# <app>/amp_utils.py
from contextlib import contextmanager
from threading import local
# FIXME: For Django 3.0 support, replace this with asgiref.Local
_amp_mode_active = local()
@contextmanager
def activate_amp_mode():
"""
A context manager used to activate AMP mode
"""
_amp_mode_active.value = True
try:
yield
finally:
del _amp_mode_active.value
def amp_mode_active():
"""
Returns True if AMP mode is currently active
"""
return hasattr(_amp_mode_active, 'value')
This module defines two functions:
- ``activate_amp_mode`` is a context manager which can be invoked using Python's
``with`` syntax. In the body of the ``with`` statement, AMP mode would be active.
- ``amp_mode_active`` is a function that returns ``True`` when AMP mode is active.
Next, we need to define a view that wraps Wagtail's builtin ``serve`` view and
invokes the ``activate_amp_mode`` context manager:
.. code-block:: python
# <app>/amp_views.py
from django.template.response import SimpleTemplateResponse
from wagtail.core.views import serve as wagtail_serve
from .amp_utils import activate_amp_mode
def serve(request, path):
with activate_amp_mode():
response = wagtail_serve(request, path)
# Render template responses now while AMP mode is still active
if isinstance(response, SimpleTemplateResponse):
response.render()
return response
Then we need to create a ``amp_urls.py`` file in the same app:
.. code-block:: python
# <app>/amp_urls.py
from django.conf.urls import url
from wagtail.core.urls import serve_pattern
from . import amp_views
urlpatterns = [
url(serve_pattern, amp_views.serve, name='wagtail_amp_serve')
]
Finally, we need to update the project's main ``urls.py`` to use this new URLs
file for the ``/amp`` prefix:
.. code-block:: python
# <project>/urls.py
from myapp import amp_urls as wagtail_amp_urls
urlpatterns += [
# Change this line to point at your amp_urls instead of Wagtail's urls
url(r'amp/', include(wagtail_amp_urls)),
url(r'', include(wagtail_urls)),
]
After this, there shouldn't be any noticeable difference to the AMP version of
the site.
Write a template context processor so that AMP state can be checked in templates
--------------------------------------------------------------------------------
This is optional, but worth doing so we can confirm that everything is working
so far.
Add a ``amp_context_processors.py`` file into your app that contains the
following:
.. code-block:: python
# <app>/amp_context_processors.py
from .amp_utils import amp_mode_active
def amp(request):
return {
'amp_mode_active': amp_mode_active(),
}
Now add the path to this context processor to the
``['OPTIONS']['context_processors']`` key of the ``TEMPLATES`` setting:
.. code-block:: python
# Either <project>/settings.py or <project>/settings/base.py
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
# Add this after other context processors
'myapp.amp_context_processors.amp',
],
},
},
]
You should now be able to use the ``amp_mode_active`` variable in templates.
For example:
.. code-block:: html+Django
{% if amp_mode_active %}
AMP MODE IS ACTIVE!
{% endif %}
Using a different page template when AMP mode is active
-------------------------------------------------------
You're probably not going to want to use the same templates on the AMP site as
you do on the regular web site. Let's add some logic in to make Wagtail use a
separate template whenever a page is served with AMP enabled.
We can use a mixin, which allows us to re-use the logic on different page types.
Add the following to the bottom of the amp_utils.py file that you created earlier:
.. code-block:: python
# <app>/amp_utils.py
import os.path
...
class PageAMPTemplateMixin:
@property
def amp_template(self):
# Get the default template name and insert `_amp` before the extension
name, ext = os.path.splitext(self.template)
return name + '_amp' + ext
def get_template(self, request):
if amp_mode_active():
return self.amp_template
return super().get_template(request)
Now add this mixin to any page model, for example:
.. code-block:: python
# <app>/models.py
from .amp_utils import PageAMPTemplateMixin
class MyPageModel(PageAMPTemplateMixin, Page):
...
When AMP mode is active, the template at ``app_label/mypagemodel_amp.html``
will be used instead of the default one.
If you have a different naming convention, you can override the
``amp_template`` attribute on the model. For example:
.. code-block:: python
# <app>/models.py
from .amp_utils import PageAMPTemplateMixin
class MyPageModel(PageAMPTemplateMixin, Page):
amp_template = 'my_custom_amp_template.html'
Overriding the ``{% image %}`` tag to output ``<amp-img>`` tags
---------------------------------------------------------------
Finally, let's change Wagtail's ``{% image %}`` tag, so it renders an ``<amp-img>``
tags when rendering pages with AMP enabled. We'll make the change on the
`Rendition` model itself so it applies to both images rendered with the
``{% image %}`` tag and images rendered in rich text fields as well.
Doing this with a :ref:`Custom image model <custom_image_model>` is easier, as
you can override the ``img_tag`` method on your custom ``Rendition`` model to
return a different tag.
For example:
.. code-block:: python
from django.forms.utils import flatatt
from django.utils.safestring import mark_safe
from wagtail.images.models import AbstractRendition
...
class CustomRendition(AbstractRendition):
def img_tag(self, extra_attributes):
attrs = self.attrs_dict.copy()
attrs.update(extra_attributes)
if amp_mode_active():
return mark_safe('<amp-img{}>'.format(flatatt(attrs)))
else:
return mark_safe('<img{}>'.format(flatatt(attrs)))
...
Without a custom image model, you will have to monkey-patch the builtin
``Rendition`` model.
Add this anywhere in your project where it would be imported on start:
.. code-block:: python
from django.forms.utils import flatatt
from django.utils.safestring import mark_safe
from wagtail.images.models import Rendition
def img_tag(rendition, extra_attributes={}):
"""
Replacement implementation for Rendition.img_tag
When AMP mode is on, this returns an <amp-img> tag instead of an <img> tag
"""
attrs = rendition.attrs_dict.copy()
attrs.update(extra_attributes)
if amp_mode_active():
return mark_safe('<amp-img{}>'.format(flatatt(attrs)))
else:
return mark_safe('<img{}>'.format(flatatt(attrs)))
Rendition.img_tag = img_tag

View file

@ -191,8 +191,8 @@ This adds two fields to the API (other fields omitted for brevity):
"published_date_display": "Thursday 06 April 2017"
}
.. _Serialisers: http://www.django-rest-framework.org/api-guide/fields/
.. _source: http://www.django-rest-framework.org/api-guide/fields/#source
.. _Serialisers: https://www.django-rest-framework.org/api-guide/fields/
.. _source: https://www.django-rest-framework.org/api-guide/fields/#source
Images in the API
-----------------

View file

@ -73,6 +73,6 @@ The following code will add the ``<blockquote>`` element to the whitelist whenev
WhitelistRule('blockquote', allow_without_attributes),
])
``WhitelistRule`` is passed the element name, and a callable which will perform some kind of manipulation of the element whenever it is encountered. This callable receives the element as a `BeautifulSoup <http://www.crummy.com/software/BeautifulSoup/bs4/doc/>`_ Tag object.
``WhitelistRule`` is passed the element name, and a callable which will perform some kind of manipulation of the element whenever it is encountered. This callable receives the element as a `BeautifulSoup <https://www.crummy.com/software/BeautifulSoup/bs4/doc/>`_ Tag object.
The ``wagtail.core.whitelist`` module provides a few helper functions to assist in defining these handlers: ``allow_without_attributes``, a handler which preserves the element but strips out all of its attributes, and ``attribute_rule`` which accepts a dict specifying how to handle each attribute, and returns a handler function. This dict will map attribute names to either True (indicating that the attribute should be kept), False (indicating that it should be dropped), or a callable (which takes the initial attribute value and returns either a final value for the attribute, or None to drop the attribute).

View file

@ -160,7 +160,7 @@ or to add custom validation logic for your models:
from django import forms
from django.db import models
import geocoder # not in Wagtail, for example only - http://geocoder.readthedocs.io/
import geocoder # not in Wagtail, for example only - https://geocoder.readthedocs.io/
from wagtail.admin.edit_handlers import FieldPanel
from wagtail.admin.forms import WagtailAdminPageForm
from wagtail.core.models import Page

View file

@ -196,10 +196,6 @@ This method allows you to register a custom handler deriving from ``wagtail.core
features.register_embed_type(MyCustomEmbedHandler)
.. versionadded:: 2.5
In previous releases, ``register_link_type`` and ``register_embed_type`` accepted two arguments: the identifier for the link or embed type, and a function for performing the rewriting (equivalent to the ``expand_db_attributes`` method).
Editor widgets
--------------

View file

@ -14,7 +14,7 @@ On Divio Cloud
`Divio Cloud <https://divio.com/>`_ is a Dockerised cloud hosting platform for Python/Django that allows you to launch and deploy Wagtail projects in minutes. With a free account, you can create a Wagtail project. Choose from a:
* `site based on the Wagtail Bakery project <https://divio.com/wagtail>`_, or
* `brand new Wagtail project <https://control.divio.com/control/project/create>`_ (see the `how to get started notes <http://support.divio.com/project-types/wagtail/get-started-with-wagtail-on-divio-cloud>`_).
* `brand new Wagtail project <https://control.divio.com/control/project/create>`_ (see the `how to get started notes <https://support.divio.com/project-types/wagtail/get-started-with-wagtail-on-divio-cloud>`_).
Divio Cloud also hosts a `live Wagtail Bakery demo <https://divio.com/wagtail>`_ (no account required).
@ -26,7 +26,7 @@ On PythonAnywhere
On other PAASs and IAASs
~~~~~~~~~~~~~~~~~~~~~~~~
We know of Wagtail sites running on `Heroku <http://spapas.github.io/2014/02/13/wagtail-tutorial/>`_, Digital Ocean and elsewhere. If you have successfully installed Wagtail on your platform or infrastructure, please :doc:`contribute </contributing/index>` your notes to this documentation!
We know of Wagtail sites running on `Heroku <https://spapas.github.io/2014/02/13/wagtail-tutorial/>`_, Digital Ocean and elsewhere. If you have successfully installed Wagtail on your platform or infrastructure, please :doc:`contribute </contributing/index>` your notes to this documentation!
Deployment tips
~~~~~~~~~~~~~~~

View file

@ -1,3 +1,5 @@
.. _custom_document_model:
=====================
Custom document model
=====================
@ -62,6 +64,8 @@ Then in your settings module:
Referring to the document model
===============================
.. module:: wagtail.documents.models
.. module:: wagtail.documents
.. autofunction:: get_document_model
.. autofunction:: get_document_model_string

View file

@ -204,8 +204,10 @@ and a common video playback API which is useful if your site allows videos to
be hosted on different providers and you need to implement custom controls for
them.
Wagtail has built in support for fetching embeds from Embed.ly. To use it, add
an embed finder to your ``WAGTAILEMBEDS_FINDERS`` setting that uses the
Wagtail has built in support for fetching embeds from Embed.ly. To use it,
first pip install the ``Embedly`` `python package <https://pypi.org/project/Embedly/>`_.
Now add an embed finder to your ``WAGTAILEMBEDS_FINDERS`` setting that uses the
``wagtail.embeds.finders.oembed`` class and pass it your API key:
.. code-block:: python

View file

@ -1,161 +0,0 @@
===========================================================
Creating a multilingual site (by duplicating the page tree)
===========================================================
This tutorial will show you a method of creating multilingual sites in Wagtail by duplicating the page tree.
For example::
/
en/
about/
contact/
fr/
about/
contact/
The root page
=============
The root page (``/``) should detect the browsers language and forward them to the correct language homepage (``/en/``, ``/fr/``). This page should sit at the site root (where the homepage would normally be).
We must set Django's ``LANGUAGES`` setting so we don't redirect non English/French users to pages that don't exist.
.. code-block:: python
# settings.py
LANGUAGES = (
('en', _("English")),
('fr', _("French")),
)
# models.py
from django.utils import translation
from django.http import HttpResponseRedirect
from wagtail.core.models import Page
class LanguageRedirectionPage(Page):
def serve(self, request):
# This will only return a language that is in the LANGUAGES Django setting
language = translation.get_language_from_request(request)
return HttpResponseRedirect(self.url + language + '/')
Linking pages together
======================
It may be useful to link different versions of the same page together to allow the user to easily switch between languages. But we don't want to increase the burden on the editor too much so ideally, editors should only need to link one of the pages to the other versions and the links between the other versions should be created implicitly.
As this behaviour needs to be added to all page types that would be translated, its best to put this behaviour in a mixin.
Here's an example of how this could be implemented (with English as the main language and French/Spanish as alternative languages):
.. code-block:: python
from wagtail.core.models import Page
from wagtail.admin.edit_handlers import MultiFieldPanel, PageChooserPanel
class TranslatablePageMixin(models.Model):
# One link for each alternative language
# These should only be used on the main language page (english)
french_link = models.ForeignKey(Page, null=True, on_delete=models.SET_NULL, blank=True, related_name='+')
spanish_link = models.ForeignKey(Page, null=True, on_delete=models.SET_NULL, blank=True, related_name='+')
panels = [
PageChooserPanel('french_link'),
PageChooserPanel('spanish_link'),
]
def get_language(self):
"""
This returns the language code for this page.
"""
# Look through ancestors of this page for its language homepage
# The language homepage is located at depth 3
language_homepage = self.get_ancestors(inclusive=True).get(depth=3)
# The slug of language homepages should always be set to the language code
return language_homepage.slug
# Method to find the main language version of this page
# This works by reversing the above links
def english_page(self):
"""
This finds the english version of this page
"""
language = self.get_language()
if language == 'en':
return self
elif language == 'fr':
return type(self).objects.filter(french_link=self).first().specific
elif language == 'es':
return type(self).objects.filter(spanish_link=self).first().specific
# We need a method to find a version of this page for each alternative language.
# These all work the same way. They firstly find the main version of the page
# (english), then from there they can just follow the link to the correct page.
def french_page(self):
"""
This finds the french version of this page
"""
english_page = self.english_page()
if english_page and english_page.french_link:
return english_page.french_link.specific
def spanish_page(self):
"""
This finds the spanish version of this page
"""
english_page = self.english_page()
if english_page and english_page.spanish_link:
return english_page.spanish_link.specific
class Meta:
abstract = True
class AboutPage(Page, TranslatablePageMixin):
...
content_panels = [
...
MultiFieldPanel(TranslatablePageMixin.panels, 'Language links')
]
class ContactPage(Page, TranslatablePageMixin):
...
content_panels = [
...
MultiFieldPanel(TranslatablePageMixin.panels, 'Language links')
]
You can make use of these methods in your template by doing:
.. code-block:: html+django
{% if page.english_page and page.get_language != 'en' %}
<a href="{{ page.english_page.url }}">{% trans "View in English" %}</a>
{% endif %}
{% if page.french_page and page.get_language != 'fr' %}
<a href="{{ page.french_page.url }}">{% trans "View in French" %}</a>
{% endif %}
{% if page.spanish_page and page.get_language != 'es' %}
<a href="{{ page.spanish_page.url }}">{% trans "View in Spanish" %}</a>
{% endif %}

View file

@ -1,218 +0,0 @@
====================
Internationalisation
====================
This document describes the internationalisation features of Wagtail and how to create multi-lingual sites.
Wagtail uses Django's :doc:`Internationalisation framework <django:topics/i18n/index>` so most of the steps are the same as other Django projects.
.. contents::
Wagtail admin translations
==========================
The Wagtail admin backend has been translated into many different languages. You can find a list of currently available translations on Wagtail's `Transifex page <https://www.transifex.com/torchbox/wagtail/>`_. (Note: if you're using an old version of Wagtail, this page may not accurately reflect what languages you have available).
If your language isn't listed on that page, you can easily contribute new languages or correct mistakes. Sign up and submit changes to `Transifex <https://www.transifex.com/torchbox/wagtail/>`_. Translation updates are typically merged into an official release within one month of being submitted.
Change Wagtail admin language on a per user basis
=================================================
Logged-in users can set their preferred language from ``/admin/account/``.
By default, Wagtail provides a list of languages that have a >= 90% translation coverage.
It is possible to override this list via the :ref:`WAGTAILADMIN_PERMITTED_LANGUAGES <WAGTAILADMIN_PERMITTED_LANGUAGES>` setting.
In case there is zero or one language permitted, the form will be hidden.
If there is no language selected by the user, the ``LANGUAGE_CODE`` wil be used.
Changing the primary language of your Wagtail installation
==========================================================
The default language of Wagtail is ``en-us`` (American English). You can change this by tweaking a couple of Django settings:
- Make sure `USE_I18N <https://docs.djangoproject.com/en/stable/ref/settings/#use-i18n>`_ is set to ``True``
- Set `LANGUAGE_CODE <https://docs.djangoproject.com/en/stable/ref/settings/#std:setting-LANGUAGE_CODE>`_ to your websites' primary language
If there is a translation available for your language, the Wagtail admin backend should now be in the language you've chosen.
Creating sites with multiple languages
======================================
You can create sites with multiple language support by leveraging Django's :doc:`translation features <django:topics/i18n/translation>`.
This section of the documentation will show you how to use Django's translation features with Wagtail and also describe a couple of methods for storing/retrieving translated content using Wagtail pages.
Enabling multiple language support
----------------------------------
Firstly, make sure the `USE_I18N <https://docs.djangoproject.com/en/stable/ref/settings/#use-i18n>`_ Django setting is set to ``True``.
To enable multi-language support, add ``django.middleware.locale.LocaleMiddleware`` to your ``MIDDLEWARE``:
.. code-block:: python
MIDDLEWARE = (
...
'django.middleware.locale.LocaleMiddleware',
)
This middleware class looks at the user's browser language and sets the :ref:`language of the site accordingly <django:how-django-discovers-language-preference>`.
Serving different languages from different URLs
-----------------------------------------------
Just enabling the multi-language support in Django sometimes may not be enough. By default, Django will serve different languages of the same page with the same URL. This has a couple of drawbacks:
- Users cannot change language without changing their browser settings
- It may not work well with various caching setups (as content varies based on browser settings)
Django's ``i18n_patterns`` feature, when enabled, prefixes the URLs with the language code (eg ``/en/about-us``). Users are forwarded to their preferred version, based on browser language, when they first visit the site.
This feature is enabled through the project's root URL configuration. Just put the views you would like to have this enabled for in an ``i18n_patterns`` list and append that to the other URL patterns:
.. code-block:: python
# mysite/urls.py
from django.conf.urls import include, re_path
from django.conf.urls.i18n import i18n_patterns
from django.conf import settings
from django.contrib import admin
from wagtail.admin import urls as wagtailadmin_urls
from wagtail.documents import urls as wagtaildocs_urls
from wagtail.core import urls as wagtail_urls
from search import views as search_views
urlpatterns = [
re_path(r'^django-admin/', include(admin.site.urls)),
re_path(r'^admin/', include(wagtailadmin_urls)),
re_path(r'^documents/', include(wagtaildocs_urls)),
]
urlpatterns += i18n_patterns(
# These URLs will have /<language_code>/ appended to the beginning
re_path(r'^search/$', search_views.search, name='search'),
re_path(r'', include(wagtail_urls)),
)
You can implement switching between languages by changing the part at the beginning of the URL. As each language has its own URL, it also works well with just about any caching setup.
Translating templates
---------------------
Static text in templates needs to be marked up in a way that allows Django's ``makemessages`` command to find and export the strings for translators and also allow them to switch to translated versions on the when the template is being served.
As Wagtail uses Django's templates, inserting this markup and the workflow for exporting and translating the strings is the same as any other Django project.
See: https://docs.djangoproject.com/en/stable/topics/i18n/translation/#internationalization-in-template-code
Translating content
-------------------
The most common approach for translating content in Wagtail is to duplicate each translatable text field, providing a separate field for each language.
This section will describe how to implement this method manually but there is a third party module you can use, `wagtail modeltranslation <https://github.com/infoportugal/wagtail-modeltranslation>`_, which may be quicker if it meets your needs.
**Duplicating the fields in your model**
For each field you would like to be translatable, duplicate it for every language you support and suffix it with the language code:
.. code-block:: python
class BlogPage(Page):
title_fr = models.CharField(max_length=255)
body_en = StreamField(...)
body_fr = StreamField(...)
# Language-independent fields don't need to be duplicated
thumbnail_image = models.ForeignKey('wagtailimages.Image', on_delete=models.SET_NULL, null=True, ...)
.. note::
We only define the French version of the ``title`` field as Wagtail already provides the English version for us.
**Organising the fields in the admin interface**
You can either put all the fields with their translations next to each other on the "content" tab or put the translations for other languages on different tabs.
See :ref:`customising_the_tabbed_interface` for information on how to add more tabs to the admin interface.
**Accessing the fields from the template**
In order for the translations to be shown on the site frontend, the correct field needs to be used in the template based on what language the client has selected.
Having to add language checks every time you display a field in a template, could make your templates very messy. Here's a little trick that will allow you to implement this while keeping your templates and model code clean.
You can use a snippet like the following to add accessor fields on to your page model. These accessor fields will point at the field that contains the language the user has selected.
Copy this into your project and make sure it's imported in any ``models.py`` files that contain a ``Page`` with translated fields. It will require some modification to support different languages.
.. code-block:: python
from django.utils import translation
class TranslatedField:
def __init__(self, en_field, fr_field):
self.en_field = en_field
self.fr_field = fr_field
def __get__(self, instance, owner):
if translation.get_language() == 'fr':
return getattr(instance, self.fr_field)
else:
return getattr(instance, self.en_field)
Then, for each translated field, create an instance of ``TranslatedField`` with a nice name (as this is the name your templates will reference).
For example, here's how we would apply this to the above ``BlogPage`` model:
.. code-block:: python
class BlogPage(Page):
...
translated_title = TranslatedField(
'title',
'title_fr',
)
body = TranslatedField(
'body_en',
'body_fr',
)
Finally, in the template, reference the accessors instead of the underlying database fields:
.. code-block:: html+django
{{ page.translated_title }}
{{ page.body }}
Other approaches
----------------
.. toctree::
duplicate_tree

View file

@ -0,0 +1,47 @@
.. _image_file_formats:
Image file formats
==================
Using the picture element
-------------------------
The `picture element <https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture>`_
can be used with the ``format-<type>`` image operation to specify different
image formats and let the browser choose the one it prefers. For example:
.. code-block:: python
{% load wagtailimages_tags %}
<picture>
{% image myimage width-1000 format-webp as image_webp %}
<source srcset="{{ image_webp.url }}" type="image/webp">
{% image myimage width-1000 format-png as image_png %}
<source srcset="{{ image_png.url }}" type="image/png">
{{ image_png }}
</picture>
Customizing output formats
--------------------------
By default all ``bmp`` and ``webp`` images are converted to the ``png`` format
when no image output format is given.
The default conversion mapping can be changed by setting the
``WAGTAILIMAGES_FORMAT_CONVERSIONS`` to a dictionary which maps the input type
to an output type.
For example:
.. code-block:: python
WAGTAILIMAGES_FORMAT_CONVERSIONS = {
'bmp': 'jpeg',
'webp': 'webp',
}
will convert ``bmp`` images to ``jpeg`` and disable the default ``webp``
to ``png`` conversion.

View file

@ -7,6 +7,7 @@ Images
renditions
animated_gifs
image_file_formats
custom_image_model
changing_rich_text_representation
feature_detection

View file

@ -8,13 +8,13 @@ Advanced topics
images/index
documents/index
embeds
settings
add_to_django_project
deploying
performance
i18n/index
privacy
customisation/index
third_party_tutorials
jinja2
testing
api/index
amp

View file

@ -13,7 +13,7 @@ We have tried to minimise external dependencies for a working installation of Wa
Cache
-----
We recommend `Redis <http://redis.io/>`_ as a fast, persistent cache. Install Redis through your package manager (on Debian or Ubuntu: ``sudo apt-get install redis-server``), add ``django-redis`` to your ``requirements.txt``, and enable it as a cache backend:
We recommend `Redis <https://redis.io/>`_ as a fast, persistent cache. Install Redis through your package manager (on Debian or Ubuntu: ``sudo apt-get install redis-server``), add ``django-redis`` to your ``requirements.txt``, and enable it as a cache backend:
.. code-block:: python
@ -33,7 +33,7 @@ We recommend `Redis <http://redis.io/>`_ as a fast, persistent cache. Install Re
Search
------
Wagtail has strong support for `Elasticsearch <http://www.elasticsearch.org/>`_ - both in the editor interface and for users of your site - but can fall back to a database search if Elasticsearch isn't present. Elasticsearch is faster and more powerful than the Django ORM for text search, so we recommend installing it or using a hosted service like `Searchly <http://www.searchly.com/>`_.
Wagtail has strong support for `Elasticsearch <https://www.elastic.co>`_ - both in the editor interface and for users of your site - but can fall back to a database search if Elasticsearch isn't present. Elasticsearch is faster and more powerful than the Django ORM for text search, so we recommend installing it or using a hosted service like `Searchly <http://www.searchly.com/>`_.
For details on configuring Wagtail for Elasticsearch, see :ref:`wagtailsearch_backends_elasticsearch`.
@ -75,6 +75,6 @@ Public users
Caching proxy
-------------
To support high volumes of traffic with excellent response times, we recommend a caching proxy. Both `Varnish <http://www.varnish-cache.org/>`_ and `Squid <http://www.squid-cache.org/>`_ have been tested in production. Hosted proxies like `Cloudflare <https://www.cloudflare.com/>`_ should also work well.
To support high volumes of traffic with excellent response times, we recommend a caching proxy. Both `Varnish <https://varnish-cache.org/>`_ and `Squid <http://www.squid-cache.org/>`_ have been tested in production. Hosted proxies like `Cloudflare <https://www.cloudflare.com/>`_ should also work well.
Wagtail supports automatic cache invalidation for Varnish/Squid. See :ref:`frontend_cache_purging` for more information.

View file

@ -163,4 +163,4 @@ Filling in the ``path`` / ``numchild`` / ``depth`` fields is necessary in order
The `Treebeard docs`_ might help in understanding how this works.
.. _dumpdata: https://docs.djangoproject.com/en/2.0/ref/django-admin/#django-admin-dumpdata
.. _Treebeard docs: http://django-treebeard.readthedocs.io/en/latest/mp_tree.html
.. _Treebeard docs: https://django-treebeard.readthedocs.io/en/latest/mp_tree.html

View file

@ -24,20 +24,20 @@ Third-party tutorials
* `Wagtail-Multilingual: a simple project to demonstrate how multilingual is implemented <https://github.com/cristovao-alves/Wagtail-Multilingual>`_ (31 January 2017)
* `Wagtail: 2 Steps for Adding Pages Outside of the CMS <https://www.caktusgroup.com/blog/2016/02/15/wagtail-2-steps-adding-pages-outside-cms/>`_ (15 February 2016)
* `Adding a Twitter Widget for Wagtails new StreamField <https://jossingram.wordpress.com/2015/04/02/adding-a-twitter-widget-for-wagtails-new-streamfield/>`_ (2 April 2015)
* `Working With Wagtail: Menus <http://www.tivix.com/blog/working-with-wagtail-menus/>`_ (22 January 2015)
* `Working With Wagtail: Menus <https://www.tivix.com/blog/working-with-wagtail-menus/>`_ (22 January 2015)
* `Upgrading Wagtail to use Django 1.7 locally using vagrant <https://jossingram.wordpress.com/2014/12/10/upgrading-wagtail-to-use-django-1-7-locally-using-vagrant/>`_ (10 December 2014)
* `Wagtail redirect page. Can link to page, URL and document <https://gist.github.com/alej0varas/e7e334643ceab6e65744>`_ (24 September 2014)
* `Outputing JSON for a model with properties and db fields in Wagtail/Django <https://jossingram.wordpress.com/2014/09/24/outputing-json-for-a-model-with-properties-and-db-fields-in-wagtaildjango/>`_ (24 September 2014)
* `Bi-lingual website using Wagtail CMS <https://jossingram.wordpress.com/2014/09/17/bi-lingual-website-using-wagtail-cms/>`_ (17 September 2014)
* `Wagtail CMS Lesser known features <https://jossingram.wordpress.com/2014/09/12/wagtail-cms-lesser-known-features/>`_ (12 September 2014)
* `Wagtail notes: stateful on/off hallo.js plugins <http://www.coactivate.org/projects/ejucovy/blog/2014/08/09/wagtail-notes-stateful-onoff-hallojs-plugins/>`_ (9 August 2014)
* `Wagtail notes: stateful on/off hallo.js plugins <https://www.coactivate.org/projects/ejucovy/blog/2014/08/09/wagtail-notes-stateful-onoff-hallojs-plugins/>`_ (9 August 2014)
* `Add some blockquote buttons to Wagtail CMS WYSIWYG Editor <https://jossingram.wordpress.com/2014/07/24/add-some-blockquote-buttons-to-wagtail-cms-wysiwyg-editor/>`_ (24 July 2014)
* `Adding Bread Crumbs to the front end in Wagtail CMS <https://jossingram.wordpress.com/2014/07/01/adding-bread-crumbs-to-the-front-end-in-wagtail-cms/>`_ (1 July 2014)
* `Extending hallo.js using Wagtail hooks <https://gist.github.com/jeffrey-hearn/502d0914fa4a930f08ac>`_ (9 July 2014)
* `Wagtail notes: custom tabs per page type <http://www.coactivate.org/projects/ejucovy/blog/2014/05/10/wagtail-notes-custom-tabs-per-page-type/>`_ (10 May 2014)
* `Wagtail notes: managing redirects as pages <http://www.coactivate.org/projects/ejucovy/blog/2014/05/10/wagtail-notes-managing-redirects-as-pages/>`_ (10 May 2014)
* `Wagtail notes: dynamic templates per page <http://www.coactivate.org/projects/ejucovy/blog/2014/05/10/wagtail-notes-dynamic-templates-per-page/>`_ (10 May 2014)
* `Wagtail notes: type-constrained PageChooserPanel <http://www.coactivate.org/projects/ejucovy/blog/2014/05/09/wagtail-notes-type-constrained-pagechooserpanel/>`_ (9 May 2014)
* `Wagtail notes: custom tabs per page type <https://www.coactivate.org/projects/ejucovy/blog/2014/05/10/wagtail-notes-custom-tabs-per-page-type/>`_ (10 May 2014)
* `Wagtail notes: managing redirects as pages <https://www.coactivate.org/projects/ejucovy/blog/2014/05/10/wagtail-notes-managing-redirects-as-pages/>`_ (10 May 2014)
* `Wagtail notes: dynamic templates per page <https://www.coactivate.org/projects/ejucovy/blog/2014/05/10/wagtail-notes-dynamic-templates-per-page/>`_ (10 May 2014)
* `Wagtail notes: type-constrained PageChooserPanel <https://www.coactivate.org/projects/ejucovy/blog/2014/05/09/wagtail-notes-type-constrained-pagechooserpanel/>`_ (9 May 2014)
You can also find more resources from the community on `Awesome Wagtail <https://github.com/springload/awesome-wagtail>`_.

View file

@ -7,8 +7,8 @@ Compiling
~~~~~~~~~
The SCSS source files are compiled to CSS using the
`gulp <http://gulpjs.com/>`_ build system.
This requires `Node.js <http://nodejs.org>`_ to run.
`gulp <https://gulpjs.com/>`_ build system.
This requires `Node.js <https://nodejs.org>`_ to run.
To install the libraries required for compiling the SCSS,
run the following from the Wagtail repository root:

View file

@ -18,7 +18,7 @@ Setting up the Wagtail codebase
Install Node.js, version 8. Instructions for installing Node.js can be found on the `Node.js download page <https://nodejs.org/download/>`_.
You can also use Node version manager (nvm) since Wagtail supplies a ``.nvmrc`` file in the root of the project with the minimum required Node version - see nvm's `installation instructions <https://github.com/creationix/nvm>`_.
You will also need to install the **libjpeg** and **zlib** libraries, if you haven't done so already - see Pillow's `platform-specific installation instructions <http://pillow.readthedocs.org/en/latest/installation.html#external-libraries>`_.
You will also need to install the **libjpeg** and **zlib** libraries, if you haven't done so already - see Pillow's `platform-specific installation instructions <https://pillow.readthedocs.org/en/latest/installation.html#external-libraries>`_.
Clone a copy of `the Wagtail codebase <https://github.com/wagtail/wagtail>`_:
@ -77,7 +77,7 @@ an argument to ``runtests.py`` or ``tox``:
$ python runtests.py wagtail.core
$ # Running in a specified Tox environment
$ tox -e py36-dj20-sqlite-noelasticsearch wagtail.core
$ tox -e py36-dj22-sqlite-noelasticsearch wagtail.core
$ # See a list of available Tox environments
$ tox -l
@ -91,7 +91,7 @@ an argument to ``runtests.py``
$ python runtests.py wagtail.core.tests.test_blocks.TestIntegerBlock
$ # Running in a specified Tox environment
$ tox -e py36-dj20-sqlite-noelasticsearch wagtail.core.tests.test_blocks.TestIntegerBlock
$ tox -e py36-dj22-sqlite-noelasticsearch wagtail.core.tests.test_blocks.TestIntegerBlock
Running migrations for the test app models
------------------------------------------

View file

@ -12,6 +12,6 @@ Principles
~~~~~~~~~~
* Write `valid HTML <https://validator.w3.org/nu/>`_. We target the HTML5 doctype.
* Write `semantic HTML <http://html5doctor.com/element-index/>`_.
* Write `semantic HTML <https://html5doctor.com/element-index/>`_.
* Attach JavaScript behavior with ``data-`` attributes, rather than classes or IDs.
* For comments, use Django templates syntax instead of HTML.

View file

@ -8,7 +8,7 @@ Issues
An issue must always correspond to a specific action with a well-defined completion state: fixing a bug, adding a new feature, updating documentation, cleaning up code. Open-ended issues where the end result is not immediately clear ("come up with a way of doing translations") are fine, as long as there's a clear way to progress the issue and identify when it has been completed (not e.g. "make rich text fields suck less").
Do not use issues for support queries or other questions ("How do I do X?" - although "Implement a way of doing X" or "Document how to do X" could well be valid issues). These should be asked on `Stack Overflow <http://stackoverflow.com/questions/tagged/wagtail>`_, or for discussions that do not fit Stack Overflow's question-and-answer format, the `Wagtail Support Google group <https://groups.google.com/forum/#!forum/wagtail>`_.
Do not use issues for support queries or other questions ("How do I do X?" - although "Implement a way of doing X" or "Document how to do X" could well be valid issues). These should be asked on `Stack Overflow <https://stackoverflow.com/questions/tagged/wagtail>`_, or for discussions that do not fit Stack Overflow's question-and-answer format, the `Wagtail Support Google group <https://groups.google.com/forum/#!forum/wagtail>`_.
As soon as a ticket is opened - ideally within one day - a member of the core team will give it an initial classification, by either closing it as invalid or assigning it to a milestone. Don't be discouraged if you feel that your ticket has been given a lower priority than it deserves - this decision isn't permanent. We will consider all feedback, and reassign or reopen tickets where appropriate.

View file

@ -1,7 +1,7 @@
JavaScript coding guidelines
============================
Write JavaScript according to the `Airbnb Styleguide <http://github.com/airbnb/javascript>`_, with some exceptions:
Write JavaScript according to the `Airbnb Styleguide <https://github.com/airbnb/javascript>`_, with some exceptions:
- Use soft-tabs with a four space indent. Spaces are the only way to
guarantee code renders the same in any person's environment.

View file

@ -4,11 +4,11 @@ Python coding guidelines
PEP8
~~~~
We ask that all Python contributions adhere to the `PEP8 <http://www.python.org/dev/peps/pep-0008/>`_ style guide, apart from the restriction on line length (E501) and some minor docstring-related issues.
The list of PEP8 violations to ignore is in the ``tox.ini`` file, under the ``[flake8]`` header.
We ask that all Python contributions adhere to the `PEP8 <https://www.python.org/dev/peps/pep-0008/>`_ style guide, apart from the restriction on line length (E501) and some minor docstring-related issues.
The list of PEP8 violations to ignore is in the ``setup.cfg`` file, under the ``[flake8]`` header.
You might want to configure the flake8 linter in your editor/IDE to use the configuration in this file.
In addition, import lines should be sorted according to `isort <http://timothycrosley.github.io/isort/>`_ 4.2.5 rules. If you have installed Wagtail's testing dependencies (``pip install -e .[testing]``), you can check your code by running ``make lint``.
In addition, import lines should be sorted according to `isort <https://timothycrosley.github.io/isort/>`_ 4.2.5 rules. If you have installed Wagtail's testing dependencies (``pip install -e .[testing]``), you can check your code by running ``make lint``.
Django compatibility
~~~~~~~~~~~~~~~~~~~~

View file

@ -53,7 +53,7 @@ issued from those branches.
Release cadence
===============
Wagtail uses a loose form of `semantic versioning <http://semver.org/>`_.
Wagtail uses a loose form of `semantic versioning <https://semver.org/>`_.
SemVer makes it easier to see at a glance how compatible releases are with each
other. It also helps to anticipate when compatibility shims will be removed.
It's not a pure form of SemVer as each feature release will continue to have a

View file

@ -1,11 +1,11 @@
Browser issues
~~~~~~~~~~~~~~
Some issues with Wagtail may come from the browser. Try `clearing the browser cache and cookies <http://www.refreshyourcache.com/>`_, or you can also try using Wagtail with `another browser <http://browsehappy.com/>`_ to see if the problem persists.
Some issues with Wagtail may come from the browser. Try `clearing the browser cache and cookies <https://www.refreshyourcache.com/>`_, or you can also try using Wagtail with `another browser <https://browsehappy.com/>`_ to see if the problem persists.
JavaScript is required to use Wagtail make sure it is `enabled in your browser <http://www.enable-javascript.com/>`_.
JavaScript is required to use Wagtail make sure it is `enabled in your browser <https://www.enable-javascript.com/>`_.
Supported browsers
__________________
For the best experience and security, we recommend that you keep your browser up to date. Go to `Browse Happy <http://browsehappy.com/>`_ for more information.
For the best experience and security, we recommend that you keep your browser up to date. Go to `Browse Happy <https://browsehappy.com/>`_ for more information.

View file

@ -7,12 +7,13 @@ Documents such as PDFs can be managed from the Documents interface, available in
* Add documents by clicking the *Add document* button in the top-right.
* Search for documents in the CMS by entering your search term in the search bar. The results will be automatically updated as you type.
* You can also filter the results by *Popular tags*. Click on a tag to update the search results listing.
* You can also filter the results by *Collection* by selecting one from the collections dropdown above the documents list.
* Edit the details of a document by clicking the document title.
.. image:: ../../_static/images/screen30_documents_edit_page.png
* When editing a document you can replace the file associated with that document record. This means you can update documents without having to update the pages on which they are placed. Changing the file will change it on all pages that use the document.
* Change the document's collection using the collection dropdown.
* Add or remove tags using the Tags field.
* Save or delete documents using the buttons at the bottom of the interface.

View file

@ -1,7 +1,7 @@
Introduction
------------
`Wagtail <http://www.wagtail.io>`_ is a new open source content management system (CMS) developed by `Torchbox <http://www.torchbox.com>`_. It is built on the Django framework and designed to be super easy to use for both developers and editors.
`Wagtail <https://wagtail.io>`_ is a new open source content management system (CMS) developed by `Torchbox <https://torchbox.com>`_. It is built on the Django framework and designed to be super easy to use for both developers and editors.
This documentation will explain how to:

View file

@ -13,7 +13,7 @@ Dependencies needed for installation
* `Python 3 <https://www.python.org/downloads/>`_
* **libjpeg** and **zlib**, libraries required for Django's **Pillow** library.
See Pillow's `platform-specific installation instructions <http://pillow.readthedocs.org/en/latest/installation.html#external-libraries>`_.
See Pillow's `platform-specific installation instructions <https://pillow.readthedocs.org/en/latest/installation.html#external-libraries>`_.
Quick install

View file

@ -11,7 +11,7 @@ Wagtail is currently compatible with Django 2.0, 2.1 and 2.2. First, install the
$ pip install wagtail
or add the package to your existing requirements file. This will also install the **Pillow** library as a dependency, which requires libjpeg and zlib - see Pillow's `platform-specific installation instructions <http://pillow.readthedocs.org/en/latest/installation.html#external-libraries>`_.
or add the package to your existing requirements file. This will also install the **Pillow** library as a dependency, which requires libjpeg and zlib - see Pillow's `platform-specific installation instructions <https://pillow.readthedocs.org/en/latest/installation.html#external-libraries>`_.
Settings
--------
@ -64,7 +64,7 @@ Add a ``WAGTAIL_SITE_NAME`` - this will be displayed on the main dashboard of th
WAGTAIL_SITE_NAME = 'My Example Site'
Various other settings are available to configure Wagtail's behaviour - see :doc:`/advanced_topics/settings`.
Various other settings are available to configure Wagtail's behaviour - see :doc:`/reference/settings`.
URL configuration
-----------------

View file

@ -24,7 +24,7 @@ If this does not return a version number or returns a version lower than 3.5, yo
.. important::
Before installing Wagtail, it is necessary to install the **libjpeg** and **zlib** libraries, which provide support for working with JPEG, PNG and GIF images (via the Python **Pillow** library).
The way to do this varies by platform—see Pillow's
`platform-specific installation instructions <http://pillow.readthedocs.org/en/latest/installation.html#external-libraries>`_.
`platform-specific installation instructions <https://pillow.readthedocs.org/en/latest/installation.html#external-libraries>`_.
Create and activate a virtual environment

View file

@ -47,7 +47,7 @@ Set ``WAGTAILFRONTENDCACHE_LANGUAGES`` to a list of languages (typically equal t
Finally, make sure you have configured your frontend cache to accept PURGE requests:
- `Varnish <https://www.varnish-cache.org/docs/3.0/tutorial/purging.html>`_
- `Squid <http://wiki.squid-cache.org/SquidFaq/OperatingSquid#How_can_I_purge_an_object_from_my_cache.3F>`_
- `Squid <https://wiki.squid-cache.org/SquidFaq/OperatingSquid#How_can_I_purge_an_object_from_my_cache.3F>`_
.. _frontendcache_cloudflare:
@ -57,10 +57,17 @@ Cloudflare
Firstly, you need to register an account with Cloudflare if you haven't already got one. You can do this here: `Cloudflare Sign up <https://www.cloudflare.com/sign-up>`_
Add an item into the ``WAGTAILFRONTENDCACHE`` and set the ``BACKEND`` parameter to ``wagtail.contrib.frontend_cache.backends.CloudflareBackend``. This backend requires three extra parameters, ``EMAIL`` (your Cloudflare account email), ``TOKEN`` (your API token from Cloudflare), and ``ZONEID`` (for zone id for your domain, see below).
Add an item into the ``WAGTAILFRONTENDCACHE`` and set the ``BACKEND`` parameter to ``wagtail.contrib.frontend_cache.backends.CloudflareBackend``.
To find the ``ZONEID`` for your domain, read the `Cloudflare API Documentation <https://api.cloudflare.com/#getting-started-resource-ids>`_
This backend can be configured to use an account-wide API key, or an API token with restricted access.
To use an account-wide API key, find the key `as described in the Cloudflare documentation <https://support.cloudflare.com/hc/en-us/articles/200167836-Managing-API-Tokens-and-Keys#12345682>`_ and specify ``EMAIL`` and ``API_KEY`` parameters.
To use a limited API token, `create a token <https://support.cloudflare.com/hc/en-us/articles/200167836-Managing-API-Tokens-and-Keys#12345680>`_ configured with the 'Zone, Cache Purge' permission and specify the ``BEARER_TOKEN`` parameter.
A ``ZONEID`` parameter will need to be set for either option. To find the ``ZONEID`` for your domain, read the `Cloudflare API Documentation <https://api.cloudflare.com/#getting-started-resource-ids>`_
With an API key:
.. code-block:: python
@ -70,7 +77,21 @@ To find the ``ZONEID`` for your domain, read the `Cloudflare API Documentation <
'cloudflare': {
'BACKEND': 'wagtail.contrib.frontend_cache.backends.CloudflareBackend',
'EMAIL': 'your-cloudflare-email-address@example.com',
'TOKEN': 'your cloudflare api token',
'API_KEY': 'your cloudflare api key',
'ZONEID': 'your cloudflare domain zone id',
},
}
With an API token:
.. code-block:: python
# settings.py
WAGTAILFRONTENDCACHE = {
'cloudflare': {
'BACKEND': 'wagtail.contrib.frontend_cache.backends.CloudflareBackend',
'BEARER_TOKEN': 'your cloudflare bearer token',
'ZONEID': 'your cloudflare domain zone id',
},
}
@ -93,7 +114,7 @@ Add an item into the ``WAGTAILFRONTENDCACHE`` and set the ``BACKEND`` parameter
},
}
Configuration of credentials can done in multiple ways. You won't need to store them in your Django settings file. You can read more about this here: `Boto 3 Docs <http://boto3.readthedocs.org/en/latest/guide/configuration.html>`_
Configuration of credentials can done in multiple ways. You won't need to store them in your Django settings file. You can read more about this here: `Boto 3 Docs <https://boto3.readthedocs.org/en/latest/guide/configuration.html>`_
In case you run multiple sites with Wagtail and each site has its CloudFront distribution, provide a mapping instead of a single distribution. Make sure the mapping matches with the hostnames provided in your site settings.

View file

@ -62,11 +62,10 @@ Or alternatively:
])
.. versionadded:: 2.5
``edit_handler`` and ``panels`` can alternatively be
defined on a ``ModelAdmin`` definition. This feature is especially useful
for use cases where you have to work with models that are
'out of reach' (due to being part of a third-party package, for example).
``edit_handler`` and ``panels`` can alternatively be
defined on a ``ModelAdmin`` definition. This feature is especially useful
for use cases where you have to work with models that are
'out of reach' (due to being part of a third-party package, for example).
.. code-block:: python
@ -204,7 +203,6 @@ on the Model itself is more complicated.
-----------------------------------
``ModelAdmin.get_edit_handler()``
-----------------------------------
.. versionadded:: 2.5
**Must return**: An instance of ``wagtail.admin.edit_handlers.ObjectList``

View file

@ -432,6 +432,7 @@ For example:
class PersonAdmin(ModelAdmin):
model = Person
list_display = ('first_name', 'last_name')
def get_queryset(self, request):
@ -664,7 +665,7 @@ change a few attributes to change the thumbnail to your liking, like so:
# Optionally specify a fallback image to be used when the object doesn't
# have an image set, or the image has been deleted. It can an image from
# your static files folder, or an external URL.
thumb_default = 'http://lorempixel.com/100/100'
thumb_default = 'https://lorempixel.com/100/100'
.. _modeladmin_list_display_add_buttons:

View file

@ -10,4 +10,5 @@ Reference
management_commands
hooks
signals
settings
project_template

View file

@ -98,7 +98,7 @@ You can prevent the ``update_index`` command from indexing any data by using the
wagtail_update_index
--------------------
An alias for the ``update_index`` command that can be used when another installed package (such as `Haystack <http://haystacksearch.org/>`_) provides a command named ``update_index``. In this case, the other package's entry in ``INSTALLED_APPS`` should appear above ``wagtail.search`` so that its ``update_index`` command takes precedence over Wagtail's.
An alias for the ``update_index`` command that can be used when another installed package (such as `Haystack <https://haystacksearch.org/>`_) provides a command named ``update_index``. In this case, the other package's entry in ``INSTALLED_APPS`` should appear above ``wagtail.search`` so that its ``update_index`` command takes precedence over Wagtail's.
.. _search_garbage_collect:

View file

@ -130,7 +130,7 @@ In addition to the model fields provided, ``Page`` has many properties and metho
.. note::
See also `django-treebeard <http://django-treebeard.readthedocs.io/en/latest/index.html>`_'s `node API <http://django-treebeard.readthedocs.io/en/latest/api.html>`_. ``Page`` is a subclass of `materialized path tree <http://django-treebeard.readthedocs.io/en/latest/mp_tree.html>`_ nodes.
See also `django-treebeard <https://django-treebeard.readthedocs.io/en/latest/index.html>`_'s `node API <https://django-treebeard.readthedocs.io/en/latest/api.html>`_. ``Page`` is a subclass of `materialized path tree <https://django-treebeard.readthedocs.io/en/latest/mp_tree.html>`_ nodes.
.. class:: Page

View file

@ -8,7 +8,7 @@ Theory
Introduction to Trees
~~~~~~~~~~~~~~~~~~~~~
If you're unfamiliar with trees as an abstract data type, you might want to `review the concepts involved. <http://en.wikipedia.org/wiki/Tree_(data_structure)>`_
If you're unfamiliar with trees as an abstract data type, you might want to `review the concepts involved. <https://en.wikipedia.org/wiki/Tree_(data_structure)>`_
As a web developer, though, you probably already have a good understanding of trees as filesystem directories or paths. Wagtail pages can create the same structure, as each page in the tree has its own URL path, like so::

View file

@ -1,146 +1,11 @@
==============================
Configuring Django for Wagtail
==============================
To install Wagtail completely from scratch, create a new Django project and an app within that project. For instructions on these tasks, see :doc:`Writing your first Django app <django:intro/tutorial01>`. Your project directory will look like the following::
myproject/
myproject/
__init__.py
settings.py
urls.py
wsgi.py
myapp/
__init__.py
models.py
tests.py
admin.py
views.py
manage.py
From your app directory, you can safely remove ``admin.py`` and ``views.py``, since Wagtail will provide this functionality for your models. Configuring Django to load Wagtail involves adding modules and variables to ``settings.py`` and URL configuration to ``urls.py``. For a more complete view of what's defined in these files, see :doc:`Django Settings <django:topics/settings>` and :doc:`Django URL Dispatcher <django:topics/http/urls>`.
What follows is a settings reference which skips many boilerplate Django settings. If you just want to get your Wagtail install up quickly without fussing with settings at the moment, see :ref:`complete_example_config`.
Middleware (``settings.py``)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: python
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
'wagtail.core.middleware.SiteMiddleware',
'wagtail.contrib.redirects.middleware.RedirectMiddleware',
]
Wagtail requires several common Django middleware modules to work and cover basic security. Wagtail provides its own middleware to cover these tasks:
``SiteMiddleware``
Wagtail routes pre-defined hosts to pages within the Wagtail tree using this middleware.
``RedirectMiddleware``
Wagtail provides a simple interface for adding arbitrary redirects to your site and this module makes it happen.
Apps (``settings.py``)
~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: python
INSTALLED_APPS = [
'myapp', # your own app
'wagtail.contrib.forms',
'wagtail.contrib.redirects',
'wagtail.embeds',
'wagtail.sites',
'wagtail.users',
'wagtail.snippets',
'wagtail.documents',
'wagtail.images',
'wagtail.search',
'wagtail.admin',
'wagtail.core',
'taggit',
'modelcluster',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
Wagtail requires several Django app modules, third-party apps, and defines several apps of its own. Wagtail was built to be modular, so many Wagtail apps can be omitted to suit your needs. Your own app (here ``myapp``) is where you define your models, templates, static assets, template tags, and other custom functionality for your site.
Wagtail Apps
------------
``wagtailcore``
The core functionality of Wagtail, such as the ``Page`` class, the Wagtail tree, and model fields.
``wagtailadmin``
The administration interface for Wagtail, including page edit handlers.
``wagtaildocs``
The Wagtail document content type.
``wagtailsnippets``
Editing interface for non-Page models and objects. See :ref:`Snippets`.
``wagtailusers``
User editing interface.
``wagtailimages``
The Wagtail image content type.
``wagtailembeds``
Module governing oEmbed and Embedly content in Wagtail rich text fields. See :ref:`inserting_videos`.
``wagtailsearch``
Search framework for Page content. See :ref:`wagtailsearch`.
``wagtailredirects``
Admin interface for creating arbitrary redirects on your site.
``wagtailforms``
Models for creating forms on your pages and viewing submissions. See :ref:`form_builder`.
Third-Party Apps
----------------
``taggit``
Tagging framework for Django. This is used internally within Wagtail for image and document tagging and is available for your own models as well. See :ref:`tagging` for a Wagtail model recipe or the `Taggit Documentation`_.
.. _Taggit Documentation: http://django-taggit.readthedocs.org/en/latest/index.html
``modelcluster``
Extension of Django ForeignKey relation functionality, which is used in Wagtail pages for on-the-fly related object creation. For more information, see :ref:`inline_panels` or `the django-modelcluster github project page`_.
.. _the django-modelcluster github project page: https://github.com/torchbox/django-modelcluster
Settings Variables (``settings.py``)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
========
Settings
========
Wagtail makes use of the following settings, in addition to :doc:`Django's core settings <ref/settings>`:
Site Name
---------
=========
.. code-block:: python
@ -148,11 +13,10 @@ Site Name
This is the human-readable name of your Wagtail install which welcomes users upon login to the Wagtail admin.
.. _append_slash:
Append Slash
------------
============
.. code-block:: python
@ -172,7 +36,7 @@ When ``WAGTAIL_APPEND_SLASH`` is ``False``, requests to Wagtail pages will be se
.. _this Google Webmaster Blog post: https://webmasters.googleblog.com/2010/04/to-slash-or-not-to-slash.html
Search
------
======
.. code-block:: python
@ -200,9 +64,8 @@ Override the templates used by the search front-end views.
Set the number of days (default 7) that search query logs are kept for; these are used to identify popular search terms for :ref:`promoted search results <editors-picks>`. Queries older than this will be removed by the :ref:`search_garbage_collect` command.
Embeds
------
======
Wagtail supports generating embed code from URLs to content on an external
providers such as Youtube or Twitter. By default, Wagtail will fetch the embed
@ -212,9 +75,8 @@ Wagtail has a builtin list of the most common providers.
The embeds fetching can be fully configured using the ``WAGTAILEMBEDS_FINDERS``
setting. This is fully documented in :ref:`configuring_embed_finders`.
Dashboard
---------
=========
.. code-block:: python
@ -246,10 +108,8 @@ If a user has not uploaded a profile picture, Wagtail will look for an avatar li
Changes whether the Submit for Moderation button is displayed in the action menu.
Images
------
======
.. code-block:: python
@ -268,7 +128,7 @@ This setting lets you override the maximum upload size for images (in bytes). If
WAGTAILIMAGES_MAX_IMAGE_PIXELS = 128000000 # i.e. 128 megapixels
This setting lets you override the maximum number of pixels an image can have. If omitted, Wagtail will fall back to using its 128 megapixels default value.
This setting lets you override the maximum number of pixels an image can have. If omitted, Wagtail will fall back to using its 128 megapixels default value. The pixel count takes animation frames into account - for example, a 25-frame animation of size 100x100 is considered to have 100 * 100 * 25 = 250000 pixels.
.. code-block:: python
@ -294,9 +154,8 @@ Specifies the number of items per page shown when viewing an image's usage (see
Specifies the number of images shown per page in the image chooser modal.
Documents
---------
=========
.. _wagtaildocs_serve_method:
@ -314,9 +173,8 @@ For this reason, Wagtail provides a number of serving methods which trade some o
If ``WAGTAILDOCS_SERVE_METHOD`` is unspecified or set to ``None``, the default method is ``'redirect'`` when a remote storage backend is in use (i.e. one that exposes a URL but not a local filesystem path), and ``'serve_view'`` otherwise. Finally, some storage backends may not expose a URL at all; in this case, serving will proceed as for ``'serve_view'``.
Password Management
-------------------
===================
.. code-block:: python
@ -351,7 +209,7 @@ This specifies whether users are allowed to change their email (enabled by defau
.. _email_notifications:
Email Notifications
-------------------
===================
.. code-block:: python
@ -374,7 +232,7 @@ Notification emails are sent to moderators and superusers by default. You can ch
.. _update_notifications:
Wagtail update notifications
----------------------------
============================
.. code-block:: python
@ -384,7 +242,7 @@ For admins only, Wagtail performs a check on the dashboard to see if newer relea
Private pages / documents
-------------------------
=========================
.. code-block:: python
@ -398,9 +256,8 @@ This is the path to the Django template which will be used to display the "passw
As above, but for password restrictions on documents. For more details, see the :ref:`private_pages` documentation.
Login page
----------
==========
The basic login page can be customised with a custom template.
@ -416,10 +273,8 @@ Or the login page can be a redirect to an external or internal URL.
For more details, see the :ref:`login_page` documentation.
Case-Insensitive Tags
---------------------
=====================
.. code-block:: python
@ -428,7 +283,7 @@ Case-Insensitive Tags
Tags are case-sensitive by default ('music' and 'Music' are treated as distinct tags). In many cases the reverse behaviour is preferable.
Multi-word tags
---------------
===============
.. code-block:: python
@ -437,7 +292,7 @@ Multi-word tags
Tags can only consist of a single word, no spaces allowed. The default setting is ``True`` (spaces in tags are allowed).
Tag limit
---------
=========
.. code-block:: python
@ -446,7 +301,7 @@ Tag limit
Limit the number of tags that can be added to (django-taggit) Tag model. Default setting is ``None``, meaning no limit on tags.
Unicode Page Slugs
------------------
==================
.. code-block:: python
@ -457,7 +312,7 @@ By default, page slugs can contain any alphanumeric characters, including non-La
.. _WAGTAIL_AUTO_UPDATE_PREVIEW:
Auto update preview
-------------------
===================
.. code-block:: python
@ -470,7 +325,7 @@ tab is not refreshed automatically, users have to do it manually.
This behaviour is disabled by default.
Custom User Edit Forms
----------------------
======================
See :doc:`/advanced_topics/customisation/custom_user_models`.
@ -497,7 +352,7 @@ A list of the extra custom fields to be appended to the default list.
.. _WAGTAIL_USAGE_COUNT_ENABLED:
Usage for images, documents and snippets
----------------------------------------
========================================
.. code-block:: python
@ -516,7 +371,7 @@ The link is also shown on the delete page, above the "Delete" button.
The usage count only applies to direct (database) references. Using documents, images and snippets within StreamFields or rich text fields will not be taken into account.
Date and DateTime inputs
------------------------
========================
.. code-block:: python
@ -529,7 +384,7 @@ Specifies the date and datetime format to be used in input fields in the Wagtail
.. _WAGTAIL_USER_TIME_ZONES:
Time zones
----------
==========
Logged-in users can choose their current time zone for the admin interface in the account settings. If is no time zone selected by the user, then ``TIME_ZONE`` will be used.
(Note that time zones are only applied to datetime fields, not to plain time or date fields. This is a Django design decision.)
@ -545,7 +400,7 @@ If there is zero or one time zone permitted, the account settings form will be h
.. _WAGTAILADMIN_PERMITTED_LANGUAGES:
Admin languages
---------------
===============
Users can choose between several languages for the admin interface
in the account settings. The list of languages is by default all the available
@ -565,7 +420,7 @@ can only choose between front office languages:
('pt', 'Portuguese')]
Static files
------------
============
.. code-block:: python
@ -574,7 +429,7 @@ Static files
Static file URLs within the Wagtail admin are given a version-specific query string of the form ``?v=1a2b3c4d``, to prevent outdated cached copies of Javascript and CSS files from persisting after a Wagtail upgrade. To disable these, set ``WAGTAILADMIN_STATIC_FILE_VERSION_STRINGS`` to ``False``.
API Settings
------------
============
For full documenation on API configuration, including these settings, see :ref:`api_v2_configuration` documentation.
@ -604,9 +459,8 @@ Default is true, setting this to false will disable full text search on all endp
Requires ``wagtailfrontendcache`` app to be installed, inidicates the API should use the frontend cache.
Frontend cache
--------------
==============
For full documenation on frontend cache invalidation, including these settings, see :ref:`frontend_cache_purging`.
@ -633,12 +487,10 @@ See documentation linked above for full options available.
Default is an empty list, must be a list of languages to also purge the urls for each language of a purging url. This setting needs ``settings.USE_I18N`` to be ``True`` to work.
.. _WAGTAILADMIN_RICH_TEXT_EDITORS:
Rich text
---------
=========
.. code-block:: python
@ -660,9 +512,8 @@ Customise the behaviour of rich text fields. By default, ``RichTextField`` and `
* ``OPTIONS``: Configuration options to pass to the widget. Recognised options are widget-specific, but both ``DraftailRichTextArea`` and ``HalloRichTextArea`` accept a ``features`` list indicating the active rich text features (see :ref:`rich_text_features`).
Page locking
------------
============
.. versionadded:: 2.8
@ -671,278 +522,3 @@ Page locking
``WAGTAILADMIN_GLOBAL_PAGE_EDIT_LOCK`` can be set to ``True`` to prevent users
from editing pages that they have locked.
URL Patterns
~~~~~~~~~~~~
.. code-block:: python
from django.contrib import admin
from wagtail.core import urls as wagtail_urls
from wagtail.admin import urls as wagtailadmin_urls
from wagtail.documents import urls as wagtaildocs_urls
urlpatterns = [
re_path(r'^django-admin/', include(admin.site.urls)),
re_path(r'^admin/', include(wagtailadmin_urls)),
re_path(r'^documents/', include(wagtaildocs_urls)),
# Optional URL for including your own vanilla Django urls/views
re_path(r'', include('myapp.urls')),
# For anything not caught by a more specific rule above, hand over to
# Wagtail's serving mechanism
re_path(r'', include(wagtail_urls)),
]
This block of code for your project's ``urls.py`` does a few things:
* Load the vanilla Django admin interface to ``/django-admin/``
* Load the Wagtail admin and its various apps
* Dispatch any vanilla Django apps you're using other than Wagtail which require their own URL configuration (this is optional, since Wagtail might be all you need)
* Lets Wagtail handle any further URL dispatching.
That's not everything you might want to include in your project's URL configuration, but it's what's necessary for Wagtail to flourish.
.. _complete_example_config:
Ready to Use Example Configuration Files
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
These two files should reside in your project directory (``myproject/myproject/``).
``settings.py``
---------------
.. code-block:: python
import os
PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
BASE_DIR = os.path.dirname(PROJECT_DIR)
DEBUG = True
# Application definition
INSTALLED_APPS = [
'myapp',
'wagtail.contrib.forms',
'wagtail.contrib.redirects',
'wagtail.embeds',
'wagtail.sites',
'wagtail.users',
'wagtail.snippets',
'wagtail.documents',
'wagtail.images',
'wagtail.search',
'wagtail.admin',
'wagtail.core',
'taggit',
'modelcluster',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
'wagtail.core.middleware.SiteMiddleware',
'wagtail.contrib.redirects.middleware.RedirectMiddleware',
]
ROOT_URLCONF = 'myproject.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(PROJECT_DIR, 'templates'),
],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'myproject.wsgi.application'
# Database
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myprojectdb',
'USER': 'postgres',
'PASSWORD': '',
'HOST': '', # Set to empty string for localhost.
'PORT': '', # Set to empty string for default.
'CONN_MAX_AGE': 600, # number of seconds database connections should persist for
}
}
# Internationalization
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]
STATICFILES_DIRS = [
os.path.join(PROJECT_DIR, 'static'),
]
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
ADMINS = [
# ('Your Name', 'your_email@example.com'),
]
MANAGERS = ADMINS
# Default to dummy email backend. Configure dev/production/local backend
# as per https://docs.djangoproject.com/en/dev/topics/email/#email-backends
EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'
# Hosts/domain names that are valid for this site; required if DEBUG is False
ALLOWED_HOSTS = []
# Make this unique, and don't share it with anybody.
SECRET_KEY = 'change-me'
EMAIL_SUBJECT_PREFIX = '[Wagtail] '
INTERNAL_IPS = ('127.0.0.1', '10.0.2.2')
# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging configuration.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}
# WAGTAIL SETTINGS
# This is the human-readable name of your Wagtail install
# which welcomes users upon login to the Wagtail admin.
WAGTAIL_SITE_NAME = 'My Project'
# Override the search results template for wagtailsearch
# WAGTAILSEARCH_RESULTS_TEMPLATE = 'myapp/search_results.html'
# WAGTAILSEARCH_RESULTS_TEMPLATE_AJAX = 'myapp/includes/search_listing.html'
# Replace the search backend
#WAGTAILSEARCH_BACKENDS = {
# 'default': {
# 'BACKEND': 'wagtail.search.backends.elasticsearch2',
# 'INDEX': 'myapp'
# }
#}
# Wagtail email notifications from address
# WAGTAILADMIN_NOTIFICATION_FROM_EMAIL = 'wagtail@myhost.io'
# Wagtail email notification format
# WAGTAILADMIN_NOTIFICATION_USE_HTML = True
# Reverse the default case-sensitive handling of tags
TAGGIT_CASE_INSENSITIVE = True
``urls.py``
-----------
.. code-block:: python
from django.conf.urls import include, re_path
from django.conf.urls.static import static
from django.views.generic.base import RedirectView
from django.contrib import admin
from django.conf import settings
import os.path
from wagtail.core import urls as wagtail_urls
from wagtail.admin import urls as wagtailadmin_urls
from wagtail.documents import urls as wagtaildocs_urls
urlpatterns = [
re_path(r'^django-admin/', include(admin.site.urls)),
re_path(r'^admin/', include(wagtailadmin_urls)),
re_path(r'^documents/', include(wagtaildocs_urls)),
# For anything not caught by a more specific rule above, hand over to
# Wagtail's serving mechanism
re_path(r'', include(wagtail_urls)),
]
if settings.DEBUG:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns() # tell gunicorn where static files are in dev mode
urlpatterns += static(settings.MEDIA_URL + 'images/', document_root=os.path.join(settings.MEDIA_ROOT, 'images'))
urlpatterns += [
re_path(r'^favicon\.ico$', RedirectView.as_view(url=settings.STATIC_URL + 'myapp/images/favicon.ico'))
]

16
docs/releases/2.6.3.rst Normal file
View file

@ -0,0 +1,16 @@
===========================
Wagtail 2.6.3 release notes
===========================
.. contents::
:local:
:depth: 1
What's new
==========
Bug fixes
~~~~~~~~~
* Altering Django REST Framework's ``DEFAULT_AUTHENTICATION_CLASSES`` setting no longer breaks the page explorer menu and admin API (Matt Westcott)

View file

@ -1,6 +1,6 @@
==========================================
Wagtail 2.7 release notes - IN DEVELOPMENT
==========================================
=========================
Wagtail 2.7 release notes
=========================
.. contents::
:local:
@ -21,6 +21,12 @@ Improved StreamField design
The design of the StreamField user interface has been updated to improve clarity and usability, including better handling of nested blocks. This work was completed by Bertrand Bordage as part of the `Wagtail's First Hatch <https://www.kickstarter.com/projects/noripyt/wagtails-first-hatch>`_ crowdfunding campaign. We would like to thank all `supporters of the campaign <https://wagtail.io/blog/wagtails-first-hatch-backers/>`_.
WebP image support
~~~~~~~~~~~~~~~~~~
Images can now be uploaded and rendered in `WebP <https://developers.google.com/speed/webp>`_ format; see :ref:`image_file_formats` for details. This feature was developed by frmdstryr, Karl Hobley and Matt Westcott.
Other features
~~~~~~~~~~~~~~
@ -43,10 +49,7 @@ Other features
* Added ARIA role to TableBlock output (Matt Westcott)
* Added cache-busting query parameters to static files within the Wagtail admin (Matt Westcott)
* Allow ``register_page_action_menu_item`` and ``construct_page_action_menu`` hooks to override the default menu action (Rahmi Pruitt, Matt Westcott) - thanks to `The Motley Fool <https://www.fool.com/>`_ for sponsoring review of this feature
* Add docs table template rendering example (Matt Westcott)
* Add blog about image uploads in Wagtail forms to third party tutorial documentation (a-mere-peasant)
* Clean up multiple minor documentation issues (David T Thompson, ryanomor, kailwallin)
* Add AbstractUser import to custom user model documentation (LB (Ben Johnston))
* ``WAGTAILIMAGES_MAX_IMAGE_PIXELS`` limit now takes the number of animation frames into account (Karl Hobley)
Bug fixes
@ -74,6 +77,8 @@ Bug fixes
* Replace styleguide example avatar with default image to avoid issues when custom user model is used (Matt Westcott)
* ``DraftailRichTextArea`` is no longer treated as a hidden field by Django's form logic (Sergey Fedoseev)
* Replace format() placeholders in translatable strings with % formatting (Matt Westcott)
* Altering Django REST Framework's ``DEFAULT_AUTHENTICATION_CLASSES`` setting no longer breaks the page explorer menu and admin API (Matt Westcott)
* Regression - missing label for external link URL field in link chooser (Stefani Castellanos)
Upgrade considerations
@ -144,42 +149,42 @@ Any add-on library that uses this feature and needs to preserve backward compati
The modules ``wagtail.admin.utils`` and ``wagtail.admin.decorators`` have been deprecated. The helper functions defined here exist primarily for Wagtail's internal use; however, some of them (particularly ``send_mail`` and ``permission_required``) may be found in user code, and import lines will need to be updated. The new locations for these definitions are as follows:
+---------------------------------+--------------------------+--------------------------+
| Definition | Old location | New location |
+=================================+==========================+==========================+
| any_permission_required | wagtail.admin.utils | wagtail.admin.auth |
+---------------------------------+--------------------------+--------------------------+
| permission_denied | wagtail.admin.utils | wagtail.admin.auth |
+---------------------------------+--------------------------+--------------------------+
| permission_required | wagtail.admin.utils | wagtail.admin.auth |
+---------------------------------+--------------------------+--------------------------+
| PermissionPolicyChecker | wagtail.admin.utils | wagtail.admin.auth |
+---------------------------------+--------------------------+--------------------------+
| user_has_any_page_permission | wagtail.admin.utils | wagtail.admin.auth |
+---------------------------------+--------------------------+--------------------------+
| user_passes_test | wagtail.admin.utils | wagtail.admin.auth |
+---------------------------------+--------------------------+--------------------------+
| users_with_page_permission | wagtail.admin.utils | wagtail.admin.auth |
+---------------------------------+--------------------------+--------------------------+
| reject_request | wagtail.admin.decorators | wagtail.admin.auth |
+---------------------------------+--------------------------+--------------------------+
| require_admin_access | wagtail.admin.decorators | wagtail.admin.auth |
+---------------------------------+--------------------------+--------------------------+
| get_available_admin_languages | wagtail.admin.utils | wagtail.admin.locale |
+---------------------------------+--------------------------+--------------------------+
| get_available_admin_time_zones | wagtail.admin.utils | wagtail.admin.locale |
+---------------------------------+--------------------------+--------------------------+
| get_js_translation_strings | wagtail.admin.utils | wagtail.admin.locale |
+---------------------------------+--------------------------+--------------------------+
| WAGTAILADMIN_PROVIDED_LANGUAGES | wagtail.admin.utils | wagtail.admin.locale |
+---------------------------------+--------------------------+--------------------------+
| send_mail | wagtail.admin.utils | wagtail.admin.mail |
+---------------------------------+--------------------------+--------------------------+
| send_notification | wagtail.admin.utils | wagtail.admin.mail |
+---------------------------------+--------------------------+--------------------------+
| get_object_usage | wagtail.admin.utils | wagtail.admin.models |
+---------------------------------+--------------------------+--------------------------+
| popular_tags_for_model | wagtail.admin.utils | wagtail.admin.models |
+---------------------------------+--------------------------+--------------------------+
| get_site_for_user | wagtail.admin.utils | wagtail.admin.navigation |
+---------------------------------+--------------------------+--------------------------+
+---------------------------------+--------------------------+----------------------------+
| Definition | Old location | New location |
+=================================+==========================+============================+
| any_permission_required | wagtail.admin.utils | wagtail.admin.auth |
+---------------------------------+--------------------------+----------------------------+
| permission_denied | wagtail.admin.utils | wagtail.admin.auth |
+---------------------------------+--------------------------+----------------------------+
| permission_required | wagtail.admin.utils | wagtail.admin.auth |
+---------------------------------+--------------------------+----------------------------+
| PermissionPolicyChecker | wagtail.admin.utils | wagtail.admin.auth |
+---------------------------------+--------------------------+----------------------------+
| user_has_any_page_permission | wagtail.admin.utils | wagtail.admin.auth |
+---------------------------------+--------------------------+----------------------------+
| user_passes_test | wagtail.admin.utils | wagtail.admin.auth |
+---------------------------------+--------------------------+----------------------------+
| users_with_page_permission | wagtail.admin.utils | wagtail.admin.auth |
+---------------------------------+--------------------------+----------------------------+
| reject_request | wagtail.admin.decorators | wagtail.admin.auth |
+---------------------------------+--------------------------+----------------------------+
| require_admin_access | wagtail.admin.decorators | wagtail.admin.auth |
+---------------------------------+--------------------------+----------------------------+
| get_available_admin_languages | wagtail.admin.utils | wagtail.admin.localization |
+---------------------------------+--------------------------+----------------------------+
| get_available_admin_time_zones | wagtail.admin.utils | wagtail.admin.localization |
+---------------------------------+--------------------------+----------------------------+
| get_js_translation_strings | wagtail.admin.utils | wagtail.admin.localization |
+---------------------------------+--------------------------+----------------------------+
| WAGTAILADMIN_PROVIDED_LANGUAGES | wagtail.admin.utils | wagtail.admin.localization |
+---------------------------------+--------------------------+----------------------------+
| send_mail | wagtail.admin.utils | wagtail.admin.mail |
+---------------------------------+--------------------------+----------------------------+
| send_notification | wagtail.admin.utils | wagtail.admin.mail |
+---------------------------------+--------------------------+----------------------------+
| get_object_usage | wagtail.admin.utils | wagtail.admin.models |
+---------------------------------+--------------------------+----------------------------+
| popular_tags_for_model | wagtail.admin.utils | wagtail.admin.models |
+---------------------------------+--------------------------+----------------------------+
| get_site_for_user | wagtail.admin.utils | wagtail.admin.navigation |
+---------------------------------+--------------------------+----------------------------+

69
docs/releases/2.8.rst Normal file
View file

@ -0,0 +1,69 @@
==========================================
Wagtail 2.8 release notes - IN DEVELOPMENT
==========================================
.. contents::
:local:
:depth: 1
What's new
==========
Other features
~~~~~~~~~~~~~~
* Removed leftover Python 2.x compatibility code (Sergey Fedoseev)
* Combine flake8 configurations (Sergey Fedoseev)
* Improved diffing behavior for text fields (Aliosha Padovani)
* Improve contrast of disabled inputs (Nick Smith)
* Added ``get_document_model_string`` function (Andrey Smirnov)
* Added support for Cloudflare API tokens for frontend cache invalidation (Tom Usher)
* Cloudflare frontend cache invalidation requests are now sent in chunks of 30 to fit within API limits (Tom Usher)
* Added ``ancestors`` field to pages endpoint in admin API (Karl Hobley)
* Removed Django admin management of ``Page`` & ``Site`` models (Andreas Bernacca)
Bug fixes
~~~~~~~~~
* Rename documents listing column 'uploaded' to 'created' (LB (Ben Johnston))
* Submenu items longer then the page height are no longer broken by the submenu footer (Igor van Spengen)
* Unbundle the l18n library as it was bundled to avoid installation errors which have been resolved (Matt Westcott)
* Prevent error when comparing pages that reference a model with a custom primary key (Fidel Ramos)
* Moved ``get_document_model`` location so it can be imported when Models are not yet loaded (Andrey Smirnov)
* Fixed incorrect HTML escaping of Jinja2 form templates for StructBlocks (Brady Moe)
* All templates with wagtailsettings and modeladmin now use ``block.super`` for ``extra_js`` & ``extra_css`` (Timothy Bautista)
Upgrade considerations
======================
Removed support for Django 2.0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Django 2.0 is no longer supported as of this release; please upgrade to Django 2.1 or above before upgrading Wagtail.
``wagtail.documents.models.get_document_model`` has moved
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The ``get_document_model`` function should now be imported from ``wagtail.documents`` rather than ``wagtail.documents.models``. See :ref:`custom_document_model`.
Removed ``Page`` and ``Site`` models from Django admin
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Django admin will no longer provide editing access to ``Page`` or ``Site`` models, if required these models can be registered within individual projects using `Django's ModelAdmin <https://docs.djangoproject.com/en/2.2/ref/contrib/admin/#modeladmin-objects>`_.
.. code-block:: python
# my_app/admin.py
from django.contrib import admin
from wagtail.core.models import Page, Site
admin.site.register(Site)
admin.site.register(Page)

View file

@ -5,7 +5,9 @@ Release notes
:maxdepth: 1
upgrading
2.8
2.7
2.6.3
2.6.2
2.6.1
2.6

View file

@ -131,4 +131,5 @@ The compatible versions of Django and Python for each Wagtail release are:
+-------------------+------------------------------+-----------------------------+
| 2.7 LTS | 2.0, 2.1, 2.2 | 3.5, 3.6, 3.7, 3.8 |
+-------------------+------------------------------+-----------------------------+
| 2.8 | 2.1, 2.2 | 3.5, 3.6, 3.7, 3.8 |
+-------------------+------------------------------+-----------------------------+

View file

@ -9,7 +9,7 @@ If you have any problems or questions about working with Wagtail, you are invite
Stack Overflow
~~~~~~~~~~~~~~
`Stack Overflow <http://stackoverflow.com/questions/tagged/wagtail>`_ is the best place to find answers to your questions about working with Wagtail - there is an active community of Wagtail users and developers responding to questions there. When posting questions, please read Stack Overflow's advice on `how to ask questions <http://stackoverflow.com/help/how-to-ask>`_ and remember to tag your question with "wagtail".
`Stack Overflow <https://stackoverflow.com/questions/tagged/wagtail>`_ is the best place to find answers to your questions about working with Wagtail - there is an active community of Wagtail users and developers responding to questions there. When posting questions, please read Stack Overflow's advice on `how to ask questions <https://stackoverflow.com/help/how-to-ask>`_ and remember to tag your question with "wagtail".
Mailing list
~~~~~~~~~~~~
@ -32,4 +32,4 @@ If you think you've found a bug in Wagtail, or you'd like to suggest a new featu
Torchbox
~~~~~~~~
Finally, if you have a query which isn't relevant for any of the above forums, feel free to contact the Wagtail team at Torchbox directly, on `hello@wagtail.io <mailto:hello@wagtail.io>`_ or `@wagtailcms <http://twitter.com/wagtailcms>`_.
Finally, if you have a query which isn't relevant for any of the above forums, feel free to contact the Wagtail team at Torchbox directly, on `hello@wagtail.io <mailto:hello@wagtail.io>`_ or `@wagtailcms <https://twitter.com/wagtailcms>`_.

View file

@ -214,6 +214,39 @@ You can also use the ``attrs`` property as a shorthand to output the attributes
<img {{ tmp_photo.attrs }} class="my-custom-class" />
Alternative HTML tags
---------------------
The ``as`` keyword allows alternative HTML image tags (such as ``<picture>`` or ``<amp-img>``) to be used.
For example, to use the ``<picture>`` tag:
.. code-block:: html+django
<picture>
{% image page.photo width-800 as wide_photo %}
<source srcset="{{ wide_photo.url }}" media="(min-width: 800px)">
{% image page.photo width-400 %}
</picture>
And to use the ``<amp-img>`` tag (based on the `Mountains example <https://amp.dev/documentation/components/amp-img/#example:-specifying-a-fallback-image>`_ from the AMP docs):
.. code-block:: html+django
{% image image width-550 format-webp as webp_image %}
{% image image width-550 format-jpeg as jpeg_image %}
<amp-img alt="{{ image.alt }}"
width="{{ webp_image.width }}"
height="{{ webp_image.height }}"
src="{{ webp_image.url }}">
<amp-img alt="{{ image.alt }}"
fallback
width="{{ jpeg_image.width }}"
height="{{ jpeg_image.height }}"
src="{{ jpeg_image.url }}"></amp-img>
</amp-img>
Images embedded in rich text
----------------------------

View file

@ -173,7 +173,7 @@ If you prefer not to run an Elasticsearch server in development or production, t
- Configure ``URLS`` in the Elasticsearch entry in ``WAGTAILSEARCH_BACKENDS`` using the Cluster URL from your Bonsai dashboard
- Run ``./manage.py update_index``
.. _elasticsearch-py: http://elasticsearch-py.readthedocs.org
.. _elasticsearch-py: https://elasticsearch-py.readthedocs.org
.. _Bonsai: https://bonsai.io/signup
Amazon AWS Elasticsearch

View file

@ -58,7 +58,7 @@ The search may not return any results while this command is running, so avoid ru
.. note::
The ``update_index`` command is also aliased as ``wagtail_update_index``, for use when another installed package (such as `Haystack <http://haystacksearch.org/>`_) provides a conflicting ``update_index`` command. In this case, the other package's entry in ``INSTALLED_APPS`` should appear above ``wagtail.search`` so that its ``update_index`` command takes precedence over Wagtail's.
The ``update_index`` command is also aliased as ``wagtail_update_index``, for use when another installed package (such as `Haystack <https://haystacksearch.org/>`_) provides a conflicting ``update_index`` command. In this case, the other package's entry in ``INSTALLED_APPS`` should appear above ``wagtail.search`` so that its ``update_index`` command takes precedence over Wagtail's.
.. _wagtailsearch_indexing_fields:

View file

@ -9,7 +9,7 @@
# the 'mywagtail' user account, with the application deployed in
# /home/mywagtail/app and the virtualenv in /home/mywagtail/venv.
#
# [0] http://uwsgi-docs.readthedocs.org/en/latest/Emperor.html
# [0] https://uwsgi-docs.readthedocs.org/en/latest/Emperor.html
[uwsgi]
# Abort on unknown configuration options.

687
package-lock.json generated
View file

@ -534,7 +534,7 @@
"integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
"dev": true,
"requires": {
"acorn": "3.3.0"
"acorn": "^3.0.4"
},
"dependencies": {
"acorn": {
@ -585,9 +585,9 @@
}
},
"ajv-keywords": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz",
"integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=",
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
"integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
"dev": true
},
"align-text": {
@ -660,9 +660,9 @@
}
},
"ansi-escapes": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
"integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=",
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
"integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
"dev": true
},
"ansi-gray": {
@ -2501,7 +2501,7 @@
"integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
"dev": true,
"requires": {
"callsites": "0.2.0"
"callsites": "^0.2.0"
}
},
"callsites": {
@ -2631,6 +2631,12 @@
"resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz",
"integrity": "sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ=="
},
"chardet": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
"integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
"dev": true
},
"cheerio": {
"version": "1.0.0-rc.3",
"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz",
@ -2760,12 +2766,12 @@
"integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM="
},
"cli-cursor": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
"integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
"integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
"dev": true,
"requires": {
"restore-cursor": "1.0.1"
"restore-cursor": "^2.0.0"
}
},
"cli-width": {
@ -2925,14 +2931,15 @@
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
"concat-stream": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
"integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
"integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
"dev": true,
"requires": {
"inherits": "2.0.3",
"readable-stream": "2.3.3",
"typedarray": "0.0.6"
"buffer-from": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^2.2.2",
"typedarray": "^0.0.6"
}
},
"configstore": {
@ -4105,44 +4112,163 @@
}
},
"eslint": {
"version": "2.13.1",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz",
"integrity": "sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=",
"version": "4.18.2",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-4.18.2.tgz",
"integrity": "sha512-qy4i3wODqKMYfz9LUI8N2qYDkHkoieTbiHpMrYUI/WbjhXJQr7lI4VngixTgaG+yHX+NBCv7nW4hA0ShbvaNKw==",
"dev": true,
"requires": {
"chalk": "1.1.3",
"concat-stream": "1.6.0",
"debug": "2.6.9",
"doctrine": "1.5.0",
"es6-map": "0.1.5",
"escope": "3.6.0",
"espree": "3.5.2",
"estraverse": "4.2.0",
"esutils": "2.0.2",
"file-entry-cache": "1.3.1",
"glob": "7.1.2",
"globals": "9.18.0",
"ignore": "3.3.7",
"imurmurhash": "0.1.4",
"inquirer": "0.12.0",
"is-my-json-valid": "2.17.1",
"is-resolvable": "1.0.1",
"js-yaml": "3.10.0",
"json-stable-stringify": "1.0.1",
"levn": "0.3.0",
"lodash": "4.17.10",
"mkdirp": "0.5.1",
"optionator": "0.8.2",
"path-is-absolute": "1.0.1",
"path-is-inside": "1.0.2",
"pluralize": "1.2.1",
"progress": "1.1.8",
"require-uncached": "1.0.3",
"shelljs": "0.6.1",
"strip-json-comments": "1.0.4",
"table": "3.8.3",
"text-table": "0.2.0",
"user-home": "2.0.0"
"ajv": "^5.3.0",
"babel-code-frame": "^6.22.0",
"chalk": "^2.1.0",
"concat-stream": "^1.6.0",
"cross-spawn": "^5.1.0",
"debug": "^3.1.0",
"doctrine": "^2.1.0",
"eslint-scope": "^3.7.1",
"eslint-visitor-keys": "^1.0.0",
"espree": "^3.5.2",
"esquery": "^1.0.0",
"esutils": "^2.0.2",
"file-entry-cache": "^2.0.0",
"functional-red-black-tree": "^1.0.1",
"glob": "^7.1.2",
"globals": "^11.0.1",
"ignore": "^3.3.3",
"imurmurhash": "^0.1.4",
"inquirer": "^3.0.6",
"is-resolvable": "^1.0.0",
"js-yaml": "^3.9.1",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.3.0",
"lodash": "^4.17.4",
"minimatch": "^3.0.2",
"mkdirp": "^0.5.1",
"natural-compare": "^1.4.0",
"optionator": "^0.8.2",
"path-is-inside": "^1.0.2",
"pluralize": "^7.0.0",
"progress": "^2.0.0",
"require-uncached": "^1.0.3",
"semver": "^5.3.0",
"strip-ansi": "^4.0.0",
"strip-json-comments": "~2.0.1",
"table": "4.0.2",
"text-table": "~0.2.0"
},
"dependencies": {
"ajv": {
"version": "5.5.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
"integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
"dev": true,
"requires": {
"co": "^4.6.0",
"fast-deep-equal": "^1.0.0",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.3.0"
}
},
"ansi-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
"dev": true
},
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"cross-spawn": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
"integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
"dev": true,
"requires": {
"lru-cache": "^4.0.1",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
}
},
"debug": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
"dev": true,
"requires": {
"ms": "^2.1.1"
}
},
"doctrine": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
"integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
"dev": true,
"requires": {
"esutils": "^2.0.2"
}
},
"globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"lru-cache": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
"dev": true,
"requires": {
"pseudomap": "^1.0.2",
"yallist": "^2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"dev": true,
"requires": {
"ansi-regex": "^3.0.0"
}
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
}
}
},
"eslint-config-airbnb": {
@ -4284,14 +4410,38 @@
"jsx-ast-utils": "1.4.1"
}
},
"espree": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz",
"integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==",
"eslint-scope": {
"version": "3.7.3",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz",
"integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==",
"dev": true,
"requires": {
"acorn": "5.2.1",
"acorn-jsx": "3.0.1"
"esrecurse": "^4.1.0",
"estraverse": "^4.1.1"
}
},
"eslint-visitor-keys": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
"integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==",
"dev": true
},
"espree": {
"version": "3.5.4",
"resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
"integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
"dev": true,
"requires": {
"acorn": "^5.5.0",
"acorn-jsx": "^3.0.0"
},
"dependencies": {
"acorn": {
"version": "5.7.3",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
"integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
"dev": true
}
}
},
"esprima": {
@ -4299,6 +4449,15 @@
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
"integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw=="
},
"esquery": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
"integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
"dev": true,
"requires": {
"estraverse": "^4.0.0"
}
},
"esrecurse": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz",
@ -4405,12 +4564,6 @@
"integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
"dev": true
},
"exit-hook": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
"integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=",
"dev": true
},
"expand-brackets": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
@ -4456,6 +4609,17 @@
"is-extendable": "0.1.1"
}
},
"external-editor": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
"integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
"dev": true,
"requires": {
"chardet": "^0.4.0",
"iconv-lite": "^0.4.17",
"tmp": "^0.0.33"
}
},
"extglob": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
@ -4943,23 +5107,22 @@
}
},
"figures": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
"integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
"integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
"dev": true,
"requires": {
"escape-string-regexp": "1.0.5",
"object-assign": "4.1.1"
"escape-string-regexp": "^1.0.5"
}
},
"file-entry-cache": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz",
"integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
"integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
"dev": true,
"requires": {
"flat-cache": "1.3.0",
"object-assign": "4.1.1"
"flat-cache": "^1.2.1",
"object-assign": "^4.0.1"
}
},
"filename-regex": {
@ -5345,7 +5508,8 @@
"ansi-regex": {
"version": "2.1.1",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"aproba": {
"version": "1.2.0",
@ -5554,7 +5718,8 @@
"minimist": {
"version": "0.0.8",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"minipass": {
"version": "2.2.4",
@ -5579,6 +5744,7 @@
"version": "0.5.1",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"minimist": "0.0.8"
}
@ -5758,7 +5924,8 @@
"safe-buffer": {
"version": "5.1.1",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"safer-buffer": {
"version": "2.1.2",
@ -5814,6 +5981,7 @@
"version": "3.0.1",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@ -5857,12 +6025,14 @@
"wrappy": {
"version": "1.0.2",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"yallist": {
"version": "3.0.2",
"bundled": true,
"dev": true
"dev": true,
"optional": true
}
}
},
@ -5895,6 +6065,12 @@
"is-callable": "1.1.3"
}
},
"functional-red-black-tree": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
"dev": true
},
"gauge": {
"version": "2.7.4",
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
@ -5920,21 +6096,6 @@
"globule": "0.1.0"
}
},
"generate-function": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
"integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
"dev": true
},
"generate-object-property": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
"integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
"dev": true,
"requires": {
"is-property": "1.0.2"
}
},
"get-caller-file": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
@ -6942,24 +7103,93 @@
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
},
"inquirer": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz",
"integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=",
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
"integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
"dev": true,
"requires": {
"ansi-escapes": "1.4.0",
"ansi-regex": "2.1.1",
"chalk": "1.1.3",
"cli-cursor": "1.0.2",
"cli-width": "2.2.0",
"figures": "1.7.0",
"lodash": "4.17.10",
"readline2": "1.0.1",
"run-async": "0.1.0",
"rx-lite": "3.1.2",
"string-width": "1.0.2",
"strip-ansi": "3.0.1",
"through": "2.3.8"
"ansi-escapes": "^3.0.0",
"chalk": "^2.0.0",
"cli-cursor": "^2.1.0",
"cli-width": "^2.0.0",
"external-editor": "^2.0.4",
"figures": "^2.0.0",
"lodash": "^4.3.0",
"mute-stream": "0.0.7",
"run-async": "^2.2.0",
"rx-lite": "^4.0.8",
"rx-lite-aggregates": "^4.0.8",
"string-width": "^2.1.0",
"strip-ansi": "^4.0.0",
"through": "^2.3.6"
},
"dependencies": {
"ansi-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
"dev": true
},
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true
},
"string-width": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
"dev": true,
"requires": {
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^4.0.0"
}
},
"strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"dev": true,
"requires": {
"ansi-regex": "^3.0.0"
}
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
}
}
},
"interpret": {
@ -7185,18 +7415,6 @@
"is-path-inside": "1.0.1"
}
},
"is-my-json-valid": {
"version": "2.17.1",
"resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz",
"integrity": "sha512-Q2khNw+oBlWuaYvEEHtKSw/pCxD2L5Rc1C+UQme9X6JdRDh7m5D7HkozA0qa3DUkQ6VzCnEm8mVIQPyIRkI5sQ==",
"dev": true,
"requires": {
"generate-function": "2.0.0",
"generate-object-property": "1.2.0",
"jsonpointer": "4.0.1",
"xtend": "4.0.1"
}
},
"is-npm": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
@ -7300,12 +7518,6 @@
"integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
"dev": true
},
"is-property": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
"integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
"dev": true
},
"is-redirect": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
@ -7335,9 +7547,9 @@
}
},
"is-resolvable": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.1.tgz",
"integrity": "sha512-y5CXYbzvB3jTnWAZH1Nl7ykUWb6T3BcTs56HUruwBf8MhF56n1HWqhDWnVFo8GHrUPDgvUUNVhrc2U8W7iqz5g==",
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
"integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
"dev": true
},
"is-retry-allowed": {
@ -8520,6 +8732,12 @@
"jsonify": "0.0.0"
}
},
"json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"dev": true
},
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
@ -8538,12 +8756,6 @@
"integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
"dev": true
},
"jsonpointer": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
"integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
"dev": true
},
"jsprim": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
@ -9330,9 +9542,9 @@
}
},
"mute-stream": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz",
"integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=",
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
"integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
"dev": true
},
"nan": {
@ -10238,10 +10450,13 @@
}
},
"onetime": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
"integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
"dev": true
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
"integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
"dev": true,
"requires": {
"mimic-fn": "^1.0.0"
}
},
"optimist": {
"version": "0.6.1",
@ -10667,9 +10882,9 @@
}
},
"pluralize": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz",
"integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=",
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
"integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
"dev": true
},
"pn": {
@ -12890,9 +13105,9 @@
"integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
},
"progress": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
"integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=",
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"dev": true
},
"prop-types": {
@ -13317,17 +13532,6 @@
"set-immediate-shim": "1.0.1"
}
},
"readline2": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz",
"integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=",
"dev": true,
"requires": {
"code-point-at": "1.1.0",
"is-fullwidth-code-point": "1.0.0",
"mute-stream": "0.0.5"
}
},
"realpath-native": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.0.tgz",
@ -13755,8 +13959,8 @@
"integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
"dev": true,
"requires": {
"caller-path": "0.1.0",
"resolve-from": "1.0.1"
"caller-path": "^0.1.0",
"resolve-from": "^1.0.0"
}
},
"resolve": {
@ -13806,13 +14010,13 @@
"dev": true
},
"restore-cursor": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
"integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
"integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
"dev": true,
"requires": {
"exit-hook": "1.1.1",
"onetime": "1.1.0"
"onetime": "^2.0.0",
"signal-exit": "^3.0.2"
}
},
"ret": {
@ -13859,20 +14063,29 @@
}
},
"run-async": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz",
"integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=",
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
"integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
"dev": true,
"requires": {
"once": "1.4.0"
"is-promise": "^2.1.0"
}
},
"rx-lite": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz",
"integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=",
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
"integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
"dev": true
},
"rx-lite-aggregates": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
"integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
"dev": true,
"requires": {
"rx-lite": "*"
}
},
"safe-buffer": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
@ -14048,12 +14261,6 @@
"jsonify": "0.0.0"
}
},
"shelljs": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz",
"integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=",
"dev": true
},
"shellwords": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
@ -14077,10 +14284,21 @@
"integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
},
"slice-ansi": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz",
"integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=",
"dev": true
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
"integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
"dev": true,
"requires": {
"is-fullwidth-code-point": "^2.0.0"
},
"dependencies": {
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true
}
}
},
"snapdragon": {
"version": "0.8.2",
@ -14526,9 +14744,9 @@
}
},
"strip-json-comments": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
"integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"dev": true
},
"style-search": {
@ -15363,25 +15581,63 @@
"integrity": "sha512-77oqsKEPrxIwgRcXUwipkj9W5ItO97L6eUT1Ar7vh+El16Zm4M6V+YU1cbipHEa6q0Yjw8O3Hoh8oRgatV5s7A=="
},
"table": {
"version": "3.8.3",
"resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz",
"integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=",
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
"integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
"dev": true,
"requires": {
"ajv": "4.11.8",
"ajv-keywords": "1.5.1",
"chalk": "1.1.3",
"lodash": "4.17.10",
"slice-ansi": "0.0.4",
"string-width": "2.1.1"
"ajv": "^5.2.3",
"ajv-keywords": "^2.1.0",
"chalk": "^2.1.0",
"lodash": "^4.17.4",
"slice-ansi": "1.0.0",
"string-width": "^2.1.1"
},
"dependencies": {
"ajv": {
"version": "5.5.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
"integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
"dev": true,
"requires": {
"co": "^4.6.0",
"fast-deep-equal": "^1.0.0",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.3.0"
}
},
"ansi-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
"dev": true
},
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
@ -15394,8 +15650,8 @@
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
"dev": true,
"requires": {
"is-fullwidth-code-point": "2.0.0",
"strip-ansi": "4.0.0"
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^4.0.0"
}
},
"strip-ansi": {
@ -15404,7 +15660,16 @@
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"dev": true,
"requires": {
"ansi-regex": "3.0.0"
"ansi-regex": "^3.0.0"
}
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
}
}
@ -15540,6 +15805,15 @@
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.6.tgz",
"integrity": "sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA=="
},
"tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
"integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
"dev": true,
"requires": {
"os-tmpdir": "~1.0.2"
}
},
"tmpl": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
@ -16108,15 +16382,6 @@
"integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
"dev": true
},
"user-home": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
"integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=",
"dev": true,
"requires": {
"os-homedir": "1.0.2"
}
},
"util": {
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",

View file

@ -61,7 +61,7 @@
"enzyme": "^3.9.0",
"enzyme-adapter-react-16": "^1.9.1",
"enzyme-to-json": "^3.3.0",
"eslint": "^2.9.0",
"eslint": "^4.18.2",
"eslint-config-wagtail": "0.1.1",
"eslint-import-resolver-webpack": "^0.8.1",
"eslint-plugin-import": "^1.8.1",

View file

@ -20,7 +20,7 @@ if [ -z "${AWS_CLI}" ]; then
if [ -z "${AWS_CLI}" ]; then
printf >&2 -- '%s: cannot find AWS CLI binary "aws"\n' "$0"
printf >&2 -- '%s: please install AWS from http://aws.amazon.com/documentation/cli/\n' "$0"
printf >&2 -- '%s: please install AWS from https://aws.amazon.com/documentation/cli/\n' "$0"
exit 1
fi
fi

View file

@ -2,15 +2,31 @@
python-tag = py3
[flake8]
ignore = E501,E303,W503
exclude = wagtail/project_template/*,wagtail/utils/l18n/*
# D100: Missing docstring in public module
# D101: Missing docstring in public class
# D102: Missing docstring in public method
# D103: Missing docstring in public function
# D105: Missing docstring in magic method
# D200: One-line docstring should fit on one line with quotes
# D202: No blank lines allowed after function docstring
# D204: 1 blank line required after docstring
# D205: 1 blank line required between summary line and description
# D209: Multi-line docstring closing quotes should be on a separate line
# D400: First line should end with a period
# D401: First line should be in imperative mood
# E303: Too many blank lines
# E501: Line too long
# W503: line break before binary operator (superseded by W504 line break after binary operator)
# N805: First argument of a method should be named 'self'
# N806: Variable in function should be lowercase
ignore = D100,D101,D102,D103,D105,D200,D202,D204,D205,D209,D400,D401,E303,E501,W503,N805,N806
exclude = wagtail/project_template/*
max-line-length = 120
[isort]
line_length=100
multi_line_output=4
skip=migrations,project_template
skip_glob=*/wagtail/utils/l18n/*
known_first_party=wagtail
known_third_party=willow,modelcluster,taggit,django,unidecode,bs4,pytz,PIL

View file

@ -31,10 +31,9 @@ install_requires = [
"beautifulsoup4>=4.5.1,<4.6.1",
"html5lib>=0.999,<2",
"Unidecode>=0.04.14,<2.0",
"Willow>=1.1,<1.2",
"Willow>=1.3,<1.4",
"requests>=2.11.1,<3.0",
"pytz>=2016.6", # for l18n
"six>=1.11,<2.0", # for l18n
"l18n>=2018.5",
]
# Testing dependencies
@ -75,8 +74,8 @@ setup(
version=__version__,
description='A Django content management system.',
author='Wagtail core team + contributors',
author_email='hello@wagtail.io', # For support queries, please see http://docs.wagtail.io/en/stable/support.html
url='http://wagtail.io/',
author_email='hello@wagtail.io', # For support queries, please see https://docs.wagtail.io/en/stable/support.html
url='https://wagtail.io/',
packages=find_packages(),
include_package_data=True,
license='BSD',
@ -84,7 +83,7 @@ setup(
system built on Django, with a strong community and commercial support. \
Its focused on user experience, and offers precise control for \
designers and developers.\n\n\
For more details, see https://wagtail.io, http://docs.wagtail.io and \
For more details, see https://wagtail.io, https://docs.wagtail.io and \
https://github.com/wagtail/wagtail/.",
classifiers=[
'Development Status :: 5 - Production/Stable',
@ -99,7 +98,6 @@ https://github.com/wagtail/wagtail/.",
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
'Framework :: Django',
'Framework :: Django :: 2.0',
'Framework :: Django :: 2.1',
'Framework :: Django :: 2.2',
'Framework :: Wagtail',

27
tox.ini
View file

@ -2,27 +2,7 @@
skipsdist = True
usedevelop = True
envlist = py{35,36,37}-dj{20,21,22,master}-{sqlite,postgres,mysql,mssql}-{elasticsearch7,elasticsearch6,elasticsearch5,elasticsearch2,noelasticsearch},
[flake8]
# D100: Missing docstring in public module
# D101: Missing docstring in public class
# D102: Missing docstring in public method
# D103: Missing docstring in public function
# D105: Missing docstring in magic method
# D200: One-line docstring should fit on one line with quotes
# D202: No blank lines allowed after function docstring
# D204: 1 blank line required after docstring
# D205: 1 blank line required between summary line and description
# D209: Multi-line docstring cloasing quotes should be on a separate line
# D400: First line should end with a period
# D401: First line should be in imperative mood
# E303: Too many blank lines
# E501: Line too long
# W503: line break before binary operator (superseded by W504 line break after binary operator)
# N805: First argument of a method should be named 'self'
# N806: Variable in function should be lowercase
ignore = D100,D101,D102,D103,D105,D200,D202,D204,D205,D209,D400,D401,E303,E501,W503,N805,N806
envlist = py{35,36,37}-dj{21,22,22stable,30stable,master}-{sqlite,postgres,mysql,mssql}-{elasticsearch7,elasticsearch6,elasticsearch5,elasticsearch2,noelasticsearch},
[testenv]
install_command = pip install -e ".[testing]" -U {opts} {packages}
@ -43,12 +23,15 @@ deps =
django-sendfile==0.3.6
Embedly
dj20: Django>=2.0,<2.1
dj21: Django>=2.1,<2.2
dj22: Django>=2.2,<2.3
dj22stable: git+https://github.com/django/django.git@stable/2.2.x#egg=Django
dj30stable: git+https://github.com/django/django.git@stable/3.0.x#egg=Django
dj30stable: git+https://github.com/wagtail/django-modelcluster.git
dj30stable: git+https://github.com/encode/django-rest-framework.git
djmaster: git+https://github.com/django/django.git@master#egg=Django
djmaster: git+https://github.com/wagtail/django-modelcluster.git
djmaster: git+https://github.com/encode/django-rest-framework.git
postgres: psycopg2>=2.6
mysql: mysqlclient>=1.3.7,<1.4

View file

@ -5,7 +5,7 @@ from wagtail.utils.version import get_semver_version, get_version
# major.minor.patch.release.number
# release must be one of alpha, beta, rc, or final
VERSION = (2, 7, 0, 'alpha', 0)
VERSION = (2, 8, 0, 'alpha', 0)
__version__ = get_version(VERSION)

View file

@ -1,5 +1,7 @@
from collections import OrderedDict
from rest_framework.authentication import SessionAuthentication
from wagtail.api.v2.endpoints import PagesAPIEndpoint
from wagtail.api.v2.filters import (
ChildOfFilter, DescendantOfFilter, FieldsFilter, ForExplorerFilter, OrderingFilter,
@ -13,6 +15,7 @@ from .serializers import AdminPageSerializer
class PagesAdminAPIEndpoint(PagesAPIEndpoint):
base_serializer_class = AdminPageSerializer
authentication_classes = [SessionAuthentication]
# Use unrestricted child_of/descendant_of filters
# Add has_children filter
@ -32,6 +35,7 @@ class PagesAdminAPIEndpoint(PagesAPIEndpoint):
'children',
'descendants',
'parent',
'ancestors',
]
body_fields = PagesAPIEndpoint.body_fields + [

View file

@ -2,7 +2,7 @@ from collections import OrderedDict
from rest_framework.fields import Field, ReadOnlyField
from wagtail.api.v2.serializers import PageSerializer
from wagtail.api.v2.serializers import PageSerializer, get_serializer_class
from wagtail.api.v2.utils import get_full_url
from wagtail.core.models import Page
@ -76,8 +76,42 @@ class PageDescendantsField(Field):
])
class PageAncestorsField(Field):
"""
Serializes the page's ancestry.
Example:
"ancestry": [
{
"id": 1,
"meta": {
"type": "wagtailcore.Page",
"detail_url": "/api/v1/pages/1/"
},
"title": "Root"
},
{
"id": 2,
"meta": {
"type": "home.HomePage",
"detail_url": "/api/v1/pages/2/"
},
"title": "Home"
}
]
"""
def get_attribute(self, instance):
return instance
def to_representation(self, page):
serializer_class = get_serializer_class(Page, ['id', 'type', 'detail_url', 'html_url', 'title', 'admin_display_title'], meta_fields=['type', 'detail_url', 'html_url'], base=AdminPageSerializer)
serializer = serializer_class(context=self.context, many=True)
return serializer.to_representation(page.get_ancestors())
class AdminPageSerializer(PageSerializer):
status = PageStatusField(read_only=True)
children = PageChildrenField(read_only=True)
descendants = PageDescendantsField(read_only=True)
ancestors = PageAncestorsField(read_only=True)
admin_display_title = ReadOnlyField(source='get_admin_display_title')

View file

@ -1,5 +1,7 @@
from functools import wraps
import l18n
from django.contrib.auth import get_user_model
from django.contrib.auth.views import redirect_to_login as auth_redirect_to_login
from django.core.exceptions import PermissionDenied
@ -12,7 +14,6 @@ from django.utils.translation import override
from wagtail.admin import messages
from wagtail.core.models import GroupPagePermission
from wagtail.utils import l18n
def users_with_page_permission(page, permission_type, include_superusers=True):

View file

@ -15,7 +15,7 @@ def css_install_check(app_configs, **kwargs):
error_hint = """
Most likely you are running a development (non-packaged) copy of
Wagtail and have not built the static assets -
see http://docs.wagtail.io/en/latest/contributing/developing.html
see https://docs.wagtail.io/en/latest/contributing/developing.html
File not found: %s
""" % css_path

View file

@ -230,7 +230,14 @@ class ChoiceFieldComparison(FieldComparison):
val_b = force_str(dict(self.field.flatchoices).get(self.val_b, self.val_b), strings_only=True)
if self.val_a != self.val_b:
return TextDiff([('deletion', val_a), ('addition', val_b)]).to_html()
diffs = []
if val_a:
diffs += [('deletion', val_a)]
if val_b:
diffs += [('addition', val_b)]
return TextDiff(diffs).to_html()
else:
return escape(val_a)
@ -281,8 +288,8 @@ class TagsFieldComparison(M2MFieldComparison):
class ForeignObjectComparison(FieldComparison):
def get_objects(self):
model = self.field.related_model
obj_a = model.objects.filter(id=self.val_a).first()
obj_b = model.objects.filter(id=self.val_b).first()
obj_a = model.objects.filter(pk=self.val_a).first()
obj_b = model.objects.filter(pk=self.val_b).first()
return obj_a, obj_b
def htmldiff(self):
@ -593,7 +600,7 @@ def diff_text(a, b):
tokens = []
current_token = ""
for c in text:
for c in text or "":
if c.isalnum():
current_token += c
else:

View file

@ -3,6 +3,7 @@ import re
from django import forms
from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured
from django.db.models.fields import CharField, TextField
from django.forms.formsets import DELETION_FIELD_NAME, ORDERING_FIELD_NAME
from django.forms.models import fields_for_model
from django.template.loader import render_to_string
@ -500,6 +501,10 @@ class FieldPanel(EditHandler):
if isinstance(field, RichTextField):
return compare.RichTextFieldComparison
if isinstance(field, (CharField, TextField)):
return compare.TextFieldComparison
except FieldDoesNotExist:
pass

View file

@ -1,7 +1,7 @@
from django import forms
from django.core import validators
from django.forms.widgets import TextInput
from django.utils.translation import ugettext_lazy
from django.utils.translation import ugettext_lazy as _
class URLOrAbsolutePathValidator(validators.URLValidator):
@ -27,12 +27,12 @@ class URLOrAbsolutePathField(forms.URLField):
class ExternalLinkChooserForm(forms.Form):
url = URLOrAbsolutePathField(required=True, label=ugettext_lazy(""))
url = URLOrAbsolutePathField(required=True, label=_("URL"))
link_text = forms.CharField(required=False)
class AnchorLinkChooserForm(forms.Form):
url = forms.CharField(required=True, label=ugettext_lazy("#"))
url = forms.CharField(required=True, label="#")
link_text = forms.CharField(required=False)

View file

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Wagtail\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-07-09 14:27+0100\n"
"PO-Revision-Date: 2019-07-09 13:29+0000\n"
"POT-Creation-Date: 2019-10-16 18:00+0100\n"
"PO-Revision-Date: 2019-10-16 17:04+0000\n"
"Last-Translator: Matt Westcott <matthew@torchbox.com>\n"
"Language-Team: Afrikaans (http://www.transifex.com/torchbox/wagtail/language/"
"af/)\n"

View file

@ -14,9 +14,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Wagtail\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-07-09 14:27+0100\n"
"PO-Revision-Date: 2019-08-22 14:29+0000\n"
"Last-Translator: Mohammed Abdul gadir <weekmo@aol.com>\n"
"POT-Creation-Date: 2019-10-16 18:00+0100\n"
"PO-Revision-Date: 2019-10-16 17:04+0000\n"
"Last-Translator: Matt Westcott <matthew@torchbox.com>\n"
"Language-Team: Arabic (http://www.transifex.com/torchbox/wagtail/language/"
"ar/)\n"
"MIME-Version: 1.0\n"
@ -26,6 +26,9 @@ msgstr ""
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
msgid "Publish"
msgstr "انشر"
msgid "Submit for moderation"
msgstr "قدّم للمراجعة"
@ -35,15 +38,21 @@ msgstr "غير منشور"
msgid "Delete"
msgstr "احذف"
msgid "Page locked"
msgstr "الصفحة مغلقة"
msgid "Wagtail admin"
msgstr "مشرف Wagtail"
msgid "None"
msgstr "فارغ"
msgid "Sorry, you do not have permission to access this area."
msgstr "عذرًا ، ليس لديك إذن للوصول إلى هذه المنطقة."
msgid "You do not have permission to access the admin"
msgstr "ليس لديك الصلاحيات لدخول الى Admin"
msgid "None"
msgstr "فارغ"
msgid "Scheduled publishing"
msgstr "نشر مجدول"
@ -69,9 +78,6 @@ msgstr "ادخل %s الخاص بك "
msgid "Enter your email address to reset your password"
msgstr "ادخل البريد الإلكتروني الخاص بك لإرجاع كلمة المرور الخاصة بك "
msgid "URL"
msgstr "الرابط"
msgid "You cannot have multiple permission records for the same collection."
msgstr "لا يوجد لديك العديد من الصلاحيات المسجلة في نفس المجموعة"
@ -159,6 +165,229 @@ msgstr "هذا الحقل مقتضى"
msgid "Please select at least one group."
msgstr "نرجوا اختيار على الاقل مجموعة واحدة"
msgid "Arabic"
msgstr "عربي"
msgid "Catalan"
msgstr "الكاتالونية"
msgid "German"
msgstr "الألمانية"
msgid "Greek"
msgstr "اليونانية"
msgid "English"
msgstr "الإنجليزية"
msgid "Spanish"
msgstr "الأسبانية"
msgid "Finnish"
msgstr "الفنلندية"
msgid "French"
msgstr "الفرنسية"
msgid "Galician"
msgstr "الجاليكية"
msgid "Indonesian"
msgstr "الأندونيسية"
msgid "Icelandic"
msgstr "أيسلندي"
msgid "Italian"
msgstr "الإيطالي"
msgid "Korean"
msgstr "الكورية"
msgid "Lithuanian"
msgstr "اللتوانية"
msgid "Norwegian Bokmål"
msgstr "النرويجية بوكمال"
msgid "Netherlands Dutch"
msgstr "الهولندية"
msgid "Persian"
msgstr "الفارسية"
msgid "Polish"
msgstr "البولندي"
msgid "Brazilian Portuguese"
msgstr "البرتغالية البرازيلية"
msgid "Portuguese"
msgstr "البرتغالية"
msgid "Romanian"
msgstr "روماني"
msgid "Russian"
msgstr "الروسية"
msgid "Swedish"
msgstr "السويدية"
msgid "Slovak"
msgstr "السلوفاكية"
msgid "Ukrainian"
msgstr "الأوكراني"
msgid "Page"
msgstr "صفحة"
msgid "Pages"
msgstr "صفحات"
msgid "Loading…"
msgstr "تحميل..."
msgid "No results"
msgstr "لاتوجد نتائج"
msgid "Server Error"
msgstr "خطا بالخادم"
msgid "See all"
msgstr "مشاهدة الكل"
msgid "Close explorer"
msgstr "اغلق المستكشف"
msgid "Alt text"
msgstr "نص للمساعدة"
msgid "Write here…"
msgstr "اكتب هنا..."
msgid "Horizontal line"
msgstr "خط افقي"
msgid "Line break"
msgstr "خط فصل"
msgid "Undo"
msgstr "تراجع"
msgid "Redo"
msgstr "للامام"
msgid "Reload the page"
msgstr "اعادة تحميل الصفحه"
msgid "Reload saved content"
msgstr "اعادة تحميل المحتوى المحفوظ"
msgid "Show latest content"
msgstr "اظهر اخر محتوى"
msgid "Show error"
msgstr "اعرض الخطء"
msgid ""
"The editor just crashed. Content has been reset to the last saved version."
msgstr "المحرر تحطمت للتو. تمت إعادة تعيين المحتوى إلى آخر إصدار تم حفظه."
msgid "Broken link"
msgstr "رابط معطوب"
msgid "Missing document"
msgstr "مستند مفقود"
msgid "Close"
msgstr "اغلاق"
msgid "Edit '{title}'"
msgstr "تحرير '{title}'"
msgid "Page explorer"
msgstr "مستكشف الصفحة"
msgid "January"
msgstr "يناير"
msgid "February"
msgstr "فبراير"
msgid "March"
msgstr "مارس"
msgid "April"
msgstr "أبريل"
msgid "May"
msgstr "مايو"
msgid "June"
msgstr "يونيو"
msgid "July"
msgstr "يوليو"
msgid "August"
msgstr "أغسطس"
msgid "September"
msgstr "سبتمبر"
msgid "October"
msgstr "اكتوبر"
msgid "November"
msgstr "نوفمبر"
msgid "December"
msgstr "ديسمبر"
msgid "Sunday"
msgstr "الاحد"
msgid "Monday"
msgstr "الاثنين"
msgid "Tuesday"
msgstr "الثلاثاء"
msgid "Wednesday"
msgstr "الاربعاء"
msgid "Thursday"
msgstr "الخميس"
msgid "Friday"
msgstr "الجمعة"
msgid "Saturday"
msgstr "السبت"
msgid "Sun"
msgstr "احد"
msgid "Mon"
msgstr "اثنين"
msgid "Tue"
msgstr "ثلاثاء"
msgid "Wed"
msgstr "اربعاء"
msgid "Thu"
msgstr "خميس"
msgid "Fri"
msgstr "جمعة"
msgid "Sat"
msgstr "سبت"
msgid "Error 404: Page not found"
msgstr "خطا 404: الصفحة المطلوبة غير متوفرة"
@ -248,166 +477,12 @@ msgstr "أكملت إعادة تثبيت كلمة السر"
msgid "Reset your password"
msgstr "أعد تثبيت كلمةتك السرية"
msgid "Page"
msgstr "صفحة"
msgid "Pages"
msgstr "صفحات"
msgid "Loading…"
msgstr "تحميل..."
msgid "No results"
msgstr "لاتوجد نتائج"
msgid "Server Error"
msgstr "خطا بالخادم"
msgid "See all"
msgstr "مشاهدة الكل"
msgid "Close explorer"
msgstr "اغلق المستكشف"
msgid "Alt text"
msgstr "نص للمساعدة"
msgid "Write here…"
msgstr "اكتب هنا..."
msgid "Horizontal line"
msgstr "خط افقي"
msgid "Line break"
msgstr "خط فصل"
msgid "Undo"
msgstr "تراجع"
msgid "Redo"
msgstr "للامام"
msgid "Reload the page"
msgstr "اعادة تحميل الصفحه"
msgid "Reload saved content"
msgstr "اعادة تحميل المحتوى المحفوظ"
msgid "Show latest content"
msgstr "اظهر اخر محتوى"
msgid "Show error"
msgstr "اعرض الخطء"
msgid ""
"The editor just crashed. Content has been reset to the last saved version."
msgstr "المحرر تحطمت للتو. تمت إعادة تعيين المحتوى إلى آخر إصدار تم حفظه."
msgid "Broken link"
msgstr "رابط معطوب"
msgid "Missing document"
msgstr "مستند مفقود"
msgid "Close"
msgstr "اغلاق"
msgid "Edit \\"
msgstr "تعديل /"
msgid "View child pages of \\"
msgstr "اظهر الصفحات الفرعية ل /"
msgid "Page explorer"
msgstr "مستكشف الصفحة"
msgid "January"
msgstr "يناير"
msgid "February"
msgstr "فبراير"
msgid "March"
msgstr "مارس"
msgid "April"
msgstr "أبريل"
msgid "May"
msgstr "مايو"
msgid "June"
msgstr "يونيو"
msgid "July"
msgstr "يوليو"
msgid "August"
msgstr "أغسطس"
msgid "September"
msgstr "سبتمبر"
msgid "October"
msgstr "اكتوبر"
msgid "November"
msgstr "نوفمبر"
msgid "December"
msgstr "ديسمبر"
msgid "Sunday"
msgstr "الاحد"
msgid "Monday"
msgstr "الاثنين"
msgid "Tuesday"
msgstr "الثلاثاء"
msgid "Wednesday"
msgstr "الاربعاء"
msgid "Thursday"
msgstr "الخميس"
msgid "Friday"
msgstr "الجمعة"
msgid "Saturday"
msgstr "السبت"
msgid "Sun"
msgstr "احد"
msgid "Mon"
msgstr "اثنين"
msgid "Tue"
msgstr "ثلاثاء"
msgid "Wed"
msgstr "اربعاء"
msgid "Thu"
msgstr "خميس"
msgid "Fri"
msgstr "جمعة"
msgid "Sat"
msgstr "سبت"
msgid "Dashboard"
msgstr "لوحة التحكم"
msgid "Menu"
msgstr "قائمة المحتويات"
msgid "Add another"
msgstr "أـضف آخر"
msgid "Move up"
msgstr "تقدم إلى فوق "
@ -663,8 +738,14 @@ msgstr "يتم النشر..."
msgid "Publish this revision"
msgstr "نشر النسخه السابقه"
msgid "Publish"
msgstr "انشر"
msgid "Saving…"
msgstr "يتم الحفظ..."
msgid "Replace current draft"
msgstr "استبدال المسودة الحالية"
msgid "Save draft"
msgstr "احفظ المسوّد"
#, python-format
msgid "Create a page in %(title)s"
@ -759,12 +840,6 @@ msgstr "جديد %(page_type)s"
msgid "New"
msgstr "جديد"
msgid "Saving…"
msgstr "يتم الحفظ..."
msgid "Save draft"
msgstr "احفظ المسوّد"
msgid "This page has unsaved changes."
msgstr " لم يتم حفظ التعديلات على هذه الصحفه"
@ -776,12 +851,6 @@ msgstr "قيد التعديل %(page_type)s :%(title)s"
msgid "Editing %(page_type)s <span>%(title)s</span>"
msgstr "تحرير %(page_type)s <span> %(title)s </span>"
msgid "Page locked"
msgstr "الصفحة مغلقة"
msgid "Replace current draft"
msgstr "استبدال المسودة الحالية"
#, python-format
msgid "Last modified: %(last_mod)s"
msgstr "اخر تعديل: %(last_mod)s"
@ -1087,84 +1156,6 @@ msgstr "اعرض في المستكشف"
msgid "Test"
msgstr "اختبار"
msgid "Arabic"
msgstr "عربي"
msgid "Catalan"
msgstr "الكاتالونية"
msgid "German"
msgstr "الألمانية"
msgid "Greek"
msgstr "اليونانية"
msgid "English"
msgstr "الإنجليزية"
msgid "Spanish"
msgstr "الأسبانية"
msgid "Finnish"
msgstr "الفنلندية"
msgid "French"
msgstr "الفرنسية"
msgid "Galician"
msgstr "الجاليكية"
msgid "Indonesian"
msgstr "الأندونيسية"
msgid "Icelandic"
msgstr "أيسلندي"
msgid "Italian"
msgstr "الإيطالي"
msgid "Korean"
msgstr "الكورية"
msgid "Lithuanian"
msgstr "اللتوانية"
msgid "Norwegian Bokmål"
msgstr "النرويجية بوكمال"
msgid "Netherlands Dutch"
msgstr "الهولندية"
msgid "Persian"
msgstr "الفارسية"
msgid "Polish"
msgstr "البولندي"
msgid "Brazilian Portuguese"
msgstr "البرتغالية البرازيلية"
msgid "Portuguese"
msgstr "البرتغالية"
msgid "Romanian"
msgstr "روماني"
msgid "Russian"
msgstr "الروسية"
msgid "Swedish"
msgstr "السويدية"
msgid "Slovak"
msgstr "السلوفاكية"
msgid "Ukrainian"
msgstr "الأوكراني"
msgid "Sorry, you do not have permission to access this area."
msgstr "عذرًا ، ليس لديك إذن للوصول إلى هذه المنطقة."
msgid "Your password has been changed successfully!"
msgstr "تم تغيير كلمة المرور الخاصة بك بنجاح!"
@ -1326,45 +1317,12 @@ msgstr "مراجعة {0} من \"{1}\""
msgid "Revision {0} of \"{1}\" unscheduled."
msgstr "مراجعة {0} من \"{1}\" غير المجدولة."
msgid "Edit '{title}'"
msgstr "تحرير '{title}'"
msgid "Preview draft version of '{title}'"
msgstr "معاينة نسخة مسودة '{title}'"
msgid "View live version of '{title}'"
msgstr "عرض إصدار مباشر من '{title}'"
msgid "Add a child page to '{title}' "
msgstr "إضافة صفحة فرعية إلى '{title}'"
msgid "More"
msgstr "المزيد"
msgid "View more options for '{title}'"
msgstr "عرض مزيد من الخيارات لـ '{title}'"
msgid "Move page '{title}'"
msgstr "نقل الصفحة '{title}'"
msgid "Copy page '{title}'"
msgstr "نسخة الصفحة '{title}'"
msgid "Delete page '{title}'"
msgstr "حذف الصفحة '{title}'"
msgid "Unpublish page '{title}'"
msgstr "إلغاء نشر الصفحة '{title}'"
msgid "View revision history for '{title}'"
msgstr "عرض سجل النسخ السابقة لـ '{title}'"
msgid "Set profile picture"
msgstr "اضبط صورة الملف الشخصي"
msgid "Change your profile picture"
msgstr "غير صورة ملفك الشخصي"
msgid "Change the email address linked to your account."
msgstr "قم بتغيير عنوان البريد الإلكتروني المرتبط بحسابك."
@ -1386,9 +1344,6 @@ msgstr "الوقت الزمني الحالي"
msgid "Choose your current time zone."
msgstr "اختر منطقتك الزمنية الحالية."
msgid "Heading {level}"
msgstr "Heading {level}"
msgid "Bulleted list"
msgstr "قائمة ذات تعداد نقطي"

View file

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Wagtail\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-07-09 14:27+0100\n"
"PO-Revision-Date: 2019-07-09 13:29+0000\n"
"POT-Creation-Date: 2019-10-16 18:00+0100\n"
"PO-Revision-Date: 2019-10-16 17:04+0000\n"
"Last-Translator: Matt Westcott <matthew@torchbox.com>\n"
"Language-Team: Belarusian (http://www.transifex.com/torchbox/wagtail/"
"language/be/)\n"
@ -24,12 +24,12 @@ msgstr ""
msgid "Delete"
msgstr "Выдаліць"
msgid "None"
msgstr "Некалькі"
msgid "You do not have permission to access the admin"
msgstr "У вас няма доступу да панэлі адміністратара"
msgid "None"
msgstr "Некалькі"
msgid "Scheduled publishing"
msgstr "Адкладзеная публікацыя"
@ -55,9 +55,6 @@ msgstr "Увядзіце вашае %s"
msgid "Enter your email address to reset your password"
msgstr "Калі ласка, увядзіце адрас электроннай пошты для змены пароля"
msgid "URL"
msgstr "URL"
msgid "You cannot have multiple permission records for the same collection."
msgstr "Вы не можаце мець некалькі дазволаў для адной і той жа калекцыі."
@ -148,6 +145,57 @@ msgstr "Гэта поле з'яўляецца абавязковым."
msgid "Please select at least one group."
msgstr "Калі ласка, выберыце мінімум 1 гурт."
msgid "Page"
msgstr "Старонка"
msgid "Pages"
msgstr "Старонкі"
msgid "Loading…"
msgstr "Загрузка..."
msgid "No results"
msgstr "Няма вынікаў"
msgid "Server Error"
msgstr "Памылка Сервера"
msgid "See all"
msgstr "Усё паглядзець"
msgid "Close explorer"
msgstr "Зачыніць даследчык"
msgid "Alt text"
msgstr "Тэкст падказкі"
msgid "Write here…"
msgstr "Пішыце тут..."
msgid "Horizontal line"
msgstr "Гарызантальная лінія"
msgid "Line break"
msgstr "Канец радка"
msgid "Undo"
msgstr "Адмяніць дзеянне"
msgid "Redo"
msgstr "Абнавіць"
msgid "Reload the page"
msgstr "Абнавіць старонку"
msgid "Reload saved content"
msgstr " Обнавиць захаваны змест"
msgid "Show latest content"
msgstr "Паказаць апошні змест"
msgid "Show error"
msgstr "Паказаць памылку"
msgid "Error 404: Page not found"
msgstr "Памылка 404: старонка не знойдзена"
@ -240,66 +288,12 @@ msgstr "Аднаўленне пароля"
msgid "Reset your password"
msgstr "Скінуць пароль"
msgid "Page"
msgstr "Старонка"
msgid "Pages"
msgstr "Старонкі"
msgid "Loading…"
msgstr "Загрузка..."
msgid "No results"
msgstr "Няма вынікаў"
msgid "Server Error"
msgstr "Памылка Сервера"
msgid "See all"
msgstr "Усё паглядзець"
msgid "Close explorer"
msgstr "Зачыніць даследчык"
msgid "Alt text"
msgstr "Тэкст падказкі"
msgid "Write here…"
msgstr "Пішыце тут..."
msgid "Horizontal line"
msgstr "Гарызантальная лінія"
msgid "Line break"
msgstr "Канец радка"
msgid "Undo"
msgstr "Адмяніць дзеянне"
msgid "Redo"
msgstr "Абнавіць"
msgid "Reload the page"
msgstr "Абнавіць старонку"
msgid "Reload saved content"
msgstr " Обнавиць захаваны змест"
msgid "Show latest content"
msgstr "Паказаць апошні змест"
msgid "Show error"
msgstr "Паказаць памылку"
msgid "Dashboard"
msgstr "Панэль кіравання"
msgid "Menu"
msgstr "Меню"
msgid "Add another"
msgstr "Яшчэ дадаць"
msgid "Move up"
msgstr "Падвінуць наверх"

View file

@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Wagtail\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-07-09 14:27+0100\n"
"PO-Revision-Date: 2019-07-09 13:29+0000\n"
"POT-Creation-Date: 2019-10-16 18:00+0100\n"
"PO-Revision-Date: 2019-10-16 17:04+0000\n"
"Last-Translator: Matt Westcott <matthew@torchbox.com>\n"
"Language-Team: Bulgarian (http://www.transifex.com/torchbox/wagtail/language/"
"bg/)\n"
@ -20,6 +20,9 @@ msgstr ""
"Language: bg\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Publish"
msgstr "Публикувай"
msgid "Submit for moderation"
msgstr "Предостави за модерация"
@ -198,8 +201,8 @@ msgstr "Можете да прегледате страницата тук:"
msgid "The page \"%(page)s\" has been submitted for moderation"
msgstr "Страницата \"%(page)s\" бе предоставена за модериране"
msgid "Publish"
msgstr "Публикувай"
msgid "Save draft"
msgstr "Запази като чернова"
#, python-format
msgid "Create a page in %(title)s"
@ -283,9 +286,6 @@ msgstr "Нова %(page_type)s"
msgid "New"
msgstr "Ново"
msgid "Save draft"
msgstr "Запази като чернова"
#, python-format
msgid "Last modified: %(last_mod)s"
msgstr "Последно редактиран: %(last_mod)s"

View file

@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Wagtail\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-07-09 14:27+0100\n"
"PO-Revision-Date: 2019-07-09 13:29+0000\n"
"POT-Creation-Date: 2019-10-16 18:00+0100\n"
"PO-Revision-Date: 2019-10-16 17:04+0000\n"
"Last-Translator: Matt Westcott <matthew@torchbox.com>\n"
"Language-Team: Catalan (http://www.transifex.com/torchbox/wagtail/language/"
"ca/)\n"
@ -21,6 +21,9 @@ msgstr ""
"Language: ca\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Publish"
msgstr "Publica"
msgid "Submit for moderation"
msgstr "Envia per moderació"
@ -30,15 +33,21 @@ msgstr "Despublica"
msgid "Delete"
msgstr "Esborra"
msgid "Page locked"
msgstr "Pàgina bloquejada"
msgid "Wagtail admin"
msgstr "Administració de Wagtail"
msgid "None"
msgstr "Cap"
msgid "Sorry, you do not have permission to access this area."
msgstr "No teniu permís per accedir a aquesta àrea."
msgid "You do not have permission to access the admin"
msgstr "No teniu permís per accedir a la pàgina d'administració"
msgid "None"
msgstr "Cap"
msgid "Scheduled publishing"
msgstr "Planificar la publicació"
@ -64,9 +73,6 @@ msgstr "Introdueix el teu %s"
msgid "Enter your email address to reset your password"
msgstr "Escriu el teu correu per reiniciar la teva contrasenya"
msgid "URL"
msgstr "URL"
msgid "You cannot have multiple permission records for the same collection."
msgstr ""
"No podeu tenir múltiples registres de permisos per la mateixa col·lecció."
@ -151,6 +157,69 @@ msgstr "Aquest camp és obligatori"
msgid "Please select at least one group."
msgstr "Seleccioneu com a mínim un grup."
msgid "Pages"
msgstr "Pàgines"
msgid "Edit '{title}'"
msgstr "Editar '{title}'"
msgid "January"
msgstr "Gener"
msgid "February"
msgstr "Febrer"
msgid "March"
msgstr "Març"
msgid "April"
msgstr "Abril"
msgid "May"
msgstr "Maig"
msgid "June"
msgstr "Juny"
msgid "July"
msgstr "Juliol"
msgid "August"
msgstr "Agost"
msgid "September"
msgstr "Setembre"
msgid "October"
msgstr "Octubre"
msgid "November"
msgstr "Novembre"
msgid "December"
msgstr "Desembre"
msgid "Sun"
msgstr "Dg"
msgid "Mon"
msgstr "Dl"
msgid "Tue"
msgstr "Dt"
msgid "Wed"
msgstr "Dc"
msgid "Thu"
msgstr "Dj"
msgid "Fri"
msgstr "Dv"
msgid "Sat"
msgstr "Ds"
msgid "Error 404: Page not found"
msgstr "Error 404: Pàgina no trobada"
@ -217,75 +286,12 @@ msgstr "Contrasenya reiniciada"
msgid "Reset your password"
msgstr "Reinicia la teva contrasenya "
msgid "Pages"
msgstr "Pàgines"
msgid "January"
msgstr "Gener"
msgid "February"
msgstr "Febrer"
msgid "March"
msgstr "Març"
msgid "April"
msgstr "Abril"
msgid "May"
msgstr "Maig"
msgid "June"
msgstr "Juny"
msgid "July"
msgstr "Juliol"
msgid "August"
msgstr "Agost"
msgid "September"
msgstr "Setembre"
msgid "October"
msgstr "Octubre"
msgid "November"
msgstr "Novembre"
msgid "December"
msgstr "Desembre"
msgid "Sun"
msgstr "Dg"
msgid "Mon"
msgstr "Dl"
msgid "Tue"
msgstr "Dt"
msgid "Wed"
msgstr "Dc"
msgid "Thu"
msgstr "Dj"
msgid "Fri"
msgstr "Dv"
msgid "Sat"
msgstr "Ds"
msgid "Dashboard"
msgstr "Tauler de control"
msgid "Menu"
msgstr "Menú"
msgid "Add another"
msgstr "Afegir un altra"
msgid "Move up"
msgstr "Puja"
@ -517,8 +523,11 @@ msgstr "Desbloquejada"
msgid "Publish this revision"
msgstr "Publicar aquesta revisió"
msgid "Publish"
msgstr "Publica"
msgid "Replace current draft"
msgstr "Reemplaçar l'esborrany actual"
msgid "Save draft"
msgstr "Desa esborrany"
#, python-format
msgid "Create a page in %(title)s"
@ -649,9 +658,6 @@ msgstr "Nova %(page_type)s"
msgid "New"
msgstr "Nou"
msgid "Save draft"
msgstr "Desa esborrany"
msgid "This page has unsaved changes."
msgstr "Aquesta pàgina té modificacions no desades"
@ -663,12 +669,6 @@ msgstr "Editant %(page_type)s: %(title)s"
msgid "Editing %(page_type)s <span>%(title)s</span>"
msgstr "Editant %(page_type)s <span>%(title)s</span>"
msgid "Page locked"
msgstr "Pàgina bloquejada"
msgid "Replace current draft"
msgstr "Reemplaçar l'esborrany actual"
#, python-format
msgid "Last modified: %(last_mod)s"
msgstr "Darrera modificació: %(last_mod)s"
@ -981,9 +981,6 @@ msgstr "Mostrar a l'Explorer"
msgid "Test"
msgstr "Provar"
msgid "Sorry, you do not have permission to access this area."
msgstr "No teniu permís per accedir a aquesta àrea."
msgid "Your password has been changed successfully!"
msgstr "S'ha canviat la teva contrasenya!"
@ -1129,39 +1126,9 @@ msgstr "La més antiga"
msgid "Latest"
msgstr "L'última"
msgid "Edit '{title}'"
msgstr "Editar '{title}'"
msgid "Preview draft version of '{title}'"
msgstr "Previsualitzar versió esborrany de '{title}'"
msgid "View live version of '{title}'"
msgstr "Visualitzar versió en viu de '{title}'"
msgid "Add a child page to '{title}' "
msgstr "Afegir una pàgina filla a '{title}'"
msgid "More"
msgstr "Més"
msgid "View more options for '{title}'"
msgstr "Veure més opcions per '{title}'"
msgid "Move page '{title}'"
msgstr "Moure pàgina '{title}'"
msgid "Copy page '{title}'"
msgstr "Copiar pàgina '{title}'"
msgid "Delete page '{title}'"
msgstr "Eliminar pàgina '{title}'"
msgid "Unpublish page '{title}'"
msgstr "Despublicar pàgina '{title}'"
msgid "View revision history for '{title}'"
msgstr "Visualitzar historial de revisions de '{title}'"
msgid "Change the password you use to log in."
msgstr "Canvia la password que fas servir per connectar-te"

View file

@ -17,8 +17,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Wagtail\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-07-09 14:27+0100\n"
"PO-Revision-Date: 2019-07-09 13:29+0000\n"
"POT-Creation-Date: 2019-10-16 18:00+0100\n"
"PO-Revision-Date: 2019-10-16 17:04+0000\n"
"Last-Translator: Matt Westcott <matthew@torchbox.com>\n"
"Language-Team: Czech (http://www.transifex.com/torchbox/wagtail/language/"
"cs/)\n"
@ -29,6 +29,9 @@ msgstr ""
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n "
"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
msgid "Publish"
msgstr "Publikovat"
msgid "Submit for moderation"
msgstr "Odeslat ke schválení"
@ -38,15 +41,21 @@ msgstr "Zrušit publikaci"
msgid "Delete"
msgstr "Smazat"
msgid "Page locked"
msgstr "Stránka uzamčena"
msgid "Wagtail admin"
msgstr "Wagtail admin"
msgid "None"
msgstr "Nic"
msgid "Sorry, you do not have permission to access this area."
msgstr "Promiňte, ale na přístup k této části nemáte oprávnění."
msgid "You do not have permission to access the admin"
msgstr "Nemáte povolení k přístupu do redakčního systému"
msgid "None"
msgstr "Nic"
msgid "Scheduled publishing"
msgstr "Naplánovat publikaci"
@ -72,9 +81,6 @@ msgstr "Zadejte své %s"
msgid "Enter your email address to reset your password"
msgstr "Pro obnovení hesla zadejte svou e-mailovou adresu"
msgid "URL"
msgstr "URL"
msgid "You cannot have multiple permission records for the same collection."
msgstr "Oprávnění pro stejnou kolekci nemůže být nastaveno vícekrát."
@ -167,6 +173,238 @@ msgstr "Toto pole je povinné."
msgid "Please select at least one group."
msgstr "Zvolte prosím alespoň jednu skupinu."
msgid "Arabic"
msgstr "Arabic"
msgid "Catalan"
msgstr "Catalan"
msgid "German"
msgstr "German"
msgid "Greek"
msgstr "Greek"
msgid "English"
msgstr "English"
msgid "Spanish"
msgstr "Spanish"
msgid "Finnish"
msgstr "Finnish"
msgid "French"
msgstr "French"
msgid "Galician"
msgstr "Galician"
msgid "Indonesian"
msgstr "Indonesian"
msgid "Icelandic"
msgstr "Icelandic"
msgid "Italian"
msgstr "Italian"
msgid "Korean"
msgstr "Korean"
msgid "Lithuanian"
msgstr "Lithuanian"
msgid "Mongolian"
msgstr "mongolština"
msgid "Norwegian Bokmål"
msgstr "Norwegian Bokmål"
msgid "Netherlands Dutch"
msgstr "Netherlands Dutch"
msgid "Persian"
msgstr "Persian"
msgid "Polish"
msgstr "Polish"
msgid "Brazilian Portuguese"
msgstr "Brazilian Portuguese"
msgid "Portuguese"
msgstr "Portuguese"
msgid "Romanian"
msgstr "Romanian"
msgid "Russian"
msgstr "Russian"
msgid "Swedish"
msgstr "Swedish"
msgid "Slovak"
msgstr "Slovak"
msgid "Thai"
msgstr "thajština"
msgid "Ukrainian"
msgstr "Ukrainian"
msgid "Chinese (Simplified)"
msgstr "čínština (zjednodušená)"
msgid "Chinese (Traditional)"
msgstr "čínština (tradiční)"
msgid "Page"
msgstr "Stránka"
msgid "Pages"
msgstr "Stránky"
msgid "Loading…"
msgstr "Načítání..."
msgid "No results"
msgstr "Žádné výsledky"
msgid "Server Error"
msgstr "Chyba serveru"
msgid "See all"
msgstr "Zobrazit vse"
msgid "Close explorer"
msgstr "Zavřít explorer"
msgid "Alt text"
msgstr "Alternativní text"
msgid "Write here…"
msgstr "Pište zde..."
msgid "Horizontal line"
msgstr "Horizontální linie"
msgid "Line break"
msgstr "Nový řádek"
msgid "Undo"
msgstr "Vrátit zpět"
msgid "Redo"
msgstr "Opakovat"
msgid "Reload the page"
msgstr "Znovu načíst stránku"
msgid "Reload saved content"
msgstr "Znovu načíst uložený obsah"
msgid "Show latest content"
msgstr "Zobrazit aktuální obsah"
msgid "Show error"
msgstr "Zobrazit chyby"
msgid ""
"The editor just crashed. Content has been reset to the last saved version."
msgstr "Editor zhavaroval. Obsah byl obnoven z poslední uložené verze."
msgid "Broken link"
msgstr "Nefunkční odkaz"
msgid "Missing document"
msgstr "Chybějící dokument"
msgid "Close"
msgstr "Zavřít"
msgid "Edit '{title}'"
msgstr "Editovat '{title}'"
msgid "January"
msgstr "leden"
msgid "February"
msgstr "únor"
msgid "March"
msgstr "březen"
msgid "April"
msgstr "duben"
msgid "May"
msgstr "květen"
msgid "June"
msgstr "červen"
msgid "July"
msgstr "červenec"
msgid "August"
msgstr "srpen"
msgid "September"
msgstr "září"
msgid "October"
msgstr "říjen"
msgid "November"
msgstr "listopad"
msgid "December"
msgstr "prosinec"
msgid "Sunday"
msgstr "neděle"
msgid "Monday"
msgstr "pondělí"
msgid "Tuesday"
msgstr "úterý"
msgid "Wednesday"
msgstr "středa"
msgid "Thursday"
msgstr "čtvrtek"
msgid "Friday"
msgstr "pátek"
msgid "Saturday"
msgstr "dobota"
msgid "Sun"
msgstr "ne"
msgid "Mon"
msgstr "po"
msgid "Tue"
msgstr "út"
msgid "Wed"
msgstr "st"
msgid "Thu"
msgstr "čt"
msgid "Fri"
msgstr "pá"
msgid "Sat"
msgstr "so"
msgid "Error 404: Page not found"
msgstr "Error 404: Stránka nebyla nalezena"
@ -257,157 +495,12 @@ msgstr "Obnovení hesla"
msgid "Reset your password"
msgstr "Nastavit nové heslo"
msgid "Page"
msgstr "Stránka"
msgid "Pages"
msgstr "Stránky"
msgid "Loading…"
msgstr "Načítání..."
msgid "No results"
msgstr "Žádné výsledky"
msgid "Server Error"
msgstr "Chyba serveru"
msgid "See all"
msgstr "Zobrazit vse"
msgid "Close explorer"
msgstr "Zavřít explorer"
msgid "Alt text"
msgstr "Alternativní text"
msgid "Write here…"
msgstr "Pište zde..."
msgid "Horizontal line"
msgstr "Horizontální linie"
msgid "Line break"
msgstr "Nový řádek"
msgid "Undo"
msgstr "Vrátit zpět"
msgid "Redo"
msgstr "Opakovat"
msgid "Reload the page"
msgstr "Znovu načíst stránku"
msgid "Reload saved content"
msgstr "Znovu načíst uložený obsah"
msgid "Show latest content"
msgstr "Zobrazit aktuální obsah"
msgid "Show error"
msgstr "Zobrazit chyby"
msgid ""
"The editor just crashed. Content has been reset to the last saved version."
msgstr "Editor zhavaroval. Obsah byl obnoven z poslední uložené verze."
msgid "Broken link"
msgstr "Nefunkční odkaz"
msgid "Missing document"
msgstr "Chybějící dokument"
msgid "Close"
msgstr "Zavřít"
msgid "January"
msgstr "leden"
msgid "February"
msgstr "únor"
msgid "March"
msgstr "březen"
msgid "April"
msgstr "duben"
msgid "May"
msgstr "květen"
msgid "June"
msgstr "červen"
msgid "July"
msgstr "červenec"
msgid "August"
msgstr "srpen"
msgid "September"
msgstr "září"
msgid "October"
msgstr "říjen"
msgid "November"
msgstr "listopad"
msgid "December"
msgstr "prosinec"
msgid "Sunday"
msgstr "neděle"
msgid "Monday"
msgstr "pondělí"
msgid "Tuesday"
msgstr "úterý"
msgid "Wednesday"
msgstr "středa"
msgid "Thursday"
msgstr "čtvrtek"
msgid "Friday"
msgstr "pátek"
msgid "Saturday"
msgstr "dobota"
msgid "Sun"
msgstr "ne"
msgid "Mon"
msgstr "po"
msgid "Tue"
msgstr "út"
msgid "Wed"
msgstr "st"
msgid "Thu"
msgstr "čt"
msgid "Fri"
msgstr "pá"
msgid "Sat"
msgstr "so"
msgid "Dashboard"
msgstr "Dashboard"
msgid "Menu"
msgstr "Menu"
msgid "Add another"
msgstr "Přidat další"
msgid "Move up"
msgstr "Posunout nahoru"
@ -686,8 +779,14 @@ msgstr "Publikování..."
msgid "Publish this revision"
msgstr "Publikovat tuto revizi"
msgid "Publish"
msgstr "Publikovat"
msgid "Saving…"
msgstr "Ukládání..."
msgid "Replace current draft"
msgstr "Nahradit současný koncept"
msgid "Save draft"
msgstr "Uložit koncept"
#, python-format
msgid "Create a page in %(title)s"
@ -834,12 +933,6 @@ msgstr "Nový %(page_type)s"
msgid "New"
msgstr "Nový"
msgid "Saving…"
msgstr "Ukládání..."
msgid "Save draft"
msgstr "Uložit koncept"
msgid "This page has unsaved changes."
msgstr "Na této stránce jsou neuložené změny."
@ -851,12 +944,6 @@ msgstr "Upravit %(page_type)s: %(title)s"
msgid "Editing %(page_type)s <span>%(title)s</span>"
msgstr "Upravit %(page_type)s <span>%(title)s</span>"
msgid "Page locked"
msgstr "Stránka uzamčena"
msgid "Replace current draft"
msgstr "Nahradit současný koncept"
#, python-format
msgid "Last modified: %(last_mod)s"
msgstr "Naposledy upraveno: %(last_mod)s"
@ -1244,96 +1331,6 @@ msgstr "Zobrazit v prohlížeči"
msgid "Test"
msgstr "Test"
msgid "Arabic"
msgstr "Arabic"
msgid "Catalan"
msgstr "Catalan"
msgid "German"
msgstr "German"
msgid "Greek"
msgstr "Greek"
msgid "English"
msgstr "English"
msgid "Spanish"
msgstr "Spanish"
msgid "Finnish"
msgstr "Finnish"
msgid "French"
msgstr "French"
msgid "Galician"
msgstr "Galician"
msgid "Indonesian"
msgstr "Indonesian"
msgid "Icelandic"
msgstr "Icelandic"
msgid "Italian"
msgstr "Italian"
msgid "Korean"
msgstr "Korean"
msgid "Lithuanian"
msgstr "Lithuanian"
msgid "Mongolian"
msgstr "mongolština"
msgid "Norwegian Bokmål"
msgstr "Norwegian Bokmål"
msgid "Netherlands Dutch"
msgstr "Netherlands Dutch"
msgid "Persian"
msgstr "Persian"
msgid "Polish"
msgstr "Polish"
msgid "Brazilian Portuguese"
msgstr "Brazilian Portuguese"
msgid "Portuguese"
msgstr "Portuguese"
msgid "Romanian"
msgstr "Romanian"
msgid "Russian"
msgstr "Russian"
msgid "Swedish"
msgstr "Swedish"
msgid "Slovak"
msgstr "Slovak"
msgid "Thai"
msgstr "thajština"
msgid "Ukrainian"
msgstr "Ukrainian"
msgid "Chinese (Simplified)"
msgstr "čínština (zjednodušená)"
msgid "Chinese (Traditional)"
msgstr "čínština (tradiční)"
msgid "Sorry, you do not have permission to access this area."
msgstr "Promiňte, ale na přístup k této části nemáte oprávnění."
msgid "Your password has been changed successfully!"
msgstr "Vaše heslo bylo úspěšně změněno!"
@ -1504,45 +1501,12 @@ msgstr "verze {0} \"{1}\""
msgid "Revision {0} of \"{1}\" unscheduled."
msgstr "Verze {0} \"{1}\" - naplánování bylo zrušeno."
msgid "Edit '{title}'"
msgstr "Editovat '{title}'"
msgid "Preview draft version of '{title}'"
msgstr "Prohlédnout návrh stránky '{title}'"
msgid "View live version of '{title}'"
msgstr "Zobrazit aktuální vzhled '{title}'"
msgid "Add a child page to '{title}' "
msgstr "Přidat podstránku ke '{title}'"
msgid "More"
msgstr "Více"
msgid "View more options for '{title}'"
msgstr "Zobrazit více voleb pro '{title}'"
msgid "Move page '{title}'"
msgstr "Přesunout stránku '{title}'"
msgid "Copy page '{title}'"
msgstr "Zkopírovat stránku '{title}'"
msgid "Delete page '{title}'"
msgstr "Zrušit stránku '{title}'"
msgid "Unpublish page '{title}'"
msgstr "Nezveřejňovat stránku '{title}'"
msgid "View revision history for '{title}'"
msgstr "Zobrazit historii verzí '{title}'"
msgid "Set profile picture"
msgstr "Nastavit profilovou fotografii"
msgid "Change your profile picture"
msgstr "Změnit profilovou fotografii."
msgid "Change the email address linked to your account."
msgstr "Změnit e-mailovou adresu, přiřazenou k vašemu účtu."
@ -1564,9 +1528,6 @@ msgstr "Aktuální časové pásmo"
msgid "Choose your current time zone."
msgstr "Zvolte vaše aktuální časové pásmo."
msgid "Heading {level}"
msgstr "Hlavička {level}"
msgid "Bulleted list"
msgstr "Nečíslovaný seznam"

View file

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Wagtail\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-07-09 14:27+0100\n"
"PO-Revision-Date: 2019-07-09 13:29+0000\n"
"POT-Creation-Date: 2019-10-16 18:00+0100\n"
"PO-Revision-Date: 2019-10-16 17:04+0000\n"
"Last-Translator: Matt Westcott <matthew@torchbox.com>\n"
"Language-Team: Welsh (http://www.transifex.com/torchbox/wagtail/language/"
"cy/)\n"

View file

@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Wagtail\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-07-09 14:27+0100\n"
"PO-Revision-Date: 2019-07-09 13:29+0000\n"
"POT-Creation-Date: 2019-10-16 18:00+0100\n"
"PO-Revision-Date: 2019-10-16 17:04+0000\n"
"Last-Translator: Matt Westcott <matthew@torchbox.com>\n"
"Language-Team: Danish (http://www.transifex.com/torchbox/wagtail/language/"
"da/)\n"
@ -21,6 +21,9 @@ msgstr ""
"Language: da\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Publish"
msgstr "Udgiv"
msgid "Submit for moderation"
msgstr "Indsend til moderation"
@ -30,15 +33,18 @@ msgstr "Afpublicer"
msgid "Delete"
msgstr "Slet"
msgid "Page locked"
msgstr "Siden er låst"
msgid "Wagtail admin"
msgstr "Wagtail admin"
msgid "None"
msgstr "Intet"
msgid "You do not have permission to access the admin"
msgstr "Du mangler rettigheden til, at bruge admin-interfacet"
msgid "None"
msgstr "Intet"
msgid "Scheduled publishing"
msgstr "Planlagt udgivning"
@ -64,9 +70,6 @@ msgstr "Skriv din %s"
msgid "Enter your email address to reset your password"
msgstr "Skriv din email addresse for at genindstille din adgangskode"
msgid "URL"
msgstr "URL"
msgid "You cannot have multiple permission records for the same collection."
msgstr ""
"Du har ikke mulighed for at have flere tilladelser på den samme samling."
@ -150,6 +153,195 @@ msgstr "Dette felt er påkrævet."
msgid "Please select at least one group."
msgstr "Vælg venligst mindst én gruppe."
msgid "Catalan"
msgstr "Katalansk"
msgid "German"
msgstr "Tysk"
msgid "Greek"
msgstr "Græsk"
msgid "English"
msgstr "Engelsk"
msgid "Spanish"
msgstr "Spansk"
msgid "Finnish"
msgstr "Finsk"
msgid "French"
msgstr "Fransk"
msgid "Galician"
msgstr "Galicisk"
msgid "Icelandic"
msgstr "Islandsk"
msgid "Italian"
msgstr "Italiensk"
msgid "Korean"
msgstr "Koreansk"
msgid "Lithuanian"
msgstr "Litauensk"
msgid "Norwegian Bokmål"
msgstr "Norsk Bokmål"
msgid "Netherlands Dutch"
msgstr "Hollandsk"
msgid "Persian"
msgstr "Persisk"
msgid "Polish"
msgstr "Polsk"
msgid "Brazilian Portuguese"
msgstr "Braziliansk Portugisisk"
msgid "Portuguese"
msgstr "Portugisisk"
msgid "Romanian"
msgstr "Romænsk"
msgid "Russian"
msgstr "Russisk"
msgid "Swedish"
msgstr "Svensk"
msgid "Slovak"
msgstr "Slovakisk"
msgid "Ukrainian"
msgstr "Ukrainsk"
msgid "Page"
msgstr "Side"
msgid "Pages"
msgstr "Sider"
msgid "Loading…"
msgstr "Loader..."
msgid "No results"
msgstr "Ingen resultater"
msgid "Server Error"
msgstr "Server Fejl"
msgid "See all"
msgstr "Se alle"
msgid "Close explorer"
msgstr "Luk explorer"
msgid "Alt text"
msgstr "Alt text"
msgid "Write here…"
msgstr "Skriv her..."
msgid "Horizontal line"
msgstr "Horisontal linje"
msgid "Line break"
msgstr "Ny linje"
msgid "Undo"
msgstr "Gå tilbage"
msgid "Redo"
msgstr "Gå frem"
msgid "Reload the page"
msgstr "Genindlæs siden"
msgid "Reload saved content"
msgstr "Genindlæs gemt indhold"
msgid "Show latest content"
msgstr "Vis seneste indhold"
msgid "Show error"
msgstr "Vis fejl"
msgid ""
"The editor just crashed. Content has been reset to the last saved version."
msgstr ""
"Redigeringsprogrammet crashede. Indholdet er blevet sat til den nyeste gemte "
"version."
msgid "Close"
msgstr "Luk"
msgid "Edit '{title}'"
msgstr "Rediger '{title}'"
msgid "January"
msgstr "Januar"
msgid "February"
msgstr "Februar"
msgid "March"
msgstr "Marts"
msgid "April"
msgstr "April"
msgid "May"
msgstr "Maj"
msgid "June"
msgstr "Juni"
msgid "July"
msgstr "Juli"
msgid "August"
msgstr "August"
msgid "September"
msgstr "September"
msgid "October"
msgstr "Oktober"
msgid "November"
msgstr "November"
msgid "December"
msgstr "December"
msgid "Sun"
msgstr "Søn"
msgid "Mon"
msgstr "Man"
msgid "Tue"
msgstr "Tir"
msgid "Wed"
msgstr "Ons"
msgid "Thu"
msgstr "Tor"
msgid "Fri"
msgstr "Fre"
msgid "Sat"
msgstr "Lør"
msgid "Error 404: Page not found"
msgstr "Fejl 404: Side ikke fundet"
@ -240,132 +432,12 @@ msgstr "Gendan kodeord"
msgid "Reset your password"
msgstr "Gendan dit kodeord"
msgid "Page"
msgstr "Side"
msgid "Pages"
msgstr "Sider"
msgid "Loading…"
msgstr "Loader..."
msgid "No results"
msgstr "Ingen resultater"
msgid "Server Error"
msgstr "Server Fejl"
msgid "See all"
msgstr "Se alle"
msgid "Close explorer"
msgstr "Luk explorer"
msgid "Alt text"
msgstr "Alt text"
msgid "Write here…"
msgstr "Skriv her..."
msgid "Horizontal line"
msgstr "Horisontal linje"
msgid "Line break"
msgstr "Ny linje"
msgid "Undo"
msgstr "Gå tilbage"
msgid "Redo"
msgstr "Gå frem"
msgid "Reload the page"
msgstr "Genindlæs siden"
msgid "Reload saved content"
msgstr "Genindlæs gemt indhold"
msgid "Show latest content"
msgstr "Vis seneste indhold"
msgid "Show error"
msgstr "Vis fejl"
msgid ""
"The editor just crashed. Content has been reset to the last saved version."
msgstr ""
"Redigeringsprogrammet crashede. Indholdet er blevet sat til den nyeste gemte "
"version."
msgid "Close"
msgstr "Luk"
msgid "January"
msgstr "Januar"
msgid "February"
msgstr "Februar"
msgid "March"
msgstr "Marts"
msgid "April"
msgstr "April"
msgid "May"
msgstr "Maj"
msgid "June"
msgstr "Juni"
msgid "July"
msgstr "Juli"
msgid "August"
msgstr "August"
msgid "September"
msgstr "September"
msgid "October"
msgstr "Oktober"
msgid "November"
msgstr "November"
msgid "December"
msgstr "December"
msgid "Sun"
msgstr "Søn"
msgid "Mon"
msgstr "Man"
msgid "Tue"
msgstr "Tir"
msgid "Wed"
msgstr "Ons"
msgid "Thu"
msgstr "Tor"
msgid "Fri"
msgstr "Fre"
msgid "Sat"
msgstr "Lør"
msgid "Dashboard"
msgstr "Dashboard"
msgid "Menu"
msgstr "Menu"
msgid "Add another"
msgstr "Tilføj flere"
msgid "Move up"
msgstr "Bevæg op"
@ -583,8 +655,14 @@ msgstr "Udgiver..."
msgid "Publish this revision"
msgstr "Udgiv denne revision"
msgid "Publish"
msgstr "Udgiv"
msgid "Saving…"
msgstr "Gemmer..."
msgid "Replace current draft"
msgstr "Udskift nuværende skitse"
msgid "Save draft"
msgstr "Gem skitse"
#, python-format
msgid "Create a page in %(title)s"
@ -708,12 +786,6 @@ msgstr "Ny %(page_type)s"
msgid "New"
msgstr "Ny"
msgid "Saving…"
msgstr "Gemmer..."
msgid "Save draft"
msgstr "Gem skitse"
msgid "This page has unsaved changes."
msgstr "Denne side har ugemte ændringer."
@ -725,12 +797,6 @@ msgstr "Redigerer %(page_type)s: %(title)s"
msgid "Editing %(page_type)s <span>%(title)s</span>"
msgstr "Redigerer %(page_type)s <span>%(title)s</span>"
msgid "Page locked"
msgstr "Siden er låst"
msgid "Replace current draft"
msgstr "Udskift nuværende skitse"
#, python-format
msgid "Last modified: %(last_mod)s"
msgstr "Sidst ændret: %(last_mod)s"
@ -919,75 +985,6 @@ msgstr "Vis i Udforsker"
msgid "Test"
msgstr "Test"
msgid "Catalan"
msgstr "Katalansk"
msgid "German"
msgstr "Tysk"
msgid "Greek"
msgstr "Græsk"
msgid "English"
msgstr "Engelsk"
msgid "Spanish"
msgstr "Spansk"
msgid "Finnish"
msgstr "Finsk"
msgid "French"
msgstr "Fransk"
msgid "Galician"
msgstr "Galicisk"
msgid "Icelandic"
msgstr "Islandsk"
msgid "Italian"
msgstr "Italiensk"
msgid "Korean"
msgstr "Koreansk"
msgid "Lithuanian"
msgstr "Litauensk"
msgid "Norwegian Bokmål"
msgstr "Norsk Bokmål"
msgid "Netherlands Dutch"
msgstr "Hollandsk"
msgid "Persian"
msgstr "Persisk"
msgid "Polish"
msgstr "Polsk"
msgid "Brazilian Portuguese"
msgstr "Braziliansk Portugisisk"
msgid "Portuguese"
msgstr "Portugisisk"
msgid "Romanian"
msgstr "Romænsk"
msgid "Russian"
msgstr "Russisk"
msgid "Swedish"
msgstr "Svensk"
msgid "Slovak"
msgstr "Slovakisk"
msgid "Ukrainian"
msgstr "Ukrainsk"
msgid "Editing"
msgstr "Redigerer"
@ -1030,39 +1027,12 @@ msgstr "Tidligste"
msgid "Latest"
msgstr "Seneste"
msgid "Edit '{title}'"
msgstr "Rediger '{title}'"
msgid "Add a child page to '{title}' "
msgstr "Tilføj en underside til '{title}'"
msgid "More"
msgstr "Mere"
msgid "View more options for '{title}'"
msgstr "Vis flere muligheder for '{title}'"
msgid "Move page '{title}'"
msgstr "Flyt side '{title}'"
msgid "Copy page '{title}'"
msgstr "Kopier side '{title}'"
msgid "Delete page '{title}'"
msgstr "Slet side '{title}'"
msgid "Unpublish page '{title}'"
msgstr "Afpublicer side '{title}'"
msgid "View revision history for '{title}'"
msgstr "Vis revisionshistorie for '{title}'"
msgid "Set profile picture"
msgstr "Angiv profilbillede"
msgid "Change your profile picture"
msgstr "Skift dit profilbillede"
msgid "Change the password you use to log in."
msgstr "Skift den adgangskode du anvender til at logge ind med."
@ -1078,9 +1048,6 @@ msgstr "Nuværende tidszone"
msgid "Choose your current time zone."
msgstr "Vælg din nuværende tidszone."
msgid "Heading {level}"
msgstr "Overskrift {level}"
msgid "Bulleted list"
msgstr "Liste med prikker"

Some files were not shown because too many files have changed in this diff Show more