https://tracker.silverpeas.org/https://tracker.silverpeas.org/favicon.ico?17095821032018-06-21T12:53:24ZSilverpeas Issues TrackerSilverpeas Core - Feature #9884: Intitulé des objets de mails de notificationshttps://tracker.silverpeas.org/issues/9884?journal_id=526632018-06-21T12:53:24ZSebastien Vuilletsebastien.vuillet@silverpeas.com
<ul><li><strong>Projet</strong> changé de <i>151</i> à <i>Silverpeas Core</i></li><li><strong>Catégorie</strong> mis à <i>Notifications</i></li><li><strong>Assigné à</strong> <del><i>Sebastien Vuillet</i></del> supprimé</li></ul> Silverpeas Core - Feature #9884: Intitulé des objets de mails de notificationshttps://tracker.silverpeas.org/issues/9884?journal_id=557342018-11-09T09:40:51ZNicolas Eysseric
<ul><li><strong>Statut</strong> changé de <i>New</i> à <i>Assigned</i></li><li><strong>Assigné à</strong> mis à <i>Miguel Moquillon</i></li><li><strong>Version cible</strong> mis à <i>Version 6.1</i></li></ul><p>La plate-forme émet de nombreuses notifications qui, selon le paramétrage de l’utilisateur, sont adressées par mail. Certaines notifications sont manuelles. Via l’action <em>Notifier</em> du menu <em>Que voulez-vous faire ?</em>, elles sont adressées par un utilisateur à une liste de destinataires (groupes et utilisateurs). Avant envoi, l’émetteur peut ajouter un message complémentaire qui sera ajouté au contenu de la notification.</p>
<p>Ces notifications peuvent être personnalisées. Grâce au mécanisme de <em>StringTemplate</em>, le contenu peut être modifié aussi bien dans le fond (dans la limite des éléments disponibles) que dans la forme. Le sujet, quant à lui, ne peut pas être personnalisé. C'est l’objet de cette évolution.</p>
<p>Actuellement, le sujet des notifications reçues par mail est formé des éléments suivants :<br /><em>Nom de l’espace parent de l'application</em> – <em>Nom de l'application_ : _titre de la notification</em><br />Les deux premiers éléments sont ajoutés automatiquement. Le titre de la notification est quasi systématiquement <em>Notification de Prénom Nom</em>.</p>
<p>Silverpeas propose de mettre en œuvre les modifications suivantes :</p>
<ul>
<li>Pouvoir paramétrer le titre par défaut de la notification pour chaque type d'application (par exemple : <em>A propos de titre de la contribution</em>). </li>
<li>Permettre à l’expéditeur de changer ce titre lors de l’envoi de la notification. Sur l’écran qui permet déjà d'ajouter un message complémentaire, le titre par défaut sera affiché dans un nouveau champ texte et sera modifiable.</li>
<li>Pour les notifications par mail, ajout de paramètres globaux à la plate-forme qui permettent de personnaliser la localisation de la contribution : Affichage de l'espace parent Oui/Non, Affichage de l'application Oui/Non. Ces paramètres s'appliqueront à toutes les notifications reçues par mail.</li>
</ul>
<p>A cette occasion, la page d'envoi sera modernisée (liste des destinataires notamment).</p> Silverpeas Core - Feature #9884: Intitulé des objets de mails de notificationshttps://tracker.silverpeas.org/issues/9884?journal_id=557352018-11-09T09:53:51ZNicolas Eysseric
<ul><li><strong>Duplique</strong> <i><a class="issue tracker-2 status-5 priority-4 priority-default closed" href="/issues/954">Feature #954</a>: Personnalisation de l'objet des notifications</i> ajouté</li></ul> Silverpeas Core - Feature #9884: Intitulé des objets de mails de notificationshttps://tracker.silverpeas.org/issues/9884?journal_id=557372018-11-09T09:54:01ZNicolas Eysseric
<ul><li><strong>Duplique</strong> <i><a class="issue tracker-2 status-5 priority-4 priority-default closed" href="/issues/1865">Feature #1865</a>: Personalisation du sujet des notifications</i> ajouté</li></ul> Silverpeas Core - Feature #9884: Intitulé des objets de mails de notificationshttps://tracker.silverpeas.org/issues/9884?journal_id=557392018-11-09T09:54:14ZNicolas Eysseric
<ul><li><strong>Duplique</strong> <i><a class="issue tracker-2 status-5 priority-5 priority-high3 closed" href="/issues/6421">Feature #6421</a>: Amélioration des notifications manuelles</i> ajouté</li></ul> Silverpeas Core - Feature #9884: Intitulé des objets de mails de notificationshttps://tracker.silverpeas.org/issues/9884?journal_id=558042018-11-13T09:43:44ZMiguel Moquillonmiguel.moquillon@silverpeas.com
<ul><li><strong>Statut</strong> changé de <i>Assigned</i> à <i>In progress...</i></li></ul> Silverpeas Core - Feature #9884: Intitulé des objets de mails de notificationshttps://tracker.silverpeas.org/issues/9884?journal_id=567942018-12-19T11:19:57ZMiguel Moquillonmiguel.moquillon@silverpeas.com
<ul><li><strong>Statut</strong> changé de <i>In progress...</i> à <i>Resolved</i></li></ul><p>La réalisation de cette feature a permis d'unifier les différents mécanismes de notification manuelle aux utilisateurs. En effet, il existait non seulement plusieurs IHM mais aussi deux principaux services sans parler de ceux propres à certaines applications ou composant dans Silverpeas.</p>
<p>Désormais, le service <code>AlertUser</code> est supprimé et c'est celui <code>UserNotification</code> (anciennement <code>NotificationUser</code>) qui est utilisé et qui a été amélioré en vue d'offrir un seul et unique mécanisme transverse. Ce service est associé avec le widget Javascript <code>sp.messager</code> qui fourni l'IHM. <code>sp.messager</code> est la partie traitement de la vue <code>userNotification/jsp/notificationSender.jsp</code> qui elle génère la représentation HTML.</p>
<a name="Le-nouveau-mécanisme"></a>
<h1 >Le nouveau mécanisme<a href="#Le-nouveau-mécanisme" class="wiki-anchor">¶</a></h1>
La notification manuelle (ou l'envoi de message aux utilisateurs) est centrée autour de deux objets logiciels principaux :
<ul>
<li><code>ManualUserNotificationSupplier</code> : une interface qui a pour objectif de fournir une instance de <code>UserNotification</code>, représentation d'une notification manuelle créée par et pour un composant Silverpeas (service transverse comme la notification aux administrateurs ou une application comme Kmelia). Les implémentations de cette interface ont pour but de préparer la notification manuelle à envoyer en fonction du contexte dans lequel elle est demandée (nous détaillerons ceci plus bas).</li>
<li><code>ManualUserNotificationSuppliers</code> : une classe qui représente une collection d'objets <code>ManualUserNotificationSupplier</code>. Elle est alimentée par chaque composant de Silverpeas et elle est directement utilisée par le service <code>UserNotification</code> pour obtenir la notification à personnaliser avec les informations qu'a rentré l'utilisateur (l'envoyeur) pour ensuite l'envoyer.</li>
</ul>
La notification manuelle suit les étapes suivantes :
<ol>
<li>Ajout d'une implémentation à <code>ManualUserNotificationSupplier</code> dans la collection <code>ManualUserNotificationSuppliers</code> par chaque composant dans Silverpeas qui souhaite supporter la fonctionnalité de notification manuelle.</li>
<li>Lors d'un appel à la notification manuelle par un utilisateur, ici l'envoyeur, <code>sp.messager</code> est invoqué avec l'identifiant du composant par lequel la notification est demandée et un contexte de notification. <code>sp.messager</code> requête alors à <code>UserNotification</code>, avec les informations passées, l'IHM de la rédaction de message pour l'ouvrir dans une popup Javascript. </li>
<li>A la requête de <code>sp.messager</code>, <code>UserNotification</code> demande à <code>ManualUserNotificationSuppliers</code> l'objet <code>ManualUserNotificationSupplier</code> correspondant au composant Silverpeas et demande à ce dernier de lui fournir, en fonction du contexte de notification, une instance de <code>UserNotification</code> qu'il pourra par la suite personnaliser. Il renvoie à <code>sp.messager</code> l'IHM généré par <code>notificationSender.jsp</code>.</li>
<li>Une popup est affichée à l'utilisateur par <code>sp.messager</code> et l'envoyeur peut alors indiquer des destinataires (si ces derniers ne sont pas déjà fixé et non éditables), un sujet et un contenu de message. A la validation du message, <code>sp.messager</code> poste celui-ci au service <code>UserNotification</code>.</li>
<li>Le service <code>UserNotification</code>, à la réception du message de la part de <code>sp.messager</code>, personnaliser la notification utilisateur qu'il a précédemment récupérée avec les destinataires, le sujet et le contenu du message puis l'envoie ensuite.</li>
<li><code>sp.messager</code> ferme la popup.</li>
</ol>
<p>Afin d'automatiser le 1., l'ajout d'un <code>ManualUserNotificationSupplier</code> dans la collection <code>ManualUserNotificationSuppliers</code> est faite directement dans la classe <code>ComponentRequestRouter</code> qui est héritée par l'ensemble des routeurs Web de Silverpeas. Celle-ci, à la création d'une instance de <code>ComponentSessionController</code>, demande à cette dernière de lui donner un <code>ManualUserNotificationSupplier</code> qu'elle enregistre sous le nom du composant :</p>
<pre><code class="java syntaxhl" data-language="java"> <span class="kd">private</span> <span class="kt">void</span> <span class="nf">registerManualUserNotificationSupplier</span><span class="o">(</span><span class="kd">final</span> <span class="nc">String</span> <span class="n">componentId</span><span class="o">,</span> <span class="kd">final</span> <span class="no">T</span> <span class="n">ctrl</span><span class="o">)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="nc">StringUtil</span><span class="o">.</span><span class="na">isNotDefined</span><span class="o">(</span><span class="n">componentId</span><span class="o">))</span> <span class="o">{</span>
<span class="kd">final</span> <span class="nc">String</span> <span class="n">componentName</span> <span class="o">=</span> <span class="n">getSessionControlBeanName</span><span class="o">();</span>
<span class="nc">ManualUserNotificationSuppliers</span> <span class="n">suppliers</span> <span class="o">=</span>
<span class="nc">ServiceProvider</span><span class="o">.</span><span class="na">getService</span><span class="o">(</span><span class="nc">ManualUserNotificationSuppliers</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
<span class="n">suppliers</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">componentName</span><span class="o">,</span> <span class="n">ctrl</span><span class="o">.</span><span class="na">getManualUserNotificationSupplier</span><span class="o">());</span>
<span class="o">}</span> <span class="k">else</span> <span class="k">if</span> <span class="o">(!</span><span class="nc">PersonalComponentInstance</span><span class="o">.</span><span class="na">from</span><span class="o">(</span><span class="n">componentId</span><span class="o">).</span><span class="na">isPresent</span><span class="o">())</span> <span class="o">{</span>
<span class="kd">final</span> <span class="nc">String</span> <span class="n">componentName</span> <span class="o">=</span> <span class="nc">ComponentInst</span><span class="o">.</span><span class="na">getComponentName</span><span class="o">(</span><span class="n">componentId</span><span class="o">);</span>
<span class="nc">ManualUserNotificationSuppliers</span> <span class="n">suppliers</span> <span class="o">=</span>
<span class="nc">ServiceProvider</span><span class="o">.</span><span class="na">getService</span><span class="o">(</span><span class="nc">ManualUserNotificationSuppliers</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
<span class="n">suppliers</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">componentName</span><span class="o">,</span> <span class="n">ctrl</span><span class="o">.</span><span class="na">getManualUserNotificationSupplier</span><span class="o">());</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre>
<p>Pour ce faire, une méthode a été ajoutée à <code>ComponentSessionController</code> : <code>#getManualUserNotificationSupplier()</code>. Par défaut, cette méthode retourne une notification utilisateur vide :<br /><pre><code class="java syntaxhl" data-language="java"><span class="k">default</span> <span class="nc">ManualUserNotificationSupplier</span> <span class="nf">getManualUserNotificationSupplier</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">c</span> <span class="o">-></span> <span class="k">new</span> <span class="nc">NullUserNotification</span><span class="o">();</span>
<span class="o">}</span>
</code></pre></p>
<p>La conséquence de ceci est que tous les composants de Silverpeas (doté du trio MVC) ont par défaut un <code>ManualUserNotificationSupplier</code> dans <code>ManualUserNotificationSuppliers</code>. Celui-ci fournit une notification utilisateur vide et donc, pour supporter la notification manuelle, en dehors d'ajouter la fonction dans son IHM, le composant Silverpeas a juste à implémenter la méthode <code>#getManualUserNotificationSupplier()</code> avec son propre <code>ManualUserNotificationSupplier</code> dans son contrôleur web.</p>
<p>Un petit mot sur <code>ManualUserNotificationSupplier</code>. Ce dernier supporte qu'une seule méthode qui accepte comme argument une instance de <code>NotificationContext</code>. Cette instance est construite par <code>UserNotificationRequestRouter</code> à partir des paramètres de la requête HTTP reçue de <code>sp.messager</code> :</p>
<pre><code class="java syntaxhl" data-language="java"><span class="kd">private</span> <span class="nc">NotificationContext</span> <span class="nf">getNotificationContext</span><span class="o">(</span><span class="kd">final</span> <span class="nc">HttpRequest</span> <span class="n">request</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">final</span> <span class="nc">NotificationContext</span> <span class="n">context</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">NotificationContext</span><span class="o">();</span>
<span class="nc">Enumeration</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">parameters</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="na">getParameterNames</span><span class="o">();</span>
<span class="k">while</span> <span class="o">(</span><span class="n">parameters</span><span class="o">.</span><span class="na">hasMoreElements</span><span class="o">())</span> <span class="o">{</span>
<span class="kd">final</span> <span class="nc">String</span> <span class="n">name</span> <span class="o">=</span> <span class="n">parameters</span><span class="o">.</span><span class="na">nextElement</span><span class="o">();</span>
<span class="n">context</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">name</span><span class="o">,</span> <span class="n">request</span><span class="o">.</span><span class="na">getParameter</span><span class="o">(</span><span class="n">name</span><span class="o">));</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">context</span><span class="o">;</span>
<span class="o">}</span>
</code></pre>
Ce contexte est initialement passé en argument à <code>sp.messager</code> via sa fonction <code>open(instanceId, context)</code>. Par exemple, avec l'application Quizz :<br /><pre><code class="javascript syntaxhl" data-language="javascript"><span class="nx">sp</span><span class="p">.</span><span class="nx">messager</span><span class="p">.</span><span class="nf">open</span><span class="p">(</span><span class="nx">compoId</span><span class="p">,</span> <span class="p">{</span><span class="na">recipientUsers</span><span class="p">:</span> <span class="nx">users</span><span class="p">,</span> <span class="na">recipientGroups</span><span class="p">:</span> <span class="nx">groups</span><span class="p">,</span> <span class="na">recipientEdition</span><span class="p">:</span> <span class="kc">false</span><span class="p">});</span>
</code></pre><br />Un certain nombre de propriétés de contexte sont prédéfinis :
<ul>
<li><code>recipientUsers</code>: une chaîne de caractère avec les identifiants d'utilisateurs destinataires, séparés chacun par un virgule.</li>
<li><code>recipientGroups</code>: une chaîne de caractère avec les identifiants de groupes destinataires, séparés chacun par un virgule.</li>
<li><code>recipientEdition</code>: un booléen indiquant si oui ou non l'envoyeur peut éditer les destinataires de la notification.</li>
</ul>
<p>Mais n'importe quelle propriété peut être spécifiée avec l'assurance que celle-ci soit transmise au <code>ManualUserNotificationSupplier</code> du composant afin qu'il puisse fournir correctement la bonne notification utilisateur.</p>
<a name="La-personnalisation-programmatique"></a>
<h1 >La personnalisation programmatique<a href="#La-personnalisation-programmatique" class="wiki-anchor">¶</a></h1>
Le sujet d'une notification aux utilisateurs est fixée et donnée par la propriété <code>GML.st.notification.subject</code> qui contient une expression <code>StringTemplate</code>. Celle-ci peut-être personnalisée par les composants de deux manières différentes :
<ul>
<li>en définissant la propriété <code>custom.st.notification.subject</code> dans leur ressources multi-langue,</li>
<li>en surchargeant la méthode <code>AbstractTemplateUserNotificationBuilder#getBundleSubjectKey()</code> pour lui faire retourner la clé relative au sujet à utiliser dans la ressource multi-langue du composant.</li>
</ul>
A côté de cette personnalisation, une plus globale peut aussi être définie. Par défaut, le sujet d'une notification est préfixé par le nom de l'espace suivi du nom de l'instance de l'application à partir duquel la notification est envoyée. Or, dans certains cas, cette information peut être redondante, voir non désirée pour des raisons diverses et variées. Pour ce faire, deux propriétés ont vue le jour dans le fichier de propriété <code>SILVERPEAS_HOME/properties/org/silverpeas/notificationManager/settings/notificationManagerSettings.properties</code> :
<ul>
<li><code>notification.source.spaceLabel</code> : un booléen pour indiquer si ou non le nom de l'espace doit être indiqué dans le sujet d'une notification manuelle,</li>
<li><code>notification.source.componentLabel</code> : un booléen pour indiquer si ou non le nom de l'instance d'application doit être indiqué dans le sujet d'une notification manuelle.</li>
</ul> Silverpeas Core - Feature #9884: Intitulé des objets de mails de notificationshttps://tracker.silverpeas.org/issues/9884?journal_id=569652018-12-28T13:45:32ZNicolas Eysseric
<ul><li><strong>Statut</strong> changé de <i>Resolved</i> à <i>Closed</i></li><li><strong>% réalisé</strong> changé de <i>0</i> à <i>100</i></li></ul><p>Validé et intégré...</p>