diff --git a/Makefile b/Makefile index 157636976..b77da950c 100644 --- a/Makefile +++ b/Makefile @@ -18,9 +18,11 @@ shell_on_postgres_container: populate_db: pg_restore -d marche --if-exists --clean --no-owner --no-privileges lemarche/perimeters/management/commands/data/perimeters_20220104.sql ls -d lemarche/fixtures/django/* | xargs django-admin loaddata + djan-admin create_content_pages populate_db_container: docker compose exec -ti app bash -c "ls -d lemarche/fixtures/django/* | xargs django-admin loaddata" + docker compose exec -ti app bash -c "django-admin create_content_pages" # Deployment # ============================================================================= diff --git a/README.md b/README.md index 6f7a87b14..441024f04 100644 --- a/README.md +++ b/README.md @@ -113,12 +113,21 @@ django-admin import_departements django-admin import_communes ``` -Des données de test peuvent être chargées ainsi (fixtures) : +### Données de test +- fixtures : ```bash ls -d lemarche/fixtures/django/* | xargs django-admin loaddata ``` +- commande Django : +```bash +django-admin create_content_pages +``` + +> **Remarque** : La commande `create_content_pages` crée 6 pages de types ContentPage : +('accessibilite', 'cgu', 'cgu-api', 'confidentialite', 'mentions-legales' et 'qui-sommes-nous'). + ## API Il y a aussi une API, qui propose plusieurs endpoints et interfaces de documentation : diff --git a/clevercloud/review-app-after-success.sh b/clevercloud/review-app-after-success.sh index 79e991fba..24df8012f 100755 --- a/clevercloud/review-app-after-success.sh +++ b/clevercloud/review-app-after-success.sh @@ -22,3 +22,4 @@ PGPASSWORD=$POSTGRESQL_ADDON_PASSWORD pg_restore -d $POSTGRESQL_ADDON_DB -h $POS # does not have execution rights on the $APP_HOME directory. echo "Loading fixtures" ls -d $APP_HOME/lemarche/fixtures/django/* | xargs django-admin loaddata +django-admin create_content_pages diff --git a/config/settings/base.py b/config/settings/base.py index b15e7bace..c3de97cce 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -912,6 +912,14 @@ # Specific home and purchasing impact page is setted here to avoid queries on every page SIAE_HOME_PAGE = env.str("SIAE_HOME_PAGE", "/accueil-structure/") PURCHASING_IMPACT_PAGE = env.str("PURCHASING_IMPACT_PAGE", "/impact-rse/") +# Static pages +ABOUT = env.str("ABOUT", "/qui-sommes-nous/") +ACCESSIBILITY = env.str("ACCESSIBILITY", "/accessibilite/") +CGU = env.str("CGU", "/cgu/") +CGU_API = env.str("CGU_API", "/cgu-api/") +LEGAL_INFO = env.str("LEGAL_INFO", "/mentions-legales/") +PRIVACY_POLICY = env.str("PRIVACY_POLICY", "/confidentialite/") +RESSOURCES = env.str("RESSOURCES", "/ressources/") # Increase throttling to avoid Bad request errors when saving large pages # https://docs.djangoproject.com/en/4.2/ref/settings/#data-upload-max-number-fields diff --git a/lemarche/cms/management/commands/create_content_pages.py b/lemarche/cms/management/commands/create_content_pages.py new file mode 100644 index 000000000..5b4d8ce4b --- /dev/null +++ b/lemarche/cms/management/commands/create_content_pages.py @@ -0,0 +1,55 @@ +import json + +from django.core.management.base import BaseCommand +from wagtail.models import Site + +from content_manager.models import ContentPage + + +class Command(BaseCommand): + help = """ + Creates a series of content pages. + """ + + def handle(self, *args, **kwargs): + try: + with open("lemarche/fixtures/cms_content_pages.json") as f: + pages_data = json.load(f) + except FileNotFoundError: + self.stdout.write( + self.style.ERROR("Le fichier content_manager/fixtures/cms_content_pages.json n'existe pas.") + ) + return + except json.JSONDecodeError: + self.stdout.write( + self.style.ERROR( + "Le fichier content_manager/fixtures/cms_content_pages.json n'est pas un fichier JSON valide." + ) + ) + return + + home_page = Site.objects.filter(is_default_site=True).first().root_page + + for page_data in pages_data: + slug = page_data["slug"] + title = page_data["title"] + body = page_data.get("body", []) + + self.create_content_page(slug, title, body, home_page) + + 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 diff --git a/lemarche/cms/migrations/0014_homepage_sub_header_custom_message.py b/lemarche/cms/migrations/0014_homepage_sub_header_custom_message.py new file mode 100644 index 000000000..65b579edc --- /dev/null +++ b/lemarche/cms/migrations/0014_homepage_sub_header_custom_message.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2.15 on 2024-10-23 10:31 + +import wagtail.fields +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ("cms", "0013_alter_articlepage_intro_alter_faqpage_intro"), + ] + + operations = [ + migrations.AddField( + model_name="homepage", + name="sub_header_custom_message", + field=wagtail.fields.StreamField( + [("message", 0)], + blank=True, + block_lookup={0: ("wagtail.blocks.RichTextBlock", (), {"label": "Message personnalisé du bandeau"})}, + help_text="Contenu affiché dans le bandeau sous l'en-tête.", + null=True, + verbose_name="Message personnalisé du bandeau", + ), + ), + ] diff --git a/lemarche/cms/models.py b/lemarche/cms/models.py index d964afd42..d96d85f53 100644 --- a/lemarche/cms/models.py +++ b/lemarche/cms/models.py @@ -6,6 +6,7 @@ from modelcluster.fields import ParentalManyToManyField from wagtail import blocks as wagtail_blocks from wagtail.admin.panels import FieldPanel, MultiFieldPanel +from wagtail.blocks import RichTextBlock from wagtail.contrib.routable_page.models import RoutablePageMixin, route from wagtail.fields import RichTextField, StreamField from wagtail.models import Page @@ -14,7 +15,6 @@ from lemarche.cms import blocks from lemarche.cms.forms import ArticlePageForm from lemarche.cms.snippets import ArticleCategory -from lemarche.pages.models import PageFragment class ArticleBase(Page): @@ -214,7 +214,18 @@ class HomePage(Page): use_json_field=True, ) + sub_header_custom_message = StreamField( + [ + ("message", RichTextBlock(label="Message personnalisé du bandeau")), + ], + blank=True, + null=True, + verbose_name="Message personnalisé du bandeau", + help_text="Contenu affiché dans le bandeau sous l'en-tête.", + ) + content_panels = Page.content_panels + [ + FieldPanel("sub_header_custom_message"), FieldPanel("banner_title"), FieldPanel("banner_subtitle"), FieldPanel("banner_arguments_list"), @@ -227,10 +238,7 @@ class HomePage(Page): def get_context(self, request, *args, **kwargs): context = super().get_context(request, *args, **kwargs) - try: - context["sub_header_custom_message"] = PageFragment.objects.get(title="Bandeau", is_live=True).content - except PageFragment.DoesNotExist: - pass + context["sub_header_custom_message"] = self.sub_header_custom_message return context diff --git a/lemarche/cms/tests/__init__.py b/lemarche/cms/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lemarche/cms/tests/test_commands.py b/lemarche/cms/tests/test_commands.py new file mode 100644 index 000000000..4973ad17e --- /dev/null +++ b/lemarche/cms/tests/test_commands.py @@ -0,0 +1,43 @@ +import json + +from django.core.management import call_command +from django.test import Client, TestCase +from wagtail.models import Site + +from content_manager.models import ContentPage + + +class CreateContentPagesCommandTests(TestCase): + def test_create_content_pages_with_json(self): + client = Client() + with open("lemarche/fixtures/cms_content_pages.json") as f: + pages_data = json.load(f) + + call_command("create_content_pages") + + # Check that the pages were created + for page_data in pages_data: + slug = page_data["slug"] + self.assertTrue( + ContentPage.objects.filter(slug=slug).exists(), msg=f"La page avec le slug '{slug}' n'a pas été créée." + ) + + response = client.get(f"/{slug}/") + self.assertEqual( + response.status_code, + 200, + msg=f"La page avec le slug '{slug}' n'est pas accessible (status: {response.status_code}).", + ) + + def test_prevent_duplicate_page_creation(self): + """Ensure the command does not create duplicate pages""" + home_page = Site.objects.get(is_default_site=True).root_page + home_page.add_child(instance=ContentPage(slug="mentions-legales", title="Mentions légales")) + + call_command("create_content_pages") + + self.assertEqual( + ContentPage.objects.filter(slug="mentions-legales").count(), + 1, + msg="Une page en double a été créée pour le slug 'mentions-legales'.", + ) diff --git a/lemarche/fixtures/cms_content_pages.json b/lemarche/fixtures/cms_content_pages.json new file mode 100644 index 000000000..3aab82175 --- /dev/null +++ b/lemarche/fixtures/cms_content_pages.json @@ -0,0 +1,32 @@ +[ + { + "slug": "qui-sommes-nous", + "title": "Qui sommes-nous ?", + "body": "[{\"id\": \"ca07e511-7624-45f1-ae95-3e783f782843\", \"type\": \"paragraph\", \"value\": \"

Le March\\u00e9 de l'inclusion est une plateforme d'achat et de sourcing \\u00e0 destination des acheteurs priv\\u00e9s et publics engag\\u00e9s pour l'Inclusion.

\\ud83d\\udc49 Vous \\u00eates un acheteur ?

Le March\\u00e9 de l'inclusion vous permet de :

\\ud83d\\udc49 Vous \\u00eates un prestataire inclusif (SIAE, EA, ESAT, GEIQ...) ?

Le March\\u00e9 de l'inclusion vous permet de :

\\ud83d\\udc49 Le March\\u00e9 de l\\u2019inclusion a \\u00e9t\\u00e9 con\\u00e7ue dans le cadre du Pacte IAE, un dispositif d\\u2019\\u00c9tat pour l\\u2019inclusion par l\\u2019emploi des personnes les plus \\u00e9loign\\u00e9es de l\\u2019emploi en raison de difficult\\u00e9s sociales, professionnelles, ou de sant\\u00e9. L\\u2019enjeu de la place de march\\u00e9 est d\\u2019accompagner le d\\u00e9veloppement \\u00e9conomique des structures inclusives et lever les freins \\u00e0 l\\u2019acte d\\u2019achat inclusif.

C\\u2019est une plateforme \\u00e9volutive port\\u00e9 par :

La r\\u00e9alisation et le d\\u00e9ploiement sont assur\\u00e9s par l\\u2019\\u00e9quipe Itou, qui travaille selon l\\u2019approche \\u201cstart-up d\\u2019Etat\\u201d. En savoir plus sur les start-ups d'Etat.

\"}]" + }, + { + "slug": "cgu", + "title": "Conditions générales d'utilisation du marché de l'inclusion", + "body": "[{\"id\": \"111b471b-7793-4068-b9a7-103c9673dea1\", \"type\": \"paragraph\", \"value\": \"

Les pr\\u00e9sentes conditions g\\u00e9n\\u00e9rales d\\u2019utilisation (dites \\u00ab CGU \\u00bb) fixent le cadre juridique du march\\u00e9 de l\\u2019inclusion.

Article 1 - Objet

Le march\\u00e9 de l\\u2019inclusion permet de mettre en visibilit\\u00e9 les offres des Entreprises Sociales Inclusives afin de r\\u00e9pondre aux besoins d\\u2019acheteurs engag\\u00e9s et solidaires qui recherchent un service de qualit\\u00e9 dans le respect de leur politique RSE.

Article 2 \\u2013 Champ d\\u2019application

Le march\\u00e9 de l\\u2019inclusion est un service num\\u00e9rique ouvert \\u00e0 toute entreprise souhaitant engager son action. Il s\\u2019agit en l\\u2019occurrence d\\u2019une place de march\\u00e9 qui met en relation :

Article 3 \\u2013 D\\u00e9finitions

\\u00ab L'Utilisateur \\u00bb est toute entreprise s\\u2019\\u00e9tant cr\\u00e9\\u00e9 un profil pour acc\\u00e9der au march\\u00e9 de l\\u2019inclusion.

Les \\u00ab Services \\u00bb sont les moyens offerts par le site pour r\\u00e9pondre \\u00e0 ses finalit\\u00e9s d\\u00e9finies.

\\u00ab L\\u2019\\u00e9diteur \\u00bb est la personne morale qui met \\u00e0 disposition du public un service de communication avec le public, en l\\u2019occurrence le march\\u00e9 de l\\u2019inclusion.

Article 4 - Fonctionnalit\\u00e9s

4.1 Cr\\u00e9ation du profil

En cr\\u00e9ant son profil, l\\u2019Utilisateur s\\u2019engage \\u00e0 fournir des informations sinc\\u00e8res et exactes permettant de cr\\u00e9er son compte ou son profil. La cr\\u00e9ation de compte est ouverte \\u00e0 toute personne morale correctement constitu\\u00e9e.

Tout acteur de l\\u2019inclusion peut s\\u2019y inscrire en remplissant :

La cr\\u00e9ation d\\u2019un profil est soumise \\u00e0 l\\u2019acceptation des pr\\u00e9sentes CGU.

4.2 Acc\\u00e9der \\u00e0 la liste des structures d\\u2019insertion

Le march\\u00e9 de l\\u2019inclusion permet \\u00e0 toute personne d\\u2019acc\\u00e9der \\u00e0 une cartographie des structures d\\u2019insertion et des entreprises adapt\\u00e9es de France.

Le march\\u00e9 de l\\u2019inclusion met \\u00e0 disposition un moteur de recherche permettant de filtrer les informations en fonction du :

4.3 Faire une demande \\u00e0 un prestataire

Les entreprises peuvent d\\u00e9poser une demande d\\u00e9crivant un besoin d\\u2019achat. Elles doivent pour ce faire d\\u00e9poser et remplir un questionnaire de pr\\u00e9sentation de la demande et permettant de la contacter (et notamment l\\u2019interlocuteur au sein de l\\u2019entreprise).

4.4 Offrir une prestation

Les Entreprises sociales inclusives peuvent pr\\u00e9senter leurs offres de service aux potentiels acheteurs, en \\u00ab publiant leur offre de prestation \\u00bb.

4.5 Autres fonctionnalit\\u00e9s

Le march\\u00e9 vise \\u00e9galement \\u00e0 proposer des conseils aux acheteurs pour accompagner et promouvoir les structures sociales et inclusives, notamment au travers d\\u2019une newsletter.

Article 5 - Responsabilit\\u00e9s

5.1 L\\u2019\\u00e9diteur du \\u00ab March\\u00e9 de l\\u2019inclusion \\u00bb

Les sources des informations diffus\\u00e9es sur le site \\u00ab https://lemarche.inclusion.beta.gouv.fr/fr/ \\u00bb sont r\\u00e9put\\u00e9es fiables mais le site ne garantit pas qu\\u2019il soit exempt de d\\u00e9fauts, d\\u2019erreurs ou d\\u2019omissions.

L\\u2019\\u00e9diteur s\\u2019autorise \\u00e0 suspendre ou r\\u00e9voquer n'importe quel compte et toutes les actions r\\u00e9alis\\u00e9es par ce biais, s\\u2019il estime que l\\u2019usage r\\u00e9alis\\u00e9 du service porte pr\\u00e9judice \\u00e0 son image ou ne correspond pas aux exigences de s\\u00e9curit\\u00e9. Il n\\u2019est pas responsable des propos tenus sur la plateforme.

L\\u2019\\u00e9diteur fournit les moyens n\\u00e9cessaires et raisonnables pour assurer un acc\\u00e8s continu, sans contrepartie financi\\u00e8re. Il se r\\u00e9serve la libert\\u00e9 de faire \\u00e9voluer, de modifier ou de suspendre, sans pr\\u00e9avis, le site pour des raisons de maintenance ou pour tout autre motif jug\\u00e9 n\\u00e9cessaire.

5.2 L\\u2019Utilisateur

L'Utilisateur s'assure de garder son mot de passe secret. Toute divulgation du mot de passe, quelle que soit sa forme, est interdite. Il assume les risques li\\u00e9s \\u00e0 l'utilisation de son identifiant et mot de passe.

Il s\\u2019engage \\u00e0 ne pas commercialiser les donn\\u00e9es re\\u00e7ues et \\u00e0 ne pas les communiquer \\u00e0 des tiers en dehors des cas pr\\u00e9vus par la loi.

Toute information transmise par l'Utilisateur est de sa seule responsabilit\\u00e9. L\\u2019Utilisateur communique des informations \\u00e0 jour et exactes notamment s\\u2019agissant des informations relatives au profil, sa situation personnelle et les missions propos\\u00e9es. Il veille \\u00e0 diffuser des contenus conformes \\u00e0 l\\u2019objet de la Plateforme, qui ne soient pas offensants ou inappropri\\u00e9s. Il est rappel\\u00e9 que toute personne proc\\u00e9dant \\u00e0 une fausse d\\u00e9claration pour elle-m\\u00eame ou pour autrui s\\u2019expose, notamment, aux sanctions pr\\u00e9vues \\u00e0 l\\u2019article 441-1 du code p\\u00e9nal, pr\\u00e9voyant des peines pouvant aller jusqu\\u2019\\u00e0 trois ans d\\u2019emprisonnement et 45 000 euros d\\u2019amende.

L\\u2019Utilisateur peut signaler toute description, information ou commentaire ne r\\u00e9pondant pas aux CGU. L\\u2019\\u00e9diteur se r\\u00e9serve le droit de supprimer et de mod\\u00e9rer sans pr\\u00e9avis, un Profil, une Mission ou un commentaire si les pr\\u00e9sentes r\\u00e8gles ne sont pas respect\\u00e9es.

Article 6 \\u2013 Propri\\u00e9t\\u00e9 intellectuelle

Les structures d'insertion inscrites sur le March\\u00e9 de l'inclusion renseignent sur leurs fiches commerciales des r\\u00e9f\\u00e9rences clients, notamment sous la forme d'une liste de logos.

Afin de garantir son bon fonctionnement, la plateforme du March\\u00e9 de l\\u2019inclusion, appose les logo, labels ou bien encore certifications, des entreprises inscrites, ainsi que des r\\u00e9f\\u00e9rences clients et des structures inclusives, sur tout type de support de communication pour les citer comme r\\u00e9f\\u00e9rences.

La plateforme se r\\u00e9serve \\u00e9galement le droit d\\u2019apposer les mises en relation effectu\\u00e9es entre Acheteurs et Structures inclusives, \\u00e0 titre d\\u2019exemple, sur tout type de supports de communication. L\\u2019Acheteur voulant garder la relation confidentielle doit en informer la plateforme.

Les clients, entreprises ou structures qui sont r\\u00e9f\\u00e9renc\\u00e9s gardent l\\u2019int\\u00e9gralit\\u00e9 des droits de propri\\u00e9t\\u00e9 intellectuelle.

Toutefois, toute publication des r\\u00e9f\\u00e9rences sous quelque forme que ce soit (logo, marque,\\u2026) sur le site implique la d\\u00e9l\\u00e9gation du droit non exclusif et gratuit au March\\u00e9 de l\\u2019inclusion de repr\\u00e9senter, reproduire, adapter, distribuer et diffuser la r\\u00e9f\\u00e9rence n\\u2019importe o\\u00f9 et sur n\\u2019importe quel support pour la dur\\u00e9e de la propri\\u00e9t\\u00e9 intellectuelle, notamment tous les supports de communication (site internet, post r\\u00e9seaux sociaux, newsletter ...).

La plateforme du March\\u00e9 de l\\u2019inclusion d\\u00e9cline toute responsabilit\\u00e9 quant \\u00e0 la v\\u00e9racit\\u00e9 de ces informations, seule le client, entreprise ou structure est responsable des informations qu\\u2019elle indique en acc\\u00e9dant \\u00e0 la plateforme.

Article 7 - Mise \\u00e0 jour des conditions d\\u2019utilisation

Les termes des pr\\u00e9sentes conditions d\\u2019utilisation peuvent \\u00eatre amend\\u00e9s \\u00e0 tout moment, sans pr\\u00e9avis, en fonction des modifications apport\\u00e9es au site, de l\\u2019\\u00e9volution de la l\\u00e9gislation ou pour tout autre motif jug\\u00e9 n\\u00e9cessaire.

\"}]" + }, + { + "slug": "cgu-api", + "title": "Conditions générales d'utilisation de l'API du marché de l'inclusion", + "body": "[{\"id\": \"f66f8606-0b22-4a96-9924-63a31e41e0c6\", \"type\": \"paragraph\", \"value\": \"

Les pr\\u00e9sentes conditions g\\u00e9n\\u00e9rales d\\u2019utilisation (dites \\u00ab CGU \\u00bb) fixent le cadre d\\u2019utilisation de l\\u2019interface de programmation (API) du March\\u00e9 de l\\u2019inclusion.

Article 1. Objet et champ d\\u2019application des pr\\u00e9sentes CGU

Les pr\\u00e9sentes CGU ont pour objet de d\\u00e9finir les conditions dans lesquelles le March\\u00e9 de l\\u2019Inclusion met \\u00e0 disposition son API (ci-apr\\u00e8s l\\u2019 \\u00ab API \\u00bb), ainsi que les obligations r\\u00e9ciproques de chaque partie dans le cadre de l\\u2019utilisation de ladite API.

L'API met \\u00e0 disposition le r\\u00e9pertoire qualifi\\u00e9 des structures d'insertion par l'activit\\u00e9 \\u00e9conomique.

Article 2. D\\u00e9finitions

\\u00ab API \\u00bb : Une API est une interface de programmation applicative, comprenant un ensemble de m\\u00e9thodes, fonctions et classes, mise \\u00e0 disposition par l\\u2019interm\\u00e9diaire d\\u2019une interface dont le but est d\\u2019offrir des services \\u00e0 d'autres logiciels. Il s\\u2019agit dans les pr\\u00e9sentes CGU de l\\u2019API du March\\u00e9 de l\\u2019inclusion.

\\u00ab CGU \\u00bb : Les pr\\u00e9sentes Conditions G\\u00e9n\\u00e9rales d\\u2019Utilisation de l\\u2019API d\\u00e9finissent les conditions d\\u2019acc\\u00e8s, d\\u2019usage et de fonctionnement de l\\u2019API.

\\u00ab Requ\\u00eate \\u00bb : une requ\\u00eate est une demande r\\u00e9alis\\u00e9e par un logiciel pour acc\\u00e9der aux donn\\u00e9es d'une base de donn\\u00e9es ou d'autres syst\\u00e8mes d'information et visant \\u00e0 obtenir une r\\u00e9ponse sp\\u00e9cifique.

\\u00ab Utilisateur \\u00bb : les utilisateurs de l\\u2019API comprennent les personnes physiques ou personnes morales ayant pr\\u00e9alablement accept\\u00e9 les pr\\u00e9sentes CGU avant la soumission du formulaire d\\u2019inscription.

Article 3. Acceptation des CGU et acc\\u00e8s \\u00e0 l\\u2019API

L\\u2019Utilisateur doit compl\\u00e9ter une demande d\\u2019inscription pr\\u00e9alablement \\u00e0 l\\u2019ouverture de l\\u2019acc\\u00e8s \\u00e0 l\\u2019API. La demande d\\u2019adh\\u00e9sion au dispositif emporte l\\u2019acceptation des pr\\u00e9sentes.

L\\u2019Utilisateur v\\u00e9rifie qu\\u2019il remplit les conditions d\\u2019acc\\u00e8s pr\\u00e9sent\\u00e9es par les pr\\u00e9sentes et pris connaissance de l\\u2019ensemble des CGU avant l\\u2019utilisation de l\\u2019API et les acceptent sans r\\u00e9serve avant toute soumission d\\u2019un formulaire d\\u2019inscription. La demande est instruite par les repr\\u00e9sentants du March\\u00e9 de l\\u2019inclusion, la validation de la demande se traduit par la distribution d\\u2019un jeton (token) rattach\\u00e9 \\u00e0 la demande.

L\\u2019acc\\u00e8s \\u00e0 l\\u2019API peut \\u00eatre suspendu ou r\\u00e9voqu\\u00e9 de mani\\u00e8re temporaire ou permanente \\u00e0 l\\u2019article 9 des pr\\u00e9sentes.

Article 4. Modification des CGU

Les termes des pr\\u00e9sentes conditions d\\u2019utilisation peuvent \\u00eatre amend\\u00e9s \\u00e0 tout moment, sans pr\\u00e9avis, en fonction des modifications apport\\u00e9es \\u00e0 la plateforme, de l\\u2019\\u00e9volution de la l\\u00e9gislation ou pour tout autre motif jug\\u00e9 n\\u00e9cessaire.

Article 5. Description de l\\u2019API

L\\u2019API a pour but de faciliter :

L\\u2019API du March\\u00e9 de l\\u2019inclusion vous donne acc\\u00e8s \\u00e0 la liste des :

Article 6. Conditions d\\u2019acc\\u00e8s

L\\u2019acc\\u00e8s est soumis \\u00e0 la cr\\u00e9ation d\\u2019un compte. Peuvent cr\\u00e9er un compte les repr\\u00e9sentants des personnes morales suivantes : une entreprise sociale, un acheteur, un partenaire de la plateforme de l\\u2019inclusion.

Les Utilisateurs sont responsables des identifiants utilis\\u00e9s pour acc\\u00e9der \\u00e0 leur compte puis \\u00e0 l\\u2019API du March\\u00e9 de l\\u2019inclusion. En ce sens ils doivent respecter l\\u2019\\u00e9tat de l\\u2019art en mati\\u00e8re de s\\u00e9curit\\u00e9 informatique dans l\\u2019usage de ces identifiants.

Article 7. Responsabilit\\u00e9s

7.1 L\\u2019\\u00e9diteur de la Plateforme

En tant qu\\u2019\\u00e9diteur de la Plateforme, le March\\u00e9 de l\\u2019inclusion ne saurait encourir une quelconque responsabilit\\u00e9, \\u00e0 quelque titre que ce soit, du fait des donn\\u00e9es qu\\u2019elle expose sur l\\u2019API.

L\\u2019API peut \\u00eatre indisponible, son acc\\u00e8s n\\u2019est pas garanti et il n\\u2019existe aucun niveau minimal de disponibilit\\u00e9 de celle-ci.

Le March\\u00e9 de l\\u2019inclusion ne peut \\u00eatre, \\u00e0 aucun titre, tenue pour responsable de la cr\\u00e9ation, de la modification, de la suppression des donn\\u00e9es d\\u00e9riv\\u00e9es. Le format de la donn\\u00e9e est susceptible d\\u2019\\u00e9voluer au gr\\u00e9 du d\\u00e9veloppement de l\\u2019API et des retours des consommateurs de l\\u2019API.

La March\\u00e9 de l\\u2019inclusion s\\u2019engage de prendre toute mesure n\\u00e9cessaire de nature \\u00e0 garantir la s\\u00e9curit\\u00e9 et la confidentialit\\u00e9 des informations fournies par l\\u2019usager et notamment emp\\u00eacher qu\\u2019elles soient d\\u00e9form\\u00e9es, endommag\\u00e9es ou que des tiers non autoris\\u00e9s y aient acc\\u00e8s.

7.2 L\\u2019Utilisateur

L\\u2019Utilisateur est seul responsable de l\\u2019usage qu\\u2019il fait de l\\u2019API, lequel doit \\u00eatre strictement conformes aux lois et r\\u00e9glementations en vigueur.

L\\u2019Utilisateur reconnait avoir lu les pr\\u00e9sentes CGU et s\\u2019engage \\u00e0 :

S\\u2019agissant de l\\u2019utilisation des donn\\u00e9es mises \\u00e0 disposition, l\\u2019Utilisateur reconnait avoir lu les pr\\u00e9sentes CGU et s\\u2019engage \\u00e0 :

Article 8. Usage commercial des donn\\u00e9es et de l\\u2019API

L\\u2019Utilisateur s\\u2019engage \\u00e0 ne pas commercialiser les donn\\u00e9es re\\u00e7ues et \\u00e0 ne pas les communiquer \\u00e0 des tiers en dehors des cas pr\\u00e9vus par la loi. Tout usage des donn\\u00e9es transmises \\u00e0 des fins de prospection commerciale, ainsi que toute vente des donn\\u00e9es, est proscrite

L\\u2019Utilisateur assumera seul une action engageant sa responsabilit\\u00e9 contractuelle ou extracontractuelle li\\u00e9e directement ou indirectement \\u00e0 son utilisation de l\\u2019API.

Le March\\u00e9 de l\\u2019Inclusion ne pourra \\u00eatre tenu responsable d\\u2019un quelconque dommage subi par un Utilisateur ou un tiers utilisant une application fond\\u00e9e sur les donn\\u00e9es expos\\u00e9es par l\\u2019API.

Article 9. Propri\\u00e9t\\u00e9 intellectuelle : autorisation d\\u2019usage des logos et des r\\u00e9f\\u00e9rences des partenaires

Les Utilisateurs du March\\u00e9 de l\\u2019Inclusion autorisent express\\u00e9ment la Plateforme \\u00e0 faire usage du nom, du logo et de la d\\u00e9nomination de leur personne morale dans le cadre du service et de la communication relative \\u00e0 la Plateforme.

Article 10. Manquements aux CGU

Le March\\u00e9 de l\\u2019Inclusion se r\\u00e9serve le droit de suspendre, sans notification pr\\u00e9alable, l\\u2019acc\\u00e8s \\u00e0 son API \\u00e0 des Utilisateurs qui ne respecteraient pas les pr\\u00e9sentes CGU ou qui feraient un usage de l\\u2019API contraire aux lois et r\\u00e9glementations en vigueur.

L\\u2019Utilisateur sera malgr\\u00e9 tout notifi\\u00e9 de cette suspension dans un d\\u00e9lai raisonnable. L\\u2019Utilisateur ne pourra pr\\u00e9tendre \\u00e0 une quelconque indemnisation.

\"}]" + }, + { + "slug": "confidentialite", + "title": "Politique de confidentialité du marché de l'inclusion", + "body": "[{\"id\": \"a4d47f83-cea4-4fa4-abc5-8242c5901ade\", \"type\": \"paragraph\", \"value\": \"

Qui est responsable du march\\u00e9 de l\\u2019inclusion ?

Le site du March\\u00e9 de l\\u2019inclusion est d\\u00e9velopp\\u00e9 au sein du GIP Plateforme de l\\u2019inclusion. Le March\\u00e9 de l\\u2019inclusion propose un service num\\u00e9rique qui rend visible les entreprises sociales inclusives.

Le responsable de l\\u2019utilisation des donn\\u00e9es est le GIP Plateforme de l\\u2019inclusion, repr\\u00e9sent\\u00e9 par Arnaud Denoix, Directeur du GIP Plateforme de l\\u2019inclusion.

Pourquoi traitons-nous ces donn\\u00e9es ?

Le March\\u00e9 de l\\u2019inclusion traite des donn\\u00e9es \\u00e0 caract\\u00e8re personnel pour les raisons suivantes :

Quelles sont les donn\\u00e9es que nous traitons ?

Le site peut traiter les donn\\u00e9es \\u00e0 caract\\u00e8re personnel suivantes :

Qu\\u2019est-ce qui nous autorise \\u00e0 traiter ces donn\\u00e9es ?

Le March\\u00e9 de l\\u2019inclusion traite des donn\\u00e9es \\u00e0 caract\\u00e8re personnel en se basant sur :

Cette mission d\\u2019int\\u00e9r\\u00eat public ou relevant de l\\u2019exercice de l\\u2019autorit\\u00e9 publique est mise en \\u0153uvre par :

Pendant combien de temps conservons-nous ces donn\\u00e9es ?

Types de donn\\u00e9es

Dur\\u00e9e de conservation

Donn\\u00e9es relatives aux profils

Jusqu\\u2019\\u00e0 la suppression du profil ou le cas \\u00e9ch\\u00e9ant 3 ans apr\\u00e8s la derni\\u00e8re utilisation du profil.

Donn\\u00e9es relatives \\u00e0 la demande de sourcing

1 an, \\u00e0 compter de la demande ou jusqu\\u2019\\u00e0 1 an apr\\u00e8s la derni\\u00e8re utilisation du profil ayant r\\u00e9alis\\u00e9 la demande.

Donn\\u00e9es relatives \\u00e0 la newsletter

Les donn\\u00e9es sont conserv\\u00e9es jusqu\\u2019\\u00e0 d\\u00e9sinscription \\u00e0 la newsletter.

Donn\\u00e9es relatives aux formulaires de besoin d\\u2019achat non finalis\\u00e9s

Jusqu\\u2019\\u00e0 la relance des \\u00e9quipes du March\\u00e9 de l\\u2019inclusion ou le cas \\u00e9ch\\u00e9ant, 1 an apr\\u00e8s le remplissage du formulaire par l\\u2019Utilisateur.

Donn\\u00e9es statistiques des \\u00e9changes lors des mises en relation 6 mois \\u00e0 compter de la demande

Quels droits avez-vous ?

Vous disposez :

Pour exercer ces droits ou pour toute question sur le traitement de vos donn\\u00e9es dans ce dispositif, vous pouvez nous contacter : dpo@numericite.eu

Vous pouvez exercer vos droits \\u00e9galement en adressant un courrier \\u00e0 l\\u2019attention du D\\u00e9l\\u00e9gu\\u00e9 \\u00e0 la protection des donn\\u00e9es du GIP de l\\u2019inclusion par courrier :

Groupement de l\\u2019inclusion

127 rue de Grenelle

75007 Paris

Puisque ce sont des droits personnels, nous ne traiterons votre demande que si nous sommes en mesure de vous identifier. Dans le cas o\\u00f9 nous ne parvenons pas \\u00e0 vous identifier, nous pouvons \\u00eatre amen\\u00e9s \\u00e0 vous demander une preuve de votre identit\\u00e9.

Pour vous aider dans votre d\\u00e9marche, vous trouverez un mod\\u00e8le de courrier \\u00e9labor\\u00e9 par la CNIL : https://www.cnil.fr/fr/modele/courrier/exercer-son-droit-dacces

Nous nous engageons \\u00e0 vous r\\u00e9pondre dans un d\\u00e9lai raisonnable qui ne saurait d\\u00e9passer 1 mois \\u00e0 compter de la r\\u00e9ception de votre demande.

Qui va avoir acc\\u00e8s \\u00e0 ces donn\\u00e9es ?

Les acc\\u00e8s aux donn\\u00e9es sont strictement encadr\\u00e9s et juridiquement justifi\\u00e9s. Les personnes suivantes vont avoir acc\\u00e8s aux donn\\u00e9es :

Quelles mesures de s\\u00e9curit\\u00e9 mettons-nous en place ?

Nous mettons en place plusieurs mesures pour s\\u00e9curiser les donn\\u00e9es :

Quels sont nos sous-traitants ?

Partenaire

Pays destinataire

Traitement r\\u00e9alis\\u00e9

Garanties

Clever Cloud

France

H\\u00e9bergement

https://www.clever-cloud.com/fr/conditions-generales-dutilisation/accord-de-traitement-des-donnees/

Hubspot

\\u00c9tats-Unis

Gestion de la relation client

https://legal.hubspot.com/fr/privacy-policy

Crisp

France

Support/Chat

https://storage.crisp.chat/public/documents/Crisp%20Privacy%20Policy%20FR.pdf

Matomo

Union Europ\\u00e9enne

Mesure d\\u2019audience

https://fr.matomo.org/privacy-policy/

Google Analytics

\\u00c9tats-Unis

Mesure d\\u2019audience

https://policies.google.com/privacy?hl=fr

Cookies

En application de l\\u2019article 5(3) de la directive 2002/58/CE modifi\\u00e9e concernant le traitement des donn\\u00e9es \\u00e0 caract\\u00e8re personnel et la protection de la vie priv\\u00e9e dans le secteur des communications \\u00e9lectroniques, transpos\\u00e9e \\u00e0 l\\u2019article 82 de la loi n\\u00b078-17 du 6 janvier 1978 relative \\u00e0 l\\u2019informatique, aux fichiers et aux libert\\u00e9s, les traceurs ou cookies suivent deux r\\u00e9gimes distincts.

Les cookies strictement n\\u00e9cessaires au service ou ayant pour finalit\\u00e9 exclusive de faciliter la communication par voie \\u00e9lectronique sont dispens\\u00e9s de consentement pr\\u00e9alable au titre de l\\u2019article 82 de la loi n\\u00b078-17 du 6 janvier 1978.

Les cookies n\\u2019\\u00e9tant pas strictement n\\u00e9cessaires au service ou n\\u2019ayant pas pour finalit\\u00e9 exclusive de faciliter la communication par voie \\u00e9lectronique doivent \\u00eatre consenti par l\\u2019utilisateur.

Ce consentement de la personne concern\\u00e9e pour une ou plusieurs finalit\\u00e9s sp\\u00e9cifiques constitue une base l\\u00e9gale au sens du RGPD et doit \\u00eatre entendu au sens de l'article 6-1 a) du R\\u00e8glement (UE) 2016/679 du Parlement europ\\u00e9en et du Conseil du 27 avril 2016 relatif \\u00e0 la protection des personnes physiques \\u00e0 l'\\u00e9gard du traitement des donn\\u00e9es \\u00e0 caract\\u00e8re personnel et \\u00e0 la libre circulation de ces donn\\u00e9es.

\\u00c0 tout moment, vous pouvez refuser l\\u2019utilisation des cookies et d\\u00e9sactiver le d\\u00e9p\\u00f4t sur votre ordinateur en utilisant la fonction d\\u00e9di\\u00e9e de votre navigateur (fonction disponible notamment sur Microsoft Edge, Google Chrome, Mozilla Firefox, Apple Safari et Opera). L\\u2019utilisateur peut, \\u00e0 tout moment, autoriser ou interdire le suivi des cookies gr\\u00e2ce au panneau de gestion des cookies \\u00ab tarteaucitron \\u00bb en bas de l\\u2019\\u00e9cran.

La plateforme du March\\u00e9 de l\\u2019inclusion utilise Matomo pour la mesure d\\u2019audience. La plateforme ne configure pas Matomo en mode exempt\\u00e9 et n\\u00e9cessite donc le consentement des utilisateurs conform\\u00e9ment aux recommandations de la CNIL. L\\u2019utilisateur peut refuser le suivi r\\u00e9alis\\u00e9 par Matomo gr\\u00e2ce au bandeau cookies sur la plateforme.

Il convient d'indiquer que :

Cookies recens\\u00e9s sur le March\\u00e9 de l\\u2019inclusion :

Cookie

Pays destinataire

Traitement r\\u00e9alis\\u00e9

Base l\\u00e9gale

Dur\\u00e9e de conservation

Garanties

Matomo

France

Mesure d\\u2019audience

Consentement ou d\\u00e9rogation article 82 LIL

13 mois

https://fr.matomo.org/privacy-policy/

Google analytics

\\u00c9tats-Unis

Mesure d\\u2019audience

Consentement ou d\\u00e9rogation article 82 LIL

13 mois

https://policies.google.com/privacy?hl=fr

Crisp

Pays-Bas

Support

Consentement ou d\\u00e9rogation article 82 LIL

13 mois

https://crisp.chat/fr/privacy/

March\\u00e9 de l\\u2019inclusion (ID session)

France

Conservation des formulaires non finalis\\u00e9s

Aucune

Session

https://lemarche.inclusion.beta.gouv.fr/confidentialite/

Inbound parsingFranceSuivi statistique des \\u00e9changes lors des mises en relationAucune6 moishttps://lemarche.inclusion.beta.gouv.fr/confidentialite/

Pour aller plus loin, vous pouvez consulter les \\ufb01ches propos\\u00e9es par la Commission Nationale de l'Informatique et des Libert\\u00e9s (CNIL) :

\"}]" + }, + { + "slug": "mentions-legales", + "title": "Mentions légales", + "body": "[{\"id\": \"80869c9e-9094-4408-81be-f1e2a90c3257\", \"type\": \"paragraph\", \"value\": \"

\\u00c9diteur du site

Le Groupement d\\u2019Int\\u00e9r\\u00eat Public \\u00ab Plateforme de l\\u2019inclusion \\u00bb
127 Rue de Grenelle
75007 Paris
France

Directeur de la publication

Monsieur Arnaud DENOIX, Directeur

H\\u00e9bergement du site

Clever Cloud SAS
5, passage de l\\u2019industrie
92130 Issy-Les-Moulineaux
France

\"}]" + }, + { + "slug": "accessibilite", + "title": "Déclaration d'accessibilité", + "body": "[{\"id\": \"f1c037b9-6312-4779-9b77-1d597b2c58e9\", \"type\": \"paragraph\", \"value\": \"

La D\\u00e9l\\u00e9gation g\\u00e9n\\u00e9rale \\u00e0 l'Emploi et \\u00e0 la Formation professionnelle s'engage \\u00e0 rendre son service accessible, conform\\u00e9ment \\u00e0 l'article 47 de la loi n\\u00b0 2005-102 du 11 f\\u00e9vrier 2005.

\\u00c9tat de conformit\\u00e9

Le march\\u00e9 de l'inclusion est non conforme avec le RGAA 4.1. Le site n'a pas encore \\u00e9t\\u00e9 audit\\u00e9.

\\u00c9tablissement de cette d\\u00e9claration d'accessibilit\\u00e9

Cette d\\u00e9claration a \\u00e9t\\u00e9 \\u00e9tablie le 13 janvier 2023.

Am\\u00e9lioration et contact

Nous essayons de r\\u00e9pondre dans les 2 jours ouvr\\u00e9s.

Voie de recours

Vous pouvez :

\"}]" + } +] diff --git a/lemarche/pages/admin.py b/lemarche/pages/admin.py deleted file mode 100644 index 97f4aed7f..000000000 --- a/lemarche/pages/admin.py +++ /dev/null @@ -1,51 +0,0 @@ -from ckeditor.widgets import CKEditorWidget -from django.contrib import admin -from django.contrib.flatpages.admin import FlatPageAdmin -from django.db import models - -from lemarche.pages.models import Page, PageFragment -from lemarche.utils.admin.admin_site import admin_site - - -@admin.register(Page, site=admin_site) -class PageAdmin(FlatPageAdmin): - list_display = ["url", "title", "created_at", "updated_at"] - - readonly_fields = ["created_at", "updated_at"] - formfield_overrides = {models.TextField: {"widget": CKEditorWidget}} - - fieldsets = ( - ( - None, - { - "fields": ("url", "title", "content"), - }, - ), - ("SEO", {"fields": ("meta_title", "meta_description")}), - ("Dates", {"fields": ("created_at", "updated_at")}), - ) - - -@admin.register(PageFragment, site=admin_site) -class PageFragmentAdmin(admin.ModelAdmin): - list_display = ["title", "is_live", "created_at", "updated_at"] - - readonly_fields = ["created_at", "updated_at"] - formfield_overrides = {models.TextField: {"widget": CKEditorWidget}} - - fieldsets = ( - ( - None, - { - "fields": ("title", "content"), - }, - ), - ("Affichage", {"fields": ("is_live",)}), - ("Dates", {"fields": ("created_at", "updated_at")}), - ) - - def get_readonly_fields(self, request, obj=None): - # title cannot be changed (to avoid query errors) - if obj: - return self.readonly_fields + ["title"] - return self.readonly_fields diff --git a/lemarche/pages/migrations/0003_remove_page_flatpage_ptr_delete_pagefragment_and_more.py b/lemarche/pages/migrations/0003_remove_page_flatpage_ptr_delete_pagefragment_and_more.py new file mode 100644 index 000000000..bb3893623 --- /dev/null +++ b/lemarche/pages/migrations/0003_remove_page_flatpage_ptr_delete_pagefragment_and_more.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.15 on 2024-11-19 17:34 + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ("pages", "0002_pagefragment"), + ] + + operations = [ + migrations.RemoveField( + model_name="page", + name="flatpage_ptr", + ), + migrations.DeleteModel( + name="PageFragment", + ), + migrations.DeleteModel( + name="Page", + ), + ] diff --git a/lemarche/pages/models.py b/lemarche/pages/models.py index c54abd92b..e69de29bb 100644 --- a/lemarche/pages/models.py +++ b/lemarche/pages/models.py @@ -1,54 +0,0 @@ -from django.contrib.flatpages.models import FlatPage -from django.db import models -from django.utils import timezone - - -class Page(FlatPage): - """ - A static page that can be created/customized in admin. - https://docs.djangoproject.com/en/3.2/ref/contrib/flatpages/ - - fields: title, url, content... - """ - - meta_title = models.CharField( - verbose_name="Titre (balise meta)", - max_length=100, - blank=True, - default="", - help_text=( - "Le titre qui sera affiché dans les SERPs. " - "Il est recommandé de le garder < 60 caractères. " - "Laissez vide pour réutiliser le titre de la page." - ), - ) - meta_description = models.TextField( - verbose_name="Description (balise meta)", - max_length=255, - blank=True, - default="", - help_text="La description qui sera affichée dans les SERPs. À garder < 150 caractères.", - ) - - created_at = models.DateTimeField(verbose_name="Date de création", default=timezone.now) - updated_at = models.DateTimeField(verbose_name="Date de modification", auto_now=True) - - -class PageFragment(models.Model): - title = models.CharField(verbose_name="Titre", max_length=255, unique=True) - content = models.TextField(verbose_name="Contenu", blank=True) - - is_live = models.BooleanField( - verbose_name="Visible", default=True, help_text="Laisser vide pour cacher le contenu dans l'application" - ) - - created_at = models.DateTimeField(verbose_name="Date de création", default=timezone.now) - updated_at = models.DateTimeField(verbose_name="Date de modification", auto_now=True) - - class Meta: - verbose_name = "Fragment de page" - verbose_name_plural = "Fragments de page" - ordering = ["title"] - - def __str__(self): - return self.title diff --git a/lemarche/templates/api/home.html b/lemarche/templates/api/home.html index 0f615a792..5689b6f34 100644 --- a/lemarche/templates/api/home.html +++ b/lemarche/templates/api/home.html @@ -30,7 +30,7 @@

L'API met à disposition le répertoire qualifié des structures

Conditions générales d'utilisation

- Lire les conditions générales d'utilisation de l'API du marché de l'inclusion. + Lire les conditions générales d'utilisation de l'API du marché de l'inclusion.

diff --git a/lemarche/templates/auth/signup.html b/lemarche/templates/auth/signup.html index dad15303c..9a4e5cb2c 100644 --- a/lemarche/templates/auth/signup.html +++ b/lemarche/templates/auth/signup.html @@ -128,7 +128,7 @@

Création du mot de passe

{{ form.accept_rgpd }}
diff --git a/lemarche/templates/layouts/_footer.html b/lemarche/templates/layouts/_footer.html index 8688b51f5..b0dcdd486 100644 --- a/lemarche/templates/layouts/_footer.html +++ b/lemarche/templates/layouts/_footer.html @@ -24,9 +24,9 @@
@@ -71,19 +71,19 @@ Plan du site