cancel
Showing results for 
Search instead for 
Did you mean: 

Workflow Assigne Search

sibe
Champ on-the-rise
Champ on-the-rise
Bonjour,

Lors de l'assignation d'un workflow à un ou des utilisateurs, je voudrais que seul les membres du site soit renvoyés quand on utilise le terme "*".
J'ai trouvé cette explication de Jeff Potts http://stackoverflow.com/questions/9413881/filter-user-in-select-bpmassignee-control-alfresco

Je croyais qu'il fallait peut être modifier le web script alfresco/api/forms/picker/authority/children?selectableType=cmSmiley Tongueerson&searchTerm=*&size=100 qui utilise le script pickerchildren.get.js disponible dans classpath:alfresco/templates/webscripts/org/alfresco/repository/forms.

Merci de votre inspiration.
15 REPLIES 15

cleseach
Star Contributor
Star Contributor
Bonjour,

La discussion sur Stackoverflow porte sur la sélection dans un groupe particulier. Et la modification du people picker est une bonne solution dans ce cas.
Ton besoin est de pouvoir disposer des membres du site, ce qui complique beaucoup les choses.

En effet, il est possible de démarrer un workflow dans le contexte d'un site, aussi bien que dans le contexte "global" de l'application (entrepôt ou liste des tâches). Et dans cette seconde situation, il n'est plus question de site.

Il va donc falloir que tu ajustes transmette une information supplémentaire au people picker pour indiquer dans quel contexte tu te situes (site / pas site) et faire la recherche sur les personnes en fonction de cette information.
Un peu de travail en prévision !

Cordialement,
Charles Le Seac'h

sibe
Champ on-the-rise
Champ on-the-rise
Hello Charles,

Merci pour ta réponse je vais voir alors comme prévu le script people picker. Exactement il y'a les 2 cas de figures d'une part le contexte site et d'autre part le contexte pas site ==> Concernant ce dernier cas de figure j’essaierai juste de récupérer la liste des utilisateurs qui sont membres du ou des sites dont l'utilisateur courant (l'initiateur du workflow) est aussi membre.
ça ne va pas être facile mais je vais essayer ka même. Je te tiens au courant n'hésite pas si tu as des idées supplémentaires.

Merci

sibe
Champ on-the-rise
Champ on-the-rise
Finalement comme prévu j'ai modifié le script people picker en utilisant le service siteService, ça ressemble à peut près aux lignes ci dessous  :

var sites = siteService.listUserSites(authorityName);
           for each(var site in sites)
       {
         if(site.shortName != null || authorityName != null)
         {
            if(site.isMember(authorityName))
            {
               logger.log("nodeUser ==> " + user.person.properties.userName);   
               // add to results
               results.push(
               {
                  item: createPersonResult(user.person),
                  selectable: true
               });
            }
         }
       }

Déjà avec ça j'arrive à récupérer que les users qui sont membre d'au moins un site. J'ai juste pour l'instant un problème de doublons dans certains cas le script me retourne le même plus d'une fois (car l'user concerné est membre d'au moins un site). Exemple si l'utilisateur est membre de 2 sites le script retourne 2 fois le  même utilisateur. Je vais essayé de supprimer ces doublons.

sibe
Champ on-the-rise
Champ on-the-rise
Re bonjour,

Merci Charles pour le topo, par contre comment je peux faire pour retourner un utilisateur une seule fois(éviter de retourner le même noderef plusieurs fois) : Je ne sais pas comment faire dans la boucle de mon script suivant :


if(site.isMember(authorityName))
{
   logger.log("nodeUser ==> " + user.person.properties.userName);   
}

La variable user.person.properties.userName retourne dès fois des utilisateurs identiques si ces derniers sont membres de plusieurs sites l'déal serait de retourner un utilisateur une seule fois pas plus.

Merci

cleseach
Star Contributor
Star Contributor
Hello !

Je viens de prendre connaissance de tes derniers messages.
La voie que tu explore me parait un peu compliquée, mais peut-être ai-je mal compris ton besoin.

Ma compréhension : lorsque tu démarres un workflow depuis un site, tu veux que le choix des acteurs de ce workflow ne puisse se faire que parmi les membres du site.

Si je suis dans le vrai, je travaillerais plutôt à partir de l'information sur le site : si je dispose du nom du site je peux faire un <site>.listMembers(…) pour récupérer la liste des membres, pas besoin de boucle compliquée.
Tout l'enjeu est donc de véhiculer le nom du site jusqu'au composant effectuant la recherche puis de le modifier pour réaliser l'appel ci-dessus à bon escient (ne pas oublier le cas où nous ne sommes pas dans le contexte d'un site).

Cordialement,
Charles

sibe
Champ on-the-rise
Champ on-the-rise
Hello,

Merci Charles pour ta réponse, si j'utilise la méthode listMembers comme décrit sur mon code ci dessous :

var memberships = site.listMembers("", "", 0, false);
for (userName in memberships)
{
   if (userName.match("^GROUP_"))
  {
   logger.log("Member is Group Type");
  }
else
{
   authorities['_' + userName] = people.getPerson(userName);
}
}
Donc la variable authorities['_' + userName].properties.userName retourne l'ensemble des utilisateurs membre de site. Mais il y'a forcément de doublons si un utilisateur est membre sur plusieurs sites ==> c'est à dire si l'utilisateur X est par exemple membre sur 3 sites il sera affiché 3 fois.ça me retourne au problème précédent.

cleseach
Star Contributor
Star Contributor
Dans ton cas, il me semble préférable de positionner à true le dernier argument de listMembers :
var memberships = site.listMembers("", "", 0, true);
Ceci te permettra de récupérer tous les utilisateurs membres du site, y compris ceux dans des groupes.

La syntaxe authorities['_' + userName] est un peu curieuse. L'objectif est-il de disposer d'une hashmap dont la clé serait le userName ?
Quoiqu'il en soit, la liste retournée par site.listMembers ne contient pas de doublons, tu ne devrais donc pas en avoir a l'issue de ta boucle for. Pas de problème dans le cas où l'utilisateur est membre de plusieurs sites, puisque seules les membres d'un site sont listés.

Cordialement,
Charles

sibe
Champ on-the-rise
Champ on-the-rise
Je suis d'accord avec toi Charles sur l'utilisation de listMembers qui retourne les membres d'un site, je pense que je me suis mal exprimé en fait au départ je récupère la liste des users via le service groups.searchUsers, ensuite j'utilise siteService pour récupérer d'abord les sites associés aux utilisateurs précédement identifiés via siteService.listUserSites(userName):  une fois que je récupére la liste des sites je parcours les membres de chaque site )==> donc forcément je récupère les users par site. voir le code dessous :


//Liste des users enregistres dans le repository
var searchResults = groups.searchUsers(searchTerm, paging, "lastName");
for each(var user in searchResults)
   {
  //userName
  var authorityName = user.userName;
//liste des sites associés aux users
   var sites = siteService.listUserSites(authorityName);
for each(var site in sites)
       {
if(site.shortName != null || authorityName != null)
{
//recupere la liste des membres par site
var memberships = site.listMembers("", "", 0, true);
for (userName in memberships)
            {
var memberName = people.getPerson(userName).properties.userName;
}
}
}

Bon je vais voir si je peux supprimer quelques boucles.


cleseach
Star Contributor
Star Contributor
Bonjour,

Il me semble que le plus simple est de disposer en entrée de ton script le nom du site que tu considères.
Ainsi, plus de problèmes de doublons et plus d'efficacité !

Cordialement,
Charles