incubateur-ademe / nosgestesclimat-site

Estimez votre empreinte climat - le code du site
https://nosgestesclimat.fr
MIT License
70 stars 40 forks source link

URL dédié - Fonction "sondage" #231

Closed martinregner closed 2 years ago

martinregner commented 3 years ago

@laem @Benjamin-Boisserie-ABC je vous propose une première base simple pour avancer sur la conception de cette fonction d'url spécifique permettant à une organisation (collectivité, entreprise ...) de faire un "sondage NGC".

Les premières fonctionnalités attendues des échanges eus jusque là :

Qu'en pensez-vous ?

laem commented 3 years ago

Comme évoqué aujourd'hui je pense qu'il faut distinguer trois cas d'usages proches mais différents :

Voir #230

Il faut donc qu'on décide si l'on fait les développements spécifiques du mode sondage, ou si l'on laisse les (gros) acteurs le faire chez eux, et gérer eux mêmes leurs données.

martinregner commented 3 years ago

La demande d'avoir une fonction de type sondage remonte désormais environ une fois par semaine, et plutôt de la part de "petits" acteurs (collectivités, associations, PME ...) qui ne seront pas en capacité de réaliser des développements spécifiques. Il serait intéressant de réaliser ces développements mais en complétant progressivement cette fonctionnalité qui je pense peux être "simple" dans un premier temps :

- confidentialité de l'URL, unicité des réponses : Je ne vois pas ce qui est bloquant. Il est particulièrement classique qu'un sondage soit diffusé largement et qu'il soit possible de le remplir plusieurs fois. Au moins pour commencer, ce n'est pas une limitation à avoir. Les risques associés au "bourrage d'urne" dans le cas de NGC sont particulièrement faibles, tant dans leur probabilité (qui a vraiment "intérêt" à ça ?) que dans ses conséquences. Ces acteurs cherchent des tendances, en particulier sur le nombre de personnes touchées, pas un chiffre "exact" (si tenté que ce soit possible) sur leur bilan. On pourra tout à fait mettre tous les warnings nécessaires sur ce point (risque de double comptage, de "fuite" de leur URL, de limites dans l'interprétation statistique, etc.). (La majeure partie des utilisateurs de cette fonction attendra sans doute difficilement les quelques dizaines de réponses)

Au passage : certains font des campagnes de tests à la main : un stagiaire fait par exemple le tour des habitants d'une petite ville pour faire progressivement le bilan d'une partie de la commune.

- implications en termes de vie privée : Très schématiquement, la fonctionnalité s'apparente pour moi à collecter les URL de fin associés à un sondage donné. C'est ce que fait matomo, en moins user friendly ... et évidemment sans la surcouche indispensable de visualisation (moyennes par postes). Quelles seraient les contraintes supplémentaires ?

laem commented 3 years ago
  • confidentialité de l'URL, unicité des réponses :

OK, je le voyais pas comme ça mais pourquoi ne pas tenter :) ?

"petits" acteurs (collectivités, associations, PME ...) qui ne seront pas en capacité de réaliser des développements spécifiques.

Oui de toutes façons c'est pas beaucoup de boulot pour nous.

Très schématiquement, la fonctionnalité s'apparente pour moi à collecter les URL de fin associés à un sondage donné. C'est ce que fait matomo, en moins user friendly ... et évidemment sans la surcouche indispensable de visualisation (moyennes par postes). Quelles seraient les contraintes supplémentaires ?

Oui, mais si j'ai bien compris la RGPD, il ne s'agit pas que de ce qu'on collecte, mais pourquoi on le fait. Nous pour l'instant, on collecte les URL de fin "par défaut" via Matomo, on n'en fait pas grand chose, juste du suivi classique. S'il s'agit de faire un sondage, il s'agit alors de produire un rapport avec les données collectées. Je pense qu'il faudra donc avertir l'utilisateur de ce qu'il en sera fait.

@martinregner en termes d'implé, ça me semble intéressant de mutualiser avec ce qui est fait sur la branche conf, mais en changeant la base de données du P2P vers une mini-base de données. Reste à voir si on veut avoir la main sur la base de donnée, ou laisser les acteurs fournir leur URL de base de donnée, libre à eux de faire ce qu'ils veulent avec elle ensuite.

martinregner commented 3 years ago

Je pense qu'il faudra donc avertir l'utilisateur de ce qu'il en sera fait.

Ok, logique. Ajoutons un bandeau spécifique, genre : "Vous participez au sondage lancé par XXX qui aura simplement accès à votre résultat final, pas au détail de vos réponses qui ne sont pas stockées. Si vous ne voulez pas répondre à ce sondage, rdv sur la version classique NGC"

@martinregner en termes d'implé, ça me semble intéressant de mutualiser avec ce qui est fait sur la branche conf, mais en changeant la base de données du P2P vers une mini-base de données.

Carrément 👍 Pour moi l'utilisation / le rendu est le même, c'est "juste" le côté asynchrone. Quand ce n'est pas en conférence pour des questions de temps, tout un tas de collectifs (ex. classes de lycées ou promos, quartiers ...) pourront tout de même y répondre mais sur quelques jours.

Reste à voir si on veut avoir la main sur la base de donnée, ou laisser les acteurs fournir leur URL de base de donnée, libre à eux de faire ce qu'ils veulent avec elle ensuite.

Dans un premier temps, il faudrait pouvoir proposer une bdd pour les petits acteurs / collectifs, et pour limiter le frein à l'entrée sur l'utilisation de la fonction. Si pas trop compliqué, on pourra ensuite laisser l'héberger pour ceux qui le souhaitent.

laem commented 3 years ago

Voilà un lien pour comprendre les contraintes de vie privée dans le cadre de la création de données statistiques https://www.insee.fr/fr/statistiques/fichier/1300624/guide-secret.pdf

Oeuh commented 2 years ago

Bonjour,

Je souhaiterais intégrer sur mon site votre calculateur, avec la possibilité de récupérer les résultats de l'utilisateur. Mon besoin pourrait aider bon nombre d'autres acteurs de l'ESS qui n'ont pas les moyens de refaire le développement de votre calculateur à leur compte, et pour vous le diffuser facilement tout en gardant votre marque affichée.

Il suffirait pour le développeur de mettre deux balises, à savoir l'identifiant de son utilisateur (ex : "data-user_id"), et l'URL de destination pour recevoir les résultats (ex : "data-result_url"). Cela donnerait : <script id="nosgestesclimat" src="https://nosgestesclimat.fr/iframe.js" data-user_id="USER_ID" data-result_url="https://mon-site.com/resultats-a-traiter/"></script>

A la fin du formulaire, le site enverrait un dictionnaire JSON à l'URL indiquée avec les résultats.

Est-ce possible de faire ce développement ?

Merci !

laem commented 2 years ago

Bonjour @Oeuh, merci pour l'intérêt :)

Bonne nouvelle, ça existe déjà !

Il suffit d'ajouter à l'iframe le paramètre data-share-data=true. Le composant IframeDataShareModal va alors poser la question à l'utilisateur sur l'écran de fin : "êtes-vous ok pour partager vos données de simulation au site intégrateur de l'iframe ?".

C'est ici précisément https://github.com/datagir/nosgestesclimat-site/blob/master/source/sites/publicodes/IframeDataShareModal.tsx#L31

Je te laisse me dire si cela te convient ou s'il faut que l'on améliore ça, et pourquoi :)

Oeuh commented 2 years ago

Merci @laem !

Je n'ai pas l'habitude du langage de ton code et en essayant de voir si ça faisait un POST vers l'URL parente (hostname) ou quelque part dans la console du navigateur, je n'ai rien trouvé. Du coup, après avoir rajouté le paramètre data-share-data=true, comment faire pour capter le résultat ?

laem commented 2 years ago

Je pense que cette page de doc correspond. https://htmldom.dev/communication-between-an-iframe-and-its-parent-window/

En gros c'est ce bout de code là

window.addEventListener('message', function (e) {
    // Get the sent data
    const data = e.data;

    // If you encode the message in JSON before sending them,
    // then decode here
    // const decoded = JSON.parse(data);
});
Oeuh commented 2 years ago

@laem, désolé d'encore t'importuner. J'ai essayé ton code et cela ne marche pas sur Firefox ni Chrome. Voici mon test :

window.addEventListener('message', function (e) {
    // Get the sent data
    const data = e.data;

    console.log(data);
    const decoded = JSON.parse(data);
    console.log(decoded);
});

Le résultat dans la console : [iFrameSizer]iFrameResizer0:833:1215:transitionstart Uncaught SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data

Cela veut-il dire qu'un caractère spécial se cache dans le dictionnaire constitué ? Comment faire alors pour le gérer ?

laem commented 2 years ago

@Oeuh je déplace la discussion sur la PR de résolution du problème #386

laem commented 2 years ago
laem commented 2 years ago

Tech

Pour collecter les données, je vois 2 solutions techniques :

utiliser matomo

Un paramètre dans l'URL de fin -> on récupère via l'API les requêtes avec un certain paramètre -> dashboard en direct ou précalculé sur un serveur. Risque : un peu compliqué, pas temps réel, on stocke tout en clair dans matomo (tout le monde peut accéder au sondage de tout le monde, ce qui me semble OK a priori).

Mise à jour : après discussion avec quelqu'un qui a le même sujet, il semble compliqué de faire ça via matomo : on risque d'être limité sur la récupération des lignes brutes du sondage, Matomo bloquera genre à 5000.

Autre point problématique : pas facile sur le matomo de prod de faire une remise à zéro, chose complètement anodine sur une base de données dédiée, au moins en phase de test.

Utiliser une base de données classique

Pour que sondage soit vraiment le miroir non éphémère de conférence, avec le même côté temps réel super agréable en conférence pour les organisateurs comme les utilisateurs

Légal

Il nous faut investiguer les obligations que l'on a en stockant de telles données. Explorer l'exception "production de statistiques publiques" nous permettant peut-être de passer outre l'obligation de laisser la possibilité à l'utilisateur de demander une suppression de sa réponse, ce qui impliquerait un système d'authentification au moins partiel.

Question apriori assez séparée du côté tech.

laem commented 2 years ago

Travail démarré, je ferme au profit de #402