Created
July 7, 2026 14:06
-
-
Save fabienheureux/45b52feae87facea5894f9165a5c6a5c to your computer and use it in GitHub Desktop.
Recreate Articles de sport + Velo ProduitPage on Wagtail preprod
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| Standalone script to recreate ProduitPage instances on Scalingo. | |
| Usage: | |
| scalingo --app <app> run --file scripts/recreate_articles_sport.py \ | |
| python /tmp/uploads/recreate_articles_sport.py --dry-run | |
| The fixture data is embedded in this file, so no separate fixture upload is needed. | |
| """ | |
| import json | |
| import os | |
| import sys | |
| # --- Must be set before importing anything from the project --- | |
| os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.base") | |
| import django | |
| django.setup() | |
| from taggit.models import Tag | |
| from wagtail.models import Page | |
| from qfdmd.models import ProduitPage, SearchTag | |
| from qfdmo.models import SousCategorieObjet | |
| FIXTURE = { | |
| "pages": [ | |
| { | |
| "key": "articles-sport", | |
| "parent_page_lookup": {"id": 79}, | |
| "page_type": "produitpage", | |
| "title": "Articles de sport", | |
| "slug": "articles-sport", | |
| "seo_title": "Que faire de mes produits de beaut\u00e9 et d\u2019hygi\u00e8ne ?", | |
| "search_description": ( | |
| "Avant de les jeter, le premier r\u00e9flexe est de v\u00e9rifier leur " | |
| "\u00e9tat pour savoir s\u2019ils peuvent \u00eatre utilis\u00e9s. Ensuite, " | |
| "une fois bien vid\u00e9s, les emballages se trient." | |
| ), | |
| "live": True, | |
| "show_in_menus": False, | |
| "genre": "m", | |
| "nombre": 2, | |
| "est_famille": True, | |
| "titre_phrase": "cosm\u00e9tiques (produits et emballages)", | |
| "usage_unique": False, | |
| "ab_test_carte_default_view": False, | |
| "migree_depuis_synonymes_legacy": True, | |
| "commentaire": "", | |
| "tag_names": [], | |
| "search_tag_names": [], | |
| "sous_categorie_objet_codes": [ | |
| "bouteilles_plastique", | |
| "emballage_carton", | |
| "emballage_plastique", | |
| "emballage_metal", | |
| "emballage_verre", | |
| ], | |
| "infotri": [ | |
| { | |
| "id": "81576b51-4dcc-49ac-9a56-eb3b641cf785", | |
| "type": "image", | |
| "value": { | |
| "image": None, | |
| "alt_text": "Infotri pour cosm\u00e9tiques", | |
| "decorative": False, | |
| }, | |
| }, | |
| { | |
| "id": "5c905e59-034a-4d72-93eb-9599fcfd5346", | |
| "type": "image", | |
| "value": { | |
| "image": None, | |
| "alt_text": "cosm\u00e9tique en verre", | |
| "decorative": False, | |
| }, | |
| }, | |
| { | |
| "id": "2584c235-a860-4d4e-ba81-a06563a0b6ca", | |
| "type": "image", | |
| "value": { | |
| "image": None, | |
| "alt_text": "Contenus des cosm\u00e9tiques", | |
| "decorative": False, | |
| }, | |
| }, | |
| ], | |
| "body": [ | |
| { | |
| "id": "2063a2c7-a199-4c73-abf8-06d019806187", | |
| "type": "paragraph", | |
| "value": '<h2 data-block-key="2jo3z"><b>Les bons gestes de tri dans la salle de bain</b></h2><p data-block-key="vbj1">Les produits de beaut\u00e9 et d\u2019hygi\u00e8ne font partie du quotidien mais ils s\u2019accumulent parfois plus vite qu\u2019on ne le pense. Avant de les jeter, le premier r\u00e9flexe est de v\u00e9rifier leur \u00e9tat pour savoir s\u2019ils peuvent \u00eatre utilis\u00e9s (date de p\u00e9remption, aspect, odeur\u2026). Ensuite, une fois bien vid\u00e9s, les emballages se trient.</p>', | |
| }, | |
| { | |
| "id": "6b7d9aec-2f89-4053-9866-21da4c3f9857", | |
| "type": "card", | |
| "value": { | |
| "title": "\u2705 Trier les emballages vides", | |
| "heading_tag": "h3", | |
| "description": '<p data-block-key="ur8vn"><b>Les</b> <b>emballages en plastique</b> <b>ou</b> <b>en m\u00e9tal</b> (tube de cr\u00e8me, dentifrice, bombe de laque, maquillage...) sont \u00e0 d\u00e9poser dans le bac, le sac ou le conteneur de tri pour les papiers et emballages. La bo\u00eete en carton et la notice en papier sont \u00e9galement \u00e0 d\u00e9poser dans le bac de tri.</p><p data-block-key="6a7bj">Les couvercles et les opercules, en plastique ou en m\u00e9tal, sont \u00e0 d\u00e9poser dans le bac de tri.</p><p data-block-key="2jem2"><b>L\u2019emballage doit \u00eatre vide</b> : le produit doit \u00eatre utilis\u00e9 jusqu\u2019au bout ou, s\u2019il est p\u00e9rim\u00e9 ou inutilisable, son contenu doit \u00eatre jet\u00e9 avec les ordures m\u00e9nag\u00e8res.</p><p data-block-key="dbdct">\u26a0\ufe0f Si le produit ne peut pas \u00eatre vid\u00e9 de son contenu, il doit \u00eatre jet\u00e9 avec les ordures m\u00e9nag\u00e8res.</p>', | |
| "image": {"image": None, "alt_text": None, "decorative": None}, | |
| "shadow": False, | |
| "no_border": False, | |
| "link": {"page": None, "anchor": "", "document": None, "link_type": "", "external_url": ""}, | |
| "image_badge": [], | |
| "image_ratio": "", | |
| "no_background": False, | |
| "call_to_action": [], | |
| "grey_background": False, | |
| "top_detail_icon": "", | |
| "top_detail_text": "", | |
| "bottom_detail_icon": "", | |
| "bottom_detail_text": "", | |
| "top_detail_badges_tags": [ | |
| { | |
| "id": "3f1aa4d9-57fb-4988-a7ca-c43a08f554ed", | |
| "type": "badges", | |
| "value": [ | |
| { | |
| "id": "8af1ad07-114d-4b54-ae58-23e1afdb378a", | |
| "type": "badge", | |
| "value": {"text": "BAC DE TRI", "color": "yellow-tournesol", "hide_icon": False}, | |
| } | |
| ], | |
| } | |
| ], | |
| }, | |
| }, | |
| { | |
| "id": "2d0839be-0cca-4f66-afe2-13fdfc0791e3", | |
| "type": "item_grid", | |
| "value": { | |
| "column_width": "4", | |
| "items": [ | |
| { | |
| "id": "5f4ca003-7cf4-4540-8f2d-4b6d30c7c482", | |
| "type": "card", | |
| "value": { | |
| "title": "\u2705 D\u00e9poser les contenants en verre vides dans le bac r\u00e9serv\u00e9 au verre", | |
| "heading_tag": "h3", | |
| "description": '<p data-block-key="hmkpw">Les flacons, pots ou bouteilles en verre (parfums, cr\u00e8mes, vernis...) doivent \u00eatre vid\u00e9s et d\u00e9pos\u00e9s dans le bac ou dans le conteneur r\u00e9serv\u00e9 au verre.</p>', | |
| "image": {"image": None, "alt_text": None, "decorative": None}, | |
| "shadow": False, "no_border": False, | |
| "link": {"page": None, "anchor": "", "document": None, "link_type": "", "external_url": ""}, | |
| "image_badge": [], "image_ratio": "", "no_background": False, | |
| "call_to_action": [], "grey_background": False, | |
| "top_detail_icon": "", "top_detail_text": "", | |
| "bottom_detail_icon": "", "bottom_detail_text": "", | |
| "top_detail_badges_tags": [ | |
| { | |
| "id": "be03fd95-2b14-4209-9a98-c092cbbbf713", | |
| "type": "badges", | |
| "value": [ | |
| { | |
| "id": "4ce7bc98-8ee8-49f8-8e77-af812f7f4e5e", | |
| "type": "badge", | |
| "value": {"text": "Conteneur \u00e0 verre", "color": "green-emeraude", "hide_icon": False}, | |
| } | |
| ], | |
| } | |
| ], | |
| }, | |
| }, | |
| { | |
| "id": "db6b3323-e15d-494b-9111-4765a293a313", | |
| "type": "card", | |
| "value": { | |
| "title": "\ud83d\uddd1\ufe0f Vider le contenu des produits aux ordures m\u00e9nag\u00e8res", | |
| "heading_tag": "h3", | |
| "description": '<p data-block-key="hmkpw">Le contenu d\u2019un produit d\u2019hygi\u00e8ne ou de beaut\u00e9 doit \u00eatre jet\u00e9 dans les ordures m\u00e9nag\u00e8res lorsqu\u2019il ne peut plus \u00eatre utilis\u00e9.</p>', | |
| "image": {"image": None, "alt_text": None, "decorative": None}, | |
| "shadow": False, "no_border": False, | |
| "link": {"page": None, "anchor": "", "document": None, "link_type": "", "external_url": ""}, | |
| "image_badge": [], "image_ratio": "", "no_background": False, | |
| "call_to_action": [], "grey_background": False, | |
| "top_detail_icon": "", "top_detail_text": "", | |
| "bottom_detail_icon": "", "bottom_detail_text": "", | |
| "top_detail_badges_tags": [ | |
| { | |
| "id": "1517638c-ac9c-4fb0-b988-64032bab6424", | |
| "type": "badges", | |
| "value": [ | |
| { | |
| "id": "f202a35a-b919-46d5-b6b9-25643bb83b79", | |
| "type": "badge", | |
| "value": {"text": "Ordures m\u00e9nag\u00e8res", "color": "orange-terre-battue", "hide_icon": False}, | |
| } | |
| ], | |
| } | |
| ], | |
| }, | |
| }, | |
| { | |
| "id": "6afd85d1-ee63-4e06-bc92-101b8c2be9aa", | |
| "type": "card", | |
| "value": { | |
| "title": "\ud83d\uddd1\ufe0f D\u00e9poser les objets qui ne sont pas des emballages aux ordures m\u00e9nag\u00e8res", | |
| "heading_tag": "h3", | |
| "description": '<p data-block-key="hmkpw">Les objets qui ne sont pas des emballages doivent \u00eatre d\u00e9pos\u00e9s dans la poubelle des ordures m\u00e9nag\u00e8res (rasoir jetable, brosse \u00e0 dents, coton-tige, coton d\u00e9maquillant, serviettes hygi\u00e9niques, couches\u2026).</p>', | |
| "image": {"image": None, "alt_text": None, "decorative": None}, | |
| "shadow": False, "no_border": False, | |
| "link": {"page": None, "anchor": "", "document": None, "link_type": "", "external_url": ""}, | |
| "image_badge": [], "image_ratio": "", "no_background": False, | |
| "call_to_action": [], "grey_background": False, | |
| "top_detail_icon": "", "top_detail_text": "", | |
| "bottom_detail_icon": "", "bottom_detail_text": "", | |
| "top_detail_badges_tags": [ | |
| { | |
| "id": "31490248-7858-43e6-b68c-054b436115df", | |
| "type": "badges", | |
| "value": [ | |
| { | |
| "id": "78e4565a-a53e-480f-856f-3f5bc72628ea", | |
| "type": "badge", | |
| "value": {"text": "Ordures m\u00e9nag\u00e8res", "color": "orange-terre-battue", "hide_icon": False}, | |
| } | |
| ], | |
| } | |
| ], | |
| }, | |
| }, | |
| ], | |
| "vertical_align": "", | |
| "horizontal_align": "left", | |
| }, | |
| }, | |
| { | |
| "id": "8cb54187-8239-4a18-974d-9aec31f69b2c", | |
| "type": "html", | |
| "value": '<div id="carte"></div>', | |
| }, | |
| { | |
| "id": "d828dc9c-a4c8-458f-8563-d6dc222576b6", | |
| "type": "paragraph", | |
| "value": '<h2 data-block-key="2jo3z">O\u00f9 apporter les emballages des cosm\u00e9tiques pr\u00e8s de chez soi ?</h2><p data-block-key="3kmgt">D\u00e9couvrez les points de collecte \u00e0 proximit\u00e9 pour trier les emballages de produits d\u2019hygi\u00e8ne et de beaut\u00e9.</p>', | |
| }, | |
| { | |
| "id": "0b08fe11-71e8-4b3d-a7cc-c601f063a932", | |
| "type": "carte_sur_mesure", | |
| "value": None, | |
| }, | |
| { | |
| "id": "025fb61c-2300-485a-9d22-c580639107b8", | |
| "type": "multicolumns", | |
| "value": { | |
| "title": "", | |
| "columns": [ | |
| { | |
| "id": "e8bf1211-da07-4005-aab5-1ba7a29be89b", | |
| "type": "text", | |
| "value": '<h2 data-block-key="4675x">Que deviennent les cosm\u00e9tiques apr\u00e8s le tri ?</h2><p data-block-key="ca1p8">Une fois d\u00e9pos\u00e9s dans le bon bac de tri, les emballages des produits cosm\u00e9tiques suivent diff\u00e9rentes fili\u00e8res selon leur mati\u00e8re.</p><p data-block-key="acht9">\ud83d\udc49 Consulter les pages par type d\u2019emballage :</p><ul><li data-block-key="ah36h">Emballages en plastique</li><li data-block-key="1ka16">Emballages en m\u00e9tal</li><li data-block-key="flobv">Emballages en verre</li></ul><p data-block-key="1oueu">Jet\u00e9s \u00e0 la poubelle, les produits suivent l\u2019une des fili\u00e8res d\u2019\u00e9limination des ordures m\u00e9nag\u00e8res : ils sont incin\u00e9r\u00e9s (avec le plus souvent r\u00e9cup\u00e9ration de chaleur pour produire de l\u2019\u00e9nergie) ou enfouis.</p>', | |
| }, | |
| { | |
| "id": "a5dded3f-beb3-4e51-8f23-a7d47398f23e", | |
| "type": "image", | |
| "value": { | |
| "alt": "Ou jeter ses produits cosm\u00e9tiques ?", | |
| "url": "", "image": None, "title": "", | |
| "width": "", "caption": "", | |
| "heading_tag": "h3", "image_ratio": "", | |
| }, | |
| }, | |
| ], | |
| "bg_image": None, "top_margin": 2, | |
| "heading_tag": "h2", "bottom_margin": 2, | |
| "bg_color_class": "blue-france", | |
| "vertical_align": "middle", | |
| }, | |
| }, | |
| { | |
| "id": "3f041c94-6159-4858-8c25-4fac24b4c6bf", | |
| "type": "multicolumns", | |
| "value": { | |
| "title": "Le saviez-vous ?", | |
| "columns": [ | |
| { | |
| "id": "fe1fcd3d-a2fa-47b3-b8a5-6dfc51f79ff5", | |
| "type": "callout", | |
| "value": { | |
| "text": "", | |
| "color": "green-menthe", | |
| "title": "Environ 1% des \u00e9missions mondiales de gaz \u00e0 effet de serre serait li\u00e9 au secteur des cosm\u00e9tiques. (1)", | |
| "button": {"page": None, "text": "", "anchor": "", "document": None, "icon_side": "", "link_type": "", "icon_class": "", "button_type": "", "external_url": ""}, | |
| "icon_class": "", "heading_tag": "h3", | |
| }, | |
| }, | |
| { | |
| "id": "9c68a51b-4a55-42bc-9cfa-a91748798c99", | |
| "type": "callout", | |
| "value": { | |
| "text": "", | |
| "color": "green-menthe", | |
| "title": "20% des \u00e9missions de GES du secteur des cosm\u00e9tiques proviennent des emballages. (1)", | |
| "button": {"page": None, "text": "", "anchor": "", "document": None, "icon_side": "", "link_type": "", "icon_class": "", "button_type": "", "external_url": ""}, | |
| "icon_class": "", "heading_tag": "h3", | |
| }, | |
| }, | |
| ], | |
| "bg_image": None, "top_margin": 0, | |
| "heading_tag": "h2", "bottom_margin": 0, | |
| "bg_color_class": "", "vertical_align": "", | |
| }, | |
| }, | |
| { | |
| "id": "6d886d6d-14ee-46be-b196-2914035c24e2", | |
| "type": "card", | |
| "value": { | |
| "title": "Des cosm\u00e9tiques plus sains et plus responsables", | |
| "heading_tag": "h3", | |
| "description": '<p data-block-key="dmoio">Dans la salle de bain, mieux choisir ses produits, c\u2019est bon pour la sant\u00e9 et pour r\u00e9duire les d\u00e9chets. Quelques r\u00e9flexes peuvent contribuer \u00e0 limiter les impacts au quotidien :</p><p data-block-key="71pt5"><b>-</b> <b>Choisir des produits avec un label environnemental</b><b>.</b></p><p data-block-key="83tiv"><b>- Privil\u00e9gier les produits rechargeables ou en vrac,</b> un contenant r\u00e9utilisable permet d\u2019\u00e9viter la production et le transport d\u2019un nouvel emballage.</p><p data-block-key="ci2lt"><b>- Utiliser ses produits jusqu\u2019au bout</b> pour limiter le gaspillage et \u00e9viter d\u2019acheter inutilement.</p><p data-block-key="8cckd"><b>- Remplacer le jetable par des alternatives r\u00e9utilisables</b> pour r\u00e9duire les d\u00e9chets li\u00e9s aux produits \u00e0 usage unique.</p><p data-block-key="34b04"><b>- Se renseigner en magasin,</b> certaines enseignes proposent des solutions de vrac ou des dispositifs de recharge. Des exp\u00e9rimentations se d\u00e9veloppent progressivement.</p>', | |
| "image": {"image": None, "alt_text": "Choisir des cosm\u00e9tiques responsables", "decorative": False}, | |
| "shadow": False, "no_border": False, | |
| "link": {"page": None, "anchor": "", "document": None, "link_type": "", "external_url": ""}, | |
| "image_badge": [], "image_ratio": "fr-card--horizontal-tier", | |
| "no_background": False, "call_to_action": [], "grey_background": False, | |
| "top_detail_icon": "", "top_detail_text": "", | |
| "bottom_detail_icon": "", "bottom_detail_text": "", | |
| "top_detail_badges_tags": [], | |
| }, | |
| }, | |
| { | |
| "id": "9bf0a310-7870-44a5-8a18-56c0d5ae6257", | |
| "type": "accordions", | |
| "value": [ | |
| {"id": "0f419f52-175f-489b-ac57-278498b963ed", "type": "title", "value": "Questions fr\u00e9quemment pos\u00e9es"}, | |
| {"id": "5791305a-899e-4823-a0c1-3f7cb16ae3d9", "type": "accordion", "value": {"title": "Que faire de mes produits de beaut\u00e9 inutilis\u00e9s ?", "content": '<p data-block-key="blf8g">Avant de jeter un produit de beaut\u00e9 ou d\u2019hygi\u00e8ne, il est utile de v\u00e9rifier s\u2019il peut encore \u00eatre utilis\u00e9. Lorsqu\u2019un produit est en bon \u00e9tat, non ouvert ou encore utilisable, il peut \u00eatre donn\u00e9 \u00e0 des proches.</p><p data-block-key="6543m">Si le produit est p\u00e9rim\u00e9 ou inutilisable, il devient un d\u00e9chet. Dans ce cas, il faut distinguer le contenu et l\u2019emballage : le contenu est \u00e0 jeter dans les ordures m\u00e9nag\u00e8res et l\u2019emballage est \u00e0 d\u00e9poser dans le bac de tri ou le conteneur \u00e0 verre selon sa mati\u00e8re et une fois bien vid\u00e9.</p>'}}, | |
| {"id": "b1e2880c-b385-4588-af3c-70d92cb600b0", "type": "accordion", "value": {"title": "O\u00f9 jeter de la cr\u00e8me solaire ?", "content": '<p data-block-key="blf8g">Une fois la cr\u00e8me solaire utilis\u00e9e et le tube vid\u00e9, l\u2019emballage peut \u00eatre d\u00e9pos\u00e9 dans le bac, le sac ou le conteneur de tri pour les papiers et emballages.<br/><br/></p>'}}, | |
| {"id": "ca19558f-d208-42c6-86db-2f0f3298ac84", "type": "accordion", "value": {"title": "O\u00f9 jeter du vernis \u00e0 ongles ?", "content": '<p data-block-key="blf8g">Apr\u00e8s avoir vid\u00e9 le flacon du vernis \u00e0 ongles, le verre est \u00e0 d\u00e9poser dans le conteneur \u00e0 verre, tandis que le pinceau et son capuchon dans le bac, le sac ou le conteneur de tri pour les papiers et emballages.<br/></p>'}}, | |
| {"id": "7737338c-b4ff-42f3-8ce8-1817abc4ba4a", "type": "accordion", "value": {"title": "O\u00f9 jeter les vieilles brosses \u00e0 dents ?", "content": '<p data-block-key="blf8g">Une brosse \u00e0 dents doit \u00eatre jet\u00e9e dans la poubelle des ordures m\u00e9nag\u00e8res.</p><p data-block-key="632ni">Ce type d\u2019objet n\u2019est pas un emballage et est compos\u00e9 de plusieurs mat\u00e9riaux, ce qui ne permet pas son recyclage.</p>'}}, | |
| {"id": "3d6397cd-806e-4924-93c1-4418d56fe2dd", "type": "accordion", "value": {"title": "O\u00f9 jeter les produits de maquillage ?", "content": '<p data-block-key="blf8g">Les produits de maquillage regroupent \u00e0 la fois des contenus (poudres, cr\u00e8mes, liquides) et des emballages ou accessoires, qu\u2019il faut distinguer.</p><p data-block-key="15iud">Une fois les produits termin\u00e9s, les emballages peuvent \u00eatre tri\u00e9s :</p><ul><li data-block-key="e27eq">Les flacons en verre sont \u00e0 d\u00e9poser dans le conteneur \u00e0 verre.</li><li data-block-key="8v2u3">Les emballages en plastique ou en m\u00e9tal sont \u00e0 d\u00e9poser dans le bac de tri.</li></ul><p data-block-key="f1rrs">Les accessoires comme les pinceaux pour les l\u00e8vres, les brosses de mascara ou les rouges \u00e0 l\u00e8vres doivent \u00eatre jet\u00e9s avec les ordures m\u00e9nag\u00e8res. L\u2019emballage est le plus souvent constitu\u00e9 d\u2019un m\u00e9lange de plastiques et est trop souill\u00e9 pour \u00eatre recycl\u00e9.</p>'}}, | |
| {"id": "3e8e097d-cf4e-4ab8-8d0e-ff0a26d86d1e", "type": "accordion", "value": {"title": "O\u00f9 jeter les d\u00e9odorants \u00e0 bille, en spray, \u00e0 bille en verre ou en a\u00e9rosol une fois termin\u00e9s ?", "content": '<p data-block-key="blf8g">Les d\u00e9odorants doivent toujours \u00eatre vid\u00e9s de leur contenu avant d\u2019\u00eatre tri\u00e9s.</p><ul><li data-block-key="8esl6">Les d\u00e9odorants \u00e0 bille et les sprays en plastique ou en m\u00e9tal doivent \u00eatre d\u00e9pos\u00e9s dans le bac, le sac ou le conteneur de tri pour les papiers et emballages.</li><li data-block-key="5abtj">Les d\u00e9odorants \u00e0 bille en verre doivent \u00eatre d\u00e9pos\u00e9s dans le bac ou dans le conteneur r\u00e9serv\u00e9 au verre.</li><li data-block-key="3k31m">Les a\u00e9rosols (bombes sous pression) peuvent \u00e9galement \u00eatre tri\u00e9s avec les emballages s\u2019ils sont compl\u00e8tement vides.</li></ul><p data-block-key="74j27">\u26a0\ufe0f Il ne faut ni percer, ni \u00e9craser un a\u00e9rosol, m\u00eame vide.</p>'}}, | |
| {"id": "70efc620-0d47-4387-8d0e-25be86f10a33", "type": "accordion", "value": {"title": "Quel magasin reprend les flacons de parfum ?", "content": '<p data-block-key="blf8g">Il n\u2019existe pas de reprise syst\u00e9matique des flacons de parfum en magasin.</p><p data-block-key="8v8ri">Un flacon en verre doit \u00eatre d\u00e9pos\u00e9 dans le conteneur \u00e0 verre, une fois bien vid\u00e9.</p><p data-block-key="1aktt">Toutefois, certaines enseignes proposent la reprise de flacons, parfois en \u00e9change d\u2019un bon d\u2019achat. Ces initiatives restent ponctuelles et d\u00e9pendent des marques ou des magasins.</p>'}}, | |
| {"id": "0c7baf83-ae31-41c5-beb7-00b53124e973", "type": "accordion", "value": {"title": "Comment se d\u00e9barrasser d\u2019une vieille cr\u00e8me hydratante ?", "content": '<p data-block-key="blf8g">Si la cr\u00e8me est encore utilisable, elle peut \u00eatre donn\u00e9e \u00e0 un proche. Si elle est p\u00e9rim\u00e9e ou inutilisable, le contenu doit \u00eatre jet\u00e9 dans les ordures m\u00e9nag\u00e8res.</p><p data-block-key="5kumh">L\u2019emballage se trie : le verre dans le conteneur \u00e0 verre, le plastique ou le m\u00e9tal dans le bac, le sac ou le conteneur de tri pour les papiers et emballages.</p>'}}, | |
| {"id": "f8027454-d4f8-436c-829c-18aac1ef4942", "type": "accordion", "value": {"title": "O\u00f9 jeter le contenu d\u2019un cosm\u00e9tique ?", "content": '<p data-block-key="blf8g">Lorsqu\u2019un produit cosm\u00e9tique est p\u00e9rim\u00e9 ou inutilisable, son contenu doit \u00eatre jet\u00e9 avec les ordures m\u00e9nag\u00e8res.</p><p data-block-key="bsth4">Avant cela, il est recommand\u00e9 d\u2019utiliser le produit jusqu\u2019au bout lorsque c\u2019est possible, afin de limiter le gaspillage. Si ce n\u2019est pas le cas, le reste du produit ne doit pas \u00eatre vers\u00e9 dans l\u2019\u00e9vier ou dans les canalisations mais jet\u00e9 dans la poubelle des ordures m\u00e9nag\u00e8res.</p><p data-block-key="ag9vp">Une fois le contenant vid\u00e9, l\u2019emballage peut \u00eatre tri\u00e9.</p>'}}, | |
| {"id": "e0602d26-05af-41b1-9efc-4a13234cb5fc", "type": "accordion", "value": {"title": "O\u00f9 jeter une bouteille de shampoing pleine ?", "content": '<p data-block-key="blf8g">La bouteille de shampoing en plastique doit d\u2019abord \u00eatre vid\u00e9e de son contenu dans les ordures m\u00e9nag\u00e8res.</p><p data-block-key="c7ov3">Une fois vide, la bouteille doit \u00eatre d\u00e9pos\u00e9e dans le bac, le sac ou le conteneur de tri pour les papiers et emballages.</p>'}}, | |
| {"id": "f0c612f4-7792-44e3-8b64-c7b72c211d2a", "type": "accordion", "value": {"title": "Est-ce que les couches vont dans la poubelle jaune ?", "content": '<p data-block-key="blf8g">Non, les couches ne vont pas dans la poubelle jaune, elles doivent \u00eatre jet\u00e9es dans la poubelle des ordures m\u00e9nag\u00e8res.</p>'}}, | |
| ], | |
| }, | |
| { | |
| "id": "c4ebed17-27b9-4810-b796-6ce1ba8d0955", | |
| "type": "paragraph", | |
| "value": '<h2 data-block-key="wqun9"><b>En savoir plus</b></h2>', | |
| }, | |
| { | |
| "id": "fa3edfb2-d7ad-4702-89a3-25a73e38a433", | |
| "type": "liens", | |
| "value": [], | |
| }, | |
| { | |
| "id": "99a99213-1e02-4d87-836b-9b036bfcc439", | |
| "type": "separator", | |
| "value": {"top_margin": 3, "bottom_margin": 3}, | |
| }, | |
| { | |
| "id": "ce671282-52c4-4b0d-b156-ca78b22922fc", | |
| "type": "html", | |
| "value": '<div id="sources"></div>', | |
| }, | |
| { | |
| "id": "538c3b0a-f599-4915-9c66-7bc9ae948bca", | |
| "type": "paragraph", | |
| "value": '<p data-block-key="9edd1"><b>Sources pour les chiffres cl\u00e9s et FAQ :</b></p>', | |
| }, | |
| { | |
| "id": "8045c121-cba3-4a51-9380-8be0eb88d778", | |
| "type": "paragraph", | |
| "value": '<p data-block-key="9edd1">Mis \u00e0 jour le 8 avril 2026</p>', | |
| }, | |
| ], | |
| }, | |
| { | |
| "key": "velo", | |
| "parent_page_lookup": {"_key": "articles-sport"}, | |
| "page_type": "produitpage", | |
| "title": "V\u00e9lo", | |
| "slug": "velo", | |
| "seo_title": "Que faire de mon vieux v\u00e9lo ? O\u00f9 le faire r\u00e9parer, le donner, le vendre ou le d\u00e9poser ?", | |
| "search_description": "Et si votre v\u00e9lo n\u2019avait pas dit son dernier mot ? R\u00e9paration, don ou revente\u2026 il peut repartir pour de nombreux kilom\u00e8tres. Trouvez des solutions pr\u00e8s de chez vous.", | |
| "live": True, | |
| "show_in_menus": False, | |
| "genre": "m", | |
| "nombre": 1, | |
| "est_famille": True, | |
| "titre_phrase": "v\u00e9lo", | |
| "usage_unique": False, | |
| "ab_test_carte_default_view": False, | |
| "migree_depuis_synonymes_legacy": False, | |
| "commentaire": "", | |
| "tag_names": [], | |
| "search_tag_names": [ | |
| "Pneu de v\u00e9lo", | |
| "Fourche de v\u00e9lo", | |
| "Potence de v\u00e9lo", | |
| "Poign\u00e9e de v\u00e9lo", | |
| "Jante de v\u00e9lo", | |
| "P\u00e9dale de v\u00e9lo", | |
| "Cha\u00eene de v\u00e9lo", | |
| "Selle de v\u00e9lo", | |
| ], | |
| "sous_categorie_objet_codes": [ | |
| "velo", | |
| "jels_mobilite_electrique", | |
| ], | |
| "infotri": [ | |
| { | |
| "id": "81576b51-4dcc-49ac-9a56-eb3b641cf785", | |
| "type": "image", | |
| "value": { | |
| "image": None, | |
| "alt_text": "Infotri pour v\u00e9lo", | |
| "decorative": False, | |
| }, | |
| } | |
| ], | |
| "body": [ | |
| { | |
| "id": "edb2c33e-23e5-4611-94b3-14c5f49b9aaf", | |
| "type": "paragraph", | |
| "value": '<h2 data-block-key="ygjgc">Donner une seconde vie \u00e0 votre v\u00e9lo</h2><p data-block-key="bls4f">Et si votre v\u00e9lo ou votre v\u00e9lo \u00e9lectrique n\u2019avait pas dit son dernier mot ? Gr\u00e2ce \u00e0 la r\u00e9paration, au don ou \u00e0 la revente, il peut repartir pour de nombreux kilom\u00e8tres et continuer \u00e0 accompagner votre quotidien, ou celui de quelqu\u2019un d\u2019autre.</p>', | |
| }, | |
| { | |
| "id": "2d0839be-0cca-4f66-afe2-13fdfc0791e3", | |
| "type": "item_grid", | |
| "value": { | |
| "column_width": "4", | |
| "items": [ | |
| { | |
| "id": "5f4ca003-7cf4-4540-8f2d-4b6d30c7c482", | |
| "type": "card", | |
| "value": { | |
| "title": "R\u00e9parer", | |
| "heading_tag": "h3", | |
| "description": '<p data-block-key="hmkpw">\u27a1\ufe0f <b>R\u00e9parer votre v\u00e9lo</b> : chez un r\u00e9parateur sur la carte ci-dessous. Avec le Bonus R\u00e9paration, il est possible de remettre votre v\u00e9lo en \u00e9tat tout en faisant des \u00e9conomies <b>(jusqu\u2019\u00e0 30\u20ac).</b></p>', | |
| "image": {"image": None, "alt_text": None, "decorative": None}, | |
| "shadow": False, "no_border": False, | |
| "link": {"page": None, "anchor": "", "document": None, "link_type": "", "external_url": ""}, | |
| "image_badge": [], "image_ratio": "", "no_background": False, | |
| "call_to_action": [], "grey_background": False, | |
| "top_detail_icon": "", "top_detail_text": "", | |
| "bottom_detail_icon": "", "bottom_detail_text": "", | |
| "top_detail_badges_tags": [ | |
| { | |
| "id": "be03fd95-2b14-4209-9a98-c092cbbbf713", | |
| "type": "badges", | |
| "value": [ | |
| {"id": "4ce7bc98-8ee8-49f8-8e77-af812f7f4e5e", "type": "badge", "value": {"text": "R\u00e9parable", "color": "green-menthe", "hide_icon": False}}, | |
| {"id": "0b97b0dc-b8d5-48fd-8370-b3295f0ca4f2", "type": "badge", "value": {"text": "% Bonus R\u00e9paration", "color": "yellow-tournesol", "hide_icon": False}}, | |
| ], | |
| } | |
| ], | |
| }, | |
| }, | |
| { | |
| "id": "db6b3323-e15d-494b-9111-4765a293a313", | |
| "type": "card", | |
| "value": { | |
| "title": "Donner ou revendre", | |
| "heading_tag": "h3", | |
| "description": '<p data-block-key="hmkpw">\u27a1\ufe0f <b>Donner votre v\u00e9lo</b> \u00e0 une association, une recyclerie ou une structure de r\u00e9emploi.</p><p data-block-key="a5hun"><b>\u27a1\ufe0f Le revendre</b> via une plateforme de seconde main ou aupr\u00e8s d\u2019un magasin de sport proposant un service de reprise.</p>', | |
| "image": {"image": None, "alt_text": None, "decorative": None}, | |
| "shadow": False, "no_border": False, | |
| "link": {"page": None, "anchor": "", "document": None, "link_type": "", "external_url": ""}, | |
| "image_badge": [], "image_ratio": "", "no_background": False, | |
| "call_to_action": [], "grey_background": False, | |
| "top_detail_icon": "", "top_detail_text": "", | |
| "bottom_detail_icon": "", "bottom_detail_text": "", | |
| "top_detail_badges_tags": [ | |
| { | |
| "id": "1517638c-ac9c-4fb0-b988-64032bab6424", | |
| "type": "badges", | |
| "value": [ | |
| {"id": "f202a35a-b919-46d5-b6b9-25643bb83b79", "type": "badge", "value": {"text": "Bon \u00e9tat", "color": "blue-cumulus", "hide_icon": False}}, | |
| ], | |
| } | |
| ], | |
| }, | |
| }, | |
| { | |
| "id": "6afd85d1-ee63-4e06-bc92-101b8c2be9aa", | |
| "type": "card", | |
| "value": { | |
| "title": "D\u00e9poser", | |
| "heading_tag": "h3", | |
| "description": '<p data-block-key="hmkpw">\u27a1\ufe0f <b>En magasin de sport</b> : remettre votre v\u00e9lo au vendeur.</p><p data-block-key="bnksb">\u27a1\ufe0f <b>En d\u00e9ch\u00e8terie</b> : d\u00e9poser votre v\u00e9lo dans la zone d\u00e9di\u00e9e aux articles de sport et loisirs.</p>', | |
| "image": {"image": None, "alt_text": None, "decorative": None}, | |
| "shadow": False, "no_border": False, | |
| "link": {"page": None, "anchor": "", "document": None, "link_type": "", "external_url": ""}, | |
| "image_badge": [], "image_ratio": "", "no_background": False, | |
| "call_to_action": [], "grey_background": False, | |
| "top_detail_icon": "", "top_detail_text": "", | |
| "bottom_detail_icon": "", "bottom_detail_text": "", | |
| "top_detail_badges_tags": [ | |
| { | |
| "id": "31490248-7858-43e6-b68c-054b436115df", | |
| "type": "badges", | |
| "value": [ | |
| {"id": "78e4565a-a53e-480f-856f-3f5bc72628ea", "type": "badge", "value": {"text": "Mauvais \u00e9tat", "color": "purple-glycine", "hide_icon": False}}, | |
| ], | |
| } | |
| ], | |
| }, | |
| }, | |
| ], | |
| "vertical_align": "", | |
| "horizontal_align": "left", | |
| }, | |
| }, | |
| { | |
| "id": "8cb54187-8239-4a18-974d-9aec31f69b2c", | |
| "type": "html", | |
| "value": '<div id="carte"></div>', | |
| }, | |
| { | |
| "id": "d828dc9c-a4c8-458f-8563-d6dc222576b6", | |
| "type": "paragraph", | |
| "value": '<h2 data-block-key="2jo3z">O\u00f9 apporter son v\u00e9lo pr\u00e8s de chez soi ?</h2><p data-block-key="3kmgt">Quel que soit son \u00e9tat, trouvez sur la carte des solutions \u00e0 proximit\u00e9 de r\u00e9paration, de don, de revente ou de d\u00e9p\u00f4t pour votre v\u00e9lo.</p>', | |
| }, | |
| { | |
| "id": "0b08fe11-71e8-4b3d-a7cc-c601f063a932", | |
| "type": "carte_sur_mesure", | |
| "value": None, | |
| }, | |
| { | |
| "id": "025fb61c-2300-485a-9d22-c580639107b8", | |
| "type": "multicolumns", | |
| "value": { | |
| "title": "", | |
| "columns": [ | |
| { | |
| "id": "5b1036f0-5958-4fb4-87ca-47cb41b2ac53", | |
| "type": "text", | |
| "value": '<h2 data-block-key="a9ajw">Votre v\u00e9lo repart pour un tour !</h2><p data-block-key="2otcr">Selon son \u00e9tat, votre v\u00e9lo ou votre v\u00e9lo \u00e9lectrique peut suivre plusieurs parcours pour continuer \u00e0 \u00eatre utilis\u00e9 ou alors \u00eatre valoris\u00e9 :</p><ul><li data-block-key="efp0b"><b>S\u2019il est en bon \u00e9tat,</b> un v\u00e9lo peut \u00eatre directement r\u00e9utilis\u00e9 gr\u00e2ce au don ou \u00e0 la revente. Il continue alors de rouler, tout simplement.</li><li data-block-key="49e0n"><b>S\u2019il a besoin de r\u00e9parations,</b> il peut \u00eatre remis en \u00e9tat par un professionnel (notamment avec le Bonus R\u00e9paration), dans un atelier d\u2019auto-r\u00e9paration ou par une structure de r\u00e9emploi. Associations, ateliers et recycleries lui redonnent une nouvelle vie.</li><li data-block-key="ckgih"><b>Si le v\u00e9lo n\u2019est plus r\u00e9parable,</b> il est d\u00e9mantel\u00e9 afin de s\u00e9parer les diff\u00e9rents mat\u00e9riaux, comme les m\u00e9taux ou les plastiques, qui pourront \u00eatre recycl\u00e9s et utilis\u00e9s dans de nouveaux produits.<br/>Les mat\u00e9riaux non recyclables sont incin\u00e9r\u00e9s ou enfouis.</li></ul>', | |
| }, | |
| { | |
| "id": "a5dded3f-beb3-4e51-8f23-a7d47398f23e", | |
| "type": "image", | |
| "value": { | |
| "alt": "Seconde vie v\u00e9lo", "url": "", | |
| "image": None, "title": "", "width": "", | |
| "caption": "", "heading_tag": "h3", | |
| "image_ratio": "fr-ratio-3x2", | |
| }, | |
| }, | |
| ], | |
| "bg_image": None, "top_margin": 2, | |
| "heading_tag": "h2", "bottom_margin": 2, | |
| "bg_color_class": "blue-france", | |
| "vertical_align": "middle", | |
| }, | |
| }, | |
| { | |
| "id": "c9b7f2b5-fae9-4d91-a0a0-3d2f1c838a5c", | |
| "type": "separator", | |
| "value": {"top_margin": 3, "bottom_margin": 3}, | |
| }, | |
| { | |
| "id": "98bc9116-f980-41d8-a23c-ab775c68e933", | |
| "type": "item_grid", | |
| "value": { | |
| "column_width": "4", | |
| "items": [ | |
| { | |
| "id": "b0fc6eaf-e25d-4857-8c45-21b728953f58", | |
| "type": "card", | |
| "value": { | |
| "title": "\u2728 Entretenir son v\u00e9lo", | |
| "heading_tag": "h3", | |
| "description": '<p data-block-key="8bqpb">Prendre soin de son v\u00e9lo, c\u2019est rouler l\u2019esprit l\u00e9ger et profiter d\u2019un v\u00e9lo agr\u00e9able et fiable au quotidien, par exemple :</p><p data-block-key="9f4mv">\u25cf Nettoyer r\u00e9guli\u00e8rement pour \u00e9viter l\u2019usure.</p><p data-block-key="fdo85">\u25cf V\u00e9rifier l\u2019\u00e9tat des pneus, des freins et de la cha\u00eene.</p><p data-block-key="e146v">\u25cf Lubrifier la cha\u00eene pour assurer un bon fonctionnement.</p>', | |
| "image": {"image": None, "alt_text": "entretenir-son-velo", "decorative": False}, | |
| "shadow": False, "no_border": False, | |
| "link": {"page": None, "anchor": "", "document": None, "link_type": "external_url", "external_url": "https://epargnonsnosressources.gouv.fr/entretien/velo-a-assistance-electrique/"}, | |
| "image_badge": [], "image_ratio": "", "no_background": False, | |
| "call_to_action": [], "grey_background": False, | |
| "top_detail_icon": "", "top_detail_text": "", | |
| "bottom_detail_icon": "", "bottom_detail_text": "", | |
| "top_detail_badges_tags": [], | |
| }, | |
| }, | |
| { | |
| "id": "4bae231d-9f5d-463b-ab81-60d0f78b25db", | |
| "type": "card", | |
| "value": { | |
| "title": "\ud83d\udd27 R\u00e9parer son v\u00e9lo", | |
| "heading_tag": "h3", | |
| "description": '<p data-block-key="8bqpb">R\u00e9parer, c\u2019est prolonger la vie de son v\u00e9lo et continuer \u00e0 en profiter longtemps :</p><p data-block-key="4kp5d">\u25cf R\u00e9parer les pannes courantes (crevaison, freins...).</p><p data-block-key="3sk79">\u25cf R\u00e9aliser les r\u00e9parations plus importantes plut\u00f4t que de le remplacer.</p><p data-block-key="d8d13">\u25cf Profiter du Bonus R\u00e9paration pour all\u00e9ger la facture.</p>', | |
| "image": {"image": None, "alt_text": "reparer-son-velo", "decorative": False}, | |
| "shadow": False, "no_border": False, | |
| "link": {"page": None, "anchor": "", "document": None, "link_type": "", "external_url": ""}, | |
| "image_badge": [], "image_ratio": "", "no_background": False, | |
| "call_to_action": [], "grey_background": False, | |
| "top_detail_icon": "", "top_detail_text": "", | |
| "bottom_detail_icon": "", "bottom_detail_text": "", | |
| "top_detail_badges_tags": [], | |
| }, | |
| }, | |
| { | |
| "id": "a7f80871-af36-4596-9352-5d7687bd60df", | |
| "type": "card", | |
| "value": { | |
| "title": "\ud83d\udeb2 Participer \u00e0 Mai \u00e0 V\u00e9lo", | |
| "heading_tag": "h3", | |
| "description": '<p data-block-key="d1mq3">Mai \u00e0 V\u00e9lo, c\u2019est l\u2019occasion id\u00e9ale de (re)mettre le pied \u00e0 la p\u00e9dale et d\u2019adopter le v\u00e9lo au quotidien :</p><p data-block-key="7a37">\u25cf Plus de 7 000 \u00e9v\u00e9nements partout en France.</p><p data-block-key="bvfkp">\u25cf Ateliers, balades et animations pour tous les niveaux.</p><p data-block-key="2rjop">\u25cf Reprendre confiance et int\u00e9grer le v\u00e9lo dans ses trajets.</p>', | |
| "image": {"image": None, "alt_text": "mai-a-velo-2026", "decorative": False}, | |
| "shadow": False, "no_border": False, | |
| "link": {"page": None, "anchor": "", "document": None, "link_type": "external_url", "external_url": "https://maiavelo.fr/"}, | |
| "image_badge": [], "image_ratio": "", "no_background": False, | |
| "call_to_action": [], "grey_background": False, | |
| "top_detail_icon": "", "top_detail_text": "", | |
| "bottom_detail_icon": "", "bottom_detail_text": "", | |
| "top_detail_badges_tags": [], | |
| }, | |
| }, | |
| ], | |
| "vertical_align": "", | |
| "horizontal_align": "left", | |
| }, | |
| }, | |
| { | |
| "id": "4238105d-b91c-4641-88c6-368996ff2e5a", | |
| "type": "separator", | |
| "value": {"top_margin": 3, "bottom_margin": 3}, | |
| }, | |
| { | |
| "id": "d66ff975-fdd0-4797-b12a-f3782db2a953", | |
| "type": "paragraph", | |
| "value": '<h2 data-block-key="0mhfq">Un alli\u00e9 pour des d\u00e9placements moins impactants</h2><p data-block-key="kboo">Le v\u00e9lo fait partie des modes de transport les moins \u00e9metteurs de CO\u2082. Ainsi, choisir le v\u00e9lo, m\u00eame sur de courtes distances, permet de r\u00e9duire son empreinte carbone tout en profitant d\u2019un mode de d\u00e9placement \u00e9conomique et bon pour la sant\u00e9.</p>', | |
| }, | |
| { | |
| "id": "9bf0a310-7870-44a5-8a18-56c0d5ae6257", | |
| "type": "accordions", | |
| "value": [ | |
| {"id": "0f419f52-175f-489b-ac57-278498b963ed", "type": "title", "value": "Questions fr\u00e9quemment pos\u00e9es"}, | |
| {"id": "b1e2880c-b385-4588-af3c-70d92cb600b0", "type": "accordion", "value": {"title": "O\u00f9 puis-je me d\u00e9barrasser de mon vieux v\u00e9lo ?", "content": '<p data-block-key="blf8g">Avant de chercher o\u00f9 s\u2019en d\u00e9barrasser, une autre question se pose : le v\u00e9lo peut-il encore \u00eatre utilis\u00e9 ?</p><p data-block-key="cov1d">Plusieurs solutions existent :</p><ul><li data-block-key="6889m">Le faire r\u00e9parer, chez un professionnel ou en apprenant \u00e0 le faire soi-m\u00eame dans un atelier d\u2019auto-r\u00e9paration.</li><li data-block-key="cjina">Le donner \u00e0 une association, \u00e0 une structure de r\u00e9emploi ou \u00e0 un proche.</li><li data-block-key="bnve9">Le revendre, m\u00eame \u00e0 petit prix, pour lui offrir une seconde vie.</li></ul><p data-block-key="3ous">Si le v\u00e9lo est vraiment hors d\u2019usage, il peut \u00eatre remis \u00e0 un vendeur dans un magasin de sport ou alors d\u00e9pos\u00e9 en d\u00e9ch\u00e8terie dans la zone d\u00e9di\u00e9e.</p>'}}, | |
| {"id": "f7a2d50e-bc4c-4290-906e-b813300faff9", "type": "accordion", "value": {"title": "Qui reprend les anciens v\u00e9los ?", "content": '<p data-block-key="blf8g">De nombreux acteurs r\u00e9cup\u00e8rent les v\u00e9los pour les remettre en circulation. Par exemple :</p><ul><li data-block-key="dfdat">Des associations ou structures de r\u00e9emploi.</li><li data-block-key="8hn53">Des ateliers v\u00e9lo participatifs.</li><li data-block-key="7slo6">Certains magasins de sport proposent des services de reprise selon l\u2019\u00e9tat du v\u00e9lo.</li><li data-block-key="8s7pm">Des plateformes de don ou de revente entre particuliers.</li></ul><p data-block-key="bn403">Ces structures peuvent r\u00e9parer le v\u00e9lo, r\u00e9cup\u00e9rer des pi\u00e8ces ou le remettre en \u00e9tat pour quelqu\u2019un d\u2019autre.</p>'}}, | |
| {"id": "b1819ec0-ec6d-4a89-a664-cb401b7696c1", "type": "accordion", "value": {"title": "Est-ce que \u00e7a vaut la peine de r\u00e9parer un vieux v\u00e9lo ?", "content": '<p data-block-key="blf8g">Oui, dans la grande majorit\u00e9 des cas, r\u00e9parer un vieux v\u00e9lo vaut le coup.</p><p data-block-key="44hre">Le v\u00e9lo est un objet con\u00e7u pour \u00eatre r\u00e9par\u00e9, et m\u00eame si certains mod\u00e8les r\u00e9cents sont plus complexes \u00e0 cause de l\u2019\u00e9lectronique, de nombreuses pannes sont accessibles et peuvent \u00eatre prises en charge rapidement.</p><p data-block-key="17u02">R\u00e9parer permet souvent de prolonger son usage \u00e0 moindre co\u00fbt, plut\u00f4t que de le remplacer. Il est possible de faire appel \u00e0 un professionnel ou de se tourner vers un atelier d\u2019auto-r\u00e9paration pour apprendre \u00e0 le faire soi-m\u00eame.</p><p data-block-key="5as4t">Le Bonus R\u00e9paration peut \u00e9galement aider \u00e0 r\u00e9duire le co\u00fbt de certaines interventions chez un r\u00e9parateur labellis\u00e9.</p>'}}, | |
| {"id": "734a0650-0f4f-49d7-8646-8361b8ea1fa0", "type": "accordion", "value": {"title": "O\u00f9 jeter les pi\u00e8ces de v\u00e9lo (pneu, cha\u00eene, chambre \u00e0 air, p\u00e9dale\u2026) ?", "content": '<p data-block-key="blf8g">Les pi\u00e8ces de v\u00e9lo comme les pneus, chambres \u00e0 air, cha\u00eenes, rayons, p\u00e9dales, fourches, guidons ou autres \u00e9l\u00e9ments d\u00e9tach\u00e9s peuvent encore servir si elles sont en bon \u00e9tat. Elles peuvent alors \u00eatre donn\u00e9es \u00e0 une association, un atelier de r\u00e9paration ou une structure de r\u00e9emploi.</p><p data-block-key="1aij">Si elles sont us\u00e9es ou cass\u00e9es, elles doivent \u00eatre apport\u00e9es chez un distributeur ou en magasin de sport, ou en d\u00e9ch\u00e8terie dans la zone d\u00e9di\u00e9e aux articles de sport et de loisirs.</p>'}}, | |
| {"id": "fc183b93-2076-4d6f-8ec5-889439aa8eab", "type": "accordion", "value": {"title": "Le recyclage des v\u00e9los, comment \u00e7a marche ?", "content": '<p data-block-key="blf8g">Le recyclage intervient en dernier recours, lorsque le v\u00e9lo ne peut plus \u00eatre r\u00e9par\u00e9 ni r\u00e9utilis\u00e9. Concr\u00e8tement :</p><ul><li data-block-key="toi7">Le v\u00e9lo est d\u00e9mantel\u00e9.</li><li data-block-key="7okd8">Les diff\u00e9rents mat\u00e9riaux (m\u00e9taux, plastiques\u2026) sont s\u00e9par\u00e9s afin d\u2019\u00eatre recycl\u00e9s.</li><li data-block-key="8dtbd">Les pi\u00e8ces encore fonctionnelles peuvent \u00eatre r\u00e9employ\u00e9es.</li><li data-block-key="3q48h">Les mat\u00e9riaux non recyclables sont incin\u00e9r\u00e9s ou enfouis.</li></ul><p data-block-key="b0rjs">Tous les composants ne se recyclent pas de la m\u00eame mani\u00e8re, notamment les \u00e9l\u00e9ments \u00e9lectroniques ou les batteries, qui n\u00e9cessitent des traitements sp\u00e9cifiques.</p><p data-block-key="bkjpc">C\u2019est pourquoi la priorit\u00e9 reste de r\u00e9parer et r\u00e9utiliser, afin de prolonger la dur\u00e9e de vie du v\u00e9lo autant que possible.</p>'}}, | |
| {"id": "86fe6240-0738-4e2d-a76c-112636ca092f", "type": "accordion", "value": {"title": "Que faire d\u2019un v\u00e9lo \u00e9lectrique en panne ?", "content": '<p data-block-key="blf8g">Un v\u00e9lo \u00e9lectrique en panne n\u2019est pas forc\u00e9ment bon \u00e0 jeter, loin de l\u00e0. Dans beaucoup de cas, la panne vient de la batterie ou d\u2019un composant \u00e9lectronique et ces \u00e9l\u00e9ments peuvent \u00eatre diagnostiqu\u00e9s, r\u00e9par\u00e9s ou remplac\u00e9s.</p><p data-block-key="7oqd1">La premi\u00e8re \u00e9tape consiste \u00e0 faire diagnostiquer le v\u00e9lo par un professionnel afin d\u2019identifier pr\u00e9cis\u00e9ment l\u2019origine de la panne. Selon le cas, la batterie peut \u00eatre remplac\u00e9e ou reconditionn\u00e9e, et certains composants \u00e9lectroniques peuvent \u00e9galement \u00eatre r\u00e9par\u00e9s ou remplac\u00e9s.</p><p data-block-key="eq061">Si la panne n\u2019est pas r\u00e9parable, le v\u00e9lo peut \u00eatre d\u00e9pos\u00e9 en magasin de sport ou en d\u00e9ch\u00e8terie.</p>'}}, | |
| {"id": "a7c362fa-8e92-4725-b520-f2c41f8f4fbd", "type": "accordion", "value": {"title": "Comment remplacer son v\u00e9lo sans acheter neuf ?", "content": '<p data-block-key="blf8g">Remplacer son v\u00e9lo ne passe pas forc\u00e9ment par l\u2019achat d\u2019un mod\u00e8le neuf. Plusieurs alternatives existent pour continuer \u00e0 rouler tout en limitant son impact :</p><ul><li data-block-key="73ao7">Le v\u00e9lo d\u2019occasion, aupr\u00e8s de particuliers ou d\u2019ateliers.</li><li data-block-key="df4qh">Le reconditionn\u00e9, avec des v\u00e9los remis en \u00e9tat.</li><li data-block-key="41tev">Le don ou l\u2019\u00e9change.</li><li data-block-key="fsmqo">La location.</li></ul>'}}, | |
| ], | |
| }, | |
| { | |
| "id": "c4ebed17-27b9-4810-b796-6ce1ba8d0955", | |
| "type": "paragraph", | |
| "value": '<h2 data-block-key="wqun9"><b>En savoir plus</b></h2>', | |
| }, | |
| { | |
| "id": "fa3edfb2-d7ad-4702-89a3-25a73e38a433", | |
| "type": "liens", | |
| "value": [], | |
| }, | |
| { | |
| "id": "99a99213-1e02-4d87-836b-9b036bfcc439", | |
| "type": "separator", | |
| "value": {"top_margin": 3, "bottom_margin": 3}, | |
| }, | |
| { | |
| "id": "8045c121-cba3-4a51-9380-8be0eb88d778", | |
| "type": "paragraph", | |
| "value": '<p data-block-key="9edd1">Mis \u00e0 jour le 21 avril 2026</p>', | |
| }, | |
| ], | |
| }, | |
| ], | |
| } | |
| def _find_parent(page_def, created_pages): | |
| parent_lookup = page_def.get("parent_page_lookup") | |
| if not parent_lookup: | |
| print(" [ERROR] Missing parent_page_lookup.", file=sys.stderr) | |
| return None | |
| parent_key = parent_lookup.get("_key") | |
| if parent_key: | |
| parent = created_pages.get(parent_key) | |
| if parent: | |
| return parent | |
| print( | |
| f" [ERROR] Parent key '{parent_key}' not found in created pages " | |
| "(must be defined before child).", | |
| file=sys.stderr, | |
| ) | |
| return None | |
| parent_id = parent_lookup.get("id") | |
| if parent_id: | |
| try: | |
| return Page.objects.get(id=parent_id).specific | |
| except Page.DoesNotExist: | |
| print(f" [ERROR] Parent page id={parent_id} not found.", file=sys.stderr) | |
| return None | |
| parent_slug = parent_lookup.get("slug") | |
| if parent_slug: | |
| try: | |
| return Page.objects.get(slug=parent_slug).specific | |
| except Page.DoesNotExist: | |
| print( | |
| f" [ERROR] Parent page slug='{parent_slug}' not found.", | |
| file=sys.stderr, | |
| ) | |
| return None | |
| except Page.MultipleObjectsReturned: | |
| print( | |
| f" [ERROR] Multiple pages with slug='{parent_slug}'. Use id.", | |
| file=sys.stderr, | |
| ) | |
| return None | |
| print( | |
| " [ERROR] parent_page_lookup must contain one of: id, slug, _key.", | |
| file=sys.stderr, | |
| ) | |
| return None | |
| def _create_page(page_def, created_pages, dry_run): | |
| parent = _find_parent(page_def, created_pages) | |
| if parent is None: | |
| return None | |
| title = page_def["title"] | |
| slug_value = page_def["slug"] | |
| print(f" Creating '{title}' under '{parent.title}' (parent id={parent.pk})") | |
| if dry_run: | |
| _report(page_def) | |
| return None | |
| page = ProduitPage( | |
| title=title, | |
| slug=slug_value, | |
| live=page_def.get("live", True), | |
| show_in_menus=page_def.get("show_in_menus", False), | |
| seo_title=page_def.get("seo_title", ""), | |
| search_description=page_def.get("search_description", ""), | |
| genre=page_def.get("genre", ""), | |
| nombre=page_def.get("nombre"), | |
| est_famille=page_def.get("est_famille", False), | |
| titre_phrase=page_def.get("titre_phrase", ""), | |
| usage_unique=page_def.get("usage_unique", False), | |
| ab_test_carte_default_view=page_def.get("ab_test_carte_default_view", False), | |
| migree_depuis_synonymes_legacy=page_def.get( | |
| "migree_depuis_synonymes_legacy", False | |
| ), | |
| commentaire=page_def.get("commentaire", ""), | |
| ) | |
| parent.add_child(instance=page) | |
| body = page_def.get("body") | |
| if body is not None: | |
| page.body = body | |
| infotri = page_def.get("infotri") | |
| if infotri is not None: | |
| page.infotri = infotri | |
| page.save() | |
| # tags | |
| for name in page_def.get("tag_names", []): | |
| tag, created = Tag.objects.get_or_create(name=name) | |
| page.tags.add(tag) | |
| if created: | |
| print(f" Created tag: '{name}'") | |
| # search tags | |
| for name in page_def.get("search_tag_names", []): | |
| tag, created = SearchTag.objects.get_or_create(name=name) | |
| page.search_tags.add(tag) | |
| if created: | |
| print(f" Created search tag: '{name}'") | |
| # sous-categories | |
| for code in page_def.get("sous_categorie_objet_codes", []): | |
| try: | |
| sc = SousCategorieObjet.objects.get(code=code) | |
| page.sous_categorie_objet.add(sc) | |
| except SousCategorieObjet.DoesNotExist: | |
| print(f" [WARNING] SousCategorieObjet code='{code}' not found, skipping.") | |
| revision = page.save_revision() | |
| if page_def.get("live", True): | |
| revision.publish() | |
| print(f" [OK] Created page id={page.pk}, slug='{page.slug}'") | |
| return page | |
| def _report(page_def): | |
| print(f" genre: {page_def.get('genre', '')}") | |
| print(f" nombre: {page_def.get('nombre')}") | |
| print(f" est_famille: {page_def.get('est_famille', False)}") | |
| print(f" titre_phrase: {page_def.get('titre_phrase', '')}") | |
| print(f" usage_unique: {page_def.get('usage_unique', False)}") | |
| print( | |
| f" ab_test_carte_default_view: " | |
| f"{page_def.get('ab_test_carte_default_view', False)}" | |
| ) | |
| print( | |
| f" migree_depuis_synonymes_legacy: " | |
| f"{page_def.get('migree_depuis_synonymes_legacy', False)}" | |
| ) | |
| print(f" body blocks: {len(page_def.get('body', []))}") | |
| print(f" infotri blocks: {len(page_def.get('infotri', []))}") | |
| print(f" tag_names: {page_def.get('tag_names', [])}") | |
| print(f" search_tag_names: {page_def.get('search_tag_names', [])}") | |
| print( | |
| f" sous_categorie_objet_codes: " | |
| f"{page_def.get('sous_categorie_objet_codes', [])}" | |
| ) | |
| print(" [DRY RUN] Would create page (not saved).") | |
| def main(): | |
| dry_run = "--dry-run" in sys.argv | |
| parent_override = None | |
| for i, arg in enumerate(sys.argv): | |
| if arg == "--parent-page-id" and i + 1 < len(sys.argv): | |
| parent_override = int(sys.argv[i + 1]) | |
| pages = FIXTURE["pages"] | |
| if parent_override is not None and pages: | |
| pages[0]["parent_page_lookup"] = {"id": parent_override} | |
| print(f"Overriding first page parent to id={parent_override}") | |
| created_pages = {} | |
| for i, page_def in enumerate(pages): | |
| print(f"\n--- Page {i + 1}/{len(pages)} ---") | |
| created = _create_page(page_def, created_pages, dry_run) | |
| if created: | |
| created_pages[page_def.get("key", page_def["slug"])] = created | |
| if created_pages: | |
| print(f"\nDone. Created {len(created_pages)} page(s).") | |
| elif not dry_run: | |
| print("\nNo pages were created.", file=sys.stderr) | |
| if __name__ == "__main__": | |
| main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment