Project

General

Profile

Development #21488

inclure les attributs de rôle dans l'API

Added by Frédéric Péters about 2 years ago. Updated almost 2 years ago.

Status:
En cours
Priority:
Bas
Category:
-
Target version:
-
Start date:
29 Jan 2018
Due date:
% Done:

0%

Patch proposed:
Yes
Planning:
No

Description

Dans #20706, Benjamin :

À noter qu'il y a une difficulté, dans le cadre de Publik le modèle des Rôles est étendu de deux attributs stockés dans des modèles RoleAttribute voir hobo/agent/authentic/role_forms.py, nommé details (str), emails(list of str) et emails_to_members(boolean) stockés en JSON, à Fred de dire si c'est important pour lui de pouvoir définir ces attributs à ce stade.

Je répondais que non je n'en avais pas besoin dans l'immédiat mais pour autant ça sera utile.

0001-WIP-role-api-add-extra-role-attributes-21488.patch View (2.64 KB) Paul Marillonnet, 04 Apr 2018 02:39 PM

0001-WIP-role-api-add-extra-role-attributes-21488.patch View (5.79 KB) Paul Marillonnet, 04 Apr 2018 05:02 PM

0001-role-api-add-extra-role-attributes-21488.patch View (6.81 KB) Paul Marillonnet, 18 Apr 2018 10:29 AM


Related issues

Related to Authentic 2 - Development #20706: API de création de rôle Fermé 14 Dec 2017

History

#1 Updated by Frédéric Péters about 2 years ago

#2 Updated by Paul Marillonnet about 2 years ago

  • Assignee set to Paul Marillonnet

Je veux bien prendre aussi, ce sera l'occasion pour moi de comprendre plus en détails l'utilisation des objets RoleAttribute de a2_rbac.models.

#3 Updated by Paul Marillonnet about 2 years ago

Je ne connais pas les échéances attendues là-dessus Frédéric. Est-ce que je peux me permettre d'attendre d'avoir #20706 dans master avant de commencer à proposer des patches là-dessus ?

Edit: La réponse est dans la description du ticket... Je mets ça sur ma todolist et m'y consacrerai une fois #20706 acké et poussé.

Edit 2: Ce n'est pas pour autant que je ne vais pas commencer à y réfléchir :)

#4 Updated by Paul Marillonnet almost 2 years ago

Je voulais inclure tout ça dans le serializer, mais j'ai l'impression maintenant que c'est trop tard pour prendre en compte la gestion des ces attributs de rôle.

Je vais implémenter ça dans le le ModelViewSet.

#5 Updated by Paul Marillonnet almost 2 years ago

En me basant là dessus :
http://www.django-rest-framework.org/api-guide/relations/#nested-relationships
je pense qu'il faut rajouter un RoleAttributeSerializer.

#6 Updated by Benjamin Dauvergne almost 2 years ago

  • Priority changed from Normal to Bas

Il n'y a pas d'échéance, fais si tu veux apprendre mais il n'y a pas d'urgence sur ce point.

#7 Updated by Paul Marillonnet almost 2 years ago

Ok, si tu as d'autres tickets plus urgents à me pointer, je suis preneur.

D'ailleurs, je me suis honteusement défilé pour #19396, je peux reprendre, si tu veux.

En attendant, j'aimerais partir sur quelque chose comme ça. C'est du pseudo code, je n'ai pas encore compris comment gérer la clé étrange RoleAttribute::role.
Mais dans l'idée, je pense qu'il faut implémenter un serializer dédié à ces attributs de role additionnels.

Edit: La clé étrangère, c'est le DRF qui gère ça de façon transparente. Je vais maintenant écrire des tests.

#8 Updated by Paul Marillonnet almost 2 years ago

Est-ce qu'on veut avoir accès en écriture à ces attributs de rôle ?

#9 Updated by Frédéric Péters almost 2 years ago

Le cadre initial était la création de rôle donc oui clairement il s'agit de pouvoir écrire.

#10 Updated by Paul Marillonnet almost 2 years ago

Tout fait comme dans la doc, j'aimerais bien que ça fonctionne, mais je n'y arrive pas.
L'imbrication de serializers semble facile, pourtant je bute dessus. Je pose quand même un patch WIP, je reprendrai plus tard.

#11 Updated by Paul Marillonnet almost 2 years ago

Quelque chose m'échappe encore.
L'erreur en question à l'exécution des tests :

E       AssertionError: The `.create()` method does not support writable nestedfields by default.
E       Write an explicit `.create()` method for serializer `authentic2.api_views.RoleSerializer`, or set `read_only=True` on nested serializer fields.

car RoleSerializer.create() appelle ModelSerializer.create().

Apparemment ce n'est pas d'usage.

Je vais corriger ça.

#12 Updated by Paul Marillonnet almost 2 years ago

Toujours ce même problème, je n'arrive pas à faire fonctionner les sérialisations imbriquées comme dans la doc du DRF.

Je continue de chercher ce qui ne va pas dans mon patch (en particulier, pourquoi le RoleAttributeSerializer n'est pas utilisé).

Edit: La levée d'erreur est dans rest_framework.serializers.raise_errors_on_nested_writes.
Je regarde ce qui ne plaît pas au DRF.

#13 Updated by Paul Marillonnet almost 2 years ago

Trouvé ce qui n'allait pas.

#14 Updated by Benjamin Dauvergne almost 2 years ago

  • import model_meta n'est pas utilisé
  • ça :
            if 'role_attributes' in validated_data:
                role_attributes_data = validated_data.pop('role_attributes')
            else:
                role_attributes_data = ()
    

    s'écrit plutôt comme cela de manière pythonic (aussi on préfèrera les listes au tuple, par souci d'homogénéité, on utilisera plutôt un tuple pour des données hétérogènes, ex.: (1, 'x', True)):
            role_attributes_data = validated_data.pop('role_attributes', [])
    
  • je garderai l'appel à super() plutôt que de ré-implémenter
  • tu gères la création mais pas la mise à jour (update())

#15 Updated by Benjamin Dauvergne almost 2 years ago

  • Status changed from Nouveau to En cours

Also available in: Atom PDF