Skip to content

Commit bec2f35

Browse files
Suppression de l'iframe de l'assistant + conservation de la géolocalisation + pas mal de petites choses (#1587)
* Missing settings import * Keep location when browsing assistant * wip * Test session storage * e2e tests * e2e tests * WIP * Replace stimulus debug trigger
1 parent cc4e2c9 commit bec2f35

File tree

113 files changed

+63577
-9040
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

113 files changed

+63577
-9040
lines changed

.github/workflows/ci.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,15 @@ jobs:
4141
- name: Install the project dependencies
4242
run: poetry sync --with dev,airflow --no-root
4343
- name: Run unit tests
44-
run: poetry run pytest unit_tests
44+
run: make unit-test
4545
- name: Run integration tests
46-
run: poetry run pytest integration_tests
46+
run: make integration-test
4747
- name: Run data tests
4848
run: poetry run pytest dags/tests
4949
# - name: Run data e2e tests
5050
# run: poetry run pytest dags/e2e_tests
5151
- name: Check code formatting
52-
run: poetry run black --check --diff .
52+
run: make check-format
5353
- uses: astral-sh/ruff-action@eaf0ecdd668ceea36159ff9d91882c9795d89b49 # v3.4.0
5454
- name: Check for missing migrations
5555
run: poetry run python manage.py makemigrations --check --no-input --settings=core.test_settings
@@ -137,19 +137,19 @@ jobs:
137137

138138
- name: Migrate database
139139
run: |
140-
poetry run python manage.py createcachetable
141-
poetry run python manage.py migrate
140+
make createcachetable
141+
make migrate
142142
143143
- name: Populate database
144144
run: |
145-
poetry run python manage.py loaddata actions acteur_services acteur_types categories objets produits synonymes
145+
make seed-database
146146
147-
- name: Run serveur
147+
- name: Run server
148148
run: |
149149
poetry run python manage.py runserver &
150150
151151
- name: Install Playwright Browsers
152-
run: npx playwright install --with-deps
152+
run: make init-playwright
153153

154154
- name: Run Playwright tests
155155
run: npx playwright test --reporter=list --update-snapshots --shard=${{ matrix.shard }}

.secrets.baseline

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,6 @@
9090
{
9191
"path": "detect_secrets.filters.allowlist.is_line_allowlisted"
9292
},
93-
{
94-
"path": "detect_secrets.filters.common.is_baseline_file",
95-
"filename": ".secrets.baseline"
96-
},
9793
{
9894
"path": "detect_secrets.filters.common.is_ignored_due_to_verification_policies",
9995
"min_level": 2
@@ -142,7 +138,7 @@
142138
"filename": "core/settings.py",
143139
"hashed_secret": "1ee34e26aeaf89c64ecc2c85efe6a961b75a50e9",
144140
"is_verified": false,
145-
"line_number": 281
141+
"line_number": 287
146142
}
147143
],
148144
"dbt/package-lock.yml": [
@@ -178,7 +174,7 @@
178174
"filename": "jinja2/layout/base.html",
179175
"hashed_secret": "057dece35d736a3ae1e710a9cba3f080bd101cde",
180176
"is_verified": false,
181-
"line_number": 65
177+
"line_number": 74
182178
}
183179
],
184180
"unit_tests/qfdmo/test_views.py": [
@@ -191,5 +187,5 @@
191187
}
192188
]
193189
},
194-
"generated_at": "2025-05-26T06:08:00Z"
190+
"generated_at": "2025-06-10T10:12:31Z"
195191
}

Makefile

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ HONCHO := poetry run honcho
1212
DB_URL := postgres://qfdmo:qfdmo@localhost:6543/qfdmo# pragma: allowlist secret
1313
ASSISTANT_URL := quefairedemesdechets.ademe.local
1414
LVAO_URL := lvao.ademe.local
15+
FIXTURES_OPTIONS := --indent 4 --natural-foreign --natural-primary
1516

1617
# Makefile config
1718
.PHONY: check
@@ -24,6 +25,9 @@ check:
2425
init-certs:
2526
docker run -ti -v ./nginx-local-only/certs:/app/certs -w /app/certs --rm alpine/mkcert $(LVAO_URL) $(ASSISTANT_URL)
2627

28+
.PHONY: init-playwright
29+
init-playwright:
30+
npx playwright install --with-deps
2731

2832
.PHONY: init-dev
2933
init-dev:
@@ -36,21 +40,25 @@ init-dev:
3640
make init-certs
3741
# javascript
3842
npm install
39-
npx playwright install --with-deps
43+
make init-playwright
4044
# environment
4145
cp .env.template .env
4246
cp ./dags/.env.template ./dags/.env
4347
# prepare django
4448
make migrate
4549
make createcachetable
4650
make createsuperuser
51+
make seed-database
52+
53+
.PHONY: check-format
54+
check-format:
55+
poetry run black --check --diff .
4756

4857
.PHONY: fix
4958
fix:
5059
poetry run ruff check . --fix
5160
poetry run black --exclude=.venv .
5261

53-
5462
# Run development servers
5563
.PHONY: run-airflow
5664
run-airflow:
@@ -68,6 +76,10 @@ run-all:
6876
migrate:
6977
$(DJANGO_ADMIN) migrate
7078

79+
.PHONY: shell
80+
shell:
81+
$(DJANGO_ADMIN) shell
82+
7183
.PHONY: makemigrations
7284
makemigrations:
7385
$(DJANGO_ADMIN) makemigrations
@@ -87,7 +99,26 @@ createsuperuser:
8799

88100
.PHONY: seed-database
89101
seed-database:
90-
$(DJANGO_ADMIN) loaddata categories actions acteur_services acteur_types acteurs objets
102+
$(DJANGO_ADMIN) loaddata categories labels sources actions produits acteur_services acteur_types objets synonymes suggestions
103+
$(DJANGO_ADMIN) loadacteurs acteurs propositions_services
104+
105+
.PHONY: generate-fixtures-acteurs
106+
generate-fixtures-acteurs:
107+
$(DJANGO_ADMIN) dumpdata qfdmo.displayedacteur $(FIXTURES_OPTIONS) --pk "65791ef2-bb37-4569-b011-8cece03dcdcf","antiquites_du_poulbenn_152575_reparation","refashion_TLC-REFASHION-PAV-3445001","communautelvao_VBOFDJDBOCTW","refashion_TLC-REFASHION-REP-603665791852778329","ocad3e_SGS-02069" -o qfdmo/fixtures/acteurs.json # pragma: allowlist secret
108+
$(DJANGO_ADMIN) dumpdata qfdmo.displayedpropositionservice $(FIXTURES_OPTIONS) --pk 2163243,2163244,2163245,243160,435885,1699381,738371,738372,719100 -o qfdmo/fixtures/propositions_services.json
109+
110+
.PHONY: generate-fixtures
111+
generate-fixtures:
112+
$(DJANGO_ADMIN) dumpdata qfdmo.objet $(FIXTURES_OPTIONS) -o qfdmo/fixtures/objets.json
113+
$(DJANGO_ADMIN) dumpdata qfdmo.categorieobjet qfdmo.souscategorieobjet $(FIXTURES_OPTIONS) -o qfdmo/fixtures/categories.json
114+
$(DJANGO_ADMIN) dumpdata qfdmo.actiondirection qfdmo.groupeaction qfdmo.action $(FIXTURES_OPTIONS) -o qfdmo/fixtures/actions.json
115+
$(DJANGO_ADMIN) dumpdata qfdmo.acteurtype $(FIXTURES_OPTIONS) -o qfdmo/fixtures/acteur_types.json
116+
$(DJANGO_ADMIN) dumpdata qfdmo.acteurservice $(FIXTURES_OPTIONS) -o qfdmo/fixtures/acteur_services.json
117+
$(DJANGO_ADMIN) dumpdata qfdmo.labelqualite $(FIXTURES_OPTIONS) -o qfdmo/fixtures/labels.json
118+
$(DJANGO_ADMIN) dumpdata qfdmo.source $(FIXTURES_OPTIONS) -o qfdmo/fixtures/sources.json
119+
$(DJANGO_ADMIN) dumpdata qfdmd.synonyme $(FIXTURES_OPTIONS) -o qfdmd/fixtures/synonymes.json
120+
$(DJANGO_ADMIN) dumpdata qfdmd.produit $(FIXTURES_OPTIONS) -o qfdmd/fixtures/produits.json
121+
$(DJANGO_ADMIN) dumpdata qfdmd.suggestion $(FIXTURES_OPTIONS) -o qfdmd/fixtures/suggestions.json
91122

92123
.PHONY: clear-cache
93124
clear-cache:
@@ -102,10 +133,18 @@ npm-upgrade:
102133
unit-test:
103134
$(PYTEST) ./unit_tests
104135

136+
.PHONY: integration-test
137+
integration-test:
138+
$(PYTEST) ./integration_tests
139+
140+
141+
.PHONY: test-dags
142+
test-dags:
143+
$(PYTEST) ./dags/tests
144+
105145
.PHONY: e2e-test
106146
e2e-test:
107-
npx playwright test --update-snapshots --ui
108-
$(PYTEST) ./integration_tests
147+
npx playwright test --update-snapshots
109148

110149
.PHONY: a11y
111150
a11y:
@@ -119,6 +158,8 @@ js-test:
119158
test:
120159
@make unit-test
121160
@make e2e-test
161+
@make integration-test
162+
@make test-dags
122163

123164
# DSFR
124165
.PHONY: extract-dsfr
@@ -151,13 +192,20 @@ load-production-dump:
151192

152193
.PHONY: db-restore
153194
db-restore:
195+
make dump-production
154196
make drop-schema-public
155197
make create-schema-public
156-
make dump-production
157198
make load-production-dump
158199
make migrate
159200

201+
.PHONY: db-restore-for-tests
202+
db-restore-for-tests:
203+
make drop-schema-public
204+
make create-schema-public
205+
make migrate
206+
make seed-database
207+
160208
# Docs
161209
.PHONY: build-docs
162210
build-docs:
163-
poetry run sphinx-build -b html -c docs docs _build
211+
poetry run sphinx-build -b html -c docs docs _build

core/constants.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
"partage": {
1616
"titre": "{NOM} : L’ADEME partage ses bonnes adresses",
1717
"corps": "J’ai trouvé une bonne adresse {NOM} grâce à l’ADEME : {URL}",
18-
}
18+
},
19+
"ajouter_un_lieu": "Ajouter un lieu sur la carte",
20+
"nouvelle_recherche_dans_cette_zone": "Nouvelle recherche dans cette zone",
1921
}
2022

2123
ASSISTANT = {
@@ -43,4 +45,5 @@
4345
"lien": "https://www.ecologie.gouv.fr/info-tri",
4446
"texte_du_lien": "En savoir plus sur l’Info-tri",
4547
},
48+
"nouvelle_recherche": "Nouvelle recherche",
4649
}

core/context_processors.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
from django.urls import reverse
33

44
from qfdmd.forms import SearchForm
5-
from qfdmd.models import CMSPage
65
from qfdmd.views import SEARCH_VIEW_TEMPLATE_NAME, generate_iframe_script
76

87
from . import constants
@@ -42,7 +41,6 @@ def global_context(request) -> dict:
4241

4342
return {
4443
**base,
45-
"footer_pages": CMSPage.objects.all(),
4644
"search_form": SearchForm(),
4745
"search_view_template_name": SEARCH_VIEW_TEMPLATE_NAME,
4846
"iframe_script": generate_iframe_script(request),

core/settings.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,12 @@
149149
X_FRAME_OPTIONS = "ALLOWALL"
150150

151151
if DEBUG:
152+
# FIXME: A CSRF error can occur locally when using HTTPS.
153+
# It is not clear yet what causes it, it might be http host headers
154+
# being wrongly set when using nginx. The current workaround impacts
155+
# only local development and can be considered harmless, but this
156+
# might be nice to remove this setting someday.
157+
CSRF_TRUSTED_ORIGINS = [config["BASE_URL"] for config in [ASSISTANT, LVAO]]
152158
INSTALLED_APPS.extend(["debug_toolbar", "django_browser_reload"])
153159
MEDIA_ROOT = "media"
154160
MEDIA_URL = "/media/"
@@ -441,6 +447,7 @@ def context_processors():
441447

442448
# Wagtail settings
443449
# ----------------
450+
SILENCED_SYSTEM_CHECKS = ["wagtailadmin.W002"]
444451
WAGTAIL_SITE_NAME = "Longue vie aux objets"
445452
WAGTAILADMIN_BASE_URL = BASE_URL
446453
INSTALLED_APPS.extend(

core/utils.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
from django.conf import settings
2+
from django.utils.encoding import force_str
3+
from django.utils.functional import Promise
4+
from wagtail.fields import DjangoJSONEncoder
25

36
from qfdmo.models.action import get_directions
47

@@ -9,3 +12,16 @@ def get_direction(request, is_carte=False):
912
if direction not in [d["code"] for d in get_directions()]:
1013
direction = default_direction
1114
return direction
15+
16+
17+
class LazyEncoder(DjangoJSONEncoder):
18+
"""
19+
Force lazy strings to text
20+
21+
Inspired by https://github.com/hiimdoublej/django-json-ld/blob/master/django_json_ld/util.py
22+
"""
23+
24+
def default(self, obj):
25+
if isinstance(obj, Promise):
26+
return force_str(obj)
27+
return super(LazyEncoder, self).default(obj)

docs/tutoriels/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@
44
:hidden:
55
66
prod/mise-en-prod.md
7-
```
7+
generer-des-fixtures.md
8+
```
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# Utiliser les fixtures
2+
3+
Le projet utilise des fixtures Django[^1] pour les tests.
4+
Celles-ci sont basées sur de la donnée issue de la base de production afin de tester l'application sur des situations _de la vraie vie_.
5+
6+
## Générer des fixtures, cas général
7+
8+
Toutes les fixtures à l'exception des `DisplayedActeur` (acteurs affichés) et `DisplayedPropositionService` (proposition de service de ces acteurs) peuvent être générées à partir d'une commande `make` :
9+
10+
```sh
11+
make generate-fixtures
12+
13+
# il est conseillé de conserver dans git les fixtures à jour, et d'embarquer
14+
# ces mises à jour dans les pull request.
15+
git add qfdmo/fixtures qfdmd/fixtures
16+
git commit -m "mise à jour des fixtures"
17+
```
18+
19+
## Générer des fixtures pour les acteurs et propositions de service
20+
21+
Le volume de données de la table des Acteurs étant gigantesque, les fixtures de cette table sont générées manuellement, lorsque le modèle de données évolue et empêche leur installation ou lorsqu'il est nécessaire d'ajouter des données de test pour couvrir plus exhaustivement le contexte d'utilisation réel de l'application.
22+
23+
Pour ce faire, sont listées dans le `Makefile` une liste de `pk` d'acteurs (champ `identifiant_unique`).
24+
Ces identifiants ont été récupérés à la main, depuis le frontend de la carte :
25+
1. Faire une recherche pour la zone souhaitée
26+
2. Récupérer le lien de l'acteur dans la fiche détaillée (en cliquant sur le lien de partage par exemple) --> https://lvao.ademe.fr/adresse_details/3kQK86DEWA3ZrcirdzzBez l'id est 3kQK86DEWA3ZrcirdzzBez
27+
3. Chercher cet id dans l'admin Django : https://lvao.ademe.fr/admin/qfdmo/displayedacteur/?q=eYKxBYDMDoMXTr8iiw69Ek
28+
4. Récupérer le champ `identifiant_unique` : il peut être un uuid ou un assemblage de chaînes de caractères mentionnant la source, par exemple `ocad3e_SGS-02069`
29+
5. Ajouter cet identifiant dans le `Makefile` à la suite des autres, derrière le flag `--pk` dans la commande `generate-fixtures-acteurs`
30+
31+
6. Une fois cela fait, il faut récupérer les _primary key_ des propositions de service associées.
32+
Cela peut-être fait depuis le shell `django` :
33+
```sh
34+
make shell
35+
```
36+
```py
37+
# 1. importer le modèle Django
38+
from qfdmo.models import DisplayedActeur
39+
40+
# 2. Stocker les pks dans une variable. Les pks peuvent être copiées-collées depuis le Makefile
41+
pks = ["uuid-dun-acteur", "identifiant-dun-autre-acteur"]
42+
43+
# 3. Filtrer les acteurs par pks et en récupérer les pks de propositions de services associées
44+
list(DisplayedActeur.objects.filter(pk__in=pks).values_list("proposition_services__pk", flat=True))
45+
46+
# Sortie attendue: [2163243, 2163244, 2163245, 243160, 435885, 1699381, 738371, 738372, 719100]
47+
```
48+
7. Cette liste de `pk` peut alors être collées dans le `Makefile`
49+
8. Les fixtures peuvent être re-générées
50+
```sh
51+
make generate-fixtures-acteurs
52+
53+
# il est conseillé de conserver dans git les fixtures à jour, et d'embarquer
54+
# ces mises à jour dans les pull request.
55+
git add qfdmo/fixtures
56+
git commit -m "mise à jour des fixtures"
57+
```
58+
59+
## Utiliser les fixtures
60+
61+
Les fixtures peuvent être utilisées de plusieurs manières :
62+
- Dans les tests
63+
- En local
64+
- Dans la CI
65+
66+
En local, on utilise généralement une base de production mais il peut être intéressant d'installer les fixtures afin d'avoir un environnement _iso-CI_.
67+
Pour ce faire :
68+
69+
```sh
70+
# ⚠️ Cette commande va supprimer les données locales, elle est donc à executer en conscience
71+
make db-restore-for-tests
72+
```
73+
74+
Dans les tests, les fixtures peuvent être importées en utilisant la fonction `callcommand` de Django :
75+
```py
76+
from django.core.management import call_command
77+
call_command('loaddata', 'synonymes', 'produits')
78+
```
79+
80+
Le nom des fixtures à utiliser est celui du nom du fichier `.json` de la fixture.
81+
Django se charge de découvrir automatiquement la fixture correspondante.
82+
83+
84+
85+
[^1]: [https://docs.djangoproject.com/en/5.2/topics/db/fixtures/](https://docs.djangoproject.com/en/5.2/topics/db/fixtures/)

0 commit comments

Comments
 (0)