Index: lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java =================================================================== diff -u -r28827d671ccbd07e8f70eaaf3ca7d63047186bb3 -r6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5 --- lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java (.../PedagogicalPlannerAction.java) (revision 28827d671ccbd07e8f70eaaf3ca7d63047186bb3) +++ lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java (.../PedagogicalPlannerAction.java) (revision 6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5) @@ -87,7 +87,6 @@ import org.lamsfoundation.lams.learningdesign.LearningDesign; import org.lamsfoundation.lams.learningdesign.OptionsActivity; import org.lamsfoundation.lams.learningdesign.ParallelActivity; -import org.lamsfoundation.lams.learningdesign.PlannerActivityMetadata; import org.lamsfoundation.lams.learningdesign.RandomGrouping; import org.lamsfoundation.lams.learningdesign.SequenceActivity; import org.lamsfoundation.lams.learningdesign.ToolActivity; @@ -98,6 +97,7 @@ import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.monitoring.service.IMonitoringService; import org.lamsfoundation.lams.planner.PedagogicalPlannerSequenceNode; +import org.lamsfoundation.lams.planner.PedagogicalPlannerActivityMetadata; import org.lamsfoundation.lams.planner.dao.PedagogicalPlannerDAO; import org.lamsfoundation.lams.planner.dto.PedagogicalPlannerActivityDTO; import org.lamsfoundation.lams.planner.dto.PedagogicalPlannerSequenceNodeDTO; @@ -315,18 +315,32 @@ LearningDesign learningDesign = null; // either get the design ID or we don't know it and need to extract it from the node Long learningDesignId = WebUtil.readLongParam(request, CentralConstants.PARAM_LEARNING_DESIGN_ID, true); + boolean isOpenPermitted = true; + PedagogicalPlannerSequenceNode node = null; if (learningDesignId == null && nodeUid != null) { - PedagogicalPlannerSequenceNode node = getPedagogicalPlannerDAO().getByUid(nodeUid); + // we are opening a LD from node, so check is we are allowed to do it + isOpenPermitted = hasRole(request, nodeUid); + node = getPedagogicalPlannerDAO().getByUid(nodeUid); learningDesignId = node.getLearningDesignId(); } if (learningDesignId != null) { String copyMode = WebUtil.readStrParam(request, CentralConstants.PARAM_COPY_MODE, true); if (StringUtils.isBlank(copyMode) || COPY_MODE_EDIT_CURRENT.equalsIgnoreCase(copyMode)) { + if (!isOpenPermitted + && (node != null && node.getTeachersPermissions() != null && node.getTeachersPermissions() < PedagogicalPlannerSequenceNode.PERMISSION_EDIT)) { + log.debug("Unauthorised attempt to openExistingTemplate (original)"); + throw new UserAccessDeniedException(); + } // modify the original design (a hard copy in user's folder) learningDesign = getAuthoringService().getLearningDesign(learningDesignId); copyMode = COPY_MODE_EDIT_CURRENT; } else if (COPY_MODE_MAKE_COPY.equalsIgnoreCase(copyMode)) { + if (!isOpenPermitted + && (node != null && node.getTeachersPermissions() != null && node.getTeachersPermissions() < PedagogicalPlannerSequenceNode.PERMISSION_VIEW)) { + log.debug("Unauthorised attempt to openExistingTemplate (copy)"); + throw new UserAccessDeniedException(); + } // make a temporary copy in common folder learningDesign = copyLearningDesign(learningDesignId, errors); copyMode = COPY_MODE_MOVE_CURRRENT; @@ -494,7 +508,7 @@ addedDTO.setAuthorUrl(authorUrl); addedDTO.setToolIconUrl(activity.getLibraryActivityUiImage()); - PlannerActivityMetadata plannerMetadata = toolActivity.getPlannerMetadata(); + PedagogicalPlannerActivityMetadata plannerMetadata = toolActivity.getPlannerMetadata(); if (plannerMetadata != null) { addedDTO.setCollapsed(plannerMetadata.getCollapsed()); addedDTO.setExpanded(plannerMetadata.getExpanded()); @@ -516,7 +530,7 @@ addedDTO.setAuthorUrl(authorUrl); addedDTO.setToolIconUrl(activity.getLibraryActivityUiImage()); - PlannerActivityMetadata plannerMetadata = toolActivity.getPlannerMetadata(); + PedagogicalPlannerActivityMetadata plannerMetadata = toolActivity.getPlannerMetadata(); if (plannerMetadata != null) { addedDTO.setCollapsed(plannerMetadata.getCollapsed()); addedDTO.setExpanded(plannerMetadata.getExpanded()); @@ -744,9 +758,11 @@ PedagogicalPlannerAction.log.debug("Opening sequence node with UID: " + nodeUid); // Only certain roles can open the editor - Boolean hasRole = hasRole(request, nodeUid); + boolean isSysAdmin = request.isUserInRole(Role.SYSADMIN); + boolean hasRole = isSysAdmin || hasRole(request, nodeUid); Boolean edit = WebUtil.readBooleanParam(request, CentralConstants.PARAM_EDIT, false); edit &= hasRole; + // Fill the DTO PedagogicalPlannerSequenceNodeDTO dto = null; @@ -765,7 +781,8 @@ filteredNodes.add(subnode); } - dto = new PedagogicalPlannerSequenceNodeDTO(node, filteredNodes, request.isUserInRole(Role.SYSADMIN), getPedagogicalPlannerDAO()); + dto = new PedagogicalPlannerSequenceNodeDTO(node, filteredNodes, isSysAdmin, + getPedagogicalPlannerDAO()); for (PedagogicalPlannerSequenceNodeDTO subnodeDTO : dto.getSubnodes()) { List titlePath = getPedagogicalPlannerDAO().getTitlePath(subnodeDTO.getUid()); subnodeDTO.setTitlePath(titlePath); @@ -782,7 +799,8 @@ if (dto == null) { // No filtering or something went wrong in filtering - dto = new PedagogicalPlannerSequenceNodeDTO(node, node.getSubnodes(), request.isUserInRole(Role.SYSADMIN), getPedagogicalPlannerDAO()); + dto = new PedagogicalPlannerSequenceNodeDTO(node, node.getSubnodes(), isSysAdmin, + getPedagogicalPlannerDAO()); if (nodeUid == null) { dto.setRecentlyModifiedNodes(getRecentlyModifiedLearnindDesignsAsNodes()); } @@ -814,6 +832,8 @@ // Whole node tree share the same content folder ID nodeForm.setContentFolderId(node.getContentFolderId()); } + nodeForm.setTeachersEditCopy(dto.getEditCopyPermitted()); + nodeForm.setTeachersEditOriginal(dto.getEditOriginalPermitted()); } else if (!importNode) { // We fill the form with necessary data nodeForm.setNodeType(node.getLearningDesignId() == null ? PedagogicalPlannerSequenceNodeForm.NODE_TYPE_SUBNODES @@ -822,6 +842,8 @@ nodeForm.setTitle(dto.getTitle()); nodeForm.setBriefDescription(dto.getBriefDescription()); nodeForm.setFullDescription(dto.getFullDescription()); + nodeForm.setTeachersEditCopy(dto.getEditCopyPermitted()); + nodeForm.setTeachersEditOriginal(dto.getEditOriginalPermitted()); } } return mapping.findForward(PedagogicalPlannerAction.FORWARD_SEQUENCE_CHOOSER); @@ -873,6 +895,9 @@ String briefDescription = nodeForm.getBriefDescription(); String fullDescription = nodeForm.getFullDescription(); String nodeType = nodeForm.getNodeType(); + short teachersPermissions = Boolean.TRUE.equals(nodeForm.getTeachersEditCopy()) ? Boolean.TRUE.equals(nodeForm + .getTeachersEditOriginal()) ? PedagogicalPlannerSequenceNode.PERMISSION_EDIT + : PedagogicalPlannerSequenceNode.PERMISSION_VIEW : PedagogicalPlannerSequenceNode.PERMISSION_NONE; ActionMessages errors = validateNodeForm(node, nodeForm); if (errors.isEmpty()) { @@ -881,23 +906,17 @@ node.setBriefDescription(briefDescription); node.setFullDescription(fullDescription); node.setContentFolderId(nodeForm.getContentFolderId()); + node.setTeachersPermissions(teachersPermissions); // Different properties are set, depending on node type: with subnodes or template - if (PedagogicalPlannerSequenceNodeForm.NODE_TYPE_SUBNODES.equals(nodeForm.getNodeType())) { - if (node.getLearningDesignId() != null) { - /* - LearningDesign learningDesign = getAuthoringService().getLearningDesign(node.getLearningDesignId()); - getAuthoringService().deleteLearningDesign(learningDesign); - */ - node.setLearningDesignId(null); - } - node.setFullDescription(fullDescription); - } else if (Boolean.TRUE.equals(nodeForm.getRemoveTemplate())) { + if (PedagogicalPlannerSequenceNodeForm.NODE_TYPE_SUBNODES.equals(nodeForm.getNodeType()) + || Boolean.TRUE.equals(nodeForm.getRemoveTemplate())) { /* - LearningDesign learningDesign = getAuthoringService().getLearningDesign(node.getLearningDesignId()); - getAuthoringService().deleteLearningDesign(learningDesign); - */ + * LearningDesign learningDesign = getAuthoringService().getLearningDesign(node.getLearningDesignId()); + * getAuthoringService().deleteLearningDesign(learningDesign); + */ node.setLearningDesignId(null); + node.setLearningDesignTitle(null); } else if (nodeForm.getFile() != null && nodeForm.getFile().getFileSize() > 0) { FormFile file = nodeForm.getFile(); InputStream inputStream = file.getInputStream(); @@ -951,6 +970,8 @@ nodeForm.setBriefDescription(briefDescription); nodeForm.setFullDescription(fullDescription); nodeForm.setNodeType(nodeType); + nodeForm.setTeachersEditCopy(teachersPermissions > PedagogicalPlannerSequenceNode.PERMISSION_NONE); + nodeForm.setTeachersEditOriginal(teachersPermissions > PedagogicalPlannerSequenceNode.PERMISSION_VIEW); if (createSubnode) { PedagogicalPlannerSequenceNodeDTO dto = (PedagogicalPlannerSequenceNodeDTO) request .getAttribute(CentralConstants.ATTR_NODE); @@ -1705,16 +1726,16 @@ if (!StringUtils.isEmpty(activityMetadataString)) { String[] activityMetadataEntries = activityMetadataString.split(CHAR_AMPERSAND); // creata a map of metadata objects, because we are filling them multiple times during this iteration - Map activitiesMetadata = new TreeMap(); + Map activitiesMetadata = new TreeMap(); for (String activityMetadataEntry : activityMetadataEntries) { String[] keyAndValue = activityMetadataEntry.split(CHAR_EQUALS); String[] keyParts = keyAndValue[0].split(REGEX_DOT); String toolContentIdString = keyParts[0].substring(ACTIVITY_METADATA_PREFIX.length()); Long toolContentId = Long.parseLong(toolContentIdString); - PlannerActivityMetadata plannerMetadata = activitiesMetadata.get(toolContentId); + PedagogicalPlannerActivityMetadata plannerMetadata = activitiesMetadata.get(toolContentId); if (plannerMetadata == null) { - plannerMetadata = new PlannerActivityMetadata(); + plannerMetadata = new PedagogicalPlannerActivityMetadata(); activitiesMetadata.put(toolContentId, plannerMetadata); } @@ -1739,10 +1760,10 @@ if (activity.isToolActivity()) { activity = getActivityDAO().getActivityByActivityId(activity.getActivityId()); ToolActivity toolActivity = (ToolActivity) activity; - PlannerActivityMetadata plannerMetadata = activitiesMetadata.get(toolActivity + PedagogicalPlannerActivityMetadata plannerMetadata = activitiesMetadata.get(toolActivity .getToolContentId()); if (plannerMetadata != null) { - PlannerActivityMetadata storedMetadata = toolActivity.getPlannerMetadata(); + PedagogicalPlannerActivityMetadata storedMetadata = toolActivity.getPlannerMetadata(); if (storedMetadata == null) { plannerMetadata.setActivity(toolActivity); toolActivity.setPlannerMetadata(plannerMetadata); Index: lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerSequenceNodeForm.java =================================================================== diff -u -r28827d671ccbd07e8f70eaaf3ca7d63047186bb3 -r6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5 --- lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerSequenceNodeForm.java (.../PedagogicalPlannerSequenceNodeForm.java) (revision 28827d671ccbd07e8f70eaaf3ca7d63047186bb3) +++ lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerSequenceNodeForm.java (.../PedagogicalPlannerSequenceNodeForm.java) (revision 6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5) @@ -39,6 +39,8 @@ private FormFile file; private Boolean removeTemplate; private String nodeType = PedagogicalPlannerSequenceNodeForm.NODE_TYPE_SUBNODES; + private Boolean teachersEditCopy; + private Boolean teachersEditOriginal; public Long getUid() { return uid; @@ -111,4 +113,20 @@ public void setContentFolderId(String contentFolderId) { this.contentFolderId = contentFolderId; } + + public Boolean getTeachersEditCopy() { + return teachersEditCopy; + } + + public void setTeachersEditCopy(Boolean teachersEditCopy) { + this.teachersEditCopy = teachersEditCopy; + } + + public Boolean getTeachersEditOriginal() { + return teachersEditOriginal; + } + + public void setTeachersEditOriginal(Boolean teachersEditOriginal) { + this.teachersEditOriginal = teachersEditOriginal; + } } \ No newline at end of file Index: lams_central/web/images/pedag_collapse.png =================================================================== diff -u -rb706619f710215b7ced6268be670736b61a96eab -r6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5 Binary files differ Index: lams_central/web/images/pedag_collapse_arrow.png =================================================================== diff -u Binary files differ Index: lams_central/web/images/pedag_expand.png =================================================================== diff -u -rb706619f710215b7ced6268be670736b61a96eab -r6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5 Binary files differ Index: lams_central/web/images/pedag_expand_arrow.png =================================================================== diff -u Binary files differ Index: lams_central/web/includes/javascript/pedagogicalPlanner.js =================================================================== diff -u -r28827d671ccbd07e8f70eaaf3ca7d63047186bb3 -r6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5 --- lams_central/web/includes/javascript/pedagogicalPlanner.js (.../pedagogicalPlanner.js) (revision 28827d671ccbd07e8f70eaaf3ca7d63047186bb3) +++ lams_central/web/includes/javascript/pedagogicalPlanner.js (.../pedagogicalPlanner.js) (revision 6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5) @@ -231,6 +231,15 @@ document.getElementById("fileInputArea").style.display = document.getElementById("removeTemplate").checked ? "none" : "block"; } + function onTeachersEditCopyCheckboxChange() { + if (document.getElementById("teachersEditCopy").checked) { + $('#teachersEditOriginal').attr('disabled', false); + } else { + $('#teachersEditOriginal').attr('disabled', true); + $('#teachersEditOriginal').attr('checked', false); + } + } + function onNodeTypeChange(){ document.getElementById("fileArea").style.display = document.getElementById("hasSubnodesType").checked ? "none" : "block"; } Index: lams_common/build.xml =================================================================== diff -u -r8cbd631849cddfbfc7fb887e8a847894e5baaefa -r6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5 --- lams_common/build.xml (.../build.xml) (revision 8cbd631849cddfbfc7fb887e8a847894e5baaefa) +++ lams_common/build.xml (.../build.xml) (revision 6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5) @@ -436,7 +436,7 @@ - + Fisheye: Tag 6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5 refers to a dead (removed) revision in file `lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/learningdesign/PlannerActivityMetadata.hbm.xml'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/planner/PedagogicalPlannerActivityMetadata.hbm.xml =================================================================== diff -u --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/planner/PedagogicalPlannerActivityMetadata.hbm.xml (revision 0) +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/planner/PedagogicalPlannerActivityMetadata.hbm.xml (revision 6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5) @@ -0,0 +1,82 @@ + + + + + + + + + + activity + + + + + + + + + + + + + + + + + + + Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/planner/PedagogicalPlannerNodeRole.hbm.xml =================================================================== diff -u -r3a1ae19ae51ede32cec920fc9bb07f6787f562ff -r6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5 --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/planner/PedagogicalPlannerNodeRole.hbm.xml (.../PedagogicalPlannerNodeRole.hbm.xml) (revision 3a1ae19ae51ede32cec920fc9bb07f6787f562ff) +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/planner/PedagogicalPlannerNodeRole.hbm.xml (.../PedagogicalPlannerNodeRole.hbm.xml) (revision 6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5) @@ -4,33 +4,66 @@ "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> - - + + - - - - - + + + + + - + - + - + - + + + Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/planner/PedagogicalPlannerSequenceNode.hbm.xml =================================================================== diff -u -r9a772f5ba1954a3a719a19e7ae237b6b09dc76ef -r6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5 --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/planner/PedagogicalPlannerSequenceNode.hbm.xml (.../PedagogicalPlannerSequenceNode.hbm.xml) (revision 9a772f5ba1954a3a719a19e7ae237b6b09dc76ef) +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/planner/PedagogicalPlannerSequenceNode.hbm.xml (.../PedagogicalPlannerSequenceNode.hbm.xml) (revision 6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5) @@ -69,11 +69,11 @@ /> + +