Development #9146
Avoir une terminaison d'API /api/forms/<...>/anonymized
0%
Description
list
mais pour les stats:
- uniquement les champs de type numérique, item ou date et leur données structurées associées
- accessible sans NameID sur simple signature de l'URL
Le but est de fournir une source de donnée utilisable par un outil de stat et que ça reste CNIL compliant dans l'idée.
Fichiers
Demandes liées
Révisions associées
add new parameter anonymise to API /api/forms/<slug>/ endpoints returning anonymized formdata (#9146)
Service is open to any request bearing a valid signature, without needing to to
authenticate as a known user. It's also open to authenticated admin users for
debugging.
Historique
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
- Lié à Project management #8652: Réaliser l'intégration du BI dans Publik ajouté
Mis à jour par Frédéric Péters il y a plus de 8 ans
Ce serait juste comme /list, avec des champs en moins ? Ou tu imagines aussi faire sauter le self.formdef.is_of_concern_for_user ?
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
On fait sauter toutes les ACLs, seul la signature est vérifiée. C'est pas open bar mais presque. C'est vraiment pour faciliter l'export pour faire des stats automatisées sans avoir à choisir un utilisateur et lui filer tous les rôles.
On pourrait spécialiser /list
et dire que si NameID est vide alors supprimer des champs etc.. mais je trouve moins casse gueule de construire un truc propre à coté que de rajouter des conditions.
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
- Statut changé de Nouveau à Résolu (à déployer)
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
- Statut changé de Résolu (à déployer) à Nouveau
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
- Fichier 0001-formdata-add-anonymised-parameter-to-get_json_dict.patch 0001-formdata-add-anonymised-parameter-to-get_json_dict.patch ajouté
- Fichier 0002-formdata-add-anonymised-parameter-to-get_json_export.patch 0002-formdata-add-anonymised-parameter-to-get_json_export.patch ajouté
Deux patch pour simplement avoir un version anonymisés des exports JSON des données de formulaire.
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
- Fichier 0001-formdata-add-anonymised-parameter-to-get_json_dict-9.patch 0001-formdata-add-anonymised-parameter-to-get_json_dict-9.patch ajouté
- Fichier 0002-formdata-add-anonymised-parameter-to-get_json_export.patch 0002-formdata-add-anonymised-parameter-to-get_json_export.patch ajouté
- Fichier 0003-api-move-check_access-out-of-ApiFormPage.__init__-91.patch 0003-api-move-check_access-out-of-ApiFormPage.__init__-91.patch ajouté
- Fichier 0004-add-new-API-api-forms-slug-anonymized-returning-anon.patch 0004-add-new-API-api-forms-slug-anonymized-returning-anon.patch ajouté
- Patch proposed changé de Non à Oui
La série complète avec un test (qui passe, mais je n'ai fait tourner que tests/test_api.py).
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
J'ai rebasé, tous les tests passent toujours.
Mis à jour par Frédéric Péters il y a plus de 8 ans
Des détails d'abord :
Je mettrais 0003 et 0004 ensemble, parce que le changement sur la sécurité de 0003 s'explique par 0004 (parce qu'on veut un objet ApiFormPage sans vérification d'accès, pour la nouvelle méthode).
Le _q_exports le commentaire s'appliquat à sa totalité, ici il pourrait devenir :
_q_exports = [('list', 'json'), 'anonymised'] # restrict to API endpoints
(pas besoin de tuple pour le 'anonymised', il est utilisé pour ('list', 'json') pour avoir un nom différent.)
Et le fond sur la fin : c'est vraiment dommage que ce endpoint ne puisse pas prendre les filtres que le endpoint "list" autorise, pourquoi pas :
def anonymed(self): return self.json(anonymised=True)
Et les modifs nécessaires à la méthode json de backoffice/management.py, bien sûr, genre ignorer la recherche plein texte (et ça doit être tout, les autres critères sont sur des valeurs qui ne sont pas anonymisées, listes et date de réception).
Mis à jour par Benjamin Dauvergne il y a plus de 8 ans
Frédéric Péters a écrit :
Et les modifs nécessaires à la méthode json de backoffice/management.py, bien sûr, genre ignorer la recherche plein texte (et ça doit être tout, les autres critères sont sur des valeurs qui ne sont pas anonymisées, listes et date de réception).
Le problème c'est que FormDefUI.get_listing_items() veut absolument trouver un user pour je suppose filtrer les formulaires visibles.
1
# as we are in the backoffice, we don't have to care about the # situation where the user is the submitter, and we limit ourselves # to consider treating roles. user = user or get_request().user if not user.is_admin: user_roles = set(user.roles or []) concerned_ids = set() for role in user_roles: concerned_ids |= set(formdata_class.get_ids_with_indexed_value( 'concerned_roles', str(role))) item_ids = list(set(item_ids).intersection(concerned_ids))
J'ai un peu peur de toucher à cela.
Mis à jour par Frédéric Péters il y a plus de 8 ans
J'ajouterais juste un anonymised=False aux arguments et quand il est mis, je ne rentrerais pas dans cette branche. (comme on ne considère de toute façon pas les permissions lors de cette récupération anonyme).
Mis à jour par Benjamin Dauvergne il y a environ 8 ans
- Fichier 0001-add-anonymise-parameter-to-JSON-exports-of-formdata-.patch 0001-add-anonymise-parameter-to-JSON-exports-of-formdata-.patch ajouté
- Fichier 0002-add-new-parameter-anonymise-to-API-api-forms-slug-en.patch 0002-add-new-parameter-anonymise-to-API-api-forms-slug-en.patch ajouté
J'ai repris les patchs en supprimant complètement la vue particulière anonymised
et en passant plutôt par un paramètre 'anonymise' dans la query string. Les vues json
de FormPage et FormStatusPage s'occupe de voir si ce paramètre est présent est de passer le booléen ensuite au différente fonctions de listing ou d'export JSON.
FormStatusPage.check_auth() et FormPage.check_access() sont modifiés pour ne traiter que la signature si anoymise est présent dans l'URL. L'articulation entre l'implémentation de ApiFormdataPage, FormStatusPage.check_auth() et check_receiver() mériterait d'être revue pour éviter d'avoir du code concernant les API dans wcs/forms/common.py mais je laisse ça pour un autre patch.
La documentation est mise à jour avec une nouvelle section Données anonymisées
dans api-get.page
.
Mis à jour par Benjamin Dauvergne il y a presque 8 ans
- Fichier 0001-add-anonymise-parameter-to-JSON-exports-of-formdata-.patch 0001-add-anonymise-parameter-to-JSON-exports-of-formdata-.patch ajouté
- Fichier 0002-add-new-parameter-anonymise-to-API-api-forms-slug-en.patch 0002-add-new-parameter-anonymise-to-API-api-forms-slug-en.patch ajouté
Rebasé.
Mis à jour par Frédéric Péters il y a presque 8 ans
Les APIs « List de formulaires » et le mode Pull de récupération d'un formulaire accepte un
Pas de s derrière "Les API" (ça se pratique en anglais, pas en français), mais un e à Liste et un nt à acceptent.
À part ça me semble ok.
Mis à jour par Benjamin Dauvergne il y a presque 8 ans
- Statut changé de Nouveau à Résolu (à déployer)
Documentation mise à jour avec les remarques.
commit 2e0c8a1b9b9eedcf52146b39a5395959aad1fe0f Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Tue May 3 21:11:49 2016 +0200 add new parameter anonymise to API /api/forms/<slug>/ endpoints returning anonymized formdata (#9146) Service is open to any request bearing a valid signature, without needing to to authenticate as a known user. It's also open to authenticated admin users for debugging. commit 557ca7be27d171bac69f549de2a4ffaf0485dbe2 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Fri Feb 26 10:49:56 2016 +0100 add anonymise parameter to JSON exports of formdata (#9146) - FormData.get_json_export_dict(), .get_json_dict(), .export_to_json(), FormDefUI.get_listing_items(), .export_to_json() get a new anonymise parameter. - in FormPage.json() and FormStatusPage().json if an anonymise parameter is present in the query string the anonymized mode is activated.
Mis à jour par Frédéric Péters il y a presque 8 ans
- Statut changé de Résolu (à déployer) à Fermé
add anonymise parameter to JSON exports of formdata (#9146)
- FormData.get_json_export_dict(), .get_json_dict(), .export_to_json(),
FormDefUI.get_listing_items(), .export_to_json() get a new anonymise
parameter.
- in FormPage.json() and FormStatusPage().json if an anonymise parameter is
present in the query string the anonymized mode is activated.