diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml
new file mode 100644
index 00000000..05c5cbd7
--- /dev/null
+++ b/.github/workflows/cd.yml
@@ -0,0 +1,31 @@
+name: 📦 Docker Image Build & Push
+
+on:
+ push:
+ branches:
+ - "**"
+
+jobs:
+ docker:
+ runs-on: ubuntu-latest
+ name: Build and push Docker image
+ steps:
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+ - name: Inject enhanced GitHub environment variables
+ uses: rlespinasse/github-slug-action@v5
+ - name: Login to GHCR
+ uses: docker/login-action@v3
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ github.token }}
+ - name: Build and push
+ uses: docker/build-push-action@v6
+ with:
+ push: true
+ tags: |
+ ghcr.io/${{ env.GITHUB_REPOSITORY_OWNER_PART_SLUG }}/sites-faciles:${{ env.GITHUB_REF_SLUG }}
+ ${{ github.ref_name == 'main' && format('ghcr.io/{0}/sites-faciles:latest', env.GITHUB_REPOSITORY_OWNER_PART_SLUG) || '' }}
+ cache-from: type=registry,ref=ghcr.io/${{ env.GITHUB_REPOSITORY_OWNER_PART_SLUG }}/sites-faciles:${{ env.GITHUB_REF_SLUG }}
+ cache-to: type=inline
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index a81131be..1ce3fbe6 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -2,11 +2,11 @@
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.4.9
+ rev: v0.8.0
hooks:
- id: ruff
args: [ --fix, --exit-non-zero-on-fix ]
- repo: https://github.com/psf/black
- rev: 23.11.0
+ rev: 24.10.0
hooks:
- id: black
diff --git a/Dockerfile b/Dockerfile
index d36ecc35..d96a6644 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,6 +1,6 @@
FROM python:3.10
-EXPOSE ${HOST_PORT}
+EXPOSE ${CONTAINER_PORT}
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
@@ -13,10 +13,13 @@ ENV POETRY_HOME=/opt/poetry
ENV POETRY_VENV=/opt/poetry-venv
ENV POETRY_CACHE_DIR=/opt/.cache
+# Needed for docker build to succeed
+ENV DATABASE_URL=postgres://user:password@localhost:5432/db
+
# Add new user to run the whole thing as non-root.
RUN set -ex \
- && addgroup app \
- && adduser --ingroup app --home ${APP_DIR} --disabled-password app;
+ && addgroup --gid 1000 app \
+ && adduser --uid 1000 --gid 1000 --home ${APP_DIR} --disabled-password app;
# Install poetry separated from system interpreter
RUN python3 -m venv ${POETRY_VENV} \
@@ -40,4 +43,4 @@ USER app
ENTRYPOINT ["./entrypoint.sh"]
# https://stackoverflow.com/a/40454758/21676629
-CMD ["sh", "-c", "poetry run python manage.py runserver 0.0.0.0:$HOST_PORT"]
+CMD ["sh", "-c", "poetry run python manage.py runserver 0.0.0.0:$CONTAINER_PORT"]
diff --git a/blog/locale/fr/LC_MESSAGES/django.mo b/blog/locale/fr/LC_MESSAGES/django.mo
index 9efe6853..c7000ea4 100644
Binary files a/blog/locale/fr/LC_MESSAGES/django.mo and b/blog/locale/fr/LC_MESSAGES/django.mo differ
diff --git a/blog/locale/fr/LC_MESSAGES/django.po b/blog/locale/fr/LC_MESSAGES/django.po
index 18255ea5..13d7b4ee 100644
--- a/blog/locale/fr/LC_MESSAGES/django.po
+++ b/blog/locale/fr/LC_MESSAGES/django.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-09-17 12:04+0200\n"
-"PO-Revision-Date: 2024-09-17 12:04+0200\n"
+"POT-Creation-Date: 2024-11-27 14:45+0100\n"
+"PO-Revision-Date: 2024-11-27 14:47+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: fr\n"
@@ -18,19 +18,19 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 3.4.2\n"
-#: blog/blocks.py:9 blog/models.py:37 blog/models.py:65
+#: blog/blocks.py:9 blog/models.py:39 blog/models.py:67
msgid "Name"
msgstr "Nom"
-#: blog/blocks.py:10 blog/models.py:66
+#: blog/blocks.py:10 blog/models.py:68
msgid "Role"
msgstr "Fonction"
-#: blog/blocks.py:11 blog/models.py:54
+#: blog/blocks.py:11 blog/models.py:56
msgid "Organization"
msgstr "Organisation"
-#: blog/blocks.py:12 blog/models.py:68
+#: blog/blocks.py:12 blog/models.py:70
msgid "Contact info"
msgstr "Informations de contact"
@@ -42,120 +42,124 @@ msgstr "Texte riche"
msgid "Contact card"
msgstr "Carte contact"
-#: blog/models.py:93
+#: blog/models.py:95
msgid "Person"
msgstr "Personne"
-#: blog/models.py:105
+#: blog/models.py:107
msgid "Category name"
msgstr "Nom de la catégorie"
-#: blog/models.py:112
+#: blog/models.py:114
msgid "Parent category"
msgstr "Catégorie parente"
-#: blog/models.py:119
+#: blog/models.py:121
msgid "Description"
msgstr "Description"
-#: blog/models.py:120
+#: blog/models.py:122
msgid "Displayed on the top of the category page"
msgstr "Affiché en haut de la page de la catégorie"
-#: blog/models.py:126
+#: blog/models.py:128
msgid "Text displayed at the end of every page in the category"
msgstr "Texte affiché à la fin de chaque page de la catégorie"
-#: blog/models.py:153
+#: blog/models.py:155
msgid "Parent category cannot be self."
msgstr "La catégorie ne peut être sa propre parente."
-#: blog/models.py:155
+#: blog/models.py:157
msgid "Cannot have circular Parents."
msgstr "Il est impossible d’avoir des parents circulaires."
-#: blog/models.py:164 blog/models.py:183
+#: blog/models.py:166 blog/models.py:185
msgid "Category"
msgstr "Catégorie"
-#: blog/models.py:165 blog/models.py:273 blog/models.py:390
-#: blog/templates/blog/categories_list_page.html:20 blog/views.py:117
+#: blog/models.py:167 blog/models.py:279 blog/models.py:460 blog/models.py:467
+#: blog/models.py:518
msgid "Categories"
msgstr "Catégories"
-#: blog/models.py:199
+#: blog/models.py:201
msgid "Posts per page"
msgstr "Articles par page"
-#: blog/models.py:203 blog/templates/blog/blog_index_page.html:77
+#: blog/models.py:207
+msgid "Post limit in the RSS/Atom feeds"
+msgstr "Nombre d’articles dans les flux RSS/Atom"
+
+#: blog/models.py:211 blog/templates/blog/blog_index_page.html:85
msgid "Filter by category"
msgstr "Filtrer par catégorie"
-#: blog/models.py:204 blog/templates/blog/blog_index_page.html:94
+#: blog/models.py:212 blog/templates/blog/blog_index_page.html:102
msgid "Filter by tag"
msgstr "Filtrer par Ă©tiquette"
-#: blog/models.py:205 blog/templates/blog/blog_index_page.html:111
+#: blog/models.py:213 blog/templates/blog/blog_index_page.html:119
msgid "Filter by author"
msgstr "Filtrer par auteur"
-#: blog/models.py:207 blog/templates/blog/blog_index_page.html:126
+#: blog/models.py:215 blog/templates/blog/blog_index_page.html:134
msgid "Filter by source"
msgstr "Filtrer par source"
-#: blog/models.py:207
+#: blog/models.py:215
msgid "The source is the organization of the post author"
msgstr "La source est l’organisation à laquelle appartient l’auteur de l’article"
-#: blog/models.py:219
+#: blog/models.py:228
msgid "Show filters"
msgstr "Afficher les filtres"
-#: blog/models.py:226
+#: blog/models.py:235
msgid "Blog index"
msgstr "Index de blog"
-#: blog/models.py:255 blog/templates/blog/tags_list_page.html:20
-#: blog/views.py:149
+#: blog/models.py:262 blog/models.py:483 blog/models.py:497
+#: blog/templates/blog/tags_list_page.html:20
msgid "Tags"
msgstr "Étiquettes"
-#: blog/models.py:260
+#: blog/models.py:267
#, python-format
msgid "Posts tagged with %(tag)s"
msgstr "Articles avec l’étiquette %(tag)s"
-#: blog/models.py:278
+#: blog/models.py:284
#, python-format
msgid "Posts in category %(category)s"
msgstr "Articles dans la catégorie %(category)s"
-#: blog/models.py:289 blog/models.py:291 blog/models.py:302 blog/models.py:305
+#: blog/models.py:294 blog/models.py:296 blog/models.py:306 blog/models.py:309
msgid "Posts written by"
msgstr "Articles Ă©crits par"
-#: blog/models.py:309
+#: blog/models.py:314
#, python-format
msgid "Posts published in %(year)s"
msgstr "Articles publiés en %(year)s"
-#: blog/models.py:392
+#: blog/models.py:520
msgid "Post date"
msgstr "Date de publication"
-#: blog/models.py:394
+#: blog/models.py:522
msgid "Author entries can be created in Snippets > Persons"
msgstr "Les auteurs peuvent être créés via Fragments > Personnes"
-#: blog/models.py:413
+#: blog/models.py:541
msgid "Scheduled publishing"
msgstr "Publication planifiée"
-#: blog/models.py:421
+#: blog/models.py:549
msgid "Tags and Categories"
msgstr "Étiquettes et Catégories"
-#: blog/models.py:437
+#: blog/models.py:565
msgid "Blog page"
msgstr "Page de blog"
@@ -163,12 +167,28 @@ msgstr "Page de blog"
msgid "No article found."
msgstr "Aucun article trouvé."
-#: blog/templates/blog/blog_entry_page.html:74
+#: blog/templates/blog/blocks/feeds.html:10
+msgid "Atom feed for the category"
+msgstr "Flux Atom pour la catégorie"
+
+#: blog/templates/blog/blocks/feeds.html:12
+msgid "Atom feed"
+msgstr "Flux Atom"
+
+#: blog/templates/blog/blocks/feeds.html:20
+msgid "RSS feed for the category"
+msgstr "Flux RSS pour la catégorie"
+
+#: blog/templates/blog/blocks/feeds.html:22
+msgid "RSS feed"
+msgstr "Flux RSS"
+
+#: blog/templates/blog/blog_entry_page.html:79
msgid "Posted by:"
msgstr "Écrit par :"
-#: blog/templates/blog/blog_index_page.html:72
-#: blog/templates/blog/blog_index_page.html:74
+#: blog/templates/blog/blog_index_page.html:80
+#: blog/templates/blog/blog_index_page.html:82
msgid "Filters"
msgstr "Filtres"
diff --git a/blog/migrations/0038_blogindexpage_feed_posts_limit.py b/blog/migrations/0038_blogindexpage_feed_posts_limit.py
new file mode 100644
index 00000000..caf285e5
--- /dev/null
+++ b/blog/migrations/0038_blogindexpage_feed_posts_limit.py
@@ -0,0 +1,25 @@
+# Generated by Django 5.1.3 on 2024-11-27 10:47
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("blog", "0037_alter_blogentrypage_body_and_more"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="blogindexpage",
+ name="feed_posts_limit",
+ field=models.PositiveSmallIntegerField(
+ default=20,
+ validators=[
+ django.core.validators.MaxValueValidator(100),
+ django.core.validators.MinValueValidator(1),
+ ],
+ verbose_name="Post limit in the RSS/Atom feeds",
+ ),
+ ),
+ ]
diff --git a/blog/migrations/0039_alter_blogentrypage_body_alter_blogindexpage_body_and_more.py b/blog/migrations/0039_alter_blogentrypage_body_alter_blogindexpage_body_and_more.py
new file mode 100644
index 00000000..b0bcb20b
--- /dev/null
+++ b/blog/migrations/0039_alter_blogentrypage_body_alter_blogindexpage_body_and_more.py
@@ -0,0 +1,3844 @@
+# Generated by Django 5.1.3 on 2024-12-05 14:24
+
+import wagtail.fields
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("blog", "0038_blogindexpage_feed_posts_limit"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="blogentrypage",
+ name="body",
+ field=wagtail.fields.StreamField(
+ [
+ ("paragraph", 0),
+ ("image", 9),
+ ("imageandtext", 22),
+ ("alert", 27),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("video", 53),
+ ("transcription", 54),
+ ("badges_list", 59),
+ ("tags_list", 64),
+ ("link", 65),
+ ("stepper", 71),
+ ("card", 93),
+ ("tile", 103),
+ ("tabs", 137),
+ ("markdown", 138),
+ ("iframe", 139),
+ ("separator", 142),
+ ("multicolumns", 151),
+ ("item_grid", 154),
+ ("fullwidthbackground", 156),
+ ("fullwidthbackgroundwithsidemenu", 163),
+ ("subpageslist", 164),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("html", 165),
+ ],
+ blank=True,
+ block_lookup={
+ 0: ("wagtail.blocks.RichTextBlock", (), {"label": "Rich text"}),
+ 1: ("wagtail.blocks.CharBlock", (), {"label": "Title", "required": False}),
+ 2: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ("h6", "Heading 6"),
+ ("p", "Paragraph"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 3.",
+ "label": "Heading level",
+ "required": False,
+ },
+ ),
+ 3: ("wagtail.images.blocks.ImageChooserBlock", (), {"label": "Image"}),
+ 4: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"label": "Alternative text (textual description of the image)", "required": False},
+ ),
+ 5: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("fr-content-media--sm", "Small"),
+ ("", "Medium"),
+ ("fr-content-media--lg", "Large"),
+ ],
+ "label": "Witdh",
+ "required": False,
+ },
+ ),
+ 6: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("fr-ratio-32x9", "32x9"),
+ ("fr-ratio-16x9", "16x9"),
+ ("fr-ratio-3x2", "3x2"),
+ ("fr-ratio-4x3", "4x3"),
+ ("fr-ratio-1x1", "1x1"),
+ ("fr-ratio-3x4", "3x4"),
+ ("fr-ratio-2x3", "2x3"),
+ ],
+ "label": "Image ratio",
+ "required": False,
+ },
+ ),
+ 7: ("wagtail.blocks.CharBlock", (), {"label": "Caption", "required": False}),
+ 8: ("wagtail.blocks.URLBlock", (), {"label": "Link", "required": False}),
+ 9: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 2),
+ ("image", 3),
+ ("alt", 4),
+ ("width", 5),
+ ("image_ratio", 6),
+ ("caption", 7),
+ ("url", 8),
+ ]
+ ],
+ {},
+ ),
+ 10: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("left", "Left"), ("right", "Right")],
+ "label": "Side where the image is displayed",
+ },
+ ),
+ 11: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {"choices": [("3", "3/12"), ("5", "5/12"), ("6", "6/12")], "label": "Image width"},
+ ),
+ 12: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {
+ "help_text": "Link to a page of this site. Use either this, the document, or the external URL parameter.",
+ "label": "Page",
+ "required": False,
+ },
+ ),
+ 13: (
+ "wagtail.documents.blocks.DocumentChooserBlock",
+ (),
+ {
+ "help_text": "Use either this, the external URL or the page parameter.",
+ "label": "Document",
+ "required": False,
+ },
+ ),
+ 14: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "help_text": "Use either this, the document or the page parameter.",
+ "label": "External URL",
+ "required": False,
+ },
+ ),
+ 15: ("wagtail.blocks.CharBlock", (), {"label": "Link label", "required": False}),
+ 16: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("", "No icon"),
+ ("fr-icon-arrow-right-line fr-link--icon-right", "Icon on the right side"),
+ ("fr-icon-arrow-right-line fr-link--icon-left", "Icon on the left side"),
+ ],
+ "help_text": "Only used for internal links.",
+ "label": "Icon",
+ "required": False,
+ },
+ ),
+ 17: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-link--sm", "Small"), ("", "Medium"), ("fr-link--lg", "Large")],
+ "label": "Size",
+ "required": False,
+ },
+ ),
+ 18: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("icon", 16),
+ ("size", 17),
+ ]
+ ],
+ {
+ "help_text": "The link is shown at the bottom of the text block, with an arrow",
+ "label": "Link",
+ "required": False,
+ },
+ ),
+ 19: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "group": "obsolete",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Link label (obsolete)",
+ "required": False,
+ },
+ ),
+ 20: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {
+ "group": "obsolete",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Internal link (obsolete)",
+ "required": False,
+ },
+ ),
+ 21: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "group": "obsolete",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Link URL (obsolete)",
+ "required": False,
+ },
+ ),
+ 22: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("image", 3),
+ ("image_side", 10),
+ ("image_ratio", 11),
+ ("text", 0),
+ ("link", 18),
+ ("link_label", 19),
+ ("page", 20),
+ ("link_url", 21),
+ ]
+ ],
+ {"label": "Image and text"},
+ ),
+ 23: ("wagtail.blocks.CharBlock", (), {"label": "Message title", "required": False}),
+ 24: ("wagtail.blocks.TextBlock", (), {"label": "Message text", "required": False}),
+ 25: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("error", "Error"),
+ ("success", "Success"),
+ ("info", "Information"),
+ ("warning", "Warning"),
+ ],
+ "label": "Message type",
+ },
+ ),
+ 26: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ("h6", "Heading 6"),
+ ("p", "Paragraph"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 3.",
+ "label": "Heading level",
+ },
+ ),
+ 27: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 23), ("description", 24), ("level", 25), ("heading_tag", 26)]],
+ {"label": "Alert message"},
+ ),
+ 28: ("wagtail.blocks.CharBlock", (), {"label": "Title"}),
+ 29: ("wagtail.blocks.RichTextBlock", (), {"label": "Content"}),
+ 30: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 28), ("content", 29)]],
+ {"label": "Accordion", "max_num": 15, "min_num": 1},
+ ),
+ 31: (
+ "wagtail.blocks.StreamBlock",
+ [[("title", 28), ("accordion", 30)]],
+ {"group": "DSFR components", "label": "Accordions"},
+ ),
+ 32: ("content_manager.blocks.IconPickerBlock", (), {"label": "Icon", "required": False}),
+ 33: (
+ "wagtail.blocks.RichTextBlock",
+ (),
+ {
+ "features": [
+ "bold",
+ "italic",
+ "link",
+ "document-link",
+ "superscript",
+ "subscript",
+ "strikethrough",
+ ],
+ "label": "Content",
+ "required": False,
+ },
+ ),
+ 34: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("fr-btn", "Primary"),
+ ("fr-btn fr-btn--secondary", "Secundary"),
+ ("fr-btn fr-btn--tertiary", "Tertiary"),
+ ("fr-btn fr-btn--tertiary-no-outline", "Tertiary without border"),
+ ],
+ "label": "Button type",
+ "required": False,
+ },
+ ),
+ 35: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-btn--icon-left", "Left"), ("fr-btn--icon-right", "Right")],
+ "label": "Icon side",
+ "required": False,
+ },
+ ),
+ 36: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("button_type", 34),
+ ("icon_class", 32),
+ ("icon_side", 35),
+ ]
+ ],
+ {"label": "Button", "required": False},
+ ),
+ 37: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ "label": "Color",
+ "required": False,
+ },
+ ),
+ 38: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 26),
+ ("icon_class", 32),
+ ("text", 33),
+ ("button", 36),
+ ("color", 37),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Callout"},
+ ),
+ 39: (
+ "wagtail.blocks.RichTextBlock",
+ (),
+ {
+ "features": [
+ "bold",
+ "italic",
+ "link",
+ "document-link",
+ "superscript",
+ "subscript",
+ "strikethrough",
+ ],
+ "label": "Content",
+ },
+ ),
+ 40: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-text--sm", "Small"), ("", "Medium"), ("fr-text--lg", "Large")],
+ "label": "Size",
+ "required": False,
+ },
+ ),
+ 41: (
+ "wagtail.blocks.StructBlock",
+ [[("text", 39), ("color", 37), ("size", 40)]],
+ {"group": "DSFR components", "label": "Highlight"},
+ ),
+ 42: ("wagtail.images.blocks.ImageChooserBlock", (), {"label": "Image", "required": False}),
+ 43: ("wagtail.blocks.CharBlock", (), {"label": "Quote"}),
+ 44: ("wagtail.blocks.CharBlock", (), {"label": "Author name", "required": False}),
+ 45: ("wagtail.blocks.CharBlock", (), {"label": "Author title", "required": False}),
+ 46: (
+ "wagtail.blocks.StructBlock",
+ [[("image", 42), ("quote", 43), ("author_name", 44), ("author_title", 45), ("color", 37)]],
+ {"group": "DSFR components", "label": "Quote"},
+ ),
+ 47: ("wagtail.blocks.CharBlock", (), {"label": "Video title", "required": False}),
+ 48: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "help_text": "Use embed format, with a version that doesn't require a consent banner if available. (e.g. : https://www.youtube-nocookie.com/embed/gLzXOViPX-0) For Youtube, use Embed video and check Enable privacy-enhanced mode.",
+ "label": "Video URL",
+ },
+ ),
+ 49: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-ratio-16x9", "16x9"), ("fr-ratio-4x3", "4x3"), ("fr-ratio-1x1", "1x1")],
+ "label": "Video ratio",
+ "required": False,
+ },
+ ),
+ 50: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"default": "Transcription", "label": "Title", "required": False},
+ ),
+ 51: ("wagtail.blocks.RichTextBlock", (), {"label": "Transcription content", "required": False}),
+ 52: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 50), ("content", 51)]],
+ {"label": "Transcription", "required": False},
+ ),
+ 53: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 47),
+ ("caption", 7),
+ ("url", 48),
+ ("width", 5),
+ ("video_ratio", 49),
+ ("transcription", 52),
+ ]
+ ],
+ {"label": "Video"},
+ ),
+ 54: ("wagtail.blocks.StructBlock", [[("title", 50), ("content", 51)]], {"label": "Transcription"}),
+ 55: ("wagtail.blocks.CharBlock", (), {"label": "Badge label", "required": False}),
+ 56: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("", [("new", "New"), ("grey", "Grey")]),
+ (
+ "System colors",
+ [
+ ("info", "Info"),
+ ("success", "Success"),
+ ("warning", "Warning"),
+ ("error", "Error"),
+ ],
+ ),
+ (
+ "Illustration colors",
+ [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ ),
+ ],
+ "label": "Badge color",
+ "required": False,
+ },
+ ),
+ 57: ("wagtail.blocks.BooleanBlock", (), {"label": "Hide badge icon", "required": False}),
+ 58: (
+ "wagtail.blocks.StructBlock",
+ [[("text", 55), ("color", 56), ("hide_icon", 57)]],
+ {"label": "Badge"},
+ ),
+ 59: ("wagtail.blocks.StreamBlock", [[("badge", 58)]], {"label": "Badge list"}),
+ 60: ("wagtail.blocks.BooleanBlock", (), {"label": "Small tag", "required": False}),
+ 61: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ "help_text": "Only for clickable tags",
+ "label": "Tag color",
+ "required": False,
+ },
+ ),
+ 62: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 12), ("document", 13), ("external_url", 14)]],
+ {"required": False},
+ ),
+ 63: (
+ "wagtail.blocks.StructBlock",
+ [[("label", 28), ("is_small", 60), ("color", 61), ("icon_class", 32), ("link", 62)]],
+ {"label": "Tag"},
+ ),
+ 64: ("wagtail.blocks.StreamBlock", [[("tag", 63)]], {"label": "Tag list"}),
+ 65: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("icon", 16),
+ ("size", 17),
+ ]
+ ],
+ {"label": "Single link"},
+ ),
+ 66: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {"label": "Number of steps", "max_value": 8, "min_value": 1},
+ ),
+ 67: ("wagtail.blocks.IntegerBlock", (), {"label": "Current step", "max_value": 8, "min_value": 1}),
+ 68: ("wagtail.blocks.TextBlock", (), {"label": "Detail"}),
+ 69: ("wagtail.blocks.StructBlock", [[("title", 28), ("detail", 68)]], {"label": "Step"}),
+ 70: ("wagtail.blocks.StreamBlock", [[("step", 69)]], {"label": "Steps"}),
+ 71: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 28), ("total", 66), ("current", 67), ("steps", 70)]],
+ {"group": "DSFR components", "label": "Stepper"},
+ ),
+ 72: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-card--horizontal-tier", "1/3"), ("fr-card--horizontal-half", "50/50")],
+ "label": "Image ratio",
+ "required": False,
+ },
+ ),
+ 73: (
+ "wagtail.blocks.StreamBlock",
+ [[("badge", 58)]],
+ {
+ "help_text": "Only used if the card has an image.",
+ "label": "Image area badge",
+ "max_num": 1,
+ "required": False,
+ },
+ ),
+ 74: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 12), ("document", 13), ("external_url", 14)]],
+ {"label": "Link", "required": False},
+ ),
+ 75: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "group": "target",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Link (obsolete)",
+ "required": False,
+ },
+ ),
+ 76: (
+ "wagtail.documents.blocks.DocumentChooserBlock",
+ (),
+ {
+ "group": "target",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "or Document (obsolete)",
+ "required": False,
+ },
+ ),
+ 77: ("wagtail.blocks.CharBlock", (), {"label": "Top detail: text", "required": False}),
+ 78: (
+ "content_manager.blocks.IconPickerBlock",
+ (),
+ {"label": "Top detail: icon", "required": False},
+ ),
+ 79: ("wagtail.blocks.StreamBlock", [[("badge", 58)]], {}),
+ 80: ("wagtail.blocks.StreamBlock", [[("tag", 63)]], {}),
+ 81: (
+ "wagtail.blocks.StreamBlock",
+ [[("badges", 79), ("tags", 80)]],
+ {"label": "Top detail: badges or tags", "max_num": 1, "required": False},
+ ),
+ 82: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "Incompatible with the bottom call-to-action. If the card links to a downloadable document, the values are pre-filled.",
+ "label": "Bottom detail: text",
+ "required": False,
+ },
+ ),
+ 83: (
+ "content_manager.blocks.IconPickerBlock",
+ (),
+ {"label": "Bottom detail: icon", "required": False},
+ ),
+ 84: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 12), ("document", 13), ("external_url", 14), ("text", 15)]],
+ {"label": "Link"},
+ ),
+ 85: ("wagtail.blocks.StreamBlock", [[("link", 84)]], {}),
+ 86: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("button_type", 34),
+ ("icon_class", 32),
+ ("icon_side", 35),
+ ]
+ ],
+ {"label": "Button"},
+ ),
+ 87: (
+ "wagtail.blocks.StreamBlock",
+ [[("button", 86)]],
+ {
+ "help_text": "Please use only one primary button.\n If you use icons, use them on all buttons and align them on the same side.",
+ "label": "Buttons",
+ },
+ ),
+ 88: (
+ "wagtail.blocks.StreamBlock",
+ [[("links", 85), ("buttons", 87)]],
+ {
+ "help_text": "Incompatible with the bottom detail text.",
+ "label": "Bottom call-to-action: links or buttons",
+ "max_num": 1,
+ "required": False,
+ },
+ ),
+ 89: ("wagtail.blocks.BooleanBlock", (), {"label": "Card with grey background", "required": False}),
+ 90: ("wagtail.blocks.BooleanBlock", (), {"label": "Card without background", "required": False}),
+ 91: ("wagtail.blocks.BooleanBlock", (), {"label": "Card without border", "required": False}),
+ 92: ("wagtail.blocks.BooleanBlock", (), {"label": "Card with a shadow", "required": False}),
+ 93: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 28),
+ ("heading_tag", 26),
+ ("description", 33),
+ ("image", 42),
+ ("image_ratio", 72),
+ ("image_badge", 73),
+ ("link", 74),
+ ("url", 75),
+ ("document", 76),
+ ("top_detail_text", 77),
+ ("top_detail_icon", 78),
+ ("top_detail_badges_tags", 81),
+ ("bottom_detail_text", 82),
+ ("bottom_detail_icon", 83),
+ ("call_to_action", 88),
+ ("grey_background", 89),
+ ("no_background", 90),
+ ("no_border", 91),
+ ("shadow", 92),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Horizontal card"},
+ ),
+ 94: (
+ "wagtail.blocks.RichTextBlock",
+ (),
+ {
+ "features": ["bold", "italic", "superscript", "subscript", "strikethrough"],
+ "label": "Content",
+ "required": False,
+ },
+ ),
+ 95: (
+ "wagtail.images.blocks.ImageChooserBlock",
+ (),
+ {"help_text": "Prefer SVG files.", "label": "Image", "required": False},
+ ),
+ 96: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "If the tile links to a downloadable document, the values are pre-filled.",
+ "label": "Detail text",
+ "required": False,
+ },
+ ),
+ 97: ("wagtail.blocks.BooleanBlock", (), {"label": "Small tile", "required": False}),
+ 98: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile with grey background", "required": False}),
+ 99: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile without background", "required": False}),
+ 100: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile without border", "required": False}),
+ 101: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile with a shadow", "required": False}),
+ 102: ("wagtail.blocks.BooleanBlock", (), {"label": "Horizontal tile", "required": False}),
+ 103: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 28),
+ ("heading_tag", 26),
+ ("description", 94),
+ ("image", 95),
+ ("link", 74),
+ ("top_detail_badges_tags", 81),
+ ("detail_text", 96),
+ ("is_small", 97),
+ ("grey_background", 98),
+ ("no_background", 99),
+ ("no_border", 100),
+ ("shadow", 101),
+ ("is_horizontal", 102),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Tile"},
+ ),
+ 104: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 2),
+ ("image", 3),
+ ("alt", 4),
+ ("width", 5),
+ ("image_ratio", 6),
+ ("caption", 7),
+ ("url", 8),
+ ]
+ ],
+ {"label": "Image"},
+ ),
+ 105: ("wagtail.blocks.RichTextBlock", (), {"label": "Rich text", "required": False}),
+ 106: (
+ "wagtail.blocks.StreamBlock",
+ [[("buttons", 87)]],
+ {"label": "Call-to-action buttons", "max_num": 1, "required": False},
+ ),
+ 107: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the CTA buttons above.",
+ "label": "Call to action label (obsolete)",
+ "required": False,
+ },
+ ),
+ 108: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the CTA buttons above.",
+ "label": "Link (obsolete)",
+ "required": False,
+ },
+ ),
+ 109: (
+ "wagtail.blocks.StructBlock",
+ [[("text", 105), ("cta_buttons", 106), ("cta_label", 107), ("cta_url", 108)]],
+ {"label": "Text and call to action"},
+ ),
+ 110: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "Accessibility: The title should describe, in a clear and concise manner, the embedded content.",
+ "label": "Title",
+ },
+ ),
+ 111: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "help_text": "Example for Tally: https://tally.so/embed/w2jMRa",
+ "label": "URL of the iframe",
+ },
+ ),
+ 112: ("wagtail.blocks.IntegerBlock", (), {"label": "Height (in pixels)"}),
+ 113: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "For example: \"allow='geolocation'\".",
+ "label": "Parameters",
+ "required": False,
+ },
+ ),
+ 114: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 110), ("url", 111), ("height", 112), ("parameters", 113)]],
+ {"group": "DSFR components", "label": "Iframe"},
+ ),
+ 115: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 2.",
+ "label": "Heading level",
+ "required": False,
+ },
+ ),
+ 116: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {"label": "Blog", "page_type": ["blog.BlogIndexPage"]},
+ ),
+ 117: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {
+ "default": 3,
+ "label": "Number of entries",
+ "max_value": 8,
+ "min_value": 1,
+ "required": False,
+ },
+ ),
+ 118: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Category",),
+ {"label": "Filter by category", "required": False},
+ ),
+ 119: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("content_manager.Tag",),
+ {"label": "Filter by tag", "required": False},
+ ),
+ 120: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Person",),
+ {"label": "Filter by author", "required": False},
+ ),
+ 121: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Organization",),
+ {
+ "help_text": "The source is the organization of the post author",
+ "label": "Filter by source",
+ "required": False,
+ },
+ ),
+ 122: (
+ "wagtail.blocks.BooleanBlock",
+ (),
+ {"default": False, "label": "Show filters", "required": False},
+ ),
+ 123: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 115),
+ ("blog", 116),
+ ("entries_count", 117),
+ ("category_filter", 118),
+ ("tag_filter", 119),
+ ("author_filter", 120),
+ ("source_filter", 121),
+ ("show_filters", 122),
+ ]
+ ],
+ {"group": "Website structure", "label": "Blog recent entries"},
+ ),
+ 124: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {"label": "Event calendar", "page_type": ["events.EventsIndexPage"]},
+ ),
+ 125: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 115),
+ ("index_page", 124),
+ ("entries_count", 117),
+ ("category_filter", 118),
+ ("tag_filter", 119),
+ ("author_filter", 120),
+ ("source_filter", 121),
+ ("show_filters", 122),
+ ]
+ ],
+ {"group": "Website structure", "label": "Event calendar recent entries"},
+ ),
+ 126: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "Incompatible with the bottom call-to-action.",
+ "label": "Bottom detail: text",
+ "required": False,
+ },
+ ),
+ 127: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 28),
+ ("heading_tag", 26),
+ ("description", 33),
+ ("image", 42),
+ ("image_ratio", 6),
+ ("image_badge", 73),
+ ("link", 74),
+ ("url", 75),
+ ("document", 76),
+ ("top_detail_text", 77),
+ ("top_detail_icon", 78),
+ ("top_detail_badges_tags", 81),
+ ("bottom_detail_text", 126),
+ ("bottom_detail_icon", 83),
+ ("call_to_action", 88),
+ ("grey_background", 89),
+ ("no_background", 90),
+ ("no_border", 91),
+ ("shadow", 92),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Vertical card"},
+ ),
+ 128: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Person",),
+ {
+ "help_text": "Optional, all values can be manually specified or overriden below",
+ "label": "Person",
+ "required": False,
+ },
+ ),
+ 129: ("wagtail.blocks.CharBlock", (), {"label": "Name", "max_length": 255, "required": False}),
+ 130: ("wagtail.blocks.CharBlock", (), {"label": "Role", "max_length": 255, "required": False}),
+ 131: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"label": "Organization", "max_length": 255, "required": False},
+ ),
+ 132: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"label": "Contact info", "max_length": 500, "required": False},
+ ),
+ 133: ("wagtail.blocks.StreamBlock", [[("tag", 63)]], {"label": "Tags", "required": False}),
+ 134: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("contact", 128),
+ ("link", 74),
+ ("heading_tag", 2),
+ ("name", 129),
+ ("role", 130),
+ ("organization", 131),
+ ("contact_info", 132),
+ ("image", 42),
+ ("tags", 133),
+ ]
+ ],
+ {"group": "Extra components", "label": "Contact card"},
+ ),
+ 135: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("contact_card", 134),
+ ]
+ ],
+ {"label": "Content"},
+ ),
+ 136: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 28), ("content", 135)]],
+ {"label": "Tab", "max_num": 15, "min_num": 1},
+ ),
+ 137: (
+ "wagtail.blocks.StreamBlock",
+ [[("tabs", 136)]],
+ {"group": "DSFR components", "label": "Tabs"},
+ ),
+ 138: ("wagtailmarkdown.blocks.MarkdownBlock", (), {"group": "Expert syntax", "label": "Markdown"}),
+ 139: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 110), ("url", 111), ("height", 112), ("parameters", 113)]],
+ {"group": "Expert syntax", "label": "Iframe"},
+ ),
+ 140: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {"default": 3, "label": "Top margin", "max_value": 15, "min_value": 0},
+ ),
+ 141: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {"default": 3, "label": "Bottom margin", "max_value": 15, "min_value": 0},
+ ),
+ 142: (
+ "wagtail.blocks.StructBlock",
+ [[("top_margin", 140), ("bottom_margin", 141)]],
+ {"group": "Page structure", "label": "Separator"},
+ ),
+ 143: (
+ "wagtail.images.blocks.ImageChooserBlock",
+ (),
+ {"label": "Background image", "required": False},
+ ),
+ 144: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("Primary colors", [("blue-france", "Blue France"), ("red-marianne", "Red Marianne")]),
+ ("Neutral colors", [("grey", "Grey")]),
+ (
+ "Illustration colors",
+ [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ ),
+ ],
+ "help_text": "Uses the French Design System colors",
+ "label": "Background color",
+ "required": False,
+ },
+ ),
+ 145: (
+ "wagtail.blocks.RegexBlock",
+ (),
+ {
+ "error_messages": {"invalid": "Incorrect color format, must be #fff or #f5f5f5"},
+ "help_text": "This field is obsolete and will be removed in the near future. Replace it with the background color.",
+ "label": "Background color, hexadecimal format (obsolete)",
+ "regex": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$",
+ "required": False,
+ },
+ ),
+ 146: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ("h6", "Heading 6"),
+ ("p", "Paragraph"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 2.",
+ "label": "Heading level",
+ "required": False,
+ },
+ ),
+ 147: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("3", "3/12"),
+ ("4", "4/12"),
+ ("5", "5/12"),
+ ("6", "6/12"),
+ ("7", "7/12"),
+ ("8", "8/12"),
+ ("9", "9/12"),
+ ],
+ "help_text": "The total width of all columns should be 12.",
+ "label": "Column width",
+ "required": False,
+ },
+ ),
+ 148: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("contact_card", 134),
+ ]
+ ],
+ {"label": "Column content"},
+ ),
+ 149: (
+ "wagtail.blocks.StructBlock",
+ [[("width", 147), ("content", 148)]],
+ {"group": "Page structure", "label": "Adjustable column"},
+ ),
+ 150: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("column", 149),
+ ]
+ ],
+ {"label": "Columns"},
+ ),
+ 151: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("bg_image", 143),
+ ("bg_color_class", 144),
+ ("bg_color", 145),
+ ("title", 1),
+ ("heading_tag", 146),
+ ("columns", 150),
+ ]
+ ],
+ {"group": "Page structure", "label": "Multiple columns"},
+ ),
+ 152: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {"choices": [("3", "3/12"), ("4", "4/12"), ("6", "6/12")], "label": "Column width"},
+ ),
+ 153: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("contact_card", 134),
+ ]
+ ],
+ {"label": "Items"},
+ ),
+ 154: (
+ "wagtail.blocks.StructBlock",
+ [[("column_width", 152), ("items", 153)]],
+ {"group": "Page structure", "label": "Item grid"},
+ ),
+ 155: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("image_and_text", 22),
+ ("card", 93),
+ ("tabs", 137),
+ ("item_grid", 154),
+ ]
+ ],
+ {"label": "Content"},
+ ),
+ 156: (
+ "wagtail.blocks.StructBlock",
+ [[("bg_image", 143), ("bg_color_class", 144), ("content", 155)]],
+ {"group": "Page structure", "label": "Full width background"},
+ ),
+ 157: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("image_and_text", 22),
+ ("card", 93),
+ ("tabs", 137),
+ ("item_grid", 154),
+ ]
+ ],
+ {"label": "Main content"},
+ ),
+ 158: ("wagtail.blocks.CharBlock", (), {"label": "Side menu title", "required": False}),
+ 159: (
+ "wagtail.blocks.RawHTMLBlock",
+ (),
+ {
+ "help_text": "Warning: Use HTML block with caution. Malicious code can compromise the security of the site.",
+ "label": "HTML",
+ },
+ ),
+ 160: ("wagtail.blocks.PageChooserBlock", (), {"label": "Parent page"}),
+ 161: ("wagtail.blocks.StructBlock", [[("page", 160)]], {"label": "Page tree"}),
+ 162: (
+ "wagtail.blocks.StreamBlock",
+ [[("html", 159), ("pagetree", 161)]],
+ {"label": "Side menu content"},
+ ),
+ 163: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("bg_image", 143),
+ ("bg_color_class", 144),
+ ("main_content", 157),
+ ("sidemenu_title", 158),
+ ("sidemenu_content", 162),
+ ]
+ ],
+ {"group": "Page structure", "label": "Full width background with side menu"},
+ ),
+ 164: (
+ "wagtail.blocks.static_block.StaticBlock",
+ (),
+ {
+ "admin_text": "A simple, alphabetical list of the subpages of the current page.",
+ "group": "Website structure",
+ "label": "Subpages list",
+ "template": "content_manager/blocks/subpages_list.html",
+ },
+ ),
+ 165: (
+ "wagtail.blocks.RawHTMLBlock",
+ (),
+ {
+ "group": "Expert syntax",
+ "help_text": "Warning: Use HTML block with caution. Malicious code can compromise the security of the site.",
+ "readonly": True,
+ },
+ ),
+ },
+ ),
+ ),
+ migrations.AlterField(
+ model_name="blogindexpage",
+ name="body",
+ field=wagtail.fields.StreamField(
+ [
+ ("paragraph", 0),
+ ("image", 9),
+ ("imageandtext", 22),
+ ("alert", 27),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("video", 53),
+ ("transcription", 54),
+ ("badges_list", 59),
+ ("tags_list", 64),
+ ("link", 65),
+ ("stepper", 71),
+ ("card", 93),
+ ("tile", 103),
+ ("tabs", 137),
+ ("markdown", 138),
+ ("iframe", 139),
+ ("separator", 142),
+ ("multicolumns", 151),
+ ("item_grid", 154),
+ ("fullwidthbackground", 156),
+ ("fullwidthbackgroundwithsidemenu", 163),
+ ("subpageslist", 164),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("html", 165),
+ ],
+ blank=True,
+ block_lookup={
+ 0: ("wagtail.blocks.RichTextBlock", (), {"label": "Rich text"}),
+ 1: ("wagtail.blocks.CharBlock", (), {"label": "Title", "required": False}),
+ 2: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ("h6", "Heading 6"),
+ ("p", "Paragraph"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 3.",
+ "label": "Heading level",
+ "required": False,
+ },
+ ),
+ 3: ("wagtail.images.blocks.ImageChooserBlock", (), {"label": "Image"}),
+ 4: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"label": "Alternative text (textual description of the image)", "required": False},
+ ),
+ 5: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("fr-content-media--sm", "Small"),
+ ("", "Medium"),
+ ("fr-content-media--lg", "Large"),
+ ],
+ "label": "Witdh",
+ "required": False,
+ },
+ ),
+ 6: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("fr-ratio-32x9", "32x9"),
+ ("fr-ratio-16x9", "16x9"),
+ ("fr-ratio-3x2", "3x2"),
+ ("fr-ratio-4x3", "4x3"),
+ ("fr-ratio-1x1", "1x1"),
+ ("fr-ratio-3x4", "3x4"),
+ ("fr-ratio-2x3", "2x3"),
+ ],
+ "label": "Image ratio",
+ "required": False,
+ },
+ ),
+ 7: ("wagtail.blocks.CharBlock", (), {"label": "Caption", "required": False}),
+ 8: ("wagtail.blocks.URLBlock", (), {"label": "Link", "required": False}),
+ 9: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 2),
+ ("image", 3),
+ ("alt", 4),
+ ("width", 5),
+ ("image_ratio", 6),
+ ("caption", 7),
+ ("url", 8),
+ ]
+ ],
+ {},
+ ),
+ 10: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("left", "Left"), ("right", "Right")],
+ "label": "Side where the image is displayed",
+ },
+ ),
+ 11: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {"choices": [("3", "3/12"), ("5", "5/12"), ("6", "6/12")], "label": "Image width"},
+ ),
+ 12: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {
+ "help_text": "Link to a page of this site. Use either this, the document, or the external URL parameter.",
+ "label": "Page",
+ "required": False,
+ },
+ ),
+ 13: (
+ "wagtail.documents.blocks.DocumentChooserBlock",
+ (),
+ {
+ "help_text": "Use either this, the external URL or the page parameter.",
+ "label": "Document",
+ "required": False,
+ },
+ ),
+ 14: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "help_text": "Use either this, the document or the page parameter.",
+ "label": "External URL",
+ "required": False,
+ },
+ ),
+ 15: ("wagtail.blocks.CharBlock", (), {"label": "Link label", "required": False}),
+ 16: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("", "No icon"),
+ ("fr-icon-arrow-right-line fr-link--icon-right", "Icon on the right side"),
+ ("fr-icon-arrow-right-line fr-link--icon-left", "Icon on the left side"),
+ ],
+ "help_text": "Only used for internal links.",
+ "label": "Icon",
+ "required": False,
+ },
+ ),
+ 17: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-link--sm", "Small"), ("", "Medium"), ("fr-link--lg", "Large")],
+ "label": "Size",
+ "required": False,
+ },
+ ),
+ 18: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("icon", 16),
+ ("size", 17),
+ ]
+ ],
+ {
+ "help_text": "The link is shown at the bottom of the text block, with an arrow",
+ "label": "Link",
+ "required": False,
+ },
+ ),
+ 19: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "group": "obsolete",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Link label (obsolete)",
+ "required": False,
+ },
+ ),
+ 20: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {
+ "group": "obsolete",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Internal link (obsolete)",
+ "required": False,
+ },
+ ),
+ 21: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "group": "obsolete",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Link URL (obsolete)",
+ "required": False,
+ },
+ ),
+ 22: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("image", 3),
+ ("image_side", 10),
+ ("image_ratio", 11),
+ ("text", 0),
+ ("link", 18),
+ ("link_label", 19),
+ ("page", 20),
+ ("link_url", 21),
+ ]
+ ],
+ {"label": "Image and text"},
+ ),
+ 23: ("wagtail.blocks.CharBlock", (), {"label": "Message title", "required": False}),
+ 24: ("wagtail.blocks.TextBlock", (), {"label": "Message text", "required": False}),
+ 25: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("error", "Error"),
+ ("success", "Success"),
+ ("info", "Information"),
+ ("warning", "Warning"),
+ ],
+ "label": "Message type",
+ },
+ ),
+ 26: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ("h6", "Heading 6"),
+ ("p", "Paragraph"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 3.",
+ "label": "Heading level",
+ },
+ ),
+ 27: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 23), ("description", 24), ("level", 25), ("heading_tag", 26)]],
+ {"label": "Alert message"},
+ ),
+ 28: ("wagtail.blocks.CharBlock", (), {"label": "Title"}),
+ 29: ("wagtail.blocks.RichTextBlock", (), {"label": "Content"}),
+ 30: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 28), ("content", 29)]],
+ {"label": "Accordion", "max_num": 15, "min_num": 1},
+ ),
+ 31: (
+ "wagtail.blocks.StreamBlock",
+ [[("title", 28), ("accordion", 30)]],
+ {"group": "DSFR components", "label": "Accordions"},
+ ),
+ 32: ("content_manager.blocks.IconPickerBlock", (), {"label": "Icon", "required": False}),
+ 33: (
+ "wagtail.blocks.RichTextBlock",
+ (),
+ {
+ "features": [
+ "bold",
+ "italic",
+ "link",
+ "document-link",
+ "superscript",
+ "subscript",
+ "strikethrough",
+ ],
+ "label": "Content",
+ "required": False,
+ },
+ ),
+ 34: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("fr-btn", "Primary"),
+ ("fr-btn fr-btn--secondary", "Secundary"),
+ ("fr-btn fr-btn--tertiary", "Tertiary"),
+ ("fr-btn fr-btn--tertiary-no-outline", "Tertiary without border"),
+ ],
+ "label": "Button type",
+ "required": False,
+ },
+ ),
+ 35: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-btn--icon-left", "Left"), ("fr-btn--icon-right", "Right")],
+ "label": "Icon side",
+ "required": False,
+ },
+ ),
+ 36: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("button_type", 34),
+ ("icon_class", 32),
+ ("icon_side", 35),
+ ]
+ ],
+ {"label": "Button", "required": False},
+ ),
+ 37: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ "label": "Color",
+ "required": False,
+ },
+ ),
+ 38: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 26),
+ ("icon_class", 32),
+ ("text", 33),
+ ("button", 36),
+ ("color", 37),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Callout"},
+ ),
+ 39: (
+ "wagtail.blocks.RichTextBlock",
+ (),
+ {
+ "features": [
+ "bold",
+ "italic",
+ "link",
+ "document-link",
+ "superscript",
+ "subscript",
+ "strikethrough",
+ ],
+ "label": "Content",
+ },
+ ),
+ 40: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-text--sm", "Small"), ("", "Medium"), ("fr-text--lg", "Large")],
+ "label": "Size",
+ "required": False,
+ },
+ ),
+ 41: (
+ "wagtail.blocks.StructBlock",
+ [[("text", 39), ("color", 37), ("size", 40)]],
+ {"group": "DSFR components", "label": "Highlight"},
+ ),
+ 42: ("wagtail.images.blocks.ImageChooserBlock", (), {"label": "Image", "required": False}),
+ 43: ("wagtail.blocks.CharBlock", (), {"label": "Quote"}),
+ 44: ("wagtail.blocks.CharBlock", (), {"label": "Author name", "required": False}),
+ 45: ("wagtail.blocks.CharBlock", (), {"label": "Author title", "required": False}),
+ 46: (
+ "wagtail.blocks.StructBlock",
+ [[("image", 42), ("quote", 43), ("author_name", 44), ("author_title", 45), ("color", 37)]],
+ {"group": "DSFR components", "label": "Quote"},
+ ),
+ 47: ("wagtail.blocks.CharBlock", (), {"label": "Video title", "required": False}),
+ 48: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "help_text": "Use embed format, with a version that doesn't require a consent banner if available. (e.g. : https://www.youtube-nocookie.com/embed/gLzXOViPX-0) For Youtube, use Embed video and check Enable privacy-enhanced mode.",
+ "label": "Video URL",
+ },
+ ),
+ 49: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-ratio-16x9", "16x9"), ("fr-ratio-4x3", "4x3"), ("fr-ratio-1x1", "1x1")],
+ "label": "Video ratio",
+ "required": False,
+ },
+ ),
+ 50: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"default": "Transcription", "label": "Title", "required": False},
+ ),
+ 51: ("wagtail.blocks.RichTextBlock", (), {"label": "Transcription content", "required": False}),
+ 52: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 50), ("content", 51)]],
+ {"label": "Transcription", "required": False},
+ ),
+ 53: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 47),
+ ("caption", 7),
+ ("url", 48),
+ ("width", 5),
+ ("video_ratio", 49),
+ ("transcription", 52),
+ ]
+ ],
+ {"label": "Video"},
+ ),
+ 54: ("wagtail.blocks.StructBlock", [[("title", 50), ("content", 51)]], {"label": "Transcription"}),
+ 55: ("wagtail.blocks.CharBlock", (), {"label": "Badge label", "required": False}),
+ 56: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("", [("new", "New"), ("grey", "Grey")]),
+ (
+ "System colors",
+ [
+ ("info", "Info"),
+ ("success", "Success"),
+ ("warning", "Warning"),
+ ("error", "Error"),
+ ],
+ ),
+ (
+ "Illustration colors",
+ [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ ),
+ ],
+ "label": "Badge color",
+ "required": False,
+ },
+ ),
+ 57: ("wagtail.blocks.BooleanBlock", (), {"label": "Hide badge icon", "required": False}),
+ 58: (
+ "wagtail.blocks.StructBlock",
+ [[("text", 55), ("color", 56), ("hide_icon", 57)]],
+ {"label": "Badge"},
+ ),
+ 59: ("wagtail.blocks.StreamBlock", [[("badge", 58)]], {"label": "Badge list"}),
+ 60: ("wagtail.blocks.BooleanBlock", (), {"label": "Small tag", "required": False}),
+ 61: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ "help_text": "Only for clickable tags",
+ "label": "Tag color",
+ "required": False,
+ },
+ ),
+ 62: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 12), ("document", 13), ("external_url", 14)]],
+ {"required": False},
+ ),
+ 63: (
+ "wagtail.blocks.StructBlock",
+ [[("label", 28), ("is_small", 60), ("color", 61), ("icon_class", 32), ("link", 62)]],
+ {"label": "Tag"},
+ ),
+ 64: ("wagtail.blocks.StreamBlock", [[("tag", 63)]], {"label": "Tag list"}),
+ 65: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("icon", 16),
+ ("size", 17),
+ ]
+ ],
+ {"label": "Single link"},
+ ),
+ 66: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {"label": "Number of steps", "max_value": 8, "min_value": 1},
+ ),
+ 67: ("wagtail.blocks.IntegerBlock", (), {"label": "Current step", "max_value": 8, "min_value": 1}),
+ 68: ("wagtail.blocks.TextBlock", (), {"label": "Detail"}),
+ 69: ("wagtail.blocks.StructBlock", [[("title", 28), ("detail", 68)]], {"label": "Step"}),
+ 70: ("wagtail.blocks.StreamBlock", [[("step", 69)]], {"label": "Steps"}),
+ 71: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 28), ("total", 66), ("current", 67), ("steps", 70)]],
+ {"group": "DSFR components", "label": "Stepper"},
+ ),
+ 72: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-card--horizontal-tier", "1/3"), ("fr-card--horizontal-half", "50/50")],
+ "label": "Image ratio",
+ "required": False,
+ },
+ ),
+ 73: (
+ "wagtail.blocks.StreamBlock",
+ [[("badge", 58)]],
+ {
+ "help_text": "Only used if the card has an image.",
+ "label": "Image area badge",
+ "max_num": 1,
+ "required": False,
+ },
+ ),
+ 74: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 12), ("document", 13), ("external_url", 14)]],
+ {"label": "Link", "required": False},
+ ),
+ 75: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "group": "target",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Link (obsolete)",
+ "required": False,
+ },
+ ),
+ 76: (
+ "wagtail.documents.blocks.DocumentChooserBlock",
+ (),
+ {
+ "group": "target",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "or Document (obsolete)",
+ "required": False,
+ },
+ ),
+ 77: ("wagtail.blocks.CharBlock", (), {"label": "Top detail: text", "required": False}),
+ 78: (
+ "content_manager.blocks.IconPickerBlock",
+ (),
+ {"label": "Top detail: icon", "required": False},
+ ),
+ 79: ("wagtail.blocks.StreamBlock", [[("badge", 58)]], {}),
+ 80: ("wagtail.blocks.StreamBlock", [[("tag", 63)]], {}),
+ 81: (
+ "wagtail.blocks.StreamBlock",
+ [[("badges", 79), ("tags", 80)]],
+ {"label": "Top detail: badges or tags", "max_num": 1, "required": False},
+ ),
+ 82: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "Incompatible with the bottom call-to-action. If the card links to a downloadable document, the values are pre-filled.",
+ "label": "Bottom detail: text",
+ "required": False,
+ },
+ ),
+ 83: (
+ "content_manager.blocks.IconPickerBlock",
+ (),
+ {"label": "Bottom detail: icon", "required": False},
+ ),
+ 84: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 12), ("document", 13), ("external_url", 14), ("text", 15)]],
+ {"label": "Link"},
+ ),
+ 85: ("wagtail.blocks.StreamBlock", [[("link", 84)]], {}),
+ 86: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("button_type", 34),
+ ("icon_class", 32),
+ ("icon_side", 35),
+ ]
+ ],
+ {"label": "Button"},
+ ),
+ 87: (
+ "wagtail.blocks.StreamBlock",
+ [[("button", 86)]],
+ {
+ "help_text": "Please use only one primary button.\n If you use icons, use them on all buttons and align them on the same side.",
+ "label": "Buttons",
+ },
+ ),
+ 88: (
+ "wagtail.blocks.StreamBlock",
+ [[("links", 85), ("buttons", 87)]],
+ {
+ "help_text": "Incompatible with the bottom detail text.",
+ "label": "Bottom call-to-action: links or buttons",
+ "max_num": 1,
+ "required": False,
+ },
+ ),
+ 89: ("wagtail.blocks.BooleanBlock", (), {"label": "Card with grey background", "required": False}),
+ 90: ("wagtail.blocks.BooleanBlock", (), {"label": "Card without background", "required": False}),
+ 91: ("wagtail.blocks.BooleanBlock", (), {"label": "Card without border", "required": False}),
+ 92: ("wagtail.blocks.BooleanBlock", (), {"label": "Card with a shadow", "required": False}),
+ 93: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 28),
+ ("heading_tag", 26),
+ ("description", 33),
+ ("image", 42),
+ ("image_ratio", 72),
+ ("image_badge", 73),
+ ("link", 74),
+ ("url", 75),
+ ("document", 76),
+ ("top_detail_text", 77),
+ ("top_detail_icon", 78),
+ ("top_detail_badges_tags", 81),
+ ("bottom_detail_text", 82),
+ ("bottom_detail_icon", 83),
+ ("call_to_action", 88),
+ ("grey_background", 89),
+ ("no_background", 90),
+ ("no_border", 91),
+ ("shadow", 92),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Horizontal card"},
+ ),
+ 94: (
+ "wagtail.blocks.RichTextBlock",
+ (),
+ {
+ "features": ["bold", "italic", "superscript", "subscript", "strikethrough"],
+ "label": "Content",
+ "required": False,
+ },
+ ),
+ 95: (
+ "wagtail.images.blocks.ImageChooserBlock",
+ (),
+ {"help_text": "Prefer SVG files.", "label": "Image", "required": False},
+ ),
+ 96: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "If the tile links to a downloadable document, the values are pre-filled.",
+ "label": "Detail text",
+ "required": False,
+ },
+ ),
+ 97: ("wagtail.blocks.BooleanBlock", (), {"label": "Small tile", "required": False}),
+ 98: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile with grey background", "required": False}),
+ 99: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile without background", "required": False}),
+ 100: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile without border", "required": False}),
+ 101: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile with a shadow", "required": False}),
+ 102: ("wagtail.blocks.BooleanBlock", (), {"label": "Horizontal tile", "required": False}),
+ 103: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 28),
+ ("heading_tag", 26),
+ ("description", 94),
+ ("image", 95),
+ ("link", 74),
+ ("top_detail_badges_tags", 81),
+ ("detail_text", 96),
+ ("is_small", 97),
+ ("grey_background", 98),
+ ("no_background", 99),
+ ("no_border", 100),
+ ("shadow", 101),
+ ("is_horizontal", 102),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Tile"},
+ ),
+ 104: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 2),
+ ("image", 3),
+ ("alt", 4),
+ ("width", 5),
+ ("image_ratio", 6),
+ ("caption", 7),
+ ("url", 8),
+ ]
+ ],
+ {"label": "Image"},
+ ),
+ 105: ("wagtail.blocks.RichTextBlock", (), {"label": "Rich text", "required": False}),
+ 106: (
+ "wagtail.blocks.StreamBlock",
+ [[("buttons", 87)]],
+ {"label": "Call-to-action buttons", "max_num": 1, "required": False},
+ ),
+ 107: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the CTA buttons above.",
+ "label": "Call to action label (obsolete)",
+ "required": False,
+ },
+ ),
+ 108: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the CTA buttons above.",
+ "label": "Link (obsolete)",
+ "required": False,
+ },
+ ),
+ 109: (
+ "wagtail.blocks.StructBlock",
+ [[("text", 105), ("cta_buttons", 106), ("cta_label", 107), ("cta_url", 108)]],
+ {"label": "Text and call to action"},
+ ),
+ 110: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "Accessibility: The title should describe, in a clear and concise manner, the embedded content.",
+ "label": "Title",
+ },
+ ),
+ 111: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "help_text": "Example for Tally: https://tally.so/embed/w2jMRa",
+ "label": "URL of the iframe",
+ },
+ ),
+ 112: ("wagtail.blocks.IntegerBlock", (), {"label": "Height (in pixels)"}),
+ 113: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "For example: \"allow='geolocation'\".",
+ "label": "Parameters",
+ "required": False,
+ },
+ ),
+ 114: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 110), ("url", 111), ("height", 112), ("parameters", 113)]],
+ {"group": "DSFR components", "label": "Iframe"},
+ ),
+ 115: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 2.",
+ "label": "Heading level",
+ "required": False,
+ },
+ ),
+ 116: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {"label": "Blog", "page_type": ["blog.BlogIndexPage"]},
+ ),
+ 117: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {
+ "default": 3,
+ "label": "Number of entries",
+ "max_value": 8,
+ "min_value": 1,
+ "required": False,
+ },
+ ),
+ 118: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Category",),
+ {"label": "Filter by category", "required": False},
+ ),
+ 119: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("content_manager.Tag",),
+ {"label": "Filter by tag", "required": False},
+ ),
+ 120: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Person",),
+ {"label": "Filter by author", "required": False},
+ ),
+ 121: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Organization",),
+ {
+ "help_text": "The source is the organization of the post author",
+ "label": "Filter by source",
+ "required": False,
+ },
+ ),
+ 122: (
+ "wagtail.blocks.BooleanBlock",
+ (),
+ {"default": False, "label": "Show filters", "required": False},
+ ),
+ 123: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 115),
+ ("blog", 116),
+ ("entries_count", 117),
+ ("category_filter", 118),
+ ("tag_filter", 119),
+ ("author_filter", 120),
+ ("source_filter", 121),
+ ("show_filters", 122),
+ ]
+ ],
+ {"group": "Website structure", "label": "Blog recent entries"},
+ ),
+ 124: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {"label": "Event calendar", "page_type": ["events.EventsIndexPage"]},
+ ),
+ 125: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 115),
+ ("index_page", 124),
+ ("entries_count", 117),
+ ("category_filter", 118),
+ ("tag_filter", 119),
+ ("author_filter", 120),
+ ("source_filter", 121),
+ ("show_filters", 122),
+ ]
+ ],
+ {"group": "Website structure", "label": "Event calendar recent entries"},
+ ),
+ 126: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "Incompatible with the bottom call-to-action.",
+ "label": "Bottom detail: text",
+ "required": False,
+ },
+ ),
+ 127: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 28),
+ ("heading_tag", 26),
+ ("description", 33),
+ ("image", 42),
+ ("image_ratio", 6),
+ ("image_badge", 73),
+ ("link", 74),
+ ("url", 75),
+ ("document", 76),
+ ("top_detail_text", 77),
+ ("top_detail_icon", 78),
+ ("top_detail_badges_tags", 81),
+ ("bottom_detail_text", 126),
+ ("bottom_detail_icon", 83),
+ ("call_to_action", 88),
+ ("grey_background", 89),
+ ("no_background", 90),
+ ("no_border", 91),
+ ("shadow", 92),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Vertical card"},
+ ),
+ 128: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Person",),
+ {
+ "help_text": "Optional, all values can be manually specified or overriden below",
+ "label": "Person",
+ "required": False,
+ },
+ ),
+ 129: ("wagtail.blocks.CharBlock", (), {"label": "Name", "max_length": 255, "required": False}),
+ 130: ("wagtail.blocks.CharBlock", (), {"label": "Role", "max_length": 255, "required": False}),
+ 131: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"label": "Organization", "max_length": 255, "required": False},
+ ),
+ 132: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"label": "Contact info", "max_length": 500, "required": False},
+ ),
+ 133: ("wagtail.blocks.StreamBlock", [[("tag", 63)]], {"label": "Tags", "required": False}),
+ 134: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("contact", 128),
+ ("link", 74),
+ ("heading_tag", 2),
+ ("name", 129),
+ ("role", 130),
+ ("organization", 131),
+ ("contact_info", 132),
+ ("image", 42),
+ ("tags", 133),
+ ]
+ ],
+ {"group": "Extra components", "label": "Contact card"},
+ ),
+ 135: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("contact_card", 134),
+ ]
+ ],
+ {"label": "Content"},
+ ),
+ 136: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 28), ("content", 135)]],
+ {"label": "Tab", "max_num": 15, "min_num": 1},
+ ),
+ 137: (
+ "wagtail.blocks.StreamBlock",
+ [[("tabs", 136)]],
+ {"group": "DSFR components", "label": "Tabs"},
+ ),
+ 138: ("wagtailmarkdown.blocks.MarkdownBlock", (), {"group": "Expert syntax", "label": "Markdown"}),
+ 139: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 110), ("url", 111), ("height", 112), ("parameters", 113)]],
+ {"group": "Expert syntax", "label": "Iframe"},
+ ),
+ 140: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {"default": 3, "label": "Top margin", "max_value": 15, "min_value": 0},
+ ),
+ 141: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {"default": 3, "label": "Bottom margin", "max_value": 15, "min_value": 0},
+ ),
+ 142: (
+ "wagtail.blocks.StructBlock",
+ [[("top_margin", 140), ("bottom_margin", 141)]],
+ {"group": "Page structure", "label": "Separator"},
+ ),
+ 143: (
+ "wagtail.images.blocks.ImageChooserBlock",
+ (),
+ {"label": "Background image", "required": False},
+ ),
+ 144: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("Primary colors", [("blue-france", "Blue France"), ("red-marianne", "Red Marianne")]),
+ ("Neutral colors", [("grey", "Grey")]),
+ (
+ "Illustration colors",
+ [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ ),
+ ],
+ "help_text": "Uses the French Design System colors",
+ "label": "Background color",
+ "required": False,
+ },
+ ),
+ 145: (
+ "wagtail.blocks.RegexBlock",
+ (),
+ {
+ "error_messages": {"invalid": "Incorrect color format, must be #fff or #f5f5f5"},
+ "help_text": "This field is obsolete and will be removed in the near future. Replace it with the background color.",
+ "label": "Background color, hexadecimal format (obsolete)",
+ "regex": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$",
+ "required": False,
+ },
+ ),
+ 146: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ("h6", "Heading 6"),
+ ("p", "Paragraph"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 2.",
+ "label": "Heading level",
+ "required": False,
+ },
+ ),
+ 147: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("3", "3/12"),
+ ("4", "4/12"),
+ ("5", "5/12"),
+ ("6", "6/12"),
+ ("7", "7/12"),
+ ("8", "8/12"),
+ ("9", "9/12"),
+ ],
+ "help_text": "The total width of all columns should be 12.",
+ "label": "Column width",
+ "required": False,
+ },
+ ),
+ 148: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("contact_card", 134),
+ ]
+ ],
+ {"label": "Column content"},
+ ),
+ 149: (
+ "wagtail.blocks.StructBlock",
+ [[("width", 147), ("content", 148)]],
+ {"group": "Page structure", "label": "Adjustable column"},
+ ),
+ 150: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("column", 149),
+ ]
+ ],
+ {"label": "Columns"},
+ ),
+ 151: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("bg_image", 143),
+ ("bg_color_class", 144),
+ ("bg_color", 145),
+ ("title", 1),
+ ("heading_tag", 146),
+ ("columns", 150),
+ ]
+ ],
+ {"group": "Page structure", "label": "Multiple columns"},
+ ),
+ 152: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {"choices": [("3", "3/12"), ("4", "4/12"), ("6", "6/12")], "label": "Column width"},
+ ),
+ 153: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("contact_card", 134),
+ ]
+ ],
+ {"label": "Items"},
+ ),
+ 154: (
+ "wagtail.blocks.StructBlock",
+ [[("column_width", 152), ("items", 153)]],
+ {"group": "Page structure", "label": "Item grid"},
+ ),
+ 155: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("image_and_text", 22),
+ ("card", 93),
+ ("tabs", 137),
+ ("item_grid", 154),
+ ]
+ ],
+ {"label": "Content"},
+ ),
+ 156: (
+ "wagtail.blocks.StructBlock",
+ [[("bg_image", 143), ("bg_color_class", 144), ("content", 155)]],
+ {"group": "Page structure", "label": "Full width background"},
+ ),
+ 157: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("image_and_text", 22),
+ ("card", 93),
+ ("tabs", 137),
+ ("item_grid", 154),
+ ]
+ ],
+ {"label": "Main content"},
+ ),
+ 158: ("wagtail.blocks.CharBlock", (), {"label": "Side menu title", "required": False}),
+ 159: (
+ "wagtail.blocks.RawHTMLBlock",
+ (),
+ {
+ "help_text": "Warning: Use HTML block with caution. Malicious code can compromise the security of the site.",
+ "label": "HTML",
+ },
+ ),
+ 160: ("wagtail.blocks.PageChooserBlock", (), {"label": "Parent page"}),
+ 161: ("wagtail.blocks.StructBlock", [[("page", 160)]], {"label": "Page tree"}),
+ 162: (
+ "wagtail.blocks.StreamBlock",
+ [[("html", 159), ("pagetree", 161)]],
+ {"label": "Side menu content"},
+ ),
+ 163: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("bg_image", 143),
+ ("bg_color_class", 144),
+ ("main_content", 157),
+ ("sidemenu_title", 158),
+ ("sidemenu_content", 162),
+ ]
+ ],
+ {"group": "Page structure", "label": "Full width background with side menu"},
+ ),
+ 164: (
+ "wagtail.blocks.static_block.StaticBlock",
+ (),
+ {
+ "admin_text": "A simple, alphabetical list of the subpages of the current page.",
+ "group": "Website structure",
+ "label": "Subpages list",
+ "template": "content_manager/blocks/subpages_list.html",
+ },
+ ),
+ 165: (
+ "wagtail.blocks.RawHTMLBlock",
+ (),
+ {
+ "group": "Expert syntax",
+ "help_text": "Warning: Use HTML block with caution. Malicious code can compromise the security of the site.",
+ "readonly": True,
+ },
+ ),
+ },
+ ),
+ ),
+ migrations.AlterField(
+ model_name="category",
+ name="colophon",
+ field=wagtail.fields.StreamField(
+ [("paragraph", 0), ("imageandtext", 14), ("quote", 20), ("multicolumns", 134), ("contact_card", 138)],
+ blank=True,
+ block_lookup={
+ 0: ("wagtail.blocks.RichTextBlock", (), {"label": "Rich text"}),
+ 1: ("wagtail.images.blocks.ImageChooserBlock", (), {"label": "Image"}),
+ 2: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("left", "Left"), ("right", "Right")],
+ "label": "Side where the image is displayed",
+ },
+ ),
+ 3: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {"choices": [("3", "3/12"), ("5", "5/12"), ("6", "6/12")], "label": "Image width"},
+ ),
+ 4: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {
+ "help_text": "Link to a page of this site. Use either this, the document, or the external URL parameter.",
+ "label": "Page",
+ "required": False,
+ },
+ ),
+ 5: (
+ "wagtail.documents.blocks.DocumentChooserBlock",
+ (),
+ {
+ "help_text": "Use either this, the external URL or the page parameter.",
+ "label": "Document",
+ "required": False,
+ },
+ ),
+ 6: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "help_text": "Use either this, the document or the page parameter.",
+ "label": "External URL",
+ "required": False,
+ },
+ ),
+ 7: ("wagtail.blocks.CharBlock", (), {"label": "Link label", "required": False}),
+ 8: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("", "No icon"),
+ ("fr-icon-arrow-right-line fr-link--icon-right", "Icon on the right side"),
+ ("fr-icon-arrow-right-line fr-link--icon-left", "Icon on the left side"),
+ ],
+ "help_text": "Only used for internal links.",
+ "label": "Icon",
+ "required": False,
+ },
+ ),
+ 9: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-link--sm", "Small"), ("", "Medium"), ("fr-link--lg", "Large")],
+ "label": "Size",
+ "required": False,
+ },
+ ),
+ 10: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 4), ("document", 5), ("external_url", 6), ("text", 7), ("icon", 8), ("size", 9)]],
+ {
+ "help_text": "The link is shown at the bottom of the text block, with an arrow",
+ "label": "Link",
+ "required": False,
+ },
+ ),
+ 11: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "group": "obsolete",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Link label (obsolete)",
+ "required": False,
+ },
+ ),
+ 12: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {
+ "group": "obsolete",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Internal link (obsolete)",
+ "required": False,
+ },
+ ),
+ 13: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "group": "obsolete",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Link URL (obsolete)",
+ "required": False,
+ },
+ ),
+ 14: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("image", 1),
+ ("image_side", 2),
+ ("image_ratio", 3),
+ ("text", 0),
+ ("link", 10),
+ ("link_label", 11),
+ ("page", 12),
+ ("link_url", 13),
+ ]
+ ],
+ {"label": "Bloc image et texte"},
+ ),
+ 15: ("wagtail.images.blocks.ImageChooserBlock", (), {"label": "Image", "required": False}),
+ 16: ("wagtail.blocks.CharBlock", (), {"label": "Quote"}),
+ 17: ("wagtail.blocks.CharBlock", (), {"label": "Author name", "required": False}),
+ 18: ("wagtail.blocks.CharBlock", (), {"label": "Author title", "required": False}),
+ 19: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ "label": "Color",
+ "required": False,
+ },
+ ),
+ 20: (
+ "wagtail.blocks.StructBlock",
+ [[("image", 15), ("quote", 16), ("author_name", 17), ("author_title", 18), ("color", 19)]],
+ {"label": "Citation"},
+ ),
+ 21: (
+ "wagtail.images.blocks.ImageChooserBlock",
+ (),
+ {"label": "Background image", "required": False},
+ ),
+ 22: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("Primary colors", [("blue-france", "Blue France"), ("red-marianne", "Red Marianne")]),
+ ("Neutral colors", [("grey", "Grey")]),
+ (
+ "Illustration colors",
+ [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ ),
+ ],
+ "help_text": "Uses the French Design System colors",
+ "label": "Background color",
+ "required": False,
+ },
+ ),
+ 23: (
+ "wagtail.blocks.RegexBlock",
+ (),
+ {
+ "error_messages": {"invalid": "Incorrect color format, must be #fff or #f5f5f5"},
+ "help_text": "This field is obsolete and will be removed in the near future. Replace it with the background color.",
+ "label": "Background color, hexadecimal format (obsolete)",
+ "regex": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$",
+ "required": False,
+ },
+ ),
+ 24: ("wagtail.blocks.CharBlock", (), {"label": "Title", "required": False}),
+ 25: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ("h6", "Heading 6"),
+ ("p", "Paragraph"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 2.",
+ "label": "Heading level",
+ "required": False,
+ },
+ ),
+ 26: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ("h6", "Heading 6"),
+ ("p", "Paragraph"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 3.",
+ "label": "Heading level",
+ "required": False,
+ },
+ ),
+ 27: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"label": "Alternative text (textual description of the image)", "required": False},
+ ),
+ 28: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("fr-content-media--sm", "Small"),
+ ("", "Medium"),
+ ("fr-content-media--lg", "Large"),
+ ],
+ "label": "Witdh",
+ "required": False,
+ },
+ ),
+ 29: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("fr-ratio-32x9", "32x9"),
+ ("fr-ratio-16x9", "16x9"),
+ ("fr-ratio-3x2", "3x2"),
+ ("fr-ratio-4x3", "4x3"),
+ ("fr-ratio-1x1", "1x1"),
+ ("fr-ratio-3x4", "3x4"),
+ ("fr-ratio-2x3", "2x3"),
+ ],
+ "label": "Image ratio",
+ "required": False,
+ },
+ ),
+ 30: ("wagtail.blocks.CharBlock", (), {"label": "Caption", "required": False}),
+ 31: ("wagtail.blocks.URLBlock", (), {"label": "Link", "required": False}),
+ 32: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 24),
+ ("heading_tag", 26),
+ ("image", 1),
+ ("alt", 27),
+ ("width", 28),
+ ("image_ratio", 29),
+ ("caption", 30),
+ ("url", 31),
+ ]
+ ],
+ {"label": "Image"},
+ ),
+ 33: ("wagtail.blocks.CharBlock", (), {"label": "Video title", "required": False}),
+ 34: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "help_text": "Use embed format, with a version that doesn't require a consent banner if available. (e.g. : https://www.youtube-nocookie.com/embed/gLzXOViPX-0) For Youtube, use Embed video and check Enable privacy-enhanced mode.",
+ "label": "Video URL",
+ },
+ ),
+ 35: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-ratio-16x9", "16x9"), ("fr-ratio-4x3", "4x3"), ("fr-ratio-1x1", "1x1")],
+ "label": "Video ratio",
+ "required": False,
+ },
+ ),
+ 36: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"default": "Transcription", "label": "Title", "required": False},
+ ),
+ 37: ("wagtail.blocks.RichTextBlock", (), {"label": "Transcription content", "required": False}),
+ 38: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 36), ("content", 37)]],
+ {"label": "Transcription", "required": False},
+ ),
+ 39: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 33),
+ ("caption", 30),
+ ("url", 34),
+ ("width", 28),
+ ("video_ratio", 35),
+ ("transcription", 38),
+ ]
+ ],
+ {"label": "Video"},
+ ),
+ 40: ("wagtail.blocks.StructBlock", [[("title", 36), ("content", 37)]], {"label": "Transcription"}),
+ 41: ("wagtail.blocks.CharBlock", (), {"label": "Title"}),
+ 42: ("wagtail.blocks.RichTextBlock", (), {"label": "Content"}),
+ 43: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 41), ("content", 42)]],
+ {"label": "Accordion", "max_num": 15, "min_num": 1},
+ ),
+ 44: (
+ "wagtail.blocks.StreamBlock",
+ [[("title", 41), ("accordion", 43)]],
+ {"group": "DSFR components", "label": "Accordions"},
+ ),
+ 45: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ("h6", "Heading 6"),
+ ("p", "Paragraph"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 3.",
+ "label": "Heading level",
+ },
+ ),
+ 46: ("content_manager.blocks.IconPickerBlock", (), {"label": "Icon", "required": False}),
+ 47: (
+ "wagtail.blocks.RichTextBlock",
+ (),
+ {
+ "features": [
+ "bold",
+ "italic",
+ "link",
+ "document-link",
+ "superscript",
+ "subscript",
+ "strikethrough",
+ ],
+ "label": "Content",
+ "required": False,
+ },
+ ),
+ 48: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("fr-btn", "Primary"),
+ ("fr-btn fr-btn--secondary", "Secundary"),
+ ("fr-btn fr-btn--tertiary", "Tertiary"),
+ ("fr-btn fr-btn--tertiary-no-outline", "Tertiary without border"),
+ ],
+ "label": "Button type",
+ "required": False,
+ },
+ ),
+ 49: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-btn--icon-left", "Left"), ("fr-btn--icon-right", "Right")],
+ "label": "Icon side",
+ "required": False,
+ },
+ ),
+ 50: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 4),
+ ("document", 5),
+ ("external_url", 6),
+ ("text", 7),
+ ("button_type", 48),
+ ("icon_class", 46),
+ ("icon_side", 49),
+ ]
+ ],
+ {"label": "Button", "required": False},
+ ),
+ 51: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 24),
+ ("heading_tag", 45),
+ ("icon_class", 46),
+ ("text", 47),
+ ("button", 50),
+ ("color", 19),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Callout"},
+ ),
+ 52: (
+ "wagtail.blocks.RichTextBlock",
+ (),
+ {
+ "features": [
+ "bold",
+ "italic",
+ "link",
+ "document-link",
+ "superscript",
+ "subscript",
+ "strikethrough",
+ ],
+ "label": "Content",
+ },
+ ),
+ 53: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-text--sm", "Small"), ("", "Medium"), ("fr-text--lg", "Large")],
+ "label": "Size",
+ "required": False,
+ },
+ ),
+ 54: (
+ "wagtail.blocks.StructBlock",
+ [[("text", 52), ("color", 19), ("size", 53)]],
+ {"group": "DSFR components", "label": "Highlight"},
+ ),
+ 55: (
+ "wagtail.blocks.StructBlock",
+ [[("image", 15), ("quote", 16), ("author_name", 17), ("author_title", 18), ("color", 19)]],
+ {"group": "DSFR components", "label": "Quote"},
+ ),
+ 56: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {"label": "Number of steps", "max_value": 8, "min_value": 1},
+ ),
+ 57: ("wagtail.blocks.IntegerBlock", (), {"label": "Current step", "max_value": 8, "min_value": 1}),
+ 58: ("wagtail.blocks.TextBlock", (), {"label": "Detail"}),
+ 59: ("wagtail.blocks.StructBlock", [[("title", 41), ("detail", 58)]], {"label": "Step"}),
+ 60: ("wagtail.blocks.StreamBlock", [[("step", 59)]], {"label": "Steps"}),
+ 61: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 41), ("total", 56), ("current", 57), ("steps", 60)]],
+ {"group": "DSFR components", "label": "Stepper"},
+ ),
+ 62: ("wagtail.blocks.RichTextBlock", (), {"label": "Rich text", "required": False}),
+ 63: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 4),
+ ("document", 5),
+ ("external_url", 6),
+ ("text", 7),
+ ("button_type", 48),
+ ("icon_class", 46),
+ ("icon_side", 49),
+ ]
+ ],
+ {"label": "Button"},
+ ),
+ 64: (
+ "wagtail.blocks.StreamBlock",
+ [[("button", 63)]],
+ {
+ "help_text": "Please use only one primary button.\n If you use icons, use them on all buttons and align them on the same side.",
+ "label": "Buttons",
+ },
+ ),
+ 65: (
+ "wagtail.blocks.StreamBlock",
+ [[("buttons", 64)]],
+ {"label": "Call-to-action buttons", "max_num": 1, "required": False},
+ ),
+ 66: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the CTA buttons above.",
+ "label": "Call to action label (obsolete)",
+ "required": False,
+ },
+ ),
+ 67: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the CTA buttons above.",
+ "label": "Link (obsolete)",
+ "required": False,
+ },
+ ),
+ 68: (
+ "wagtail.blocks.StructBlock",
+ [[("text", 62), ("cta_buttons", 65), ("cta_label", 66), ("cta_url", 67)]],
+ {"label": "Text and call to action"},
+ ),
+ 69: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 4), ("document", 5), ("external_url", 6), ("text", 7), ("icon", 8), ("size", 9)]],
+ {"label": "Single link"},
+ ),
+ 70: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "Accessibility: The title should describe, in a clear and concise manner, the embedded content.",
+ "label": "Title",
+ },
+ ),
+ 71: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "help_text": "Example for Tally: https://tally.so/embed/w2jMRa",
+ "label": "URL of the iframe",
+ },
+ ),
+ 72: ("wagtail.blocks.IntegerBlock", (), {"label": "Height (in pixels)"}),
+ 73: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "For example: \"allow='geolocation'\".",
+ "label": "Parameters",
+ "required": False,
+ },
+ ),
+ 74: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 70), ("url", 71), ("height", 72), ("parameters", 73)]],
+ {"group": "DSFR components", "label": "Iframe"},
+ ),
+ 75: (
+ "wagtail.blocks.RichTextBlock",
+ (),
+ {
+ "features": ["bold", "italic", "superscript", "subscript", "strikethrough"],
+ "label": "Content",
+ "required": False,
+ },
+ ),
+ 76: (
+ "wagtail.images.blocks.ImageChooserBlock",
+ (),
+ {"help_text": "Prefer SVG files.", "label": "Image", "required": False},
+ ),
+ 77: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 4), ("document", 5), ("external_url", 6)]],
+ {"label": "Link", "required": False},
+ ),
+ 78: ("wagtail.blocks.CharBlock", (), {"label": "Badge label", "required": False}),
+ 79: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("", [("new", "New"), ("grey", "Grey")]),
+ (
+ "System colors",
+ [
+ ("info", "Info"),
+ ("success", "Success"),
+ ("warning", "Warning"),
+ ("error", "Error"),
+ ],
+ ),
+ (
+ "Illustration colors",
+ [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ ),
+ ],
+ "label": "Badge color",
+ "required": False,
+ },
+ ),
+ 80: ("wagtail.blocks.BooleanBlock", (), {"label": "Hide badge icon", "required": False}),
+ 81: (
+ "wagtail.blocks.StructBlock",
+ [[("text", 78), ("color", 79), ("hide_icon", 80)]],
+ {"label": "Badge"},
+ ),
+ 82: ("wagtail.blocks.StreamBlock", [[("badge", 81)]], {}),
+ 83: ("wagtail.blocks.BooleanBlock", (), {"label": "Small tag", "required": False}),
+ 84: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ "help_text": "Only for clickable tags",
+ "label": "Tag color",
+ "required": False,
+ },
+ ),
+ 85: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 4), ("document", 5), ("external_url", 6)]],
+ {"required": False},
+ ),
+ 86: (
+ "wagtail.blocks.StructBlock",
+ [[("label", 41), ("is_small", 83), ("color", 84), ("icon_class", 46), ("link", 85)]],
+ {"label": "Tag"},
+ ),
+ 87: ("wagtail.blocks.StreamBlock", [[("tag", 86)]], {}),
+ 88: (
+ "wagtail.blocks.StreamBlock",
+ [[("badges", 82), ("tags", 87)]],
+ {"label": "Top detail: badges or tags", "max_num": 1, "required": False},
+ ),
+ 89: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "If the tile links to a downloadable document, the values are pre-filled.",
+ "label": "Detail text",
+ "required": False,
+ },
+ ),
+ 90: ("wagtail.blocks.BooleanBlock", (), {"label": "Small tile", "required": False}),
+ 91: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile with grey background", "required": False}),
+ 92: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile without background", "required": False}),
+ 93: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile without border", "required": False}),
+ 94: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile with a shadow", "required": False}),
+ 95: ("wagtail.blocks.BooleanBlock", (), {"label": "Horizontal tile", "required": False}),
+ 96: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 41),
+ ("heading_tag", 45),
+ ("description", 75),
+ ("image", 76),
+ ("link", 77),
+ ("top_detail_badges_tags", 88),
+ ("detail_text", 89),
+ ("is_small", 90),
+ ("grey_background", 91),
+ ("no_background", 92),
+ ("no_border", 93),
+ ("shadow", 94),
+ ("is_horizontal", 95),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Tile"},
+ ),
+ 97: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 2.",
+ "label": "Heading level",
+ "required": False,
+ },
+ ),
+ 98: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {"label": "Blog", "page_type": ["blog.BlogIndexPage"]},
+ ),
+ 99: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {
+ "default": 3,
+ "label": "Number of entries",
+ "max_value": 8,
+ "min_value": 1,
+ "required": False,
+ },
+ ),
+ 100: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Category",),
+ {"label": "Filter by category", "required": False},
+ ),
+ 101: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("content_manager.Tag",),
+ {"label": "Filter by tag", "required": False},
+ ),
+ 102: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Person",),
+ {"label": "Filter by author", "required": False},
+ ),
+ 103: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Organization",),
+ {
+ "help_text": "The source is the organization of the post author",
+ "label": "Filter by source",
+ "required": False,
+ },
+ ),
+ 104: (
+ "wagtail.blocks.BooleanBlock",
+ (),
+ {"default": False, "label": "Show filters", "required": False},
+ ),
+ 105: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 24),
+ ("heading_tag", 97),
+ ("blog", 98),
+ ("entries_count", 99),
+ ("category_filter", 100),
+ ("tag_filter", 101),
+ ("author_filter", 102),
+ ("source_filter", 103),
+ ("show_filters", 104),
+ ]
+ ],
+ {"group": "Website structure", "label": "Blog recent entries"},
+ ),
+ 106: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {"label": "Event calendar", "page_type": ["events.EventsIndexPage"]},
+ ),
+ 107: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 24),
+ ("heading_tag", 97),
+ ("index_page", 106),
+ ("entries_count", 99),
+ ("category_filter", 100),
+ ("tag_filter", 101),
+ ("author_filter", 102),
+ ("source_filter", 103),
+ ("show_filters", 104),
+ ]
+ ],
+ {"group": "Website structure", "label": "Event calendar recent entries"},
+ ),
+ 108: (
+ "wagtail.blocks.StreamBlock",
+ [[("badge", 81)]],
+ {
+ "help_text": "Only used if the card has an image.",
+ "label": "Image area badge",
+ "max_num": 1,
+ "required": False,
+ },
+ ),
+ 109: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "group": "target",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Link (obsolete)",
+ "required": False,
+ },
+ ),
+ 110: (
+ "wagtail.documents.blocks.DocumentChooserBlock",
+ (),
+ {
+ "group": "target",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "or Document (obsolete)",
+ "required": False,
+ },
+ ),
+ 111: ("wagtail.blocks.CharBlock", (), {"label": "Top detail: text", "required": False}),
+ 112: (
+ "content_manager.blocks.IconPickerBlock",
+ (),
+ {"label": "Top detail: icon", "required": False},
+ ),
+ 113: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "Incompatible with the bottom call-to-action.",
+ "label": "Bottom detail: text",
+ "required": False,
+ },
+ ),
+ 114: (
+ "content_manager.blocks.IconPickerBlock",
+ (),
+ {"label": "Bottom detail: icon", "required": False},
+ ),
+ 115: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 4), ("document", 5), ("external_url", 6), ("text", 7)]],
+ {"label": "Link"},
+ ),
+ 116: ("wagtail.blocks.StreamBlock", [[("link", 115)]], {}),
+ 117: (
+ "wagtail.blocks.StreamBlock",
+ [[("links", 116), ("buttons", 64)]],
+ {
+ "help_text": "Incompatible with the bottom detail text.",
+ "label": "Bottom call-to-action: links or buttons",
+ "max_num": 1,
+ "required": False,
+ },
+ ),
+ 118: (
+ "wagtail.blocks.BooleanBlock",
+ (),
+ {"label": "Card with grey background", "required": False},
+ ),
+ 119: ("wagtail.blocks.BooleanBlock", (), {"label": "Card without background", "required": False}),
+ 120: ("wagtail.blocks.BooleanBlock", (), {"label": "Card without border", "required": False}),
+ 121: ("wagtail.blocks.BooleanBlock", (), {"label": "Card with a shadow", "required": False}),
+ 122: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 41),
+ ("heading_tag", 45),
+ ("description", 47),
+ ("image", 15),
+ ("image_ratio", 29),
+ ("image_badge", 108),
+ ("link", 77),
+ ("url", 109),
+ ("document", 110),
+ ("top_detail_text", 111),
+ ("top_detail_icon", 112),
+ ("top_detail_badges_tags", 88),
+ ("bottom_detail_text", 113),
+ ("bottom_detail_icon", 114),
+ ("call_to_action", 117),
+ ("grey_background", 118),
+ ("no_background", 119),
+ ("no_border", 120),
+ ("shadow", 121),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Vertical card"},
+ ),
+ 123: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("3", "3/12"),
+ ("4", "4/12"),
+ ("5", "5/12"),
+ ("6", "6/12"),
+ ("7", "7/12"),
+ ("8", "8/12"),
+ ("9", "9/12"),
+ ],
+ "help_text": "The total width of all columns should be 12.",
+ "label": "Column width",
+ "required": False,
+ },
+ ),
+ 124: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Person",),
+ {
+ "help_text": "Optional, all values can be manually specified or overriden below",
+ "label": "Person",
+ "required": False,
+ },
+ ),
+ 125: ("wagtail.blocks.CharBlock", (), {"label": "Name", "max_length": 255, "required": False}),
+ 126: ("wagtail.blocks.CharBlock", (), {"label": "Role", "max_length": 255, "required": False}),
+ 127: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"label": "Organization", "max_length": 255, "required": False},
+ ),
+ 128: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"label": "Contact info", "max_length": 500, "required": False},
+ ),
+ 129: ("wagtail.blocks.StreamBlock", [[("tag", 86)]], {"label": "Tags", "required": False}),
+ 130: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("contact", 124),
+ ("link", 77),
+ ("heading_tag", 26),
+ ("name", 125),
+ ("role", 126),
+ ("organization", 127),
+ ("contact_info", 128),
+ ("image", 15),
+ ("tags", 129),
+ ]
+ ],
+ {"group": "Extra components", "label": "Contact card"},
+ ),
+ 131: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 32),
+ ("video", 39),
+ ("transcription", 40),
+ ("accordions", 44),
+ ("callout", 51),
+ ("highlight", 54),
+ ("quote", 55),
+ ("stepper", 61),
+ ("text_cta", 68),
+ ("link", 69),
+ ("iframe", 74),
+ ("tile", 96),
+ ("blog_recent_entries", 105),
+ ("events_recent_entries", 107),
+ ("card", 122),
+ ("contact_card", 130),
+ ]
+ ],
+ {"label": "Column content"},
+ ),
+ 132: (
+ "wagtail.blocks.StructBlock",
+ [[("width", 123), ("content", 131)]],
+ {"group": "Page structure", "label": "Adjustable column"},
+ ),
+ 133: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 32),
+ ("video", 39),
+ ("transcription", 40),
+ ("accordions", 44),
+ ("callout", 51),
+ ("highlight", 54),
+ ("quote", 55),
+ ("stepper", 61),
+ ("text_cta", 68),
+ ("link", 69),
+ ("iframe", 74),
+ ("tile", 96),
+ ("blog_recent_entries", 105),
+ ("events_recent_entries", 107),
+ ("card", 122),
+ ("column", 132),
+ ]
+ ],
+ {"label": "Columns"},
+ ),
+ 134: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("bg_image", 21),
+ ("bg_color_class", 22),
+ ("bg_color", 23),
+ ("title", 24),
+ ("heading_tag", 25),
+ ("columns", 133),
+ ]
+ ],
+ {"label": "Multi-colonnes"},
+ ),
+ 135: ("wagtail.blocks.CharBlock", (), {"label": "Name", "max_length": 255}),
+ 136: ("wagtail.blocks.CharBlock", (), {"label": "Role", "max_length": 255}),
+ 137: ("wagtail.blocks.CharBlock", (), {"label": "Organization", "max_length": 255}),
+ 138: (
+ "wagtail.blocks.StructBlock",
+ [[("name", 135), ("role", 136), ("organization", 137), ("contact_info", 128), ("image", 1)]],
+ {"label": "Contact card"},
+ ),
+ },
+ help_text="Text displayed at the end of every page in the category",
+ ),
+ ),
+ ]
diff --git a/blog/models.py b/blog/models.py
index 96b85a2f..3cca040f 100644
--- a/blog/models.py
+++ b/blog/models.py
@@ -5,21 +5,23 @@
from django.db import models
from django.db.models import BooleanField, Count, QuerySet
from django.db.models.expressions import F
+from django.http import HttpRequest, HttpResponse
from django.shortcuts import get_object_or_404
from django.template.defaultfilters import slugify
-from django.urls import reverse
-from django.utils import timezone
-from django.utils.translation import get_language, gettext_lazy as _
+from django.utils import feedgenerator, timezone
+from django.utils.translation import gettext_lazy as _
from modelcluster.fields import ParentalKey, ParentalManyToManyField
from modelcluster.tags import ClusterTaggableManager
from rest_framework import serializers
from taggit.models import TaggedItemBase
+from unidecode import unidecode
from wagtail.admin.panels import FieldPanel, FieldRowPanel, MultiFieldPanel, TitleFieldPanel
from wagtail.admin.widgets.slug import SlugInput
from wagtail.api import APIField
+from wagtail.contrib.routable_page.models import RoutablePageMixin, path
from wagtail.fields import RichTextField, StreamField
from wagtail.models import Orderable
-from wagtail.models.i18n import Locale, TranslatableMixin
+from wagtail.models.i18n import TranslatableMixin
from wagtail.search import index
from wagtail.snippets.models import register_snippet
@@ -192,13 +194,19 @@ class TagEntryPage(TaggedItemBase):
content_object = ParentalKey("BlogEntryPage", related_name="entry_tags")
-class BlogIndexPage(SitesFacilesBasePage):
+class BlogIndexPage(RoutablePageMixin, SitesFacilesBasePage):
posts_per_page = models.PositiveSmallIntegerField(
default=10,
validators=[MaxValueValidator(100), MinValueValidator(1)],
verbose_name=_("Posts per page"),
)
+ feed_posts_limit = models.PositiveSmallIntegerField(
+ default=20,
+ validators=[MaxValueValidator(100), MinValueValidator(1)],
+ verbose_name=_("Post limit in the RSS/Atom feeds"),
+ )
+
# Filters
filter_by_category = models.BooleanField(_("Filter by category"), default=True)
filter_by_tag = models.BooleanField(_("Filter by tag"), default=True)
@@ -209,6 +217,7 @@ class BlogIndexPage(SitesFacilesBasePage):
settings_panels = SitesFacilesBasePage.settings_panels + [
FieldPanel("posts_per_page"),
+ FieldPanel("feed_posts_limit"),
MultiFieldPanel(
[
FieldPanel("filter_by_category"),
@@ -234,16 +243,14 @@ def posts(self):
)
return posts
- def get_context(self, request, tag=None, category=None, author=None, source=None, year=None, *args, **kwargs):
+ def get_context(self, request, *args, **kwargs):
context = super(BlogIndexPage, self).get_context(request, *args, **kwargs)
posts = self.posts
- locale = Locale.objects.get(language_code=get_language())
extra_breadcrumbs = None
extra_title = ""
- if tag is None:
- tag = request.GET.get("tag")
+ tag = request.GET.get("tag")
if tag:
tag = get_object_or_404(Tag, slug=tag)
posts = posts.filter(tags=tag)
@@ -251,7 +258,7 @@ def get_context(self, request, tag=None, category=None, author=None, source=None
"links": [
{"url": self.get_url(), "title": self.title},
{
- "url": reverse("blog:tags_list", kwargs={"blog_slug": self.slug}),
+ "url": f"{self.get_url()}{self.reverse_subpage('tags_list')}",
"title": _("Tags"),
},
],
@@ -259,17 +266,16 @@ def get_context(self, request, tag=None, category=None, author=None, source=None
}
extra_title = _("Posts tagged with %(tag)s") % {"tag": tag}
- if category is None:
- category = request.GET.get("category")
+ category = request.GET.get("category")
if category:
- category = get_object_or_404(Category, slug=category, locale=locale)
+ category = get_object_or_404(Category, slug=category, locale=self.locale)
posts = posts.filter(blog_categories=category)
extra_breadcrumbs = {
"links": [
{"url": self.get_url(), "title": self.title},
{
- "url": reverse("blog:categories_list", kwargs={"blog_slug": self.slug}),
+ "url": f"{self.get_url()}{self.reverse_subpage('categories_list')}",
"title": _("Categories"),
},
],
@@ -277,8 +283,7 @@ def get_context(self, request, tag=None, category=None, author=None, source=None
}
extra_title = _("Posts in category %(category)s") % {"category": category.name}
- if source is None:
- source = request.GET.get("source")
+ source = request.GET.get("source")
if source:
source = get_object_or_404(Organization, slug=source)
posts = posts.filter(authors__organization=source)
@@ -290,8 +295,7 @@ def get_context(self, request, tag=None, category=None, author=None, source=None
}
extra_title = _("Posts written by") + f" {source.name}"
- if author is None:
- author = request.GET.get("author")
+ author = request.GET.get("author")
if author:
author = get_object_or_404(Person, id=author)
@@ -304,6 +308,7 @@ def get_context(self, request, tag=None, category=None, author=None, source=None
posts = posts.filter(authors=author)
extra_title = _("Posts written by") + f" {author.name}"
+ year = request.GET.get("year")
if year:
posts = posts.filter(date__year=year)
extra_title = _("Posts published in %(year)s") % {"year": year}
@@ -380,6 +385,129 @@ def list_tags(self, min_count: int = 1) -> list:
def show_filters(self) -> bool | BooleanField:
return self.filter_by_category or self.filter_by_tag or self.filter_by_author or self.filter_by_source
+ def feed_posts(self, feed, request):
+ """
+ Returns the posts for a RSS or ATOM feed relative to the parameters
+ """
+ posts = self.posts
+
+ category = request.GET.get("category")
+ if category:
+ category = get_object_or_404(Category, slug=category, locale=self.locale)
+ posts = posts.filter(blog_categories=category)
+
+ limit = int(request.GET.get("limit", self.feed_posts_limit))
+ posts = posts[:limit]
+
+ for post in posts:
+ feed.add_item(
+ post.title,
+ post.full_url,
+ pubdate=post.date,
+ description=post.search_description,
+ )
+
+ return feed
+
+ @path("rss/", name="rss_feed")
+ def rss_view(self, request: HttpRequest, *args, **kwargs) -> HttpResponse:
+ """
+ Return the current blog as a RSS feed
+ """
+
+ if self.seo_title:
+ title = self.seo_title
+ else:
+ title = self.title
+
+ feed = feedgenerator.Rss201rev2Feed(
+ title=title,
+ link=self.full_url,
+ description=self.search_description,
+ language=self.locale.language_code,
+ feed_url=f"{self.full_url}{self.reverse_subpage('rss_feed')}",
+ )
+ feed = self.feed_posts(feed, request)
+
+ response = HttpResponse(feed.writeString("UTF-8"), content_type="application/xml")
+ return response
+
+ @path("atom/", name="atom_feed")
+ def atom_view(self, request: HttpRequest, *args, **kwargs) -> HttpResponse:
+ """
+ Return the current blog as an Atom feed
+ """
+
+ if self.seo_title:
+ title = self.seo_title
+ else:
+ title = self.title
+
+ feed = feedgenerator.Atom1Feed(
+ title=title,
+ link=self.full_url,
+ description=self.search_description,
+ language=self.locale.language_code,
+ feed_url=f"{self.full_url}{self.reverse_subpage('atom_feed')}",
+ )
+ feed = self.feed_posts(feed, request)
+
+ response = HttpResponse(feed.writeString("UTF-8"), content_type="application/xml")
+ return response
+
+ @path("categories/", name="categories_list")
+ def categories_list(self, request: HttpRequest, *args, **kwargs) -> HttpResponse:
+ extra_title = _("Categories")
+ categories = self.list_categories()
+
+ extra_breadcrumbs = {
+ "links": [
+ {"url": self.get_url(), "title": self.title},
+ ],
+ "current": _("Categories"),
+ }
+
+ return self.render(
+ request,
+ context_overrides={
+ "categories": categories,
+ "page": self,
+ "extra_title": extra_title,
+ "extra_breadcrumbs": extra_breadcrumbs,
+ },
+ template="blog/categories_list_page.html",
+ )
+
+ @path("tags/", name="tags_list")
+ def tags_list(self, request: HttpRequest, *args, **kwargs) -> HttpResponse:
+ extra_title = _("Tags")
+ tags = self.list_tags()
+
+ tags_by_first_letter = {}
+ for tag in tags:
+ first_letter = unidecode(tag["tag_slug"][0].upper())
+ if first_letter not in tags_by_first_letter:
+ tags_by_first_letter[first_letter] = []
+ tags_by_first_letter[first_letter].append(tag)
+
+ extra_breadcrumbs = {
+ "links": [
+ {"url": self.get_url(), "title": self.title},
+ ],
+ "current": _("Tags"),
+ }
+
+ return self.render(
+ request,
+ context_overrides={
+ "sorted_tags": tags_by_first_letter,
+ "page": self,
+ "extra_title": extra_title,
+ "extra_breadcrumbs": extra_breadcrumbs,
+ },
+ template="blog/tags_list_page.html",
+ )
+
class BlogEntryPage(SitesFacilesBasePage):
tags = ClusterTaggableManager(through="TagEntryPage", blank=True)
diff --git a/blog/templates/blog/blocks/feeds.html b/blog/templates/blog/blocks/feeds.html
new file mode 100644
index 00000000..b3d95651
--- /dev/null
+++ b/blog/templates/blog/blocks/feeds.html
@@ -0,0 +1,27 @@
+
+{% load wagtailroutablepage_tags i18n %}
+
+
diff --git a/blog/templates/blog/blog_entry_page.html b/blog/templates/blog/blog_entry_page.html
index 65157c5f..b8d5ea20 100644
--- a/blog/templates/blog/blog_entry_page.html
+++ b/blog/templates/blog/blog_entry_page.html
@@ -51,7 +51,12 @@
{% include "content_manager/blocks/breadcrumbs.html" %}
-
{{ page.title }}
+ {% if not page.header_with_title %}
+
+ {{ page.title }}
+ {% include "content_manager/blocks/page_visibility.html" %}
+
+ {% endif %}
diff --git a/blog/templates/blog/blog_index_page.html b/blog/templates/blog/blog_index_page.html
index ec187e8f..6170c9fe 100644
--- a/blog/templates/blog/blog_index_page.html
+++ b/blog/templates/blog/blog_index_page.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-{% load static dsfr_tags wagtailcore_tags wagtailimages_tags wagtail_dsfr_tags i18n %}
+{% load static dsfr_tags wagtailcore_tags wagtailimages_tags wagtailroutablepage_tags wagtail_dsfr_tags i18n %}
{% block title %}
{{ page.seo_title|default:page.title }} — {{ settings.content_manager.CmsDsfrConfig.site_title }}
@@ -19,6 +19,14 @@
+
+
{% if page.get_translations.live %}
{% for translation in page.get_translations.live %}
@@ -145,6 +153,7 @@ {% translate "Filter by source" %}
{% if posts.paginator.num_pages > 1 %}
{% dsfr_pagination posts %}
{% endif %}
+ {% include "blog/blocks/feeds.html" %}
{% else %}
@@ -152,6 +161,7 @@ {% translate "Filter by source" %}
{% if posts.paginator.num_pages > 1 %}
{% dsfr_pagination posts %}
{% endif %}
+ {% include "blog/blocks/feeds.html" %}
{% endif %}
{% endblock content %}
diff --git a/blog/templates/blog/categories_list_page.html b/blog/templates/blog/categories_list_page.html
index 9750c4e6..72729f73 100644
--- a/blog/templates/blog/categories_list_page.html
+++ b/blog/templates/blog/categories_list_page.html
@@ -16,8 +16,13 @@
{% include "content_manager/blocks/messages.html" %}
- {% dsfr_breadcrumb breadcrumb %}
-
{% translate "Categories" %}
+ {% include "content_manager/blocks/breadcrumbs.html" %}
+ {% if not page.header_with_title %}
+
+ {{ page.title }}
+ {% if extra_title %}: {{ extra_title }}{% endif %}
+
+ {% endif %}
{% for category in categories|dictsort:"cat_name" %}
-
diff --git a/blog/tests.py b/blog/tests.py
deleted file mode 100644
index d2b618f3..00000000
--- a/blog/tests.py
+++ /dev/null
@@ -1,4 +0,0 @@
-# from django.test import TestCase
-
-
-# Create your tests here.
diff --git a/blog/tests/__init__.py b/blog/tests/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/blog/tests/test_views.py b/blog/tests/test_views.py
new file mode 100644
index 00000000..4be9d8d9
--- /dev/null
+++ b/blog/tests/test_views.py
@@ -0,0 +1,112 @@
+import zoneinfo
+from datetime import datetime
+
+from django.contrib.auth.models import User
+from wagtail.models import Page
+from wagtail.test.utils import WagtailPageTestCase
+
+from blog.models import BlogEntryPage, BlogIndexPage, Person
+from content_manager.models import ContentPage
+
+
+class BlogTestCase(WagtailPageTestCase):
+ def setUp(self):
+ self.home = Page.objects.get(slug="home")
+ self.admin = User.objects.create_superuser("test", "test@test.test", "pass")
+ self.admin.save()
+ self.blog_index_page = self.home.add_child(
+ instance=BlogIndexPage(
+ title="Actualités",
+ slug="actualités",
+ owner=self.admin,
+ )
+ )
+ self.blog_index_page.save()
+
+ self.paris_tz = zoneinfo.ZoneInfo("Europe/Paris")
+ self.blog_post = self.blog_index_page.add_child(
+ instance=BlogEntryPage(
+ title="J’accuse",
+ date=datetime(1898, 6, 13, 6, 0, 0, tzinfo=self.paris_tz),
+ owner=self.admin,
+ )
+ )
+
+ self.emile = Person.objects.create(name="Émile Zola")
+ self.blog_post.authors.add(self.emile)
+ self.blog_post.save()
+
+ def test_blog_index_page_is_renderable(self):
+ self.assertPageIsRenderable(self.blog_index_page)
+
+ def test_blog_index_page_has_minimal_content(self):
+ response = self.client.get(self.blog_index_page.url)
+ self.assertEqual(response.status_code, 200)
+
+ self.assertContains(
+ response,
+ "Actualités — Titre du site",
+ )
+
+ def test_blog_index_page_has_posts(self):
+ response = self.client.get(self.blog_index_page.url)
+
+ self.assertContains(
+ response,
+ "J’accuse",
+ )
+ self.assertContains(
+ response,
+ "Publié le lundi 13 juin 1898",
+ )
+
+ def test_blog_post_is_renderable(self):
+ self.assertPageIsRenderable(self.blog_post)
+
+ def test_blog_post_has_minimal_content(self):
+ response = self.client.get(self.blog_post.url)
+ self.assertEqual(response.status_code, 200)
+
+ self.assertContains(
+ response,
+ "J’accuse — Titre du site",
+ )
+
+ def test_blog_has_rss_feed(self):
+ response = self.client.get(self.blog_index_page.url + "rss/")
+ self.assertEqual(response.status_code, 200)
+
+ def test_deep_blog_works(self):
+ new_parent = self.home.add_child(
+ instance=ContentPage(
+ title="Page intermédiaire",
+ owner=self.admin,
+ )
+ )
+ deep_blog_index_page = new_parent.add_child(
+ instance=BlogIndexPage(
+ title="Nouveau blog",
+ slug="nouveau-blog",
+ owner=self.admin,
+ )
+ )
+ deep_blog_index_page.save()
+
+ new_blog_post = deep_blog_index_page.add_child(
+ instance=BlogEntryPage(
+ title="Livres d’aujourd’hui et de demain",
+ date=datetime(1869, 9, 7, 6, 0, 0, tzinfo=self.paris_tz),
+ owner=self.admin,
+ )
+ )
+ new_blog_post.authors.add(self.emile)
+ new_blog_post.save()
+
+ self.assertPageIsRenderable(deep_blog_index_page)
+
+ self.assertPageIsRenderable(new_blog_post)
+
+ response = self.client.get(deep_blog_index_page.url + "rss/")
+ print(deep_blog_index_page.url + "rss/")
+ print(response)
+ self.assertEqual(response.status_code, 200)
diff --git a/blog/urls.py b/blog/urls.py
deleted file mode 100644
index 4d66fad7..00000000
--- a/blog/urls.py
+++ /dev/null
@@ -1,29 +0,0 @@
-from django.urls.conf import path
-
-from blog import views
-
-app_name = "blog"
-
-urlpatterns = [
- path(
- "/categories//feed/",
- views.LatestCategoryFeed(),
- name="category_feed",
- ),
- path("/categories/", views.CategoriesListView.as_view(), name="categories_list"),
- path("/categories//", views.category_view, name="category"),
- path("/tags//", views.tag_view, name="tag"),
- path("/tags/", views.TagsListView.as_view(), name="tags_list"),
- path("/authors//", views.author_view, name="author"),
- path("/archives//", views.year_view, name="archive_year"),
- path(
- "/rss/",
- views.LatestEntriesFeed(),
- name="latest_entries_feed",
- ),
- path(
- "/atom/",
- views.LatestEntriesFeedAtom(),
- name="latest_entries_feed_atom",
- ),
-]
diff --git a/blog/views.py b/blog/views.py
index ee8845ec..60f00ef0 100644
--- a/blog/views.py
+++ b/blog/views.py
@@ -1,155 +1 @@
-from django.contrib.syndication.views import Feed
-from django.shortcuts import get_object_or_404
-from django.utils.feedgenerator import Atom1Feed
-from django.utils.translation import get_language, gettext_lazy as _
-from django.views.generic import TemplateView
-from unidecode import unidecode
-from wagtail.models.i18n import Locale
-
-from blog.models import BlogEntryPage, BlogIndexPage, Category
-
-
-def get_localized_index(slug):
- locale = Locale.objects.get(language_code=get_language())
- return get_object_or_404(BlogIndexPage, locale=locale, slug=slug)
-
-
-def tag_view(request, blog_slug: str, tag: str):
- index = get_localized_index(blog_slug)
- return index.serve(request, tag=tag)
-
-
-def category_view(request, blog_slug: str, category: str):
- index = get_localized_index(blog_slug)
- return index.serve(request, category=category)
-
-
-def author_view(request, blog_slug: str, author_id: str):
- index = get_localized_index(blog_slug)
- return index.serve(request, author=author_id)
-
-
-def year_view(request, blog_slug: str, year: str):
- index = get_localized_index(blog_slug)
- return index.serve(request, year=year)
-
-
-class LatestEntriesFeed(Feed):
- """
- If a URL ends with "rss" try to find a matching BlogIndexPage
- and return its items.
- """
-
- def get_object(self, request, *args, **kwargs):
- blog_slug = kwargs.pop("blog_slug")
- return get_object_or_404(BlogIndexPage, slug=blog_slug)
-
- def title(self, blog):
- if blog.seo_title: # pragma: no cover
- return blog.seo_title
- return blog.title
-
- def link(self, blog):
- return blog.full_url
-
- def description(self, blog):
- return blog.search_description
-
- def items(self, blog):
- return blog.get_descendants().order_by("-first_published_at")[:10]
-
- def item_title(self, item):
- return item.title
-
- def item_description(self, item):
- return item.specific.body
-
- def item_link(self, item):
- return item.full_url
-
- def item_pubdate(self, blog):
- return blog.first_published_at
-
-
-class LatestEntriesFeedAtom(LatestEntriesFeed):
- feed_type = Atom1Feed
-
-
-class LatestCategoryFeed(Feed):
- description = "A Blog"
-
- def title(self, category):
- return "Blog: " + category.name
-
- def link(self, category):
- return "/blog/category/" + category.slug
-
- def get_object(self, request, *args, **kwargs):
- category = kwargs.pop("category")
- return get_object_or_404(Category, slug=category)
-
- def items(self, obj):
- return BlogEntryPage.objects.filter(blog_categories=obj).order_by("-date")[:5]
-
- def item_title(self, item):
- return item.title
-
- def item_description(self, item):
- return item.body
-
-
-class CategoriesListView(TemplateView):
- template_name = "blog/categories_list_page.html"
-
- def get_context_data(self, **kwargs):
- context = super().get_context_data(**kwargs)
-
- categories = []
- blog_slug = kwargs.get("blog_slug")
- blog_index = get_localized_index(blog_slug)
- if blog_index:
- categories = blog_index.list_categories()
-
- breadcrumb = {
- "links": [
- {"url": blog_index.get_url(), "title": blog_index.title},
- ],
- "current": _("Categories"),
- }
-
- context["categories"] = categories
- context["page"] = blog_index
- context["breadcrumb"] = breadcrumb
- return context
-
-
-class TagsListView(TemplateView):
- template_name = "blog/tags_list_page.html"
-
- def get_context_data(self, **kwargs):
- context = super().get_context_data(**kwargs)
-
- tags = []
- blog_slug = kwargs.get("blog_slug")
- blog_index = get_localized_index(blog_slug)
- if blog_index:
- tags = blog_index.list_tags()
-
- tags_by_first_letter = {}
- for tag in tags:
- first_letter = unidecode(tag["tag_slug"][0].upper())
- if first_letter not in tags_by_first_letter:
- tags_by_first_letter[first_letter] = []
- tags_by_first_letter[first_letter].append(tag)
-
- breadcrumb = {
- "links": [
- {"url": blog_index.get_url(), "title": blog_index.title},
- ],
- "current": _("Tags"),
- }
-
- context["sorted_tags"] = tags_by_first_letter
- context["page"] = blog_index
- context["breadcrumb"] = breadcrumb
- return context
+# Create your views here.
diff --git a/config/urls.py b/config/urls.py
index af33b678..68a5e10c 100644
--- a/config/urls.py
+++ b/config/urls.py
@@ -14,7 +14,6 @@
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += i18n_patterns(
- path("", include("blog.urls", namespace="blog")),
path("", include("content_manager.urls")),
prefix_default_language=False,
)
diff --git a/content_manager/blocks.py b/content_manager/blocks.py
index 8f5c99fe..b37a94e3 100644
--- a/content_manager/blocks.py
+++ b/content_manager/blocks.py
@@ -717,6 +717,91 @@ class Meta:
template = "content_manager/blocks/video.html"
+class VerticalContactCardStructValue(blocks.StructValue):
+ def display(self):
+ contact = self.get("contact", None)
+
+ name = self.get("name", "")
+ if contact and not name:
+ name = contact.name
+
+ role = self.get("role", "")
+ if contact and not role:
+ role = contact.role
+
+ organization = self.get("organization", "")
+ if contact and not organization:
+ organization = contact.organization.name
+
+ image = self.get("image", "")
+ if contact and not image:
+ image = contact.image
+
+ return {"name": name, "role": role, "organization": organization, "image": image}
+
+ def enlarge_link(self):
+ """
+ Determine if we need (and can) enlarge the link on the card.
+ This requires:
+ - That a link is present
+ - That no other link is used on the card (such as a tag with a link, or a call-to-action)
+ """
+ link = self.get("link")
+ tags = self.get("tags")
+ call_to_action = self.get("call_to_action", "")
+
+ if not (link and link.url()):
+ return False
+
+ enlarge = True
+ if len(call_to_action):
+ enlarge = False
+ elif len(tags):
+ print(tags)
+ print(tags.raw_data)
+ tags_list = tags.raw_data
+ for tag in tags_list:
+ if (
+ tag["value"]["link"]["page"] is not None
+ or tag["value"]["link"]["document"] is not None
+ or tag["value"]["link"]["external_url"] != ""
+ ):
+ enlarge = False
+
+ return enlarge
+
+
+class VerticalContactCardBlock(blocks.StructBlock):
+ contact = SnippetChooserBlock(
+ "blog.Person",
+ label=_("Person"),
+ help_text=_("Optional, all values can be manually specified or overriden below"),
+ required=False,
+ )
+ link = LinkWithoutLabelBlock(
+ label=_("Link"),
+ required=False,
+ )
+ heading_tag = blocks.ChoiceBlock(
+ label=_("Heading level"),
+ choices=HEADING_CHOICES,
+ required=False,
+ default="h3",
+ help_text=_("Adapt to the page layout. Defaults to heading 3."),
+ )
+ name = blocks.CharBlock(label=_("Name"), max_length=255, required=False)
+ role = blocks.CharBlock(label=_("Role"), max_length=255, required=False)
+ organization = blocks.CharBlock(label=_("Organization"), max_length=255, required=False)
+ contact_info = blocks.CharBlock(label=_("Contact info"), max_length=500, required=False)
+ image = ImageChooserBlock(label="Image", required=False)
+ tags = TagListBlock(label=_("Tags"), required=False)
+
+ class Meta:
+ icon = "user"
+ value_class = VerticalContactCardStructValue
+ template = ("content_manager/blocks/contact_card_vertical.html",)
+
+
## Other apps-related blocks
class RecentEntriesStructValue(blocks.StructValue):
"""
@@ -877,6 +962,7 @@ class Meta:
class ColumnBlock(CommonStreamBlock):
card = VerticalCardBlock(label=_("Vertical card"), group=_("DSFR components"))
+ contact_card = VerticalContactCardBlock(label=_("Contact card"), group=_("Extra components"))
class ItemGridBlock(blocks.StructBlock):
diff --git a/content_manager/locale/fr/LC_MESSAGES/django.mo b/content_manager/locale/fr/LC_MESSAGES/django.mo
index 1e68d355..2b741e94 100644
Binary files a/content_manager/locale/fr/LC_MESSAGES/django.mo and b/content_manager/locale/fr/LC_MESSAGES/django.mo differ
diff --git a/content_manager/locale/fr/LC_MESSAGES/django.po b/content_manager/locale/fr/LC_MESSAGES/django.po
index 1cc92ae1..9cb6feb7 100644
--- a/content_manager/locale/fr/LC_MESSAGES/django.po
+++ b/content_manager/locale/fr/LC_MESSAGES/django.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-10-24 15:55+0200\n"
-"PO-Revision-Date: 2024-10-24 15:55+0200\n"
+"POT-Creation-Date: 2024-12-05 15:22+0100\n"
+"PO-Revision-Date: 2024-12-05 15:23+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: fr\n"
@@ -26,13 +26,13 @@ msgstr "Afficher le titre sur l’image d’en-tête ?"
msgid "Header image"
msgstr "Image d’en-tête"
-#: content_manager/abstract.py:39 content_manager/blocks.py:939
-#: content_manager/blocks.py:980 content_manager/blocks.py:1013
+#: content_manager/abstract.py:39 content_manager/blocks.py:1025
+#: content_manager/blocks.py:1066 content_manager/blocks.py:1099
msgid "Background color"
msgstr "Couleur de fond"
-#: content_manager/abstract.py:43 content_manager/blocks.py:941
-#: content_manager/blocks.py:982 content_manager/blocks.py:1015
+#: content_manager/abstract.py:43 content_manager/blocks.py:1027
+#: content_manager/blocks.py:1068 content_manager/blocks.py:1101
msgid "Uses the French Design System colors"
msgstr "Utilise les couleurs du système de design de l'État"
@@ -147,7 +147,7 @@ msgstr "Libellé du lien"
#: content_manager/blocks.py:107 content_manager/blocks.py:282
#: content_manager/blocks.py:390 content_manager/blocks.py:533
-#: content_manager/blocks.py:594
+#: content_manager/blocks.py:594 content_manager/blocks.py:782
msgid "Link"
msgstr "Lien"
@@ -214,9 +214,9 @@ msgstr "Badge"
#: content_manager/blocks.py:427 content_manager/blocks.py:451
#: content_manager/blocks.py:493 content_manager/blocks.py:568
#: content_manager/blocks.py:623 content_manager/blocks.py:632
-#: content_manager/blocks.py:681 content_manager/blocks.py:795
-#: content_manager/blocks.py:825 content_manager/blocks.py:896
-#: content_manager/blocks.py:952 content_manager/models.py:393
+#: content_manager/blocks.py:681 content_manager/blocks.py:880
+#: content_manager/blocks.py:910 content_manager/blocks.py:982
+#: content_manager/blocks.py:1038 content_manager/models.py:393
msgid "Title"
msgstr "Titre"
@@ -239,27 +239,28 @@ msgstr "Tag"
#: content_manager/blocks.py:265 content_manager/blocks.py:380
#: content_manager/blocks.py:439 content_manager/blocks.py:453
-#: content_manager/blocks.py:570 content_manager/blocks.py:797
-#: content_manager/blocks.py:827 content_manager/blocks.py:954
+#: content_manager/blocks.py:570 content_manager/blocks.py:786
+#: content_manager/blocks.py:882 content_manager/blocks.py:912
+#: content_manager/blocks.py:1040
msgid "Heading level"
msgstr "Niveau de titre"
#: content_manager/blocks.py:268 content_manager/blocks.py:383
#: content_manager/blocks.py:442 content_manager/blocks.py:456
-#: content_manager/blocks.py:574
+#: content_manager/blocks.py:574 content_manager/blocks.py:790
msgid "Adapt to the page layout. Defaults to heading 3."
msgstr "À adapter à la structure de la page. Par défaut en-tête 3."
#: content_manager/blocks.py:270 content_manager/blocks.py:386
#: content_manager/blocks.py:423 content_manager/blocks.py:460
-#: content_manager/blocks.py:474 content_manager/blocks.py:897
-#: content_manager/blocks.py:984
+#: content_manager/blocks.py:474 content_manager/blocks.py:983
+#: content_manager/blocks.py:1070
msgid "Content"
msgstr "Contenu"
#: content_manager/blocks.py:271 content_manager/blocks.py:388
#: content_manager/blocks.py:513 content_manager/blocks.py:576
-#: content_manager/blocks.py:602 content_manager/blocks.py:857
+#: content_manager/blocks.py:602 content_manager/blocks.py:942
msgid "Image"
msgstr "Image"
@@ -455,7 +456,7 @@ msgid "Image width"
msgstr "Largeur de l’image"
#: content_manager/blocks.py:531 content_manager/blocks.py:642
-#: content_manager/blocks.py:856 content_manager/blocks.py:1027
+#: content_manager/blocks.py:941 content_manager/blocks.py:1113
msgid "Rich text"
msgstr "Texte avec mise en forme"
@@ -487,8 +488,8 @@ msgstr "Largeur"
msgid "Caption"
msgstr "LĂ©gende"
-#: content_manager/blocks.py:603 content_manager/blocks.py:863
-#: content_manager/blocks.py:1034
+#: content_manager/blocks.py:603 content_manager/blocks.py:948
+#: content_manager/blocks.py:1120
msgid "Quote"
msgstr "Citation"
@@ -559,169 +560,209 @@ msgstr ""
msgid "Video ratio"
msgstr "Ratio de la vidéo"
-#: content_manager/blocks.py:713 content_manager/blocks.py:859
-#: content_manager/blocks.py:1036
+#: content_manager/blocks.py:713 content_manager/blocks.py:944
+#: content_manager/blocks.py:1122
msgid "Transcription"
msgstr "Transcription"
-#: content_manager/blocks.py:801 content_manager/blocks.py:831
-#: content_manager/blocks.py:958
+#: content_manager/blocks.py:777
+msgid "Person"
+msgstr "Personne"
+
+#: content_manager/blocks.py:778
+msgid "Optional, all values can be manually specified or overriden below"
+msgstr ""
+"Optionnel, toutes les valeurs peuvent être spécifiées ou surchargées ci-"
+"dessous"
+
+#: content_manager/blocks.py:792 content_manager/models.py:425
+msgid "Name"
+msgstr "Nom"
+
+#: content_manager/blocks.py:793
+msgid "Role"
+msgstr "Fonction"
+
+#: content_manager/blocks.py:794
+msgid "Organization"
+msgstr "Organisation"
+
+#: content_manager/blocks.py:795
+msgid "Contact info"
+msgstr "Informations de contact"
+
+#: content_manager/blocks.py:797
+#: content_manager/templates/content_manager/tags_list_page.html:31
+#: content_manager/views.py:46 content_manager/views.py:77
+msgid "Tags"
+msgstr "Étiquettes"
+
+#: content_manager/blocks.py:886 content_manager/blocks.py:916
+#: content_manager/blocks.py:1044
msgid "Adapt to the page layout. Defaults to heading 2."
msgstr "À adapter à la structure de la page. Par défaut en-tête 2."
-#: content_manager/blocks.py:803
+#: content_manager/blocks.py:888
msgid "Blog"
msgstr "Blog"
-#: content_manager/blocks.py:805 content_manager/blocks.py:835
+#: content_manager/blocks.py:890 content_manager/blocks.py:920
msgid "Number of entries"
msgstr "Nombre d’articles"
-#: content_manager/blocks.py:807 content_manager/blocks.py:837
+#: content_manager/blocks.py:892 content_manager/blocks.py:922
#: content_manager/templates/content_manager/blocks/blog_recent_entries.html:11
#: content_manager/templates/content_manager/blocks/events_recent_entries.html:11
msgid "Filter by category"
msgstr "Filtrer par catégorie"
-#: content_manager/blocks.py:808 content_manager/blocks.py:838
+#: content_manager/blocks.py:893 content_manager/blocks.py:923
#: content_manager/templates/content_manager/blocks/blog_recent_entries.html:28
#: content_manager/templates/content_manager/blocks/events_recent_entries.html:28
msgid "Filter by tag"
msgstr "Filtrer par Ă©tiquette"
-#: content_manager/blocks.py:809 content_manager/blocks.py:839
+#: content_manager/blocks.py:894 content_manager/blocks.py:924
#: content_manager/templates/content_manager/blocks/blog_recent_entries.html:45
#: content_manager/templates/content_manager/blocks/events_recent_entries.html:45
msgid "Filter by author"
msgstr "Filtrer par auteur"
-#: content_manager/blocks.py:812 content_manager/blocks.py:842
+#: content_manager/blocks.py:897 content_manager/blocks.py:927
#: content_manager/templates/content_manager/blocks/blog_recent_entries.html:60
#: content_manager/templates/content_manager/blocks/events_recent_entries.html:60
msgid "Filter by source"
msgstr "Filtrer par source"
-#: content_manager/blocks.py:813 content_manager/blocks.py:843
+#: content_manager/blocks.py:898 content_manager/blocks.py:928
msgid "The source is the organization of the post author"
msgstr ""
"La source est l’organisation à laquelle appartient l’auteur de l’article"
-#: content_manager/blocks.py:816 content_manager/blocks.py:846
+#: content_manager/blocks.py:901 content_manager/blocks.py:931
msgid "Show filters"
msgstr "Afficher les filtres"
-#: content_manager/blocks.py:833
+#: content_manager/blocks.py:918
msgid "Event calendar"
msgstr "Agenda"
-#: content_manager/blocks.py:858 content_manager/blocks.py:1035
+#: content_manager/blocks.py:943 content_manager/blocks.py:1121
msgid "Video"
msgstr "Vidéo"
-#: content_manager/blocks.py:860 content_manager/blocks.py:1031
+#: content_manager/blocks.py:945 content_manager/blocks.py:1117
msgid "Accordions"
msgstr "Accordéons"
-#: content_manager/blocks.py:860 content_manager/blocks.py:861
-#: content_manager/blocks.py:862 content_manager/blocks.py:863
-#: content_manager/blocks.py:864 content_manager/blocks.py:867
-#: content_manager/blocks.py:868 content_manager/blocks.py:879
-#: content_manager/blocks.py:929 content_manager/blocks.py:969
-#: content_manager/blocks.py:970 content_manager/blocks.py:1031
-#: content_manager/blocks.py:1032 content_manager/blocks.py:1033
-#: content_manager/blocks.py:1034 content_manager/blocks.py:1040
-#: content_manager/blocks.py:1041 content_manager/blocks.py:1042
-#: content_manager/blocks.py:1043
+#: content_manager/blocks.py:945 content_manager/blocks.py:946
+#: content_manager/blocks.py:947 content_manager/blocks.py:948
+#: content_manager/blocks.py:949 content_manager/blocks.py:952
+#: content_manager/blocks.py:953 content_manager/blocks.py:964
+#: content_manager/blocks.py:1015 content_manager/blocks.py:1055
+#: content_manager/blocks.py:1056 content_manager/blocks.py:1117
+#: content_manager/blocks.py:1118 content_manager/blocks.py:1119
+#: content_manager/blocks.py:1120 content_manager/blocks.py:1126
+#: content_manager/blocks.py:1127 content_manager/blocks.py:1128
+#: content_manager/blocks.py:1129
msgid "DSFR components"
msgstr "Composants du DSFR"
-#: content_manager/blocks.py:861 content_manager/blocks.py:1032
+#: content_manager/blocks.py:946 content_manager/blocks.py:1118
msgid "Callout"
msgstr "Mise en avant"
-#: content_manager/blocks.py:862 content_manager/blocks.py:1033
+#: content_manager/blocks.py:947 content_manager/blocks.py:1119
msgid "Highlight"
msgstr "Mise en exergue"
-#: content_manager/blocks.py:864 content_manager/blocks.py:1040
+#: content_manager/blocks.py:949 content_manager/blocks.py:1126
msgid "Stepper"
msgstr "Étapier"
-#: content_manager/blocks.py:865
+#: content_manager/blocks.py:950
msgid "Text and call to action"
msgstr "Texte et appel Ă action"
-#: content_manager/blocks.py:866 content_manager/blocks.py:1039
+#: content_manager/blocks.py:951 content_manager/blocks.py:1125
msgid "Single link"
msgstr "Lien isolé"
-#: content_manager/blocks.py:867 content_manager/blocks.py:1045
+#: content_manager/blocks.py:952 content_manager/blocks.py:1131
msgid "Iframe"
msgstr "Iframe"
-#: content_manager/blocks.py:868 content_manager/blocks.py:1042
+#: content_manager/blocks.py:953 content_manager/blocks.py:1128
msgid "Tile"
msgstr "Tuile"
-#: content_manager/blocks.py:869 content_manager/blocks.py:1067
+#: content_manager/blocks.py:954 content_manager/blocks.py:1153
msgid "Blog recent entries"
msgstr "Articles récents du blog"
-#: content_manager/blocks.py:869 content_manager/blocks.py:871
-#: content_manager/blocks.py:1062 content_manager/blocks.py:1067
-#: content_manager/blocks.py:1071
+#: content_manager/blocks.py:954 content_manager/blocks.py:956
+#: content_manager/blocks.py:1148 content_manager/blocks.py:1153
+#: content_manager/blocks.py:1157
msgid "Website structure"
msgstr "Structure du site"
-#: content_manager/blocks.py:871 content_manager/blocks.py:1071
+#: content_manager/blocks.py:956 content_manager/blocks.py:1157
msgid "Event calendar recent entries"
msgstr "Articles récents de l’agenda"
-#: content_manager/blocks.py:879 content_manager/blocks.py:929
+#: content_manager/blocks.py:964 content_manager/blocks.py:1015
msgid "Vertical card"
msgstr "Carte verticale"
-#: content_manager/blocks.py:884 content_manager/blocks.py:909
+#: content_manager/blocks.py:965
+msgid "Contact card"
+msgstr "Carte contact"
+
+#: content_manager/blocks.py:965
+msgid "Extra components"
+msgstr "Composants supplémentaires"
+
+#: content_manager/blocks.py:970 content_manager/blocks.py:995
msgid "Column width"
msgstr "Largeur de colonne"
-#: content_manager/blocks.py:888
+#: content_manager/blocks.py:974
msgid "Items"
msgstr "Éléments"
-#: content_manager/blocks.py:901
+#: content_manager/blocks.py:987
msgid "Tab"
msgstr "Onglet"
-#: content_manager/blocks.py:919
+#: content_manager/blocks.py:1005
msgid "The total width of all columns should be 12."
msgstr "La largeur totale de toutes les colonnes doit ĂŞtre 12."
-#: content_manager/blocks.py:922
+#: content_manager/blocks.py:1008
msgid "Column content"
msgstr "Contenu de la colonnne"
-#: content_manager/blocks.py:930
+#: content_manager/blocks.py:1016
msgid "Adjustable column"
msgstr "Colonne ajustable"
-#: content_manager/blocks.py:930 content_manager/blocks.py:971
-#: content_manager/blocks.py:1046 content_manager/blocks.py:1047
-#: content_manager/blocks.py:1048 content_manager/blocks.py:1049
-#: content_manager/blocks.py:1053
+#: content_manager/blocks.py:1016 content_manager/blocks.py:1057
+#: content_manager/blocks.py:1132 content_manager/blocks.py:1133
+#: content_manager/blocks.py:1134 content_manager/blocks.py:1135
+#: content_manager/blocks.py:1139
msgid "Page structure"
msgstr "Structure de la page"
-#: content_manager/blocks.py:937 content_manager/blocks.py:978
-#: content_manager/blocks.py:1011
+#: content_manager/blocks.py:1023 content_manager/blocks.py:1064
+#: content_manager/blocks.py:1097
msgid "Background image"
msgstr "Image de fond"
-#: content_manager/blocks.py:944
+#: content_manager/blocks.py:1030
msgid "Background color, hexadecimal format (obsolete)"
msgstr "Couleur de fond, format hexadécimal (obsolète)"
-#: content_manager/blocks.py:947
+#: content_manager/blocks.py:1033
msgid ""
"This field is obsolete and will be removed in the near future. Replace it "
"with the background color."
@@ -729,35 +770,35 @@ msgstr ""
"Ce champ est obsolète et sera prochainement supprimé. Merci de le remplacer "
"avec la couleur de fond."
-#: content_manager/blocks.py:949
+#: content_manager/blocks.py:1035
msgid "Incorrect color format, must be #fff or #f5f5f5"
msgstr "Format de couleur incorrect, doit ĂŞtre #fff ou #f5f5f5"
-#: content_manager/blocks.py:960
+#: content_manager/blocks.py:1046
msgid "Columns"
msgstr "Colonnes"
-#: content_manager/blocks.py:968 content_manager/blocks.py:1029
+#: content_manager/blocks.py:1054 content_manager/blocks.py:1115
msgid "Image and text"
msgstr "Image et texte"
-#: content_manager/blocks.py:969 content_manager/blocks.py:1041
+#: content_manager/blocks.py:1055 content_manager/blocks.py:1127
msgid "Horizontal card"
msgstr "Carte horizontale"
-#: content_manager/blocks.py:970 content_manager/blocks.py:1043
+#: content_manager/blocks.py:1056 content_manager/blocks.py:1129
msgid "Tabs"
msgstr "Onglets"
-#: content_manager/blocks.py:971 content_manager/blocks.py:1048
+#: content_manager/blocks.py:1057 content_manager/blocks.py:1134
msgid "Item grid"
msgstr "Grille d’éléments"
-#: content_manager/blocks.py:992
+#: content_manager/blocks.py:1078
msgid "Parent page"
msgstr "Page parente"
-#: content_manager/blocks.py:1002 content_manager/blocks.py:1084
+#: content_manager/blocks.py:1088 content_manager/blocks.py:1170
msgid ""
"Warning: Use HTML block with caution. Malicious code can compromise the "
"security of the site."
@@ -765,64 +806,64 @@ msgstr ""
"Avertissement : Utilisez le bloc HTML avec précaution. Un code malveillant "
"peut compromettre la sécurité du site."
-#: content_manager/blocks.py:1004
+#: content_manager/blocks.py:1090
msgid "Page tree"
msgstr "Arborescence de pages"
-#: content_manager/blocks.py:1017
+#: content_manager/blocks.py:1103
msgid "Main content"
msgstr "Contenu principal"
-#: content_manager/blocks.py:1018
+#: content_manager/blocks.py:1104
msgid "Side menu title"
msgstr "Titre du menu latéral"
-#: content_manager/blocks.py:1019
+#: content_manager/blocks.py:1105
msgid "Side menu content"
msgstr "Contenu du menu latéral"
-#: content_manager/blocks.py:1030
+#: content_manager/blocks.py:1116
msgid "Alert message"
msgstr "Message d’alerte"
-#: content_manager/blocks.py:1037
+#: content_manager/blocks.py:1123
msgid "Badge list"
msgstr "Liste de badges"
-#: content_manager/blocks.py:1038
+#: content_manager/blocks.py:1124
msgid "Tag list"
msgstr "Liste de tags"
-#: content_manager/blocks.py:1044
+#: content_manager/blocks.py:1130
msgid "Markdown"
msgstr "Markdown"
-#: content_manager/blocks.py:1044 content_manager/blocks.py:1045
-#: content_manager/blocks.py:1086
+#: content_manager/blocks.py:1130 content_manager/blocks.py:1131
+#: content_manager/blocks.py:1172
msgid "Expert syntax"
msgstr "Syntaxe experte"
-#: content_manager/blocks.py:1046
+#: content_manager/blocks.py:1132
msgid "Separator"
msgstr "SĂ©parateur"
-#: content_manager/blocks.py:1047
+#: content_manager/blocks.py:1133
msgid "Multiple columns"
msgstr "Multi-colonnes"
-#: content_manager/blocks.py:1049
+#: content_manager/blocks.py:1135
msgid "Full width background"
msgstr "Fond pleine largeur"
-#: content_manager/blocks.py:1053
+#: content_manager/blocks.py:1139
msgid "Full width background with side menu"
msgstr "Fond pleine largeur avec menu latéral"
-#: content_manager/blocks.py:1059
+#: content_manager/blocks.py:1145
msgid "Subpages list"
msgstr "Liste des sous-pages"
-#: content_manager/blocks.py:1060
+#: content_manager/blocks.py:1146
msgid "A simple, alphabetical list of the subpages of the current page."
msgstr ""
"Une liste alphabétique toute simple des sous-pages de la page actuelle."
@@ -1215,10 +1256,6 @@ msgstr "Catégorie de méga menu"
msgid "Mega menu categories"
msgstr "Catégories de méga menu"
-#: content_manager/models.py:425
-msgid "Name"
-msgstr "Nom"
-
#: content_manager/models.py:430
msgid "Main link"
msgstr "Lien principal"
@@ -1246,6 +1283,7 @@ msgstr "Voir tous les articles"
#: content_manager/templates/content_manager/blocks/card_horizontal.html:11
#: content_manager/templates/content_manager/blocks/card_vertical.html:11
+#: content_manager/templates/content_manager/blocks/contact_card_vertical.html:14
#: content_manager/templates/content_manager/blocks/link.html:9
#: content_manager/templates/content_manager/blocks/tile.html:12
msgid "Opens a new window"
@@ -1320,11 +1358,6 @@ msgstr "Afficher"
msgid "Continue"
msgstr "Continuer"
-#: content_manager/templates/content_manager/tags_list_page.html:31
-#: content_manager/views.py:46 content_manager/views.py:77
-msgid "Tags"
-msgstr "Étiquettes"
-
#: content_manager/templates/content_manager/widgets/dsfr-icon-picker-widget.html:9
msgid "Select icon"
msgstr "SĂ©lectionner une icĂ´ne"
diff --git a/content_manager/migrations/0049_alter_contentpage_body.py b/content_manager/migrations/0049_alter_contentpage_body.py
new file mode 100644
index 00000000..74646843
--- /dev/null
+++ b/content_manager/migrations/0049_alter_contentpage_body.py
@@ -0,0 +1,1394 @@
+# Generated by Django 5.1.3 on 2024-12-05 14:24
+
+import wagtail.fields
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("content_manager", "0048_alter_contentpage_body_and_more"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="contentpage",
+ name="body",
+ field=wagtail.fields.StreamField(
+ [
+ ("paragraph", 0),
+ ("image", 9),
+ ("imageandtext", 22),
+ ("alert", 27),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("video", 53),
+ ("transcription", 54),
+ ("badges_list", 59),
+ ("tags_list", 64),
+ ("link", 65),
+ ("stepper", 71),
+ ("card", 93),
+ ("tile", 103),
+ ("tabs", 137),
+ ("markdown", 138),
+ ("iframe", 139),
+ ("separator", 142),
+ ("multicolumns", 151),
+ ("item_grid", 154),
+ ("fullwidthbackground", 156),
+ ("fullwidthbackgroundwithsidemenu", 163),
+ ("subpageslist", 164),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("html", 165),
+ ],
+ blank=True,
+ block_lookup={
+ 0: ("wagtail.blocks.RichTextBlock", (), {"label": "Rich text"}),
+ 1: ("wagtail.blocks.CharBlock", (), {"label": "Title", "required": False}),
+ 2: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ("h6", "Heading 6"),
+ ("p", "Paragraph"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 3.",
+ "label": "Heading level",
+ "required": False,
+ },
+ ),
+ 3: ("wagtail.images.blocks.ImageChooserBlock", (), {"label": "Image"}),
+ 4: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"label": "Alternative text (textual description of the image)", "required": False},
+ ),
+ 5: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("fr-content-media--sm", "Small"),
+ ("", "Medium"),
+ ("fr-content-media--lg", "Large"),
+ ],
+ "label": "Witdh",
+ "required": False,
+ },
+ ),
+ 6: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("fr-ratio-32x9", "32x9"),
+ ("fr-ratio-16x9", "16x9"),
+ ("fr-ratio-3x2", "3x2"),
+ ("fr-ratio-4x3", "4x3"),
+ ("fr-ratio-1x1", "1x1"),
+ ("fr-ratio-3x4", "3x4"),
+ ("fr-ratio-2x3", "2x3"),
+ ],
+ "label": "Image ratio",
+ "required": False,
+ },
+ ),
+ 7: ("wagtail.blocks.CharBlock", (), {"label": "Caption", "required": False}),
+ 8: ("wagtail.blocks.URLBlock", (), {"label": "Link", "required": False}),
+ 9: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 2),
+ ("image", 3),
+ ("alt", 4),
+ ("width", 5),
+ ("image_ratio", 6),
+ ("caption", 7),
+ ("url", 8),
+ ]
+ ],
+ {},
+ ),
+ 10: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("left", "Left"), ("right", "Right")],
+ "label": "Side where the image is displayed",
+ },
+ ),
+ 11: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {"choices": [("3", "3/12"), ("5", "5/12"), ("6", "6/12")], "label": "Image width"},
+ ),
+ 12: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {
+ "help_text": "Link to a page of this site. Use either this, the document, or the external URL parameter.",
+ "label": "Page",
+ "required": False,
+ },
+ ),
+ 13: (
+ "wagtail.documents.blocks.DocumentChooserBlock",
+ (),
+ {
+ "help_text": "Use either this, the external URL or the page parameter.",
+ "label": "Document",
+ "required": False,
+ },
+ ),
+ 14: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "help_text": "Use either this, the document or the page parameter.",
+ "label": "External URL",
+ "required": False,
+ },
+ ),
+ 15: ("wagtail.blocks.CharBlock", (), {"label": "Link label", "required": False}),
+ 16: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("", "No icon"),
+ ("fr-icon-arrow-right-line fr-link--icon-right", "Icon on the right side"),
+ ("fr-icon-arrow-right-line fr-link--icon-left", "Icon on the left side"),
+ ],
+ "help_text": "Only used for internal links.",
+ "label": "Icon",
+ "required": False,
+ },
+ ),
+ 17: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-link--sm", "Small"), ("", "Medium"), ("fr-link--lg", "Large")],
+ "label": "Size",
+ "required": False,
+ },
+ ),
+ 18: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("icon", 16),
+ ("size", 17),
+ ]
+ ],
+ {
+ "help_text": "The link is shown at the bottom of the text block, with an arrow",
+ "label": "Link",
+ "required": False,
+ },
+ ),
+ 19: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "group": "obsolete",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Link label (obsolete)",
+ "required": False,
+ },
+ ),
+ 20: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {
+ "group": "obsolete",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Internal link (obsolete)",
+ "required": False,
+ },
+ ),
+ 21: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "group": "obsolete",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Link URL (obsolete)",
+ "required": False,
+ },
+ ),
+ 22: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("image", 3),
+ ("image_side", 10),
+ ("image_ratio", 11),
+ ("text", 0),
+ ("link", 18),
+ ("link_label", 19),
+ ("page", 20),
+ ("link_url", 21),
+ ]
+ ],
+ {"label": "Image and text"},
+ ),
+ 23: ("wagtail.blocks.CharBlock", (), {"label": "Message title", "required": False}),
+ 24: ("wagtail.blocks.TextBlock", (), {"label": "Message text", "required": False}),
+ 25: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("error", "Error"),
+ ("success", "Success"),
+ ("info", "Information"),
+ ("warning", "Warning"),
+ ],
+ "label": "Message type",
+ },
+ ),
+ 26: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ("h6", "Heading 6"),
+ ("p", "Paragraph"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 3.",
+ "label": "Heading level",
+ },
+ ),
+ 27: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 23), ("description", 24), ("level", 25), ("heading_tag", 26)]],
+ {"label": "Alert message"},
+ ),
+ 28: ("wagtail.blocks.CharBlock", (), {"label": "Title"}),
+ 29: ("wagtail.blocks.RichTextBlock", (), {"label": "Content"}),
+ 30: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 28), ("content", 29)]],
+ {"label": "Accordion", "max_num": 15, "min_num": 1},
+ ),
+ 31: (
+ "wagtail.blocks.StreamBlock",
+ [[("title", 28), ("accordion", 30)]],
+ {"group": "DSFR components", "label": "Accordions"},
+ ),
+ 32: ("content_manager.blocks.IconPickerBlock", (), {"label": "Icon", "required": False}),
+ 33: (
+ "wagtail.blocks.RichTextBlock",
+ (),
+ {
+ "features": [
+ "bold",
+ "italic",
+ "link",
+ "document-link",
+ "superscript",
+ "subscript",
+ "strikethrough",
+ ],
+ "label": "Content",
+ "required": False,
+ },
+ ),
+ 34: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("fr-btn", "Primary"),
+ ("fr-btn fr-btn--secondary", "Secundary"),
+ ("fr-btn fr-btn--tertiary", "Tertiary"),
+ ("fr-btn fr-btn--tertiary-no-outline", "Tertiary without border"),
+ ],
+ "label": "Button type",
+ "required": False,
+ },
+ ),
+ 35: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-btn--icon-left", "Left"), ("fr-btn--icon-right", "Right")],
+ "label": "Icon side",
+ "required": False,
+ },
+ ),
+ 36: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("button_type", 34),
+ ("icon_class", 32),
+ ("icon_side", 35),
+ ]
+ ],
+ {"label": "Button", "required": False},
+ ),
+ 37: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ "label": "Color",
+ "required": False,
+ },
+ ),
+ 38: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 26),
+ ("icon_class", 32),
+ ("text", 33),
+ ("button", 36),
+ ("color", 37),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Callout"},
+ ),
+ 39: (
+ "wagtail.blocks.RichTextBlock",
+ (),
+ {
+ "features": [
+ "bold",
+ "italic",
+ "link",
+ "document-link",
+ "superscript",
+ "subscript",
+ "strikethrough",
+ ],
+ "label": "Content",
+ },
+ ),
+ 40: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-text--sm", "Small"), ("", "Medium"), ("fr-text--lg", "Large")],
+ "label": "Size",
+ "required": False,
+ },
+ ),
+ 41: (
+ "wagtail.blocks.StructBlock",
+ [[("text", 39), ("color", 37), ("size", 40)]],
+ {"group": "DSFR components", "label": "Highlight"},
+ ),
+ 42: ("wagtail.images.blocks.ImageChooserBlock", (), {"label": "Image", "required": False}),
+ 43: ("wagtail.blocks.CharBlock", (), {"label": "Quote"}),
+ 44: ("wagtail.blocks.CharBlock", (), {"label": "Author name", "required": False}),
+ 45: ("wagtail.blocks.CharBlock", (), {"label": "Author title", "required": False}),
+ 46: (
+ "wagtail.blocks.StructBlock",
+ [[("image", 42), ("quote", 43), ("author_name", 44), ("author_title", 45), ("color", 37)]],
+ {"group": "DSFR components", "label": "Quote"},
+ ),
+ 47: ("wagtail.blocks.CharBlock", (), {"label": "Video title", "required": False}),
+ 48: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "help_text": "Use embed format, with a version that doesn't require a consent banner if available. (e.g. : https://www.youtube-nocookie.com/embed/gLzXOViPX-0) For Youtube, use Embed video and check Enable privacy-enhanced mode.",
+ "label": "Video URL",
+ },
+ ),
+ 49: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-ratio-16x9", "16x9"), ("fr-ratio-4x3", "4x3"), ("fr-ratio-1x1", "1x1")],
+ "label": "Video ratio",
+ "required": False,
+ },
+ ),
+ 50: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"default": "Transcription", "label": "Title", "required": False},
+ ),
+ 51: ("wagtail.blocks.RichTextBlock", (), {"label": "Transcription content", "required": False}),
+ 52: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 50), ("content", 51)]],
+ {"label": "Transcription", "required": False},
+ ),
+ 53: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 47),
+ ("caption", 7),
+ ("url", 48),
+ ("width", 5),
+ ("video_ratio", 49),
+ ("transcription", 52),
+ ]
+ ],
+ {"label": "Video"},
+ ),
+ 54: ("wagtail.blocks.StructBlock", [[("title", 50), ("content", 51)]], {"label": "Transcription"}),
+ 55: ("wagtail.blocks.CharBlock", (), {"label": "Badge label", "required": False}),
+ 56: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("", [("new", "New"), ("grey", "Grey")]),
+ (
+ "System colors",
+ [
+ ("info", "Info"),
+ ("success", "Success"),
+ ("warning", "Warning"),
+ ("error", "Error"),
+ ],
+ ),
+ (
+ "Illustration colors",
+ [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ ),
+ ],
+ "label": "Badge color",
+ "required": False,
+ },
+ ),
+ 57: ("wagtail.blocks.BooleanBlock", (), {"label": "Hide badge icon", "required": False}),
+ 58: (
+ "wagtail.blocks.StructBlock",
+ [[("text", 55), ("color", 56), ("hide_icon", 57)]],
+ {"label": "Badge"},
+ ),
+ 59: ("wagtail.blocks.StreamBlock", [[("badge", 58)]], {"label": "Badge list"}),
+ 60: ("wagtail.blocks.BooleanBlock", (), {"label": "Small tag", "required": False}),
+ 61: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ "help_text": "Only for clickable tags",
+ "label": "Tag color",
+ "required": False,
+ },
+ ),
+ 62: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 12), ("document", 13), ("external_url", 14)]],
+ {"required": False},
+ ),
+ 63: (
+ "wagtail.blocks.StructBlock",
+ [[("label", 28), ("is_small", 60), ("color", 61), ("icon_class", 32), ("link", 62)]],
+ {"label": "Tag"},
+ ),
+ 64: ("wagtail.blocks.StreamBlock", [[("tag", 63)]], {"label": "Tag list"}),
+ 65: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("icon", 16),
+ ("size", 17),
+ ]
+ ],
+ {"label": "Single link"},
+ ),
+ 66: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {"label": "Number of steps", "max_value": 8, "min_value": 1},
+ ),
+ 67: ("wagtail.blocks.IntegerBlock", (), {"label": "Current step", "max_value": 8, "min_value": 1}),
+ 68: ("wagtail.blocks.TextBlock", (), {"label": "Detail"}),
+ 69: ("wagtail.blocks.StructBlock", [[("title", 28), ("detail", 68)]], {"label": "Step"}),
+ 70: ("wagtail.blocks.StreamBlock", [[("step", 69)]], {"label": "Steps"}),
+ 71: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 28), ("total", 66), ("current", 67), ("steps", 70)]],
+ {"group": "DSFR components", "label": "Stepper"},
+ ),
+ 72: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-card--horizontal-tier", "1/3"), ("fr-card--horizontal-half", "50/50")],
+ "label": "Image ratio",
+ "required": False,
+ },
+ ),
+ 73: (
+ "wagtail.blocks.StreamBlock",
+ [[("badge", 58)]],
+ {
+ "help_text": "Only used if the card has an image.",
+ "label": "Image area badge",
+ "max_num": 1,
+ "required": False,
+ },
+ ),
+ 74: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 12), ("document", 13), ("external_url", 14)]],
+ {"label": "Link", "required": False},
+ ),
+ 75: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "group": "target",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Link (obsolete)",
+ "required": False,
+ },
+ ),
+ 76: (
+ "wagtail.documents.blocks.DocumentChooserBlock",
+ (),
+ {
+ "group": "target",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "or Document (obsolete)",
+ "required": False,
+ },
+ ),
+ 77: ("wagtail.blocks.CharBlock", (), {"label": "Top detail: text", "required": False}),
+ 78: (
+ "content_manager.blocks.IconPickerBlock",
+ (),
+ {"label": "Top detail: icon", "required": False},
+ ),
+ 79: ("wagtail.blocks.StreamBlock", [[("badge", 58)]], {}),
+ 80: ("wagtail.blocks.StreamBlock", [[("tag", 63)]], {}),
+ 81: (
+ "wagtail.blocks.StreamBlock",
+ [[("badges", 79), ("tags", 80)]],
+ {"label": "Top detail: badges or tags", "max_num": 1, "required": False},
+ ),
+ 82: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "Incompatible with the bottom call-to-action. If the card links to a downloadable document, the values are pre-filled.",
+ "label": "Bottom detail: text",
+ "required": False,
+ },
+ ),
+ 83: (
+ "content_manager.blocks.IconPickerBlock",
+ (),
+ {"label": "Bottom detail: icon", "required": False},
+ ),
+ 84: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 12), ("document", 13), ("external_url", 14), ("text", 15)]],
+ {"label": "Link"},
+ ),
+ 85: ("wagtail.blocks.StreamBlock", [[("link", 84)]], {}),
+ 86: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("button_type", 34),
+ ("icon_class", 32),
+ ("icon_side", 35),
+ ]
+ ],
+ {"label": "Button"},
+ ),
+ 87: (
+ "wagtail.blocks.StreamBlock",
+ [[("button", 86)]],
+ {
+ "help_text": "Please use only one primary button.\n If you use icons, use them on all buttons and align them on the same side.",
+ "label": "Buttons",
+ },
+ ),
+ 88: (
+ "wagtail.blocks.StreamBlock",
+ [[("links", 85), ("buttons", 87)]],
+ {
+ "help_text": "Incompatible with the bottom detail text.",
+ "label": "Bottom call-to-action: links or buttons",
+ "max_num": 1,
+ "required": False,
+ },
+ ),
+ 89: ("wagtail.blocks.BooleanBlock", (), {"label": "Card with grey background", "required": False}),
+ 90: ("wagtail.blocks.BooleanBlock", (), {"label": "Card without background", "required": False}),
+ 91: ("wagtail.blocks.BooleanBlock", (), {"label": "Card without border", "required": False}),
+ 92: ("wagtail.blocks.BooleanBlock", (), {"label": "Card with a shadow", "required": False}),
+ 93: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 28),
+ ("heading_tag", 26),
+ ("description", 33),
+ ("image", 42),
+ ("image_ratio", 72),
+ ("image_badge", 73),
+ ("link", 74),
+ ("url", 75),
+ ("document", 76),
+ ("top_detail_text", 77),
+ ("top_detail_icon", 78),
+ ("top_detail_badges_tags", 81),
+ ("bottom_detail_text", 82),
+ ("bottom_detail_icon", 83),
+ ("call_to_action", 88),
+ ("grey_background", 89),
+ ("no_background", 90),
+ ("no_border", 91),
+ ("shadow", 92),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Horizontal card"},
+ ),
+ 94: (
+ "wagtail.blocks.RichTextBlock",
+ (),
+ {
+ "features": ["bold", "italic", "superscript", "subscript", "strikethrough"],
+ "label": "Content",
+ "required": False,
+ },
+ ),
+ 95: (
+ "wagtail.images.blocks.ImageChooserBlock",
+ (),
+ {"help_text": "Prefer SVG files.", "label": "Image", "required": False},
+ ),
+ 96: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "If the tile links to a downloadable document, the values are pre-filled.",
+ "label": "Detail text",
+ "required": False,
+ },
+ ),
+ 97: ("wagtail.blocks.BooleanBlock", (), {"label": "Small tile", "required": False}),
+ 98: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile with grey background", "required": False}),
+ 99: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile without background", "required": False}),
+ 100: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile without border", "required": False}),
+ 101: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile with a shadow", "required": False}),
+ 102: ("wagtail.blocks.BooleanBlock", (), {"label": "Horizontal tile", "required": False}),
+ 103: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 28),
+ ("heading_tag", 26),
+ ("description", 94),
+ ("image", 95),
+ ("link", 74),
+ ("top_detail_badges_tags", 81),
+ ("detail_text", 96),
+ ("is_small", 97),
+ ("grey_background", 98),
+ ("no_background", 99),
+ ("no_border", 100),
+ ("shadow", 101),
+ ("is_horizontal", 102),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Tile"},
+ ),
+ 104: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 2),
+ ("image", 3),
+ ("alt", 4),
+ ("width", 5),
+ ("image_ratio", 6),
+ ("caption", 7),
+ ("url", 8),
+ ]
+ ],
+ {"label": "Image"},
+ ),
+ 105: ("wagtail.blocks.RichTextBlock", (), {"label": "Rich text", "required": False}),
+ 106: (
+ "wagtail.blocks.StreamBlock",
+ [[("buttons", 87)]],
+ {"label": "Call-to-action buttons", "max_num": 1, "required": False},
+ ),
+ 107: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the CTA buttons above.",
+ "label": "Call to action label (obsolete)",
+ "required": False,
+ },
+ ),
+ 108: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the CTA buttons above.",
+ "label": "Link (obsolete)",
+ "required": False,
+ },
+ ),
+ 109: (
+ "wagtail.blocks.StructBlock",
+ [[("text", 105), ("cta_buttons", 106), ("cta_label", 107), ("cta_url", 108)]],
+ {"label": "Text and call to action"},
+ ),
+ 110: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "Accessibility: The title should describe, in a clear and concise manner, the embedded content.",
+ "label": "Title",
+ },
+ ),
+ 111: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "help_text": "Example for Tally: https://tally.so/embed/w2jMRa",
+ "label": "URL of the iframe",
+ },
+ ),
+ 112: ("wagtail.blocks.IntegerBlock", (), {"label": "Height (in pixels)"}),
+ 113: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "For example: \"allow='geolocation'\".",
+ "label": "Parameters",
+ "required": False,
+ },
+ ),
+ 114: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 110), ("url", 111), ("height", 112), ("parameters", 113)]],
+ {"group": "DSFR components", "label": "Iframe"},
+ ),
+ 115: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 2.",
+ "label": "Heading level",
+ "required": False,
+ },
+ ),
+ 116: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {"label": "Blog", "page_type": ["blog.BlogIndexPage"]},
+ ),
+ 117: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {
+ "default": 3,
+ "label": "Number of entries",
+ "max_value": 8,
+ "min_value": 1,
+ "required": False,
+ },
+ ),
+ 118: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Category",),
+ {"label": "Filter by category", "required": False},
+ ),
+ 119: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("content_manager.Tag",),
+ {"label": "Filter by tag", "required": False},
+ ),
+ 120: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Person",),
+ {"label": "Filter by author", "required": False},
+ ),
+ 121: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Organization",),
+ {
+ "help_text": "The source is the organization of the post author",
+ "label": "Filter by source",
+ "required": False,
+ },
+ ),
+ 122: (
+ "wagtail.blocks.BooleanBlock",
+ (),
+ {"default": False, "label": "Show filters", "required": False},
+ ),
+ 123: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 115),
+ ("blog", 116),
+ ("entries_count", 117),
+ ("category_filter", 118),
+ ("tag_filter", 119),
+ ("author_filter", 120),
+ ("source_filter", 121),
+ ("show_filters", 122),
+ ]
+ ],
+ {"group": "Website structure", "label": "Blog recent entries"},
+ ),
+ 124: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {"label": "Event calendar", "page_type": ["events.EventsIndexPage"]},
+ ),
+ 125: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 115),
+ ("index_page", 124),
+ ("entries_count", 117),
+ ("category_filter", 118),
+ ("tag_filter", 119),
+ ("author_filter", 120),
+ ("source_filter", 121),
+ ("show_filters", 122),
+ ]
+ ],
+ {"group": "Website structure", "label": "Event calendar recent entries"},
+ ),
+ 126: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "Incompatible with the bottom call-to-action.",
+ "label": "Bottom detail: text",
+ "required": False,
+ },
+ ),
+ 127: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 28),
+ ("heading_tag", 26),
+ ("description", 33),
+ ("image", 42),
+ ("image_ratio", 6),
+ ("image_badge", 73),
+ ("link", 74),
+ ("url", 75),
+ ("document", 76),
+ ("top_detail_text", 77),
+ ("top_detail_icon", 78),
+ ("top_detail_badges_tags", 81),
+ ("bottom_detail_text", 126),
+ ("bottom_detail_icon", 83),
+ ("call_to_action", 88),
+ ("grey_background", 89),
+ ("no_background", 90),
+ ("no_border", 91),
+ ("shadow", 92),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Vertical card"},
+ ),
+ 128: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Person",),
+ {
+ "help_text": "Optional, all values can be manually specified or overriden below",
+ "label": "Person",
+ "required": False,
+ },
+ ),
+ 129: ("wagtail.blocks.CharBlock", (), {"label": "Name", "max_length": 255, "required": False}),
+ 130: ("wagtail.blocks.CharBlock", (), {"label": "Role", "max_length": 255, "required": False}),
+ 131: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"label": "Organization", "max_length": 255, "required": False},
+ ),
+ 132: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"label": "Contact info", "max_length": 500, "required": False},
+ ),
+ 133: ("wagtail.blocks.StreamBlock", [[("tag", 63)]], {"label": "Tags", "required": False}),
+ 134: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("contact", 128),
+ ("link", 74),
+ ("heading_tag", 2),
+ ("name", 129),
+ ("role", 130),
+ ("organization", 131),
+ ("contact_info", 132),
+ ("image", 42),
+ ("tags", 133),
+ ]
+ ],
+ {"group": "Extra components", "label": "Contact card"},
+ ),
+ 135: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("contact_card", 134),
+ ]
+ ],
+ {"label": "Content"},
+ ),
+ 136: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 28), ("content", 135)]],
+ {"label": "Tab", "max_num": 15, "min_num": 1},
+ ),
+ 137: (
+ "wagtail.blocks.StreamBlock",
+ [[("tabs", 136)]],
+ {"group": "DSFR components", "label": "Tabs"},
+ ),
+ 138: ("wagtailmarkdown.blocks.MarkdownBlock", (), {"group": "Expert syntax", "label": "Markdown"}),
+ 139: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 110), ("url", 111), ("height", 112), ("parameters", 113)]],
+ {"group": "Expert syntax", "label": "Iframe"},
+ ),
+ 140: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {"default": 3, "label": "Top margin", "max_value": 15, "min_value": 0},
+ ),
+ 141: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {"default": 3, "label": "Bottom margin", "max_value": 15, "min_value": 0},
+ ),
+ 142: (
+ "wagtail.blocks.StructBlock",
+ [[("top_margin", 140), ("bottom_margin", 141)]],
+ {"group": "Page structure", "label": "Separator"},
+ ),
+ 143: (
+ "wagtail.images.blocks.ImageChooserBlock",
+ (),
+ {"label": "Background image", "required": False},
+ ),
+ 144: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("Primary colors", [("blue-france", "Blue France"), ("red-marianne", "Red Marianne")]),
+ ("Neutral colors", [("grey", "Grey")]),
+ (
+ "Illustration colors",
+ [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ ),
+ ],
+ "help_text": "Uses the French Design System colors",
+ "label": "Background color",
+ "required": False,
+ },
+ ),
+ 145: (
+ "wagtail.blocks.RegexBlock",
+ (),
+ {
+ "error_messages": {"invalid": "Incorrect color format, must be #fff or #f5f5f5"},
+ "help_text": "This field is obsolete and will be removed in the near future. Replace it with the background color.",
+ "label": "Background color, hexadecimal format (obsolete)",
+ "regex": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$",
+ "required": False,
+ },
+ ),
+ 146: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ("h6", "Heading 6"),
+ ("p", "Paragraph"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 2.",
+ "label": "Heading level",
+ "required": False,
+ },
+ ),
+ 147: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("3", "3/12"),
+ ("4", "4/12"),
+ ("5", "5/12"),
+ ("6", "6/12"),
+ ("7", "7/12"),
+ ("8", "8/12"),
+ ("9", "9/12"),
+ ],
+ "help_text": "The total width of all columns should be 12.",
+ "label": "Column width",
+ "required": False,
+ },
+ ),
+ 148: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("contact_card", 134),
+ ]
+ ],
+ {"label": "Column content"},
+ ),
+ 149: (
+ "wagtail.blocks.StructBlock",
+ [[("width", 147), ("content", 148)]],
+ {"group": "Page structure", "label": "Adjustable column"},
+ ),
+ 150: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("column", 149),
+ ]
+ ],
+ {"label": "Columns"},
+ ),
+ 151: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("bg_image", 143),
+ ("bg_color_class", 144),
+ ("bg_color", 145),
+ ("title", 1),
+ ("heading_tag", 146),
+ ("columns", 150),
+ ]
+ ],
+ {"group": "Page structure", "label": "Multiple columns"},
+ ),
+ 152: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {"choices": [("3", "3/12"), ("4", "4/12"), ("6", "6/12")], "label": "Column width"},
+ ),
+ 153: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("contact_card", 134),
+ ]
+ ],
+ {"label": "Items"},
+ ),
+ 154: (
+ "wagtail.blocks.StructBlock",
+ [[("column_width", 152), ("items", 153)]],
+ {"group": "Page structure", "label": "Item grid"},
+ ),
+ 155: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("image_and_text", 22),
+ ("card", 93),
+ ("tabs", 137),
+ ("item_grid", 154),
+ ]
+ ],
+ {"label": "Content"},
+ ),
+ 156: (
+ "wagtail.blocks.StructBlock",
+ [[("bg_image", 143), ("bg_color_class", 144), ("content", 155)]],
+ {"group": "Page structure", "label": "Full width background"},
+ ),
+ 157: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("image_and_text", 22),
+ ("card", 93),
+ ("tabs", 137),
+ ("item_grid", 154),
+ ]
+ ],
+ {"label": "Main content"},
+ ),
+ 158: ("wagtail.blocks.CharBlock", (), {"label": "Side menu title", "required": False}),
+ 159: (
+ "wagtail.blocks.RawHTMLBlock",
+ (),
+ {
+ "help_text": "Warning: Use HTML block with caution. Malicious code can compromise the security of the site.",
+ "label": "HTML",
+ },
+ ),
+ 160: ("wagtail.blocks.PageChooserBlock", (), {"label": "Parent page"}),
+ 161: ("wagtail.blocks.StructBlock", [[("page", 160)]], {"label": "Page tree"}),
+ 162: (
+ "wagtail.blocks.StreamBlock",
+ [[("html", 159), ("pagetree", 161)]],
+ {"label": "Side menu content"},
+ ),
+ 163: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("bg_image", 143),
+ ("bg_color_class", 144),
+ ("main_content", 157),
+ ("sidemenu_title", 158),
+ ("sidemenu_content", 162),
+ ]
+ ],
+ {"group": "Page structure", "label": "Full width background with side menu"},
+ ),
+ 164: (
+ "wagtail.blocks.static_block.StaticBlock",
+ (),
+ {
+ "admin_text": "A simple, alphabetical list of the subpages of the current page.",
+ "group": "Website structure",
+ "label": "Subpages list",
+ "template": "content_manager/blocks/subpages_list.html",
+ },
+ ),
+ 165: (
+ "wagtail.blocks.RawHTMLBlock",
+ (),
+ {
+ "group": "Expert syntax",
+ "help_text": "Warning: Use HTML block with caution. Malicious code can compromise the security of the site.",
+ "readonly": True,
+ },
+ ),
+ },
+ ),
+ ),
+ ]
diff --git a/content_manager/templates/content_manager/blocks/contact_card_vertical.html b/content_manager/templates/content_manager/blocks/contact_card_vertical.html
new file mode 100644
index 00000000..20f9510a
--- /dev/null
+++ b/content_manager/templates/content_manager/blocks/contact_card_vertical.html
@@ -0,0 +1,55 @@
+{% load i18n wagtailcore_tags wagtailimages_tags %}
+{# Uses value instead of block.value because it is also used #}
+{# to display Person items #}
+
+
diff --git a/events/migrations/0011_alter_evententrypage_body_alter_eventsindexpage_body.py b/events/migrations/0011_alter_evententrypage_body_alter_eventsindexpage_body.py
new file mode 100644
index 00000000..e94eb903
--- /dev/null
+++ b/events/migrations/0011_alter_evententrypage_body_alter_eventsindexpage_body.py
@@ -0,0 +1,2774 @@
+# Generated by Django 5.1.3 on 2024-12-05 14:24
+
+import wagtail.fields
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("events", "0010_alter_evententrypage_body_and_more"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="evententrypage",
+ name="body",
+ field=wagtail.fields.StreamField(
+ [
+ ("paragraph", 0),
+ ("image", 9),
+ ("imageandtext", 22),
+ ("alert", 27),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("video", 53),
+ ("transcription", 54),
+ ("badges_list", 59),
+ ("tags_list", 64),
+ ("link", 65),
+ ("stepper", 71),
+ ("card", 93),
+ ("tile", 103),
+ ("tabs", 137),
+ ("markdown", 138),
+ ("iframe", 139),
+ ("separator", 142),
+ ("multicolumns", 151),
+ ("item_grid", 154),
+ ("fullwidthbackground", 156),
+ ("fullwidthbackgroundwithsidemenu", 163),
+ ("subpageslist", 164),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("html", 165),
+ ],
+ blank=True,
+ block_lookup={
+ 0: ("wagtail.blocks.RichTextBlock", (), {"label": "Rich text"}),
+ 1: ("wagtail.blocks.CharBlock", (), {"label": "Title", "required": False}),
+ 2: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ("h6", "Heading 6"),
+ ("p", "Paragraph"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 3.",
+ "label": "Heading level",
+ "required": False,
+ },
+ ),
+ 3: ("wagtail.images.blocks.ImageChooserBlock", (), {"label": "Image"}),
+ 4: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"label": "Alternative text (textual description of the image)", "required": False},
+ ),
+ 5: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("fr-content-media--sm", "Small"),
+ ("", "Medium"),
+ ("fr-content-media--lg", "Large"),
+ ],
+ "label": "Witdh",
+ "required": False,
+ },
+ ),
+ 6: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("fr-ratio-32x9", "32x9"),
+ ("fr-ratio-16x9", "16x9"),
+ ("fr-ratio-3x2", "3x2"),
+ ("fr-ratio-4x3", "4x3"),
+ ("fr-ratio-1x1", "1x1"),
+ ("fr-ratio-3x4", "3x4"),
+ ("fr-ratio-2x3", "2x3"),
+ ],
+ "label": "Image ratio",
+ "required": False,
+ },
+ ),
+ 7: ("wagtail.blocks.CharBlock", (), {"label": "Caption", "required": False}),
+ 8: ("wagtail.blocks.URLBlock", (), {"label": "Link", "required": False}),
+ 9: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 2),
+ ("image", 3),
+ ("alt", 4),
+ ("width", 5),
+ ("image_ratio", 6),
+ ("caption", 7),
+ ("url", 8),
+ ]
+ ],
+ {},
+ ),
+ 10: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("left", "Left"), ("right", "Right")],
+ "label": "Side where the image is displayed",
+ },
+ ),
+ 11: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {"choices": [("3", "3/12"), ("5", "5/12"), ("6", "6/12")], "label": "Image width"},
+ ),
+ 12: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {
+ "help_text": "Link to a page of this site. Use either this, the document, or the external URL parameter.",
+ "label": "Page",
+ "required": False,
+ },
+ ),
+ 13: (
+ "wagtail.documents.blocks.DocumentChooserBlock",
+ (),
+ {
+ "help_text": "Use either this, the external URL or the page parameter.",
+ "label": "Document",
+ "required": False,
+ },
+ ),
+ 14: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "help_text": "Use either this, the document or the page parameter.",
+ "label": "External URL",
+ "required": False,
+ },
+ ),
+ 15: ("wagtail.blocks.CharBlock", (), {"label": "Link label", "required": False}),
+ 16: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("", "No icon"),
+ ("fr-icon-arrow-right-line fr-link--icon-right", "Icon on the right side"),
+ ("fr-icon-arrow-right-line fr-link--icon-left", "Icon on the left side"),
+ ],
+ "help_text": "Only used for internal links.",
+ "label": "Icon",
+ "required": False,
+ },
+ ),
+ 17: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-link--sm", "Small"), ("", "Medium"), ("fr-link--lg", "Large")],
+ "label": "Size",
+ "required": False,
+ },
+ ),
+ 18: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("icon", 16),
+ ("size", 17),
+ ]
+ ],
+ {
+ "help_text": "The link is shown at the bottom of the text block, with an arrow",
+ "label": "Link",
+ "required": False,
+ },
+ ),
+ 19: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "group": "obsolete",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Link label (obsolete)",
+ "required": False,
+ },
+ ),
+ 20: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {
+ "group": "obsolete",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Internal link (obsolete)",
+ "required": False,
+ },
+ ),
+ 21: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "group": "obsolete",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Link URL (obsolete)",
+ "required": False,
+ },
+ ),
+ 22: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("image", 3),
+ ("image_side", 10),
+ ("image_ratio", 11),
+ ("text", 0),
+ ("link", 18),
+ ("link_label", 19),
+ ("page", 20),
+ ("link_url", 21),
+ ]
+ ],
+ {"label": "Image and text"},
+ ),
+ 23: ("wagtail.blocks.CharBlock", (), {"label": "Message title", "required": False}),
+ 24: ("wagtail.blocks.TextBlock", (), {"label": "Message text", "required": False}),
+ 25: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("error", "Error"),
+ ("success", "Success"),
+ ("info", "Information"),
+ ("warning", "Warning"),
+ ],
+ "label": "Message type",
+ },
+ ),
+ 26: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ("h6", "Heading 6"),
+ ("p", "Paragraph"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 3.",
+ "label": "Heading level",
+ },
+ ),
+ 27: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 23), ("description", 24), ("level", 25), ("heading_tag", 26)]],
+ {"label": "Alert message"},
+ ),
+ 28: ("wagtail.blocks.CharBlock", (), {"label": "Title"}),
+ 29: ("wagtail.blocks.RichTextBlock", (), {"label": "Content"}),
+ 30: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 28), ("content", 29)]],
+ {"label": "Accordion", "max_num": 15, "min_num": 1},
+ ),
+ 31: (
+ "wagtail.blocks.StreamBlock",
+ [[("title", 28), ("accordion", 30)]],
+ {"group": "DSFR components", "label": "Accordions"},
+ ),
+ 32: ("content_manager.blocks.IconPickerBlock", (), {"label": "Icon", "required": False}),
+ 33: (
+ "wagtail.blocks.RichTextBlock",
+ (),
+ {
+ "features": [
+ "bold",
+ "italic",
+ "link",
+ "document-link",
+ "superscript",
+ "subscript",
+ "strikethrough",
+ ],
+ "label": "Content",
+ "required": False,
+ },
+ ),
+ 34: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("fr-btn", "Primary"),
+ ("fr-btn fr-btn--secondary", "Secundary"),
+ ("fr-btn fr-btn--tertiary", "Tertiary"),
+ ("fr-btn fr-btn--tertiary-no-outline", "Tertiary without border"),
+ ],
+ "label": "Button type",
+ "required": False,
+ },
+ ),
+ 35: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-btn--icon-left", "Left"), ("fr-btn--icon-right", "Right")],
+ "label": "Icon side",
+ "required": False,
+ },
+ ),
+ 36: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("button_type", 34),
+ ("icon_class", 32),
+ ("icon_side", 35),
+ ]
+ ],
+ {"label": "Button", "required": False},
+ ),
+ 37: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ "label": "Color",
+ "required": False,
+ },
+ ),
+ 38: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 26),
+ ("icon_class", 32),
+ ("text", 33),
+ ("button", 36),
+ ("color", 37),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Callout"},
+ ),
+ 39: (
+ "wagtail.blocks.RichTextBlock",
+ (),
+ {
+ "features": [
+ "bold",
+ "italic",
+ "link",
+ "document-link",
+ "superscript",
+ "subscript",
+ "strikethrough",
+ ],
+ "label": "Content",
+ },
+ ),
+ 40: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-text--sm", "Small"), ("", "Medium"), ("fr-text--lg", "Large")],
+ "label": "Size",
+ "required": False,
+ },
+ ),
+ 41: (
+ "wagtail.blocks.StructBlock",
+ [[("text", 39), ("color", 37), ("size", 40)]],
+ {"group": "DSFR components", "label": "Highlight"},
+ ),
+ 42: ("wagtail.images.blocks.ImageChooserBlock", (), {"label": "Image", "required": False}),
+ 43: ("wagtail.blocks.CharBlock", (), {"label": "Quote"}),
+ 44: ("wagtail.blocks.CharBlock", (), {"label": "Author name", "required": False}),
+ 45: ("wagtail.blocks.CharBlock", (), {"label": "Author title", "required": False}),
+ 46: (
+ "wagtail.blocks.StructBlock",
+ [[("image", 42), ("quote", 43), ("author_name", 44), ("author_title", 45), ("color", 37)]],
+ {"group": "DSFR components", "label": "Quote"},
+ ),
+ 47: ("wagtail.blocks.CharBlock", (), {"label": "Video title", "required": False}),
+ 48: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "help_text": "Use embed format, with a version that doesn't require a consent banner if available. (e.g. : https://www.youtube-nocookie.com/embed/gLzXOViPX-0) For Youtube, use Embed video and check Enable privacy-enhanced mode.",
+ "label": "Video URL",
+ },
+ ),
+ 49: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-ratio-16x9", "16x9"), ("fr-ratio-4x3", "4x3"), ("fr-ratio-1x1", "1x1")],
+ "label": "Video ratio",
+ "required": False,
+ },
+ ),
+ 50: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"default": "Transcription", "label": "Title", "required": False},
+ ),
+ 51: ("wagtail.blocks.RichTextBlock", (), {"label": "Transcription content", "required": False}),
+ 52: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 50), ("content", 51)]],
+ {"label": "Transcription", "required": False},
+ ),
+ 53: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 47),
+ ("caption", 7),
+ ("url", 48),
+ ("width", 5),
+ ("video_ratio", 49),
+ ("transcription", 52),
+ ]
+ ],
+ {"label": "Video"},
+ ),
+ 54: ("wagtail.blocks.StructBlock", [[("title", 50), ("content", 51)]], {"label": "Transcription"}),
+ 55: ("wagtail.blocks.CharBlock", (), {"label": "Badge label", "required": False}),
+ 56: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("", [("new", "New"), ("grey", "Grey")]),
+ (
+ "System colors",
+ [
+ ("info", "Info"),
+ ("success", "Success"),
+ ("warning", "Warning"),
+ ("error", "Error"),
+ ],
+ ),
+ (
+ "Illustration colors",
+ [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ ),
+ ],
+ "label": "Badge color",
+ "required": False,
+ },
+ ),
+ 57: ("wagtail.blocks.BooleanBlock", (), {"label": "Hide badge icon", "required": False}),
+ 58: (
+ "wagtail.blocks.StructBlock",
+ [[("text", 55), ("color", 56), ("hide_icon", 57)]],
+ {"label": "Badge"},
+ ),
+ 59: ("wagtail.blocks.StreamBlock", [[("badge", 58)]], {"label": "Badge list"}),
+ 60: ("wagtail.blocks.BooleanBlock", (), {"label": "Small tag", "required": False}),
+ 61: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ "help_text": "Only for clickable tags",
+ "label": "Tag color",
+ "required": False,
+ },
+ ),
+ 62: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 12), ("document", 13), ("external_url", 14)]],
+ {"required": False},
+ ),
+ 63: (
+ "wagtail.blocks.StructBlock",
+ [[("label", 28), ("is_small", 60), ("color", 61), ("icon_class", 32), ("link", 62)]],
+ {"label": "Tag"},
+ ),
+ 64: ("wagtail.blocks.StreamBlock", [[("tag", 63)]], {"label": "Tag list"}),
+ 65: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("icon", 16),
+ ("size", 17),
+ ]
+ ],
+ {"label": "Single link"},
+ ),
+ 66: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {"label": "Number of steps", "max_value": 8, "min_value": 1},
+ ),
+ 67: ("wagtail.blocks.IntegerBlock", (), {"label": "Current step", "max_value": 8, "min_value": 1}),
+ 68: ("wagtail.blocks.TextBlock", (), {"label": "Detail"}),
+ 69: ("wagtail.blocks.StructBlock", [[("title", 28), ("detail", 68)]], {"label": "Step"}),
+ 70: ("wagtail.blocks.StreamBlock", [[("step", 69)]], {"label": "Steps"}),
+ 71: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 28), ("total", 66), ("current", 67), ("steps", 70)]],
+ {"group": "DSFR components", "label": "Stepper"},
+ ),
+ 72: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-card--horizontal-tier", "1/3"), ("fr-card--horizontal-half", "50/50")],
+ "label": "Image ratio",
+ "required": False,
+ },
+ ),
+ 73: (
+ "wagtail.blocks.StreamBlock",
+ [[("badge", 58)]],
+ {
+ "help_text": "Only used if the card has an image.",
+ "label": "Image area badge",
+ "max_num": 1,
+ "required": False,
+ },
+ ),
+ 74: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 12), ("document", 13), ("external_url", 14)]],
+ {"label": "Link", "required": False},
+ ),
+ 75: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "group": "target",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Link (obsolete)",
+ "required": False,
+ },
+ ),
+ 76: (
+ "wagtail.documents.blocks.DocumentChooserBlock",
+ (),
+ {
+ "group": "target",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "or Document (obsolete)",
+ "required": False,
+ },
+ ),
+ 77: ("wagtail.blocks.CharBlock", (), {"label": "Top detail: text", "required": False}),
+ 78: (
+ "content_manager.blocks.IconPickerBlock",
+ (),
+ {"label": "Top detail: icon", "required": False},
+ ),
+ 79: ("wagtail.blocks.StreamBlock", [[("badge", 58)]], {}),
+ 80: ("wagtail.blocks.StreamBlock", [[("tag", 63)]], {}),
+ 81: (
+ "wagtail.blocks.StreamBlock",
+ [[("badges", 79), ("tags", 80)]],
+ {"label": "Top detail: badges or tags", "max_num": 1, "required": False},
+ ),
+ 82: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "Incompatible with the bottom call-to-action. If the card links to a downloadable document, the values are pre-filled.",
+ "label": "Bottom detail: text",
+ "required": False,
+ },
+ ),
+ 83: (
+ "content_manager.blocks.IconPickerBlock",
+ (),
+ {"label": "Bottom detail: icon", "required": False},
+ ),
+ 84: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 12), ("document", 13), ("external_url", 14), ("text", 15)]],
+ {"label": "Link"},
+ ),
+ 85: ("wagtail.blocks.StreamBlock", [[("link", 84)]], {}),
+ 86: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("button_type", 34),
+ ("icon_class", 32),
+ ("icon_side", 35),
+ ]
+ ],
+ {"label": "Button"},
+ ),
+ 87: (
+ "wagtail.blocks.StreamBlock",
+ [[("button", 86)]],
+ {
+ "help_text": "Please use only one primary button.\n If you use icons, use them on all buttons and align them on the same side.",
+ "label": "Buttons",
+ },
+ ),
+ 88: (
+ "wagtail.blocks.StreamBlock",
+ [[("links", 85), ("buttons", 87)]],
+ {
+ "help_text": "Incompatible with the bottom detail text.",
+ "label": "Bottom call-to-action: links or buttons",
+ "max_num": 1,
+ "required": False,
+ },
+ ),
+ 89: ("wagtail.blocks.BooleanBlock", (), {"label": "Card with grey background", "required": False}),
+ 90: ("wagtail.blocks.BooleanBlock", (), {"label": "Card without background", "required": False}),
+ 91: ("wagtail.blocks.BooleanBlock", (), {"label": "Card without border", "required": False}),
+ 92: ("wagtail.blocks.BooleanBlock", (), {"label": "Card with a shadow", "required": False}),
+ 93: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 28),
+ ("heading_tag", 26),
+ ("description", 33),
+ ("image", 42),
+ ("image_ratio", 72),
+ ("image_badge", 73),
+ ("link", 74),
+ ("url", 75),
+ ("document", 76),
+ ("top_detail_text", 77),
+ ("top_detail_icon", 78),
+ ("top_detail_badges_tags", 81),
+ ("bottom_detail_text", 82),
+ ("bottom_detail_icon", 83),
+ ("call_to_action", 88),
+ ("grey_background", 89),
+ ("no_background", 90),
+ ("no_border", 91),
+ ("shadow", 92),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Horizontal card"},
+ ),
+ 94: (
+ "wagtail.blocks.RichTextBlock",
+ (),
+ {
+ "features": ["bold", "italic", "superscript", "subscript", "strikethrough"],
+ "label": "Content",
+ "required": False,
+ },
+ ),
+ 95: (
+ "wagtail.images.blocks.ImageChooserBlock",
+ (),
+ {"help_text": "Prefer SVG files.", "label": "Image", "required": False},
+ ),
+ 96: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "If the tile links to a downloadable document, the values are pre-filled.",
+ "label": "Detail text",
+ "required": False,
+ },
+ ),
+ 97: ("wagtail.blocks.BooleanBlock", (), {"label": "Small tile", "required": False}),
+ 98: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile with grey background", "required": False}),
+ 99: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile without background", "required": False}),
+ 100: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile without border", "required": False}),
+ 101: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile with a shadow", "required": False}),
+ 102: ("wagtail.blocks.BooleanBlock", (), {"label": "Horizontal tile", "required": False}),
+ 103: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 28),
+ ("heading_tag", 26),
+ ("description", 94),
+ ("image", 95),
+ ("link", 74),
+ ("top_detail_badges_tags", 81),
+ ("detail_text", 96),
+ ("is_small", 97),
+ ("grey_background", 98),
+ ("no_background", 99),
+ ("no_border", 100),
+ ("shadow", 101),
+ ("is_horizontal", 102),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Tile"},
+ ),
+ 104: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 2),
+ ("image", 3),
+ ("alt", 4),
+ ("width", 5),
+ ("image_ratio", 6),
+ ("caption", 7),
+ ("url", 8),
+ ]
+ ],
+ {"label": "Image"},
+ ),
+ 105: ("wagtail.blocks.RichTextBlock", (), {"label": "Rich text", "required": False}),
+ 106: (
+ "wagtail.blocks.StreamBlock",
+ [[("buttons", 87)]],
+ {"label": "Call-to-action buttons", "max_num": 1, "required": False},
+ ),
+ 107: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the CTA buttons above.",
+ "label": "Call to action label (obsolete)",
+ "required": False,
+ },
+ ),
+ 108: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the CTA buttons above.",
+ "label": "Link (obsolete)",
+ "required": False,
+ },
+ ),
+ 109: (
+ "wagtail.blocks.StructBlock",
+ [[("text", 105), ("cta_buttons", 106), ("cta_label", 107), ("cta_url", 108)]],
+ {"label": "Text and call to action"},
+ ),
+ 110: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "Accessibility: The title should describe, in a clear and concise manner, the embedded content.",
+ "label": "Title",
+ },
+ ),
+ 111: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "help_text": "Example for Tally: https://tally.so/embed/w2jMRa",
+ "label": "URL of the iframe",
+ },
+ ),
+ 112: ("wagtail.blocks.IntegerBlock", (), {"label": "Height (in pixels)"}),
+ 113: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "For example: \"allow='geolocation'\".",
+ "label": "Parameters",
+ "required": False,
+ },
+ ),
+ 114: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 110), ("url", 111), ("height", 112), ("parameters", 113)]],
+ {"group": "DSFR components", "label": "Iframe"},
+ ),
+ 115: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 2.",
+ "label": "Heading level",
+ "required": False,
+ },
+ ),
+ 116: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {"label": "Blog", "page_type": ["blog.BlogIndexPage"]},
+ ),
+ 117: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {
+ "default": 3,
+ "label": "Number of entries",
+ "max_value": 8,
+ "min_value": 1,
+ "required": False,
+ },
+ ),
+ 118: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Category",),
+ {"label": "Filter by category", "required": False},
+ ),
+ 119: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("content_manager.Tag",),
+ {"label": "Filter by tag", "required": False},
+ ),
+ 120: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Person",),
+ {"label": "Filter by author", "required": False},
+ ),
+ 121: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Organization",),
+ {
+ "help_text": "The source is the organization of the post author",
+ "label": "Filter by source",
+ "required": False,
+ },
+ ),
+ 122: (
+ "wagtail.blocks.BooleanBlock",
+ (),
+ {"default": False, "label": "Show filters", "required": False},
+ ),
+ 123: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 115),
+ ("blog", 116),
+ ("entries_count", 117),
+ ("category_filter", 118),
+ ("tag_filter", 119),
+ ("author_filter", 120),
+ ("source_filter", 121),
+ ("show_filters", 122),
+ ]
+ ],
+ {"group": "Website structure", "label": "Blog recent entries"},
+ ),
+ 124: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {"label": "Event calendar", "page_type": ["events.EventsIndexPage"]},
+ ),
+ 125: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 115),
+ ("index_page", 124),
+ ("entries_count", 117),
+ ("category_filter", 118),
+ ("tag_filter", 119),
+ ("author_filter", 120),
+ ("source_filter", 121),
+ ("show_filters", 122),
+ ]
+ ],
+ {"group": "Website structure", "label": "Event calendar recent entries"},
+ ),
+ 126: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "Incompatible with the bottom call-to-action.",
+ "label": "Bottom detail: text",
+ "required": False,
+ },
+ ),
+ 127: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 28),
+ ("heading_tag", 26),
+ ("description", 33),
+ ("image", 42),
+ ("image_ratio", 6),
+ ("image_badge", 73),
+ ("link", 74),
+ ("url", 75),
+ ("document", 76),
+ ("top_detail_text", 77),
+ ("top_detail_icon", 78),
+ ("top_detail_badges_tags", 81),
+ ("bottom_detail_text", 126),
+ ("bottom_detail_icon", 83),
+ ("call_to_action", 88),
+ ("grey_background", 89),
+ ("no_background", 90),
+ ("no_border", 91),
+ ("shadow", 92),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Vertical card"},
+ ),
+ 128: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Person",),
+ {
+ "help_text": "Optional, all values can be manually specified or overriden below",
+ "label": "Person",
+ "required": False,
+ },
+ ),
+ 129: ("wagtail.blocks.CharBlock", (), {"label": "Name", "max_length": 255, "required": False}),
+ 130: ("wagtail.blocks.CharBlock", (), {"label": "Role", "max_length": 255, "required": False}),
+ 131: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"label": "Organization", "max_length": 255, "required": False},
+ ),
+ 132: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"label": "Contact info", "max_length": 500, "required": False},
+ ),
+ 133: ("wagtail.blocks.StreamBlock", [[("tag", 63)]], {"label": "Tags", "required": False}),
+ 134: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("contact", 128),
+ ("link", 74),
+ ("heading_tag", 2),
+ ("name", 129),
+ ("role", 130),
+ ("organization", 131),
+ ("contact_info", 132),
+ ("image", 42),
+ ("tags", 133),
+ ]
+ ],
+ {"group": "Extra components", "label": "Contact card"},
+ ),
+ 135: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("contact_card", 134),
+ ]
+ ],
+ {"label": "Content"},
+ ),
+ 136: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 28), ("content", 135)]],
+ {"label": "Tab", "max_num": 15, "min_num": 1},
+ ),
+ 137: (
+ "wagtail.blocks.StreamBlock",
+ [[("tabs", 136)]],
+ {"group": "DSFR components", "label": "Tabs"},
+ ),
+ 138: ("wagtailmarkdown.blocks.MarkdownBlock", (), {"group": "Expert syntax", "label": "Markdown"}),
+ 139: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 110), ("url", 111), ("height", 112), ("parameters", 113)]],
+ {"group": "Expert syntax", "label": "Iframe"},
+ ),
+ 140: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {"default": 3, "label": "Top margin", "max_value": 15, "min_value": 0},
+ ),
+ 141: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {"default": 3, "label": "Bottom margin", "max_value": 15, "min_value": 0},
+ ),
+ 142: (
+ "wagtail.blocks.StructBlock",
+ [[("top_margin", 140), ("bottom_margin", 141)]],
+ {"group": "Page structure", "label": "Separator"},
+ ),
+ 143: (
+ "wagtail.images.blocks.ImageChooserBlock",
+ (),
+ {"label": "Background image", "required": False},
+ ),
+ 144: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("Primary colors", [("blue-france", "Blue France"), ("red-marianne", "Red Marianne")]),
+ ("Neutral colors", [("grey", "Grey")]),
+ (
+ "Illustration colors",
+ [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ ),
+ ],
+ "help_text": "Uses the French Design System colors",
+ "label": "Background color",
+ "required": False,
+ },
+ ),
+ 145: (
+ "wagtail.blocks.RegexBlock",
+ (),
+ {
+ "error_messages": {"invalid": "Incorrect color format, must be #fff or #f5f5f5"},
+ "help_text": "This field is obsolete and will be removed in the near future. Replace it with the background color.",
+ "label": "Background color, hexadecimal format (obsolete)",
+ "regex": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$",
+ "required": False,
+ },
+ ),
+ 146: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ("h6", "Heading 6"),
+ ("p", "Paragraph"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 2.",
+ "label": "Heading level",
+ "required": False,
+ },
+ ),
+ 147: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("3", "3/12"),
+ ("4", "4/12"),
+ ("5", "5/12"),
+ ("6", "6/12"),
+ ("7", "7/12"),
+ ("8", "8/12"),
+ ("9", "9/12"),
+ ],
+ "help_text": "The total width of all columns should be 12.",
+ "label": "Column width",
+ "required": False,
+ },
+ ),
+ 148: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("contact_card", 134),
+ ]
+ ],
+ {"label": "Column content"},
+ ),
+ 149: (
+ "wagtail.blocks.StructBlock",
+ [[("width", 147), ("content", 148)]],
+ {"group": "Page structure", "label": "Adjustable column"},
+ ),
+ 150: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("column", 149),
+ ]
+ ],
+ {"label": "Columns"},
+ ),
+ 151: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("bg_image", 143),
+ ("bg_color_class", 144),
+ ("bg_color", 145),
+ ("title", 1),
+ ("heading_tag", 146),
+ ("columns", 150),
+ ]
+ ],
+ {"group": "Page structure", "label": "Multiple columns"},
+ ),
+ 152: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {"choices": [("3", "3/12"), ("4", "4/12"), ("6", "6/12")], "label": "Column width"},
+ ),
+ 153: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("contact_card", 134),
+ ]
+ ],
+ {"label": "Items"},
+ ),
+ 154: (
+ "wagtail.blocks.StructBlock",
+ [[("column_width", 152), ("items", 153)]],
+ {"group": "Page structure", "label": "Item grid"},
+ ),
+ 155: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("image_and_text", 22),
+ ("card", 93),
+ ("tabs", 137),
+ ("item_grid", 154),
+ ]
+ ],
+ {"label": "Content"},
+ ),
+ 156: (
+ "wagtail.blocks.StructBlock",
+ [[("bg_image", 143), ("bg_color_class", 144), ("content", 155)]],
+ {"group": "Page structure", "label": "Full width background"},
+ ),
+ 157: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("image_and_text", 22),
+ ("card", 93),
+ ("tabs", 137),
+ ("item_grid", 154),
+ ]
+ ],
+ {"label": "Main content"},
+ ),
+ 158: ("wagtail.blocks.CharBlock", (), {"label": "Side menu title", "required": False}),
+ 159: (
+ "wagtail.blocks.RawHTMLBlock",
+ (),
+ {
+ "help_text": "Warning: Use HTML block with caution. Malicious code can compromise the security of the site.",
+ "label": "HTML",
+ },
+ ),
+ 160: ("wagtail.blocks.PageChooserBlock", (), {"label": "Parent page"}),
+ 161: ("wagtail.blocks.StructBlock", [[("page", 160)]], {"label": "Page tree"}),
+ 162: (
+ "wagtail.blocks.StreamBlock",
+ [[("html", 159), ("pagetree", 161)]],
+ {"label": "Side menu content"},
+ ),
+ 163: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("bg_image", 143),
+ ("bg_color_class", 144),
+ ("main_content", 157),
+ ("sidemenu_title", 158),
+ ("sidemenu_content", 162),
+ ]
+ ],
+ {"group": "Page structure", "label": "Full width background with side menu"},
+ ),
+ 164: (
+ "wagtail.blocks.static_block.StaticBlock",
+ (),
+ {
+ "admin_text": "A simple, alphabetical list of the subpages of the current page.",
+ "group": "Website structure",
+ "label": "Subpages list",
+ "template": "content_manager/blocks/subpages_list.html",
+ },
+ ),
+ 165: (
+ "wagtail.blocks.RawHTMLBlock",
+ (),
+ {
+ "group": "Expert syntax",
+ "help_text": "Warning: Use HTML block with caution. Malicious code can compromise the security of the site.",
+ "readonly": True,
+ },
+ ),
+ },
+ ),
+ ),
+ migrations.AlterField(
+ model_name="eventsindexpage",
+ name="body",
+ field=wagtail.fields.StreamField(
+ [
+ ("paragraph", 0),
+ ("image", 9),
+ ("imageandtext", 22),
+ ("alert", 27),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("video", 53),
+ ("transcription", 54),
+ ("badges_list", 59),
+ ("tags_list", 64),
+ ("link", 65),
+ ("stepper", 71),
+ ("card", 93),
+ ("tile", 103),
+ ("tabs", 137),
+ ("markdown", 138),
+ ("iframe", 139),
+ ("separator", 142),
+ ("multicolumns", 151),
+ ("item_grid", 154),
+ ("fullwidthbackground", 156),
+ ("fullwidthbackgroundwithsidemenu", 163),
+ ("subpageslist", 164),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("html", 165),
+ ],
+ blank=True,
+ block_lookup={
+ 0: ("wagtail.blocks.RichTextBlock", (), {"label": "Rich text"}),
+ 1: ("wagtail.blocks.CharBlock", (), {"label": "Title", "required": False}),
+ 2: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ("h6", "Heading 6"),
+ ("p", "Paragraph"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 3.",
+ "label": "Heading level",
+ "required": False,
+ },
+ ),
+ 3: ("wagtail.images.blocks.ImageChooserBlock", (), {"label": "Image"}),
+ 4: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"label": "Alternative text (textual description of the image)", "required": False},
+ ),
+ 5: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("fr-content-media--sm", "Small"),
+ ("", "Medium"),
+ ("fr-content-media--lg", "Large"),
+ ],
+ "label": "Witdh",
+ "required": False,
+ },
+ ),
+ 6: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("fr-ratio-32x9", "32x9"),
+ ("fr-ratio-16x9", "16x9"),
+ ("fr-ratio-3x2", "3x2"),
+ ("fr-ratio-4x3", "4x3"),
+ ("fr-ratio-1x1", "1x1"),
+ ("fr-ratio-3x4", "3x4"),
+ ("fr-ratio-2x3", "2x3"),
+ ],
+ "label": "Image ratio",
+ "required": False,
+ },
+ ),
+ 7: ("wagtail.blocks.CharBlock", (), {"label": "Caption", "required": False}),
+ 8: ("wagtail.blocks.URLBlock", (), {"label": "Link", "required": False}),
+ 9: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 2),
+ ("image", 3),
+ ("alt", 4),
+ ("width", 5),
+ ("image_ratio", 6),
+ ("caption", 7),
+ ("url", 8),
+ ]
+ ],
+ {},
+ ),
+ 10: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("left", "Left"), ("right", "Right")],
+ "label": "Side where the image is displayed",
+ },
+ ),
+ 11: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {"choices": [("3", "3/12"), ("5", "5/12"), ("6", "6/12")], "label": "Image width"},
+ ),
+ 12: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {
+ "help_text": "Link to a page of this site. Use either this, the document, or the external URL parameter.",
+ "label": "Page",
+ "required": False,
+ },
+ ),
+ 13: (
+ "wagtail.documents.blocks.DocumentChooserBlock",
+ (),
+ {
+ "help_text": "Use either this, the external URL or the page parameter.",
+ "label": "Document",
+ "required": False,
+ },
+ ),
+ 14: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "help_text": "Use either this, the document or the page parameter.",
+ "label": "External URL",
+ "required": False,
+ },
+ ),
+ 15: ("wagtail.blocks.CharBlock", (), {"label": "Link label", "required": False}),
+ 16: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("", "No icon"),
+ ("fr-icon-arrow-right-line fr-link--icon-right", "Icon on the right side"),
+ ("fr-icon-arrow-right-line fr-link--icon-left", "Icon on the left side"),
+ ],
+ "help_text": "Only used for internal links.",
+ "label": "Icon",
+ "required": False,
+ },
+ ),
+ 17: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-link--sm", "Small"), ("", "Medium"), ("fr-link--lg", "Large")],
+ "label": "Size",
+ "required": False,
+ },
+ ),
+ 18: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("icon", 16),
+ ("size", 17),
+ ]
+ ],
+ {
+ "help_text": "The link is shown at the bottom of the text block, with an arrow",
+ "label": "Link",
+ "required": False,
+ },
+ ),
+ 19: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "group": "obsolete",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Link label (obsolete)",
+ "required": False,
+ },
+ ),
+ 20: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {
+ "group": "obsolete",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Internal link (obsolete)",
+ "required": False,
+ },
+ ),
+ 21: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "group": "obsolete",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Link URL (obsolete)",
+ "required": False,
+ },
+ ),
+ 22: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("image", 3),
+ ("image_side", 10),
+ ("image_ratio", 11),
+ ("text", 0),
+ ("link", 18),
+ ("link_label", 19),
+ ("page", 20),
+ ("link_url", 21),
+ ]
+ ],
+ {"label": "Image and text"},
+ ),
+ 23: ("wagtail.blocks.CharBlock", (), {"label": "Message title", "required": False}),
+ 24: ("wagtail.blocks.TextBlock", (), {"label": "Message text", "required": False}),
+ 25: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("error", "Error"),
+ ("success", "Success"),
+ ("info", "Information"),
+ ("warning", "Warning"),
+ ],
+ "label": "Message type",
+ },
+ ),
+ 26: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ("h6", "Heading 6"),
+ ("p", "Paragraph"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 3.",
+ "label": "Heading level",
+ },
+ ),
+ 27: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 23), ("description", 24), ("level", 25), ("heading_tag", 26)]],
+ {"label": "Alert message"},
+ ),
+ 28: ("wagtail.blocks.CharBlock", (), {"label": "Title"}),
+ 29: ("wagtail.blocks.RichTextBlock", (), {"label": "Content"}),
+ 30: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 28), ("content", 29)]],
+ {"label": "Accordion", "max_num": 15, "min_num": 1},
+ ),
+ 31: (
+ "wagtail.blocks.StreamBlock",
+ [[("title", 28), ("accordion", 30)]],
+ {"group": "DSFR components", "label": "Accordions"},
+ ),
+ 32: ("content_manager.blocks.IconPickerBlock", (), {"label": "Icon", "required": False}),
+ 33: (
+ "wagtail.blocks.RichTextBlock",
+ (),
+ {
+ "features": [
+ "bold",
+ "italic",
+ "link",
+ "document-link",
+ "superscript",
+ "subscript",
+ "strikethrough",
+ ],
+ "label": "Content",
+ "required": False,
+ },
+ ),
+ 34: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("fr-btn", "Primary"),
+ ("fr-btn fr-btn--secondary", "Secundary"),
+ ("fr-btn fr-btn--tertiary", "Tertiary"),
+ ("fr-btn fr-btn--tertiary-no-outline", "Tertiary without border"),
+ ],
+ "label": "Button type",
+ "required": False,
+ },
+ ),
+ 35: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-btn--icon-left", "Left"), ("fr-btn--icon-right", "Right")],
+ "label": "Icon side",
+ "required": False,
+ },
+ ),
+ 36: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("button_type", 34),
+ ("icon_class", 32),
+ ("icon_side", 35),
+ ]
+ ],
+ {"label": "Button", "required": False},
+ ),
+ 37: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ "label": "Color",
+ "required": False,
+ },
+ ),
+ 38: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 26),
+ ("icon_class", 32),
+ ("text", 33),
+ ("button", 36),
+ ("color", 37),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Callout"},
+ ),
+ 39: (
+ "wagtail.blocks.RichTextBlock",
+ (),
+ {
+ "features": [
+ "bold",
+ "italic",
+ "link",
+ "document-link",
+ "superscript",
+ "subscript",
+ "strikethrough",
+ ],
+ "label": "Content",
+ },
+ ),
+ 40: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-text--sm", "Small"), ("", "Medium"), ("fr-text--lg", "Large")],
+ "label": "Size",
+ "required": False,
+ },
+ ),
+ 41: (
+ "wagtail.blocks.StructBlock",
+ [[("text", 39), ("color", 37), ("size", 40)]],
+ {"group": "DSFR components", "label": "Highlight"},
+ ),
+ 42: ("wagtail.images.blocks.ImageChooserBlock", (), {"label": "Image", "required": False}),
+ 43: ("wagtail.blocks.CharBlock", (), {"label": "Quote"}),
+ 44: ("wagtail.blocks.CharBlock", (), {"label": "Author name", "required": False}),
+ 45: ("wagtail.blocks.CharBlock", (), {"label": "Author title", "required": False}),
+ 46: (
+ "wagtail.blocks.StructBlock",
+ [[("image", 42), ("quote", 43), ("author_name", 44), ("author_title", 45), ("color", 37)]],
+ {"group": "DSFR components", "label": "Quote"},
+ ),
+ 47: ("wagtail.blocks.CharBlock", (), {"label": "Video title", "required": False}),
+ 48: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "help_text": "Use embed format, with a version that doesn't require a consent banner if available. (e.g. : https://www.youtube-nocookie.com/embed/gLzXOViPX-0) For Youtube, use Embed video and check Enable privacy-enhanced mode.",
+ "label": "Video URL",
+ },
+ ),
+ 49: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-ratio-16x9", "16x9"), ("fr-ratio-4x3", "4x3"), ("fr-ratio-1x1", "1x1")],
+ "label": "Video ratio",
+ "required": False,
+ },
+ ),
+ 50: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"default": "Transcription", "label": "Title", "required": False},
+ ),
+ 51: ("wagtail.blocks.RichTextBlock", (), {"label": "Transcription content", "required": False}),
+ 52: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 50), ("content", 51)]],
+ {"label": "Transcription", "required": False},
+ ),
+ 53: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 47),
+ ("caption", 7),
+ ("url", 48),
+ ("width", 5),
+ ("video_ratio", 49),
+ ("transcription", 52),
+ ]
+ ],
+ {"label": "Video"},
+ ),
+ 54: ("wagtail.blocks.StructBlock", [[("title", 50), ("content", 51)]], {"label": "Transcription"}),
+ 55: ("wagtail.blocks.CharBlock", (), {"label": "Badge label", "required": False}),
+ 56: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("", [("new", "New"), ("grey", "Grey")]),
+ (
+ "System colors",
+ [
+ ("info", "Info"),
+ ("success", "Success"),
+ ("warning", "Warning"),
+ ("error", "Error"),
+ ],
+ ),
+ (
+ "Illustration colors",
+ [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ ),
+ ],
+ "label": "Badge color",
+ "required": False,
+ },
+ ),
+ 57: ("wagtail.blocks.BooleanBlock", (), {"label": "Hide badge icon", "required": False}),
+ 58: (
+ "wagtail.blocks.StructBlock",
+ [[("text", 55), ("color", 56), ("hide_icon", 57)]],
+ {"label": "Badge"},
+ ),
+ 59: ("wagtail.blocks.StreamBlock", [[("badge", 58)]], {"label": "Badge list"}),
+ 60: ("wagtail.blocks.BooleanBlock", (), {"label": "Small tag", "required": False}),
+ 61: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ "help_text": "Only for clickable tags",
+ "label": "Tag color",
+ "required": False,
+ },
+ ),
+ 62: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 12), ("document", 13), ("external_url", 14)]],
+ {"required": False},
+ ),
+ 63: (
+ "wagtail.blocks.StructBlock",
+ [[("label", 28), ("is_small", 60), ("color", 61), ("icon_class", 32), ("link", 62)]],
+ {"label": "Tag"},
+ ),
+ 64: ("wagtail.blocks.StreamBlock", [[("tag", 63)]], {"label": "Tag list"}),
+ 65: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("icon", 16),
+ ("size", 17),
+ ]
+ ],
+ {"label": "Single link"},
+ ),
+ 66: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {"label": "Number of steps", "max_value": 8, "min_value": 1},
+ ),
+ 67: ("wagtail.blocks.IntegerBlock", (), {"label": "Current step", "max_value": 8, "min_value": 1}),
+ 68: ("wagtail.blocks.TextBlock", (), {"label": "Detail"}),
+ 69: ("wagtail.blocks.StructBlock", [[("title", 28), ("detail", 68)]], {"label": "Step"}),
+ 70: ("wagtail.blocks.StreamBlock", [[("step", 69)]], {"label": "Steps"}),
+ 71: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 28), ("total", 66), ("current", 67), ("steps", 70)]],
+ {"group": "DSFR components", "label": "Stepper"},
+ ),
+ 72: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [("fr-card--horizontal-tier", "1/3"), ("fr-card--horizontal-half", "50/50")],
+ "label": "Image ratio",
+ "required": False,
+ },
+ ),
+ 73: (
+ "wagtail.blocks.StreamBlock",
+ [[("badge", 58)]],
+ {
+ "help_text": "Only used if the card has an image.",
+ "label": "Image area badge",
+ "max_num": 1,
+ "required": False,
+ },
+ ),
+ 74: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 12), ("document", 13), ("external_url", 14)]],
+ {"label": "Link", "required": False},
+ ),
+ 75: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "group": "target",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "Link (obsolete)",
+ "required": False,
+ },
+ ),
+ 76: (
+ "wagtail.documents.blocks.DocumentChooserBlock",
+ (),
+ {
+ "group": "target",
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the Link field above.",
+ "label": "or Document (obsolete)",
+ "required": False,
+ },
+ ),
+ 77: ("wagtail.blocks.CharBlock", (), {"label": "Top detail: text", "required": False}),
+ 78: (
+ "content_manager.blocks.IconPickerBlock",
+ (),
+ {"label": "Top detail: icon", "required": False},
+ ),
+ 79: ("wagtail.blocks.StreamBlock", [[("badge", 58)]], {}),
+ 80: ("wagtail.blocks.StreamBlock", [[("tag", 63)]], {}),
+ 81: (
+ "wagtail.blocks.StreamBlock",
+ [[("badges", 79), ("tags", 80)]],
+ {"label": "Top detail: badges or tags", "max_num": 1, "required": False},
+ ),
+ 82: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "Incompatible with the bottom call-to-action. If the card links to a downloadable document, the values are pre-filled.",
+ "label": "Bottom detail: text",
+ "required": False,
+ },
+ ),
+ 83: (
+ "content_manager.blocks.IconPickerBlock",
+ (),
+ {"label": "Bottom detail: icon", "required": False},
+ ),
+ 84: (
+ "wagtail.blocks.StructBlock",
+ [[("page", 12), ("document", 13), ("external_url", 14), ("text", 15)]],
+ {"label": "Link"},
+ ),
+ 85: ("wagtail.blocks.StreamBlock", [[("link", 84)]], {}),
+ 86: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("page", 12),
+ ("document", 13),
+ ("external_url", 14),
+ ("text", 15),
+ ("button_type", 34),
+ ("icon_class", 32),
+ ("icon_side", 35),
+ ]
+ ],
+ {"label": "Button"},
+ ),
+ 87: (
+ "wagtail.blocks.StreamBlock",
+ [[("button", 86)]],
+ {
+ "help_text": "Please use only one primary button.\n If you use icons, use them on all buttons and align them on the same side.",
+ "label": "Buttons",
+ },
+ ),
+ 88: (
+ "wagtail.blocks.StreamBlock",
+ [[("links", 85), ("buttons", 87)]],
+ {
+ "help_text": "Incompatible with the bottom detail text.",
+ "label": "Bottom call-to-action: links or buttons",
+ "max_num": 1,
+ "required": False,
+ },
+ ),
+ 89: ("wagtail.blocks.BooleanBlock", (), {"label": "Card with grey background", "required": False}),
+ 90: ("wagtail.blocks.BooleanBlock", (), {"label": "Card without background", "required": False}),
+ 91: ("wagtail.blocks.BooleanBlock", (), {"label": "Card without border", "required": False}),
+ 92: ("wagtail.blocks.BooleanBlock", (), {"label": "Card with a shadow", "required": False}),
+ 93: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 28),
+ ("heading_tag", 26),
+ ("description", 33),
+ ("image", 42),
+ ("image_ratio", 72),
+ ("image_badge", 73),
+ ("link", 74),
+ ("url", 75),
+ ("document", 76),
+ ("top_detail_text", 77),
+ ("top_detail_icon", 78),
+ ("top_detail_badges_tags", 81),
+ ("bottom_detail_text", 82),
+ ("bottom_detail_icon", 83),
+ ("call_to_action", 88),
+ ("grey_background", 89),
+ ("no_background", 90),
+ ("no_border", 91),
+ ("shadow", 92),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Horizontal card"},
+ ),
+ 94: (
+ "wagtail.blocks.RichTextBlock",
+ (),
+ {
+ "features": ["bold", "italic", "superscript", "subscript", "strikethrough"],
+ "label": "Content",
+ "required": False,
+ },
+ ),
+ 95: (
+ "wagtail.images.blocks.ImageChooserBlock",
+ (),
+ {"help_text": "Prefer SVG files.", "label": "Image", "required": False},
+ ),
+ 96: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "If the tile links to a downloadable document, the values are pre-filled.",
+ "label": "Detail text",
+ "required": False,
+ },
+ ),
+ 97: ("wagtail.blocks.BooleanBlock", (), {"label": "Small tile", "required": False}),
+ 98: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile with grey background", "required": False}),
+ 99: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile without background", "required": False}),
+ 100: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile without border", "required": False}),
+ 101: ("wagtail.blocks.BooleanBlock", (), {"label": "Tile with a shadow", "required": False}),
+ 102: ("wagtail.blocks.BooleanBlock", (), {"label": "Horizontal tile", "required": False}),
+ 103: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 28),
+ ("heading_tag", 26),
+ ("description", 94),
+ ("image", 95),
+ ("link", 74),
+ ("top_detail_badges_tags", 81),
+ ("detail_text", 96),
+ ("is_small", 97),
+ ("grey_background", 98),
+ ("no_background", 99),
+ ("no_border", 100),
+ ("shadow", 101),
+ ("is_horizontal", 102),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Tile"},
+ ),
+ 104: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 2),
+ ("image", 3),
+ ("alt", 4),
+ ("width", 5),
+ ("image_ratio", 6),
+ ("caption", 7),
+ ("url", 8),
+ ]
+ ],
+ {"label": "Image"},
+ ),
+ 105: ("wagtail.blocks.RichTextBlock", (), {"label": "Rich text", "required": False}),
+ 106: (
+ "wagtail.blocks.StreamBlock",
+ [[("buttons", 87)]],
+ {"label": "Call-to-action buttons", "max_num": 1, "required": False},
+ ),
+ 107: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the CTA buttons above.",
+ "label": "Call to action label (obsolete)",
+ "required": False,
+ },
+ ),
+ 108: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "This field is obsolete and will be removed in the near future. Please replace with the CTA buttons above.",
+ "label": "Link (obsolete)",
+ "required": False,
+ },
+ ),
+ 109: (
+ "wagtail.blocks.StructBlock",
+ [[("text", 105), ("cta_buttons", 106), ("cta_label", 107), ("cta_url", 108)]],
+ {"label": "Text and call to action"},
+ ),
+ 110: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "Accessibility: The title should describe, in a clear and concise manner, the embedded content.",
+ "label": "Title",
+ },
+ ),
+ 111: (
+ "wagtail.blocks.URLBlock",
+ (),
+ {
+ "help_text": "Example for Tally: https://tally.so/embed/w2jMRa",
+ "label": "URL of the iframe",
+ },
+ ),
+ 112: ("wagtail.blocks.IntegerBlock", (), {"label": "Height (in pixels)"}),
+ 113: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "For example: \"allow='geolocation'\".",
+ "label": "Parameters",
+ "required": False,
+ },
+ ),
+ 114: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 110), ("url", 111), ("height", 112), ("parameters", 113)]],
+ {"group": "DSFR components", "label": "Iframe"},
+ ),
+ 115: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 2.",
+ "label": "Heading level",
+ "required": False,
+ },
+ ),
+ 116: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {"label": "Blog", "page_type": ["blog.BlogIndexPage"]},
+ ),
+ 117: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {
+ "default": 3,
+ "label": "Number of entries",
+ "max_value": 8,
+ "min_value": 1,
+ "required": False,
+ },
+ ),
+ 118: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Category",),
+ {"label": "Filter by category", "required": False},
+ ),
+ 119: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("content_manager.Tag",),
+ {"label": "Filter by tag", "required": False},
+ ),
+ 120: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Person",),
+ {"label": "Filter by author", "required": False},
+ ),
+ 121: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Organization",),
+ {
+ "help_text": "The source is the organization of the post author",
+ "label": "Filter by source",
+ "required": False,
+ },
+ ),
+ 122: (
+ "wagtail.blocks.BooleanBlock",
+ (),
+ {"default": False, "label": "Show filters", "required": False},
+ ),
+ 123: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 115),
+ ("blog", 116),
+ ("entries_count", 117),
+ ("category_filter", 118),
+ ("tag_filter", 119),
+ ("author_filter", 120),
+ ("source_filter", 121),
+ ("show_filters", 122),
+ ]
+ ],
+ {"group": "Website structure", "label": "Blog recent entries"},
+ ),
+ 124: (
+ "wagtail.blocks.PageChooserBlock",
+ (),
+ {"label": "Event calendar", "page_type": ["events.EventsIndexPage"]},
+ ),
+ 125: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 1),
+ ("heading_tag", 115),
+ ("index_page", 124),
+ ("entries_count", 117),
+ ("category_filter", 118),
+ ("tag_filter", 119),
+ ("author_filter", 120),
+ ("source_filter", 121),
+ ("show_filters", 122),
+ ]
+ ],
+ {"group": "Website structure", "label": "Event calendar recent entries"},
+ ),
+ 126: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {
+ "help_text": "Incompatible with the bottom call-to-action.",
+ "label": "Bottom detail: text",
+ "required": False,
+ },
+ ),
+ 127: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("title", 28),
+ ("heading_tag", 26),
+ ("description", 33),
+ ("image", 42),
+ ("image_ratio", 6),
+ ("image_badge", 73),
+ ("link", 74),
+ ("url", 75),
+ ("document", 76),
+ ("top_detail_text", 77),
+ ("top_detail_icon", 78),
+ ("top_detail_badges_tags", 81),
+ ("bottom_detail_text", 126),
+ ("bottom_detail_icon", 83),
+ ("call_to_action", 88),
+ ("grey_background", 89),
+ ("no_background", 90),
+ ("no_border", 91),
+ ("shadow", 92),
+ ]
+ ],
+ {"group": "DSFR components", "label": "Vertical card"},
+ ),
+ 128: (
+ "wagtail.snippets.blocks.SnippetChooserBlock",
+ ("blog.Person",),
+ {
+ "help_text": "Optional, all values can be manually specified or overriden below",
+ "label": "Person",
+ "required": False,
+ },
+ ),
+ 129: ("wagtail.blocks.CharBlock", (), {"label": "Name", "max_length": 255, "required": False}),
+ 130: ("wagtail.blocks.CharBlock", (), {"label": "Role", "max_length": 255, "required": False}),
+ 131: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"label": "Organization", "max_length": 255, "required": False},
+ ),
+ 132: (
+ "wagtail.blocks.CharBlock",
+ (),
+ {"label": "Contact info", "max_length": 500, "required": False},
+ ),
+ 133: ("wagtail.blocks.StreamBlock", [[("tag", 63)]], {"label": "Tags", "required": False}),
+ 134: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("contact", 128),
+ ("link", 74),
+ ("heading_tag", 2),
+ ("name", 129),
+ ("role", 130),
+ ("organization", 131),
+ ("contact_info", 132),
+ ("image", 42),
+ ("tags", 133),
+ ]
+ ],
+ {"group": "Extra components", "label": "Contact card"},
+ ),
+ 135: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("contact_card", 134),
+ ]
+ ],
+ {"label": "Content"},
+ ),
+ 136: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 28), ("content", 135)]],
+ {"label": "Tab", "max_num": 15, "min_num": 1},
+ ),
+ 137: (
+ "wagtail.blocks.StreamBlock",
+ [[("tabs", 136)]],
+ {"group": "DSFR components", "label": "Tabs"},
+ ),
+ 138: ("wagtailmarkdown.blocks.MarkdownBlock", (), {"group": "Expert syntax", "label": "Markdown"}),
+ 139: (
+ "wagtail.blocks.StructBlock",
+ [[("title", 110), ("url", 111), ("height", 112), ("parameters", 113)]],
+ {"group": "Expert syntax", "label": "Iframe"},
+ ),
+ 140: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {"default": 3, "label": "Top margin", "max_value": 15, "min_value": 0},
+ ),
+ 141: (
+ "wagtail.blocks.IntegerBlock",
+ (),
+ {"default": 3, "label": "Bottom margin", "max_value": 15, "min_value": 0},
+ ),
+ 142: (
+ "wagtail.blocks.StructBlock",
+ [[("top_margin", 140), ("bottom_margin", 141)]],
+ {"group": "Page structure", "label": "Separator"},
+ ),
+ 143: (
+ "wagtail.images.blocks.ImageChooserBlock",
+ (),
+ {"label": "Background image", "required": False},
+ ),
+ 144: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("Primary colors", [("blue-france", "Blue France"), ("red-marianne", "Red Marianne")]),
+ ("Neutral colors", [("grey", "Grey")]),
+ (
+ "Illustration colors",
+ [
+ ("green-tilleul-verveine", "Tilleul verveine"),
+ ("green-bourgeon", "Bourgeon"),
+ ("green-emeraude", "Émeraude"),
+ ("green-menthe", "Menthe"),
+ ("green-archipel", "Archipel"),
+ ("blue-ecume", "Écume"),
+ ("blue-cumulus", "Cumulus"),
+ ("purple-glycine", "Glycine"),
+ ("pink-macaron", "Macaron"),
+ ("pink-tuile", "Tuile"),
+ ("yellow-tournesol", "Tournesol"),
+ ("yellow-moutarde", "Moutarde"),
+ ("orange-terre-battue", "Terre battue"),
+ ("brown-cafe-creme", "Café crème"),
+ ("brown-caramel", "Caramel"),
+ ("brown-opera", "Opéra"),
+ ("beige-gris-galet", "Gris galet"),
+ ],
+ ),
+ ],
+ "help_text": "Uses the French Design System colors",
+ "label": "Background color",
+ "required": False,
+ },
+ ),
+ 145: (
+ "wagtail.blocks.RegexBlock",
+ (),
+ {
+ "error_messages": {"invalid": "Incorrect color format, must be #fff or #f5f5f5"},
+ "help_text": "This field is obsolete and will be removed in the near future. Replace it with the background color.",
+ "label": "Background color, hexadecimal format (obsolete)",
+ "regex": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$",
+ "required": False,
+ },
+ ),
+ 146: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("h2", "Heading 2"),
+ ("h3", "Heading 3"),
+ ("h4", "Heading 4"),
+ ("h5", "Heading 5"),
+ ("h6", "Heading 6"),
+ ("p", "Paragraph"),
+ ],
+ "help_text": "Adapt to the page layout. Defaults to heading 2.",
+ "label": "Heading level",
+ "required": False,
+ },
+ ),
+ 147: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {
+ "choices": [
+ ("3", "3/12"),
+ ("4", "4/12"),
+ ("5", "5/12"),
+ ("6", "6/12"),
+ ("7", "7/12"),
+ ("8", "8/12"),
+ ("9", "9/12"),
+ ],
+ "help_text": "The total width of all columns should be 12.",
+ "label": "Column width",
+ "required": False,
+ },
+ ),
+ 148: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("contact_card", 134),
+ ]
+ ],
+ {"label": "Column content"},
+ ),
+ 149: (
+ "wagtail.blocks.StructBlock",
+ [[("width", 147), ("content", 148)]],
+ {"group": "Page structure", "label": "Adjustable column"},
+ ),
+ 150: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("column", 149),
+ ]
+ ],
+ {"label": "Columns"},
+ ),
+ 151: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("bg_image", 143),
+ ("bg_color_class", 144),
+ ("bg_color", 145),
+ ("title", 1),
+ ("heading_tag", 146),
+ ("columns", 150),
+ ]
+ ],
+ {"group": "Page structure", "label": "Multiple columns"},
+ ),
+ 152: (
+ "wagtail.blocks.ChoiceBlock",
+ [],
+ {"choices": [("3", "3/12"), ("4", "4/12"), ("6", "6/12")], "label": "Column width"},
+ ),
+ 153: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("card", 127),
+ ("contact_card", 134),
+ ]
+ ],
+ {"label": "Items"},
+ ),
+ 154: (
+ "wagtail.blocks.StructBlock",
+ [[("column_width", 152), ("items", 153)]],
+ {"group": "Page structure", "label": "Item grid"},
+ ),
+ 155: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("image_and_text", 22),
+ ("card", 93),
+ ("tabs", 137),
+ ("item_grid", 154),
+ ]
+ ],
+ {"label": "Content"},
+ ),
+ 156: (
+ "wagtail.blocks.StructBlock",
+ [[("bg_image", 143), ("bg_color_class", 144), ("content", 155)]],
+ {"group": "Page structure", "label": "Full width background"},
+ ),
+ 157: (
+ "wagtail.blocks.StreamBlock",
+ [
+ [
+ ("text", 0),
+ ("image", 104),
+ ("video", 53),
+ ("transcription", 54),
+ ("accordions", 31),
+ ("callout", 38),
+ ("highlight", 41),
+ ("quote", 46),
+ ("stepper", 71),
+ ("text_cta", 109),
+ ("link", 65),
+ ("iframe", 114),
+ ("tile", 103),
+ ("blog_recent_entries", 123),
+ ("events_recent_entries", 125),
+ ("image_and_text", 22),
+ ("card", 93),
+ ("tabs", 137),
+ ("item_grid", 154),
+ ]
+ ],
+ {"label": "Main content"},
+ ),
+ 158: ("wagtail.blocks.CharBlock", (), {"label": "Side menu title", "required": False}),
+ 159: (
+ "wagtail.blocks.RawHTMLBlock",
+ (),
+ {
+ "help_text": "Warning: Use HTML block with caution. Malicious code can compromise the security of the site.",
+ "label": "HTML",
+ },
+ ),
+ 160: ("wagtail.blocks.PageChooserBlock", (), {"label": "Parent page"}),
+ 161: ("wagtail.blocks.StructBlock", [[("page", 160)]], {"label": "Page tree"}),
+ 162: (
+ "wagtail.blocks.StreamBlock",
+ [[("html", 159), ("pagetree", 161)]],
+ {"label": "Side menu content"},
+ ),
+ 163: (
+ "wagtail.blocks.StructBlock",
+ [
+ [
+ ("bg_image", 143),
+ ("bg_color_class", 144),
+ ("main_content", 157),
+ ("sidemenu_title", 158),
+ ("sidemenu_content", 162),
+ ]
+ ],
+ {"group": "Page structure", "label": "Full width background with side menu"},
+ ),
+ 164: (
+ "wagtail.blocks.static_block.StaticBlock",
+ (),
+ {
+ "admin_text": "A simple, alphabetical list of the subpages of the current page.",
+ "group": "Website structure",
+ "label": "Subpages list",
+ "template": "content_manager/blocks/subpages_list.html",
+ },
+ ),
+ 165: (
+ "wagtail.blocks.RawHTMLBlock",
+ (),
+ {
+ "group": "Expert syntax",
+ "help_text": "Warning: Use HTML block with caution. Malicious code can compromise the security of the site.",
+ "readonly": True,
+ },
+ ),
+ },
+ ),
+ ),
+ ]
diff --git a/poetry.lock b/poetry.lock
index 5274b697..d679b940 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -131,17 +131,17 @@ webencodings = "*"
[[package]]
name = "boto3"
-version = "1.35.54"
+version = "1.35.65"
description = "The AWS SDK for Python"
optional = false
python-versions = ">=3.8"
files = [
- {file = "boto3-1.35.54-py3-none-any.whl", hash = "sha256:2d5e160b614db55fbee7981001c54476cb827c441cef65b2fcb2c52a62019909"},
- {file = "boto3-1.35.54.tar.gz", hash = "sha256:7d9c359bbbc858a60b51c86328db813353c8bd1940212cdbd0a7da835291c2e1"},
+ {file = "boto3-1.35.65-py3-none-any.whl", hash = "sha256:acbca38322b66516450f959c7874826267d431becdc2b080e331e56c2ebbe507"},
+ {file = "boto3-1.35.65.tar.gz", hash = "sha256:f6c266b4124b92b1603727bf1ed1917e0b74a899bd0e326f151d80c3eaed27a1"},
]
[package.dependencies]
-botocore = ">=1.35.54,<1.36.0"
+botocore = ">=1.35.65,<1.36.0"
jmespath = ">=0.7.1,<2.0.0"
s3transfer = ">=0.10.0,<0.11.0"
@@ -150,13 +150,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"]
[[package]]
name = "botocore"
-version = "1.35.54"
+version = "1.35.65"
description = "Low-level, data-driven core of boto 3."
optional = false
python-versions = ">=3.8"
files = [
- {file = "botocore-1.35.54-py3-none-any.whl", hash = "sha256:9cca1811094b6cdc144c2c063a3ec2db6d7c88194b04d4277cd34fc8e3473aff"},
- {file = "botocore-1.35.54.tar.gz", hash = "sha256:131bb59ce59c8a939b31e8e647242d70cf11d32d4529fa4dca01feea1e891a76"},
+ {file = "botocore-1.35.65-py3-none-any.whl", hash = "sha256:8fcaa82ab2338f412e1494449c4c57f9ca785623fb0303f6be5b279c4d27522c"},
+ {file = "botocore-1.35.65.tar.gz", hash = "sha256:46652f732f2b2fb395fffcc33cacb288d05ea283047c9a996fb59d6849464919"},
]
[package.dependencies]
@@ -406,13 +406,13 @@ static3 = "*"
[[package]]
name = "django"
-version = "5.1.2"
+version = "5.1.3"
description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design."
optional = false
python-versions = ">=3.10"
files = [
- {file = "Django-5.1.2-py3-none-any.whl", hash = "sha256:f11aa87ad8d5617171e3f77e1d5d16f004b79a2cf5d2e1d2b97a6a1f8e9ba5ed"},
- {file = "Django-5.1.2.tar.gz", hash = "sha256:bd7376f90c99f96b643722eee676498706c9fd7dc759f55ebfaf2c08ebcdf4f0"},
+ {file = "Django-5.1.3-py3-none-any.whl", hash = "sha256:8b38a9a12da3ae00cb0ba72da985ec4b14de6345046b1e174b1fd7254398f818"},
+ {file = "Django-5.1.3.tar.gz", hash = "sha256:c0fa0e619c39325a169208caef234f90baa925227032ad3f44842ba14d75234a"},
]
[package.dependencies]
@@ -502,13 +502,13 @@ sqlparse = ">=0.2"
[[package]]
name = "django-dsfr"
-version = "1.4.1"
+version = "1.4.3"
description = "Integrate the French government Design System into a Django app"
optional = false
python-versions = "<4.0,>=3.8"
files = [
- {file = "django_dsfr-1.4.1-py3-none-any.whl", hash = "sha256:14271680d40b74c1a8264ed9086d4852bac40b47639dbb53ca7154f02f3148da"},
- {file = "django_dsfr-1.4.1.tar.gz", hash = "sha256:a8caefb2caf00d87fae8031440513de7fd2cb023f259f74cca42f29ca72e71ee"},
+ {file = "django_dsfr-1.4.3-py3-none-any.whl", hash = "sha256:7f30dc601137dd70ad0ba07b1c1d04009ba71976f82db26a3f1b64ce22c02fdf"},
+ {file = "django_dsfr-1.4.3.tar.gz", hash = "sha256:f104b5554e35ab635e921587f854288a5a5382a66f37112bac6a6beeb415a728"},
]
[package.dependencies]
@@ -673,41 +673,39 @@ django = ">=4.2"
[[package]]
name = "djlint"
-version = "1.35.4"
+version = "1.36.1"
description = "HTML Template Linter and Formatter"
optional = false
python-versions = ">=3.9"
files = [
- {file = "djlint-1.35.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:14a278a340a46f8e1187afba8e0bccdd6ebee58ac129807448d35f6445671665"},
- {file = "djlint-1.35.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e741641de0a26025ef6ba04978aea9480a1d3ddd4d9060820cbc250a34a552bf"},
- {file = "djlint-1.35.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2effff20e821199439882843a56179e6b1c158c2c2a1b058e1e5d87643f84c77"},
- {file = "djlint-1.35.4-cp310-cp310-win_amd64.whl", hash = "sha256:085fdc16d359abf270f1bfe7b22d4cc73c85ab070147cefb09b32d962cefddc3"},
- {file = "djlint-1.35.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66db077a033c03abe26ebdd7819229a86cee9edb7ce6c5eab03100c5dc178202"},
- {file = "djlint-1.35.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d62563deae046bc2e94747110bc785cce416088e9ee6db6c31702c01d0f5212f"},
- {file = "djlint-1.35.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c4bfbaba4622a1439d30956da891315aefce7c56ffaefe1220cfeb1d99cf628"},
- {file = "djlint-1.35.4-cp311-cp311-win_amd64.whl", hash = "sha256:677d95914d45b6fdeaf3f356dd857feef55be041804909e5a35042acc7c7c196"},
- {file = "djlint-1.35.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c5dddbf2d5cb2bbbf4ef53c6e7c0042e41ff3e7097eed3f1ce53a8e4c2cb7eec"},
- {file = "djlint-1.35.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:65ebe3f4dcee2944d101e3ccadc71cab13a4c59cebd428bb5ba59609d365c232"},
- {file = "djlint-1.35.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b457e672fca03eefdfcf6e4c1dd4bfc2c324e8b0755e5def2d94c9273eb6edc7"},
- {file = "djlint-1.35.4-cp312-cp312-win_amd64.whl", hash = "sha256:6982bebd9e2587bc503d6bd0fdea492fd70ebac79aad7cbecd0d67dfebe1de4e"},
- {file = "djlint-1.35.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7b12ad12048c4a44a61bd39e5f85147e9b8f1ca85b76c5066603747f660a2922"},
- {file = "djlint-1.35.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:24aca63394d2f060d5f6367c34e3dca3ecb1c5c5a908ce24147243bccc8710c9"},
- {file = "djlint-1.35.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:858e6bce13aedaf387a20d625e4795113b78ac1fb572bd4d03abb76f89822722"},
- {file = "djlint-1.35.4-cp313-cp313-win_amd64.whl", hash = "sha256:491a41c23981164bbc7bc754ab0d39c99f5aa1887680a3fd00543f6dd50fc907"},
- {file = "djlint-1.35.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:519546a873909ab7832cb1b07f9503fa8b6fee2a8178e4ee42ae62640eb19b93"},
- {file = "djlint-1.35.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c7864eceffed926eabc78f52a2aeda3895df8eb38b6ff17e4455debba64cd922"},
- {file = "djlint-1.35.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8adcfb56fcb20010f4c778b879846ec488689356a1f9e502326d980e582e78a9"},
- {file = "djlint-1.35.4-cp39-cp39-win_amd64.whl", hash = "sha256:0c41a21de3de0e60cc02154d432d407577e83e21e2ac7ca45f195095beb57099"},
- {file = "djlint-1.35.4-py3-none-any.whl", hash = "sha256:ed6088d416019e453c1451463ed44ffbf3f84c3bd8b1dfeadc456103fd1e5d14"},
- {file = "djlint-1.35.4.tar.gz", hash = "sha256:d4a1342d83e65171059925b87ab351a1d5201289a764f9e092ef7a99e312554e"},
+ {file = "djlint-1.36.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef40527fd6cd82cdd18f65a6bf5b486b767d2386f6c21f2ebd60e5d88f487fe8"},
+ {file = "djlint-1.36.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4712de3dea172000a098da6a0cd709d158909b4964ba0f68bee584cef18b4878"},
+ {file = "djlint-1.36.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63d01c1425170b7059d68a3b01709e1c31d2cd6520a1eb0166e6670fd250518a"},
+ {file = "djlint-1.36.1-cp310-cp310-win_amd64.whl", hash = "sha256:65585a97d3a37760b4c1fbd089a3573506ad0ab2885119322a66231f911d113f"},
+ {file = "djlint-1.36.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:607437a0a230462916858c269bc5dfd15ff71b27d15dfd1ad6e96b3da9cbd8f6"},
+ {file = "djlint-1.36.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ddc9ae6b83b288465f6685b24797adbde79952d6e1a5276026e5ef479bac76f"},
+ {file = "djlint-1.36.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:001e5124b0ebab60a2044134abd11ff11dee772e7c3caaa2c8d12eb5d3b1f1dc"},
+ {file = "djlint-1.36.1-cp311-cp311-win_amd64.whl", hash = "sha256:095d62f3cabbac08683c51c1d9dacab522b54437a2a317df9e134599360f7b89"},
+ {file = "djlint-1.36.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:210f319c2d22489aebc0e9c1acd5015ca3892b66fa35647344511b3c03fcbe82"},
+ {file = "djlint-1.36.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7aa3db13d7702c35f4e408325061d9d4e84d006c99bb3e55fddf2b2543736923"},
+ {file = "djlint-1.36.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f907e97f4d67f4423dc71671592891cfd9cd311aeef14db25633f292dbf7048"},
+ {file = "djlint-1.36.1-cp312-cp312-win_amd64.whl", hash = "sha256:abadf6b61dc53d81710f230542f57f2d470b7503cd3108ad8a0113271c0514dd"},
+ {file = "djlint-1.36.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7f31646435385eec1d4b03dad7bebb5e4078d9893c60d490a685535bd6303c83"},
+ {file = "djlint-1.36.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4399477ac51f9c8147eedbef70aa8465eccba6759d875d1feec6782744aa168a"},
+ {file = "djlint-1.36.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f08c217b17d3ae3c0e3b5fff57fb708029cceda6e232f5a54ff1b3aeb43a7540"},
+ {file = "djlint-1.36.1-cp313-cp313-win_amd64.whl", hash = "sha256:1577490802ca4697af3488ed13066c9214ef0f625a96aa20d4f297e37aa19303"},
+ {file = "djlint-1.36.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ae356faf8180c7629ca705b7b9d8c9269b2c53273a1887a438a21b8fa263588"},
+ {file = "djlint-1.36.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2237ac5cecd2524960e1684f64ce358624b0d769b7404e5aad415750ad00edc9"},
+ {file = "djlint-1.36.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02c22352a49c053ff6260428ed571afb783011d20afc98b44bbe1dd2fa2d5418"},
+ {file = "djlint-1.36.1-cp39-cp39-win_amd64.whl", hash = "sha256:99a2debeea2e931b68360306fdbf13861e3d6f96037a9d882f3d4d5e44fdc319"},
+ {file = "djlint-1.36.1-py3-none-any.whl", hash = "sha256:950782b396dd82b74622c09d7e4c52328e56a3b03c8ac790c319708e5caa0686"},
+ {file = "djlint-1.36.1.tar.gz", hash = "sha256:f7260637ed72c270fa6dd4a87628e1a21c49b24a46df52e4e26f44d4934fb97c"},
]
[package.dependencies]
click = ">=8.0.1"
colorama = ">=0.4.4"
cssbeautifier = ">=1.14.4"
-html-tag-names = ">=0.1.2"
-html-void-elements = ">=0.1"
jsbeautifier = ">=1.14.4"
json5 = ">=0.9.11"
pathspec = ">=0.12"
@@ -715,7 +713,6 @@ pyyaml = ">=6"
regex = ">=2023"
tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""}
tqdm = ">=4.62.2"
-typing-extensions = ">=3.7.4"
[[package]]
name = "draftjs-exporter"
@@ -859,28 +856,6 @@ setproctitle = ["setproctitle"]
testing = ["coverage", "eventlet", "gevent", "pytest", "pytest-cov"]
tornado = ["tornado (>=0.2)"]
-[[package]]
-name = "html-tag-names"
-version = "0.1.2"
-description = "List of known HTML tag names"
-optional = false
-python-versions = ">=3.7,<4.0"
-files = [
- {file = "html-tag-names-0.1.2.tar.gz", hash = "sha256:04924aca48770f36b5a41c27e4d917062507be05118acb0ba869c97389084297"},
- {file = "html_tag_names-0.1.2-py3-none-any.whl", hash = "sha256:eeb69ef21078486b615241f0393a72b41352c5219ee648e7c61f5632d26f0420"},
-]
-
-[[package]]
-name = "html-void-elements"
-version = "0.1.0"
-description = "List of HTML void tag names."
-optional = false
-python-versions = ">=3.7,<4.0"
-files = [
- {file = "html-void-elements-0.1.0.tar.gz", hash = "sha256:931b88f84cd606fee0b582c28fcd00e41d7149421fb673e1e1abd2f0c4f231f0"},
- {file = "html_void_elements-0.1.0-py3-none-any.whl", hash = "sha256:784cf39db03cdeb017320d9301009f8f3480f9d7b254d0974272e80e0cb5e0d2"},
-]
-
[[package]]
name = "icalendar"
version = "5.0.13"
@@ -898,13 +873,13 @@ pytz = "*"
[[package]]
name = "identify"
-version = "2.6.1"
+version = "2.6.2"
description = "File identification library for Python"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
files = [
- {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"},
- {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"},
+ {file = "identify-2.6.2-py2.py3-none-any.whl", hash = "sha256:c097384259f49e372f4ea00a19719d95ae27dd5ff0fd77ad630aa891306b82f3"},
+ {file = "identify-2.6.2.tar.gz", hash = "sha256:fab5c716c24d7a789775228823797296a2994b075fb6080ac83a102772a98cbd"},
]
[package.extras]
@@ -978,22 +953,22 @@ colors = ["colorama (>=0.4.6)"]
[[package]]
name = "jedi"
-version = "0.19.1"
+version = "0.19.2"
description = "An autocompletion tool for Python that can be used for text editors."
optional = false
python-versions = ">=3.6"
files = [
- {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"},
- {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"},
+ {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"},
+ {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"},
]
[package.dependencies]
-parso = ">=0.8.3,<0.9.0"
+parso = ">=0.8.4,<0.9.0"
[package.extras]
docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"]
qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"]
-testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"]
+testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"]
[[package]]
name = "jmespath"
@@ -1022,15 +997,18 @@ six = ">=1.13.0"
[[package]]
name = "json5"
-version = "0.9.25"
+version = "0.9.28"
description = "A Python implementation of the JSON5 data format."
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.8.0"
files = [
- {file = "json5-0.9.25-py3-none-any.whl", hash = "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f"},
- {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"},
+ {file = "json5-0.9.28-py3-none-any.whl", hash = "sha256:29c56f1accdd8bc2e037321237662034a7e07921e2b7223281a5ce2c46f0c4df"},
+ {file = "json5-0.9.28.tar.gz", hash = "sha256:1f82f36e615bc5b42f1bbd49dbc94b12563c56408c6ffa06414ea310890e9a6e"},
]
+[package.extras]
+dev = ["build (==1.2.2.post1)", "coverage (==7.5.3)", "mypy (==1.13.0)", "pip (==24.3.1)", "pylint (==3.2.3)", "ruff (==0.7.3)", "twine (==5.1.1)", "uv (==0.5.1)"]
+
[[package]]
name = "l18n"
version = "2021.3"
@@ -1156,13 +1134,13 @@ et-xmlfile = "*"
[[package]]
name = "packaging"
-version = "24.1"
+version = "24.2"
description = "Core utilities for Python packages"
optional = false
python-versions = ">=3.8"
files = [
- {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"},
- {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"},
+ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
+ {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
]
[[package]]
@@ -1716,105 +1694,105 @@ files = [
[[package]]
name = "regex"
-version = "2024.9.11"
+version = "2024.11.6"
description = "Alternative regular expression module, to replace re."
optional = false
python-versions = ">=3.8"
files = [
- {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"},
- {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"},
- {file = "regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5"},
- {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c"},
- {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8"},
- {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35"},
- {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71"},
- {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8"},
- {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a"},
- {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d"},
- {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137"},
- {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6"},
- {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca"},
- {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a"},
- {file = "regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0"},
- {file = "regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623"},
- {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"},
- {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"},
- {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"},
- {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"},
- {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"},
- {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"},
- {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"},
- {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"},
- {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"},
- {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"},
- {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"},
- {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"},
- {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"},
- {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"},
- {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"},
- {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"},
- {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"},
- {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"},
- {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"},
- {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"},
- {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"},
- {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"},
- {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"},
- {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"},
- {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"},
- {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"},
- {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"},
- {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"},
- {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"},
- {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"},
- {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"},
- {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"},
- {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"},
- {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"},
- {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"},
- {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"},
- {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"},
- {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"},
- {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"},
- {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"},
- {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"},
- {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"},
- {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"},
- {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"},
- {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"},
- {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4"},
- {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e"},
- {file = "regex-2024.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60"},
- {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b"},
- {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366"},
- {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8"},
- {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb"},
- {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4"},
- {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca"},
- {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb"},
- {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168"},
- {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e"},
- {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c"},
- {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd"},
- {file = "regex-2024.9.11-cp38-cp38-win32.whl", hash = "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771"},
- {file = "regex-2024.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508"},
- {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066"},
- {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62"},
- {file = "regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16"},
- {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3"},
- {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199"},
- {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8"},
- {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca"},
- {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9"},
- {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a"},
- {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39"},
- {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba"},
- {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664"},
- {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89"},
- {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35"},
- {file = "regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142"},
- {file = "regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919"},
- {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"},
+ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"},
+ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"},
+ {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"},
+ {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"},
+ {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"},
+ {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"},
+ {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"},
+ {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"},
+ {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"},
+ {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"},
+ {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"},
+ {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"},
+ {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"},
+ {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"},
+ {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"},
+ {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"},
+ {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"},
+ {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"},
+ {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"},
+ {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"},
+ {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"},
+ {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"},
+ {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"},
+ {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"},
+ {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"},
+ {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"},
+ {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"},
+ {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"},
+ {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"},
+ {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"},
+ {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"},
+ {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"},
+ {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"},
+ {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"},
+ {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"},
+ {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"},
+ {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"},
+ {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"},
+ {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"},
+ {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"},
+ {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"},
+ {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"},
+ {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"},
+ {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"},
+ {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"},
+ {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"},
+ {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"},
+ {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"},
+ {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"},
+ {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"},
+ {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"},
+ {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"},
+ {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"},
+ {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"},
+ {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"},
+ {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"},
+ {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"},
+ {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"},
+ {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"},
+ {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"},
+ {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"},
+ {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"},
+ {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"},
+ {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"},
+ {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"},
+ {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"},
+ {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"},
+ {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"},
+ {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"},
+ {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"},
+ {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"},
+ {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"},
+ {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"},
+ {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"},
+ {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"},
+ {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"},
+ {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"},
+ {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"},
+ {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"},
+ {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"},
+ {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"},
+ {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"},
+ {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"},
+ {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"},
+ {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"},
+ {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"},
+ {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"},
+ {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"},
+ {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"},
+ {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"},
+ {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"},
+ {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"},
+ {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"},
+ {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"},
]
[[package]]
@@ -1961,13 +1939,13 @@ files = [
[[package]]
name = "sqlparse"
-version = "0.5.1"
+version = "0.5.2"
description = "A non-validating SQL parser."
optional = false
python-versions = ">=3.8"
files = [
- {file = "sqlparse-0.5.1-py3-none-any.whl", hash = "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4"},
- {file = "sqlparse-0.5.1.tar.gz", hash = "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e"},
+ {file = "sqlparse-0.5.2-py3-none-any.whl", hash = "sha256:e99bc85c78160918c3e1d9230834ab8d80fc06c59d03f8db2618f65f65dda55e"},
+ {file = "sqlparse-0.5.2.tar.gz", hash = "sha256:9e37b35e16d1cc652a2545f0997c1deb23ea28fa1f3eefe609eee3063c3b105f"},
]
[package.extras]
@@ -2023,24 +2001,24 @@ docs = ["mkdocs (>=1.1,<1.2)", "mkdocs-material (>=6.2,<6.3)"]
[[package]]
name = "tomli"
-version = "2.0.2"
+version = "2.1.0"
description = "A lil' TOML parser"
optional = false
python-versions = ">=3.8"
files = [
- {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"},
- {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"},
+ {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"},
+ {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"},
]
[[package]]
name = "tqdm"
-version = "4.66.6"
+version = "4.67.0"
description = "Fast, Extensible Progress Meter"
optional = false
python-versions = ">=3.7"
files = [
- {file = "tqdm-4.66.6-py3-none-any.whl", hash = "sha256:223e8b5359c2efc4b30555531f09e9f2f3589bcd7fdd389271191031b49b7a63"},
- {file = "tqdm-4.66.6.tar.gz", hash = "sha256:4bdd694238bef1485ce839d67967ab50af8f9272aab687c0d7702a01da0be090"},
+ {file = "tqdm-4.67.0-py3-none-any.whl", hash = "sha256:0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be"},
+ {file = "tqdm-4.67.0.tar.gz", hash = "sha256:fe5a6f95e6fe0b9755e9469b77b9c3cf850048224ecaa8293d7d2d31f97d869a"},
]
[package.dependencies]
@@ -2048,6 +2026,7 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""}
[package.extras]
dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"]
+discord = ["requests"]
notebook = ["ipywidgets (>=6)"]
slack = ["slack-sdk"]
telegram = ["requests"]
@@ -2139,13 +2118,13 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess
[[package]]
name = "wagtail"
-version = "6.3"
+version = "6.3.1"
description = "A Django content management system."
optional = false
python-versions = ">=3.9"
files = [
- {file = "wagtail-6.3-py3-none-any.whl", hash = "sha256:627e4d5c2a47cd8533994503f473da231a782dbd0f1f8f53641e0d994556a0f2"},
- {file = "wagtail-6.3.tar.gz", hash = "sha256:98d94d12183b8fc689a0186ab095e6056bf116c21d94f245bdfd02ed4775442a"},
+ {file = "wagtail-6.3.1-py3-none-any.whl", hash = "sha256:d7d4e4fcb5edb4a5d0aaff5de72eaf33a51e4fa26c2d3a57801c58c4da35b209"},
+ {file = "wagtail-6.3.1.tar.gz", hash = "sha256:93876cc7a3bfcfff4c0393949562cbf249f244c4ca653d58a2dbab737f455715"},
]
[package.dependencies]
diff --git a/pyproject.toml b/pyproject.toml
index 8107118e..4d624e8c 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,3 +1,6 @@
+[project]
+requires-python = ">=3.10"
+
[tool.poetry]
name = "content-manager"
version = "1.10.2"
@@ -111,8 +114,9 @@ exclude = [
line-length = 119
-lint.select = ["E", "F", "I"]
-lint.ignore = ["E203", "E266"]
+[tool.ruff.lint]
+select = ["E", "F", "I"]
+ignore = ["E203", "E266"]
# E203: Whitespace before ':', used to please Black in `yield items[i : i + n]`
# E266: Too many leading '#' for block comment
diff --git a/static/css/style.css b/static/css/style.css
index 9c234e6d..4358e003 100644
--- a/static/css/style.css
+++ b/static/css/style.css
@@ -1 +1 @@
-.cmsfr-hero{background-size:cover;background-position:center;background-repeat:no-repeat}.cmsfr-hero-large{display:flex;justify-content:center;align-items:center;text-align:center}.cmsfr-background-dark h1,.cmsfr-background-dark p,.cmsfr-background-dark ul{color:white}:root[data-fr-theme=light] .cmsfr-background-dark .fr-btn--secondary{background-color:rgba(255,255,255,0.3)}.fr-header__service-title em{font-weight:lighter}.cmsfr-author_card__header{flex:0 0 6rem !important;width:6rem !important}.cmsfr-author-img{border-radius:50%;height:4.5rem !important;margin:1.5rem;width:4.5rem}.cmsfr-footer__bottom-extra{border-left:1px solid var(--border-default-grey);padding-left:1em;margin-left:1em}.cmsfr-display__inline{display:inline}
+.cmsfr-hero{background-size:cover;background-position:center;background-repeat:no-repeat}.cmsfr-hero-large{display:flex;justify-content:center;align-items:center;text-align:center}.cmsfr-background-dark h1,.cmsfr-background-dark p,.cmsfr-background-dark ul{color:white}:root[data-fr-theme=light] .cmsfr-background-dark .fr-btn--secondary{background-color:rgba(255,255,255,0.3)}.fr-header__service-title em{font-weight:lighter}.cmsfr-author_card__header{flex:0 0 6rem !important;width:6rem !important}.cmsfr-author-img{border-radius:50%;height:4.5rem !important;margin:1.5rem;width:4.5rem}.cmsfr-vertical_contact_card__header{background:var(--background-default-grey)}.cmsfr-vertical_contact_card-img{border-radius:50%;height:100%;width:100%;margin:auto;max-width:50%;aspect-ratio:initial !important}.cmsfr-footer__bottom-extra{border-left:1px solid var(--border-default-grey);padding-left:1em;margin-left:1em}.cmsfr-display__inline{display:inline}
diff --git a/static/css/style.sass b/static/css/style.sass
index 9b937d4d..c4f7d55e 100644
--- a/static/css/style.sass
+++ b/static/css/style.sass
@@ -32,6 +32,17 @@
margin: 1.5rem
width: 4.5rem
+.cmsfr-vertical_contact_card__header
+ background: var(--background-default-grey)
+
+.cmsfr-vertical_contact_card-img
+ border-radius: 50%
+ height: 100%
+ width: 100%
+ margin: auto
+ max-width: 50%
+ aspect-ratio: initial !important
+
.cmsfr-footer__bottom-extra
border-left: 1px solid var(--border-default-grey)
padding-left: 1em