cancel
Showing results for 
Search instead for 
Did you mean: 

[RESOLU] Re: Envoi d'email à tous les membres d'un site

matteo_1847
Champ in-the-making
Champ in-the-making
Bonjour,

Un petit problème qui me poursuit depuis quelques jours, et auquel je ne trouve pas de solutions… J'aimerais envoyer une notification à tous les utilisateurs du site lors d'une modification d'un document contenu dans un dossier.

"Il suffit d'appliquer une règle de contenu"
En effet, c'est bien ce que j'ai fait, mais il faut spécifier les destinataires. N'ayant pas de groupes dédié au site en question, je dois les rajouter à la main… Sauf que si un nouvel utilisateur arrive (ou quitte le site), il ne faudra pas oublier de l'ajouter dans la règle. Mauvaise solution donc !

"Ah, alors créés un groupe pour ton site"
Pourquoi pas, sauf que SEUL l'administrateur a le droit d'en créer un, et de rajouter des personnes dedans. Or ce n'est pas le rôle de l'administrateur, mais plutôt celui du gestionnaire d'ajouter un à un les utilisateurs au groupe (créé au pire par l'administrateur). Après quelques investigations, j'ai essayé de faire en sorte que le gestionnaire du site puisse avoir accès aux "groupes" en rajoutant dans le share-config.xml une permission pour le manager :
<item type="link" permission="siteManager" id="groups">/console/admin-console/groups</item>
Mais ça ne fonctionne pas, l'élément n'est pas disponible…

1. Existe-t-il une solution, ou une parade pour qu'un gestionnaire puisse créer un groupe ; ou au moins, ajouter et supprimer des personnes à un groupe pré-existant ??
2. Pourquoi n'existe-t-il pas un groupe automatiquement créé qui recenserait tous les utilisateurs d'un site (comme le everyone qui recense TOUS les utilisateurs) ?

Alfrecoeusement,

Matteo.
11 REPLIES 11

bertrandf
Champ on-the-rise
Champ on-the-rise
Il suffit d'appliquer une règle de contenu  Smiley Very Happy

Une règle qui exécute un script. Ce script récupère les utilisateurs du sites (la méthode getSiteShortName() est pratique pour connaitre le site en fonction du noeud) et envoi un mail (vous pouvez meme restreindre vos envois en fonction du rôle de chaque utilisateur).

Le tout en JavaScript :
http://wiki.alfresco.com/wiki/3.4_JavaScript_API
http://wiki.alfresco.com/wiki/3.4_JavaScript_Services_API

matteo_1847
Champ in-the-making
Champ in-the-making
Bonjour et merci pour ces indications !

J'ai donc commencé à écrire mon script, et je peux récupérer le nom de mon site en question.
Je suis maintenant bloqué pour récupérer les utilisateurs de mon site. Je m'explique, j'essaye d'utiliser la fonction listMembers() (sans paramètre pour tous les récupérer dans un premier temps) mais je n'y arrive pas… Je l'ai pourtant retourné dans tous les sens mais rien n'y fait… (http://wiki.alfresco.com/wiki/3.4_JavaScript_Services_API#Get_list_of_site_members)
// Récupérer le nom du site
var parent = document.getParent();
var leSite = parent.getSiteShortName();

// Et les membres
var membres = leSite.listMembers();
Erreur : "Cannot find function listMembers"

// ou encore
var membres = site.listMembers();
Erreur : ""site" n'est pas defini"

// ou encore …
var site = siteService.getSite(leSite);
var members = site.listMembers();
Erreur : La méthode 'org.alfresco.repo.site.script.Site.listMembers()' est introuvable"
Voili voilou, une petite idée? J'imagine que ça doit être tout bête, mais je sèche…

bertrandf
Champ on-the-rise
Champ on-the-rise
getSiteShortName() ne retourne pas un 'objet' site mais seulement son shortName.

Il faudrait faire qqch comme ca :
var shortName= parent.getSiteShortName();
var leSite = siteService.getSite(shortName);

var membres = leSite.listMembers();

[EDIT] Oups, je viens de voir que j'ai pas lu en entier votre POST.

Peut être essayer avec :
leSite.listMembers(null, null, 1000, false);

matteo_1847
Champ in-the-making
Champ in-the-making
Bonjour,

Merci, pour votre réactivité! J'avais en effet rectifié en mettant les paramètres pour listMembers. Cependant, il faut enlever le dernier booléen, sinon error ! (d'ailleurs, ça veut aussi dire que le wiki n'est pas à jour pour les params d'entrées ?)

J'avance progressivement… Je n'arrive toujours pas à récupérer un nom d'utilisateur, pour enfin avoir son email :
// On récupère les membres du site
var membres = leSite.listMembers(null,null,0);
var membre;
for each (membre in membres) {
   var donneesUtilisateur =  people.getPerson(membre);
   // Et je récupère l'email de la personne et c'est gagné…
Sauf que :
membre vaut : "siteCollaborator" et non l'id du premier membre du site…
et donc donneesUtilisateur vaut : null puisque aucun utilisateur ne s'appelle "siteCollaborator"…

D'après le Wiki, listMember() retourne : "Map<String, String>. The list of members of a site with their roles. If no name or role filter is specified, all members of the site are listed."
Je pense que j'utilise mal la ressource Map. Une suggestion d'utilisation ?

Merci, Matteo

bertrandf
Champ on-the-rise
Champ on-the-rise
(d'ailleurs, ça veut aussi dire que le wiki n'est pas à jour pour les params d'entrées ?)
Oui  Smiley Sad

Pour vous aider à avancer, allez voir le fichier memberships.get.js qui doit se trouver dans /alfresco/WEB-INF/classes/alfresco/templates/webscripts/org/alfresco/repository/site/membership/

matteo_1847
Champ in-the-making
Champ in-the-making
Bonjour,

Ca y est mon script d'envoi fonctionne, je le mets à disposition ici. Je me suis un peu arraché les cheveux, mais au moins je connais mieux l'API maintenant! Peut-être existe-t-il plus simple ou mieux codé, mais ça marche, c'est le principal  Smiley Happy

Ce script est à placer dans le répertoire 'scripts' du 'dictionnaire des données'. Il envoie un mail à tous les utilisateurs sauf l'administrateur (pour ne pas trop le spammer le pauvre!)

// Récupérer le nom du site
var parent = document.getParent();
var shortName= parent.getSiteShortName();
var leSite = siteService.getSite(shortName);

// On récupère les membres du site
var membres = leSite.listMembers(null,null,0);
var nomDuSite = leSite.title;
var membre;

for (membre in membres){
   var donneesMembres = people.getPerson(membre);
   var email = donneesMembres.properties.email;
   if (donneesMembres.properties.userName!="admin") {
      // create mail action
      var mail = actions.create("mail");
      mail.parameters.to = email;
      mail.parameters.subject = "Un document a été mis à jour dans l'univers '"+nomDuSite+"'…";
      mail.parameters.from = "admin@alfresco.fr";
      mail.parameters.template = companyhome.childByNamePath("Dictionnaire de données/Modèles d'e-mail/Modèles d'e-mail de notification/notify_user_email.ftl");
      mail.parameters.text = "Un document mis à jour !" ;
      // execute l'action
      mail.execute(document);
   }
}
A +, et merci à BertrandF !
P.S : si on veut seulement l'envoyer aux collaborateurs par exemple, il suffit d'appliquer un filtre dans listMembers().

[EDIT] : J'ai modifié le titre qui est un peu plus parlant pour ce qui a été fait finalement !

matteo_1847
Champ in-the-making
Champ in-the-making
O M G (ou OMD pour nous les francophones!)

Je crois rêver… Ce topic n'est malheureusement pas clôt… Je me suis rendu compte que j'obtenais des erreurs. Le pire, c'est que je ne comprends pas pourquoi je n'avais pas vu ces phénomènes quand j'avais fait mes tests, et pensait que c'était "Résolu"..

Bon le fait est là. Lorsque j'exécute le scénario suivant :
1. Ajouter 1 règle lors de "l'ajout ou création d'un document", exécuter l'action : "exécuter le script" ci-dessus.
2. Ajouter un fichier (build.xml) dans le répertoire (toto) concerné par la règle,
3. Consulter ce fichier, en y cliquant dessus.

Et j'obtiens dans ma boite mail, ces 3 mails :
"Le document suivant : build.xml, a été ajouté dans le dossier : toto." –> Ce mail est OK
"Le document suivant : doclib, a été ajouté dans le dossier : build.xml." –> ??? Celui-ci moins ….
"Le document suivant : webpreview, a été ajouté dans le dossier : build.xml." –> re ???

Y comprenez-vous quelque chose ??? Là je sèche, et ça me dépasse totalement.. Je pensais être pourtant si content de ce script……

bertrandf
Champ on-the-rise
Champ on-the-rise
Bonjour,

Les fichiers doclib et webpreview sont liés à la prévisualisation et la vignette d'un document.
Dans share, pour chaque document, vous retrouverez ces fichiers.

Dans votre script, il suffit de tester le type du document courant, si vous souhaitez envoyer des mails seulement pour des documents de type cm:content :

if (document.type == "{http://www.alfresco.org/model/content/1.0}content") {
}
ou

if (document.typeShort== "cm:content") {
}


Sinon, vous vérifiez que le document courant n'est pas une vignette ou une prévisualisation (type {http://www.alfresco.org/model/content/1.0}thumbnail) :
if (document.type != "{http://www.alfresco.org/model/content/1.0}thumbnail") {
}

matteo_1847
Champ in-the-making
Champ in-the-making
Bonjour,

Merci pour cette solution plus 'propre'… En effet, en attendant, je n'envoyais l'e-mail que si le nom du document ne s'appelait pas webpreview ou doclib… Donc ça fonctionnait également, jusqu'au jour où un utilisateur aurait ajouté un document intilué "webpreview"!..

Une dernière chose étrange, ce phénomène-ci. Cela ne concerne pas spécialement MA règle mais les règles en général, lors de la mise à jour d'un document :
1. je positionne l'unique règle de contenu suivante : quand "des éléments sont mis à jour dans le dossier" sur "tous les éléments" j'exécute l'action "envoyer un E-mail" à mon adresse.
2. j'ajoute un document —> la règle est déclenchée : je reçois un e-mail (alors qu'il s'agit d'un ajout et que la règle est définie pour les éléments mis à jour).
3. je mets à jour ce document (grace à "mettre à jour") —> je reçois 2 mails identiques (au lieu d'un seul).

Mon install d'alfresco (3.4-d) est pourtant clean… Puis-je vous demander si vous arrivez à reproduire le scénario ci-dessus?

Merci beaucoup.
Getting started

Tags


Find what you came for

We want to make your experience in Hyland Connect as valuable as possible, so we put together some helpful links.