Skip to content

Commit

Permalink
Ajout des pages légales à l'assistant (#1212)
Browse files Browse the repository at this point in the history
* add legal pages to assistant

* add to footer

* Add to env

* merge migrations

* squash migrations
  • Loading branch information
fabienheureux authored Jan 14, 2025
1 parent 671b082 commit ecaaabb
Show file tree
Hide file tree
Showing 11 changed files with 180 additions and 7 deletions.
1 change: 1 addition & 0 deletions .env.template
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ AWS_S3_REGION_NAME='fr-par'
AWS_SECRET_ACCESS_KEY=
AWS_STORAGE_BUCKET_NAME='qfdmo-interface'
BASE_URL=http://localhost:8000
CMS_BASE_URL=https://longuevieauxobjets.ademe.fr
CARTE_MAX_SOLUTION_DISPLAYED=10
CONN_MAX_AGE=0
CORS_ALLOWED_ORIGINS=http://localhost:8000,http://127.0.0.1:8000
Expand Down
4 changes: 2 additions & 2 deletions .secrets.baseline
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@
"filename": "core/settings.py",
"hashed_secret": "1ee34e26aeaf89c64ecc2c85efe6a961b75a50e9",
"is_verified": false,
"line_number": 217
"line_number": 220
}
],
"docker-compose.yml": [
Expand Down Expand Up @@ -207,5 +207,5 @@
}
]
},
"generated_at": "2025-01-09T06:33:27Z"
"generated_at": "2025-01-14T12:14:14Z"
}
3 changes: 3 additions & 0 deletions core/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
SECRET_KEY = decouple.config("SECRET_KEY")

BASE_URL = decouple.config("BASE_URL", default="http://localhost:8000")
CMS_BASE_URL = decouple.config(
"CMS_BASE_URL", default="https://longuevieauxobjets.ademe.fr"
)

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = decouple.config("DEBUG", default=False, cast=bool)
Expand Down
11 changes: 10 additions & 1 deletion qfdmd/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from import_export import resources
from import_export.admin import ImportExportModelAdmin

from qfdmd.models import Lien, Produit, Suggestion, Synonyme
from qfdmd.models import CMSPage, Lien, Produit, Suggestion, Synonyme


class LienResource(resources.ModelResource):
Expand Down Expand Up @@ -157,3 +157,12 @@ class SynonymeAdmin(
list_display = ("nom", "produit", "slug", "modifie_le")
list_filter = ["pin_on_homepage"]
fields_to_display_in_first_position = ["nom", "produit"]


@admin.register(CMSPage)
class CMSPageAdmin(admin.ModelAdmin):
@property
def readonly_fields(self):
fields = [field.name for field in self.model._meta.get_fields()]
fields.remove("id")
return fields
44 changes: 44 additions & 0 deletions qfdmd/migrations/0029_cmspage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Generated by Django 5.1.4 on 2025-01-14 13:05

from django.db import migrations, models


def import_cms_pages(apps, schema_editor):
CMSPage = apps.get_model("qfdmd", "CMSPage")
ids = [223, 221, 226, 222, 230]
for index, id in enumerate(ids):
page, created = CMSPage.objects.update_or_create(
id=id, defaults={"poids": index}
)
# Ensure the fields are populated
page.save()


class Migration(migrations.Migration):

dependencies = [
("qfdmd", "0028_remove_lien_poids"),
]

operations = [
migrations.CreateModel(
name="CMSPage",
fields=[
(
"id",
models.IntegerField(
help_text="Ce champ est le seul contribuable.<br>Il correspond à l'ID de la page Wagtail.<br>Tous les autres champs seront automatiquement contribués à l'enregistrementde la page dans l'administration Django.",
primary_key=True,
serialize=False,
),
),
("body", models.JSONField(default=dict)),
("search_description", models.CharField(default="")),
("seo_title", models.CharField(default="")),
("title", models.CharField(default="")),
("slug", models.CharField(default="")),
("poids", models.IntegerField(default=0)),
],
),
migrations.RunPython(import_cms_pages, migrations.RunPython.noop),
]
16 changes: 16 additions & 0 deletions qfdmd/migrations/0031_merge_20250114_1728.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Generated by Django 5.1.4 on 2025-01-14 17:28

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
(
"qfdmd",
"0029_alter_produit_filieres_rep_and_more_squashed_0030_alter_produitlien_poids",
),
("qfdmd", "0029_cmspage"),
]

operations = []
55 changes: 55 additions & 0 deletions qfdmd/models.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import logging
from urllib.parse import urlencode

import requests
from django.conf import settings
from django.contrib.gis.db import models
from django.db.models.functions import Now
Expand All @@ -8,6 +10,8 @@
from django.utils.functional import cached_property
from django_extensions.db.fields import AutoSlugField

logger = logging.getLogger(__name__)


class AbstractBaseProduit(models.Model):
modifie_le = models.DateTimeField(auto_now=True, db_default=Now())
Expand Down Expand Up @@ -254,3 +258,54 @@ class Suggestion(models.Model):

def __str__(self) -> str:
return str(self.produit)


class CMSPage(models.Model):
id = models.IntegerField(
primary_key=True,
help_text="Ce champ est le seul contribuable.<br>"
"Il correspond à l'ID de la page Wagtail.<br>"
"Tous les autres champs seront automatiquement contribués à l'enregistrement"
"de la page dans l'administration Django.",
)
body = models.JSONField(default=dict)
search_description = models.CharField(default="")
seo_title = models.CharField(default="")
title = models.CharField(default="")
slug = models.CharField(default="")
poids = models.IntegerField(default=0)

def __str__(self):
return self.title

def save(self, *args, **kwargs):
fields_to_fetch_from_api_response = [
"body",
"title",
]

fields_to_fetch_from_api_response_meta = [
"search_description",
"slug",
"seo_title",
]

try:
wagtail_response = requests.get(
f"{settings.CMS_BASE_URL}/api/v2/pages/{self.id}"
)
wagtail_response.raise_for_status()
wagtail_page_as_json = wagtail_response.json()

for field in fields_to_fetch_from_api_response:
if value := wagtail_page_as_json.get(field):
setattr(self, field, value)

for field in fields_to_fetch_from_api_response_meta:
if value := wagtail_page_as_json["meta"].get(field):
setattr(self, field, value)

except requests.exceptions.RequestException as exception:
logger.error(f"Error fetching data from CMS API: {exception}")

super().save(*args, **kwargs)
7 changes: 4 additions & 3 deletions qfdmd/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from django.urls import path
from django.views.generic import RedirectView

from qfdmd.views import HomeView, SynonymeDetailView, search_view
from qfdmd.views import CMSPageDetailView, HomeView, SynonymeDetailView, search_view


def get_assistant_script(request):
Expand All @@ -13,12 +13,13 @@ def get_assistant_script(request):

urlpatterns = [
path("dechet/", HomeView.as_view(), name="home"),
path("dechet/recherche", search_view, name="search"),
path("dechet/<slug:slug>/", SynonymeDetailView.as_view(), name="synonyme-detail"),
path("assistant/recherche", search_view, name="search"),
path("<slug:slug>/", SynonymeDetailView.as_view(), name="synonyme-detail"),
# The URL here needs to be kept as is because it was used in the previous
# Gatsby website. If changed, a redirect need to be created to keep the
# legacy behaviour.
path("iframe.js", get_assistant_script, name="script"),
path("assistant/<slug:slug>", CMSPageDetailView.as_view(), name="cms-page"),
path(
"assistant-enquete",
RedirectView.as_view(
Expand Down
7 changes: 6 additions & 1 deletion qfdmd/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from django.views.generic import DetailView, ListView

from qfdmd.forms import SearchForm
from qfdmd.models import Suggestion, Synonyme
from qfdmd.models import CMSPage, Suggestion, Synonyme

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -46,6 +46,7 @@ class BaseView:
def get_context_data(self, **kwargs: Any) -> dict[str, Any]:
context = super().get_context_data(**kwargs)
context.update(
footer_pages=CMSPage.objects.all(),
search_form=SearchForm(),
search_view_template_name=SEARCH_VIEW_TEMPLATE_NAME,
iframe_script=generate_iframe_script(self.request),
Expand Down Expand Up @@ -78,3 +79,7 @@ def get_context_data(self, **kwargs: Any) -> dict[str, Any]:

class SynonymeDetailView(BaseView, DetailView):
model = Synonyme


class CMSPageDetailView(BaseView, DetailView):
model = CMSPage
10 changes: 10 additions & 0 deletions templates/components/footer/_dsfr_footer.html
Original file line number Diff line number Diff line change
@@ -1,2 +1,12 @@
{% extends "dsfr/footer.html" %}

{% block footer_links %}
{% for page in footer_pages %}
<li class="fr-footer__bottom-item">
<a class="fr-footer__bottom-link" href="{% url 'qfdmd:cms-page' page.slug %}">
{{ page.title }}
</a>
</li>
{% endfor %}
{% endblock footer_links %}
{% load static %}
29 changes: 29 additions & 0 deletions templates/qfdmd/cmspage_detail.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{% extends "qfdmd/base.html" %}

{% block analytics_action %}produitPageView{% endblock %}

{% block title %}
{{ block.super }} | {{ object.seo_title }}
{% endblock title %}

{% block meta_description %}{{ object.search_description|default:block.super }}{% endblock %}

{% block main %}
<article
class="qf-flex qf-flex-col
qf-gap-4w max-lg:qf-pr-0 max-xl:qf-pr-6w"
>
<header class="qf-mt-3w md:qf-mt-5w">
<h1 class="qf-m-0">
{{ object.title|capfirst }}
</h1>
</header>
<div>

{% for block in object.body %}
{{ block.value|safe }}
{% endfor %}
</div>

</article>
{% endblock main %}

0 comments on commit ecaaabb

Please sign in to comment.