From 7c18c1d85834f2cf5b3490d7a6f9b502cfe5f24b Mon Sep 17 00:00:00 2001
From: pbarroca <pbarroca@afi-sa.fr>
Date: Wed, 19 Mar 2014 16:01:46 +0100
Subject: [PATCH] Move admin vars help from controller to model

---
 .../admin/controllers/IndexController.php     | 105 ++--------
 library/Class/AdminVar.php                    | 187 ++++++++++--------
 2 files changed, 119 insertions(+), 173 deletions(-)

diff --git a/application/modules/admin/controllers/IndexController.php b/application/modules/admin/controllers/IndexController.php
index ccc4443205b..a8716ec14a2 100644
--- a/application/modules/admin/controllers/IndexController.php
+++ b/application/modules/admin/controllers/IndexController.php
@@ -33,7 +33,6 @@ class Admin_IndexController extends Zend_Controller_Action {
 			$this->view->etat_site="Le site est en ligne";
 			$this->view->lien_site="Rendre le site indisponible";
 			$this->view->href_site="false";
-
 		} else {
 			$this->view->etat_site="Le site est indisponible";
 			$this->view->lien_site="Remettre le site en ligne";
@@ -49,30 +48,29 @@ class Admin_IndexController extends Zend_Controller_Action {
 		$this->view->user = Class_Users::getLoader()->getIdentity();
 	}
 
+
 	public function adminvarAction()	{
-		$existing_variables = Class_AdminVar::getLoader()->findAllBy(['order' => 'CLEF']);
-		$existing_clefs = array();
+		$existing_variables = Class_AdminVar::findAllBy(['order' => 'CLEF']);
+		$existing_clefs = [];
 		foreach ($existing_variables as $var)
 			$existing_clefs[] = $var->getId();
 
 		// creer les variables manquantes
-		foreach (Class_AdminVar::getKnownVars() as $name) {
-			if (!in_array($name, $existing_clefs)) {
+		foreach (Class_AdminVar::getKnownVarsKeys() as $name)
+			if (!in_array($name, $existing_clefs))
 				$existing_variables[] = Class_AdminVar::set($name, '');
-			}
-		}
-		
+
+		xdebug_break();
 		$this->view->titre = 'Gestion des variables';
 		$this->view->vars = $existing_variables;
-
 	}
 
 
 
 	public function shouldEncodeVar($cle) {
 		return in_array($cle->getId(), 
-										array("REGISTER_OK", "RESA_CONDITION","TEXTE_MAIL_RESA",
-													"USER_VALIDATED", "USER_NON_VALIDATED"));
+										['REGISTER_OK', 'RESA_CONDITION', 'TEXTE_MAIL_RESA',
+										 'USER_VALIDATED', 'USER_NON_VALIDATED']);
 	}
 
 
@@ -98,14 +96,13 @@ class Admin_IndexController extends Zend_Controller_Action {
 			$this->_redirect('admin/index/adminvar');
 		}
 
-		if ($this->shouldEncodeVar($cle))
-			$this->view->var_valeur	= urldecode($cle->getValeur());
-		else
-			$this->view->var_valeur	= $cle->getValeur();
+		$this->view->var_valeur	= $this->shouldEncodeVar($cle) 
+			? urldecode($cle->getValeur())
+			: $cle->getValeur();
 
 		$this->view->var_cle		= $cle->getId();
-		$this->view->tuto				= $this->_getAdminVarHelpFor($cle->getId());
-		$this->view->titre			= 'Modifier la variable: '.$cle->getId();
+		$this->view->tuto				= Class_AdminVar::helpFor($cle->getId());
+		$this->view->titre			= 'Modifier la variable: ' . $cle->getId();
 	}
 
 
@@ -119,86 +116,14 @@ class Admin_IndexController extends Zend_Controller_Action {
 		$this->_redirect('admin');
 	}
 
+
 	public function clearcacheAction() {
 		Zend_Registry::get('cache')->clean(Zend_Cache::CLEANING_MODE_ALL);
 		$this->_redirect('admin/index/adminvar');
 	}
 
-	/**
-	 * @param string $name
-	 * @return string
-	 */
-	private function _getAdminVarHelpFor($name) {
-		$help = array(
-			'AVIS_MAX_SAISIE'           => 'Nombre de caractères maximum autorisé à saisir dans les avis.',
-			'AVIS_MIN_SAISIE'           => 'Nombre de caractères minimum autorisé à saisir dans les avis.',
-			'BLOG_MAX_NB_CARAC'         => "Nombre de caractères maximum à afficher dans le bloc critiques.",
-			'FACETTE_PCDM4_LIBELLE'			=> "Libellé affichage pour la PCDM4",
-			'FACETTE_DEWEY_LIBELLE'			=> "Libellé affichage pour la Dewey",
-			'NB_AFFICH_AVIS_PAR_AUTEUR' => "Nombre d'avis maximum à afficher par utilisateur.",
-			'CLEF_GOOGLE_MAP'           => 'Clef d\'activation pour le plan d\'accès google map. <a target="_blank" href="http://code.google.com/apis/maps/signup.html">Obtenir la clé google map</a>',
-			'MODO_AVIS'                 => 'Modération des avis des lecteurs.<br /> 0 = Affichage sans attente de validation<br /> 1 = Affichage seulement après validation.',
-			'MODO_AVIS_BIBLIO'          => 'Modération des avis des bibliothèquaires.<br />  0 = Affichage sans attente de validation<br /> 1 = Affichage seulement après validation.',
-			'AVIS_BIB_SEULEMENT'        => '0 = Les lecteurs peuvent donner leur avis. <br /> 1 = Seuls les bibliothèquaires peuvent donner leur avis',
-			'MODO_BLOG'                 => '0 = Ne requiert pas d\'identification pour saisir des  commentaires. <br /> 1 = Requiert l\'identification pour saisir des commentaires.',
-			'REGISTER_OK'               => 'Texte visible par l\'internaute après son inscription.',
-			'RESA_CONDITION'            => 'Texte visible après l\'envoi d\'e-mail de demande de réservation.',
-			'SITE_OK'                   => '0 = Site en maintenance. <br /> 1 = Site ouvert.',
-			'ID_BIBLIOSURF'             => 'Nom de la bibliothèque chez bibliosurf (en minuscules)',
-			'GOOGLE_ANALYTICS'          => 'Code Google Analytics',
-			'ID_READ_SPEAKER'           => 'Numéro de client Read Speaker <a target="_blank" href="http://webreader.readspeaker.com">http://webreader.readspeaker.com</a>',
-			'BLUGA_API_KEY'             => 'Clé API Bluga Webthumb <a target="_blank" href="http://webthumb.bluga.net/home">http://webthumb.bluga.net/home</a>',
-			'AIDE_FICHE_ABONNE'         => "Texte d'aide affiché dans la fiche abonné",
-			'INTERDIRE_ENREG_UTIL'      => "Supprime l'affichage du lien d'enregistrement dans les différents formulaires de connexion et interdit l'enregistrement d'utilisateurs",
-			'LANGUES'                   => "Liste des codes langue utilisées en plus du français séparées par des ;. Exemple: en;ro;es",
-			'WORKFLOW'									=> 'Activer ou désactiver la gestion des validations des articles<br />1 = Activé, Autre valeur = désactivé',
-			'BIBNUM'									  => 'Activer ou désactiver la bibliothèque numérique<br />1 = Activé, Autre valeur = désactivé',
-			'FORMATIONS'							  => 'Activer ou désactiver le module formation<br />1 = Activé, Autre valeur = désactivé',
-			'CACHE_ACTIF'               => implode(
-																			'<br/>',
-																			array(
-																				'Activer le cache des boîtes (meilleure performance mais mise à jour toutes les ' . ((int)Zend_Registry::get('cache')->getOption('lifetime')) / 60 . 'mn)',
-																				'0 = inactif',
-																				'1 = actif',
-																				sprintf(
-																					'<a href="%s" >Vider le cache</a>',
-																					$this->view->url(array('action' => 'clearcache'))
-																				)
-																			)
-																	 ),
-			'VODECLIC_KEY'              => 'Clé de sécurité Vodeclic',
-			'VODECLIC_ID'               => 'Identifiant partenaire Vodeclic',
-			'VODECLIC_BIB_ID'           => 'Identifiant code bibliothèque Vodeclic',
-			'OAI_SERVER'                => 'Activation du serveur OAI. 0 = inactif, 1 = actif',
-			'PACK_MOBILE'               => 'Activation des fonctions avancées du téléphone.  0 = inactif, 1 = actif',
-			'ARTE_VOD_LOGIN'            => 'Login ARTE VOD',
-			'ARTE_VOD_KEY'              => 'Clé ARTE VOD',
-			'ARTE_VOD_SSO_KEY'          => 'Clé ARTE VOD Single Sign-On',
-			'BABELTHEQUE_JS'            => 'URL du javascript Babelthèque à insérer dans l\'OPAC',
-			'MULTIMEDIA_KEY'            => 'Clé AFI-multimédia',
-			'CMS_FORMULAIRES'           => 'Activation des formulaires.  0 = inactif, 1 = actif',
-			'MENU_BOITE'                => 'Activation des boîtes dans les menus.  0 = inactif, 1 = actif',
-			'INTERDIRE_MODIF_FICHE_ABONNE'						=> 'Interdire la modification de la fiche abonne 0 = inactif, 1 = actif',
-			'CHAMPS_FICHE_UTILISATEUR'								=> 'Liste des champs que l\'utilisateur peux modifier. <br/>Ex: nom;prenom;pseudo;adresse;<br/>code_postal;ville;mail;is_contact_mail;<br/>telephone;is_contact_telephone;',
-			'URL_TYPO3'																=> 'Url d\'import d\un agenda TYPO3',
-			'AFFICHER_DISPONIBILITE_SUR_RECHERCHE'		=> 'Activation de la disponibilite dans le resultat de recherche.  0 = inactif, 1 = actif',
-			'NOM_DOMAINE'															=> 'Nom de domaine principal de l\'OPAC, ex: monopac.macommune.fr',
-			'WEBKIOSK_KEY'                            => 'Clé publique pour le cryptage des données Aesis Webkiosk',
-			'WEBKIOSK_RESERVATION_URL'                => 'URL d\'accès à l\'interface de réservation des postes Aesis Webkiosk',
-			'BOITE_PANIER_AUTO' => 'Ajouter automatiquement une boîte panier dans la division flottante.  0 = inactif, 1 = actif'
-			
-		);
-
-		if (!array_key_exists($name, $help)) {
-			return '';
-		}
-
-		return $help[$name];
-	}
-
 
 	public function heartbeatAction() {
 		$this->getHelper('ViewRenderer')->setNoRender();
 	}
-
 }
\ No newline at end of file
diff --git a/library/Class/AdminVar.php b/library/Class/AdminVar.php
index fb8c180f003..be706e695a6 100644
--- a/library/Class/AdminVar.php
+++ b/library/Class/AdminVar.php
@@ -18,91 +18,13 @@
  * along with AFI-OPAC 2.0; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
  */
-//////////////////////////////////////////////////////////////////////////////////////////
-// OPAC3 - Variables globales admin
-//////////////////////////////////////////////////////////////////////////////////////////
 
 class Class_AdminVar extends Storm_Model_Abstract {
 	protected $_table_name = 'bib_admin_var';
 	protected $_table_primary = 'CLEF';
 
 	/** @var array */
-	protected static $_knownVars = array(
-		'AVIS_MAX_SAISIE',
-		'AVIS_MIN_SAISIE',
-		'BLOG_MAX_NB_CARAC',
-		'NB_AFFICH_AVIS_PAR_AUTEUR',
-		'CLEF_GOOGLE_MAP',
-		'MODO_AVIS',
-		'MODO_AVIS_BIBLIO',
-		'AVIS_BIB_SEULEMENT',
-		'MODO_BLOG',
-		'REGISTER_OK',
-		'RESA_CONDITION',
-		'SITE_OK',
-		'ID_BIBLIOSURF',
-		'GOOGLE_ANALYTICS',
-		'ID_READ_SPEAKER',
-		'BLUGA_API_KEY',
-		'AIDE_FICHE_ABONNE',
-		'INTERDIRE_ENREG_UTIL',
-		'LANGUES',
-		'CACHE_ACTIF',
-		'WORKFLOW',
-		'WORKFLOW_TEXT_MAIL_ARTICLE_PENDING',
-		'WORKFLOW_TEXT_MAIL_ARTICLE_REFUSED',
-		'BIBNUM',
-		'FORMATIONS',
-		'VODECLIC_KEY',
-		'VODECLIC_ID',
-		'VODECLIC_BIB_ID',
-		'CVS_BMKEY',
-		'CVS_BMID',
-		'CVS_SOURCENAME',
-		'CVS_SOURCEID',
-		'CVS_SOURCEKEY',
-		'CVS_SOURCEPASSWORD',
-		'CVS_LOGINTEST',
-		'NUMILOG_URL',
-		'NUMILOG_OAI_URL',
-		'NUMILOG_OAI_IDBIB',
-		'OAI_SERVER',
-		'PACK_MOBILE',
-		'ARTE_VOD_LOGIN',
-		'ARTE_VOD_KEY',
-		'ARTE_VOD_SSO_KEY',
-		'BABELTHEQUE_JS',
-		'MULTIMEDIA_KEY',
-		'WEBKIOSK_KEY',
-		'WEBKIOSK_RESERVATION_URL',
-		'CSS_EDITOR',
-		'CMS_FORMULAIRES',
-		'MENU_BOITE',
-		'INTERDIRE_MODIF_FICHE_ABONNE',
-		'ROOT_URL_ECOUTE',
-		'URL_TYPO3',
-		'CHAMPS_FICHE_UTILISATEUR',
-		'FACETTE_PCDM4_LIBELLE',
-		'FACETTE_DEWEY_LIBELLE',
-		'FACETTE_TYPE_DOC_LIBELLE',
-		'FACETTE_LANGUE_LIBELLE',
-		'FACETTE_GENRE_LIBELLE',
-		'FACETTE_SITE_LIBELLE',
-		'FACETTE_SECTION_LIBELLE',
-		'FACETTE_BIBLIOTHEQUE_LIBELLE',
-		'FACETTE_AUTEUR_LIBELLE',
-		'FACETTE_INTERET_LIBELLE',
-		'FACETTE_MATIERE_LIBELLE',
-		'FACETTE_TAG_LIBELLE',
-		'AFFICHER_DISPONIBILITE_SUR_RECHERCHE',
-		'NOM_DOMAINE',
-		'TOUTAPPRENDRE_BIB_ID',
-		'TOUTAPPRENDRE_KEY',
-		'MUSICME_URL',
-		'MUSICME_BIB_ID',
-		'DATE_LAST_FULL_INTEGRATION_USERS',
-		'BOITE_PANIER_AUTO'
-	);
+	protected static $_knownVars;
 
 
 	/**
@@ -110,7 +32,6 @@ class Class_AdminVar extends Storm_Model_Abstract {
 	 * @return mixed
 	 */
 	public static function get($name) {
-
 		$var = static::getLoader()->find($name);
 		if ($var == null)
 			return null;
@@ -139,10 +60,12 @@ class Class_AdminVar extends Storm_Model_Abstract {
 		return $instance;
 	}
 
+
 	public static function getDefaultLanguage() {
 		return 'fr';
 	}
 
+
 	public static function getLangues() {
 		if (!$langues_value = self::get('LANGUES'))
 			return array();
@@ -159,6 +82,7 @@ class Class_AdminVar extends Storm_Model_Abstract {
 		return array_diff(self::getLangues(), array(self::getDefaultLanguage()));
 	}
 
+
 	/**
 	 * @return bool
 	 */
@@ -216,7 +140,6 @@ class Class_AdminVar extends Storm_Model_Abstract {
 	}
 
 
-
 	/**
 	 * @return bool
 	 */
@@ -312,14 +235,114 @@ class Class_AdminVar extends Storm_Model_Abstract {
 	}
 
 
+	public static function getKnownVarsKeys() {
+		return array_keys(static::getKnownVars());
+	}
+
+
 	/**
 	 * @return array
 	 */
 	public static function getKnownVars() {
+		if (null === self::$_knownVars)
+			self::$_knownVars = [
+				'AVIS_MAX_SAISIE' => 'Nombre de caractères maximum autorisé à saisir dans les avis.',
+				'AVIS_MIN_SAISIE' => 'Nombre de caractères minimum autorisé à saisir dans les avis.',
+				'BLOG_MAX_NB_CARAC' => 'Nombre de caractères maximum à afficher dans le bloc critiques.',
+				'NB_AFFICH_AVIS_PAR_AUTEUR'  => 'Nombre d\'avis maximum à afficher par utilisateur.',
+				'CLEF_GOOGLE_MAP' => 'Clef d\'activation pour le plan d\'accès google map. <a target="_blank" href="http://code.google.com/apis/maps/signup.html">Obtenir la clé google map</a>',
+				'MODO_AVIS' => 'Modération des avis des lecteurs.<br /> 0 = Affichage sans attente de validation<br /> 1 = Affichage seulement après validation.',
+				'MODO_AVIS_BIBLIO' => 'Modération des avis des bibliothèquaires.<br />  0 = Affichage sans attente de validation<br /> 1 = Affichage seulement après validation.',
+				'AVIS_BIB_SEULEMENT' => '0 = Les lecteurs peuvent donner leur avis. <br /> 1 = Seuls les bibliothèquaires peuvent donner leur avis',
+				'MODO_BLOG' => '0 = Ne requiert pas d\'identification pour saisir des  commentaires. <br /> 1 = Requiert l\'identification pour saisir des commentaires.',
+				'REGISTER_OK' => 'Texte visible par l\'internaute après son inscription.',
+				'RESA_CONDITION' => 'Texte visible après l\'envoi d\'e-mail de demande de réservation.',
+				'SITE_OK' => '0 = Site en maintenance. <br /> 1 = Site ouvert.',
+				'ID_BIBLIOSURF' => 'Nom de la bibliothèque chez bibliosurf (en minuscules)',
+				'GOOGLE_ANALYTICS' => 'Code Google Analytics',
+				'ID_READ_SPEAKER' => 'Numéro de client Read Speaker <a target="_blank" href="http://webreader.readspeaker.com">http://webreader.readspeaker.com</a>',
+				'BLUGA_API_KEY' => 'Clé API Bluga Webthumb <a target="_blank" href="http://webthumb.bluga.net/home">http://webthumb.bluga.net/home</a>',
+				'AIDE_FICHE_ABONNE' => 'Texte d\'aide affiché dans la fiche abonné',
+				'INTERDIRE_ENREG_UTIL' => 'Supprime l\'affichage du lien d\'enregistrement dans les différents formulaires de connexion et interdit l\'enregistrement d\'utilisateurs',
+				'LANGUES' => 'Liste des codes langue utilisées en plus du français séparées par des ;. Exemple: en;ro;es',
+				'CACHE_ACTIF' => implode('<br/>',
+																 ['Activer le cache des boîtes (meilleure performance mais mise à jour toutes les ' . ((int)Zend_Registry::get('cache')->getOption('lifetime')) / 60 . 'mn)',
+																	'0 = inactif',
+																	'1 = actif',
+																	sprintf('<a href="%s" >Vider le cache</a>',
+																					Class_Url::assemble(['module' => 'admin',
+																															 'action' => 'clearcache']))]),
+				'WORKFLOW' => 'Activer ou désactiver la gestion des validations des articles<br />1 = Activé, Autre valeur = désactivé',
+				'WORKFLOW_TEXT_MAIL_ARTICLE_PENDING' => '',
+				'WORKFLOW_TEXT_MAIL_ARTICLE_REFUSED' => '',
+				'BIBNUM' => 'Activer ou désactiver la bibliothèque numérique<br />1 = Activé, Autre valeur = désactivé',
+				'FORMATIONS' => 'Activer ou désactiver le module formation<br />1 = Activé, Autre valeur = désactivé',
+				'VODECLIC_KEY' => 'Clé de sécurité Vodeclic',
+				'VODECLIC_ID' => 'Identifiant partenaire Vodeclic',
+				'VODECLIC_BIB_ID' => 'Identifiant code bibliothèque Vodeclic',
+				'CVS_BMKEY' => '',
+				'CVS_BMID' => '',
+				'CVS_SOURCENAME' => '',
+				'CVS_SOURCEID' => '',
+				'CVS_SOURCEKEY' => '',
+				'CVS_SOURCEPASSWORD' => '',
+				'CVS_LOGINTEST' => '',
+				'NUMILOG_URL' => '',
+				'NUMILOG_OAI_URL' => '',
+				'NUMILOG_OAI_IDBIB' => '',
+				'OAI_SERVER' => 'Activation du serveur OAI. 0 = inactif, 1 = actif',
+				'PACK_MOBILE' => 'Activation des fonctions avancées du téléphone.  0 = inactif, 1 = actif',
+				'ARTE_VOD_LOGIN' => 'Login ARTE VOD',
+				'ARTE_VOD_KEY' => 'Clé ARTE VOD',
+				'ARTE_VOD_SSO_KEY' => 'Clé ARTE VOD Single Sign-On',
+				'BABELTHEQUE_JS' => 'URL du javascript Babelthèque à insérer dans l\'OPAC',
+				'MULTIMEDIA_KEY' => 'Clé AFI-multimédia',
+				'WEBKIOSK_KEY' => 'Clé publique pour le cryptage des données Aesis Webkiosk',
+				'WEBKIOSK_RESERVATION_URL' => 'URL d\'accès à l\'interface de réservation des postes Aesis Webkiosk',
+				'CSS_EDITOR' => '',
+				'CMS_FORMULAIRES' => 'Activation des formulaires.  0 = inactif, 1 = actif',
+				'MENU_BOITE' => 'Activation des boîtes dans les menus.  0 = inactif, 1 = actif',
+				'INTERDIRE_MODIF_FICHE_ABONNE' => 'Interdire la modification de la fiche abonne 0 = inactif, 1 = actif',
+				'ROOT_URL_ECOUTE' => '',
+				'URL_TYPO3' => 'Url d\'import d\un agenda TYPO3',
+				'CHAMPS_FICHE_UTILISATEUR' => 'Liste des champs que l\'utilisateur peux modifier. <br/>Ex: nom;prenom;pseudo;adresse;<br/>code_postal;ville;mail;is_contact_mail;<br/>telephone;is_contact_telephone;',
+				'FACETTE_PCDM4_LIBELLE' => 'Libellé affichage pour la PCDM4',
+				'FACETTE_DEWEY_LIBELLE' => 'Libellé affichage pour la Dewey',
+				'FACETTE_TYPE_DOC_LIBELLE' => '',
+				'FACETTE_LANGUE_LIBELLE' => '',
+				'FACETTE_GENRE_LIBELLE' => '',
+				'FACETTE_SITE_LIBELLE' => '',
+				'FACETTE_SECTION_LIBELLE' => '',
+				'FACETTE_BIBLIOTHEQUE_LIBELLE' => '',
+				'FACETTE_AUTEUR_LIBELLE' => '',
+				'FACETTE_INTERET_LIBELLE' => '',
+				'FACETTE_MATIERE_LIBELLE' => '',
+				'FACETTE_TAG_LIBELLE' => '',
+				'AFFICHER_DISPONIBILITE_SUR_RECHERCHE' => 'Activation de la disponibilite dans le resultat de recherche.  0 = inactif, 1 = actif',
+				'NOM_DOMAINE' => 'Nom de domaine principal de l\'OPAC, ex: monopac.macommune.fr',
+				'TOUTAPPRENDRE_BIB_ID' => '',
+				'TOUTAPPRENDRE_KEY' => '',
+				'MUSICME_URL' => '',
+				'MUSICME_BIB_ID' => '',
+				'DATE_LAST_FULL_INTEGRATION_USERS' => '',
+				'BOITE_PANIER_AUTO' => 'Ajouter automatiquement une boîte panier dans la division flottante.  0 = inactif, 1 = actif',
+				];
 		return self::$_knownVars;
 	}
 
 
+	/**
+	 * @param $name string
+	 * @return string
+	 */
+	public static function helpFor($name) {
+		if (!array_key_exists($name, static::getKnownVars()))
+			return '';
+		return static::getKnownVars()[$name];
+	}
+
+
+
 	/** @return bool */
 	public static function isCacheEnabled() {
 		return self::isModuleEnabled('CACHE_ACTIF');
@@ -380,13 +403,11 @@ class Class_AdminVar extends Storm_Model_Abstract {
 	}
 
 
-
 	public static function getChampsFicheUtilisateur() {
 		return array_filter(explode(';', trim(self::get('CHAMPS_FICHE_UTILISATEUR'))));
 	}
 
 
-
 	public static function getWorkflowTextMailArticlePending() {
 		if(!static::get('WORKFLOW_TEXT_MAIL_ARTICLE_PENDING'))
 			static::set('WORKFLOW_TEXT_MAIL_ARTICLE_PENDING',
-- 
GitLab