[Résolu] Dashlet tâches actives

cancel
Showing results for 
Search instead for 
Did you mean: 
ptitmat
Member II

[Résolu] Dashlet tâches actives

Bonjour,

Je suis entrain de mettre en place une dashlet qui permettra de voir les taches actives de l'utilisateur et uniquement les siennes.

Je reprends actuellement le travail de Huberd dont un premier post avait été créé à l'adresse suivante http://forums.alfresco.com/fr/viewtopic.php?f=11&t=1947&p=9364&hilit=taskInstance#p9364

Etant nouveau sur le développement d'alfresco. J'ai quelques problèmes de configurations.

Je souhaiterais afficher une nouvelle dashlet que j'ai crée de manière identique à la dashlet tasks-active-dashlet.jsp

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="/WEB-INF/alfresco.tld" prefix="a" %>
<%@ taglib uri="/WEB-INF/repo.tld" prefix="r" %>

<h:outputText value="#{msg.no_tasks}" rendered="#{empty CustomWorkflowBean.allActiveTasks}" />

<a:richList id="personal-tasks-active-list" viewMode="details" value="#{CustomWorkflowBean.allActiveTasks}" var="r"
styleClass="recordSet" headerStyleClass="recordSetHeader" rowStyleClass="recordSetRow"
altRowStyleClass="recordSetRowAlt" width="100%" pageSize="10"
initialSortColumn="created" initialSortDescending="true"
rendered="#{not empty CustomWorkflowBean.allActiveTasks}" refreshOnBind="true">

<%– Primary column for details view mode –%>
<a:column id="col1" primary="true" width="200" style="padding:2px;text-align:left">
<f:facet name="header">
<a:sortLink id="col1-sort" label="#{msg.description}" value="bpm:description" mode="case-insensitive" styleClass="header"/>
</f:facet>
<f:facet name="small-icon">
<a:actionLink id="col1-act1" value="#{r['bpm:description']}" image="/images/icons/workflow_task.gif" showLink="false"
actionListener="#{CustomWorflowBean.setupTaskDialog}" action="dialog:manageTask">
<f:param name="id" value="#{r.id}" />
<f:param name="type" value="#{r.type}" />
</a:actionLink>
</f:facet>
<a:actionLink id="col1-act2" value="#{r['bpm:description']}" actionListener="#{CustomWorflowBean.setupTaskDialog}"
action="dialog:manageTask">
<f:param name="id" value="#{r.id}" />
<f:param name="type" value="#{r.type}" />
</a:actionLink>
</a:column>

<%– Task type –%>
<a:column id="col2" style="padding:2px;text-align:left">
<f:facet name="header">
<a:sortLink id="col2-sort" label="#{msg.type}" value="name" mode="case-insensitive" styleClass="header"/>
</f:facet>
<h:outputText id="col2-txt" value="#{r.name}" />
</a:column>

<%– Task owner column –%>
<a:column id="col2a" style="padding:2px;text-align:left">
<f:facet name="header">
<a:sortLink id="col2a-sort" label="#{msg.owner}" value="cm:owner" styleClass="header"/>
</f:facet>
<h:outputText id="col2a-txt" value="#{r['cm:owner']}" />
</a:column>

<%– Task id column –%>
<a:column id="col3" style="padding:2px;text-align:left">
<f:facet name="header">
<a:sortLink id="col3-sort" label="#{msg.id}" value="bpm:taskId" styleClass="header"/>
</f:facet>
<h:outputText id="col3-txt" value="#{r['bpm:taskId']}" />
</a:column>

<%– Created Date column –%>
<a:column id="col4" style="padding:2px;text-align:left">
<f:facet name="header">
<a:sortLink id="col4-sort" label="#{msg.created}" value="created" styleClass="header"/>
</f:facet>
<h:outputText id="col4-txt" value="#{r.created}">
<a:convertXMLDate type="both" pattern="#{msg.date_time_pattern}" />
</h:outputText>
</a:column>

<%– Due date column –%>
<a:column id="col5" style="padding:2px;text-align:left">
<f:facet name="header">
<a:sortLink id="col5-sort" label="#{msg.due_date}" value="bpm:dueDate" styleClass="header"/>
</f:facet>
<h:outputText id="col5-txt" value="#{r['bpm:dueDate']}">
<a:convertXMLDate type="both" pattern="#{msg.date_pattern}" />
</h:outputText>
</a:column>

<%– Status column –%>
<a:column id="col6" style="padding:2px;text-align:left">
<f:facet name="header">
<a:sortLink id="col6-sort" label="#{msg.status}" value="bpm:status" styleClass="header"/>
</f:facet>
<h:outputText id="col6-txt" value="#{r['bpm:status']}" />
</a:column>

<%– Priority column –%>
<a:column id="col7" style="padding:2px;text-align:left">
<f:facet name="header">
<a:sortLink id="col7-sort" label="#{msg.priority}" value="bpm:priority" styleClass="header"/>
</f:facet>
<h:outputText id="col7-txt" value="#{r['bpm:priority']}" />
</a:column>

<%– Actions column –%>
<a:column id="col8" actions="true" style="padding:2px;text-align:left">
<f:facet name="header">
<h:outputText id="col8-txt" value="#{msg.actions}"/>
</f:facet>
<r:actions id="col8-actions" value="dashlet_todo_actions" context="#{r}" showLink="false"
styleClass="inlineAction" />
</a:column>

<a:dataPager styleClass="pager" />
</a:richList>

J'ai crée une nouvelle classe dans eclipse qui reprend l'exemple du code WorkflowBean (qui permet d'obtenir toutes les taches actives).
package lpr.alfresco.web.bean.workflow;

/*
* Copyright (C) 2005-2007 Alfresco Software Limited.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.

* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.

* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

* As a special exception to the terms and conditions of version 2.0 of
* the GPL, you may redistribute this Program in connection with Free/Libre
* and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception.  You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing"
*/


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.transaction.UserTransaction;

import org.alfresco.model.ContentModel;
import org.alfresco.repo.workflow.WorkflowModel;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.cmr.workflow.WorkflowTaskDefinition;
import org.alfresco.service.cmr.workflow.WorkflowTaskQuery;
import org.alfresco.service.cmr.workflow.WorkflowTaskState;
import org.alfresco.service.cmr.workflow.WorkflowTransition;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.ParameterCheck;
import org.alfresco.web.app.Application;
import org.alfresco.web.bean.NavigationBean;
import org.alfresco.web.bean.repository.Node;
import org.alfresco.web.bean.repository.Repository;
import org.alfresco.web.bean.repository.TransientMapNode;
import org.alfresco.web.bean.repository.TransientNode;
import org.alfresco.web.bean.repository.User;
import org.alfresco.web.ui.common.Utils;
import org.alfresco.web.ui.common.component.UIActionLink;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* Managed bean used for providing support for the workflow task dashlets
*
* @author gavinc
*/
public class CustomWorkflowBean
{
   protected NavigationBean navigationBean;
   protected NodeService nodeService;
   protected WorkflowService workflowService;
   protected List<Node> tasks;
   protected List<Node> activeTasks;
   protected List<Node> pooledTasks;
   protected List<Node> completedTasks;
  
   private static final Log logger = LogFactory.getLog(CustomWorkflowBean.class);
  
   public static final String BEAN_NAME = "CustomWorkflowBean";
  
  
   // ——————————————————————————
   // Bean Getters and Setters
  
   /**
    * Returns a list of nodes representing the "all" active tasks.
    *
    * @return List of all active tasks
    */
   public List<Node> getAllActiveTasks()
   {
      if (this.activeTasks == null)
      {
         // get the current username
         FacesContext context = FacesContext.getCurrentInstance();
         User user = Application.getCurrentUser(context);
         String userName = user.getUserName();
        
         UserTransaction tx = null;
         try
         {
            tx = Repository.getUserTransaction(context, true);
            tx.begin();
           
            // query for all active tasks
            WorkflowTaskQuery query = new WorkflowTaskQuery();
            List<WorkflowTask> tasks = this.workflowService.queryTasks(query);
           
            // create a list of transient nodes to represent
            this.activeTasks = new ArrayList<Node>(tasks.size());
            for (WorkflowTask task : tasks)
            {
               
               Node node = createTask(task);
               this.activeTasks.add(node);
              
               if (logger.isDebugEnabled())
                  logger.debug("Added active task: " + node);
            }
           
            // commit the changes
            tx.commit();
         }
         catch (Throwable e)
         {
            // rollback the transaction
            try { if (tx != null) {tx.rollback();} } catch (Exception ex) {}
            Utils.addErrorMessage("Failed to get all active tasks: " + e.toString(), e);
         }
      }
     
      return this.activeTasks;
   }
     
   /**
    * Returns a list of nodes representing the "pooled" to do tasks the
    * current user has.
    *
    * @return List of to do tasks
    */
  
   public List<Node> getPooledTasks()
   {
      if (this.pooledTasks == null)
      {
         // get the current username
         FacesContext context = FacesContext.getCurrentInstance();
         User user = Application.getCurrentUser(context);
         String userName = user.getUserName();
        
         UserTransaction tx = null;
         try
         {
            tx = Repository.getUserTransaction(context, true);
            tx.begin();
           
            // get the current pooled tasks for the current user
            List<WorkflowTask> tasks = this.workflowService.getPooledTasks(userName);
           
            // create a list of transient nodes to represent
            this.pooledTasks = new ArrayList<Node>(tasks.size());
            for (WorkflowTask task : tasks)
            {
               Node node = createTask(task);
               this.pooledTasks.add(node);
              
               if (logger.isDebugEnabled())
                  logger.debug("Added pooled task: " + node);
            }
           
            // commit the changes
            tx.commit();
         }
         catch (Throwable e)
         {
            // rollback the transaction
            try { if (tx != null) {tx.rollback();} } catch (Exception ex) {}
            Utils.addErrorMessage("Failed to get pooled tasks: " + e.toString(), e);
         }
      }
     
      return this.pooledTasks;
   }

   /**
    * Returns a list of nodes representing the to do tasks the
    * current user has.
    *
    * @return List of to do tasks
    */
   public List<Node> getTasksToDo()
   {
      if (this.tasks == null)
      {
         // get the current username
         FacesContext context = FacesContext.getCurrentInstance();
         User user = Application.getCurrentUser(context);
         String userName = user.getUserName();
        
         UserTransaction tx = null;
         try
         {
            tx = Repository.getUserTransaction(context, true);
            tx.begin();
           
            // get the current in progress tasks for the current user
            List<WorkflowTask> tasks = this.workflowService.getAssignedTasks(
                  userName, WorkflowTaskState.IN_PROGRESS);
           
            // create a list of transient nodes to represent
            this.tasks = new ArrayList<Node>(tasks.size());
            for (WorkflowTask task : tasks)
            {
               Node node = createTask(task);
               this.tasks.add(node);
              
               if (logger.isDebugEnabled())
                  logger.debug("Added to do task: " + node);
            }
           
            // commit the changes
            tx.commit();
         }
         catch (Throwable e)
         {
            // rollback the transaction
            try { if (tx != null) {tx.rollback();} } catch (Exception ex) {}
            Utils.addErrorMessage("Failed to get to do tasks: " + e.toString(), e);
         }
      }
     
      return this.tasks;
   }
   /**
    * Returns a list of nodes representing the completed tasks the
    * current user has.
    *
    * @return List of completed tasks
    */
   public List<Node> getTasksCompleted()
   {
      if (this.completedTasks == null)
      {
         // get the current username
         FacesContext context = FacesContext.getCurrentInstance();
         User user = Application.getCurrentUser(context);
         String userName = user.getUserName();
        
         UserTransaction tx = null;
         try
         {
            tx = Repository.getUserTransaction(context, true);
            tx.begin();
           
            // get the current in progress tasks for the current user
            List<WorkflowTask> tasks = this.workflowService.getAssignedTasks(
                  userName, WorkflowTaskState.COMPLETED);
           
            // create a list of transient nodes to represent
            this.completedTasks = new ArrayList<Node>(tasks.size());
            for (WorkflowTask task : tasks)
            {
               Node node = createTask(task);
               this.completedTasks.add(node);
              
               if (logger.isDebugEnabled())
                  logger.debug("Added completed task: " + node);
            }
           
            // commit the changes
            tx.commit();
         }
         catch (Throwable e)
         {
            // rollback the transaction
            try { if (tx != null) {tx.rollback();} } catch (Exception ex) {}
            Utils.addErrorMessage("Failed to get completed tasks: " + e.toString(), e);
         } 
      }
     
      return this.completedTasks;
   }
   /**
    * Sets the navigation bean to use
    *
    * @param navigationBean The NavigationBean to set.
    */
   public void setNavigationBean(NavigationBean navigationBean)
   {
      this.navigationBean = navigationBean;
   }
  
   /**
    * Sets the workflow service to use
    *
    * @param workflowService WorkflowService instance
    */
   public void setWorkflowService(WorkflowService workflowService)
   {
      this.workflowService = workflowService;
   }
  
   /**
    * Sets the node service to use
    *
    * @param nodeService NodeService instance
    */
   public void setNodeService(NodeService nodeService)
   {
      this.nodeService = nodeService;
   }
  
  
   // ——————————————————————————
   // Navigation handlers
  
   public void setupTaskDialog(ActionEvent event)
   {
      UIActionLink link = (UIActionLink)event.getComponent();
      Map<String, String> params = link.getParameterMap();
      String id = params.get("id");
      String type = params.get("type");
     
      // setup the dispatch context with the task we're opening a dialog for
      TransientNode node = new TransientNode(QName.createQName(type), id, null);
      this.navigationBean.setupDispatchContext(node);
     
      // pass on parameters for the dialog
      Application.getDialogManager().setupParameters(event);
   }
  
   public void setupTaskDialog(String id, String type)
   {
      ParameterCheck.mandatoryString("Task ID", id);
      ParameterCheck.mandatoryString("Task Type", type);
     
      // setup the dispatch context with the task we're opening a dialog for
      TransientNode node = new TransientNode(QName.createQName(type), id, null);
      this.navigationBean.setupDispatchContext(node);
     
      // pass on parameters for the dialog
      Map<String, String> params = new HashMap<String, String>(2, 1.0f);
      params.put("id", id);
      params.put("type", type);
      Application.getDialogManager().setupParameters(params);
   }
  
  
   // ——————————————————————————
   // Helper methods
  
   /**
    * Creates and populates a TransientNode to represent the given
    * workflow task from the repository workflow engine
    *
    * @param task The task to create a representation of
    */
   protected TransientMapNode createTask(WorkflowTask task)
   {
      // get the type of the task
      WorkflowTaskDefinition taskDef = task.definition;
     
      // create the basic transient node
      TransientMapNode node = new TransientMapNode(taskDef.metadata.getName(),
            task.title, task.properties);
     
      // add properties for the other useful metadata
      node.getProperties().put(ContentModel.PROP_NAME.toString(), task.title);
      node.getProperties().put("type", node.getType().toString());
      node.getProperties().put("id", task.id);
     
      // add extra properties for completed tasks
      if (task.state.equals(WorkflowTaskState.COMPLETED))
      {
         // add the outcome label for any completed task
         String outcome = null;
         String transition = (String)task.properties.get(WorkflowModel.PROP_OUTCOME);
         if (transition != null)
         {
            WorkflowTransition[] transitions = task.definition.node.transitions;
            for (WorkflowTransition trans : transitions)
            {
               if (trans.id.equals(transition))
               {
                  outcome = trans.title;
                  break;
               }
            }
           
            if (outcome != null)
            {
               node.getProperties().put("outcome", outcome);
            }
         }
        
         // add the workflow instance id and name this taks belongs to
         node.getProperties().put("workflowInstanceId", task.path.instance.id);
        
         // add the task itself as a property
         node.getProperties().put("workflowTask", task);
      }
     
      return node;
   }
}


Je change ensuite le fichiers de configuration faces-config-beans.

<managed-bean>
      <managed-bean-name>CustomWorkflowBean</managed-bean-name>
      <managed-bean-class>lpr.alfresco.web.bean.workflow.CustomWorkflowBean</managed-bean-class>
      <managed-bean-scope>request</managed-bean-scope>
      <managed-property>
         <property-name>navigationBean</property-name>
         <value>#{NavigationBean}</value>
      </managed-property>
      <managed-property>
         <property-name>nodeService</property-name>
         <value>#{NodeService}</value>
      </managed-property>
      <managed-property>
         <property-name>workflowService</property-name>
         <value>#{WorkflowService}</value>
      </managed-property>
   </managed-bean>

Pour compiler ma classe, je l'export dans un jarfile et je met ce jar dans les lib d'Alfresco.

Le résultat donne que dans le dashboard je vois bien apparaitre mes taches actives (donc la création de la dashlet se passe bien). Mais je ne vois pas l'ensemble des taches actives qui devrait apparaitre.

Alors que dans la dashlet toutes les taches actives il y en a 7 qui apparaissent.

Je pense donc qu'alfresco ne fait pas la liaison entre la dashlet et le CustomWorkflowBean. Et je pense donc à un problème de configuration mais je ne trouve pas l'erreur.

Donc si quelqu'un peut m'aider à trouver mon erreur, je lui serait reconnaissant.

Ptitmat
21 Replies
jayjayecl
Active Member II

Re: [Résolu] Dashlet tâches actives

Une simple question :

"
Je suis entrain de mettre en place une dashlet qui permettra de voir les taches actives de l'utilisateur et uniquement les siennes."

N'est-ce pas déjà le cas du dashlet "mes tâches à réaliser" ?
ptitmat
Member II

Re: [Résolu] Dashlet tâches actives

Bonjour,

Pour répondre à ta question : nom ce n'est pas les mêmes. Les tâches actives sont déjà en cours. Donc elles ont déjà débutées.

J'ai un autre petit problème, j'ai ajoutées dans le fichier log4j les lignes suivantes :

log4j.logger.lpr.alfresco.web.bean.workflow=info
log4j.logger.lpr.alfresco.web.bean.workflow.CustomWorkflowBean=info
log4j.logger.lpr.alfresco.web.bean.workflow.CustomWorkflowBean=debug


Pour essayer de voir apparaitre quelque chose dans les log. (j'ai aussi ajouté un message dans la focntion getAllActiveTasks)

Il n'y a un rien qui s'affiche. Donc trois solutions :
    Soit je ne sais pas me servir du logger (chose fortement possible)
    Soit ma classe n'est pas charger
    Soit la fonction n'est pas appelée (mais bien inscrite dans la jsp
J'ai déjà corriger une erreur de "_" à la place "-" dans le nom de ma jsp. Mais ceci n'empêche pas l'affichage du titre de  la dashlet, mais cela ne me donne toujours pas le contenu.

J'ai aussi modifier le fichier web-client-config-workflow.xml pour ajouter les lignes suivantes :

 <!– test –>
       <action id="manage_task">
            <label-id>manage_task</label-id>
            <image>/images/icons/manage_workflow_task.gif</image>
            <action>dialog:manageTask</action>
            <action-listener>#{CustomWorkflowBean.setupTaskDialog}</action-listener>
            <params>
               <param name="id">#{actionContext.id}</param>
               <param name="type">#{actionContext.type}</param>
            </params>
         </action>
        
         <action id="view_completed_task">
            <label-id>view_completed_task_title</label-id>
            <image>/images/icons/view_workflow_task.gif</image>
            <action>dialog:viewCompletedTask</action>
            <action-listener>#{CustomWorkflowBean.setupTaskDialog}</action-listener>
            <params>
               <param name="id">#{actionContext.id}</param>
               <param name="type">#{actionContext.type}</param>
            </params>
         </action>
        
         <action id="reassign_task">
            <label-id>reassign</label-id>
            <image>/images/icons/reassign_task.gif</image>
            <action>dialog:reassignTask</action>
            <action-listener>#{CustomWorkflowBean.setupTaskDialog}</action-listener>
            <params>
               <param name="id">#{actionContext.id}</param>
               <param name="type">#{actionContext.type}</param>
            </params>
         </action>
       <!– fin du test –>

Une dernière question, doit-on effacé le dossier work à chaque fois, j'ai lu ça dans un post mais je ne l'ai pas encore fait.

Ptitmat
ptitmat
Member II

Re: [Résolu] Dashlet tâches actives

Dans la continuation de mes tests, j'ai décidé de supprimer la modification apportée au fichier web-client-config-workflow.xml.

Par contre j'ai remodifié le fichier j'ai commenté l'ajout que j'avais effectué pour intégrer mon bean. et j'ai remplacer le bean par défaut en ajoutant
<managed-bean-name>WorkflowBean</managed-bean-name>
      <managed-bean-class>lpr.alfresco.web.bean.workflow.WorkflowBean</managed-bean-class>

à la place org.alfresco.web.bean.workflow.WorkflowBean.

J'ai vidé le fichier work et effacé les cookies. relancer Alfresco et j'obtiens exactement la même chose. L'affichage de toutes les listes actives dans la dashlet active-tasks et aucun affichage dans ma dashlet personal-active-tasks.

Bien sûr, j'avais copier la classe WorkflowBean par défaut dans le sdk dans mon projet, je l'ai ensuite exporté en*.jar que j'ai placé dans le dossier lib.

J'avoue que j'ai beaucoup de mal à comprendre ou se situe mon erreur.
jayjayecl
Active Member II

Re: [Résolu] Dashlet tâches actives

Je ne comprends toujours pas la différence avec le dashlet "mes tâches à réaliser".
Pourrais-tu expliquer la différence entre les deux, car j'avoue que "Les tâches actives sont déjà en cours. Donc elles ont déjà débutées" n'apporte que peu d'éclairage :
il y a en effet peu de chances que "mes tâches à réaliser" affiche des workflows qui n'ont pas encore commencé… et qui donc n'existent pas !
huberd
Member II

Re: [Résolu] Dashlet tâches actives

Je ne comprends toujours pas la différence avec le dashlet "mes tâches à réaliser".
Pourrais-tu expliquer la différence entre les deux, car j'avoue que "Les tâches actives sont déjà en cours. Donc elles ont déjà débutées" n'apporte que peu d'éclairage :
il y a en effet peu de chances que "mes tâches à réaliser" affiche des workflows qui n'ont pas encore commencé… et qui donc n'existent pas !

Effectivement, elles sont similaires, à la seule différence que celle qui doit être créé doit se substituer à celle existante. A ce jour, j'ai posté un message concernant la sécurisation des tâches d'un workflow afin que seules les propriétaires d'une tâche puisse se l'approprier. Voi ici : http://forums.alfresco.com/fr/viewtopic.php?f=11&t=2024

A ce jour, la dashlet que je compte désactiver est la dashlet qui liste toutes les tâches actives, qui aujourd'hui permet à quiconque de s'approprier les tâches qui ne leur sont pas destinées. Le problème est que si je la désactive, je ne pourrais plus voir en tant qu'administrateur toutes les taches actives. D'où la réécriture de cette dashlet pour qu'elle garde tout son sens pour les administrateurs et éventuellement plus tard les responsables de services.
jayjayecl
Active Member II

Re: [Résolu] Dashlet tâches actives

je crois que ton besoin n'est pas évident pour nous.
Je ne comprends pas, même en lisant attentivement ton message sur l'autre topic :

"Je m'explique, un initiateur initialise un workflow avec une série d'acteur. Le process de workflow crée autant de tâches que d'acteurs demandé, ce qui est normal pour le moment."

Sont-ce des tâches en parallèle (fork) ?
A vrai dire, il n'est pas évident de saisir la "topologie" de ce debut de workflow.

"Mon problème est le suivant : n'importe quel utilisateurs d'Alfresco peut voir la liste des tâches actives, et même les gérer si le coeur lui en dit. Comment peut-on y remédier pour interdire quiconque de gérer les tâches qui ne le concerne pas ?
Serait-il éventuellemnt possible de masquer les tâches attribuées aux utilisateurs qui n'ont aucune interraction avec ces tâches ?"

Là je ne comprends plus du tout.
Si tu évoques le webscript "toutes les tâches actives", en effet celui-ci n'est pas "secure", c'est d'ailleurs pour cela qu'il est désactivé par défaut.
Si tu parles de "mes tâches à réaliser", je ne comprends rien. Un utilisateur n'y verra que les tâches dont il est propriétaire … ce qui semble répondre à ton besoin !!!.
huberd
Member II

Re: [Résolu] Dashlet tâches actives

je crois que ton besoin n'est pas évident pour nous.
Je ne comprends pas, même en lisant attentivement ton message sur l'autre topic :

"Je m'explique, un initiateur initialise un workflow avec une série d'acteur. Le process de workflow crée autant de tâches que d'acteurs demandé, ce qui est normal pour le moment."

Sont-ce des tâches en parallèle (fork) ?

oui, en partie lorsqu'il s'agit d'une demande de relecture multiple, mais là n'est pas le problème.

A vrai dire, il n'est pas évident de saisir la "topologie" de ce debut de workflow.

"Mon problème est le suivant : n'importe quel utilisateurs d'Alfresco peut voir la liste des tâches actives, et même les gérer si le cœur lui en dit. Comment peut-on y remédier pour interdire quiconque de gérer les tâches qui ne le concerne pas ?
Serait-il éventuellement possible de masquer les tâches attribuées aux utilisateurs qui n'ont aucune interaction avec ces tâches ?"

Là je ne comprends plus du tout.
Si tu évoques le webscript "toutes les tâches actives", en effet celui-ci n'est pas "secure", c'est d'ailleurs pour cela qu'il est désactivé par défaut.
Si tu parles de "mes tâches à réaliser", je ne comprends rien. Un utilisateur n'y verra que les tâches dont il est propriétaire … ce qui semble répondre à ton besoin !!!.

J'explique. Mon workflow permet a un utilisateur de faire valider ses documents. Ce workflow permet à son initiateur de proposer son document à la lecture à plusieurs acteurs, et à la suite de cette relecture, et si elle a été validée, enchaine sur une étape de validation définitive. Jusque là rien de bien compliqué à comprendre, un workflow classique en soit.

Aujourd'hui comme tu le dis si bien, la dashlet "toutes les tâches actives" est bel et bien non disponible par défaut, mais peut être rajoutée par l'utilisateur si il décide de customiser son dashboard en la choisissant dans la liste des dashlet qui lui sont proposées. Je pourrais très bien désactiver définitivement cette dashlet en la mettant en commentaire dans le fichier de config  web-client-config.xml comme indiqué ci-dessous :

<!–dashlet id="tasks-active" label-id="tasks_active_title" description-id="tasks_active_desc"
jsp="/jsp/workflow/tasks-active-dashlet.jsp" allow-narrow="false" /–>

Mais du coup je viendrai à perdre la possibilité pour un administrateur de lister toute les tâches actives. Pour palier à ce problème, j'ai décidé de réécrire cette dashlet afin qu'elle réponde à mes besoins, à savoir qu'un utilisateur lambda ne puisse pas s'attribuer les tâches qui ne lui sont pas attribuées, mais de continuer à permettre à un administrateur de liste toutes les taches actives sur son système. Suis-je plus clair maintenant ? Si tu as une autre idée pour y parvenir, je suis preneur.

Ce que je regrette à ce jour, c'est que l'on ne puisse pas jouer directement sur les permissions du workflow et de ses taches comme on peut le faire au niveau d'un contenu (document) ou un espace (dossier). Cela permettrait comme pour les contenus et les espaces de les masquer aux personnes qui ne sont pas autorisées à les traiter. Dans ce mode de fonctionnement, le workflow appartiendrait à tous les acteurs, et chaque tâches qui le constitue hériteraient des droits d'exécution pour l'acteur concerné. Une réaffectation (reasign) de tâche pourrait donc retirer les droits de l'acteur courant et ajouter les les droits d'exécution pour le nouvel acteur. Seul l'administrateur d'Alfresco pourrait bénéficier d'un droit de contrôle sur tous les workflow et taches associé.
jayjayecl
Active Member II

Re: [Résolu] Dashlet tâches actives

oui désolé je comprends bien mieux.

J'avais peu ou prou le même besoin, et j'ai choisi la solution suivante :
- je configure par défaut les dashlets suivant (web-client-config-custom.xml) : "mes tâches partagées", "mes tâches a realiser"
- je change la jsp du dashboard afin de ne rendre le lien "configurer tableau de bord" disponible qu'aux administrateurs, qui peuvent alors s'ajouter le dashlet "toutes les tâches actives".

Biensur, l'effet secondaire est que les utilisateurs lambda ne pourront plus personnaliser leur tableau de bord
ptitmat
Member II

Re: [Résolu] Dashlet tâches actives

Bonjour,

Je ne sais pas si cette solution peut être envisageable.

Je n'ai pas encore parcourue toute l'api alfresco mais au départ je souhaitais, à partir de la classe WorkflowBean rajouté dans le code une comparaison entre l'acteur de la tâche et l'utilisateur courant. Je ne sais pas si cette solution est possible.

De plus si l'utilisateur est l'administrateur alors on affiche l'ensemble des infos.

ptitmat