Index: lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java =================================================================== diff -u -rf38d16b408d1bac69c9f3493999e8c288f5dc845 -r93a2eb4b1cd2aa86e03b66ba37ff61c4adff4f76 --- lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java (.../PedagogicalPlannerAction.java) (revision f38d16b408d1bac69c9f3493999e8c288f5dc845) +++ lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java (.../PedagogicalPlannerAction.java) (revision 93a2eb4b1cd2aa86e03b66ba37ff61c4adff4f76) @@ -1647,23 +1647,35 @@ Vector potentialUsersVector = getUserManagementService().getUsersFromOrganisationByRole(orgId, Role.AUTHOR_ADMIN, false, true); + // list existing users (inherited role from parent nodes) + Set allInheritedUsers = getPedagogicalPlannerDAO().getInheritedNodeUsers(nodeUid, Role.ROLE_AUTHOR_ADMIN); + ArrayList filteredInheritedUsers = new ArrayList(); + for (Object o : allInheritedUsers) { + User u = (User) o; + // filter existing users of the actual node + if (existingUsers.contains(u)) { + continue; + } + filteredInheritedUsers.add(u); + } + // filter existing users from list of potential users - List potentialUsers = new ArrayList(); + ArrayList potentialUsers = new ArrayList(); for (Object o : potentialUsersVector) { User u = (User) o; - if (existingUsers.contains(u)) { + if (existingUsers.contains(u) || allInheritedUsers.contains(u)) { continue; } // filter self if (StringUtils.equals(u.getLogin(), request.getRemoteUser())) { continue; } potentialUsers.add(u); - // TODO filter nodeEditor of parent node } request.setAttribute("existingUsers", existingUsers); request.setAttribute("potentialUsers", potentialUsers); + request.setAttribute("inheritedUsers", filteredInheritedUsers); return mapping.findForward("editAuthors"); } else { Index: lams_common/src/java/org/lamsfoundation/lams/planner/dao/PedagogicalPlannerDAO.java =================================================================== diff -u -r161f204afffd06f77a17fa45ce069d7eae00f04e -r93a2eb4b1cd2aa86e03b66ba37ff61c4adff4f76 --- lams_common/src/java/org/lamsfoundation/lams/planner/dao/PedagogicalPlannerDAO.java (.../PedagogicalPlannerDAO.java) (revision 161f204afffd06f77a17fa45ce069d7eae00f04e) +++ lams_common/src/java/org/lamsfoundation/lams/planner/dao/PedagogicalPlannerDAO.java (.../PedagogicalPlannerDAO.java) (revision 93a2eb4b1cd2aa86e03b66ba37ff61c4adff4f76) @@ -24,6 +24,7 @@ package org.lamsfoundation.lams.planner.dao; import java.util.List; +import java.util.Set; import org.lamsfoundation.lams.planner.PedagogicalPlannerSequenceNode; @@ -46,6 +47,8 @@ List getNodeUsers(Long nodeUid, Integer roleId); + Set getInheritedNodeUsers(Long nodeUid, Integer roleId); + void saveNodeRole(Integer userId, Long nodeUid, Integer roleId); void removeNodeRole(Integer userId, Long nodeUid, Integer roleId); Index: lams_common/src/java/org/lamsfoundation/lams/planner/dao/hibernate/PedagogicalPlannerDAOHibernate.java =================================================================== diff -u -r94e9bf287765d3b33a543acb6bee1b38f0f2f6d8 -r93a2eb4b1cd2aa86e03b66ba37ff61c4adff4f76 --- lams_common/src/java/org/lamsfoundation/lams/planner/dao/hibernate/PedagogicalPlannerDAOHibernate.java (.../PedagogicalPlannerDAOHibernate.java) (revision 94e9bf287765d3b33a543acb6bee1b38f0f2f6d8) +++ lams_common/src/java/org/lamsfoundation/lams/planner/dao/hibernate/PedagogicalPlannerDAOHibernate.java (.../PedagogicalPlannerDAOHibernate.java) (revision 93a2eb4b1cd2aa86e03b66ba37ff61c4adff4f76) @@ -23,6 +23,7 @@ /* $$Id$$ */ package org.lamsfoundation.lams.planner.dao.hibernate; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; @@ -54,6 +55,7 @@ + " AS n WHERE ((? IS NULL AND n.parent=NULL) OR n.parent.uid=?) AND n.order<=? ORDER BY n.order DESC"; private static final String GET_PLANNER_NODE_ROLE = "FROM " + PedagogicalPlannerNodeRole.class.getName() + " WHERE user.userId=? AND node.uid=? AND role.roleId=?"; + // TODO include inherited users private static final String GET_PLANNER_NODE_ROLE_USERS = "SELECT p.user FROM " + PedagogicalPlannerNodeRole.class.getName() + " AS p WHERE p.node.uid=? AND p.role.roleId=?"; @@ -154,6 +156,19 @@ new Object[] { nodeUid, roleId }); } + public Set getInheritedNodeUsers(Long nodeUid, Integer roleId) { + HashSet users = new HashSet(); // use set to avoid duplicates + + PedagogicalPlannerSequenceNode node = getByUid(nodeUid); + while (node.getParent() != null) { + PedagogicalPlannerSequenceNode parent = node.getParent(); + users.addAll(getNodeUsers(parent.getUid(), roleId)); + node = parent; + } + + return users; + } + public void saveNodeRole(Integer userId, Long nodeUid, Integer roleId) { PedagogicalPlannerSequenceNode node = getByUid(nodeUid); User user = (User) getHibernateTemplate().get(User.class, userId);