Cette page ne doit être appliquée que si l'application vous demande de passer la migration manuelle plugin.odfsync.import.apogee.jcr.20210929T0000 Une fois la migration manuelle passée, il faut redémarrer Ametys pour continuer le processus de migration automatique.
Voir aussi la migration technique ici dans la partie Correction des liens parent/enfant pour Apogée
Ce script de migration manuelle permet de détecter les contenus dont l'état courant est validé mais dont les enfants dans leur version Live est différente de leur version courante. Ils sont alors remis à l'état brouillon.
Cela remet aussi à l'état brouillon les contenus en état validé qui n'ont pas de version Live défnie.
Sur le script suivant, mettre la variable handle à false dans un premier temps pour contrôler les modifications qui vont être effectuées. Si cela vous convient, passez handle à true, les modifications seront effectuées. Sinon, ignorez la migration manuelle avec le script présent à la fin de ce contenu (il faudra tout de même redémarrer).
Le script ci-dessous doit être exécuté avec un utilisateur ayant les droits de modification des contenus ODF.
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
// Set to true to execute
let handle = false;
// Imports
const Optional = Java.type("java.util.Optional");
const Stream = Java.type("java.util.stream.Stream");
const Collectors = Java.type("java.util.stream.Collectors");
// Logger
const logger = Ametys.getLogger("org.ametys.core.migration.MigrationExtensionPoint.odf2995.inconsistent.live");
logger.info("Start migrating inconsistent live contents");
let versionManager = Repository.session.getWorkspace().getVersionManager();
let count = 0;
let condition = "@ametys-internal:contentType='org.ametys.plugins.odf.Content.program'";
condition += " or @ametys-internal:contentType='org.ametys.plugins.odf.Content.orgunit'";
condition += " or @ametys-internal:contentType='org.ametys.plugins.odf.Content.container'";
condition += " or @ametys-internal:contentType='org.ametys.plugins.odf.Content.course'";
condition += " or @ametys-internal:contentType='org.ametys.plugins.odf.Content.subProgram'";
condition += " or @ametys-internal:contentType='org.ametys.plugins.odf.Content.courseList'";
Repository.query("//element(*, ametys:content)[" + condition + "]").forEach(
content =>
{
if (content.getCurrentStepId() == 3)
{
if (hasInconsistentLive(content))
{
count++;
logger.info("[" + content.getId() + "][" + content.getTitle() + "] Set the content workflow state to draft");
if (handle)
{
Content.doWorkflowAction(content, 2);
}
}
}
}
);
if (handle)
{
Migration.jcr.addVersion("plugin.odfsync.import.apogee.jcr", "20210929T0000", "Manual migration for ODF-2995 on Apogée SCC");
}
logger.info(count + " content(s) migrated");
logger.info("End migrating inconsistent live content");
function hasInconsistentLive(content)
{
let versionHistory = versionManager.getVersionHistory(content.getNode().getPath());
if (!versionHistory.hasVersionLabel("Live"))
{
logger.warn("[" + content.getId() + "][" + content.getTitle() + "] This content has a validate state but no Live version");
return true;
}
let childAttribute = getChildAttribute(content);
let currentValues = Optional.of(content)
.map(c => c.getValue(childAttribute))
.map(v => Stream.of(v))
.orElseGet(() => Stream.empty())
.map(v => v.getContentId())
.collect(Collectors.toList());
let versionNode = versionHistory.getVersionByLabel("Live").getFrozenNode();
if (versionNode.hasProperty("ametys:" + childAttribute))
{
for (let value of versionNode.getProperty("ametys:" + childAttribute).getValues())
{
if (!currentValues.remove(value.getString()))
{
return false;
}
}
}
return currentValues.size() > 0;
}
function getChildAttribute(content)
{
switch (content.getTypes()[0])
{
case "org.ametys.plugins.odf.Content.course": return "courseLists";
case "org.ametys.plugins.odf.Content.courseList": return "courses";
case "org.ametys.plugins.odf.Content.orgunit": return "childOrgUnits";
default: return "childProgramParts";
}
}
// Set to true to execute
let handle = false;
// Imports
const Optional = Java.type("java.util.Optional");
const Stream = Java.type("java.util.stream.Stream");
const Collectors = Java.type("java.util.stream.Collectors");
// Logger
const logger = Ametys.getLogger("org.ametys.core.migration.MigrationExtensionPoint.odf2995.inconsistent.live");
logger.info("Start migrating inconsistent live contents");
let versionManager = Repository.session.getWorkspace().getVersionManager();
let count = 0;
let condition = "@ametys-internal:contentType='org.ametys.plugins.odf.Content.program'";
condition += " or @ametys-internal:contentType='org.ametys.plugins.odf.Content.orgunit'";
condition += " or @ametys-internal:contentType='org.ametys.plugins.odf.Content.container'";
condition += " or @ametys-internal:contentType='org.ametys.plugins.odf.Content.course'";
condition += " or @ametys-internal:contentType='org.ametys.plugins.odf.Content.subProgram'";
condition += " or @ametys-internal:contentType='org.ametys.plugins.odf.Content.courseList'";
Repository.query("//element(*, ametys:content)[" + condition + "]").forEach(
content =>
{
if (content.getCurrentStepId() == 3)
{
if (hasInconsistentLive(content))
{
count++;
logger.info("[" + content.getId() + "][" + content.getTitle() + "] Set the content workflow state to draft");
if (handle)
{
Content.doWorkflowAction(content, 2);
}
}
}
}
);
if (handle)
{
Migration.jcr.addVersion("plugin.odfsync.import.apogee.jcr", "20210929T0000", "Manual migration for ODF-2995 on Apogée SCC");
}
logger.info(count + " content(s) migrated");
logger.info("End migrating inconsistent live content");
function hasInconsistentLive(content)
{
let versionHistory = versionManager.getVersionHistory(content.getNode().getPath());
if (!versionHistory.hasVersionLabel("Live"))
{
logger.warn("[" + content.getId() + "][" + content.getTitle() + "] This content has a validate state but no Live version");
return true;
}
let childAttribute = getChildAttribute(content);
let currentValues = Optional.of(content)
.map(c => c.getValue(childAttribute))
.map(v => Stream.of(v))
.orElseGet(() => Stream.empty())
.map(v => v.getContentId())
.collect(Collectors.toList());
let versionNode = versionHistory.getVersionByLabel("Live").getFrozenNode();
if (versionNode.hasProperty("ametys:" + childAttribute))
{
for (let value of versionNode.getProperty("ametys:" + childAttribute).getValues())
{
if (!currentValues.remove(value.getString()))
{
return false;
}
}
}
return currentValues.size() > 0;
}
function getChildAttribute(content)
{
switch (content.getTypes()[0])
{
case "org.ametys.plugins.odf.Content.course": return "courseLists";
case "org.ametys.plugins.odf.Content.courseList": return "courses";
case "org.ametys.plugins.odf.Content.orgunit": return "childOrgUnits";
default: return "childProgramParts";
}
}
// Set to true to execute
let handle = false;
// Imports
const Optional = Java.type("java.util.Optional");
const Stream = Java.type("java.util.stream.Stream");
const Collectors = Java.type("java.util.stream.Collectors");
// Logger
const logger = Ametys.getLogger("org.ametys.core.migration.MigrationExtensionPoint.odf2995.inconsistent.live");
logger.info("Start migrating inconsistent live contents");
let versionManager = Repository.session.getWorkspace().getVersionManager();
let count = 0;
let condition = "@ametys-internal:contentType='org.ametys.plugins.odf.Content.program'";
condition += " or @ametys-internal:contentType='org.ametys.plugins.odf.Content.orgunit'";
condition += " or @ametys-internal:contentType='org.ametys.plugins.odf.Content.container'";
condition += " or @ametys-internal:contentType='org.ametys.plugins.odf.Content.course'";
condition += " or @ametys-internal:contentType='org.ametys.plugins.odf.Content.subProgram'";
condition += " or @ametys-internal:contentType='org.ametys.plugins.odf.Content.courseList'";
Repository.query("//element(*, ametys:content)[" + condition + "]").forEach(
content =>
{
if (content.getCurrentStepId() == 3)
{
if (hasInconsistentLive(content))
{
count++;
logger.info("[" + content.getId() + "][" + content.getTitle() + "] Set the content workflow state to draft");
if (handle)
{
Content.doWorkflowAction(content, 2);
}
}
}
}
);
if (handle)
{
Migration.jcr.addVersion("plugin.odfsync.import.apogee.jcr", "20210929T0000", "Manual migration for ODF-2995 on Apogée SCC");
}
logger.info(count + " content(s) migrated");
logger.info("End migrating inconsistent live content");
function hasInconsistentLive(content)
{
let versionHistory = versionManager.getVersionHistory(content.getNode().getPath());
if (!versionHistory.hasVersionLabel("Live"))
{
logger.warn("[" + content.getId() + "][" + content.getTitle() + "] This content has a validate state but no Live version");
return true;
}
let childAttribute = getChildAttribute(content);
let currentValues = Optional.of(content)
.map(c => c.getValue(childAttribute))
.map(v => Stream.of(v))
.orElseGet(() => Stream.empty())
.map(v => v.getContentId())
.collect(Collectors.toList());
let versionNode = versionHistory.getVersionByLabel("Live").getFrozenNode();
if (versionNode.hasProperty("ametys:" + childAttribute))
{
for (let value of versionNode.getProperty("ametys:" + childAttribute).getValues())
{
if (!currentValues.remove(value.getString()))
{
return false;
}
}
}
return currentValues.size() > 0;
}
function getChildAttribute(content)
{
switch (content.getTypes()[0])
{
case "org.ametys.plugins.odf.Content.course": return "courseLists";
case "org.ametys.plugins.odf.Content.courseList": return "courses";
case "org.ametys.plugins.odf.Content.orgunit": return "childOrgUnits";
default: return "childProgramParts";
}
}
Ignorer la migration manuelle
Si la version cible est en 4.6 ou inférieur :
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Migration.jcr.addVersion("plugin.odfsync.import.apogee.jcr", "20210929T0000", "Ignore Manual migration for ODF-2995 on Apogée SCC");
Migration.jcr.addVersion("plugin.odfsync.import.apogee.jcr", "20210929T0000", "Ignore Manual migration for ODF-2995 on Apogée SCC");
Migration.jcr.addVersion("plugin.odfsync.import.apogee.jcr", "20210929T0000", "Ignore Manual migration for ODF-2995 on Apogée SCC");
Si la version cible est en 4.7 ou supérieur :
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Migration.addVersion("plugin.odfsync.import.apogee.jcr", null, null, "20210929T0000", "Ignore Manual migration for ODF-2995 on Apogée SCC");
Migration.addVersion("plugin.odfsync.import.apogee.jcr", null, null, "20210929T0000", "Ignore Manual migration for ODF-2995 on Apogée SCC");
Migration.addVersion("plugin.odfsync.import.apogee.jcr", null, null, "20210929T0000", "Ignore Manual migration for ODF-2995 on Apogée SCC");