diff --git a/.env.example b/.env.example index 33beaced..77940f9a 100644 --- a/.env.example +++ b/.env.example @@ -6,7 +6,7 @@ HOST_URL=localhost ALLOWED_HOSTS=localhost, 127.0.0.1 HOST_PORT=8000 SITE_NAME=Sites faciles -MEDIA_ROOT= +MEDIA_ROOT=medias # USE_DOCKER: Set 1 to use Docker USE_DOCKER=0 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5b992ea1..82f0a092 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,5 +44,9 @@ jobs: - name: đŸ€č‍ Run the unit tests run: | make test-unit + - name: 🎹 Deploy starter content + run: | + make init + poetry run python manage.py create_demo_pages env: DJANGO_DEBUG: True diff --git a/Makefile b/Makefile index 8739ccd9..9334b233 100644 --- a/Makefile +++ b/Makefile @@ -14,10 +14,6 @@ endif web-prompt: $(EXEC_CMD) bash -.PHONY: test-unit -test-unit: - $(EXEC_CMD) poetry run python manage.py test --settings config.settings_test - .PHONY: collectstatic collectstatic: $(EXEC_CMD) poetry run python manage.py collectstatic --noinput --ignore=*.sass @@ -54,6 +50,7 @@ init: $(EXEC_CMD) poetry run python manage.py set_config $(EXEC_CMD) poetry run python manage.py import_dsfr_pictograms $(EXEC_CMD) poetry run python manage.py create_starter_pages + $(EXEC_CMD) poetry run python manage.py import_page_templates make index .PHONY: init-dev @@ -84,3 +81,7 @@ runserver: .PHONY: test test: $(EXEC_CMD) poetry run python manage.py test --buffer --parallel + +.PHONY: test-unit +test-unit: + $(EXEC_CMD) poetry run python manage.py test --settings config.settings_test diff --git a/blog/migrations/0036_blogentrypage_source_url_blogindexpage_source_url.py b/blog/migrations/0036_blogentrypage_source_url_blogindexpage_source_url.py new file mode 100644 index 00000000..d8743328 --- /dev/null +++ b/blog/migrations/0036_blogentrypage_source_url_blogindexpage_source_url.py @@ -0,0 +1,26 @@ +# Generated by Django 5.1.1 on 2024-09-23 13:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("blog", "0035_alter_blogentrypage_body_alter_blogindexpage_body_and_more"), + ] + + operations = [ + migrations.AddField( + model_name="blogentrypage", + name="source_url", + field=models.URLField( + blank=True, help_text="For imported pages, to allow updates.", null=True, verbose_name="Source URL" + ), + ), + migrations.AddField( + model_name="blogindexpage", + name="source_url", + field=models.URLField( + blank=True, help_text="For imported pages, to allow updates.", null=True, verbose_name="Source URL" + ), + ), + ] diff --git a/content_manager/abstract.py b/content_manager/abstract.py index a18766ea..52c87522 100644 --- a/content_manager/abstract.py +++ b/content_manager/abstract.py @@ -83,6 +83,13 @@ class SitesFacilesBasePage(Page): blank=True, ) + source_url = models.URLField( + _("Source URL"), + help_text=_("For imported pages, to allow updates."), + null=True, + blank=True, + ) + content_panels = Page.content_panels + [ FieldPanel("body", heading=_("Body")), ] @@ -126,8 +133,21 @@ class SitesFacilesBasePage(Page): APIField("header_cta_buttons"), APIField("header_cta_label"), APIField("header_cta_link"), + APIField("public_child_pages"), ] + @property + def public_child_pages(self): + return [ + { + "id": child.id, + "slug": child.slug, + "title": child.title, + "type": f"{child.content_type.app_label}.{child.content_type.model}", + } + for child in self.get_children().live().public() + ] + def get_absolute_url(self): return self.url diff --git a/content_manager/constants.py b/content_manager/constants.py index 16c0e85b..2bfb65cf 100644 --- a/content_manager/constants.py +++ b/content_manager/constants.py @@ -1,5 +1,17 @@ from django.utils.translation import gettext_lazy as _ +HEADER_FIELDS = [ + "header_image", + "header_with_title", + "header_color_class", + "header_large", + "header_darken", + "header_cta_text", + "header_cta_buttons", + "header_cta_label", + "header_cta_link", +] + BUTTON_TYPE_CHOICES = ( ("fr-btn", _("Primary")), ("fr-btn fr-btn--secondary", _("Secundary")), diff --git a/content_manager/locale/fr/LC_MESSAGES/django.mo b/content_manager/locale/fr/LC_MESSAGES/django.mo index 54f287c3..6162dfc8 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 c8f0c1f6..c27e86aa 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-09-17 12:04+0200\n" -"PO-Revision-Date: 2024-09-17 12:06+0200\n" +"POT-Creation-Date: 2024-10-21 16:37+0200\n" +"PO-Revision-Date: 2024-10-21 16:38+0200\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:923 -#: content_manager/blocks.py:964 content_manager/blocks.py:997 +#: content_manager/abstract.py:39 content_manager/blocks.py:931 +#: content_manager/blocks.py:972 content_manager/blocks.py:1005 msgid "Background color" msgstr "Couleur de fond" -#: content_manager/abstract.py:43 content_manager/blocks.py:925 -#: content_manager/blocks.py:966 content_manager/blocks.py:999 +#: content_manager/abstract.py:43 content_manager/blocks.py:933 +#: content_manager/blocks.py:974 content_manager/blocks.py:1007 msgid "Uses the French Design System colors" msgstr "Utilise les couleurs du systĂšme de design de l'État" @@ -49,7 +49,7 @@ msgid "Call to action text" msgstr "Texte de l’appel Ă  action" #: content_manager/abstract.py:60 content_manager/blocks.py:324 -#: content_manager/blocks.py:638 +#: content_manager/blocks.py:644 msgid "" "Please use only one primary button. If you use icons, align them on the same " "side." @@ -62,7 +62,7 @@ msgid "Call to action label" msgstr "LibellĂ© de l’appel Ă  action" #: content_manager/abstract.py:71 content_manager/abstract.py:80 -#: content_manager/blocks.py:649 content_manager/blocks.py:656 +#: content_manager/blocks.py:655 content_manager/blocks.py:662 msgid "" "This field is obsolete and will be removed in the near future. Please " "replace with the CTA buttons above." @@ -75,26 +75,34 @@ msgid "Call to action link" msgstr "Lien de l’appel Ă  action" #: content_manager/abstract.py:87 +msgid "Source URL" +msgstr "URL source" + +#: content_manager/abstract.py:88 +msgid "For imported pages, to allow updates." +msgstr "UtilisĂ© pour les pages importĂ©es, pour permettre les mises Ă  jour." + +#: content_manager/abstract.py:94 msgid "Body" msgstr "Corps" -#: content_manager/abstract.py:91 +#: content_manager/abstract.py:98 msgid "Common page configuration" msgstr "Configuration commune" -#: content_manager/abstract.py:102 content_manager/blocks.py:642 +#: content_manager/abstract.py:109 content_manager/blocks.py:648 msgid "Call-to-action buttons" msgstr "Boutons de l’appel Ă  action" -#: content_manager/abstract.py:107 +#: content_manager/abstract.py:114 msgid "Header options" msgstr "Options d’en-tĂȘte" -#: content_manager/abstract.py:143 +#: content_manager/abstract.py:163 msgid "Base page" msgstr "Page de base" -#: content_manager/abstract.py:144 +#: content_manager/abstract.py:164 msgid "Base pages" msgstr "Pages de base" @@ -131,8 +139,8 @@ msgid "Link label" msgstr "LibellĂ© du lien" #: content_manager/blocks.py:107 content_manager/blocks.py:282 -#: content_manager/blocks.py:386 content_manager/blocks.py:526 -#: content_manager/blocks.py:587 +#: content_manager/blocks.py:386 content_manager/blocks.py:529 +#: content_manager/blocks.py:590 msgid "Link" msgstr "Lien" @@ -141,7 +149,7 @@ msgid "Button type" msgstr "Type de bouton" #: content_manager/blocks.py:116 content_manager/blocks.py:147 -#: content_manager/blocks.py:200 content_manager/blocks.py:451 +#: content_manager/blocks.py:200 content_manager/blocks.py:454 msgid "Icon" msgstr "IcĂŽne" @@ -150,7 +158,7 @@ msgid "Icon side" msgstr "CĂŽtĂ© de l’icĂŽne" #: content_manager/blocks.py:130 content_manager/blocks.py:138 -#: content_manager/blocks.py:454 +#: content_manager/blocks.py:457 msgid "Button" msgstr "Bouton" @@ -158,7 +166,7 @@ msgstr "Bouton" msgid "Only used for internal links." msgstr "Uniquement pour les liens internes." -#: content_manager/blocks.py:154 content_manager/blocks.py:474 +#: content_manager/blocks.py:154 content_manager/blocks.py:477 msgid "Size" msgstr "Taille" @@ -196,12 +204,12 @@ msgstr "Badge" #: content_manager/blocks.py:192 content_manager/blocks.py:263 #: content_manager/blocks.py:374 content_manager/blocks.py:418 -#: content_manager/blocks.py:423 content_manager/blocks.py:444 -#: content_manager/blocks.py:486 content_manager/blocks.py:561 -#: content_manager/blocks.py:616 content_manager/blocks.py:625 -#: content_manager/blocks.py:667 content_manager/blocks.py:781 -#: content_manager/blocks.py:811 content_manager/blocks.py:880 -#: content_manager/blocks.py:936 content_manager/models.py:393 +#: content_manager/blocks.py:423 content_manager/blocks.py:447 +#: content_manager/blocks.py:489 content_manager/blocks.py:564 +#: content_manager/blocks.py:619 content_manager/blocks.py:628 +#: content_manager/blocks.py:673 content_manager/blocks.py:787 +#: content_manager/blocks.py:817 content_manager/blocks.py:888 +#: content_manager/blocks.py:944 content_manager/models.py:393 msgid "Title" msgstr "Titre" @@ -223,33 +231,33 @@ msgid "Tag" msgstr "Tag" #: content_manager/blocks.py:265 content_manager/blocks.py:376 -#: content_manager/blocks.py:432 content_manager/blocks.py:446 -#: content_manager/blocks.py:563 content_manager/blocks.py:783 -#: content_manager/blocks.py:813 content_manager/blocks.py:938 +#: content_manager/blocks.py:435 content_manager/blocks.py:449 +#: content_manager/blocks.py:566 content_manager/blocks.py:789 +#: content_manager/blocks.py:819 content_manager/blocks.py:946 msgid "Heading level" msgstr "Niveau de titre" #: content_manager/blocks.py:268 content_manager/blocks.py:379 -#: content_manager/blocks.py:435 content_manager/blocks.py:449 -#: content_manager/blocks.py:567 +#: content_manager/blocks.py:438 content_manager/blocks.py:452 +#: content_manager/blocks.py:570 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:382 -#: content_manager/blocks.py:419 content_manager/blocks.py:453 -#: content_manager/blocks.py:467 content_manager/blocks.py:881 -#: content_manager/blocks.py:968 +#: content_manager/blocks.py:419 content_manager/blocks.py:456 +#: content_manager/blocks.py:470 content_manager/blocks.py:889 +#: content_manager/blocks.py:976 msgid "Content" msgstr "Contenu" #: content_manager/blocks.py:271 content_manager/blocks.py:384 -#: content_manager/blocks.py:506 content_manager/blocks.py:569 -#: content_manager/blocks.py:595 content_manager/blocks.py:843 +#: content_manager/blocks.py:509 content_manager/blocks.py:572 +#: content_manager/blocks.py:598 content_manager/blocks.py:849 msgid "Image" msgstr "Image" #: content_manager/blocks.py:273 content_manager/blocks.py:346 -#: content_manager/blocks.py:581 +#: content_manager/blocks.py:584 msgid "Image ratio" msgstr "Ratio de l’image" @@ -261,13 +269,13 @@ msgstr "Badge de la zone image" msgid "Only used if the card has an image." msgstr "Uniquement utilisĂ© si la carte a une image." -#: content_manager/blocks.py:286 content_manager/blocks.py:654 +#: content_manager/blocks.py:286 content_manager/blocks.py:660 msgid "Link (obsolete)" msgstr "Lien (obsolĂšte)" #: content_manager/blocks.py:290 content_manager/blocks.py:298 -#: content_manager/blocks.py:534 content_manager/blocks.py:542 -#: content_manager/blocks.py:550 +#: content_manager/blocks.py:537 content_manager/blocks.py:545 +#: content_manager/blocks.py:553 msgid "" "This field is obsolete and will be removed in the near future. Please " "replace with the Link field above." @@ -378,24 +386,24 @@ msgstr "Tuile horizontale" msgid "Accordion" msgstr "AccordĂ©on" -#: content_manager/blocks.py:428 +#: content_manager/blocks.py:431 msgid "Message title" msgstr "Titre du message" -#: content_manager/blocks.py:429 +#: content_manager/blocks.py:432 msgid "Message text" msgstr "Texte du message" -#: content_manager/blocks.py:430 +#: content_manager/blocks.py:433 msgid "Message type" msgstr "Type de message" -#: content_manager/blocks.py:456 content_manager/blocks.py:469 -#: content_manager/blocks.py:600 +#: content_manager/blocks.py:459 content_manager/blocks.py:472 +#: content_manager/blocks.py:603 msgid "Color" msgstr "Couleur" -#: content_manager/blocks.py:487 +#: content_manager/blocks.py:490 msgid "" "Accessibility: The title should describe, in a clear and concise manner, the " "embedded content." @@ -403,133 +411,133 @@ msgstr "" "AccessibilitĂ© : Le titre doit dĂ©crire, de façon claire et concise, le " "contenu embarquĂ©." -#: content_manager/blocks.py:490 +#: content_manager/blocks.py:493 msgid "URL of the iframe" msgstr "URL de l‘iframe" -#: content_manager/blocks.py:491 +#: content_manager/blocks.py:494 msgid "Example for Tally: https://tally.so/embed/w2jMRa" msgstr "Exemple pour Tally : https://tally.so/embed/w2jMRa" -#: content_manager/blocks.py:493 +#: content_manager/blocks.py:496 msgid "Height (in pixels)" msgstr "Hauteur (en pixels)" -#: content_manager/blocks.py:495 +#: content_manager/blocks.py:498 msgid "Parameters" msgstr "ParamĂštres" -#: content_manager/blocks.py:496 +#: content_manager/blocks.py:499 msgid "For example: \"allow='geolocation'\"." msgstr "Par exemple : « allow='geolocation' »." -#: content_manager/blocks.py:508 +#: content_manager/blocks.py:511 msgid "Side where the image is displayed" msgstr "CĂŽtĂ© oĂč afficher l’image" -#: content_manager/blocks.py:510 content_manager/constants.py:11 +#: content_manager/blocks.py:513 content_manager/constants.py:23 msgid "Left" msgstr "Gauche" -#: content_manager/blocks.py:511 content_manager/constants.py:12 +#: content_manager/blocks.py:514 content_manager/constants.py:24 msgid "Right" msgstr "Droite" -#: content_manager/blocks.py:516 +#: content_manager/blocks.py:519 msgid "Image width" msgstr "Largeur de l’image" -#: content_manager/blocks.py:524 content_manager/blocks.py:632 -#: content_manager/blocks.py:842 content_manager/blocks.py:1011 +#: content_manager/blocks.py:527 content_manager/blocks.py:638 +#: content_manager/blocks.py:848 content_manager/blocks.py:1019 msgid "Rich text" msgstr "Texte avec mise en forme" -#: content_manager/blocks.py:528 +#: content_manager/blocks.py:531 msgid "The link is shown at the bottom of the text block, with an arrow" msgstr "Le lien est affichĂ© en bas du bloc de texte, avec une flĂšche" -#: content_manager/blocks.py:531 +#: content_manager/blocks.py:534 msgid "Link label (obsolete)" msgstr "LibellĂ© du lien (obsolĂšte)" -#: content_manager/blocks.py:539 +#: content_manager/blocks.py:542 msgid "Internal link (obsolete)" msgstr "Lien interne (obsolĂšte)" -#: content_manager/blocks.py:547 +#: content_manager/blocks.py:550 msgid "Link URL (obsolete)" msgstr "URL du lien (obsolĂšte)" -#: content_manager/blocks.py:571 +#: content_manager/blocks.py:574 msgid "Alternative text (textual description of the image)" msgstr "Alternative textuelle (description textuelle de l’image)" -#: content_manager/blocks.py:575 content_manager/blocks.py:688 +#: content_manager/blocks.py:578 content_manager/blocks.py:694 msgid "Witdh" msgstr "Largeur" -#: content_manager/blocks.py:586 content_manager/blocks.py:677 +#: content_manager/blocks.py:589 content_manager/blocks.py:683 msgid "Caption" msgstr "LĂ©gende" -#: content_manager/blocks.py:596 content_manager/blocks.py:848 -#: content_manager/blocks.py:1017 +#: content_manager/blocks.py:599 content_manager/blocks.py:855 +#: content_manager/blocks.py:1026 msgid "Quote" msgstr "Citation" -#: content_manager/blocks.py:597 +#: content_manager/blocks.py:600 msgid "Author name" msgstr "Nom de l’auteur" -#: content_manager/blocks.py:598 +#: content_manager/blocks.py:601 msgid "Author title" msgstr "Titre de l’auteur" -#: content_manager/blocks.py:611 +#: content_manager/blocks.py:614 msgid "Top margin" msgstr "Espacement au dessus" -#: content_manager/blocks.py:612 +#: content_manager/blocks.py:615 msgid "Bottom margin" msgstr "Espacement en dessous" -#: content_manager/blocks.py:617 +#: content_manager/blocks.py:620 msgid "Detail" msgstr "DĂ©tail" -#: content_manager/blocks.py:621 +#: content_manager/blocks.py:624 msgid "Step" msgstr "Étape" -#: content_manager/blocks.py:626 +#: content_manager/blocks.py:629 msgid "Number of steps" msgstr "Nombre d’étapes" -#: content_manager/blocks.py:627 +#: content_manager/blocks.py:630 msgid "Current step" msgstr "Étape actuelle" -#: content_manager/blocks.py:628 +#: content_manager/blocks.py:631 msgid "Steps" msgstr "Étapes" -#: content_manager/blocks.py:647 +#: content_manager/blocks.py:653 msgid "Call to action label (obsolete)" msgstr "LibellĂ© de l’appel Ă  action (obsolĂšte)" -#: content_manager/blocks.py:668 +#: content_manager/blocks.py:674 msgid "Transcription content" msgstr "Contenu de la transcription" -#: content_manager/blocks.py:676 +#: content_manager/blocks.py:682 msgid "Video title" msgstr "Titre de la vidĂ©o" -#: content_manager/blocks.py:679 +#: content_manager/blocks.py:685 msgid "Video URL" msgstr "URL de la vidĂ©o" -#: content_manager/blocks.py:681 +#: content_manager/blocks.py:687 msgid "" "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 " @@ -540,164 +548,173 @@ msgstr "" "nocookie.com/embed/gLzXOViPX-0) Pour Youtube, cliquez sur « IntĂ©grer la " "vidĂ©o » puis cochez « Activer le mode de confidentialitĂ© avancé »." -#: content_manager/blocks.py:694 +#: content_manager/blocks.py:700 msgid "Video ratio" msgstr "Ratio de la vidĂ©o" -#: content_manager/blocks.py:699 content_manager/blocks.py:845 -#: content_manager/blocks.py:1019 +#: content_manager/blocks.py:705 content_manager/blocks.py:851 +#: content_manager/blocks.py:1028 msgid "Transcription" msgstr "Transcription" -#: content_manager/blocks.py:787 content_manager/blocks.py:817 -#: content_manager/blocks.py:942 +#: content_manager/blocks.py:793 content_manager/blocks.py:823 +#: content_manager/blocks.py:950 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:789 +#: content_manager/blocks.py:795 msgid "Blog" msgstr "Blog" -#: content_manager/blocks.py:791 content_manager/blocks.py:821 +#: content_manager/blocks.py:797 content_manager/blocks.py:827 msgid "Number of entries" msgstr "Nombre d’articles" -#: content_manager/blocks.py:793 content_manager/blocks.py:823 +#: content_manager/blocks.py:799 content_manager/blocks.py:829 #: 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:794 content_manager/blocks.py:824 +#: content_manager/blocks.py:800 content_manager/blocks.py:830 #: 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:795 content_manager/blocks.py:825 +#: content_manager/blocks.py:801 content_manager/blocks.py:831 #: 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:798 content_manager/blocks.py:828 +#: content_manager/blocks.py:804 content_manager/blocks.py:834 #: 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:799 content_manager/blocks.py:829 +#: content_manager/blocks.py:805 content_manager/blocks.py:835 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:802 content_manager/blocks.py:832 +#: content_manager/blocks.py:808 content_manager/blocks.py:838 msgid "Show filters" msgstr "Afficher les filtres" -#: content_manager/blocks.py:819 +#: content_manager/blocks.py:825 msgid "Event calendar" msgstr "Agenda" -#: content_manager/blocks.py:844 content_manager/blocks.py:1018 +#: content_manager/blocks.py:850 content_manager/blocks.py:1027 msgid "Video" msgstr "VidĂ©o" -#: content_manager/blocks.py:846 content_manager/blocks.py:1015 -msgid "Callout" -msgstr "Mise en avant" +#: content_manager/blocks.py:852 content_manager/blocks.py:1023 +msgid "Accordions" +msgstr "AccordĂ©ons" -#: content_manager/blocks.py:846 content_manager/blocks.py:847 -#: content_manager/blocks.py:848 content_manager/blocks.py:851 -#: content_manager/blocks.py:852 content_manager/blocks.py:863 -#: content_manager/blocks.py:913 content_manager/blocks.py:953 -#: content_manager/blocks.py:954 content_manager/blocks.py:1015 -#: content_manager/blocks.py:1016 content_manager/blocks.py:1017 -#: content_manager/blocks.py:1023 content_manager/blocks.py:1024 -#: content_manager/blocks.py:1025 content_manager/blocks.py:1026 -#: content_manager/blocks.py:1027 +#: content_manager/blocks.py:852 content_manager/blocks.py:853 +#: content_manager/blocks.py:854 content_manager/blocks.py:855 +#: content_manager/blocks.py:856 content_manager/blocks.py:859 +#: content_manager/blocks.py:860 content_manager/blocks.py:871 +#: content_manager/blocks.py:921 content_manager/blocks.py:961 +#: content_manager/blocks.py:962 content_manager/blocks.py:1023 +#: content_manager/blocks.py:1024 content_manager/blocks.py:1025 +#: content_manager/blocks.py:1026 content_manager/blocks.py:1032 +#: content_manager/blocks.py:1033 content_manager/blocks.py:1034 +#: content_manager/blocks.py:1035 msgid "DSFR components" msgstr "Composants du DSFR" -#: content_manager/blocks.py:847 content_manager/blocks.py:1016 +#: content_manager/blocks.py:853 content_manager/blocks.py:1024 +msgid "Callout" +msgstr "Mise en avant" + +#: content_manager/blocks.py:854 content_manager/blocks.py:1025 msgid "Highlight" msgstr "Mise en exergue" -#: content_manager/blocks.py:849 +#: content_manager/blocks.py:856 content_manager/blocks.py:1032 +msgid "Stepper" +msgstr "Étapier" + +#: content_manager/blocks.py:857 msgid "Text and call to action" msgstr "Texte et appel Ă  action" -#: content_manager/blocks.py:850 content_manager/blocks.py:1022 +#: content_manager/blocks.py:858 content_manager/blocks.py:1031 msgid "Single link" msgstr "Lien isolĂ©" -#: content_manager/blocks.py:851 content_manager/blocks.py:1029 +#: content_manager/blocks.py:859 content_manager/blocks.py:1037 msgid "Iframe" msgstr "Iframe" -#: content_manager/blocks.py:852 content_manager/blocks.py:1024 +#: content_manager/blocks.py:860 content_manager/blocks.py:1034 msgid "Tile" msgstr "Tuile" -#: content_manager/blocks.py:853 content_manager/blocks.py:1051 +#: content_manager/blocks.py:861 content_manager/blocks.py:1059 msgid "Blog recent entries" msgstr "Articles rĂ©cents du blog" -#: content_manager/blocks.py:853 content_manager/blocks.py:855 -#: content_manager/blocks.py:1046 content_manager/blocks.py:1051 -#: content_manager/blocks.py:1055 +#: content_manager/blocks.py:861 content_manager/blocks.py:863 +#: content_manager/blocks.py:1054 content_manager/blocks.py:1059 +#: content_manager/blocks.py:1063 msgid "Website structure" msgstr "Structure du site" -#: content_manager/blocks.py:855 content_manager/blocks.py:1055 +#: content_manager/blocks.py:863 content_manager/blocks.py:1063 msgid "Event calendar recent entries" msgstr "Articles rĂ©cents de l’agenda" -#: content_manager/blocks.py:863 content_manager/blocks.py:913 +#: content_manager/blocks.py:871 content_manager/blocks.py:921 msgid "Vertical card" msgstr "Carte verticale" -#: content_manager/blocks.py:868 content_manager/blocks.py:893 +#: content_manager/blocks.py:876 content_manager/blocks.py:901 msgid "Column width" msgstr "Largeur de colonne" -#: content_manager/blocks.py:872 +#: content_manager/blocks.py:880 msgid "Items" msgstr "ÉlĂ©ments" -#: content_manager/blocks.py:885 +#: content_manager/blocks.py:893 msgid "Tab" msgstr "Onglet" -#: content_manager/blocks.py:903 +#: content_manager/blocks.py:911 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:906 +#: content_manager/blocks.py:914 msgid "Column content" msgstr "Contenu de la colonnne" -#: content_manager/blocks.py:914 +#: content_manager/blocks.py:922 msgid "Adjustable column" msgstr "Colonne ajustable" -#: content_manager/blocks.py:914 content_manager/blocks.py:955 -#: content_manager/blocks.py:1030 content_manager/blocks.py:1031 -#: content_manager/blocks.py:1032 content_manager/blocks.py:1033 -#: content_manager/blocks.py:1037 +#: content_manager/blocks.py:922 content_manager/blocks.py:963 +#: content_manager/blocks.py:1038 content_manager/blocks.py:1039 +#: content_manager/blocks.py:1040 content_manager/blocks.py:1041 +#: content_manager/blocks.py:1045 msgid "Page structure" msgstr "Structure de la page" -#: content_manager/blocks.py:921 content_manager/blocks.py:962 -#: content_manager/blocks.py:995 +#: content_manager/blocks.py:929 content_manager/blocks.py:970 +#: content_manager/blocks.py:1003 msgid "Background image" msgstr "Image de fond" -#: content_manager/blocks.py:928 +#: content_manager/blocks.py:936 msgid "Background color, hexadecimal format (obsolete)" msgstr "Couleur de fond, format hexadĂ©cimal (obsolĂšte)" -#: content_manager/blocks.py:931 +#: content_manager/blocks.py:939 msgid "" "This field is obsolete and will be removed in the near future. Replace it " "with the background color." @@ -705,35 +722,35 @@ msgstr "" "Ce champ est obsolĂšte et sera prochainement supprimĂ©. Merci de le remplacer " "avec la couleur de fond." -#: content_manager/blocks.py:933 +#: content_manager/blocks.py:941 msgid "Incorrect color format, must be #fff or #f5f5f5" msgstr "Format de couleur incorrect, doit ĂȘtre #fff ou #f5f5f5" -#: content_manager/blocks.py:944 +#: content_manager/blocks.py:952 msgid "Columns" msgstr "Colonnes" -#: content_manager/blocks.py:952 content_manager/blocks.py:1013 +#: content_manager/blocks.py:960 content_manager/blocks.py:1021 msgid "Image and text" msgstr "Image et texte" -#: content_manager/blocks.py:953 content_manager/blocks.py:1023 +#: content_manager/blocks.py:961 content_manager/blocks.py:1033 msgid "Horizontal card" msgstr "Carte horizontale" -#: content_manager/blocks.py:954 content_manager/blocks.py:1026 +#: content_manager/blocks.py:962 content_manager/blocks.py:1035 msgid "Tabs" msgstr "Onglets" -#: content_manager/blocks.py:955 content_manager/blocks.py:1032 +#: content_manager/blocks.py:963 content_manager/blocks.py:1040 msgid "Item grid" msgstr "Grille d’élĂ©ments" -#: content_manager/blocks.py:976 +#: content_manager/blocks.py:984 msgid "Parent page" msgstr "Page parente" -#: content_manager/blocks.py:986 content_manager/blocks.py:1068 +#: content_manager/blocks.py:994 content_manager/blocks.py:1076 msgid "" "Warning: Use HTML block with caution. Malicious code can compromise the " "security of the site." @@ -741,156 +758,148 @@ msgstr "" "Avertissement : Utilisez le bloc HTML avec prĂ©caution. Un code malveillant " "peut compromettre la sĂ©curitĂ© du site." -#: content_manager/blocks.py:988 +#: content_manager/blocks.py:996 msgid "Page tree" msgstr "Arborescence de pages" -#: content_manager/blocks.py:1001 +#: content_manager/blocks.py:1009 msgid "Main content" msgstr "Contenu principal" -#: content_manager/blocks.py:1002 +#: content_manager/blocks.py:1010 msgid "Side menu title" msgstr "Titre du menu latĂ©ral" -#: content_manager/blocks.py:1003 +#: content_manager/blocks.py:1011 msgid "Side menu content" msgstr "Contenu du menu latĂ©ral" -#: content_manager/blocks.py:1014 +#: content_manager/blocks.py:1022 msgid "Alert message" msgstr "Message d’alerte" -#: content_manager/blocks.py:1020 +#: content_manager/blocks.py:1029 msgid "Badge list" msgstr "Liste de badges" -#: content_manager/blocks.py:1021 +#: content_manager/blocks.py:1030 msgid "Tag list" msgstr "Liste de tags" -#: content_manager/blocks.py:1025 -msgid "Accordions" -msgstr "AccordĂ©ons" - -#: content_manager/blocks.py:1027 -msgid "Stepper" -msgstr "Étapier" - -#: content_manager/blocks.py:1028 +#: content_manager/blocks.py:1036 msgid "Markdown" msgstr "Markdown" -#: content_manager/blocks.py:1028 content_manager/blocks.py:1029 -#: content_manager/blocks.py:1070 +#: content_manager/blocks.py:1036 content_manager/blocks.py:1037 +#: content_manager/blocks.py:1078 msgid "Expert syntax" msgstr "Syntaxe experte" -#: content_manager/blocks.py:1030 +#: content_manager/blocks.py:1038 msgid "Separator" msgstr "SĂ©parateur" -#: content_manager/blocks.py:1031 +#: content_manager/blocks.py:1039 msgid "Multiple columns" msgstr "Multi-colonnes" -#: content_manager/blocks.py:1033 +#: content_manager/blocks.py:1041 msgid "Full width background" msgstr "Fond pleine largeur" -#: content_manager/blocks.py:1037 +#: content_manager/blocks.py:1045 msgid "Full width background with side menu" msgstr "Fond pleine largeur avec menu latĂ©ral" -#: content_manager/blocks.py:1043 +#: content_manager/blocks.py:1051 msgid "Subpages list" msgstr "Liste des sous-pages" -#: content_manager/blocks.py:1044 +#: content_manager/blocks.py:1052 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." -#: content_manager/constants.py:4 +#: content_manager/constants.py:16 msgid "Primary" msgstr "Primaire" -#: content_manager/constants.py:5 +#: content_manager/constants.py:17 msgid "Secundary" msgstr "Secondaire" -#: content_manager/constants.py:6 +#: content_manager/constants.py:18 msgid "Tertiary" msgstr "Tertiaire" -#: content_manager/constants.py:7 +#: content_manager/constants.py:19 msgid "Tertiary without border" msgstr "Tertiaire sans bordure" -#: content_manager/constants.py:22 content_manager/constants.py:31 +#: content_manager/constants.py:34 content_manager/constants.py:43 msgid "Heading 2" msgstr "En-tĂȘte 2" -#: content_manager/constants.py:23 content_manager/constants.py:32 +#: content_manager/constants.py:35 content_manager/constants.py:44 msgid "Heading 3" msgstr "En-tĂȘte 3" -#: content_manager/constants.py:24 content_manager/constants.py:33 +#: content_manager/constants.py:36 content_manager/constants.py:45 msgid "Heading 4" msgstr "En-tĂȘte 4" -#: content_manager/constants.py:25 content_manager/constants.py:34 +#: content_manager/constants.py:37 content_manager/constants.py:46 msgid "Heading 5" msgstr "En-tĂȘte 5" -#: content_manager/constants.py:26 +#: content_manager/constants.py:38 msgid "Heading 6" msgstr "En-tĂȘte 6" -#: content_manager/constants.py:27 +#: content_manager/constants.py:39 msgid "Paragraph" msgstr "Paragraphe" -#: content_manager/constants.py:43 +#: content_manager/constants.py:55 msgid "Error" msgstr "Erreur" -#: content_manager/constants.py:44 +#: content_manager/constants.py:56 msgid "Success" msgstr "SuccĂšs" -#: content_manager/constants.py:45 +#: content_manager/constants.py:57 msgid "Information" msgstr "Information" -#: content_manager/constants.py:46 +#: content_manager/constants.py:58 msgid "Warning" msgstr "Avertissement" -#: content_manager/constants.py:68 content_manager/constants.py:80 -#: content_manager/constants.py:86 +#: content_manager/constants.py:80 content_manager/constants.py:92 +#: content_manager/constants.py:98 msgid "Small" msgstr "Petit" -#: content_manager/constants.py:69 content_manager/constants.py:81 -#: content_manager/constants.py:87 +#: content_manager/constants.py:81 content_manager/constants.py:93 +#: content_manager/constants.py:99 msgid "Medium" msgstr "Medium" -#: content_manager/constants.py:70 content_manager/constants.py:82 -#: content_manager/constants.py:88 +#: content_manager/constants.py:82 content_manager/constants.py:94 +#: content_manager/constants.py:100 msgid "Large" msgstr "Large" -#: content_manager/constants.py:74 +#: content_manager/constants.py:86 msgid "No icon" msgstr "Pas d’icĂŽne" -#: content_manager/constants.py:75 +#: content_manager/constants.py:87 msgid "Icon on the right side" msgstr "IcĂŽne du cĂŽtĂ© droit" -#: content_manager/constants.py:76 +#: content_manager/constants.py:88 msgid "Icon on the left side" msgstr "IcĂŽne du cĂŽtĂ© gauche" diff --git a/content_manager/management/commands/create_demo_pages.py b/content_manager/management/commands/create_demo_pages.py index df6b0250..c84923bd 100644 --- a/content_manager/management/commands/create_demo_pages.py +++ b/content_manager/management/commands/create_demo_pages.py @@ -8,6 +8,7 @@ from blog.models import BlogIndexPage from content_manager.models import ContentPage, MegaMenu, MegaMenuCategory +from content_manager.services.accessors import get_or_create_content_page from forms.models import FormField, FormPage ALL_ALLOWED_SLUGS = ["blog_index", "publications", "menu_page", "form"] @@ -35,6 +36,7 @@ def handle(self, *args, **kwargs): # First, add the home page to the main menu if not already done home_page = site.root_page + locale = home_page.locale main_menu = MainMenu.objects.first() if not main_menu: main_menu = MainMenu.objects.create(site=site) @@ -50,12 +52,12 @@ def handle(self, *args, **kwargs): # to/do add example blog pages elif slug == "publications": - self.create_publication_pages(site, home_page, main_menu) + self.create_publication_pages(site, main_menu) elif slug == "menu_page": # A blank page that is just destined to have a list of its subpages. body = [("subpageslist", None)] - menu_page = self.create_content_page(slug, title="Pages d’exemple", body=body, parent_page=home_page) + menu_page = get_or_create_content_page(slug, title="Pages d’exemple", body=body, parent_page=home_page) # Inserts it right before the last entry contact_menu_entry = MainMenuItem.objects.filter(menu=main_menu).last() @@ -66,7 +68,7 @@ def handle(self, *args, **kwargs): contact_menu_entry.save() elif slug == "form": - menu_page = ContentPage.objects.get(slug="menu_page") + menu_page = ContentPage.objects.get(slug="menu_page", locale=locale) self.create_form_page("form_with_all_fields", parent_page=menu_page) else: raise ValueError(f"Valeur inconnue : {slug}") @@ -101,24 +103,7 @@ def create_blog_index(self, home_page) -> BlogIndexPage: return blog_index - def create_content_page(self, slug: str, title: str, body: list, parent_page: ContentPage) -> ContentPage: - """ - Creates a page for the site. - """ - - # Don't replace or duplicate an already existing page - already_exists = ContentPage.objects.filter(slug=slug).first() - if already_exists: - self.stdout.write(f"The {slug} page seem to already exist with id {already_exists.id}") - return already_exists - - new_page = parent_page.add_child(instance=ContentPage(title=title, body=body, slug=slug, show_in_menus=True)) - - self.stdout.write(self.style.SUCCESS(f"Page {slug} created with id {new_page.id}")) - - return new_page - - def create_publication_pages(self, site, home_page, main_menu): + def create_publication_pages(self, site, main_menu): slug = "publications" title = "Publications" body = [] @@ -126,7 +111,7 @@ def create_publication_pages(self, site, home_page, main_menu): text_raw = """

Veuillez trouver ici une liste de publications

""" body.append(("paragraph", RichText(text_raw))) - publications_page = self.create_content_page(slug=slug, title=title, body=body, parent_page=home_page) + publications_page = get_or_create_content_page(slug=slug, title=title, body=body) publications_menu_item, _created = MainMenuItem.objects.update_or_create( link_page=publications_page, menu=main_menu, defaults={"sort_order": 2} ) @@ -160,7 +145,7 @@ def create_publication_pages(self, site, home_page, main_menu): text += f"

{p}

\n" body.append(("paragraph", RichText(text))) - new_page = self.create_content_page( + new_page = get_or_create_content_page( slug=slugify(title), title=title, body=body, parent_page=publications_page ) @@ -175,7 +160,7 @@ def create_form_page(self, slug: str, parent_page: ContentPage) -> None: """ # Don't replace a manually created page - already_exists = ContentPage.objects.filter(slug=slug).first() + already_exists = FormPage.objects.filter(slug=slug).first() if already_exists: self.stdout.write(f"The page seem to already exist with id {already_exists.id}") return diff --git a/content_manager/management/commands/create_starter_pages.py b/content_manager/management/commands/create_starter_pages.py index 980261d9..f09b3fed 100644 --- a/content_manager/management/commands/create_starter_pages.py +++ b/content_manager/management/commands/create_starter_pages.py @@ -8,7 +8,7 @@ from wagtailmenus.models.menuitems import FlatMenuItem, MainMenuItem from content_manager.models import ContentPage -from content_manager.utils import get_or_create_footer_menu, get_or_create_main_menu +from content_manager.services.accessors import get_or_create_footer_menu, get_or_create_main_menu from forms.models import FormField, FormPage ALL_ALLOWED_SLUGS = ["home", "mentions-legales", "accessibilite", "contact"] diff --git a/content_manager/management/commands/export_page_templates.py b/content_manager/management/commands/export_page_templates.py new file mode 100644 index 00000000..8748917c --- /dev/null +++ b/content_manager/management/commands/export_page_templates.py @@ -0,0 +1,35 @@ +import json + +from django.core.management.base import BaseCommand + +from content_manager.services.import_export import TEMPLATES_DATA_FILE, ExportPage, ImportExportImages + +SOURCE_URL = "https://sites-faciles.beta.numerique.gouv.fr/" + + +class Command(BaseCommand): + def handle(self, *args, **kwargs): + """ + Export template pages. + + List is manually set for now + """ + + page_ids = ["32", "36", "37", "38", "39", "40", "41", "42", "43", "44"] + + image_ids = [] + + pages = {} + + for page_id in page_ids: + self.stdout.write(f"Exporting page {page_id}") + page = ExportPage(page_id, SOURCE_URL) + pages[page_id] = page.json_export + image_ids += page.image_ids + + image_exporter = ImportExportImages(image_ids, SOURCE_URL) + image_exporter.download_images() + + export_data = {"image_ids": image_ids, "pages": pages} + with open(TEMPLATES_DATA_FILE, "w") as json_file: + json.dump(export_data, json_file, indent=2) diff --git a/content_manager/management/commands/import_dsfr_pictograms.py b/content_manager/management/commands/import_dsfr_pictograms.py index 15eb6825..85796883 100644 --- a/content_manager/management/commands/import_dsfr_pictograms.py +++ b/content_manager/management/commands/import_dsfr_pictograms.py @@ -4,14 +4,19 @@ from django.core.management.base import BaseCommand from wagtail.images.models import Image -from content_manager.utils import get_or_create_collection, import_image +from content_manager.services.accessors import get_or_create_collection +from content_manager.utils import import_image class Command(BaseCommand): help = """Import all the pictograms from the DSFR""" def handle(self, *args, **kwargs): - call_command("collectstatic", interactive=False) + call_command( + "collectstatic", + "--ignore=*.sass", + interactive=False, + ) picto_root = "staticfiles/dsfr/dist/artwork/pictograms/" picto_folders = os.listdir(picto_root) @@ -28,10 +33,10 @@ def handle(self, *args, **kwargs): base_file_title = filename.split(".")[0].replace("-", " ").title() full_image_title = f"Pictogrammes DSFR — {folder_title} — {base_file_title}" - image_exists = Image.objects.filter(title=full_image_title).count() - + image_exists = Image.objects.filter(title=full_image_title).first() if image_exists: - print(f"A file named {full_image_title} already exists, skipping") + file_hash = image_exists.get_file_hash() + print(f"A file named {full_image_title} already exists, skipping (file_hash: {file_hash})") else: image = import_image( full_path=os.path.join(folder_path, filename), @@ -42,6 +47,7 @@ def handle(self, *args, **kwargs): image.collection = collection image.save() + image.get_file_hash() image.tags.add("DSFR") image.tags.add("Pictogrammes") diff --git a/content_manager/management/commands/import_page_templates.py b/content_manager/management/commands/import_page_templates.py new file mode 100644 index 00000000..9f15230d --- /dev/null +++ b/content_manager/management/commands/import_page_templates.py @@ -0,0 +1,13 @@ +from django.core.management.base import BaseCommand + +from content_manager.services.import_export import ImportPages + + +class Command(BaseCommand): + def handle(self, *args, **kwargs): + """ + Import template pages + """ + + page_importer = ImportPages() + page_importer.import_pages() diff --git a/content_manager/migrations/0047_contentpage_source_url.py b/content_manager/migrations/0047_contentpage_source_url.py new file mode 100644 index 00000000..a6d3b4b5 --- /dev/null +++ b/content_manager/migrations/0047_contentpage_source_url.py @@ -0,0 +1,19 @@ +# Generated by Django 5.1.1 on 2024-09-23 13:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("content_manager", "0046_alter_contentpage_body"), + ] + + operations = [ + migrations.AddField( + model_name="contentpage", + name="source_url", + field=models.URLField( + blank=True, help_text="For imported pages, to allow updates.", null=True, verbose_name="Source URL" + ), + ), + ] diff --git a/content_manager/page_templates/image_data.json b/content_manager/page_templates/image_data.json new file mode 100644 index 00000000..50d57e6a --- /dev/null +++ b/content_manager/page_templates/image_data.json @@ -0,0 +1,242 @@ +{ + "6": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/6/", + "tags": [], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/Home.original.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150225Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=42f6dfce758104169d6dd027d4df7543dfd4d1ded5488ed7c1f2a9dd9e79672e" + }, + "filename": "Home.original.png", + "is_pictogram": false, + "title": "Home.original" + }, + "74": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/74/", + "tags": [ + "DSFR", + "Pictogrammes", + "System" + ], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/Pictogrammes_DSFR__System__Information?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150225Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=5c2e592fec7b5a4d988f226c887002d02152b87e27f8c4af4dab67ad444d8710" + }, + "filename": "Pictogrammes DSFR \u2014 System \u2014 Information", + "is_pictogram": true, + "title": "Pictogrammes DSFR \u2014 System \u2014 Information" + }, + "77": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/77/", + "tags": [ + "DSFR", + "Pictogrammes", + "System" + ], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/Pictogrammes_DSFR__System__Success?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150225Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=9704ebf348b14fc4f179019e341c341d7f98bc802bc75bd5afbc85320558dc60" + }, + "filename": "Pictogrammes DSFR \u2014 System \u2014 Success", + "is_pictogram": true, + "title": "Pictogrammes DSFR \u2014 System \u2014 Success" + }, + "81": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/81/", + "tags": [], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/undraw_Website_builder_re_ii6e.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150225Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=469138868118d11ba7cc21f42050190df55a265d62dd758850f5d8b3ae4f3af7" + }, + "filename": "undraw_Website_builder_re_ii6e.png", + "is_pictogram": false, + "title": "Illustration CMS" + }, + "84": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/84/", + "tags": [], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/undraw_building_websites_i78t_1.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150225Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=24d59986227890188189a07737ca98ce9e58cdcd63459dd66cc2502528ac903b" + }, + "filename": "undraw_building_websites_i78t_1.png", + "is_pictogram": false, + "title": "Illustration CMS 2" + }, + "96": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/96/", + "tags": [], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/Design_sans_titre.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150225Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=1c8109f7152cc509831cdbaf95dc9a34c5dda58cfccb2716428a5a8cecd10a55" + }, + "title": "Header", + "filename": "Design_sans_titre.png", + "is_pictogram": false + }, + "112": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/112/", + "tags": [], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/Design_sans_titre_1.svg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150225Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=91058dce71945db628cd57ba9ba9b5cd0be649bf8d187485c3a8ef97395a3f7e" + }, + "title": "Design sans titre (3)", + "filename": "Design_sans_titre_1.svg", + "is_pictogram": false + }, + "116": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/116/", + "tags": [], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/undraw_female_avatar_efig.svg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150226Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=35691c1f6f5d8f7b8b63d65ff14a71fe9608c8b08033c433967e348b86b9ac8a" + }, + "title": "undraw_female_avatar_efig", + "filename": "undraw_female_avatar_efig.svg", + "is_pictogram": false + }, + "117": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/117/", + "tags": [], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/undraw_male_avatar_g98d.svg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150226Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=cbb8547ef3af291dd06aeb86d38ccd3c033baf3ed9eacfaf08248e9f9bdf1011" + }, + "title": "undraw_male_avatar_g98d", + "filename": "undraw_male_avatar_g98d.svg", + "is_pictogram": false + }, + "1": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/1/", + "tags": [], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/undraw_cms_re_asu0.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150225Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=afbc51605652a19fc60c7241542af693d6969c904838b8df69809445300ef2eb" + }, + "title": "CMS", + "filename": "undraw_cms_re_asu0.png", + "is_pictogram": false + }, + "140": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/140/", + "tags": [], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/claudio-schwarz-VaeGMpaSlck-unsplash.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T145734Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=1c4adc18d3801aa80a8f1ccf26e9718d88780e68ea75a73b6ae8a7b6235a68f2" + }, + "title": "claudio-schwarz-VaeGMpaSlck-unsplash", + "filename": "claudio-schwarz-VaeGMpaSlck-unsplash.jpg", + "is_pictogram": false + }, + "142": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/142/", + "tags": [], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/daniele-d-andreti-6rVzFCjy2XE-unsplash.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T145734Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=e8ec980cdd689f9564e12b20d2e6f5eeb2b6b7241b01e2a52708fffffbcc3536" + }, + "title": "daniele-d-andreti-6rVzFCjy2XE-unsplash", + "filename": "daniele-d-andreti-6rVzFCjy2XE-unsplash.jpg", + "is_pictogram": false + }, + "143": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/143/", + "tags": [], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/guzel-maksutova-B30XL_m3fso-unsplash.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T145734Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=31f1c007535702bd19bbd7be8681ddce1c8f47d195d73dddec1d7cd5521a9ec7" + }, + "title": "guzel-maksutova-B30XL_m3fso-unsplash", + "filename": "guzel-maksutova-B30XL_m3fso-unsplash.jpg", + "is_pictogram": false + }, + "144": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/144/", + "tags": [], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/changqing-lu-wLGArh9WwPs-unsplash.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T145735Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=f72e4c0dfd49095cb3346a7bee1d931baf2d43828004de948bb93e710b1b91a7" + }, + "title": "changqing-lu-wLGArh9WwPs-unsplash", + "filename": "changqing-lu-wLGArh9WwPs-unsplash.jpg", + "is_pictogram": false + }, + "145": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/145/", + "tags": [], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/sara-darcaj-YzamNB_T4WQ-unsplash.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T145735Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=e5b01dc4dceb76a5c88fc820af5aa955b8f707ce7adb7cc85a93004cba770475" + }, + "title": "sara-darcaj-YzamNB_T4WQ-unsplash", + "filename": "sara-darcaj-YzamNB_T4WQ-unsplash.jpg", + "is_pictogram": false + }, + "28": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/28/", + "tags": [ + "Digital", + "DSFR", + "Pictogrammes" + ], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/Pictogrammes_DSFR__Digital__Avatar?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150226Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=fd78600ff5d29a51e1229e1f907b5858ea326350c930f001249a73a03f4e7221" + }, + "title": "Pictogrammes DSFR \u2014 Digital \u2014 Avatar", + "filename": "Pictogrammes DSFR \u2014 Digital \u2014 Avatar", + "is_pictogram": true + }, + "66": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/66/", + "tags": [ + "DSFR", + "Leisure", + "Pictogrammes" + ], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/Pictogrammes_DSFR__Leisure__Digital_Art?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150225Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=72dfa95a22846e00d370d99a381e080f1fd6bed376dee6f24a35bbc1ad191c54" + }, + "title": "Pictogrammes DSFR \u2014 Leisure \u2014 Digital Art", + "filename": "Pictogrammes DSFR \u2014 Leisure \u2014 Digital Art", + "is_pictogram": true + }, + "78": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/78/", + "tags": [ + "DSFR", + "Pictogrammes", + "System" + ], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/Pictogrammes_DSFR__System__System?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150225Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=ec91ba0784397b9c34803a0025a0e1a25cb39bd99c7a3845c59e901bc1827e74" + }, + "title": "Pictogrammes DSFR \u2014 System \u2014 System", + "filename": "Pictogrammes DSFR \u2014 System \u2014 System", + "is_pictogram": true + }, + "82": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/82/", + "tags": [], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/accessibility.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150225Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=165ff75c1760dada72524eef11e9b4d4be0a45641d0ff0e3f472cbe2a7c94bae" + }, + "title": "picto accessibility", + "filename": "accessibility.png", + "is_pictogram": false + }, + "120": { + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/120/", + "tags": [], + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/undraw_personal_info_re_ur1n.svg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T145737Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=cda557501dff58fd85c3b862bdbd08512ed9ffcd89d7dbbb6e11475458715038" + }, + "title": "undraw_personal_info_re_ur1n", + "filename": "undraw_personal_info_re_ur1n.svg", + "is_pictogram": false + } +} \ No newline at end of file diff --git a/content_manager/page_templates/img/Design_sans_titre.png b/content_manager/page_templates/img/Design_sans_titre.png new file mode 100644 index 00000000..1f91e590 Binary files /dev/null and b/content_manager/page_templates/img/Design_sans_titre.png differ diff --git a/content_manager/page_templates/img/Design_sans_titre_1.svg b/content_manager/page_templates/img/Design_sans_titre_1.svg new file mode 100644 index 00000000..964160da --- /dev/null +++ b/content_manager/page_templates/img/Design_sans_titre_1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content_manager/page_templates/img/Home.original.png b/content_manager/page_templates/img/Home.original.png new file mode 100644 index 00000000..9624ff66 Binary files /dev/null and b/content_manager/page_templates/img/Home.original.png differ diff --git a/content_manager/page_templates/img/accessibility.png b/content_manager/page_templates/img/accessibility.png new file mode 100644 index 00000000..7bdccab6 Binary files /dev/null and b/content_manager/page_templates/img/accessibility.png differ diff --git a/content_manager/page_templates/img/undraw_Website_builder_re_ii6e.png b/content_manager/page_templates/img/undraw_Website_builder_re_ii6e.png new file mode 100644 index 00000000..148cd5e2 Binary files /dev/null and b/content_manager/page_templates/img/undraw_Website_builder_re_ii6e.png differ diff --git a/content_manager/page_templates/img/undraw_building_websites_i78t_1.png b/content_manager/page_templates/img/undraw_building_websites_i78t_1.png new file mode 100644 index 00000000..64a9f6db Binary files /dev/null and b/content_manager/page_templates/img/undraw_building_websites_i78t_1.png differ diff --git a/content_manager/page_templates/img/undraw_cms_re_asu0.png b/content_manager/page_templates/img/undraw_cms_re_asu0.png new file mode 100644 index 00000000..fa069481 Binary files /dev/null and b/content_manager/page_templates/img/undraw_cms_re_asu0.png differ diff --git a/content_manager/page_templates/img/undraw_female_avatar_efig.svg b/content_manager/page_templates/img/undraw_female_avatar_efig.svg new file mode 100644 index 00000000..e28991b8 --- /dev/null +++ b/content_manager/page_templates/img/undraw_female_avatar_efig.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content_manager/page_templates/img/undraw_male_avatar_g98d.svg b/content_manager/page_templates/img/undraw_male_avatar_g98d.svg new file mode 100644 index 00000000..c481f0b3 --- /dev/null +++ b/content_manager/page_templates/img/undraw_male_avatar_g98d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content_manager/page_templates/pages_data.json b/content_manager/page_templates/pages_data.json new file mode 100644 index 00000000..79167830 --- /dev/null +++ b/content_manager/page_templates/pages_data.json @@ -0,0 +1,2541 @@ +{ + "image_ids": [ + 74, + 77, + 112, + 81, + 84, + 116, + 117, + 82, + 77, + 66, + 78, + 96, + 84, + 6, + 81, + 6, + 28, + 81, + 84, + 77, + 1, + 81, + 84 + ], + "pages": { + "32": { + "id": 32, + "meta": { + "type": "content_manager.ContentPage", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/pages/32/", + "html_url": "http://sites-faciles.beta.numerique.gouv.fr/exemples/template-landing-page/", + "slug": "template-landing-page", + "show_in_menus": true, + "first_published_at": "2024-09-16T17:38:17.932779+02:00", + "alias_of": null, + "locale": "fr" + }, + "title": "Landing page d'un service num\u00e9rique", + "body": [ + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "grey", + "content": [ + { + "type": "text", + "value": "

Pourquoi utiliser ce service ?

" + }, + { + "type": "item_grid", + "value": { + "column_width": "4", + "items": [ + { + "type": "tile", + "value": { + "title": "Argument #1", + "heading_tag": "h3", + "description": "

D\u00e9veloppez une des raisons pour lesquelles votre service simplifie la vie de ses utilisateurs.

", + "image": 77, + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "top_detail_badges_tags": [], + "detail_text": "", + "is_small": false, + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false, + "is_horizontal": false + } + }, + { + "type": "tile", + "value": { + "title": "Argument #2", + "heading_tag": "h3", + "description": "

D\u00e9veloppez une des raisons pour lesquelles votre service simplifie la vie de ses utilisateurs.

", + "image": 77, + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "top_detail_badges_tags": [], + "detail_text": "", + "is_small": false, + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false, + "is_horizontal": false + } + }, + { + "type": "tile", + "value": { + "title": "Argument #3", + "heading_tag": "h3", + "description": "

D\u00e9veloppez une des raisons pour lesquelles votre service simplifie la vie de ses utilisateurs.

", + "image": 77, + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "top_detail_badges_tags": [], + "detail_text": "", + "is_small": false, + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false, + "is_horizontal": false + } + } + ] + } + } + ] + } + }, + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "blue-france", + "content": [ + { + "type": "text", + "value": "

Quelles sont les fonctionnalit\u00e9s principales de votre service ?

" + }, + { + "type": "item_grid", + "value": { + "column_width": "3", + "items": [ + { + "type": "tile", + "value": { + "title": "Fonctionnalit\u00e9 #1", + "heading_tag": "h3", + "description": "

Vous pouvez expliquer ici l'une des fonctionnalit\u00e9s phares de votre service.

", + "image": 74, + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "top_detail_badges_tags": [], + "detail_text": "", + "is_small": false, + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false, + "is_horizontal": false + } + }, + { + "type": "tile", + "value": { + "title": "Fonctionnalit\u00e9 #2", + "heading_tag": "h3", + "description": "

Vous pouvez expliquer ici l'une des fonctionnalit\u00e9s phares de votre service.

", + "image": 74, + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "top_detail_badges_tags": [], + "detail_text": "", + "is_small": false, + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false, + "is_horizontal": false + } + }, + { + "type": "tile", + "value": { + "title": "Fonctionnalit\u00e9 #3", + "heading_tag": "h3", + "description": "

Vous pouvez expliquer ici l'une des fonctionnalit\u00e9s phares de votre service.

", + "image": 74, + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "top_detail_badges_tags": [], + "detail_text": "", + "is_small": false, + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false, + "is_horizontal": false + } + }, + { + "type": "tile", + "value": { + "title": "Fonctionnalit\u00e9 #4", + "heading_tag": "h3", + "description": "

Vous pouvez expliquer ici l'une des fonctionnalit\u00e9s phares de votre service.

", + "image": 74, + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "top_detail_badges_tags": [], + "detail_text": "", + "is_small": false, + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false, + "is_horizontal": false + } + } + ] + } + } + ] + } + }, + { + "type": "imageandtext", + "value": { + "image": 84, + "image_side": "right", + "image_ratio": "5", + "text": "

\u00c0 qui s'adresse votre service ?

Vous pouvez expliquer ici le p\u00e9rim\u00e8tre d'usage du service :

", + "link": { + "page": null, + "document": null, + "external_url": "", + "text": "", + "icon": "", + "size": "" + }, + "link_label": "", + "page": null, + "link_url": "" + } + }, + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "blue-france", + "content": [ + { + "type": "text", + "value": "

Quelques exemples de cas d'usage

" + }, + { + "type": "item_grid", + "value": { + "column_width": "6", + "items": [ + { + "type": "card", + "value": { + "title": "Exemple #1", + "heading_tag": "h3", + "description": "

Expliquez ici le cas d'usage que vous voulez mettre en valeur pour que vos utilisateurs puissent se projeter dans l'usage de votre service.

", + "image": 81, + "image_ratio": "", + "image_badge": [], + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "", + "top_detail_badges_tags": [ + { + "type": "tags", + "value": [ + { + "type": "tag", + "value": { + "label": "Exemple de tag 1", + "is_small": true, + "color": "green-tilleul-verveine", + "icon_class": "", + "link": { + "page": 3, + "document": null, + "external_url": "" + } + } + } + ] + } + ], + "bottom_detail_text": "", + "bottom_detail_icon": "", + "call_to_action": [], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + }, + { + "type": "card", + "value": { + "title": "Exemple #2", + "heading_tag": "h3", + "description": "

Expliquez ici le cas d'usage que vous voulez mettre en valeur pour que vos utilisateurs puissent se projeter dans l'usage de votre service.

", + "image": 81, + "image_ratio": "", + "image_badge": [], + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "", + "top_detail_badges_tags": [ + { + "type": "tags", + "value": [ + { + "type": "tag", + "value": { + "label": "Exemple de tag 1", + "is_small": true, + "color": "green-tilleul-verveine", + "icon_class": "", + "link": { + "page": 3, + "document": null, + "external_url": "" + } + } + }, + { + "type": "tag", + "value": { + "label": "Exemple de tag 2", + "is_small": true, + "color": "green-bourgeon", + "icon_class": "", + "link": { + "page": 29, + "document": null, + "external_url": "" + } + } + } + ] + } + ], + "bottom_detail_text": "", + "bottom_detail_icon": "", + "call_to_action": [], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + }, + { + "type": "card", + "value": { + "title": "Exemple #3", + "heading_tag": "h3", + "description": "

Expliquez ici le cas d'usage que vous voulez mettre en valeur pour que vos utilisateurs puissent se projeter dans l'usage de votre service.

", + "image": 81, + "image_ratio": "", + "image_badge": [], + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "", + "top_detail_badges_tags": [ + { + "type": "tags", + "value": [ + { + "type": "tag", + "value": { + "label": "Exemple de tag 2", + "is_small": true, + "color": "green-bourgeon", + "icon_class": "", + "link": { + "page": 29, + "document": null, + "external_url": "" + } + } + }, + { + "type": "tag", + "value": { + "label": "Exemple de tag 3", + "is_small": true, + "color": "orange-terre-battue", + "icon_class": "", + "link": { + "page": 18, + "document": null, + "external_url": "" + } + } + } + ] + } + ], + "bottom_detail_text": "", + "bottom_detail_icon": "", + "call_to_action": [], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + }, + { + "type": "card", + "value": { + "title": "Exemple #4", + "heading_tag": "h3", + "description": "

Expliquez ici le cas d'usage que vous voulez mettre en valeur pour que vos utilisateurs puissent se projeter dans l'usage de votre service.

", + "image": 81, + "image_ratio": "", + "image_badge": [], + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "", + "top_detail_badges_tags": [ + { + "type": "tags", + "value": [ + { + "type": "tag", + "value": { + "label": "Exemple de tag 3", + "is_small": true, + "color": "orange-terre-battue", + "icon_class": "", + "link": { + "page": 18, + "document": null, + "external_url": "" + } + } + } + ] + } + ], + "bottom_detail_text": "", + "bottom_detail_icon": "", + "call_to_action": [], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + } + ] + } + } + ] + } + }, + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "grey", + "content": [ + { + "type": "text_cta", + "value": { + "text": "

Ce qu'en pensent vos utilisateurs

", + "cta_buttons": [], + "cta_label": "", + "cta_url": "" + } + }, + { + "type": "item_grid", + "value": { + "column_width": "6", + "items": [ + { + "type": "quote", + "value": { + "image": 116, + "quote": "T\u00e9moignage d'une usag\u00e8re de votre service sous forme de citation.", + "author_name": "Nom de l'usag\u00e8re", + "author_title": "Titre de l'usag\u00e8re", + "color": "" + } + }, + { + "type": "quote", + "value": { + "image": 117, + "quote": "T\u00e9moignage d'un usager de votre service sous forme de citation.", + "author_name": "Nom de l'usager", + "author_title": "Titre de l'usager", + "color": "" + } + } + ] + } + } + ] + } + }, + { + "type": "accordions", + "value": [ + { + "type": "title", + "value": "Questions fr\u00e9quentes de vos utilisateurs" + }, + { + "type": "accordion", + "value": { + "title": "Question fr\u00e9quente #1 ?", + "content": "

Saisissez la r\u00e9ponse dans ce champ.

" + } + }, + { + "type": "accordion", + "value": { + "title": "Question fr\u00e9quente #2 ?", + "content": "

Saisissez la r\u00e9ponse dans ce champ.

" + } + }, + { + "type": "accordion", + "value": { + "title": "Question fr\u00e9quente #3 ?", + "content": "

Saisissez la r\u00e9ponse dans ce champ.

" + } + }, + { + "type": "accordion", + "value": { + "title": "Question fr\u00e9quente #4 ?", + "content": "

Saisissez la r\u00e9ponse dans ce champ.

" + } + } + ] + }, + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "grey", + "content": [ + { + "type": "stepper", + "value": { + "title": "Votre feuille de route", + "total": 3, + "current": 2, + "steps": [ + { + "type": "step", + "value": { + "title": "Date", + "detail": "Premi\u00e8re \u00e9tape \r\nCourte description des enjeux" + } + }, + { + "type": "step", + "value": { + "title": "Date", + "detail": "Etape actuelle\r\nCourte description des enjeux" + } + }, + { + "type": "step", + "value": { + "title": "Date", + "detail": "Prochaine \u00e9tape\r\nCourte description des enjeux" + } + } + ] + } + } + ] + } + }, + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "", + "content": [ + { + "type": "text_cta", + "value": { + "text": "

Utilisez ce dernier bloc pour inciter \u00e0 une action

", + "cta_buttons": [ + { + "type": "buttons", + "value": [ + { + "type": "button", + "value": { + "page": 29, + "document": null, + "external_url": "", + "text": "Appel \u00e0 action", + "button_type": "fr-btn fr-btn--secondary", + "icon_class": "fr-icon-send-plane-fill", + "icon_side": "fr-btn--icon-left" + } + } + ] + } + ], + "cta_label": "", + "cta_url": "" + } + } + ] + } + } + ], + "header_image": { + "id": 112, + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/112/", + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/Design_sans_titre_1.svg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150223Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=707af07bef74bb659ac1e063b523a1816e921287390fd08728392ccd51a5a023" + }, + "title": "Design sans titre (3)" + }, + "header_image_render": { + "url": "https://cellar-c2.services.clever-cloud.com/storage-demo/images/Design_sans_titre_1.2e16d0ba.fill-1200x627.svg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150223Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=f743ef14d0b81f88bc5b46a05b5851b145a8fa9ab8aee50aa798479eafab7382", + "full_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/images/Design_sans_titre_1.2e16d0ba.fill-1200x627.svg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150223Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=f743ef14d0b81f88bc5b46a05b5851b145a8fa9ab8aee50aa798479eafab7382", + "width": 518, + "height": 270, + "alt": "Design sans titre (3)" + }, + "header_image_thumbnail": { + "url": "https://cellar-c2.services.clever-cloud.com/storage-demo/images/Design_sans_titre_1.2e16d0ba.fill-376x211.svg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150223Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=df61c9fc0994f92970046839b0f6c5149505b60b87e45c07b010fc53e501349b", + "full_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/images/Design_sans_titre_1.2e16d0ba.fill-376x211.svg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150223Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=df61c9fc0994f92970046839b0f6c5149505b60b87e45c07b010fc53e501349b", + "width": 376, + "height": 211, + "alt": "Design sans titre (3)" + }, + "header_with_title": true, + "header_color_class": null, + "header_large": false, + "header_darken": false, + "header_cta_text": "

Voici un exemple de page que vous pouvez utiliser pour promouvoir un service num\u00e9rique.

Utilisez cette en-t\u00eate pour ins\u00e9rer une phrase d'accroche.
Vous pouvez \u00e9galement ajouter un court paragraphe d'explication, et un appel \u00e0 action.

", + "header_cta_buttons": [ + { + "type": "buttons", + "value": [ + { + "type": "button", + "value": { + "page": 34, + "document": null, + "external_url": "", + "text": "Appel \u00e0 action", + "button_type": "fr-btn", + "icon_class": "", + "icon_side": "" + }, + "id": "e3bb30c0-d0bb-433a-b688-2a2200978885" + } + ], + "id": "639058db-5850-43cc-a67a-c26818cd39d6" + } + ], + "header_cta_label": null, + "header_cta_link": null + }, + "36": { + "id": 36, + "meta": { + "type": "content_manager.ContentPage", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/pages/36/", + "html_url": "http://sites-faciles.beta.numerique.gouv.fr/exemples/exemples-de-tuiles/", + "slug": "exemples-de-tuiles", + "show_in_menus": true, + "first_published_at": "2024-09-16T17:26:02.224329+02:00", + "alias_of": null, + "locale": "fr" + }, + "title": "Tuiles", + "body": [ + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "", + "content": [ + { + "type": "text", + "value": "

Tuiles simples ins\u00e9r\u00e9es dans une grille d'\u00e9l\u00e9ments

" + }, + { + "type": "item_grid", + "value": { + "column_width": "4", + "items": [ + { + "type": "tile", + "value": { + "title": "Tuile simple", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "image": null, + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "top_detail_badges_tags": [], + "detail_text": "", + "is_small": false, + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false, + "is_horizontal": false + } + }, + { + "type": "tile", + "value": { + "title": "Tuile simple", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "image": null, + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "top_detail_badges_tags": [], + "detail_text": "", + "is_small": false, + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false, + "is_horizontal": false + } + }, + { + "type": "tile", + "value": { + "title": "Tuile simple", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "image": null, + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "top_detail_badges_tags": [], + "detail_text": "", + "is_small": false, + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false, + "is_horizontal": false + } + } + ] + } + } + ] + } + }, + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "", + "content": [ + { + "type": "text", + "value": "

Tuiles \u00e9labor\u00e9es ins\u00e9r\u00e9es dans une grille d'\u00e9l\u00e9ments

" + }, + { + "type": "item_grid", + "value": { + "column_width": "6", + "items": [ + { + "type": "tile", + "value": { + "title": "Tuile avec un lien et un badge", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "image": 82, + "link": { + "page": 42, + "document": null, + "external_url": "" + }, + "top_detail_badges_tags": [ + { + "type": "badges", + "value": [ + { + "type": "badge", + "value": { + "text": "Badge \"nouveau\"", + "color": "new", + "hide_icon": false + } + } + ] + } + ], + "detail_text": "", + "is_small": false, + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false, + "is_horizontal": false + } + }, + { + "type": "tile", + "value": { + "title": "Tuile avec un texte de d\u00e9tail et un tag", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "image": 78, + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "top_detail_badges_tags": [ + { + "type": "tags", + "value": [ + { + "type": "tag", + "value": { + "label": "Tag avec ic\u00f4ne", + "is_small": false, + "color": "green-tilleul-verveine", + "icon_class": "fr-icon-chat-check-line", + "link": { + "page": null, + "document": null, + "external_url": "" + } + } + } + ] + } + ], + "detail_text": "Texte de d\u00e9tail : Lorem ipsum dolor sit amet", + "is_small": false, + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false, + "is_horizontal": false + } + }, + { + "type": "tile", + "value": { + "title": "Tuile avec un document \u00e0 t\u00e9l\u00e9charger", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

", + "image": 66, + "link": { + "page": null, + "document": 1, + "external_url": "" + }, + "top_detail_badges_tags": [], + "detail_text": "", + "is_small": false, + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false, + "is_horizontal": false + } + } + ] + } + } + ] + } + }, + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "blue-france", + "content": [ + { + "type": "text", + "value": "

Tuiles horizontales, sur fond pleine largeur

" + }, + { + "type": "tile", + "value": { + "title": "Tuile horizontale sans image avec des tags", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

", + "image": null, + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "top_detail_badges_tags": [ + { + "type": "tags", + "value": [ + { + "type": "tag", + "value": { + "label": "Tag 1", + "is_small": false, + "color": "green-tilleul-verveine", + "icon_class": "", + "link": { + "page": null, + "document": null, + "external_url": "" + } + } + }, + { + "type": "tag", + "value": { + "label": "Tag 2", + "is_small": false, + "color": "green-bourgeon", + "icon_class": "", + "link": { + "page": 42, + "document": null, + "external_url": "" + } + } + }, + { + "type": "tag", + "value": { + "label": "Tag 3", + "is_small": false, + "color": "green-emeraude", + "icon_class": "", + "link": { + "page": 42, + "document": null, + "external_url": "" + } + } + } + ] + } + ], + "detail_text": "", + "is_small": false, + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false, + "is_horizontal": true + } + }, + { + "type": "tile", + "value": { + "title": "Tuile horizontale avec une image et un lien", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

", + "image": 77, + "link": { + "page": 42, + "document": null, + "external_url": "" + }, + "top_detail_badges_tags": [], + "detail_text": "", + "is_small": false, + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false, + "is_horizontal": true + } + } + ] + } + } + ], + "header_image": null, + "header_image_render": null, + "header_image_thumbnail": null, + "header_with_title": false, + "header_color_class": null, + "header_large": false, + "header_darken": false, + "header_cta_text": "", + "header_cta_buttons": [], + "header_cta_label": null, + "header_cta_link": null + }, + "37": { + "id": 37, + "meta": { + "type": "content_manager.ContentPage", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/pages/37/", + "html_url": "http://sites-faciles.beta.numerique.gouv.fr/exemples/en-t%C3%AAtes-et-bandeaux-dappel-%C3%A0-action/", + "slug": "en-t\u00eates-et-bandeaux-dappel-\u00e0-action", + "show_in_menus": true, + "first_published_at": "2024-09-16T17:34:36.937313+02:00", + "alias_of": null, + "locale": "fr" + }, + "title": "En-t\u00eates et bandeaux d'appel \u00e0 action", + "body": [ + { + "type": "paragraph", + "value": "

Autres exemples

Il est \u00e9galement possible de cr\u00e9er des bandeaux d'appel \u00e0 action avec d'autres types de blocs. Voici quelques exemples.

" + }, + { + "type": "fullwidthbackground", + "value": { + "bg_image": 6, + "bg_color_class": "", + "content": [ + { + "type": "text_cta", + "value": { + "text": "

Texte avec appel \u00e0 action, sur fond pleine largeur

Le \"fond pleine largeur\" peut \u00eatre une image de votre choix, ou l'une des couleurs du Syst\u00e8me de Design de l'Etat (DSFR).

Pour cet exemple, nous avons opt\u00e9 pour une image en fond.

", + "cta_buttons": [ + { + "type": "buttons", + "value": [ + { + "type": "button", + "value": { + "page": null, + "document": null, + "external_url": "", + "text": "Bouton primaire avec ic\u00f4ne", + "button_type": "fr-btn", + "icon_class": "fr-icon-award-line", + "icon_side": "fr-btn--icon-left" + } + } + ] + } + ], + "cta_label": "", + "cta_url": "" + } + } + ] + } + }, + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "grey", + "content": [ + { + "type": "text_cta", + "value": { + "text": "

Texte avec appel \u00e0 action, sur fond pleine largeur

Pour cet exemple, nous avons opt\u00e9 pour un \"fond pleine largeur\" de couleur grise, et nous y avons ins\u00e9r\u00e9 un \"texte avec appel action\".

Voici les diff\u00e9rents types de bouton (\"appel \u00e0 action\") disponibles :

", + "cta_buttons": [ + { + "type": "buttons", + "value": [ + { + "type": "button", + "value": { + "page": null, + "document": null, + "external_url": "", + "text": "Un bouton primaire", + "button_type": "fr-btn", + "icon_class": "", + "icon_side": "" + } + }, + { + "type": "button", + "value": { + "page": null, + "document": null, + "external_url": "", + "text": "Un bouton secondaire", + "button_type": "fr-btn fr-btn--secondary", + "icon_class": "", + "icon_side": "" + } + }, + { + "type": "button", + "value": { + "page": null, + "document": null, + "external_url": "", + "text": "Un bouton tertiaire", + "button_type": "fr-btn fr-btn--tertiary", + "icon_class": "", + "icon_side": "" + } + }, + { + "type": "button", + "value": { + "page": null, + "document": null, + "external_url": "", + "text": "Un bouton tertiaire sans bordure", + "button_type": "fr-btn fr-btn--tertiary-no-outline", + "icon_class": "", + "icon_side": "" + } + } + ] + } + ], + "cta_label": "", + "cta_url": "" + } + } + ] + } + }, + { + "type": "multicolumns", + "value": { + "bg_image": null, + "bg_color_class": "beige-gris-galet", + "bg_color": "", + "title": "Multi-colonnes", + "heading_tag": "", + "columns": [ + { + "type": "text_cta", + "value": { + "text": "

Pour cet exemple, nous avons opt\u00e9 pour un bloc \"multi-colonne\", en ins\u00e9rant :

Il est possible de choisir une couleur de fond pour votre bloc \"multi-colonne\". Nous avons s\u00e9lectionn\u00e9 ici \"gris galet\".

", + "cta_buttons": [ + { + "type": "buttons", + "value": [ + { + "type": "button", + "value": { + "page": 34, + "document": null, + "external_url": "", + "text": "Bouton primaire", + "button_type": "fr-btn", + "icon_class": "", + "icon_side": "" + } + } + ] + } + ], + "cta_label": "", + "cta_url": "" + } + }, + { + "type": "image", + "value": { + "title": "", + "heading_tag": "", + "image": 84, + "alt": "", + "width": "fr-content-media--sm", + "image_ratio": "fr-ratio-3x2", + "caption": "", + "url": "" + } + } + ] + } + } + ], + "header_image": { + "id": 96, + "meta": { + "type": "wagtailimages.Image", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/images/96/", + "download_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/original_images/Design_sans_titre.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150224Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=d578177d1962d7eef7a556e8a835eb75463adb54b2e30c9058e5c53503b57cc2" + }, + "title": "Header" + }, + "header_image_render": { + "url": "https://cellar-c2.services.clever-cloud.com/storage-demo/images/Design_sans_titre.319bb898.fill-1200x627.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150224Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=c18c4159c4fb17af683f4a9044bd30c81bd7ad763586acb8b8c1d40934dc9279", + "full_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/images/Design_sans_titre.319bb898.fill-1200x627.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150224Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=c18c4159c4fb17af683f4a9044bd30c81bd7ad763586acb8b8c1d40934dc9279", + "width": 839, + "height": 438, + "alt": "Header" + }, + "header_image_thumbnail": { + "url": "https://cellar-c2.services.clever-cloud.com/storage-demo/images/Design_sans_titre.319bb898.fill-376x211.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150224Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=c083418f12b716205bda368fcc066ee79737ad33f8b977aed3db251a829ef296", + "full_url": "https://cellar-c2.services.clever-cloud.com/storage-demo/images/Design_sans_titre.319bb898.fill-376x211.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ZWM9OJBMLHVWM86C0Y2S%2F20241017%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-Date=20241017T150224Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=c083418f12b716205bda368fcc066ee79737ad33f8b977aed3db251a829ef296", + "width": 376, + "height": 211, + "alt": "Header" + }, + "header_with_title": true, + "header_color_class": null, + "header_large": false, + "header_darken": true, + "header_cta_text": "

Vous pouvez cr\u00e9er une en-t\u00eate comme celle-ci, en vous rendant dans l'onglet \"Promotion\" de votre page, puis en choisissant les \"Options d'en-t\u00eate\".

Vous pourrez y ins\u00e9rer une image ou une couleur de fond, ainsi que du texte format\u00e9 et des boutons d'appel \u00e0 action.

Cette en-t\u00eate appara\u00eetra lorsque des aper\u00e7us de votre page seront g\u00e9n\u00e9r\u00e9s.

", + "header_cta_buttons": [ + { + "type": "buttons", + "value": [ + { + "type": "button", + "value": { + "page": 37, + "document": null, + "external_url": "", + "text": "Bouton d'appel \u00e0 action", + "button_type": "fr-btn", + "icon_class": "", + "icon_side": "" + }, + "id": "0ee1a462-98a6-4261-a117-e56c331fcbb3" + } + ], + "id": "7a709cda-d544-492b-812b-26e7f5b41fe4" + } + ], + "header_cta_label": null, + "header_cta_link": null + }, + "38": { + "id": 38, + "meta": { + "type": "content_manager.ContentPage", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/pages/38/", + "html_url": "http://sites-faciles.beta.numerique.gouv.fr/exemples/page-de-contenu-avec-menu-lat%C3%A9ral/", + "slug": "page-de-contenu-avec-menu-lat\u00e9ral", + "show_in_menus": true, + "first_published_at": "2024-09-16T17:32:49.092767+02:00", + "alias_of": null, + "locale": "fr" + }, + "title": "Page de contenu avec menu lat\u00e9ral", + "body": [ + { + "type": "fullwidthbackgroundwithsidemenu", + "value": { + "bg_image": null, + "bg_color_class": "blue-france", + "main_content": [ + { + "type": "item_grid", + "value": { + "column_width": "6", + "items": [ + { + "type": "card", + "value": { + "title": "Comment cr\u00e9er un menu lat\u00e9ral ?", + "heading_tag": "h2", + "description": "

Choisissez le bloc \"Fond pleine largeur avec menu lat\u00e9ral\". Le menu appara\u00eetra \u00e0 gauche de la page. Vous pourrez ensuite choisir une page \"racine\", et l'ensemble de ses sous-pages appara\u00eetront automatiquement dans le menu, refl\u00e9tant l'arborescence de votre site.

", + "image": null, + "image_ratio": "", + "image_badge": [], + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "", + "top_detail_badges_tags": [], + "bottom_detail_text": "", + "bottom_detail_icon": "", + "call_to_action": [], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + }, + { + "type": "card", + "value": { + "title": "Et pour la partie de droite de la page ?", + "heading_tag": "h2", + "description": "

Vous pouvez ins\u00e9rer le contenu de votre choix dans cette partie. Pour cet exemple, nous avons opt\u00e9 pour une \"grille d'\u00e9l\u00e9ments\", dans laquelle nous avons ins\u00e9r\u00e9 des \"cartes verticales\".

", + "image": null, + "image_ratio": "", + "image_badge": [], + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "", + "top_detail_badges_tags": [], + "bottom_detail_text": "", + "bottom_detail_icon": "", + "call_to_action": [], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + } + ] + } + } + ], + "sidemenu_title": "Titre de votre menu lat\u00e9ral", + "sidemenu_content": [ + { + "type": "pagetree", + "value": { + "page": 34 + } + } + ] + } + } + ], + "header_image": null, + "header_image_render": null, + "header_image_thumbnail": null, + "header_with_title": false, + "header_color_class": null, + "header_large": false, + "header_darken": false, + "header_cta_text": "", + "header_cta_buttons": [], + "header_cta_label": null, + "header_cta_link": null + }, + "39": { + "id": 39, + "meta": { + "type": "content_manager.ContentPage", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/pages/39/", + "html_url": "http://sites-faciles.beta.numerique.gouv.fr/exemples/blocs-simples-de-textes-et-dimages/", + "slug": "blocs-simples-de-textes-et-dimages", + "show_in_menus": true, + "first_published_at": "2024-09-16T17:31:35.383776+02:00", + "alias_of": null, + "locale": "fr" + }, + "title": "Blocs simples de textes et d'images", + "body": [ + { + "type": "imageandtext", + "value": { + "image": 81, + "image_side": "right", + "image_ratio": "5", + "text": "

Bloc \"Image et texte\"

Vous pouvez choisir la disposition de l'image (gauche ou droite) et ses dimensions. Vous pouvez \u00e9galement mettre ce texte en forme (gras, italique, listes \u00e0 puce, listes num\u00e9rot\u00e9es, liens hypertexte...).


Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

", + "link": { + "page": null, + "document": null, + "external_url": "", + "text": "", + "icon": "", + "size": "" + }, + "link_label": "", + "page": null, + "link_url": "" + } + }, + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "blue-france", + "content": [ + { + "type": "text", + "value": "

Texte avec mise en forme

Vous pouvez mettre le texte en forme (gras, italique, listes \u00e0 puce, listes num\u00e9rot\u00e9es, liens hypertexte...).

Pour cet exemple, nous avons ins\u00e9r\u00e9 le bloc de texte dans un \"fond pleine largeur\", qui peut \u00eatre une couleur ou l'image de votre choix. Ici, nous avons choisi la couleur \"Bleu France\".


Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

" + } + ] + } + }, + { + "type": "paragraph", + "value": "

Image seule

Utilisez un bloc 'image\" pour cela. Vous pourrez choisir les dimensions de l'image, et l'agr\u00e9menter si vous le souhaitez d'un titre, d'une l\u00e9gende et d'un lien.

Pour garantir l'accessibilit\u00e9 de votre site, n'oubliez pas de renseigner une alternative textuelle pour chaque image.

" + }, + { + "type": "image", + "value": { + "title": "", + "heading_tag": "h3", + "image": 6, + "alt": "Une image d'illustration.", + "width": "", + "image_ratio": "fr-ratio-32x9", + "caption": "Vous pouvez ajouter une l\u00e9gende ici.", + "url": "" + } + }, + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "", + "content": [ + { + "type": "text", + "value": "

Options de mise en forme des textes

De nombreuses options existent pour mettre vos textes en forme. N'h\u00e9sitez pas \u00e0 les utiliser pour am\u00e9liorer la lisibilit\u00e9 de vos contenus.

En-t\u00eate 2

En-t\u00eate 3

En-t\u00eate 4

  1. liste 1
  2. liste 2
  3. liste 3

Lien interne

Lien externe

Lien email

Un document \u00e0 t\u00e9l\u00e9charger

Un texte simple

Un texte en gras

Un texte en italique

Une ligne horizontale :


" + } + ] + } + } + ], + "header_image": null, + "header_image_render": null, + "header_image_thumbnail": null, + "header_with_title": false, + "header_color_class": null, + "header_large": false, + "header_darken": false, + "header_cta_text": "", + "header_cta_buttons": [], + "header_cta_label": null, + "header_cta_link": null + }, + "40": { + "id": 40, + "meta": { + "type": "content_manager.ContentPage", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/pages/40/", + "html_url": "http://sites-faciles.beta.numerique.gouv.fr/exemples/options-de-mise-en-valeur-de-textes/", + "slug": "options-de-mise-en-valeur-de-textes", + "show_in_menus": true, + "first_published_at": "2024-09-16T17:29:51.465461+02:00", + "alias_of": null, + "locale": "fr" + }, + "title": "Options de mise en valeur de textes", + "body": [ + { + "type": "paragraph", + "value": "

Utilisez ces blocs particuliers pour mettre des textes en valeur, et attirer l'attention de vos lecteurs. Vous pouvez personnaliser ces blocs avec des ic\u00f4nes, des boutons, des couleurs et des images.

" + }, + { + "type": "paragraph", + "value": "

Messages d'alerte

" + }, + { + "type": "alert", + "value": { + "title": "Message d'alerte - succ\u00e8s", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", + "level": "success", + "heading_tag": "h3" + } + }, + { + "type": "alert", + "value": { + "title": "Message d'alerte - information", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", + "level": "info", + "heading_tag": "h3" + } + }, + { + "type": "alert", + "value": { + "title": "Message d'alerte - erreur", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", + "level": "error", + "heading_tag": "h3" + } + }, + { + "type": "alert", + "value": { + "title": "Message d'alerte - avertissement", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", + "level": "warning", + "heading_tag": "h3" + } + }, + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "", + "content": [ + { + "type": "text", + "value": "

Mise en avant

" + }, + { + "type": "callout", + "value": { + "title": "Titre", + "heading_tag": "h4", + "icon_class": "fr-icon-flag-line", + "text": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

", + "button": { + "page": 39, + "document": null, + "external_url": "", + "text": "Bouton secondaire", + "button_type": "fr-btn fr-btn--secondary", + "icon_class": "", + "icon_side": "" + }, + "color": "" + } + } + ] + } + }, + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "", + "content": [ + { + "type": "text", + "value": "

Mise en exergue

" + }, + { + "type": "highlight", + "value": { + "text": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "color": "", + "size": "" + } + } + ] + } + }, + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "", + "content": [ + { + "type": "text", + "value": "

Citation

" + }, + { + "type": "quote", + "value": { + "image": 28, + "quote": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + "author_name": "Nom de l'auteur", + "author_title": "Titre de l'auteur", + "color": "" + } + } + ] + } + } + ], + "header_image": null, + "header_image_render": null, + "header_image_thumbnail": null, + "header_with_title": false, + "header_color_class": null, + "header_large": false, + "header_darken": false, + "header_cta_text": "", + "header_cta_buttons": [], + "header_cta_label": null, + "header_cta_link": null + }, + "41": { + "id": 41, + "meta": { + "type": "content_manager.ContentPage", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/pages/41/", + "html_url": "http://sites-faciles.beta.numerique.gouv.fr/exemples/grilles-d%C3%A9l%C3%A9ments/", + "slug": "grilles-d\u00e9l\u00e9ments", + "show_in_menus": true, + "first_published_at": "2024-09-16T17:27:10.483371+02:00", + "alias_of": null, + "locale": "fr" + }, + "title": "Grilles d'\u00e9l\u00e9ments", + "body": [ + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "", + "content": [ + { + "type": "text", + "value": "

Utilisez ce type de bloc pour structurer des \u00e9l\u00e9ments en rang\u00e9es et en colonnes. Vous pouvez y ins\u00e9rer les \u00e9l\u00e9ments de votre choix.

Pour cela, il suffit de choisir le bloc \"grille d'\u00e9l\u00e9ment\", puis de choisir la largeur des colonnes :

Le nombre de rang\u00e9es augmentera en fonction du nombre d'\u00e9l\u00e9ments que vous ajoutez dans la grille.

" + } + ] + } + }, + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "blue-france", + "content": [ + { + "type": "text", + "value": "

Exemple de grille avec des cartes verticales

Pour cette grille, nous avons r\u00e9gl\u00e9 la largeur de colonnes sur 6/12.

" + }, + { + "type": "item_grid", + "value": { + "column_width": "6", + "items": [ + { + "type": "card", + "value": { + "title": "Carte verticale", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

", + "image": null, + "image_ratio": "fr-ratio-1x1", + "image_badge": [], + "link": { + "page": 41, + "document": null, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "", + "top_detail_badges_tags": [], + "bottom_detail_text": "", + "bottom_detail_icon": "", + "call_to_action": [], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + }, + { + "type": "card", + "value": { + "title": "Carte verticale", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

", + "image": null, + "image_ratio": "", + "image_badge": [], + "link": { + "page": 41, + "document": null, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "", + "top_detail_badges_tags": [], + "bottom_detail_text": "", + "bottom_detail_icon": "", + "call_to_action": [], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + }, + { + "type": "card", + "value": { + "title": "Carte verticale", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

", + "image": null, + "image_ratio": "", + "image_badge": [], + "link": { + "page": 41, + "document": null, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "", + "top_detail_badges_tags": [], + "bottom_detail_text": "", + "bottom_detail_icon": "", + "call_to_action": [], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + }, + { + "type": "card", + "value": { + "title": "Carte verticale", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

", + "image": null, + "image_ratio": "", + "image_badge": [], + "link": { + "page": 41, + "document": null, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "", + "top_detail_badges_tags": [], + "bottom_detail_text": "", + "bottom_detail_icon": "", + "call_to_action": [], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + } + ] + } + } + ] + } + }, + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "", + "content": [ + { + "type": "text", + "value": "

Exemple de grille avec des tuiles et des images

Pour cette grille, nous avons r\u00e9gl\u00e9 la largeur de colonnes sur 4/12.

" + }, + { + "type": "item_grid", + "value": { + "column_width": "4", + "items": [ + { + "type": "tile", + "value": { + "title": "Tuile", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "image": 77, + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "top_detail_badges_tags": [], + "detail_text": "", + "is_small": false, + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false, + "is_horizontal": false + } + }, + { + "type": "image", + "value": { + "title": "", + "heading_tag": "h3", + "image": 84, + "alt": "", + "width": "fr-content-media--sm", + "image_ratio": "fr-ratio-4x3", + "caption": "", + "url": "" + } + }, + { + "type": "tile", + "value": { + "title": "Tuile", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "image": 77, + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "top_detail_badges_tags": [], + "detail_text": "", + "is_small": false, + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false, + "is_horizontal": false + } + }, + { + "type": "image", + "value": { + "title": "", + "heading_tag": "h3", + "image": 81, + "alt": "", + "width": "fr-content-media--sm", + "image_ratio": "fr-ratio-4x3", + "caption": "", + "url": "" + } + }, + { + "type": "tile", + "value": { + "title": "Tuile", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "image": 77, + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "top_detail_badges_tags": [], + "detail_text": "", + "is_small": false, + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false, + "is_horizontal": false + } + }, + { + "type": "image", + "value": { + "title": "", + "heading_tag": "h3", + "image": 1, + "alt": "", + "width": "fr-content-media--sm", + "image_ratio": "fr-ratio-4x3", + "caption": "", + "url": "" + } + } + ] + } + } + ] + } + } + ], + "header_image": null, + "header_image_render": null, + "header_image_thumbnail": null, + "header_with_title": false, + "header_color_class": null, + "header_large": false, + "header_darken": false, + "header_cta_text": "", + "header_cta_buttons": [], + "header_cta_label": null, + "header_cta_link": null + }, + "42": { + "id": 42, + "meta": { + "type": "content_manager.ContentPage", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/pages/42/", + "html_url": "http://sites-faciles.beta.numerique.gouv.fr/exemples/accord%C3%A9ons/", + "slug": "accord\u00e9ons", + "show_in_menus": true, + "first_published_at": "2024-09-16T17:23:07.932797+02:00", + "alias_of": null, + "locale": "fr" + }, + "title": "Accord\u00e9ons", + "body": [ + { + "type": "paragraph", + "value": "

Les accord\u00e9ons sont id\u00e9aux pour cr\u00e9er des sections \"questions fr\u00e9quentes\". Vous pouvez appliquer la mise en forme de votre choix sur les textes (gras, italique, listes, liens...).

" + }, + { + "type": "accordions", + "value": [ + { + "type": "title", + "value": "Titre de l'accord\u00e9on" + }, + { + "type": "accordion", + "value": { + "title": "Titre de la section ou question", + "content": "

Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

" + } + }, + { + "type": "accordion", + "value": { + "title": "Titre de la section ou question", + "content": "

Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

" + } + }, + { + "type": "accordion", + "value": { + "title": "Titre de la section ou question", + "content": "

Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

" + } + }, + { + "type": "accordion", + "value": { + "title": "Titre de la section ou question", + "content": "

Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

" + } + } + ] + } + ], + "header_image": null, + "header_image_render": null, + "header_image_thumbnail": null, + "header_with_title": false, + "header_color_class": null, + "header_large": false, + "header_darken": false, + "header_cta_text": "", + "header_cta_buttons": [], + "header_cta_label": null, + "header_cta_link": null + }, + "43": { + "id": 43, + "meta": { + "type": "content_manager.ContentPage", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/pages/43/", + "html_url": "http://sites-faciles.beta.numerique.gouv.fr/exemples/exemples-de-cartes/", + "slug": "exemples-de-cartes", + "show_in_menus": true, + "first_published_at": "2024-09-16T17:25:06.220370+02:00", + "alias_of": null, + "locale": "fr" + }, + "title": "Cartes", + "body": [ + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "", + "content": [ + { + "type": "text", + "value": "

Cartes simples ins\u00e9r\u00e9es dans une grille d'\u00e9l\u00e9ments

" + }, + { + "type": "item_grid", + "value": { + "column_width": "4", + "items": [ + { + "type": "card", + "value": { + "title": "Carte verticale simple", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "image": null, + "image_ratio": "", + "image_badge": [], + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "", + "top_detail_badges_tags": [], + "bottom_detail_text": "", + "bottom_detail_icon": "", + "call_to_action": [], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + }, + { + "type": "card", + "value": { + "title": "Carte verticale simple", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "image": null, + "image_ratio": "", + "image_badge": [], + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "", + "top_detail_badges_tags": [], + "bottom_detail_text": "", + "bottom_detail_icon": "", + "call_to_action": [], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + }, + { + "type": "card", + "value": { + "title": "Carte verticale simple", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "image": null, + "image_ratio": "", + "image_badge": [], + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "", + "top_detail_badges_tags": [], + "bottom_detail_text": "", + "bottom_detail_icon": "", + "call_to_action": [], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + } + ] + } + } + ] + } + }, + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "grey", + "content": [ + { + "type": "text", + "value": "

Cartes verticales \u00e9labor\u00e9es ins\u00e9r\u00e9es dans une grille d'\u00e9l\u00e9ments

" + }, + { + "type": "item_grid", + "value": { + "column_width": "6", + "items": [ + { + "type": "card", + "value": { + "title": "Carte avec d\u00e9tail du haut et lien", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "image": 84, + "image_ratio": "fr-ratio-4x3", + "image_badge": [], + "link": { + "page": 43, + "document": null, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "D\u00e9tail du haut avec ic\u00f4ne", + "top_detail_icon": "fr-icon-quote-line", + "top_detail_badges_tags": [], + "bottom_detail_text": "", + "bottom_detail_icon": "", + "call_to_action": [], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + }, + { + "type": "card", + "value": { + "title": "Carte avec d\u00e9tail du bas et document \u00e0 t\u00e9l\u00e9charger", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "image": 84, + "image_ratio": "fr-ratio-4x3", + "image_badge": [], + "link": { + "page": null, + "document": 1, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "fr-icon-quote-line", + "top_detail_badges_tags": [], + "bottom_detail_text": "D\u00e9tail du bas avec ic\u00f4ne", + "bottom_detail_icon": "fr-icon-attachment-line", + "call_to_action": [], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + }, + { + "type": "card", + "value": { + "title": "Carte avec badge et bouton", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "image": 84, + "image_ratio": "fr-ratio-4x3", + "image_badge": [ + { + "type": "badge", + "value": { + "text": "Badge info", + "color": "info", + "hide_icon": false + } + } + ], + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "fr-icon-quote-line", + "top_detail_badges_tags": [], + "bottom_detail_text": "", + "bottom_detail_icon": "fr-icon-attachment-line", + "call_to_action": [ + { + "type": "buttons", + "value": [ + { + "type": "button", + "value": { + "page": 43, + "document": null, + "external_url": "", + "text": "Bouton d'appel \u00e0 action", + "button_type": "fr-btn fr-btn--secondary", + "icon_class": "", + "icon_side": "" + } + } + ] + } + ], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + }, + { + "type": "card", + "value": { + "title": "Carte avec des tags et des liens", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "image": 84, + "image_ratio": "fr-ratio-4x3", + "image_badge": [], + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "fr-icon-quote-line", + "top_detail_badges_tags": [ + { + "type": "tags", + "value": [ + { + "type": "tag", + "value": { + "label": "Tag 1", + "is_small": false, + "color": "green-tilleul-verveine", + "icon_class": "", + "link": { + "page": 43, + "document": null, + "external_url": "" + } + } + }, + { + "type": "tag", + "value": { + "label": "Tag 2", + "is_small": false, + "color": "green-bourgeon", + "icon_class": "", + "link": { + "page": 43, + "document": null, + "external_url": "" + } + } + } + ] + } + ], + "bottom_detail_text": "", + "bottom_detail_icon": "fr-icon-attachment-line", + "call_to_action": [ + { + "type": "links", + "value": [ + { + "type": "link", + "value": { + "page": 43, + "document": null, + "external_url": "", + "text": "Lien 1" + } + }, + { + "type": "link", + "value": { + "page": 43, + "document": null, + "external_url": "", + "text": "Lien 2" + } + } + ] + } + ], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + } + ] + } + } + ] + } + }, + { + "type": "fullwidthbackground", + "value": { + "bg_image": null, + "bg_color_class": "blue-france", + "content": [ + { + "type": "text", + "value": "

Cartes horizontales, sur fond pleine largeur

" + }, + { + "type": "card", + "value": { + "title": "Carte horizontale simple", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "image": null, + "image_ratio": "", + "image_badge": [], + "link": { + "page": null, + "document": null, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "", + "top_detail_badges_tags": [], + "bottom_detail_text": "", + "bottom_detail_icon": "", + "call_to_action": [], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + }, + { + "type": "card", + "value": { + "title": "Carte horizontale sans image avec un document \u00e0 t\u00e9l\u00e9charger et un tag", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "image": null, + "image_ratio": "", + "image_badge": [], + "link": { + "page": null, + "document": 1, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "", + "top_detail_badges_tags": [ + { + "type": "tags", + "value": [ + { + "type": "tag", + "value": { + "label": "Tag 1", + "is_small": false, + "color": "green-tilleul-verveine", + "icon_class": "", + "link": { + "page": null, + "document": null, + "external_url": "" + } + } + } + ] + } + ], + "bottom_detail_text": "", + "bottom_detail_icon": "", + "call_to_action": [], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + }, + { + "type": "card", + "value": { + "title": "Carte horizontale avec image, un lien de t\u00e9l\u00e9chargement et un badge", + "heading_tag": "h3", + "description": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

", + "image": 81, + "image_ratio": "fr-card--horizontal-tier", + "image_badge": [ + { + "type": "badge", + "value": { + "text": "Badge \"Succ\u00e8s\"", + "color": "success", + "hide_icon": false + } + } + ], + "link": { + "page": null, + "document": 1, + "external_url": "" + }, + "url": "", + "document": null, + "top_detail_text": "", + "top_detail_icon": "", + "top_detail_badges_tags": [], + "bottom_detail_text": "", + "bottom_detail_icon": "", + "call_to_action": [], + "grey_background": false, + "no_background": false, + "no_border": false, + "shadow": false + } + } + ] + } + } + ], + "header_image": null, + "header_image_render": null, + "header_image_thumbnail": null, + "header_with_title": false, + "header_color_class": null, + "header_large": false, + "header_darken": false, + "header_cta_text": "", + "header_cta_buttons": [], + "header_cta_label": null, + "header_cta_link": null + }, + "44": { + "id": 44, + "meta": { + "type": "content_manager.ContentPage", + "detail_url": "https://sites-faciles.beta.numerique.gouv.fr/api/v2/pages/44/", + "html_url": "http://sites-faciles.beta.numerique.gouv.fr/exemples/etapiers/", + "slug": "etapiers", + "show_in_menus": true, + "first_published_at": "2024-09-16T17:20:49.058230+02:00", + "alias_of": null, + "locale": "fr" + }, + "title": "Etapiers", + "body": [ + { + "type": "paragraph", + "value": "

Les \u00e9tapiers servent \u00e0 illustrer des processus. Vous pouvez choisir le nombre d'\u00e9tapes, et indiquer l'\u00e9tape actuelle.

" + }, + { + "type": "stepper", + "value": { + "title": "Titre", + "total": 4, + "current": 3, + "steps": [ + { + "type": "step", + "value": { + "title": "Etape 1", + "detail": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." + } + }, + { + "type": "step", + "value": { + "title": "Etape 2", + "detail": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." + } + }, + { + "type": "step", + "value": { + "title": "Etape 3", + "detail": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." + } + }, + { + "type": "step", + "value": { + "title": "Etape 4", + "detail": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." + } + } + ] + } + } + ], + "header_image": null, + "header_image_render": null, + "header_image_thumbnail": null, + "header_with_title": false, + "header_color_class": null, + "header_large": false, + "header_darken": false, + "header_cta_text": "", + "header_cta_buttons": [], + "header_cta_label": null, + "header_cta_link": null + } + } +} \ No newline at end of file diff --git a/content_manager/services/__init__.py b/content_manager/services/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/content_manager/services/accessors.py b/content_manager/services/accessors.py new file mode 100644 index 00000000..c473287c --- /dev/null +++ b/content_manager/services/accessors.py @@ -0,0 +1,115 @@ +import sys + +from django.core.management.color import color_style +from wagtail.models import Collection, PageViewRestriction, Site +from wagtailmenus.models.menuitems import MainMenuItem +from wagtailmenus.models.menus import FlatMenu, MainMenu + +from content_manager.constants import HEADER_FIELDS +from content_manager.models import ContentPage + +style = color_style() + +""" +Methods to get or create various type of contents. +Moved from utils to avoid circular module dependencies. +""" + + +def get_or_create_collection(col_name: str) -> Collection: + qs = Collection.objects.filter(name=col_name) + if qs.count(): + return qs.first() + else: + root_coll = Collection.get_first_root_node() + result = root_coll.add_child(name=col_name) + return result + + +def get_or_create_content_page( + slug: str, + title: str, + body: list, + parent_page: ContentPage | None = None, + restriction_type: str | None = None, + page_fields: dict | None = None, +) -> ContentPage: + """ + Get a ContentPage, or creates it if it exists. + """ + + # If parent_page is not passed as parameter, use the Home page of the default site. + if not parent_page: + site = Site.objects.filter(is_default_site=True).first() + parent_page = site.root_page + + # Don't replace or duplicate an already existing page + already_exists = ContentPage.objects.filter(slug=slug).first() + if already_exists: + sys.stdout.write(f"The {slug} page seem to already exist with id {already_exists.id}") + return already_exists + + new_page = parent_page.add_child( + instance=ContentPage( + title=title, + body=body, + slug=slug, + show_in_menus=True, + ) + ) + + if page_fields and len(page_fields): + for k, v in page_fields.items(): + if k in HEADER_FIELDS: + setattr(new_page, k, v) + new_page.save() + + if restriction_type: + PageViewRestriction.objects.create(page=new_page, restriction_type=restriction_type) + + sys.stdout.write(style.SUCCESS(f"Page {slug} created with id {new_page.id}")) + + return new_page + + +def get_or_create_footer_menu() -> FlatMenu: + """ + Get the footer menu or create it if it doesn't already exist + + In any case, return it. + """ + + default_site = Site.objects.filter(is_default_site=True).first() + footer_menu = FlatMenu.objects.filter(handle="footer", site=default_site).first() + + if not footer_menu: + footer_menu = FlatMenu.objects.create(title="Pied de page", handle="footer", site=default_site) + + return footer_menu + + +def get_or_create_main_menu() -> MainMenu: + """ + Get the main menu or create it if it doesn't already exist + + In any case, return it. + """ + + default_site = Site.objects.filter(is_default_site=True).first() + main_menu = MainMenu.objects.filter(site=default_site).first() + + if not main_menu: + main_menu = MainMenu.objects.create(site=default_site, max_levels=2) + + # Init the main menu with the home page + home_page = default_site.root_page + + menu_item = { + "sort_order": 0, + "link_page": home_page, + "link_text": "Accueil", + "menu": main_menu, + } + MainMenuItem.objects.create(**menu_item) + + return main_menu diff --git a/content_manager/services/import_export.py b/content_manager/services/import_export.py new file mode 100644 index 00000000..b94c7021 --- /dev/null +++ b/content_manager/services/import_export.py @@ -0,0 +1,299 @@ +import copy +import json +import os +from io import BytesIO +from urllib.request import urlretrieve + +import requests +from django.conf import settings +from django.contrib.auth import get_user_model +from django.core.files.images import ImageFile +from django.utils import timezone +from wagtail.images.models import Image +from wagtail.utils.file import hash_filelike + +from content_manager.constants import HEADER_FIELDS +from content_manager.models import ContentPage +from content_manager.services.accessors import get_or_create_collection, get_or_create_content_page + +PAGE_TEMPLATES_ROOT = settings.BASE_DIR / "content_manager/page_templates" +TEMPLATES_DATA_FILE = PAGE_TEMPLATES_ROOT / "pages_data.json" +IMAGES_FOLDER = PAGE_TEMPLATES_ROOT / "img" +IMAGES_DATA_FILE = PAGE_TEMPLATES_ROOT / "image_data.json" + +User = get_user_model() + + +class ExportPage: + """ + Generic class for export of a ContentPage from a wagtail instance + """ + + def __init__(self, source_page_id, source_site) -> None: + self.source_site = source_site + self.source_page_id = source_page_id + self.source_content = self.get_content_from_source_page() + self.source_body = self.source_content["body"] + self.user = User.objects.filter(is_superuser=True).first() + + self.content = copy.deepcopy(self.source_content) + self.content["body"] = remove_block_ids(self.source_body) + self.content.pop("tags", None) + self.clear_meta_keys() + + self.images = {} + self.image_ids = [] + self.get_source_images() + + @property + def json_export(self) -> dict: + return self.content + + @property + def source_page_api_url(self): + return f"{self.source_site}api/v2/pages/{self.source_page_id}/" + + def get_content_from_source_page(self): + response = requests.get(self.source_page_api_url) + return response.json() + + def get_source_images(self) -> None: + """ + Get a list of images present in the source content. + """ + + # Header image + header_image = self.source_content.get("header_image", None) + if header_image: + header_image["local_image"] = None + self.image_ids.append(header_image["id"]) + + # Images from the body + self.locate_image_ids(self.source_body) + self.image_ids = list(set(self.image_ids)) + + def locate_image_ids(self, json_object): + if isinstance(json_object, dict) and json_object: + for key, value in json_object.items(): + if key in ["image", "bg_image"] and value: + self.image_ids.append(value) + else: + self.locate_image_ids(value) + + elif isinstance(json_object, list) and json_object: + for item in json_object: + self.locate_image_ids(item) + + def clear_meta_keys(self): + keys = ["parent", "seo_title", "search_description"] + for key in keys: + self.content["meta"].pop(key, None) + + +class ImportPages: + """ + Generic class for import of a list of ContentPages from a previously made export + """ + + def __init__(self) -> None: + with open(TEMPLATES_DATA_FILE, "r") as json_file: + page_templates_data = json.load(json_file) + + self.pages = page_templates_data["pages"] + self.image_ids = page_templates_data["image_ids"] + + self.image_importer = ImportExportImages(self.image_ids) + self.page_templates_index = None + + def get_or_create_page_templates_index(self) -> ContentPage: + body = [("subpageslist", None)] + return get_or_create_content_page( + slug="page_templates_index", title="Modùles de pages", body=body, restriction_type="login" + ) + + def import_pages(self): + self.image_importer.import_images() + self.page_templates_index = self.get_or_create_page_templates_index() + + for page_id in self.pages.keys(): + self.update_image_ids(page_id) + + raw_page = self.pages[page_id] + source_url = raw_page["meta"]["html_url"] + + page_exists = ContentPage.objects.filter(source_url=source_url).first() + if page_exists: + self.update_page(page_id, page_exists) + else: + self.import_page(page_id) + + def import_page(self, page_id: str) -> ContentPage: + raw_page = self.pages[page_id] + source_url = raw_page["meta"]["html_url"] + + page_dict = { + "slug": raw_page["meta"]["slug"], + "title": raw_page["title"], + "body": raw_page["body"], + "restriction_type": "login", + "parent_page": self.page_templates_index, + } + + page_fields = {"source_url": source_url} + + for field in HEADER_FIELDS: + if raw_page[field]: + page_fields[field] = raw_page[field] + + page_dict["page_fields"] = page_fields + return get_or_create_content_page(**page_dict) + + def update_page(self, page_id, page): + raw_page = self.pages[page_id] + page.slug = raw_page["meta"]["slug"] + page.title = raw_page["title"] + page.body = raw_page["body"] + + for field in HEADER_FIELDS: + if raw_page[field]: + setattr(page, field, raw_page[field]) + + page.save() + return page + + def update_image_ids(self, page_id): + page = self.pages[page_id] + + if page["header_image"]: + source_image_id = str(page["header_image"]["id"]) + local_image_id = self.image_importer.image_data[source_image_id]["local_id"] + + # We need to replace the dictionary with the image itself + page["header_image"] = Image.objects.get(pk=local_image_id) + + page["body"] = update_streamfield_image_ids(page["body"], self.image_importer.image_data) + + +class ImportExportImages: + """ + Generic class for import/export of a list of Images from a wagtail instance + """ + + def __init__(self, image_ids, source_site=None) -> None: + self.user = User.objects.filter(is_superuser=True).first() + + self.image_ids = set(image_ids) + self.source_site = source_site + + # Create the folder for the files if it doesn't exist + os.makedirs(IMAGES_FOLDER, exist_ok=True) + + # Create the collection if it doesn't exit + self.collection = get_or_create_collection("Images des modùles de page") + + self.image_data = self.get_image_data() + + def get_image_data(self) -> dict: + if os.path.isfile(IMAGES_DATA_FILE): + with open(IMAGES_DATA_FILE, "r") as json_file: + image_data = json.load(json_file) + else: + image_data = {} + + return image_data + + def source_image_api_url(self, image_id: int) -> str: + return f"{self.source_site}api/v2/images/{image_id}/" + + def get_content_from_source_image(self, image_id: int) -> dict: + response = requests.get(self.source_image_api_url(image_id)) + return response.json() + + def download_images(self) -> None: + for i in self.image_ids: + i = str(i) + image = self.get_content_from_source_image(i) + + if i not in self.image_data: + self.image_data[i] = {} + self.image_data[i]["meta"] = image["meta"] + self.image_data[i]["title"] = image["title"] + + image_url = image["meta"]["download_url"] + image_name = image_url.split("?")[0].split("/")[-1] + + # No need to export the pictograms, as they should already be present + if "Pictogrammes_DSFR" in image_name: + pictogram_title = image_name.replace("__", " — ").replace("_", " ") + self.image_data[i]["filename"] = pictogram_title + self.image_data[i]["is_pictogram"] = True + + else: + urlretrieve(image_url, IMAGES_FOLDER / image_name) + self.image_data[i]["filename"] = image_name + self.image_data[i]["is_pictogram"] = False + + with open(IMAGES_DATA_FILE, "w") as json_file: + json.dump(self.image_data, json_file, indent=2) + + def import_images(self) -> None: + for i in self.image_ids: + i = str(i) + image_data = self.image_data[i] + filename = image_data["filename"] + + if image_data["is_pictogram"]: + pictogram = Image.objects.filter(title=filename).first() + image_data["local_id"] = pictogram.id + else: + image = self.get_or_create_image(image_data) + image_data["local_id"] = image.id + + def get_or_create_image(self, image_data) -> Image: + filename = image_data["filename"] + imported_filename = f"template_image_{filename.lower()}" + title = image_data["title"] + + with open(IMAGES_FOLDER / filename, "rb") as image_file: + file_hash = hash_filelike(image_file) + + image = Image.objects.filter(file_hash=file_hash).first() + if not image: + image = Image( + file=ImageFile(BytesIO(image_file.read()), name=imported_filename), + title=title, + uploaded_by_user=self.user, + collection=self.collection, + created_at=timezone.now(), + ) + image.save() + image.get_file_hash() + + return image + + +def remove_block_ids(json_object): + """ + Parse a page JSON StreamField representation and strip the block IDs + """ + if not isinstance(json_object, (dict, list)): + return json_object + if isinstance(json_object, list): + return [remove_block_ids(v) for v in json_object] + return {k: remove_block_ids(v) for k, v in json_object.items() if k != "id"} + + +def update_streamfield_image_ids(json_object, image_ids): + """ + Parse a page JSON StreamField representation and update the image IDs + """ + if isinstance(json_object, dict): + for k, v in json_object.items(): + v_str = str(v) + if k in ["image", "bg_image"] and v_str in image_ids: + json_object[k] = image_ids[v_str]["local_id"] + else: + update_streamfield_image_ids(v, image_ids) + elif isinstance(json_object, list): + return [update_streamfield_image_ids(v, image_ids) for v in json_object] + return json_object diff --git a/content_manager/tests/test_services_accessors.py b/content_manager/tests/test_services_accessors.py new file mode 100644 index 00000000..84bc4c7f --- /dev/null +++ b/content_manager/tests/test_services_accessors.py @@ -0,0 +1,94 @@ +from wagtail.models import Collection, PageViewRestriction +from wagtail.test.utils import WagtailPageTestCase +from wagtailmenus.models.menus import FlatMenu + +from content_manager.services.accessors import ( + get_or_create_collection, + get_or_create_content_page, + get_or_create_footer_menu, +) +from content_manager.utils import import_image + + +class FooterMenuAccessorTestCase(WagtailPageTestCase): + def test_get_or_create_footer_menu(self): + assert FlatMenu.objects.count() == 0 + + flat_menu = get_or_create_footer_menu() + + assert FlatMenu.objects.count() == 1 + assert flat_menu.handle == "footer" + + +class CollectionAccessorTestCase(WagtailPageTestCase): + def test_get_or_create_collection(self): + assert Collection.objects.count() == 1 + + new_coll = get_or_create_collection("New collection") + + assert Collection.objects.count() == 2 + assert new_coll.name == "New collection" + + duplicate_coll = get_or_create_collection("New collection") + + assert duplicate_coll.pk == new_coll.pk + assert Collection.objects.count() == 2 + + +class ContentPageAccessorTestCase(WagtailPageTestCase): + def setUp(self): + self.sample_body = [("subpageslist", None)] + + def test_get_or_create_content_page_creates_page(self): + example_page = get_or_create_content_page("example_page", title="Pages d’exemple", body=self.sample_body) + + assert example_page.title == "Pages d’exemple" + assert example_page.get_parent().slug == "home" + + def test_get_or_create_content_page_doesnt_overwrite_existing_page(self): + example_page = get_or_create_content_page("new_page", title="New page", body=self.sample_body) + + duplicate_example_page = get_or_create_content_page("new_page", title="Duplicate Page", body=self.sample_body) + + assert example_page.pk == duplicate_example_page.pk + assert example_page.title == duplicate_example_page.title == "New page" + + def test_get_or_create_content_page_with_parent(self): + main_page = get_or_create_content_page("main_page", title="Main page", body=self.sample_body) + + sub_page = get_or_create_content_page( + "sub_page", title="Sub page", body=self.sample_body, parent_page=main_page + ) + + assert sub_page.get_parent().slug == main_page.slug + + def test_get_or_create_private_content_page(self): + private = get_or_create_content_page( + "private", title="Private page", body=self.sample_body, restriction_type="login" + ) + + assert PageViewRestriction.objects.filter(page_id=private.pk).first().restriction_type == "login" + + def test_get_or_create_content_page_with_header_fields(self): + image_file = "static/artwork/technical-error.svg" + image = import_image(image_file, "Sample image") + + header_fields = { + "header_image": image, + "header_color_class": "blue-france", + "header_with_title": True, + "header_large": True, + "header_darken": True, + "header_cta_text": "Call to action", + } + + page_with_header = get_or_create_content_page( + "page_with_header", title="Page with header", body=self.sample_body, page_fields=header_fields + ) + + assert page_with_header.header_image.title == "Sample image" + assert page_with_header.header_color_class == "blue-france" + assert page_with_header.header_with_title is True + assert page_with_header.header_large is True + assert page_with_header.header_darken is True + assert page_with_header.header_cta_text == "Call to action" diff --git a/content_manager/tests/test_utils.py b/content_manager/tests/test_utils.py index ff6bbc45..1c8199d6 100644 --- a/content_manager/tests/test_utils.py +++ b/content_manager/tests/test_utils.py @@ -1,8 +1,7 @@ from wagtail.images.models import Image from wagtail.test.utils import WagtailPageTestCase -from wagtailmenus.models.menus import FlatMenu -from content_manager.utils import get_or_create_footer_menu, import_image +from content_manager.utils import import_image class UtilsTestCase(WagtailPageTestCase): @@ -12,11 +11,3 @@ def test_import_image(self): assert isinstance(image, Image) assert image.title == "Sample image" - - def test_get_or_create_footer_menu(self): - assert FlatMenu.objects.count() == 0 - - flat_menu = get_or_create_footer_menu() - - assert FlatMenu.objects.count() == 1 - assert flat_menu.handle == "footer" diff --git a/content_manager/utils.py b/content_manager/utils.py index f94e23b1..8e6d69ab 100644 --- a/content_manager/utils.py +++ b/content_manager/utils.py @@ -5,9 +5,6 @@ from bs4 import BeautifulSoup from django.core.files.images import ImageFile from wagtail.images.models import Image -from wagtail.models import Collection, Site -from wagtailmenus.models.menuitems import MainMenuItem -from wagtailmenus.models.menus import FlatMenu, MainMenu def import_image(full_path: str, title: str) -> Image: @@ -23,59 +20,6 @@ def import_image(full_path: str, title: str) -> Image: return image -def get_or_create_collection(col_name: str) -> Collection: - qs = Collection.objects.filter(name=col_name) - if qs.count(): - return qs.first() - else: - root_coll = Collection.get_first_root_node() - result = root_coll.add_child(name=col_name) - return result - - -def get_or_create_footer_menu() -> FlatMenu: - """ - Get the footer menu or create it if it doesn't already exist - - In any case, return it. - """ - - default_site = Site.objects.filter(is_default_site=True).first() - footer_menu = FlatMenu.objects.filter(handle="footer", site=default_site).first() - - if not footer_menu: - footer_menu = FlatMenu.objects.create(title="Pied de page", handle="footer", site=default_site) - - return footer_menu - - -def get_or_create_main_menu() -> MainMenu: - """ - Get the main menu or create it if it doesn't already exist - - In any case, return it. - """ - - default_site = Site.objects.filter(is_default_site=True).first() - main_menu = MainMenu.objects.filter(site=default_site).first() - - if not main_menu: - main_menu = MainMenu.objects.create(site=default_site, max_levels=2) - - # Init the main menu with the home page - home_page = default_site.root_page - - menu_item = { - "sort_order": 0, - "link_page": home_page, - "link_text": "Accueil", - "menu": main_menu, - } - MainMenuItem.objects.create(**menu_item) - - return main_menu - - def get_streamblock_raw_text(block) -> str: """ Get the raw text of a streamblock. diff --git a/events/migrations/0009_evententrypage_source_url_eventsindexpage_source_url.py b/events/migrations/0009_evententrypage_source_url_eventsindexpage_source_url.py new file mode 100644 index 00000000..8d30be70 --- /dev/null +++ b/events/migrations/0009_evententrypage_source_url_eventsindexpage_source_url.py @@ -0,0 +1,26 @@ +# Generated by Django 5.1.1 on 2024-09-23 13:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("events", "0008_alter_evententrypage_body_alter_eventsindexpage_body"), + ] + + operations = [ + migrations.AddField( + model_name="evententrypage", + name="source_url", + field=models.URLField( + blank=True, help_text="For imported pages, to allow updates.", null=True, verbose_name="Source URL" + ), + ), + migrations.AddField( + model_name="eventsindexpage", + name="source_url", + field=models.URLField( + blank=True, help_text="For imported pages, to allow updates.", null=True, verbose_name="Source URL" + ), + ), + ] diff --git a/poetry.lock b/poetry.lock index a9c18816..b0f3f966 100644 --- a/poetry.lock +++ b/poetry.lock @@ -69,33 +69,33 @@ lxml = ["lxml"] [[package]] name = "black" -version = "24.8.0" +version = "24.10.0" description = "The uncompromising code formatter." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, - {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, - {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"}, - {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"}, - {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"}, - {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"}, - {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"}, - {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"}, - {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"}, - {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"}, - {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"}, - {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"}, - {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"}, - {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"}, - {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"}, - {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"}, - {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"}, - {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"}, - {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"}, - {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"}, - {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"}, - {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"}, + {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, + {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, + {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"}, + {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"}, + {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"}, + {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"}, + {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"}, + {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"}, + {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"}, + {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"}, + {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"}, + {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"}, + {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"}, + {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"}, + {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"}, + {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"}, + {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"}, + {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"}, + {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"}, + {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"}, + {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"}, + {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"}, ] [package.dependencies] @@ -109,7 +109,7 @@ typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +d = ["aiohttp (>=3.10)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] @@ -131,17 +131,17 @@ webencodings = "*" [[package]] name = "boto3" -version = "1.35.4" +version = "1.35.40" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.35.4-py3-none-any.whl", hash = "sha256:96c39593afb7b55ebb74d08c8e3201041d105b557c8c8536c9054c9f13da5f2a"}, - {file = "boto3-1.35.4.tar.gz", hash = "sha256:d997b82c468bd5c2d5cd29810d47079b66b178d2b5ae021aebe262c4d78d4c94"}, + {file = "boto3-1.35.40-py3-none-any.whl", hash = "sha256:9352f6d61f15c789231a5d608613f03425059072ed862c32e1ed102b17206abf"}, + {file = "boto3-1.35.40.tar.gz", hash = "sha256:33c6a7aeab316f7e0b3ad8552afe95a4a10bfd58519d00741c4d4f3047da8382"}, ] [package.dependencies] -botocore = ">=1.35.4,<1.36.0" +botocore = ">=1.35.40,<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.4" +version = "1.35.40" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.35.4-py3-none-any.whl", hash = "sha256:10195e5ca764745f02b9a51df048b996ddbdc1899a44a2caf35dfb225dfea489"}, - {file = "botocore-1.35.4.tar.gz", hash = "sha256:4cc51a6a486915aedc140f9d027b7e156646b7a0f7b33b1000762c81aff9a12f"}, + {file = "botocore-1.35.40-py3-none-any.whl", hash = "sha256:072cc47f29cb1de4fa77ce6632e4f0480af29b70816973ff415fbaa3f50bd1db"}, + {file = "botocore-1.35.40.tar.gz", hash = "sha256:547e0a983856c7d7aeaa30fca2a283873c57c07366cd806d2d639856341b3c31"}, ] [package.dependencies] @@ -165,17 +165,17 @@ python-dateutil = ">=2.1,<3.0.0" urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} [package.extras] -crt = ["awscrt (==0.21.2)"] +crt = ["awscrt (==0.22.0)"] [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] @@ -191,101 +191,116 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -352,13 +367,13 @@ files = [ [[package]] name = "distlib" -version = "0.3.8" +version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" files = [ - {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, - {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, + {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, + {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, ] [[package]] @@ -391,17 +406,17 @@ static3 = "*" [[package]] name = "django" -version = "5.0.9" +version = "5.1.2" 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.0.9-py3-none-any.whl", hash = "sha256:f219576ba53be4e83f485130a7283f0efde06a9f2e3a7c3c5180327549f078fa"}, - {file = "Django-5.0.9.tar.gz", hash = "sha256:6333870d342329b60174da3a60dbd302e533f3b0bb0971516750e974a99b5a39"}, + {file = "Django-5.1.2-py3-none-any.whl", hash = "sha256:f11aa87ad8d5617171e3f77e1d5d16f004b79a2cf5d2e1d2b97a6a1f8e9ba5ed"}, + {file = "Django-5.1.2.tar.gz", hash = "sha256:bd7376f90c99f96b643722eee676498706c9fd7dc759f55ebfaf2c08ebcdf4f0"}, ] [package.dependencies] -asgiref = ">=3.7.0,<4" +asgiref = ">=3.8.1,<4" sqlparse = ">=0.3.1" tzdata = {version = "*", markers = "sys_platform == \"win32\""} @@ -658,28 +673,28 @@ django = ">=4.2" [[package]] name = "djlint" -version = "1.34.1" +version = "1.35.2" description = "HTML Template Linter and Formatter" optional = false -python-versions = ">=3.8.0,<4.0.0" +python-versions = "<4.0,>=3.8" files = [ - {file = "djlint-1.34.1-py3-none-any.whl", hash = "sha256:96ff1c464fb6f061130ebc88663a2ea524d7ec51f4b56221a2b3f0320a3cfce8"}, - {file = "djlint-1.34.1.tar.gz", hash = "sha256:db93fa008d19eaadb0454edf1704931d14469d48508daba2df9941111f408346"}, + {file = "djlint-1.35.2-py3-none-any.whl", hash = "sha256:4ba995bad378f2afa77c8ea56ba1c14429d9ff26a18e8ae23bc71eedb9152243"}, + {file = "djlint-1.35.2.tar.gz", hash = "sha256:318de9d4b9b0061a111f8f5164ecbacd8215f449dd4bd5a76d2a691c815ee103"}, ] [package.dependencies] -click = ">=8.0.1,<9.0.0" -colorama = ">=0.4.4,<0.5.0" -cssbeautifier = ">=1.14.4,<2.0.0" -html-tag-names = ">=0.1.2,<0.2.0" -html-void-elements = ">=0.1.0,<0.2.0" -jsbeautifier = ">=1.14.4,<2.0.0" -json5 = ">=0.9.11,<0.10.0" -pathspec = ">=0.12.0,<0.13.0" -PyYAML = ">=6.0,<7.0" -regex = ">=2023.0.0,<2024.0.0" -tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""} -tqdm = ">=4.62.2,<5.0.0" +click = ">=8.0.1" +colorama = ">=0.4.4" +cssbeautifier = ">=1.14.4" +html-tag-names = ">=0.1.2" +html-void-elements = ">=0.1.0" +jsbeautifier = ">=1.14.4" +json5 = ">=0.9.11" +pathspec = ">=0.12.0" +PyYAML = ">=6.0" +regex = ">=2023" +tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} +tqdm = ">=4.62.2" [[package]] name = "draftjs-exporter" @@ -733,13 +748,13 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "2.0.1" +version = "2.1.0" description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, ] [package.extras] @@ -761,19 +776,19 @@ python-dateutil = ">=2.4" [[package]] name = "filelock" -version = "3.15.4" +version = "3.16.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, - {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] -typing = ["typing-extensions (>=4.8)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +typing = ["typing-extensions (>=4.12.2)"] [[package]] name = "filetype" @@ -862,13 +877,13 @@ pytz = "*" [[package]] name = "identify" -version = "2.6.0" +version = "2.6.1" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"}, - {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"}, + {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"}, + {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"}, ] [package.extras] @@ -876,24 +891,27 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "ipython" -version = "8.26.0" +version = "8.28.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" files = [ - {file = "ipython-8.26.0-py3-none-any.whl", hash = "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff"}, - {file = "ipython-8.26.0.tar.gz", hash = "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c"}, + {file = "ipython-8.28.0-py3-none-any.whl", hash = "sha256:530ef1e7bb693724d3cdc37287c80b07ad9b25986c007a53aa1857272dac3f35"}, + {file = "ipython-8.28.0.tar.gz", hash = "sha256:0d0d15ca1e01faeb868ef56bc7ee5a0de5bd66885735682e8a322ae289a13d1a"}, ] [package.dependencies] @@ -1036,7 +1054,6 @@ files = [ {file = "libsass-0.22.0-cp37-abi3-macosx_10_15_x86_64.whl", hash = "sha256:081e256ab3c5f3f09c7b8dea3bf3bf5e64a97c6995fd9eea880639b3f93a9f9a"}, {file = "libsass-0.22.0-cp37-abi3-win32.whl", hash = "sha256:89c5ce497fcf3aba1dd1b19aae93b99f68257e5f2026b731b00a872f13324c7f"}, {file = "libsass-0.22.0-cp37-abi3-win_amd64.whl", hash = "sha256:65455a2728b696b62100eb5932604aa13a29f4ac9a305d95773c14aaa7200aaf"}, - {file = "libsass-0.22.0-cp38-abi3-macosx_14_0_arm64.whl", hash = "sha256:5fb2297a4754a6c8e25cfe5c015a3b51a2b6b9021b333f989bb8ce9d60eb5828"}, {file = "libsass-0.22.0.tar.gz", hash = "sha256:3ab5ad18e47db560f4f0c09e3d28cf3bb1a44711257488ac2adad69f4f7f8425"}, ] @@ -1336,19 +1353,19 @@ tests-min = ["defusedxml", "packaging", "pytest"] [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "polib" @@ -1381,13 +1398,13 @@ virtualenv = ">=20.10.0" [[package]] name = "prompt-toolkit" -version = "3.0.47" +version = "3.0.48" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, - {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, ] [package.dependencies] @@ -1565,13 +1582,13 @@ cli = ["click (>=5.0)"] [[package]] name = "pytz" -version = "2024.1" +version = "2024.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, ] [[package]] @@ -1694,104 +1711,105 @@ files = [ [[package]] name = "regex" -version = "2023.12.25" +version = "2024.9.11" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, - {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, - {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, - {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, - {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, - {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, - {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, - {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, - {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, - {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, - {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, - {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, - {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, - {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, - {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, + {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"}, ] [[package]] @@ -1899,13 +1917,13 @@ files = [ [[package]] name = "s3transfer" -version = "0.10.2" +version = "0.10.3" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">=3.8" files = [ - {file = "s3transfer-0.10.2-py3-none-any.whl", hash = "sha256:eca1c20de70a39daee580aef4986996620f365c4e0fda6a86100231d62f1bf69"}, - {file = "s3transfer-0.10.2.tar.gz", hash = "sha256:0711534e9356d3cc692fdde846b4a1e4b0cb6519971860796e6bc4c7aea00ef6"}, + {file = "s3transfer-0.10.3-py3-none-any.whl", hash = "sha256:263ed587a5803c6c708d3ce44dc4dfedaab4c1a32e8329bab818933d79ddcf5d"}, + {file = "s3transfer-0.10.3.tar.gz", hash = "sha256:4f50ed74ab84d474ce614475e0b8d5047ff080810aac5d01ea25231cfc944b0c"}, ] [package.dependencies] @@ -2000,13 +2018,13 @@ docs = ["mkdocs (>=1.1,<1.2)", "mkdocs-material (>=6.2,<6.3)"] [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, + {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, ] [[package]] @@ -2057,13 +2075,13 @@ files = [ [[package]] name = "tzdata" -version = "2024.1" +version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] [[package]] @@ -2079,13 +2097,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -2096,13 +2114,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.26.3" +version = "20.26.6" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, - {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, + {file = "virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2"}, + {file = "virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48"}, ] [package.dependencies] @@ -2116,13 +2134,13 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "wagtail" -version = "6.2.1" +version = "6.2.2" description = "A Django content management system." optional = false python-versions = ">=3.8" files = [ - {file = "wagtail-6.2.1-py3-none-any.whl", hash = "sha256:31d073ea8acdc973ef45c5719977a1bb122ad0fc3f01348f37e922128200b42a"}, - {file = "wagtail-6.2.1.tar.gz", hash = "sha256:0f136ef23b157997a44fa46543a320a31437350951cf13add8ea8b69cc5e8385"}, + {file = "wagtail-6.2.2-py3-none-any.whl", hash = "sha256:d0382603aef5d7e4a46529aa125857774a317c2870c9b6836767932969829429"}, + {file = "wagtail-6.2.2.tar.gz", hash = "sha256:506ac2b59dae85069ae754b45bc13b91cbd86e92d4f5d663658773b0ed7a16b9"}, ] [package.dependencies] @@ -2150,17 +2168,17 @@ testing = ["Jinja2 (>=3.0,<3.2)", "azure-mgmt-cdn (>=12.0,<13.0)", "azure-mgmt-f [[package]] name = "wagtail-localize" -version = "1.9.1" +version = "1.10" description = "Translation plugin for Wagtail CMS" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "wagtail_localize-1.9.1-py3-none-any.whl", hash = "sha256:c895efc286970d2810929056044c11ff0b4ebb7a26b494d052a07c41ead4afab"}, - {file = "wagtail_localize-1.9.1.tar.gz", hash = "sha256:d7b1434e765a004ffd7b5951d151b3817bbbd1ee5c4f11b9485c84e520f383e6"}, + {file = "wagtail_localize-1.10-py3-none-any.whl", hash = "sha256:11746223d5f20d898efff36042f730a3d499135b4a92945db01fc9769c47cb28"}, + {file = "wagtail_localize-1.10.tar.gz", hash = "sha256:ecde7efd366485ea325904efbbae5e50297f094f4b91ca8ac94aec04dd3b0ded"}, ] [package.dependencies] -Django = ">=3.2,<5.1" +Django = ">=4.2,<6.0" polib = ">=1.1,<2.0" typing_extensions = ">=4.0" Wagtail = ">=5.2"