Relation Utilisateur du CMS et contenu utilisateur
Dernière publication:30/10/2018à 15:56LaureLopez
Type de contenu Utilisateur
Le type abstrait "Utilisateur" a changé. Il apporte maintenant la donnée "user" qui est de type "user".
Pour les projets qui ont défini leur propre type de contenu "utilisateur" qui étend "org.ametys.plugins.userdirectory.Content.user", il faudra changer les metadataset du contenu pour prendre en compte la donnée "user" :
Il faut surtout la positionner sur le metadataset "creation" en édition.
Et éviter de la positionner sur les autres metadataset en édition.
Les SCC
Si les utilisateurs de votre annuaire sont liés aux utilisateurs du CMS :
Changer la définition de vos SCC dans l'administration :
Si c'est une "Source de données SQL", sélectionner à la place "Annuaire des utilisateurs : entités depuis une source de données SQL" et renseigner les champs
Si c'est une "Source de données LDAP", sélectionner à la place "Annuaire des utilisateurs : entités depuis une source de données LDAP" et renseigner les champs
Si c'est une "Annuaire des utilisateurs : utilisateurs depuis une population Ametys", juste modifier et enregistrer.
Lorsque vous allez changer le type de la SCC, certains paramètres vont se réinitialiser. Pour voir les anciens paramètres, vous pouvez regarder le fichier "synchronizable-collection.xml" dans le dossier /data/config. Ce fichier sera écrasé au moment où vous sauvegardez.
Passer le script de migration suivant en paramétrant :
Le type de contenu à migrer
L'identifiant de la SCC
La donnée du contenu qui porte le champs unique du contenu (la plupart du temps c'est login)
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
var contentType = "org.ametys.plugin.defaultud.Content.uduser"; // TODO set this field
var sccId = "utilisateurs"; // TODO set this field
var fieldId = "login"; // TODO set this field
var unlock = function(node)
{
var lockToken = node.getProperty(RepositoryConstants.METADATA_LOCKTOKEN).getString();
var lockManager = node.getSession().getWorkspace().getLockManager();
lockManager.addLockToken(lockToken);
lockManager.unlock(node.getPath());
// Remove residual properties
node["setProperty(java.lang.String,javax.jcr.Value)"](RepositoryConstants.METADATA_LOCKTOKEN, null);
node["setProperty(java.lang.String,javax.jcr.Value)"](RepositoryConstants.METADATA_LOCKOWNER, null);
node.getSession().save();
}
var qm = session.getWorkspace().getQueryManager();
var query = qm.createQuery("//element(*, ametys:content)[@ametys-internal:contentType='" + contentType + "' "
+ "and @ametys-internal:scc = '" + sccId + "']", javax.jcr.query.Query.XPATH);
var nodes = query.execute().getNodes();
var nbContent = 0;
while (nodes.hasNext())
{
var content = nodes.next();
if (content.isLocked())
{
unlock(content);
}
content.setProperty("ametys:uniqueId", content.getProperty("ametys:" + fieldId).getString());
content.save();
nbContent++;
}
print(nbContent + " contenu(s) changé(s)");
queryPage = qm.createQuery("//element(*, ametys:defaultPage)[@ametys-internal:virtual ='org.ametys.plugins.userdirectory.page.VirtualUserDirectoryPageFactory']", javax.jcr.query.Query.XPATH);
var nodePages = queryPage.execute().getNodes();
var nbPage = 0;
while (nodePages.hasNext())
{
var page = nodePages.next();
var metadata = page.getProperty("ametys:user-directory-root-classification-metadata").getString();
if (metadata == fieldId)
{
page.setProperty("ametys:user-directory-root-classification-metadata", "uniqueId");
page.save();
nbPage++;
}
}
print(nbPage + " page(s) changée(s)");
var contentType = "org.ametys.plugin.defaultud.Content.uduser"; // TODO set this field
var sccId = "utilisateurs"; // TODO set this field
var fieldId = "login"; // TODO set this field
var unlock = function(node)
{
var lockToken = node.getProperty(RepositoryConstants.METADATA_LOCKTOKEN).getString();
var lockManager = node.getSession().getWorkspace().getLockManager();
lockManager.addLockToken(lockToken);
lockManager.unlock(node.getPath());
// Remove residual properties
node["setProperty(java.lang.String,javax.jcr.Value)"](RepositoryConstants.METADATA_LOCKTOKEN, null);
node["setProperty(java.lang.String,javax.jcr.Value)"](RepositoryConstants.METADATA_LOCKOWNER, null);
node.getSession().save();
}
var qm = session.getWorkspace().getQueryManager();
var query = qm.createQuery("//element(*, ametys:content)[@ametys-internal:contentType='" + contentType + "' "
+ "and @ametys-internal:scc = '" + sccId + "']", javax.jcr.query.Query.XPATH);
var nodes = query.execute().getNodes();
var nbContent = 0;
while (nodes.hasNext())
{
var content = nodes.next();
if (content.isLocked())
{
unlock(content);
}
content.setProperty("ametys:uniqueId", content.getProperty("ametys:" + fieldId).getString());
content.save();
nbContent++;
}
print(nbContent + " contenu(s) changé(s)");
queryPage = qm.createQuery("//element(*, ametys:defaultPage)[@ametys-internal:virtual ='org.ametys.plugins.userdirectory.page.VirtualUserDirectoryPageFactory']", javax.jcr.query.Query.XPATH);
var nodePages = queryPage.execute().getNodes();
var nbPage = 0;
while (nodePages.hasNext())
{
var page = nodePages.next();
var metadata = page.getProperty("ametys:user-directory-root-classification-metadata").getString();
if (metadata == fieldId)
{
page.setProperty("ametys:user-directory-root-classification-metadata", "uniqueId");
page.save();
nbPage++;
}
}
print(nbPage + " page(s) changée(s)");
var contentType = "org.ametys.plugin.defaultud.Content.uduser"; // TODO set this field
var sccId = "utilisateurs"; // TODO set this field
var fieldId = "login"; // TODO set this field
var unlock = function(node)
{
var lockToken = node.getProperty(RepositoryConstants.METADATA_LOCKTOKEN).getString();
var lockManager = node.getSession().getWorkspace().getLockManager();
lockManager.addLockToken(lockToken);
lockManager.unlock(node.getPath());
// Remove residual properties
node["setProperty(java.lang.String,javax.jcr.Value)"](RepositoryConstants.METADATA_LOCKTOKEN, null);
node["setProperty(java.lang.String,javax.jcr.Value)"](RepositoryConstants.METADATA_LOCKOWNER, null);
node.getSession().save();
}
var qm = session.getWorkspace().getQueryManager();
var query = qm.createQuery("//element(*, ametys:content)[@ametys-internal:contentType='" + contentType + "' "
+ "and @ametys-internal:scc = '" + sccId + "']", javax.jcr.query.Query.XPATH);
var nodes = query.execute().getNodes();
var nbContent = 0;
while (nodes.hasNext())
{
var content = nodes.next();
if (content.isLocked())
{
unlock(content);
}
content.setProperty("ametys:uniqueId", content.getProperty("ametys:" + fieldId).getString());
content.save();
nbContent++;
}
print(nbContent + " contenu(s) changé(s)");
queryPage = qm.createQuery("//element(*, ametys:defaultPage)[@ametys-internal:virtual ='org.ametys.plugins.userdirectory.page.VirtualUserDirectoryPageFactory']", javax.jcr.query.Query.XPATH);
var nodePages = queryPage.execute().getNodes();
var nbPage = 0;
while (nodePages.hasNext())
{
var page = nodePages.next();
var metadata = page.getProperty("ametys:user-directory-root-classification-metadata").getString();
if (metadata == fieldId)
{
page.setProperty("ametys:user-directory-root-classification-metadata", "uniqueId");
page.save();
nbPage++;
}
}
print(nbPage + " page(s) changée(s)");
Relancer une synchronisation de contenu pour finaliser la migration.
Le UserXSLTHelper
Il est fort probable que dans vos projet, vous ayez créé votre propre helper XSLT pour surcharger la méthode getCurrentUserContent. Vous pouvez maintenant supprimer cette surcharge et utiliser la méthode noyau getCurrentUserContent du helper org.ametys.plugins.userdirectory.transformation.xslt.UserXSLTHelper.
Il faudra aussi bien penser à remettre ce helper noyau dans vos XSL à la place du helper projet
De plus, il y a surement une condition de workflow qui a été créé dans votre projet pour faire appel à votre Helper personnalisé (cette condition est souvent appelée CheckCurrentUserContentCondition) Elle n'est plus utile non plus, vous pouvez la supprimer (avec sa déclaration dans le plugin.xml)
Et vous pouvez à nouveau appeler la condition noyau org.ametys.plugins.userdirectory.workflow.CheckCurrentUserContentCondition.