diff --git a/atlas/atlasRoutes.py b/atlas/atlasRoutes.py index 21b95163..1335d50e 100644 --- a/atlas/atlasRoutes.py +++ b/atlas/atlasRoutes.py @@ -207,12 +207,18 @@ def index(): connection.close() session.close() + personal_data = False + args_personal_data = request.args.get("personal_data") + if args_personal_data and args_personal_data.lower() == "true": + personal_data = True + return render_template( "templates/home/_main.html", observations=observations, mostViewTaxon=mostViewTaxon, customStatMedias=customStatMedias, lastDiscoveries=lastDiscoveries, + personal_data=personal_data, ) diff --git a/atlas/configuration/config_schema.py b/atlas/configuration/config_schema.py index e1e292cd..dcd8045d 100644 --- a/atlas/configuration/config_schema.py +++ b/atlas/configuration/config_schema.py @@ -131,6 +131,7 @@ class Meta: AFFICHAGE_LOGOS_HOME = fields.Boolean(load_default=True) AFFICHAGE_FOOTER = fields.Boolean(load_default=True) AFFICHAGE_RGPD = fields.Boolean(load_default=True) + OREJIME_APPS = fields.List(fields.Dict(), load_default=[]) AFFICHAGE_STAT_GLOBALES = fields.Boolean(load_default=True) AFFICHAGE_DERNIERES_OBS = fields.Boolean(load_default=True) AFFICHAGE_EN_CE_MOMENT = fields.Boolean(load_default=True) diff --git a/atlas/static/custom/templates/footer.html.sample b/atlas/static/custom/templates/footer.html.sample index 4ce97603..609b70a4 100644 --- a/atlas/static/custom/templates/footer.html.sample +++ b/atlas/static/custom/templates/footer.html.sample @@ -5,10 +5,11 @@ data-target="#modalCredits">{{ _('credits') }} | {{ _('legal') }} - {% if configuration.AFFICHAGE_RGPD %} + {% if configuration.AFFICHAGE_RGPD and configuration.OREJIME_APPS | length > 0 %} | {{ _('personal_data') }} + | {{ _('preferences_cookies') }} {% endif %} @@ -74,22 +75,30 @@ {% endif %} -{% if configuration.ID_GOOGLE_ANALYTICS != "UA-xxxxxxx-xx" %} - - + ga('create', '{{configuration.ID_GOOGLE_ANALYTICS}}', 'auto'); + ga('send', 'pageview'); + + {% endif %} + {% endfor %} {% endif %} diff --git a/atlas/static/main.js b/atlas/static/main.js index 92fb2f89..87624d33 100644 --- a/atlas/static/main.js +++ b/atlas/static/main.js @@ -139,3 +139,22 @@ if (configuration.GLOSSAIRE) { }); }); } + +if (configuration.OREJIME_APPS.length > 0) { + var orejimeConfig = { + elementID: "orejime", + appElement: "main", + cookieName: "orejime", + cookieExpiresAfterDays: 365, + privacyPolicy: "/?personal_data=true", + default: true, + mustConsent: false, + mustNotice: false, + lang: configuration.DEFAULT_LANGUAGE, + logo: false, + debug: configuration.modeDebug, + translations: configuration.OREJIME_TRANSLATIONS, + apps: configuration.OREJIME_APPS, + categories: configuration.OREJIME_CATEGORIES + } +} diff --git a/atlas/static/package-lock.json b/atlas/static/package-lock.json index f8dfea67..e41de16a 100644 --- a/atlas/static/package-lock.json +++ b/atlas/static/package-lock.json @@ -398,6 +398,14 @@ "@babel/helper-plugin-utils": "^7.14.5" } }, + "@babel/runtime": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, "@babel/template": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", @@ -1443,6 +1451,11 @@ "strip-final-newline": "^2.0.0" } }, + "exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" + }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -2330,8 +2343,7 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "3.14.1", @@ -2462,6 +2474,14 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2586,6 +2606,11 @@ "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2618,6 +2643,15 @@ "word-wrap": "~1.2.3" } }, + "orejime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/orejime/-/orejime-2.3.0.tgz", + "integrity": "sha512-eDUgd5yEF5pCIUHPNXVDKmgH+4k4GEwxU7eexBFeVESba3ZYDHSDq4ULXiF2LnZwxg+H6Qi28o8rGfGxNeOriA==", + "requires": { + "@babel/runtime": "^7.1.2", + "react-modal": "^3.13.1" + } + }, "p-each-series": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", @@ -2743,6 +2777,23 @@ "sisteransi": "^1.0.5" } }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -2769,6 +2820,27 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-modal": { + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", + "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", + "requires": { + "exenv": "^1.2.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + } + }, + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3135,6 +3207,14 @@ "makeerror": "1.0.x" } }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, "webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", diff --git a/atlas/static/package.json b/atlas/static/package.json index 9a365048..a2b43581 100644 --- a/atlas/static/package.json +++ b/atlas/static/package.json @@ -33,6 +33,7 @@ "leaflet.snogylop": "^0.4.0", "leaflet.zoomhome": "^1.0.0", "lightbox2": "^2.8.2", + "orejime": "^2.3.0", "popper.js": "^1.16.0", "raphael": "^2.2.0", "slick": "^1.12.2", diff --git a/atlas/templates/core/assets_header.html b/atlas/templates/core/assets_header.html index 83d4efc8..4ec8ba92 100644 --- a/atlas/templates/core/assets_header.html +++ b/atlas/templates/core/assets_header.html @@ -38,4 +38,8 @@ + + + + {% endblock %} diff --git a/atlas/templates/home/_main.html b/atlas/templates/home/_main.html index 3c8c4b5b..f329ac3a 100644 --- a/atlas/templates/home/_main.html +++ b/atlas/templates/home/_main.html @@ -28,6 +28,12 @@ + {% if personal_data %} + + {% endif %} + {% endblock %} diff --git a/atlas/translations/en/LC_MESSAGES/messages.mo b/atlas/translations/en/LC_MESSAGES/messages.mo index 39dcdca5..b562afd9 100644 Binary files a/atlas/translations/en/LC_MESSAGES/messages.mo and b/atlas/translations/en/LC_MESSAGES/messages.mo differ diff --git a/atlas/translations/en/LC_MESSAGES/messages.po b/atlas/translations/en/LC_MESSAGES/messages.po index 8b6ec8e6..e355e67a 100644 --- a/atlas/translations/en/LC_MESSAGES/messages.po +++ b/atlas/translations/en/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-09-27 10:32+0200\n" +"POT-Creation-Date: 2024-11-27 10:43+0100\n" "PO-Revision-Date: 2021-07-12 12:12+0200\n" "Last-Translator: FULL NAME \n" "Language: en\n" @@ -47,6 +47,10 @@ msgstr "Legal mentions" msgid "personal_data" msgstr "Personal data" +#: static/custom/templates/footer.html:12 +msgid "preferences_cookies" +msgstr "Changing cookie preferences" + #: static/custom/templates/footer.html:17 #: static/custom/templates/footer.html.sample:17 msgid "atlas.fauna.flora" diff --git a/atlas/translations/fr/LC_MESSAGES/messages.mo b/atlas/translations/fr/LC_MESSAGES/messages.mo index 388a3706..2fa1099a 100644 Binary files a/atlas/translations/fr/LC_MESSAGES/messages.mo and b/atlas/translations/fr/LC_MESSAGES/messages.mo differ diff --git a/atlas/translations/fr/LC_MESSAGES/messages.po b/atlas/translations/fr/LC_MESSAGES/messages.po index 0c0ede54..897671cb 100644 --- a/atlas/translations/fr/LC_MESSAGES/messages.po +++ b/atlas/translations/fr/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-09-27 10:32+0200\n" +"POT-Creation-Date: 2024-11-27 10:38+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: fr\n" @@ -47,7 +47,11 @@ msgstr "Mentions légales" msgid "personal_data" msgstr "Données personnelles" -#: static/custom/templates/footer.html:17 +#: static/custom/templates/footer.html:12 +msgid "preferences_cookies" +msgstr "Modifier les préférences de cookies" + +#: static/custom/templates/footer.html:18 #: static/custom/templates/footer.html.sample:17 msgid "atlas.fauna.flora" msgstr "Atlas de la faune et de la flore" diff --git a/atlas/translations/it/LC_MESSAGES/messages.mo b/atlas/translations/it/LC_MESSAGES/messages.mo index f23daef2..dfcc56cd 100644 Binary files a/atlas/translations/it/LC_MESSAGES/messages.mo and b/atlas/translations/it/LC_MESSAGES/messages.mo differ diff --git a/atlas/translations/it/LC_MESSAGES/messages.po b/atlas/translations/it/LC_MESSAGES/messages.po index 9dcd3d1c..1dd19480 100644 --- a/atlas/translations/it/LC_MESSAGES/messages.po +++ b/atlas/translations/it/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-09-27 10:32+0200\n" +"POT-Creation-Date: 2024-11-27 10:43+0100\n" "PO-Revision-Date: 2021-07-19 09:53+0200\n" "Last-Translator: FULL NAME \n" "Language: it\n" @@ -47,6 +47,10 @@ msgstr "Nota legale" msgid "personal_data" msgstr "Dati personali" +#: atlas/static/custom/templates/footer.html:12 +msgid "preferences_cookies" +msgstr "" + #: static/custom/templates/footer.html:17 #: static/custom/templates/footer.html.sample:17 msgid "atlas.fauna.flora" diff --git a/docs/images/choice_rgpd.png b/docs/images/choice_rgpd.png new file mode 100644 index 00000000..ac222405 Binary files /dev/null and b/docs/images/choice_rgpd.png differ diff --git a/docs/rgpd.rst b/docs/rgpd.rst new file mode 100644 index 00000000..3588dc48 --- /dev/null +++ b/docs/rgpd.rst @@ -0,0 +1,139 @@ +La RGPD +======= + +À quoi sert la RGPD +------------------- + +Le règlement général sur la protection des données est utilisé afin de protéger les données à caractère personnel. + +Où configurer l'application +--------------------------- + +Dans le fichier : `atlas/configuration/config.py` + +La documentation correspondant à la configuration : https://github.com/empreinte-digitale/orejime + +- Définir les applications pour lesquelles il faut bloquer les cookies via la variable **OREJIME_APPS** + +:: + + OREJIME_APPS = [ + { + "name": "scripts-gtm", + "title": "Google Analytics", + "cookies": [ + "_ga", + "_gat", + "_gid", + "__utma", + "__utmb", + "__utmc", + "__utmt", + "__utmz", + ], + "purposes": ["analytics"], + "required": False, + "optOut": False, + "default": True, + "onlyOnce": True, + }, + { + "name": "second-script", + "title": "Deuxième script", + "cookies": [ + "_ga", + "_gat", + "_gid", + "__utma", + "__utmb", + "__utmc", + "__utmt", + "__utmz", + ], + "purposes": ["analytics"], + "required": False, + "optOut": False, + "default": True, + "onlyOnce": True, + } + ] + +- Il est possible de surcharger les traductions grâce à la variable : **OREJIME_TRANSLATIONS** + +:: + + OREJIME_TRANSLATIONS = { + "en": { + "consentModal": { + "description": "This is an example of how to override an existing translation already used by Orejime", + }, + "inlineTracker": { + "description": "Example of an inline tracking script", + }, + "externalTracker": { + "description": "Example of an external tracking script", + }, + "purposes": { + "analytics": "Analytics", + "security": "Security" + }, + "categories": { + "analytics": { + "description": "A long form description of the category." + } + } + }, + } + +- Il est possible de catégoriser les applications nécessaires afin de les intégrer dans les choix des utilisateurs. + +.. image :: images/choice_rgpd.png + + +:: + + OREJIME_CATEGORIES = [ + { + "name": "analytics", + "title": "Analytics", + "apps": [ + "scripts-gtm", + "second-script" + ] + } + ] + +Dans le fichier : `atlas/static/custom/templates/footer.html` + +- Dans le fichier, rajouter un **if** pour chacun des scripts à exécuter. + +Dans cet exemple, il s'agit d'un script de google analitics (le script `scripts-gtm` définit dans la configuration orejime dans le fichier `config.py`). + +:: + + {% if configuration.OREJIME_APPS|length > 0 %} + + {% for app in configuration.OREJIME_APPS %} + {% if app.name == "scripts-gtm" %} + + {% endif %} + {% endfor %} + {% endif %}