Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ajout de pages pré-remplies #56

Merged
merged 8 commits into from
Dec 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ init:
$(EXEC_CMD) poetry run pre-commit install
$(EXEC_CMD) poetry run python manage.py migrate
$(EXEC_CMD) poetry run python manage.py collectstatic --noinput
$(EXEC_CMD) poetry run python manage.py create_sample_pages

.PHONY: runserver
runserver:
Expand Down
5 changes: 5 additions & 0 deletions config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,11 @@
"content_manager",
]

if DEBUG:
INSTALLED_APPS += [
"django_extensions",
]

MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
Expand Down
Empty file.
Empty file.
159 changes: 159 additions & 0 deletions content_manager/management/commands/create_sample_pages.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
from django.core.management.base import BaseCommand
from django.urls import reverse
from wagtail.models import Page, Site
from wagtail.rich_text import RichText
from wagtailmenus.models.menuitems import FlatMenuItem

from content_manager.models import ContentPage
from content_manager.utils import get_or_create_footer_menu, import_image


ALL_ALLOWED_SLUGS = ["home", "mentions-legales", "accessibilite"]


class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument(
"--slug", nargs="+", type=str, help="[Optional] Slug of the page(s) to create", choices=ALL_ALLOWED_SLUGS
)

def handle(self, *args, **kwargs):
slugs = kwargs.get("slug")

if not slugs:
slugs = ALL_ALLOWED_SLUGS

for slug in slugs:
if slug == "home":
self.create_homepage()
elif slug == "mentions-legales":
title = "Mentions légales"
body = [("title", {"title": title, "large": True})]

alert_block = {
"title": title,
"description": """Entrez ici les mentions légales du site.<br />
<a href="https://www.francenum.gouv.fr/guides-et-conseils/developpement-commercial/site-web/quelles-sont-les-mentions-legales-pour-un-site">
Que doivent-elles obligatoirement contenir ?</a>""", # noqa
"level": "info",
}
body.append(("alert", alert_block))

text_raw = """
<p>D’après la <a href="https://www.systeme-de-design.gouv.fr/elements-d-interface/composants/pied-de-page">documentation du système de design</a>,
le pied de page doit contenir a minima les quatre liens suivants :</p>
<ul>
<li>Accessibilité : non/partiellement/totalement conforme</li>
<li>Mentions légales</li>
<li>Données personnelles</li>
<li>Gestion des cookies</li>
</ul>
<p>Ces deux derniers peuvent pointer vers des pages à part entière ou des sections de cette page.</p>
""" # noqa
body.append(("paragraphlarge", RichText(text_raw)))

self.create_page(slug=slug, title=title, body=body)
elif slug == "accessibilite":
title = "Déclaration d’accessibilité"
body = [("title", {"title": title, "large": True})]

alert_block = {
"title": title,
"description": """Entrez ici la déclaration d’accessibilité.<br />
<a href="https://betagouv.github.io/a11y-generateur-declaration/#create">
Générateur de déclaration d’accessibilité</a>""",
"level": "info",
}

body.append(("alert", alert_block))
self.create_page(slug=slug, title=title, body=body, footer_label="Accessibilité : non conforme")
else:
raise ValueError(f"Valeur inconnue : {slug}")

def create_homepage(self) -> None:
"""
Create the homepage, set it as default and delete the sample page
"""
# Don't replace a manually created home
already_exists = ContentPage.objects.filter(slug="home").first()
if already_exists:
raise ValueError(f"The home page seem to already exist with id {already_exists.id}")

# Create the page
body = [("title", {"title": "Votre nouveau site avec le CMS Beta", "large": True})]

image = import_image(
full_path="staticfiles/dsfr/dist/artwork/pictograms/digital/coding.svg",
title="Pictogrammes DSFR — Internet",
)

text_raw = """<p>Bienvenue !</p>

<p>Vous venez de créer un site utilisant le gestionnaire de contenus de l’État.</p>

<p>Vous pouvez maintenant vous connecter dans l’administration et personnaliser le site.</p>
"""

image_and_text_block = {
"image": image,
"image_ratio": "3",
"text": RichText(text_raw),
"link_url": reverse("wagtailadmin_home"),
"link_label": "Gérer le site",
}

body.append(("imageandtext", image_and_text_block))

text_2_raw = """
<p>En particulier, vous devrez :</p>
<ul>
<li>Configurer le site dans Configuration > Configuration du site</li>
<li>Remplacer le contenu de la page de mentions légales</li>
<li>Remplacer le contenu de cette page d’accueil.</li>
</ul>
"""
body.append(("paragraphlarge", RichText(text_2_raw)))

root = Page.objects.get(slug="root")
home_page = root.add_child(instance=ContentPage(title="Accueil", body=body, show_in_menus=True))

# Define it as default for the default site
site = Site.objects.filter(is_default_site=True).first()

site.root_page_id = home_page.id
site.save()

# Delete the original default page and get its slug
original_home = Page.objects.get(slug="home")
original_home.delete()

home_page.slug = "home"
home_page.save()

self.stdout.write(self.style.SUCCESS(f"Homepage created with id {home_page.id}"))

def create_page(self, slug: str, title: str, body: list, footer_label: str = ""):
"""
Creates a page for the site and adds it to the footer
"""

# Don't replace a manually created page
already_exists = ContentPage.objects.filter(slug=slug).first()
if already_exists:
raise ValueError(f"The {slug} page seem to already exist with id {already_exists.id}")

home_page = Site.objects.filter(is_default_site=True).first().root_page
new_page = home_page.add_child(instance=ContentPage(title=title, body=body, slug=slug, show_in_menus=True))

footer_menu = get_or_create_footer_menu()

footer_item = {
"menu": footer_menu,
"link_page": new_page,
}
if footer_label:
footer_item["link_text"] = footer_label

FlatMenuItem.objects.create(**footer_item)

self.stdout.write(self.style.SUCCESS(f"Page {slug} created with id {new_page.id}"))
22 changes: 22 additions & 0 deletions content_manager/tests/test_utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
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


class UtilsTestCase(WagtailPageTestCase):
def test_import_image(self):
image_file = "static/artwork/technical-error.svg"
image = import_image(image_file, "Sample image")

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"
35 changes: 35 additions & 0 deletions content_manager/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from io import BytesIO

from django.core.files.images import ImageFile
from wagtail.images.models import Image
from wagtail.models import Site
from wagtailmenus.models.menus import FlatMenu


def import_image(full_path: str, title: str) -> Image:
"""
Import an image to the Wagtail medias based on its full path and return it.
"""
with open(full_path, "rb") as image_file:
image = Image(
file=ImageFile(BytesIO(image_file.read()), name=title),
title=title,
)
image.save()
return image


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

footer_menu = FlatMenu.objects.filter(handle="footer").first()

if not footer_menu:
default_site = Site.objects.filter(is_default_site=True).first()
footer_menu = FlatMenu.objects.create(title="Pied de page", handle="footer", site=default_site)

return footer_menu
Loading