Migration technique 4.0 vers 4.1


  1. Exclusion de l'action "Modification des PJ" du ruban
  2. Bouton de republication CDM-fr des formations sur les portails ou dossiers partagés
  3. Séparation des heures d'enseignement
    1. Données
    2. Workflow
    3. Import CDM-fr
    4. Import Apogée
  4. Copie de catalogue
  5. Catégories des tables de référence hiérarchiques avec titre multilingue
  6. Migration des services
  7. Dossier d'export CDM-fr
  8. Modification des urls des pages de formations et parcours

Exclusion de l'action "Modification des PJ" du ruban

L'action "Modification des PJ" apparaît dans le ruban si vous n'avez pas mis à jour votre workflow en prenant modèle sur celui du template ODF ou ODF-Web selon votre cas.

L'action 12 doit être exclue des boutons avec l'identifiant org.ametys.odf.course.workflow.WorkflowSteps, org.ametys.odf.program.workflow.WorkflowSteps, org.ametys.odf.subprogram.workflow.WorkflowSteps dans la balise workflow-actions si elle est en mode exclude.

Bouton de republication CDM-fr des formations sur les portails ou dossiers partagés

Cette migration n'est nécessaire que si vous voulez ajouter un bouton de republication CDM-fr des formations vers les portails ou dossiers partagés ou bien si vous souhaitez remplacer un bouton de republication que vous aviez défini au niveau du projet par ce qui est proposé au niveau du noyau.

Cette option est automatiquement désactivée si la configuration n'envoie pas le CDM-fr à un serveur distant ou ne dépose pas les fichiers CDM-fr dans un dossier.

Pour en bénéficier, il faut faire les actions suivantes :

  • Dans le fichier plugin.xml du plugin default-odf-workflow, ajouter les deux features suivantes (La première définit le bouton, la seconde appelle le ribbon qui place le bouton au bon endroit) :
<feature name="workflow.republish">       
    <extensions>       
        <extension id="org.ametys.odf.program.workflow.Republish"       
                   point="org.ametys.core.ui.RibbonControlsManager"       
                   class="org.ametys.odf.clientsideelement.RepublishContentClientSideElement">       
            <class name="Ametys.plugins.cms.content.controller.SmartContentController">       
                <action>Ametys.plugins.odf.program.ProgramActions.republish</action>       
                <enable-multiselection>true</enable-multiselection>       
                <selection-target-id>^content$</selection-target-id>       
                <workflow-name>^program$</workflow-name>       
                <workflow-action-id>9001</workflow-action-id>       
                <label i18n="true">plugin.odf:PLUGINS_ODF_REPUBLISH</label>       
                <description i18n="true">plugin.odf:PLUGINS_ODF_REPUBLISH_DESCRIPTION</description>       
                <icon-glyph>ametysicon-world-earth-black</icon-glyph>       
                <icon-decorator>decorator-ametysicon-arrow-circle-right-double</icon-decorator>       
                <icon-decorator-type>action-default</icon-decorator-type>       
                <allright-start-description i18n="true">plugin.odf:PLUGINS_ODF_REPUBLISH_DESCRIPTION_START</allright-start-description>       
                <allright-end-description i18n="true">plugin.odf:PLUGINS_ODF_REPUBLISH_DESCRIPTION_END</allright-end-description>       
                <allright-content-description i18n="true">plugin.odf:PLUGINS_ODF_REPUBLISH_DESCRIPTION_CONTENT</allright-content-description>       
                <error-description i18n="true">plugin.odf:PLUGINS_ODF_REPUBLISH_DESCRIPTION_ERROR</error-description>       
                <enabled-on-workflow-action-only>9001</enabled-on-workflow-action-only>       
                <workflowaction-start-description i18n="true">plugin.odf:PLUGINS_ODF_REPUBLISH_DESCRIPTION_WORKFLOWACTION_START</workflowaction-start-description>       
                <workflowaction-end-description i18n="true">plugin.odf:PLUGINS_ODF_REPUBLISH_DESCRIPTION_WORKFLOWACTION_END</workflowaction-end-description>       
                <workflowaction-content-description i18n="true">plugin.odf:PLUGINS_ODF_REPUBLISH_DESCRIPTION_WORKFLOWACTION_CONTENT</workflowaction-content-description>       
                <enabled-on-unlock-only>true</enabled-on-unlock-only>       
                <locked-start-description i18n="true">plugin.odf:PLUGINS_ODF_REPUBLISH_DESCRIPTION_LOCKED_START</locked-start-description>       
                <locked-end-description i18n="true">plugin.odf:PLUGINS_ODF_REPUBLISH_DESCRIPTION_LOCKED_END</locked-end-description>       
                <locked-content-description i18n="true">plugin.odf:PLUGINS_ODF_REPUBLISH_DESCRIPTION_LOCKED_CONTENT</locked-content-description>       
            </class>       
            <scripts>       
                <file plugin="cms">js/Ametys/plugins/cms/content/controller/SmartContentController.js</file>       
                <file plugin="cms">js/Ametys/plugins/cms/content/actions/WorkflowAction.js</file>       
                <file plugin="odf">js/Ametys/plugins/odf/program/ProgramActions.js</file>       
            </scripts>       
            <depends>       
                <org.ametys.core.ui.StaticFileImportsManager>org.ametys.cms.Content</org.ametys.core.ui.StaticFileImportsManager>       
            </depends>       
        </extension>       
    </extensions>       
</feature>       

<feature name="org.ametys.plugins.odf.workflow.ribbon.imports">       
    <extensions>       
        <extension id="org.ametys.plugins.odf.workflow.ribbon.Imports"       
                   point="org.ametys.core.ui.RibbonImportManager"       
                   class="org.ametys.core.ui.StaticRibbonImportManager">       
            <workspace match="cms|web">       
                <file>ribbon/cms-ribbon.xml</file>       
            </workspace>       
        </extension>       
    </extensions>       
</feature>       
  • Dans le plugin default-odf-workflow, ajouter le fichier ribbon/cms-ribbon.xml :
<?xml version="1.0" encoding="UTF-8"?>       
<ribbon xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ametys.org/cms/3.0/ribbon.xsd">       
    <tabs>       
        <tab label="plugin.odf:RIBBON_TABS_TAB_ODF_PROGRAM_LABEL" override="true">       
            <groups>       
                <group label="plugin.odf:RIBBON_TABS_TAB_CONTENT_GROUPS_GROUP_WORKFLOW_LABEL" override="true" controlsOrder="5">       
                    <layout size="small">       
                        <control id="org.ametys.odf.program.workflow.Republish"/>       
                    </layout>       
                </group>       
            </groups>       
        </tab>       
    </tabs>       
</ribbon>       
  • Dans les fichiers I18N du plugin default-odf-workflow (i18n/messages_*.xml), ajouter les clefs suivantes (français et anglais) utiles à l'action de workflow additionnelle (voir ci-après) :
<message key="WORKFLOW_ACTION_REPUBLISH">Republier</message>       
<message key="WORKFLOW_ACTION_REPUBLISH_DESCRIPTION">Force la republication du contenu sur le portail distant.</message>       
<message key="WORKFLOW_ACTION_REPUBLISH_ACTION_DESCRIPTION">&lt;strong&gt;{user}&lt;/strong&gt; a republié le contenu sur le portail.</message>       
<message key="WORKFLOW_ACTION_REPUBLISH">Republish</message>       
<message key="WORKFLOW_ACTION_REPUBLISH_DESCRIPTION">Republish the selected content(s) on portal.</message>       
<message key="WORKFLOW_ACTION_REPUBLISH_ACTION_DESCRIPTION">&lt;strong&gt;{user}&lt;/strong&gt; has republished the content.</message>       
  • Enfin, dans le workflow des formations nommé program.xml ou workflow-program.xml dans WEB-INF/param[/workflows], il est nécessaire d'ajouter l'action de republication 9001 dans l'état validé 3 :
<!-- Republish Action -->       
<action id="9001" name="plugin.default-odf-workflow:WORKFLOW_ACTION_REPUBLISH">       
    <restrict-to>         <conditions type="AND">       
            <condition type="avalon">       
                <arg name="role">org.ametys.cms.workflow.ContentCheckRightsCondition</arg>       
                <arg name="right">ODF_Rights_Program_Validate</arg>       
            </condition>       
            <condition type="avalon">       
                <arg name="role">org.ametys.cms.workflow.LockCondition</arg>       
            </condition>       
            <condition type="avalon">       
                <arg name="role">org.ametys.cms.workflow.ValidateMetadataCondition</arg>       
            </condition>       
        </conditions>       
    </restrict-to>       
    <results>       
        <unconditional-result old-status=" " status=" " step="3" />       
    </results>       
    <post-functions>       
        <function type="avalon">       
            <arg name="role">org.ametys.odf.cdmfr.SendCDMFRFunction</arg>       
        </function>       
        <function type="avalon">       
            <arg name="role">org.ametys.odf.cdmfr.DepositCDMFRFunction</arg>       
        </function>       
    </post-functions>       
</action>       

Séparation des heures d'enseignement

Les données totalDurationOf* ont totalement disparues, toutes les références à celles-ci doivent être migrées. Cela veut notamment dire que si vous avez surchargé le type de contenu ELP (course), il faut supprimer les références vers les données totalDurationOf* et les remplacer par une référence vers la métadonnée courseParts.

Données

La migration des données se fait automatiquement via une classe d'initialisation.

Elle est désactivable une fois que les données ont été migrées, c'est la feature odf-web/init.course-part, mais ce n'est pas indispensable.
Reconstruire les index et le live après le premier démarrage en M3.

Workflow

Il y a un nouveau worfklow, le workflow des heures d'enseignement (ou CoursePart), c'est le fichier workflows/course-part.xml. Il faut aussi ajouter son libellé dans application.xml :

<message key="WORKFLOW_coursepart">Heures d'enseignement</message>                      

Le workflow des ELP (workflows/course.xml) a été mis à jour pour ajouter après la validation d'un contenu de type ELP, la validation des heures d'enseignement qui y sont rattachées.
Il faut donc ajouter dans workflows/course.xml, après chaque appel à la fonction org.ametys.odf.workflow.ValidateODFContentFunction, l'appel à la fonction org.ametys.odf.workflow.MoveLiveTagOnCoursePartFunction :

<function type="avalon">                              
    <arg name="role">org.ametys.odf.workflow.MoveLiveTagOnCoursePartFunction</arg>                              
</function>                             

Import CDM-fr

Pour les imports CDM-fr non Ametys ou antérieurs à Ametys v4.2 (ODF 4.1), Si dans la synchronisation CDM-fr, vous avez surchargé les templates nommés course-totalDurationOf*, ils faut les modifier pour qu'ils importent des CoursePart sous la forme suivante :

<xsl:template name="course-totalDurationOfCM">                              
    <xsl:if test="cdmfr:credits/cdmfr:globalVolume[@teachingtype='CM']">                              
        <coursePart>                              
            <title>CM</title>                              
            <nature>CM</nature>                              
            <nbHours><xsl:value-of select="cdmfr:credits/cdmfr:globalVolume[@teachingtype='CM']"/></nbHours>                              
        </coursePart>                              
    </xsl:if>                              
</xsl:template>                              

Pour faire de l'import Ametys v4.2 (ODF 4.1), il faudra utiliser le template nommé course-courseParts.

Import Apogée

Une requête a été ajoutée au fichier apogee-requests.xml :

<select id="getCourseParts" parameterType="java.util.Map" resultType="map">                             
    <include refid="Functions.isNotBlank" />                              
    SELECT DISTINCT                              
        COD_TYP_HEU,                              
        NBR_HEU_ELP                              
    FROM ELP_CHG_TYP_HEU                              
    WHERE upper(COD_ELP)=upper(#{apogeeSyncCode})                              
    <if test="#fn = isNotBlank, #fn(year)">                              
        AND (COD_ANU IS NULL OR COD_ANU = #{year})                              
    </if>                              
</select>                              

Et en parallèle de cela, la requête remontant les données d'un ELP dont les volumes horaires a été simplifiée. Les volumes horaires ne sont plus stockés au même endroit et peuvent maintenant être multiples pour une même nature d'enseignement. Toutes les références à la table ELP_CHARGE_ENS ont donc été supprimées de la requête searchCourses.

Le mapping associé présent dans apogee-mapping.xml également :

{"metadata-ref":"totalDurationOfCM","attribute":"NBR_HEU_CM_ELP","synchro":true},                             
{"metadata-ref":"totalDurationOfTD","attribute":"NBR_HEU_TD_ELP","synchro":true},                             
{"metadata-ref":"totalDurationOfTP","attribute":"NBR_HEU_TP_ELP","synchro":true}                             
[...]                             
<column>NBR_HEU_CM_ELP</column>                             
<column>NBR_HEU_TD_ELP</column>                             
<column>NBR_HEU_TP_ELP</column>                             

Donc si vous avez surchargé apogee-mapping.xml et/ou apogee-requests.xml, il faudra les comparer aux nouvelles versions noyau.

Copie de catalogue

Une nouvelle action de workflow allégée a été faite pour la copie de catalogue (et la traduction) afin de réduire le temps de copie. Il faut rajouter l'action 210 à l'étape 1 des workflow program, subprogram, container, courselist, course et course-part :

<!-- Edit by copy Action -->                   
<action id="210" name="plugin.default-odf-workflow:WORKFLOW_ACTION_EDIT_BY_COPY">                   
    <restrict-to>                   
        <conditions>                   
            <condition type="avalon">                   
                <arg name="role">org.ametys.cms.workflow.LockCondition</arg>                   
            </condition>                   
        </conditions>                   
    </restrict-to>                   
    <results>                   
        <unconditional-result old-status=" " status=" " step="1" />                   
    </results>                   
    <post-functions>                   
        <function type="avalon">                   
            <arg name="role">org.ametys.cms.workflow.ExtractOutgoingReferencesFunction</arg>                   
        </function>                   
        <function type="avalon">                   
            <arg name="role">org.ametys.odf.workflow.copy.NotifyCopyFunction</arg>                   
        </function>                   
    </post-functions>                   
</action>                   

Cette action est une interne qui doit être exclue des menus de workflows. Pour cela dans le plugin.xml de votre plugin default-odf-workflow, ajoutez <action>210</action> dans la section <workflow-actions mode="exclude"> pour la déclaration des menus suivants :

  • org.ametys.odf.course.workflow.WorkflowSteps
  • org.ametys.odf.program.workflow.WorkflowSteps
  • org.ametys.odf.subprogram.workflow.WorkflowSteps
  • org.ametys.odf.container.workflow.WorkflowSteps
  • org.ametys.odf.courselist.workflow.WorkflowSteps

En cas de doute, reportez-vous aux plugin default-odf-workflow des templates ODF et ODF web.

Catégories des tables de référence hiérarchiques avec titre multilingue

Les titres des catégories des tables de référence sont maintenant multilingues.

Exécutez le script suivant pour migrer les catégories existantes:

var count = 0;                
                    
function _titleMigration(content)                
{                
    var titleProp = content.getNode().getProperty("ametys:title");                
    var title = titleProp.getString();                
    titleProp.remove();                
    content.getMetadataHolder().setMetadata("title", title, new java.util.Locale("fr"));                
    count++;                
}                
                    
jcrXPathQuery("//element(*, ametys:content)[(@ametys-internal:contentType = 'odf-enumeration.CodeErasmusCategory' or @ametys-internal:contentType = 'odf-enumeration.CodeFapCategory' or @ametys-internal:contentType = 'odf-enumeration.EnseignementNatureCategory') and @ametys:title]")                
    .forEach(function (content)                
    {                
        migrateContent(                
            content,                
            [_titleMigration],                
            true /* old versions incompatible */,                
            null /* no tag */,                
            false /* not verbose */                
        );                
    }                
);                
                    
print(count + " reference table entries have been migrated");                

Migration des services

Les services ODF comme tous les autres services nécessitent une migration suite à des modifications sur le format de stockage.
Exécutez le script de la page dédiée à la migration des services

Dossier d'export CDM-fr

Si vous avez activé l'export CDM-fr sur le disque lors de la validation des formations (dans les paramètres de configuration), le dossier d'export n'est plus configurable.

Les fichiers CDM-fr sont maintenant déposés dans le dossier $AMETYS_HOME/data/odf/cdmfr.

Vous pouvez déplacer vos fichiers existants dans l'ancien répertoire d'export, dans ce nouveau dossier.

Attention, si vous avez une application tierce qui exploite ce dossier, pensez à modifier cette application.

Modification des urls des pages de formations et parcours

Avant les URLs des pages virtuelles étaient formées du titre de la formation, suivi du nom du contenu (unique dans Ametys).
Par exemple : catalogue/master-XB/droit-economie-gestion-DEG/master-droit-program-fruai07517h489j10u.html

Désormais elles sont construites à partir du titre de la formation, suivi du code de la formation ou parcours (tout comme les ELPs)
Par exemple : catalogue/master-XB/droit-economie-gestion-DEG/master-droit-h489j10u.html

Vos anciennes URL seront automatiquement redirigées vers les nouvelles URL.

En conséquence, le tiret "-" est interdit dans le code des formations et des parcours. Pour s'assurer que le code est correct pour ces éléments, passez le script suivant, qui les modifiera le cas échéant.

Télécharger le script (1.1 KB)

var count = 0;    
     
function _updateCode(content)    
{    
    var code = content.getMetadataHolder().getString("code");    
    code = code.replaceAll("-", "_");    
    content.getMetadataHolder().setMetadata("code", code);       
     
    count++;    
}    


jcrXPathQuery("//element(*, ametys:programContent)[jcr:contains(@ametys:code, '*-*')]").forEach(function(content) {                        
     
  migrateContent(               
          content,               
          [_updateCode],               
          false /* old versions incompatible */,               
          null /* no tag */,               
          false /* not verbose */               
      );      
});       

print(count + " programs has been updated");    

count = 0;    

jcrXPathQuery("//element(*, ametys:subProgramContent)[jcr:contains(@ametys:code, '*-*')]").forEach(function(content) {                        
     
  migrateContent(               
          content,               
          [_updateCode],               
          false /* old versions incompatible */,               
          null /* no tag */,               
          false /* not verbose */               
      );      
});        

print(count + " subprograms has been updated");    

Si le script signale que plus d'une formation ou d'un parcours a été modifié, reconstruisez-le Live complet.

 

Retour en haut