Migration technique

  • Relation entité et utilisateurs de l'annuaire

    Avant de commencer la migration, veuillez vous assurer que vous avez fait la migration suivante : plugin-contentIO

    Action de synchronisation des utilisateurs :

    On a rajouté un nouveau paramètre pour la synchronisation des entités (Source SQL des entités).

    Ce paramètre est : 'Action de synchronisation des utilisateurs'.
    Le paramètre par défaut est 800. Dans la plupart des cas, il faut laisser 800.

    Il vous faut donc pour chaque synchronisation de contenu de type "Source SQL des entités" cliquer sur 'Modifier' puis sur 'Enregistrer et fermer' pour prendre en compte ce nouveau paramètre.

    Nouveau cycle de vie pour les utilisateurs :

    Un nouveau cycle de vie pour les utilisateurs a été rajouté. TODO lien vers le fichier

    Il est conseillé de passer tous vos contenus utilisateurs sur ce cycle de vie. Si vous ne voulez pas pour des raisons liées au projet, il faudra quand même rajouter une action 820 à votre cycle de vie :

    <!-- Remove reference -->        
     <action id="822" name="plugin.user-directory:PLUGINS_USER_DIRECTORY_WORKFLOW_ACTION_REMOVE_REFERENCE">        
       <restrict-to>        
         <conditions type="AND">        
           <condition type="avalon">        
             <arg name="role">org.ametys.cms.workflow.LockCondition</arg>        
           </condition>        
           <condition type="avalon">        
             <arg name="role">org.ametys.plugins.contentio.synchronize.workflow.ValidateMetadataSynchronizeCondition</arg>        
             <arg name="validation-step">3</arg>        
           </condition>        
         </conditions>        
       </restrict-to>        
     <results>        
     <result old-status=" " status=" " step="1">        
       <conditions type="AND">        
         <condition type="avalon">        
           <arg name="role">org.ametys.cms.workflow.ContentCurrentStepCondition</arg>        
           <arg name="step">1</arg>        
         </condition>        
       </conditions>        
       <post-functions>        
         <function type="avalon">        
           <arg name="role">org.ametys.cms.workflow.SetCurrentStepIdAndNotifyFunction</arg>        
         </function>        
       </post-functions>        
     </result>        
     <result old-status=" " status=" " step="2">        
       <conditions type="AND">        
         <condition type="avalon">        
           <arg name="role">org.ametys.cms.workflow.ContentCurrentStepCondition</arg>        
           <arg name="step">2</arg>        
         </condition>        
       </conditions>        
       <post-functions>        
         <function type="avalon">        
           <arg name="role">org.ametys.cms.workflow.SetCurrentStepIdAndNotifyFunction</arg>        
         </function>        
       </post-functions>        
     </result>        
     <result old-status=" " status=" " step="3">        
       <conditions type="AND">        
         <condition type="avalon">        
           <arg name="role">org.ametys.cms.workflow.ContentCurrentStepCondition</arg>        
           <arg name="step">3</arg>        
       </condition>        
       </conditions>        
       <post-functions>        
         <function type="avalon">        
         <arg name="role">org.ametys.plugins.contentio.synchronize.workflow.ValidateSynchronizedContentFunction</arg>        
       </function>        
       <function type="avalon">        
         <arg name="role">org.ametys.cms.workflow.ValidationStepFunction</arg>        
       </function>        
       </post-functions>        
     </result>        
     <unconditional-result old-status=" " status=" " step="1"/>        
     </results>        
     <post-functions>        
       <function type="avalon">        
         <arg name="role">org.ametys.cms.workflow.ExtractOutgoingReferencesFunction</arg>        
       </function>        
     </post-functions>        
     </action>        


    Sinon ajouter le fichier 'workflow-user.xml' dans WEB-INF/params et le déclarer dans le fichier WEB-INF/params/worklows.xml avec comme name user :

    <workflow name="user" type="file" location="workflow-user.xml"/>             

    Ensuite, il faut définir la clé i18n associée pour lui donner un nom dans WEB-INF/i18n/applications.xml :

    <message key="WORKFLOW_user">Cycle de vie des utilisateurs</message>             

    Puis passer le script de migration suivant :

    Attention, si vous aviez déjà définie un cycle de vie différent pour les utilisateurs (autre que le cycle de vie 'contentio'), il faut adapter ce script et changer le nom du worfklow (variable defaultWorkflowName)

            
     var defaultWorkflowName = "contentio";            
     var contentTypeEP = serviceManager.lookup('org.ametys.cms.contenttype.ContentTypeExtensionPoint');            
                
     var request = "@ametys-internal:contentType='org.ametys.plugins.userdirectory.Content.user'";            
     contentTypeEP.getSubTypes('org.ametys.plugins.userdirectory.Content.user').forEach(function(contentTypeId) {            
         request += " or @ametys-internal:contentType='" + contentTypeId + "'"            
     });            
                
     var qm = session.getWorkspace().getQueryManager();            
     var query = qm.createQuery("//element(*, ametys:content)[" + request + "]", javax.jcr.query.Query.XPATH);            
     var nodes = query.execute().getNodes();            
                
     var nbUserChanged = 0;            
     while (nodes.hasNext())            
     {            
         var content = nodes.next();            
         if (content.hasNode("ametys-internal:workflows"))            
         {            
             var workflows = content.getNode("ametys-internal:workflows");            
             var workflowNodes = workflows.getNodes();            
                
             var hasChanged = false;            
             while (workflowNodes.hasNext())            
             {            
                 var workflowNode = workflowNodes.next();            
                 var workflowName = workflowNode.getProperty("oswf:workflowName").getString();            
                 if (workflowName == defaultWorkflowName)            
                 {            
                     workflowNode.setProperty("oswf:workflowName", "user");            
                     hasChanged = true;            
                 }            
             }            
    
             if (hasChanged)            
             {            
                 content.save();            
                 nbUserChanged++;            
             }            
         }            
     }            
                
     print(nbUserChanged + " contenu(s) 'utilisateur' changé(s)");                   

    Il vous reste plus qu'à modifier la synchronisation des contenus de vos utilisateurs en définissant le bon cycle de vie associé :

     

    Nouvelle action du cycle de vie pour les entités : 

    Vous pouvez supprimer l'action 22 de votre fichier de workflow (WEB-INF/param/workflow-udorgunit.xml)

    De plus, vous devez rajouter l'action 820 :

    <!-- Remove reference -->        
     <action id="822" name="plugin.user-directory:PLUGINS_USER_DIRECTORY_WORKFLOW_ACTION_REMOVE_REFERENCE">        
       <restrict-to>        
         <conditions type="AND">        
           <condition type="avalon">        
             <arg name="role">org.ametys.cms.workflow.LockCondition</arg>        
           </condition>        
           <condition type="avalon">        
             <arg name="role">org.ametys.plugins.contentio.synchronize.workflow.ValidateMetadataSynchronizeCondition</arg>        
             <arg name="validation-step">3</arg>        
           </condition>        
         </conditions>        
       </restrict-to>        
     <results>        
     <result old-status=" " status=" " step="1">        
       <conditions type="AND">        
         <condition type="avalon">        
           <arg name="role">org.ametys.cms.workflow.ContentCurrentStepCondition</arg>        
           <arg name="step">1</arg>        
         </condition>        
       </conditions>        
       <post-functions>        
         <function type="avalon">        
           <arg name="role">org.ametys.cms.workflow.SetCurrentStepIdAndNotifyFunction</arg>        
         </function>        
       </post-functions>        
     </result>        
     <result old-status=" " status=" " step="2">        
       <conditions type="AND">        
         <condition type="avalon">        
           <arg name="role">org.ametys.cms.workflow.ContentCurrentStepCondition</arg>        
           <arg name="step">2</arg>        
         </condition>        
       </conditions>        
       <post-functions>        
         <function type="avalon">        
           <arg name="role">org.ametys.cms.workflow.SetCurrentStepIdAndNotifyFunction</arg>        
         </function>        
       </post-functions>        
     </result>        
     <result old-status=" " status=" " step="3">        
       <conditions type="AND">        
         <condition type="avalon">        
           <arg name="role">org.ametys.cms.workflow.ContentCurrentStepCondition</arg>        
           <arg name="step">3</arg>        
       </condition>        
       </conditions>        
       <post-functions>        
         <function type="avalon">        
         <arg name="role">org.ametys.plugins.contentio.synchronize.workflow.ValidateSynchronizedContentFunction</arg>        
       </function>        
       <function type="avalon">        
         <arg name="role">org.ametys.cms.workflow.ValidationStepFunction</arg>        
       </function>        
       </post-functions>        
     </result>        
     <unconditional-result old-status=" " status=" " step="1"/>        
     </results>        
     <post-functions>        
       <function type="avalon">        
         <arg name="role">org.ametys.cms.workflow.ExtractOutgoingReferencesFunction</arg>        
       </function>        
     </post-functions>        
     </action>        

     

    Nouveau champs pour le contenu 'utilisateur' :

    On a maintenant un lien bi-directionnel entre les entités et les utilisateurs. Pour cela, on a rajouté une donnée "orgunits" dans le type de contenu org.ametys.plugins.userdirectory.Content.user.xml :

    <cms:metadata name="orgunits" invert="users/user" type="content" contentType="org.ametys.plugins.userdirectory.Content.udorgunit" multiple="true">     
       <label i18n="true">PLUGINS_USER_DIRECTORY_CONTENT_TYPE_ORGUNITS_LABEL_TITLE</label>     
       <description i18n="true">PLUGINS_USER_DIRECTORY_CONTENT_TYPE_ORGUNITS_LABEL_DESC</description>     
     </cms:metadata>     

    Dans votre projet, votre type de contenu 'utilisateur' étend celui là. Il faudra donc rajouter cette donnée dans tous les metadataSet de votre type de contenu.