Development #34705
import de formulaires qui associe les rôles du formulaire à des rôles n'ayant pas forcément le même uuid
0%
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
Révisions associées
admin: change export/import to use XML files for forms and workflows (#34705)
trivial: update comment to match role lookup (#34705)
Historique
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.
Mis à jour par Frédéric Péters il y a plus de 4 ans
- Lié à Development #34915: rendre l'export du site asynchrone ajouté
Mis à jour par Frédéric Péters il y a plus de 4 ans
- Fichier 0002-admin-change-export-import-to-use-XML-files-for-form.patch 0002-admin-change-export-import-to-use-XML-files-for-form.patch ajouté
- Fichier 0001-workflows-add-fallbacks-for-exporting-very-old-workf.patch 0001-workflows-add-fallbacks-for-exporting-very-old-workf.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
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).
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 ...
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.
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
Mis à jour par Frédéric Péters il y a plus de 4 ans
- Fichier 0001-admin-change-export-import-to-use-XML-files-for-form.patch 0001-admin-change-export-import-to-use-XML-files-for-form.patch ajouté
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.
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.
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)
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,))
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.
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
workflows: add fallbacks for exporting (very) old workflows (#34705)