Projet

Général

Profil

Development #34705

import de formulaires qui associe les rôles du formulaire à des rôles n'ayant pas forcément le même uuid

Ajouté par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 4 ans. Mis à jour il y a plus de 4 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
09 juillet 2019
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

J'ai écris ce test uniquement pour avoir un point d'entrée (et tenter d'expliquer ce que je cherche à faire).

import os
from formdef import FormDef

def test_import_template_zip():
    """imported formdef fails to match roles not having the same uuid
    """ 

    # import the signal-publik template
    # (from https://demarches-matrice.signalpublik.com/backoffice/settings/export)
    pub = create_temporary_pub()
    pub.import_zip(file('%s/tests/import/signal-publik.zip' % os.getcwd()))
    assert FormDef.count() == 9

    # today we match formdef's roles by using there uuid
    assert FormDef.select()[0].workflow_roles['_receiver'] == '45ac46653a94423fb2d60091bb826cbd'

    # here I hope that wcs may match them by name
    assert FormDef.select()[0].workflow_roles['_receiver'] == 'Agent'


Fichiers


Demandes liées

Lié à w.c.s. - Development #34915: rendre l'export du site asynchroneFermé16 juillet 2019

Actions

Révisions associées

Révision 14d02d3a (diff)
Ajouté par Frédéric Péters il y a plus de 4 ans

workflows: add fallbacks for exporting (very) old workflows (#34705)

Révision e16fa979 (diff)
Ajouté par Frédéric Péters il y a plus de 4 ans

admin: change export/import to use XML files for forms and workflows (#34705)

Révision c49c2fe5 (diff)
Ajouté par Frédéric Péters il y a plus de 4 ans

trivial: update comment to match role lookup (#34705)

Historique

#2

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

L'export en .zip est un export brut des fichiers, qui se référencent entre eux via les identifiants, tu n'auras pas les noms des rôles. Il faut commencer par modifier l'export, que les différents objets se trouvent posés dans le .zip sous la forme de leur export XML.

#3

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

#4

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

  • Assigné à mis à Frédéric Péters
#5

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

0001 insignifiant, juste qu'en faisant un export XML de vieux workflows tordus par les années chez moi, ça a donné quelques erreurs mineures.

0002 le changement sur l'export/import, pour produire à l'export une version XML des formulaires et workflows, et à l'import pour digérer ça. Ça vient après #34915 qui rend l'export asynchrone mais ça n'inclut pas de bascule de l'import en asynchrone, qui sera pour plus tard. (ça demande sans doute des changements js pour pouvoir afficher un rapport avec le résultat une fois terminé, etc. que je ne voulais pas mêler ici).

#6

Mis à jour par Thomas Noël il y a plus de 4 ans

Je m'interroge sur le "include_id=True" lors de l'import. On en a besoin pour les affectations formulaire/workflow, mais pour le reste non... et dans le reste, il y a les rôles. Autrement dit, ce include_id=True, ça ne va pas faire que l'import va utiliser les id de l'export, principalement au niveau des rôles (et c'est ce qu'on veut éviter) ?

Ainsi, dans l'import xml des formdef :

            roles_node = tree.find('roles')
            formdef.workflow_roles = {}
            for child in roles_node:
                ...
                if value.startswith('_') or value == 'logged-users':
                    role_id = value
                elif include_id:
                    role_id = child.attrib.get('role_id')               <-- et zut
                ...

#7

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

Intéressant, en fait il y a deux endroits avec une logique différente, le bout de code que tu pointes, qui me semble être celui de if tree.find('roles') is not None vers la ligne 1125, qui concerne workflow_roles, et la logique un peu plus haut, pour les attributs roles et backoffice_submission_roles, où il se passe ceci :

                if value.startswith('_') or value == 'logged-users':
                    role_id = value
                elif include_id:
                    role_id = child.attrib.get('role_id')
                    if role_id and not Role.has_key(role_id):
                        role_id = None

                if not role_id:
                    for role in Role.select(ignore_errors=True):
                        if role.name == value:
                            role_id = role.id
                            break

ainsi, avec include_id=True, s'il n'y a pas de rôle trouvé, il y a néanmoins fallback sur la recherche du nom.

Il me semble que cette seconde logique pourrait être adoptée.

#8

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

Mais côté workflow, pas, on y a aussi :

        # if we import using id, only look at the role_id attribute
#9

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

Voilà avec tests qui recréent un rôle du même nom avec un id différent et qui vérifient qu'attribut du formdef et du workflow sont bien mappés.

#10

Mis à jour par Thomas Noël il y a plus de 4 ans

  • Statut changé de Solution proposée à Solution validée

Tu peux changer le commentaire en bas de patch "only look at the role_id attribute", au moins retirer le "only" ?

Et sinon ça me semble bien ainsi.

#11

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

  • Statut changé de Solution validée à Résolu (à déployer)

(oops poussé sans le changement au commentaire, rectifié juste derrière)

commit e16fa979b1827520b6625214eb7579244350cbe0
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Wed Jul 17 07:02:14 2019 +0200

    admin: change export/import to use XML files for forms and workflows (#34705)

commit 14d02d3afdf807d7b3ac14b39d009508260ed6af
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Wed Jul 17 07:01:11 2019 +0200

    workflows: add fallbacks for exporting (very) old workflows (#34705)
#12

Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 4 ans

Petite note à posteriori, si le fichier importé est incorrect parce qu'il référence des rôles qui n'existent pas,

<by>
  <item role_id="_submitter">_submitter</item>
  <item role_id="427664f4dc4e48d4a5f848a17b9c0387">427664f4dc4e48d4a5f848a17b9c0387</item>
</by>

alors l'import échoue :
# if the roles are managed by the idp, don't try further.
if get_publisher() and get_cfg('sp', {}).get('idp-manage-roles') is True:
  raise WorkflowImportError(N_('Unknown referenced role (%s)'), (value,))

#13

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

Quand tu parles de problème n'hésite pas à inclure une trace, c'est souvent plus clair. (parce que là tu copies/colles trois lignes d'on ne sait où, le lecteur est obligé de basculer vers son terminal, faire un git grep, etc.).

Mais très bien que ça échoue, dirais-je.

#14

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

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF