Project

General

Profile

Development #34705

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

Added by Nicolas Roche 5 months ago. Updated 5 months ago.

Status:
Solution déployée
Priority:
Normal
Target version:
-
Start date:
09 Jul 2019
Due date:
% Done:

0%

Patch proposed:
Yes
Planning:
No

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'

0002-admin-change-export-import-to-use-XML-files-for-form.patch View (6.2 KB) Frédéric Péters, 17 Jul 2019 07:03 AM

0001-workflows-add-fallbacks-for-exporting-very-old-workf.patch View (1.32 KB) Frédéric Péters, 17 Jul 2019 07:03 AM

0001-admin-change-export-import-to-use-XML-files-for-form.patch View (12.3 KB) Frédéric Péters, 17 Jul 2019 02:04 PM


Related issues

Related to w.c.s. - Development #34915: rendre l'export du site asynchrone Solution déployée 16 Jul 2019

Associated revisions

Revision 14d02d3a (diff)
Added by Frédéric Péters 5 months ago

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

Revision e16fa979 (diff)
Added by Frédéric Péters 5 months ago

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

Revision c49c2fe5 (diff)
Added by Frédéric Péters 5 months ago

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

History

#2 Updated by Frédéric Péters 5 months ago

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 Updated by Frédéric Péters 5 months ago

#4 Updated by Frédéric Péters 5 months ago

  • Assignee set to Frédéric Péters

#5 Updated by Frédéric Péters 5 months ago

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 Updated by Thomas Noël 5 months ago

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 Updated by Frédéric Péters 5 months ago

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 Updated by Frédéric Péters 5 months ago

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

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

#9 Updated by Frédéric Péters 5 months ago

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 Updated by Thomas Noël 5 months ago

  • Status changed from Solution proposée to 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 Updated by Frédéric Péters 5 months ago

  • Status changed from Solution validée to 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 Updated by Nicolas Roche 5 months ago

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 Updated by Frédéric Péters 5 months ago

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 Updated by Frédéric Péters 5 months ago

  • Status changed from Résolu (à déployer) to Solution déployée

Also available in: Atom PDF