Propriétés systèmes sur les valideurs


Cette page ne doit être appliquée que si le script vous demande de passer la migration manuelle data.CMS.20221212.validator.systemProperty

Contexte

Le passage en version 4.6 implique une migration auto permettant l'ajout des propriétés firstValidator, lastValidator et lastMajorValidator sur tout les contenus.

Cette migration impliquant de migrer l'ensemble des contenus ayant déjà été validé, elle peut s'avérer très longue (+12h).

Pour les repos de taille importante (notamment les repos ODF) il est possible de faire cette migration en avance de phase et en plusieurs fois. En exécutant en plusieurs fois le script de migration sur des sous-ensembles de donnés. Le support d'un développeur pour réaliser l'opération est fortement recommandé !

Que vous choisissiez ou non de faire une pré migration, il est nécessaire de réaliser une réindexation totale Solr après la migration auto.

Migration en avance de phase

Pour réaliser une pré migration des contenus, il vous faut exécuter le script de migration en y apportant les modifications suivantes :

  • Définir le logger en ajoutant la ligne suivante au tout début du script

let logger = Ametys.getLogger("script.migration.validator", { "filename": "migration-validator", "level": "info" });
  • Modifier la constante query (l 26) pour ne cibler qu'un sous ensemble de contenus par exemple pour migrer tous les contenus de type Article

Penser à laisser la condition [@ametys:lastValidationDate] pour vous assurer de ne traiter que des contenus qui ont été validé au moins une fois

const query = "//element(*, ametys:content)[@ametys:lastValidationDate][@ametys-internal:contentType='article']";
  • Remplacer la fonction _setValidators par les deux fonctions suivantes
function _setValidators(validators, content)
{
    if (validators.first)
    {
_setUserMetadata(validators.first, "firstValidator", content);
    }
    if (validators.last)
    {
_setUserMetadata(validators.first, "lastValidator", content);
    }
    if (validators.lastMajor)
    {
_setUserMetadata(validators.first, "lastMajorValidator", content);
    }
}
  
function _setUserMetadata(user, metadataName, content)
{
  try
  {
  let repositoryData = new org.ametys.plugins.repository.data.repositorydata.impl.JCRRepositoryData(content.getNode());
      let creatorRepositoryData;
      if (repositoryData.hasValue(metadataName))
      {
          creatorRepositoryData = repositoryData.getRepositoryData(metadataName);
      }
      else
      {
          creatorRepositoryData = repositoryData.addRepositoryData(metadataName, org.ametys.plugins.repository.RepositoryConstants.USER_NODETYPE);
      }
      creatorRepositoryData.setValue("login", user.getLogin());
      creatorRepositoryData.setValue("population", user.getPopulationId());
  }
  catch (e)
  {
          throw new org.ametys.plugins.repository.AmetysRepositoryException("Error setting the metadata '" + metadataName + "' for content '" + content.getId() + "' with value '" + UserIdentity.userIdentityToString(user) + "'.", e);
  }   
}

Le script est conçu pour être re-jouable. Un contenu qui a déjà été impacté par ce script ne sera pas ré-impacté. Ça veut dire qu'il ne faut pas avoir peur de faire des query qui toucherait des éléments déjà migré par une exécution précédente

Le script va pour chacun des contenus vérifier s'il porte déjà une valeur de lastValidator (pour déterminer si le contenu est déjà migré) et si ce n'est pas le cas, calculé les valeurs des trois propriétés et les stocker.

Il n'est pas obligatoire de pré migrer tout les contenus. Tous les contenus que vous n'aurez pas pré-migré avant la monté de version seront migré lors de la monté de version.

Mise à jour des données pré migrées

Si des contenus pré migré sont re validé entre la pré migration et la monté de version, les propriétés de ces contenus ne seront plus à jour (puisque les mécanismes de mise à jour ne sont présent que dans la nouvelle version). Il va donc être nécessaire de mettre à jour ces contenus entre la migration auto et la réindexation pour avoir des données à jour.

Si vous savez que certains contenus / type de contenus sont sujet à des modifications régulières, il peut être malin d'éviter de les pré migrer pour limiter la quantité de contenu à rattraper.

Pour faire ce faire, ré-exécuter le script de pré migration en ciblant les contenus qui ont été validé depuis que vous avez commencé les pré migrations par exemple avec une query de la forme où la date indiquée est celle de la première pré-migration :

const query = "//element(*, ametys:content)[@ametys:lastValidationDate >= xs:dateTime("2022-12-12T00:00:00.000+02:00")]";
Retour en haut