Index: lams_central/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r7ba17e82a4cd08db748536b39aef80a4f1c03027 -r81e4f5489c431c5e9ff66769f43ebe9b14d36c1a --- lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 7ba17e82a4cd08db748536b39aef80a4f1c03027) +++ lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 81e4f5489c431c5e9ff66769f43ebe9b14d36c1a) @@ -806,13 +806,15 @@ outcome.manage.add.error.name.blank =Name can not be blank outcome.manage.add.error.code.blank =Code can not be blank outcome.manage.add.error.scale.choose =You have to choose a scale +outcome.manage.remove.error.in.use =The outcome is mapped to some items. It can not be removed. scale.title =Scales scale.manage =Manage scales scale.manage.add =Add scale scale.manage.edit =Edit scale scale.manage.view =View scale scale.manage.remove =Remove scale -scale.manage.remove.scale =Error while removing a scale. It is probably used in some outcomes. +scale.manage.remove.scale =Error while removing a scale. +scale.manage.remove.error.in.use =The scale is used in some outcomes. It can not be removed. scale.manage.remove.confirm =Are you sure you want to remove this scale? scale.manage.add.value =Values scale.manage.add.value.info =Enter comma separated values in increasing order of value. For example, an A,B,C,D scale must be entered as D,C,B,A. Index: lams_central/src/java/org/lamsfoundation/lams/web/outcome/OutcomeController.java =================================================================== diff -u -r7ba17e82a4cd08db748536b39aef80a4f1c03027 -r81e4f5489c431c5e9ff66769f43ebe9b14d36c1a --- lams_central/src/java/org/lamsfoundation/lams/web/outcome/OutcomeController.java (.../OutcomeController.java) (revision 7ba17e82a4cd08db748536b39aef80a4f1c03027) +++ lams_central/src/java/org/lamsfoundation/lams/web/outcome/OutcomeController.java (.../OutcomeController.java) (revision 81e4f5489c431c5e9ff66769f43ebe9b14d36c1a) @@ -87,6 +87,9 @@ @RequestMapping("/outcomeManage") public String outcomeManage(HttpServletRequest request, HttpServletResponse response) throws Exception { + UserDTO user = getUserDTO(); + securityService.isSysadmin(user.getUserID(), "import outcomes", true); + List outcomes = outcomeService.getOutcomes(); request.setAttribute("outcomes", outcomes); return "outcome/outcomeManage"; @@ -95,6 +98,9 @@ @RequestMapping("/outcomeEdit") public String outcomeEdit(@ModelAttribute OutcomeForm outcomeForm, HttpServletRequest request, HttpServletResponse response) throws Exception { + UserDTO user = getUserDTO(); + securityService.isSysadmin(user.getUserID(), "import outcomes", true); + Long outcomeId = WebUtil.readLongParam(request, "outcomeId", true); Outcome outcome = outcomeId == null ? null : (Outcome) userManagementService.findById(Outcome.class, outcomeId); @@ -164,15 +170,27 @@ @RequestMapping("/outcomeRemove") public String outcomeRemove(HttpServletRequest request, HttpServletResponse response) throws Exception { + UserDTO user = getUserDTO(); + securityService.isSysadmin(user.getUserID(), "import outcomes", true); + Long outcomeId = WebUtil.readLongParam(request, "outcomeId", false); Outcome outcome = (Outcome) userManagementService.findById(Outcome.class, outcomeId); if (outcome == null) { throw new IllegalArgumentException("Can not find an outcome with ID " + outcomeId); } - userManagementService.delete(outcome); - if (log.isDebugEnabled()) { - log.debug("Deleted outcome " + outcomeId); + + long mappingCount = outcomeService.countOutcomeMappings(outcomeId); + if (mappingCount == 0) { + userManagementService.delete(outcome); + if (log.isDebugEnabled()) { + log.debug("Deleted outcome " + outcomeId); + } + } else { + MultiValueMap errorMap = new LinkedMultiValueMap<>(1); + errorMap.add("GLOBAL", messageService.getMessage("outcome.manage.remove.error.in.use")); + request.setAttribute("errorMap", errorMap); } + return outcomeManage(request, response); } @@ -300,21 +318,11 @@ Long mappingId = WebUtil.readLongParam(request, "mappingId"); OutcomeMapping outcomeMapping = (OutcomeMapping) userManagementService.findById(OutcomeMapping.class, mappingId); - Outcome outcome = outcomeMapping.getOutcome(); - Long outcomeId = outcome.getOutcomeId(); userManagementService.delete(outcomeMapping); if (log.isDebugEnabled()) { log.debug("Deleted outcome mapping " + mappingId); } - // if the outcome is not mapped to any activity, remove it - long mappingCount = outcomeService.countOutcomeMappings(outcomeId); - if (mappingCount == 0) { - userManagementService.delete(outcome); - if (log.isDebugEnabled()) { - log.debug("Deleted outcome " + outcomeId + " as it did not have any mappings"); - } - } } @SuppressWarnings("unchecked") @@ -438,15 +446,16 @@ if (scale == null) { throw new IllegalArgumentException("Can not find an outcome scale with ID " + scaleId); } - try { + + long scaleUseCount = outcomeService.countScaleUse(scaleId); + if (scaleUseCount == 0) { userManagementService.delete(scale); if (log.isDebugEnabled()) { log.debug("Deleted outcome scale " + scaleId); } - } catch (Exception e) { - log.error("Error while removing an outcome scale", e); + } else { MultiValueMap errorMap = new LinkedMultiValueMap<>(1); - errorMap.add("GLOBAL", messageService.getMessage("scale.manage.remove.scale")); + errorMap.add("GLOBAL", messageService.getMessage("scale.manage.remove.error.in.use")); request.setAttribute("errorMap", errorMap); } Index: lams_common/src/java/org/lamsfoundation/lams/outcome/service/IOutcomeService.java =================================================================== diff -u -r7ba17e82a4cd08db748536b39aef80a4f1c03027 -r81e4f5489c431c5e9ff66769f43ebe9b14d36c1a --- lams_common/src/java/org/lamsfoundation/lams/outcome/service/IOutcomeService.java (.../IOutcomeService.java) (revision 7ba17e82a4cd08db748536b39aef80a4f1c03027) +++ lams_common/src/java/org/lamsfoundation/lams/outcome/service/IOutcomeService.java (.../IOutcomeService.java) (revision 81e4f5489c431c5e9ff66769f43ebe9b14d36c1a) @@ -25,6 +25,8 @@ long countOutcomeMappings(Long outcomeId); + long countScaleUse(Long scaleId); + List getScales(); List getOutcomeResults(Integer userId, Long lessonId, Long toolContentId, Long itemId); Index: lams_common/src/java/org/lamsfoundation/lams/outcome/service/OutcomeService.java =================================================================== diff -u -r7ba17e82a4cd08db748536b39aef80a4f1c03027 -r81e4f5489c431c5e9ff66769f43ebe9b14d36c1a --- lams_common/src/java/org/lamsfoundation/lams/outcome/service/OutcomeService.java (.../OutcomeService.java) (revision 7ba17e82a4cd08db748536b39aef80a4f1c03027) +++ lams_common/src/java/org/lamsfoundation/lams/outcome/service/OutcomeService.java (.../OutcomeService.java) (revision 81e4f5489c431c5e9ff66769f43ebe9b14d36c1a) @@ -64,6 +64,13 @@ } @Override + public long countScaleUse(Long scaleId) { + Map properties = new HashMap<>(); + properties.put("scale.scaleId", scaleId); + return outcomeDAO.countByProperties(Outcome.class, properties); + } + + @Override public List getOutcomeResults(Integer userId, Long lessonId, Long toolContentId, Long itemId) { return outcomeDAO.getOutcomeResults(userId, lessonId, toolContentId, itemId); } @@ -177,9 +184,11 @@ cell = row.getCell(1); String code = cell.getStringCellValue(); List foundScales = outcomeDAO.findByProperty(OutcomeScale.class, "name", name); + foundScales.addAll(outcomeDAO.findByProperty(OutcomeScale.class, "code", code)); if (!foundScales.isEmpty()) { if (log.isDebugEnabled()) { - log.debug("Skipping an outcome scale with existing name: " + name); + log.debug("Skipping an outcome scale with existing name \"" + name + "\" or code \"" + code + + "\""); } continue; } @@ -241,9 +250,10 @@ cell = row.getCell(1); String code = cell.getStringCellValue(); List foundOutcomes = outcomeDAO.findByProperty(Outcome.class, "name", name); + foundOutcomes.addAll(outcomeDAO.findByProperty(Outcome.class, "code", code)); if (!foundOutcomes.isEmpty()) { if (log.isDebugEnabled()) { - log.debug("Skipping an outcome with existing name: " + name); + log.debug("Skipping an outcome with existing name \"" + name + "\" or code \"" + code + "\""); } continue; }