Projet

Général

Profil

Development #9146

Avoir une terminaison d'API /api/forms/<...>/anonymized

Ajouté par Benjamin Dauvergne il y a plus de 8 ans. Mis à jour il y a presque 8 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
Début:
30 novembre 2015
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

L'équivalent de 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

0001-formdata-add-anonymised-parameter-to-get_json_dict.patch (986 octets) 0001-formdata-add-anonymised-parameter-to-get_json_dict.patch Benjamin Dauvergne, 04 décembre 2015 11:58
0002-formdata-add-anonymised-parameter-to-get_json_export.patch (3,08 ko) 0002-formdata-add-anonymised-parameter-to-get_json_export.patch Benjamin Dauvergne, 04 décembre 2015 11:58
0001-formdata-add-anonymised-parameter-to-get_json_dict-9.patch (992 octets) 0001-formdata-add-anonymised-parameter-to-get_json_dict-9.patch Benjamin Dauvergne, 06 décembre 2015 15:23
0002-formdata-add-anonymised-parameter-to-get_json_export.patch (3,08 ko) 0002-formdata-add-anonymised-parameter-to-get_json_export.patch Benjamin Dauvergne, 06 décembre 2015 15:23
0003-api-move-check_access-out-of-ApiFormPage.__init__-91.patch (1,41 ko) 0003-api-move-check_access-out-of-ApiFormPage.__init__-91.patch Benjamin Dauvergne, 06 décembre 2015 15:23
0004-add-new-API-api-forms-slug-anonymized-returning-anon.patch (5,92 ko) 0004-add-new-API-api-forms-slug-anonymized-returning-anon.patch Benjamin Dauvergne, 06 décembre 2015 15:23
0001-add-anonymise-parameter-to-JSON-exports-of-formdata-.patch (8,99 ko) 0001-add-anonymise-parameter-to-JSON-exports-of-formdata-.patch Benjamin Dauvergne, 26 février 2016 10:54
0002-add-new-parameter-anonymise-to-API-api-forms-slug-en.patch (8,44 ko) 0002-add-new-parameter-anonymise-to-API-api-forms-slug-en.patch Benjamin Dauvergne, 26 février 2016 11:06
0001-add-anonymise-parameter-to-JSON-exports-of-formdata-.patch (9,92 ko) 0001-add-anonymise-parameter-to-JSON-exports-of-formdata-.patch Benjamin Dauvergne, 03 mai 2016 21:54
0002-add-new-parameter-anonymise-to-API-api-forms-slug-en.patch (7,84 ko) 0002-add-new-parameter-anonymise-to-API-api-forms-slug-en.patch Benjamin Dauvergne, 03 mai 2016 21:54

Demandes liées

Lié à Publik - Project management #8652: Réaliser l'intégration du BI dans PublikFermé15 octobre 201515 avril 2016

Actions

Révisions associées

Révision 557ca7be (diff)
Ajouté par Benjamin Dauvergne il y a presque 8 ans

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.

Révision 2e0c8a1b (diff)
Ajouté par Benjamin Dauvergne il y a presque 8 ans

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

#1

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

#2

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 ?

#3

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.

#4

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

  • Statut changé de Nouveau à Résolu (à déployer)
#5

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

  • Statut changé de Résolu (à déployer) à Nouveau
#6

Mis à jour par Frédéric Péters il y a plus de 8 ans

ok, ça marche pour moi.

#9

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

J'ai rebasé, tous les tests passent toujours.

#10

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).

#11

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.

#12

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).

#13

Mis à jour par Benjamin Dauvergne il y a environ 8 ans

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.

#15

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.

#16

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.

#17

Mis à jour par Thomas Noël il y a presque 8 ans

  • Version cible mis à v1.43
#18

Mis à jour par Frédéric Péters il y a presque 8 ans

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF