Index: lams_common/src/java/org/lamsfoundation/lams/planner/dao/PedagogicalPlannerDAO.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/planner/dao/PedagogicalPlannerDAO.java,v diff -u -r1.3 -r1.3.8.1 --- lams_common/src/java/org/lamsfoundation/lams/planner/dao/PedagogicalPlannerDAO.java 3 Mar 2009 15:49:09 -0000 1.3 +++ lams_common/src/java/org/lamsfoundation/lams/planner/dao/PedagogicalPlannerDAO.java 25 Feb 2010 19:13:23 -0000 1.3.8.1 @@ -24,6 +24,7 @@ package org.lamsfoundation.lams.planner.dao; import java.util.List; +import java.util.Set; import org.lamsfoundation.lams.planner.PedagogicalPlannerSequenceNode; @@ -41,4 +42,14 @@ Integer getNextOrderId(Long parentUid); PedagogicalPlannerSequenceNode getNeighbourNode(PedagogicalPlannerSequenceNode node, Integer orderDelta); + + Boolean isEditor(Integer userId, Long nodeUid, Integer roleId); + + 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); } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/planner/dao/hibernate/PedagogicalPlannerDAOHibernate.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/planner/dao/hibernate/PedagogicalPlannerDAOHibernate.java,v diff -u -r1.4 -r1.4.8.1 --- lams_common/src/java/org/lamsfoundation/lams/planner/dao/hibernate/PedagogicalPlannerDAOHibernate.java 3 Mar 2009 15:49:09 -0000 1.4 +++ lams_common/src/java/org/lamsfoundation/lams/planner/dao/hibernate/PedagogicalPlannerDAOHibernate.java 25 Feb 2010 19:13:23 -0000 1.4.8.1 @@ -23,13 +23,17 @@ /* $$Id$$ */ package org.lamsfoundation.lams.planner.dao.hibernate; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; +import org.lamsfoundation.lams.planner.PedagogicalPlannerNodeRole; import org.lamsfoundation.lams.planner.PedagogicalPlannerSequenceNode; import org.lamsfoundation.lams.planner.dao.PedagogicalPlannerDAO; +import org.lamsfoundation.lams.usermanagement.Role; +import org.lamsfoundation.lams.usermanagement.User; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; /** @@ -45,9 +49,22 @@ + PedagogicalPlannerSequenceNode.class.getName() + " AS n WHERE n.uid=?"; private static final String FIND_MAX_ORDER_ID = "SELECT MAX(n.order) FROM " + PedagogicalPlannerSequenceNode.class.getName() + " AS n WHERE n.parent.uid=?"; - private static final String FIND_NEIGHBOUR_NODE = "FROM " + PedagogicalPlannerSequenceNode.class.getName() - + " AS n WHERE ((? IS NULL AND n.parent=NULL) OR n.parent.uid=?) AND n.order=?"; + private static final String FIND_NEIGHBOUR_NODE_ASC = "FROM " + PedagogicalPlannerSequenceNode.class.getName() + + " AS n WHERE ((? IS NULL AND n.parent=NULL) OR n.parent.uid=?) AND n.order>=?"; + private static final String FIND_NEIGHBOUR_NODE_DESC = "FROM " + PedagogicalPlannerSequenceNode.class.getName() + + " 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=?"; + /* + * private static final String FIND_RECENTLY_MODIFIED_LD = "SELECT ld FROM " + LearningDesign.class.getName() + " AS + * ld, lams_planner_recent_learning_designs AS recent WHERE recent.user_id=? AND + * ld.learningDesignId=recent.learning_design_id ORDER BY recent.last_modified_date DESC LIMIT ?"; + */ + public PedagogicalPlannerSequenceNode getByUid(Long uid) { return (PedagogicalPlannerSequenceNode) getHibernateTemplate().get(PedagogicalPlannerSequenceNode.class, uid); } @@ -106,8 +123,66 @@ public PedagogicalPlannerSequenceNode getNeighbourNode(PedagogicalPlannerSequenceNode node, Integer orderDelta) { Integer order = node.getOrder() + orderDelta; Long parentUid = node.getParent() == null ? null : node.getParent().getUid(); - return (PedagogicalPlannerSequenceNode) getHibernateTemplate().find( - PedagogicalPlannerDAOHibernate.FIND_NEIGHBOUR_NODE, new Object[] { parentUid, parentUid, order }) - .get(0); + String query = (orderDelta < 0) ? PedagogicalPlannerDAOHibernate.FIND_NEIGHBOUR_NODE_DESC + : PedagogicalPlannerDAOHibernate.FIND_NEIGHBOUR_NODE_ASC; + return (PedagogicalPlannerSequenceNode) getHibernateTemplate().find(query, + new Object[] { parentUid, parentUid, order }).get(0); } + + private List getPlannerNodeRoles(Integer userId, Long nodeUid, Integer roleId) { + return getHibernateTemplate().find(PedagogicalPlannerDAOHibernate.GET_PLANNER_NODE_ROLE, + new Object[] { userId, nodeUid, roleId }); + } + + public Boolean isEditor(Integer userId, Long nodeUid, Integer roleId) { + List l = getPlannerNodeRoles(userId, nodeUid, roleId); + if (l != null && l.size() > 0) { + return true; + } else { + // check parent nodes for 'inherited' role + if (nodeUid != null) { + PedagogicalPlannerSequenceNode node = getByUid(nodeUid); + if (node != null) { + PedagogicalPlannerSequenceNode parent = node.getParent(); + return isEditor(userId, (parent != null ? parent.getUid() : null), roleId); + } + } + } + return false; + } + + public List getNodeUsers(Long nodeUid, Integer roleId) { + return getHibernateTemplate().find(PedagogicalPlannerDAOHibernate.GET_PLANNER_NODE_ROLE_USERS, + 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); + Role role = (Role) getHibernateTemplate().get(Role.class, roleId); + PedagogicalPlannerNodeRole nodeRole = new PedagogicalPlannerNodeRole(node, user, role); + getHibernateTemplate().saveOrUpdate(nodeRole); + getHibernateTemplate().flush(); + } + + public void removeNodeRole(Integer userId, Long nodeUid, Integer roleId) { + List l = getPlannerNodeRoles(userId, nodeUid, roleId); + for (Object o : l) { + getHibernateTemplate().delete(o); + } + getHibernateTemplate().flush(); + } } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/planner/dto/PedagogicalPlannerSequenceNodeDTO.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/planner/dto/PedagogicalPlannerSequenceNodeDTO.java,v diff -u -r1.6 -r1.6.6.1 --- lams_common/src/java/org/lamsfoundation/lams/planner/dto/PedagogicalPlannerSequenceNodeDTO.java 25 Mar 2009 20:35:28 -0000 1.6 +++ lams_common/src/java/org/lamsfoundation/lams/planner/dto/PedagogicalPlannerSequenceNodeDTO.java 25 Feb 2010 19:13:23 -0000 1.6.6.1 @@ -27,8 +27,15 @@ import java.util.List; import java.util.Set; +import javax.servlet.http.HttpSession; + import org.apache.commons.lang.StringUtils; import org.lamsfoundation.lams.planner.PedagogicalPlannerSequenceNode; +import org.lamsfoundation.lams.planner.dao.PedagogicalPlannerDAO; +import org.lamsfoundation.lams.usermanagement.Role; +import org.lamsfoundation.lams.usermanagement.dto.UserDTO; +import org.lamsfoundation.lams.web.session.SessionManager; +import org.lamsfoundation.lams.web.util.AttributeNames; public class PedagogicalPlannerSequenceNodeDTO { private Long uid; @@ -40,19 +47,25 @@ private Boolean locked; private List subnodes; private Long parentUid; + // which existing LD to open + private Long learningDesignId; + // Not node-bound variables, but simply attributes used in JSP page private Boolean edit = false; private Boolean createSubnode = false; - private Boolean isSysAdmin = true; + private Boolean hasRole = true; private Boolean importNode = false; + // for the list on the main screen + private List recentlyModifiedNodes; + private Boolean displayAddRemoveEditorsLink = true; private static final String FULL_DESCRIPTION_NOT_EMPTY = "FULL"; public PedagogicalPlannerSequenceNodeDTO() { } - + public PedagogicalPlannerSequenceNodeDTO(PedagogicalPlannerSequenceNode node, - Set subnodes) { + Set subnodes, Boolean isSysadmin, PedagogicalPlannerDAO dao) { uid = node.getUid(); title = node.getTitle(); briefDescription = node.getBriefDescription(); @@ -64,6 +77,8 @@ } this.subnodes = new LinkedList(); if (subnodes != null) { + HttpSession s = SessionManager.getSession(); + UserDTO u = (UserDTO) s.getAttribute(AttributeNames.USER); for (PedagogicalPlannerSequenceNode subnode : subnodes) { PedagogicalPlannerSequenceNodeDTO subnodeDTO = new PedagogicalPlannerSequenceNodeDTO(); subnodeDTO.setTitle(subnode.getTitle()); @@ -74,6 +89,9 @@ subnodeDTO.setLocked(subnode.getLocked()); subnodeDTO.setFileName(subnode.getFileName()); subnodeDTO.setUid(subnode.getUid()); + if (u != null) { + subnodeDTO.setDisplayAddRemoveEditorsLink(isSysadmin || dao.isEditor(u.getUserID(), subnode.getUid(), Role.ROLE_AUTHOR_ADMIN)); + } this.subnodes.add(subnodeDTO); } } @@ -167,12 +185,12 @@ this.createSubnode = createSubnode; } - public Boolean getIsSysAdmin() { - return isSysAdmin; + public Boolean getHasRole() { + return hasRole; } - public void setIsSysAdmin(Boolean isSysAdmin) { - this.isSysAdmin = isSysAdmin; + public void setHasRole(Boolean hasRole) { + this.hasRole = hasRole; } public Boolean getImportNode() { @@ -182,4 +200,28 @@ public void setImportNode(Boolean importNode) { this.importNode = importNode; } + + public Long getLearningDesignId() { + return learningDesignId; + } + + public void setLearningDesignId(Long learningDesignId) { + this.learningDesignId = learningDesignId; + } + + public List getRecentlyModifiedNodes() { + return recentlyModifiedNodes; + } + + public void setRecentlyModifiedNodes(List recentlyModifiedNodes) { + this.recentlyModifiedNodes = recentlyModifiedNodes; + } + + public Boolean getDisplayAddRemoveEditorsLink() { + return displayAddRemoveEditorsLink; + } + + public void setDisplayAddRemoveEditorsLink(Boolean displayAddRemoveEditorsLink) { + this.displayAddRemoveEditorsLink = displayAddRemoveEditorsLink; + } } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/planner/dto/PedagogicalPlannerTemplateDTO.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/planner/dto/PedagogicalPlannerTemplateDTO.java,v diff -u -r1.2 -r1.2.8.1 --- lams_common/src/java/org/lamsfoundation/lams/planner/dto/PedagogicalPlannerTemplateDTO.java 26 Feb 2009 19:19:08 -0000 1.2 +++ lams_common/src/java/org/lamsfoundation/lams/planner/dto/PedagogicalPlannerTemplateDTO.java 25 Feb 2010 19:13:23 -0000 1.2.8.1 @@ -33,7 +33,16 @@ private List activities; private Long learningDesignID; private Integer activitySupportingPlannerCount = 0; + private Long nodeUid; + public Long getNodeUid() { + return nodeUid; + } + + public void setNodeUid(Long nodeUid) { + this.nodeUid = nodeUid; + } + public String getSequenceTitle() { return sequenceTitle; }