Index: lams_build/3rdParty.userlibraries =================================================================== diff -u -r8179037dc958585c054547eb7de9be14c6aed233 -re2e2aa63f31be07287637a2bec159d1574c0ba2c --- lams_build/3rdParty.userlibraries (.../3rdParty.userlibraries) (revision 8179037dc958585c054547eb7de9be14c6aed233) +++ lams_build/3rdParty.userlibraries (.../3rdParty.userlibraries) (revision e2e2aa63f31be07287637a2bec159d1574c0ba2c) @@ -86,7 +86,7 @@ - + Index: lams_build/lib/xstream/xstream-1.1.3.jar =================================================================== diff -u Binary files differ Index: lams_build/lib/xstream/xstream-1.1.jar =================================================================== diff -u -r3c4881947fb505c405de8165f49ebce7c3c674ac -re2e2aa63f31be07287637a2bec159d1574c0ba2c Binary files differ Index: lams_build/liblist.txt =================================================================== diff -u -r8179037dc958585c054547eb7de9be14c6aed233 -re2e2aa63f31be07287637a2bec159d1574c0ba2c --- lams_build/liblist.txt (.../liblist.txt) (revision 8179037dc958585c054547eb7de9be14c6aed233) +++ lams_build/liblist.txt (.../liblist.txt) (revision e2e2aa63f31be07287637a2bec159d1574c0ba2c) @@ -98,7 +98,7 @@ xml-writer-0.2.jar 0.2 xom-1.0b3.jar 1.0b3 xpp3-1.1.3.4d_b4_min.jar 1.1.3.4d_b4_min - xstream-1.1.jar 1.1 + xstream-1.1.3.jar 1.1.3 Index: lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java =================================================================== diff -u -r6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5 -re2e2aa63f31be07287637a2bec159d1574c0ba2c --- lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java (.../PedagogicalPlannerAction.java) (revision 6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5) +++ lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerAction.java (.../PedagogicalPlannerAction.java) (revision e2e2aa63f31be07287637a2bec159d1574c0ba2c) @@ -75,9 +75,9 @@ import org.apache.struts.upload.FormFile; import org.lamsfoundation.lams.authoring.service.IAuthoringService; import org.lamsfoundation.lams.authoring.web.AuthoringConstants; -import org.lamsfoundation.lams.contentrepository.NodeKey; +import org.lamsfoundation.lams.contentrepository.FileException; +import org.lamsfoundation.lams.contentrepository.ItemNotFoundException; import org.lamsfoundation.lams.contentrepository.RepositoryCheckedException; -import org.lamsfoundation.lams.contentrepository.client.IToolContentHandler; import org.lamsfoundation.lams.contentrepository.client.ToolContentHandler; import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.learningdesign.BranchingActivity; @@ -92,6 +92,7 @@ import org.lamsfoundation.lams.learningdesign.ToolActivity; import org.lamsfoundation.lams.learningdesign.Transition; import org.lamsfoundation.lams.learningdesign.dao.hibernate.ActivityDAO; +import org.lamsfoundation.lams.learningdesign.service.ExportToolContentException; import org.lamsfoundation.lams.learningdesign.service.IExportToolContentService; import org.lamsfoundation.lams.learningdesign.service.ImportToolContentException; import org.lamsfoundation.lams.lesson.Lesson; @@ -315,29 +316,33 @@ 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; + boolean isEditor = true; PedagogicalPlannerSequenceNode node = null; if (learningDesignId == null && nodeUid != null) { - // we are opening a LD from node, so check is we are allowed to do it - isOpenPermitted = hasRole(request, nodeUid); + // we are opening a LD from a certain node, so check is we are allowed to do it + isEditor = isEditor(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)) { + // make sure user has priviledges + if (!isEditor + || (node != null && node.getPermissions() != null && (node.getPermissions() & PedagogicalPlannerSequenceNode.PERMISSION_EDITOR_MODIFY) == 0)) { 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)) { + if (isEditor ? node != null && node.getPermissions() != null + && (node.getPermissions() & PedagogicalPlannerSequenceNode.PERMISSION_EDITOR_VIEW) == 0 + : node != null + && node.getPermissions() != null + && (node.getPermissions() & PedagogicalPlannerSequenceNode.PERMISSION_TEACHER_COPY) == 0) { log.debug("Unauthorised attempt to openExistingTemplate (copy)"); throw new UserAccessDeniedException(); } @@ -416,15 +421,29 @@ } // create DTO for the whole design Long nodeUid = WebUtil.readLongParam(request, CentralConstants.PARAM_UID, true); - PedagogicalPlannerSequenceNode node = (nodeUid == null) ? null : getPedagogicalPlannerDAO().getByUid(nodeUid); - + PedagogicalPlannerTemplateDTO planner = new PedagogicalPlannerTemplateDTO(); planner.setActivitySupportingPlannerCount(activitySupportingPlannerCount); planner.setSequenceTitle(learningDesign.getTitle()); planner.setActivities(activities); planner.setLearningDesignID(learningDesign.getLearningDesignId()); - planner.setNode(node); + if (nodeUid != null) { + PedagogicalPlannerSequenceNode node = getPedagogicalPlannerDAO().getByUid(nodeUid); + if (node != null) { + boolean isEditor = isEditor(request, nodeUid); + Integer nodePermissions = node.getPermissions(); + planner.setPermissions(nodePermissions, isEditor); + + // set it here rather than in JSP page + if (StringUtils.isBlank(node.getFullDescription())) { + planner.setNodeUid(node.getParent().getUid()); + } else { + planner.setNodeUid(node.getUid()); + } + } + } + // Some additional options for submitting activity forms; should be moved to configuration file in the future planner.setSendInPortions(false); planner.setSubmitDelay(5000); @@ -759,7 +778,7 @@ // Only certain roles can open the editor boolean isSysAdmin = request.isUserInRole(Role.SYSADMIN); - boolean hasRole = isSysAdmin || hasRole(request, nodeUid); + boolean hasRole = isSysAdmin || isEditor(request, nodeUid); Boolean edit = WebUtil.readBooleanParam(request, CentralConstants.PARAM_EDIT, false); edit &= hasRole; @@ -812,7 +831,7 @@ Boolean importNode = WebUtil.readBooleanParam(request, CentralConstants.PARAM_IMPORT_NODE, false); dto.setCreateSubnode(createSubnode); dto.setEdit(edit); - dto.setHasRole(hasRole); + dto.setIsEditor(hasRole); dto.setImportNode(importNode); dto.setTitlePath(titlePath); @@ -832,8 +851,8 @@ // Whole node tree share the same content folder ID nodeForm.setContentFolderId(node.getContentFolderId()); } - nodeForm.setTeachersEditCopy(dto.getEditCopyPermitted()); - nodeForm.setTeachersEditOriginal(dto.getEditOriginalPermitted()); + // set the default permissions + nodeForm.setPermissions(null); } else if (!importNode) { // We fill the form with necessary data nodeForm.setNodeType(node.getLearningDesignId() == null ? PedagogicalPlannerSequenceNodeForm.NODE_TYPE_SUBNODES @@ -842,8 +861,7 @@ nodeForm.setTitle(dto.getTitle()); nodeForm.setBriefDescription(dto.getBriefDescription()); nodeForm.setFullDescription(dto.getFullDescription()); - nodeForm.setTeachersEditCopy(dto.getEditCopyPermitted()); - nodeForm.setTeachersEditOriginal(dto.getEditOriginalPermitted()); + nodeForm.setPermissions(node.getPermissions()); } } return mapping.findForward(PedagogicalPlannerAction.FORWARD_SEQUENCE_CHOOSER); @@ -878,13 +896,14 @@ newRootNode = true; } node.setOrder(getPedagogicalPlannerDAO().getNextOrderId(parentUid)); + node.setUser(getUser()); } else { // It's an existing node node = getPedagogicalPlannerDAO().getByUid(nodeUid); nodeUid = node.getUid(); } - if (!hasRole(request, nodeUid)) { + if (!isEditor(request, nodeUid)) { log.debug("Unauthorised attempt to saveSequenceNode"); throw new UserAccessDeniedException(); } @@ -895,18 +914,16 @@ 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; - + int nodePermissions = nodeForm.getPermissions(); + ActionMessages errors = validateNodeForm(node, nodeForm); if (errors.isEmpty()) { node.setTitle(title); node.setBriefDescription(briefDescription); node.setFullDescription(fullDescription); node.setContentFolderId(nodeForm.getContentFolderId()); - node.setTeachersPermissions(teachersPermissions); + node.setPermissions(nodePermissions); // Different properties are set, depending on node type: with subnodes or template if (PedagogicalPlannerSequenceNodeForm.NODE_TYPE_SUBNODES.equals(nodeForm.getNodeType()) @@ -918,24 +935,40 @@ node.setLearningDesignId(null); node.setLearningDesignTitle(null); } else if (nodeForm.getFile() != null && nodeForm.getFile().getFileSize() > 0) { + // file has been uploaded, so copy it to file system and import LD FormFile file = nodeForm.getFile(); InputStream inputStream = file.getInputStream(); - String fileName = file.getFileName(); + File sourceFile = new File(FileUtil.getTempDir(), file.getFileName()); - LearningDesign learningDesign = importLearningDesign(inputStream, fileName, errors); - updateRecentLearningDesignList(learningDesign.getLearningDesignId()); - - node.setLearningDesignId(learningDesign.getLearningDesignId()); - node.setLearningDesignTitle(learningDesign.getTitle()); - - // If there were subnodes, we delete them now - Iterator subnodeIter = node.getSubnodes().iterator(); - while (subnodeIter.hasNext()) { - PedagogicalPlannerSequenceNode subnode = subnodeIter.next(); - subnodeIter.remove(); - getPedagogicalPlannerDAO().removeNode(subnode); + try { + copyFileFromStream(inputStream, sourceFile); + } catch (Exception e) { + PedagogicalPlannerAction.log.error(e, e); + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + PedagogicalPlannerAction.ERROR_KEY_FILE_OPEN)); } + if (!sourceFile.exists() || sourceFile.isDirectory()) { + PedagogicalPlannerAction.log.error(PedagogicalPlannerAction.ERROR_NOT_PROPER_FILE); + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + PedagogicalPlannerAction.ERROR_KEY_FILE_OPEN)); + } + if (errors.isEmpty()) { + LearningDesign learningDesign = importLearningDesign(sourceFile, errors); + if (errors.isEmpty()) { + updateRecentLearningDesignList(learningDesign.getLearningDesignId()); + node.setLearningDesignId(learningDesign.getLearningDesignId()); + node.setLearningDesignTitle(learningDesign.getTitle()); + + // If there were subnodes, we delete them now + Iterator subnodeIter = node.getSubnodes().iterator(); + while (subnodeIter.hasNext()) { + PedagogicalPlannerSequenceNode subnode = subnodeIter.next(); + subnodeIter.remove(); + getPedagogicalPlannerDAO().removeNode(subnode); + } + } + } } getPedagogicalPlannerDAO().saveOrUpdateNode(node); @@ -970,8 +1003,7 @@ nodeForm.setBriefDescription(briefDescription); nodeForm.setFullDescription(fullDescription); nodeForm.setNodeType(nodeType); - nodeForm.setTeachersEditCopy(teachersPermissions > PedagogicalPlannerSequenceNode.PERMISSION_NONE); - nodeForm.setTeachersEditOriginal(teachersPermissions > PedagogicalPlannerSequenceNode.PERMISSION_VIEW); + nodeForm.setPermissions(nodePermissions); if (createSubnode) { PedagogicalPlannerSequenceNodeDTO dto = (PedagogicalPlannerSequenceNodeDTO) request .getAttribute(CentralConstants.ATTR_NODE); @@ -1051,7 +1083,7 @@ PedagogicalPlannerSequenceNode node = getPedagogicalPlannerDAO().getByUid(nodeUid); Long parentUid = node.getParent() == null ? null : node.getParent().getUid(); - if (hasRole(request, nodeUid)) { + if (isEditor(request, nodeUid)) { PedagogicalPlannerAction.log.debug("Removing sequence node with UID" + nodeUid); getPedagogicalPlannerDAO().removeNode(node); } else { @@ -1146,9 +1178,10 @@ * @throws FileUtilException * @throws IOException * @throws RepositoryCheckedException + * @throws ExportToolContentException */ private String exportNode(Long nodeUid) throws ZipFileUtilException, FileUtilException, IOException, - RepositoryCheckedException { + RepositoryCheckedException, ExportToolContentException { if (nodeUid != null) { String rootDir = FileUtil.createTempDirectory(PedagogicalPlannerAction.EXPORT_NODE_FOLDER_SUFFIX); @@ -1162,6 +1195,8 @@ PedagogicalPlannerSequenceNode node = getPedagogicalPlannerDAO().getByUid(nodeUid); // exporting XML XStream designXml = new XStream(); + // do not serialize node's owner + designXml.omitField(PedagogicalPlannerSequenceNode.class, "user"); designXml.toXML(node, nodeFile); nodeFile.close(); @@ -1211,7 +1246,7 @@ public ActionForward importNode(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws ServletException { - if (!hasRole(request, null)) { + if (!isEditor(request, null)) { log.debug("Unauthorised access to importNode"); throw new UserAccessDeniedException(); } @@ -1254,7 +1289,7 @@ // Upload the template files back into the repository File templateDir = new File(rootPath, PedagogicalPlannerAction.DIR_TEMPLATES); - importSubnodeTemplates(node, templateDir); + importSubnodeTemplates(node, templateDir, errors); // The imported node is added as the last one Integer order = getPedagogicalPlannerDAO().getNextOrderId(null); @@ -1272,31 +1307,16 @@ } /** - * Imports a learning design for edit/preview template purposes. + * Imports a learning design to bind it with a certain node. * * @param fileUuid * @param fileName * @param errors * @return * @throws ServletException */ - private LearningDesign importLearningDesign(InputStream inputStream, String fileName, ActionMessages errors) + private LearningDesign importLearningDesign(File sourceFile, ActionMessages errors) throws ServletException { - File designFile = null; - try { - designFile = new File(FileUtil.getTempDir(), fileName); - copyFileFromStream(inputStream, designFile); - } catch (Exception e) { - PedagogicalPlannerAction.log.error(e, e); - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(PedagogicalPlannerAction.ERROR_KEY_FILE_OPEN)); - return null; - } - if (!designFile.exists() || designFile.isDirectory()) { - PedagogicalPlannerAction.log.error(PedagogicalPlannerAction.ERROR_NOT_PROPER_FILE); - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(PedagogicalPlannerAction.ERROR_KEY_FILE_OPEN)); - return null; - } - User user = getUser(); List toolsErrorMsgs = new ArrayList(); Long learningDesignID = null; @@ -1309,9 +1329,9 @@ // Extract the template try { - Object[] ldResults = getExportService().importLearningDesign(designFile, user, + Object[] ldResults = getExportService().importLearningDesign(sourceFile, user, workspaceFolderId, toolsErrorMsgs, ""); - designFile.delete(); + sourceFile.delete(); learningDesignID = (Long) ldResults[0]; learningDesignErrorMsgs = (List) ldResults[1]; toolsErrorMsgs = (List) ldResults[2]; @@ -1389,15 +1409,16 @@ } /** - * Copies the template files from repository into the selected dir. + * Export the subnodes' templates into the selected dir. * * @param node * @param outputDir + * @throws ExportToolContentException * @throws RepositoryCheckedException * @throws IOException */ - private void exportSubnodeTemplates(PedagogicalPlannerSequenceNode node, File outputDir) - throws RepositoryCheckedException, IOException { + private void exportSubnodeTemplates(PedagogicalPlannerSequenceNode node, File outputDir) throws IOException, + RepositoryCheckedException, ExportToolContentException { if (node != null) { if (node.getLearningDesignId() == null) { if (node.getSubnodes() != null) { @@ -1406,45 +1427,60 @@ } } } else { - File uuidDir = new File(outputDir, node.getLearningDesignId().toString()); - uuidDir.mkdirs(); - File targetFile = new File(uuidDir, node.getLearningDesignTitle()); - InputStream inputStream = getContentHandler().getFileNode(node.getLearningDesignId()).getFile(); - PedagogicalPlannerAction.log.debug("Preparing for zipping the template file: " + node.getLearningDesignTitle()); + + List toolsErrorMsgs = new ArrayList(); + String exportedLdFilePath = getExportService().exportLearningDesign(node.getLearningDesignId(), + toolsErrorMsgs, 1, null); + if (!toolsErrorMsgs.isEmpty()) { + StringBuffer errorMessages = new StringBuffer(); + for (String error : toolsErrorMsgs) { + errorMessages.append(error); + } + throw new ExportToolContentException(errorMessages.toString()); + } + FileInputStream inputStream = new FileInputStream(exportedLdFilePath); + + File ldIdDir = new File(outputDir, node.getLearningDesignId().toString()); + ldIdDir.mkdirs(); + File targetFile = new File(ldIdDir, node.getLearningDesignTitle() + FILE_EXTENSION_ZIP); + + PedagogicalPlannerAction.log.debug("Preparing for zipping the template file: " + + node.getLearningDesignTitle()); copyFileFromStream(inputStream, targetFile); } } } /** - * Uploads the templates back into repository. Also sets all the nodes' UIDs to NULL. + * Imports back the subnodes' templates. Also sets all the nodes' UIDs to NULL. * * @param node * @param inputDir - * @throws RepositoryCheckedException - * @throws IOException + * @throws ServletException */ - private void importSubnodeTemplates(PedagogicalPlannerSequenceNode node, File inputDir) - throws RepositoryCheckedException, IOException { + private void importSubnodeTemplates(PedagogicalPlannerSequenceNode node, File inputDir, ActionMessages errors) + throws ServletException { if (node != null) { node.setUid(null); - + User user = getUser(); + node.setUser(user); + if (node.getLearningDesignId() == null) { if (node.getSubnodes() != null) { for (PedagogicalPlannerSequenceNode subnode : node.getSubnodes()) { - importSubnodeTemplates(subnode, inputDir); + importSubnodeTemplates(subnode, inputDir, errors); subnode.setParent(node); } } } else { - File uuidDir = new File(inputDir, node.getLearningDesignId().toString()); - File file = new File(uuidDir, node.getLearningDesignTitle()); - InputStream inputStream = new FileInputStream(file); - String fileName = node.getLearningDesignTitle(); - PedagogicalPlannerAction.log.debug("Uploading into repository a template file: " + fileName); - NodeKey nodeKey = getContentHandler().uploadFile(inputStream, fileName, - CentralConstants.RESPONSE_CONTENT_TYPE_DOWNLOAD, IToolContentHandler.TYPE_OFFLINE); - node.setLearningDesignId(nodeKey.getUuid()); + File ldIdDir = new File(inputDir, node.getLearningDesignId().toString()); + String fileName = node.getLearningDesignTitle() + FILE_EXTENSION_ZIP; + File sourceFile = new File(ldIdDir, fileName); + PedagogicalPlannerAction.log.debug("Importing a template file: " + fileName); + LearningDesign learningDesign = importLearningDesign(sourceFile, errors); + + node.setLearningDesignId(learningDesign.getLearningDesignId()); + node.setLearningDesignTitle(learningDesign.getTitle()); } } } @@ -1850,7 +1886,7 @@ HttpServletResponse response) throws Exception { Long nodeUid = WebUtil.readLongParam(request, CentralConstants.PARAM_UID, true); - if (hasRole(request, nodeUid)) { + if (isEditor(request, nodeUid)) { List existingUsers = getPedagogicalPlannerDAO().getNodeUsers(nodeUid, Role.ROLE_AUTHOR_ADMIN); Integer orgId = getUserManagementService().getRootOrganisation().getOrganisationId(); @@ -1899,7 +1935,7 @@ Integer userId = WebUtil.readIntParam(request, CentralConstants.PARAM_USER_ID, false); Long nodeUid = WebUtil.readLongParam(request, CentralConstants.PARAM_UID, true); - if (hasRole(request, nodeUid)) { + if (isEditor(request, nodeUid)) { getPedagogicalPlannerDAO().saveNodeRole(userId, nodeUid, Role.ROLE_AUTHOR_ADMIN); } else { log.debug("Unauthorised attempt to add editor to node."); @@ -1913,7 +1949,7 @@ Integer userId = WebUtil.readIntParam(request, CentralConstants.PARAM_USER_ID, false); Long nodeUid = WebUtil.readLongParam(request, CentralConstants.PARAM_UID, false); - if (hasRole(request, nodeUid)) { + if (isEditor(request, nodeUid)) { getPedagogicalPlannerDAO().removeNodeRole(userId, nodeUid, Role.ROLE_AUTHOR_ADMIN); } else { log.debug("Unauthorised attempt to remove editor from node."); @@ -1925,7 +1961,7 @@ /*------------------------ COMMON METHODS --------------------*/ // only these roles can edit nodes and give this role on this node to others - private Boolean hasRole(HttpServletRequest request, Long nodeUid) { + private Boolean isEditor(HttpServletRequest request, Long nodeUid) { if (request.isUserInRole(Role.SYSADMIN)) { // sysadmins have all permission return true; Index: lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerSequenceNodeForm.java =================================================================== diff -u -r6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5 -re2e2aa63f31be07287637a2bec159d1574c0ba2c --- lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerSequenceNodeForm.java (.../PedagogicalPlannerSequenceNodeForm.java) (revision 6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5) +++ lams_central/src/java/org/lamsfoundation/lams/web/planner/PedagogicalPlannerSequenceNodeForm.java (.../PedagogicalPlannerSequenceNodeForm.java) (revision e2e2aa63f31be07287637a2bec159d1574c0ba2c) @@ -25,6 +25,7 @@ import org.apache.struts.action.ActionForm; import org.apache.struts.upload.FormFile; +import org.lamsfoundation.lams.planner.PedagogicalPlannerSequenceNode; public class PedagogicalPlannerSequenceNodeForm extends ActionForm { public final static String NODE_TYPE_SUBNODES = "subnodes"; @@ -39,9 +40,75 @@ private FormFile file; private Boolean removeTemplate; private String nodeType = PedagogicalPlannerSequenceNodeForm.NODE_TYPE_SUBNODES; - private Boolean teachersEditCopy; - private Boolean teachersEditOriginal; + private Boolean permitEditorViewTemplate; + private Boolean permitEditorModifyTemplate; + private Boolean permitEditorReplaceTemplate; + private Boolean permitEditorRemoveTemplate; + + private Boolean permitTeacherViewTemplate; + private Boolean permitTeacherEditCopy; + private Boolean permitTeacherPreview; + private Boolean permitTeacherViewCopyInFullAuthor; + private Boolean permitTeacherExportCopy; + private Boolean permitTeacherSaveCopy; + + /** + * Set checkbox values according to compacted form of node permissions; set defaults if NULL + */ + public void setPermissions(Integer nodePermissions) { + // + permitEditorViewTemplate = nodePermissions == null + || (nodePermissions & PedagogicalPlannerSequenceNode.PERMISSION_EDITOR_VIEW) != 0; + permitEditorModifyTemplate = nodePermissions == null + || (nodePermissions & PedagogicalPlannerSequenceNode.PERMISSION_EDITOR_MODIFY) != 0; + permitEditorReplaceTemplate = nodePermissions != null + && (nodePermissions & PedagogicalPlannerSequenceNode.PERMISSION_EDITOR_REPLACE) != 0; + permitEditorRemoveTemplate = nodePermissions != null + && (nodePermissions & PedagogicalPlannerSequenceNode.PERMISSION_EDITOR_REMOVE) != 0; + + permitTeacherViewTemplate = nodePermissions == null + || (nodePermissions & PedagogicalPlannerSequenceNode.PERMISSION_TEACHER_VIEW) != 0; + permitTeacherEditCopy = nodePermissions == null + || (nodePermissions & PedagogicalPlannerSequenceNode.PERMISSION_TEACHER_COPY) != 0; + permitTeacherPreview = nodePermissions == null + || (nodePermissions & PedagogicalPlannerSequenceNode.PERMISSION_TEACHER_PREVIEW) != 0; + permitTeacherViewCopyInFullAuthor = nodePermissions == null + || (nodePermissions & PedagogicalPlannerSequenceNode.PERMISSION_TEACHER_VIEW_IN_FULL_AUTHOR) != 0; + permitTeacherExportCopy = nodePermissions == null + || (nodePermissions & PedagogicalPlannerSequenceNode.PERMISSION_TEACHER_EXPORT) != 0; + permitTeacherSaveCopy = nodePermissions == null + || (nodePermissions & PedagogicalPlannerSequenceNode.PERMISSION_TEACHER_SAVE) != 0; + } + + /** + * Get compacted node permissions according to checkbox settings. + */ + public int getPermissions() { + int permissions = 0; + permissions += Boolean.TRUE.equals(permitEditorViewTemplate) ? PedagogicalPlannerSequenceNode.PERMISSION_EDITOR_VIEW + : 0; + permissions += Boolean.TRUE.equals(permitEditorModifyTemplate) ? PedagogicalPlannerSequenceNode.PERMISSION_EDITOR_MODIFY + : 0; + permissions += Boolean.TRUE.equals(permitEditorReplaceTemplate) ? PedagogicalPlannerSequenceNode.PERMISSION_EDITOR_REPLACE + : 0; + permissions += Boolean.TRUE.equals(permitEditorRemoveTemplate) ? PedagogicalPlannerSequenceNode.PERMISSION_EDITOR_REMOVE + : 0; + permissions += Boolean.TRUE.equals(permitTeacherViewTemplate) ? PedagogicalPlannerSequenceNode.PERMISSION_TEACHER_VIEW + : 0; + permissions += Boolean.TRUE.equals(permitTeacherEditCopy) ? PedagogicalPlannerSequenceNode.PERMISSION_TEACHER_COPY + : 0; + permissions += Boolean.TRUE.equals(permitTeacherPreview) ? PedagogicalPlannerSequenceNode.PERMISSION_TEACHER_PREVIEW + : 0; + permissions += Boolean.TRUE.equals(permitTeacherViewCopyInFullAuthor) ? PedagogicalPlannerSequenceNode.PERMISSION_TEACHER_VIEW_IN_FULL_AUTHOR + : 0; + permissions += Boolean.TRUE.equals(permitTeacherExportCopy) ? PedagogicalPlannerSequenceNode.PERMISSION_TEACHER_EXPORT + : 0; + permissions += Boolean.TRUE.equals(permitTeacherSaveCopy) ? PedagogicalPlannerSequenceNode.PERMISSION_TEACHER_SAVE + : 0; + return permissions; + } + public Long getUid() { return uid; } @@ -114,19 +181,83 @@ this.contentFolderId = contentFolderId; } - public Boolean getTeachersEditCopy() { - return teachersEditCopy; + public Boolean getPermitEditorViewTemplate() { + return permitEditorViewTemplate; } - public void setTeachersEditCopy(Boolean teachersEditCopy) { - this.teachersEditCopy = teachersEditCopy; + public void setPermitEditorViewTemplate(Boolean permitEditorViewTemplate) { + this.permitEditorViewTemplate = permitEditorViewTemplate; } - public Boolean getTeachersEditOriginal() { - return teachersEditOriginal; + public Boolean getPermitEditorModifyTemplate() { + return permitEditorModifyTemplate; } - public void setTeachersEditOriginal(Boolean teachersEditOriginal) { - this.teachersEditOriginal = teachersEditOriginal; + public void setPermitEditorModifyTemplate(Boolean permitEditorEditTemplate) { + this.permitEditorModifyTemplate = permitEditorEditTemplate; } + + public Boolean getPermitEditorReplaceTemplate() { + return permitEditorReplaceTemplate; + } + + public void setPermitEditorReplaceTemplate(Boolean permitEditorReplaceTemplate) { + this.permitEditorReplaceTemplate = permitEditorReplaceTemplate; + } + + public Boolean getPermitEditorRemoveTemplate() { + return permitEditorRemoveTemplate; + } + + public void setPermitEditorRemoveTemplate(Boolean permitEditorRemoveTemplate) { + this.permitEditorRemoveTemplate = permitEditorRemoveTemplate; + } + + public Boolean getPermitTeacherViewTemplate() { + return permitTeacherViewTemplate; + } + + public void setPermitTeacherViewTemplate(Boolean permitTeacherViewTemplate) { + this.permitTeacherViewTemplate = permitTeacherViewTemplate; + } + + public Boolean getPermitTeacherEditCopy() { + return permitTeacherEditCopy; + } + + public void setPermitTeacherEditCopy(Boolean permitTeacherEditCopy) { + this.permitTeacherEditCopy = permitTeacherEditCopy; + } + + public Boolean getPermitTeacherPreview() { + return permitTeacherPreview; + } + + public void setPermitTeacherPreview(Boolean permitTeacherPreview) { + this.permitTeacherPreview = permitTeacherPreview; + } + + public Boolean getPermitTeacherViewCopyInFullAuthor() { + return permitTeacherViewCopyInFullAuthor; + } + + public void setPermitTeacherViewCopyInFullAuthor(Boolean permitTeacherViewCopyInFullAuthor) { + this.permitTeacherViewCopyInFullAuthor = permitTeacherViewCopyInFullAuthor; + } + + public Boolean getPermitTeacherExportCopy() { + return permitTeacherExportCopy; + } + + public void setPermitTeacherExportCopy(Boolean permitTeacherExportCopy) { + this.permitTeacherExportCopy = permitTeacherExportCopy; + } + + public Boolean getPermitTeacherSaveCopy() { + return permitTeacherSaveCopy; + } + + public void setPermitTeacherSaveCopy(Boolean permitTeacherSaveCopy) { + this.permitTeacherSaveCopy = permitTeacherSaveCopy; + } } \ No newline at end of file Index: lams_central/web/includes/javascript/pedagogicalPlanner.js =================================================================== diff -u -r6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5 -re2e2aa63f31be07287637a2bec159d1574c0ba2c --- lams_central/web/includes/javascript/pedagogicalPlanner.js (.../pedagogicalPlanner.js) (revision 6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5) +++ lams_central/web/includes/javascript/pedagogicalPlanner.js (.../pedagogicalPlanner.js) (revision e2e2aa63f31be07287637a2bec159d1574c0ba2c) @@ -227,16 +227,54 @@ } } - function onRemoveTemplateCheckboxChange(){ - document.getElementById("fileInputArea").style.display = document.getElementById("removeTemplate").checked ? "none" : "block"; + function onRemoveTemplateCheckboxChange() { + if ($('#fileInputArea').length > 0) { + 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 onPermissionsCheckboxChange() { + if ($('#fileInputArea').length > 0) { + // some permissions require other to be set + if ($('#permitEditorViewTemplate').attr('checked') == false) { + $('#permitEditorModifyTemplate').attr('checked', false); + $('#permitEditorReplaceTemplate').attr('checked', false); + $('#permitEditorRemoveTemplate').attr('checked', false); + + $('#permitEditorModifyTemplate').attr('disabled', true); + $('#permitEditorReplaceTemplate').attr('disabled', true); + $('#permitEditorRemoveTemplate').attr('disabled', true); + } else { + $('#permitEditorModifyTemplate').attr('disabled', false); + $('#permitEditorReplaceTemplate').attr('disabled', false); + $('#permitEditorRemoveTemplate').attr('disabled', false); + } + + if ($('#permitTeacherViewTemplate').attr('checked') == false) { + $('#permitTeacherEditCopy').attr('checked', false); + $('#permitTeacherPreview').attr('checked', false); + + $('#permitTeacherEditCopy').attr('disabled', true); + $('#permitTeacherPreview').attr('disabled', true); + } else { + $('#permitTeacherEditCopy').attr('disabled', false); + $('#permitTeacherPreview').attr('disabled', false); + } + + if ($('#permitTeacherEditCopy').attr('checked') == false) { + $('#permitTeacherViewCopyInFullAuthor').attr('checked', false); + $('#permitTeacherExportCopy').attr('checked', false); + $('#permitTeacherSaveCopy').attr('checked', false); + + $('#permitTeacherViewCopyInFullAuthor').attr('disabled', true); + $('#permitTeacherExportCopy').attr('disabled', true); + $('#permitTeacherSaveCopy').attr('disabled', true); + } else { + $('#permitTeacherViewCopyInFullAuthor').attr('disabled', false); + $('#permitTeacherExportCopy').attr('disabled', false); + $('#permitTeacherSaveCopy').attr('disabled', false); + } } } Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/planner/PedagogicalPlannerSequenceNode.hbm.xml =================================================================== diff -u -r6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5 -re2e2aa63f31be07287637a2bec159d1574c0ba2c --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/planner/PedagogicalPlannerSequenceNode.hbm.xml (.../PedagogicalPlannerSequenceNode.hbm.xml) (revision 6d0e19e0d48a4950c9afbb40823a2bc49c2bb5a5) +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/planner/PedagogicalPlannerSequenceNode.hbm.xml (.../PedagogicalPlannerSequenceNode.hbm.xml) (revision e2e2aa63f31be07287637a2bec159d1574c0ba2c) @@ -120,13 +120,24 @@ /> + +