Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -re10cc5cece2f9f7a5044b274914c0517a064699a -r73e57b8ca1a3ddd6cd15b00240d90b79c5de063a Binary files differ Index: lams_central/src/java/org/lamsfoundation/lams/authoring/authoringApplicationContext.xml =================================================================== diff -u -ra949c337adc53b2df9207aa1de6e500281de7c20 -r73e57b8ca1a3ddd6cd15b00240d90b79c5de063a --- lams_central/src/java/org/lamsfoundation/lams/authoring/authoringApplicationContext.xml (.../authoringApplicationContext.xml) (revision a949c337adc53b2df9207aa1de6e500281de7c20) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/authoringApplicationContext.xml (.../authoringApplicationContext.xml) (revision 73e57b8ca1a3ddd6cd15b00240d90b79c5de063a) @@ -64,6 +64,7 @@ + Index: lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java =================================================================== diff -u -r4b865d9e5cdcaa1a21b113764194305d9a7480dd -r73e57b8ca1a3ddd6cd15b00240d90b79c5de063a --- lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java (.../AuthoringService.java) (revision 4b865d9e5cdcaa1a21b113764194305d9a7480dd) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java (.../AuthoringService.java) (revision 73e57b8ca1a3ddd6cd15b00240d90b79c5de063a) @@ -89,6 +89,7 @@ import org.lamsfoundation.lams.logevent.service.ILogEventService; import org.lamsfoundation.lams.monitoring.service.IMonitoringService; import org.lamsfoundation.lams.monitoring.service.MonitoringServiceException; +import org.lamsfoundation.lams.outcome.service.IOutcomeService; import org.lamsfoundation.lams.planner.dao.PedagogicalPlannerDAO; import org.lamsfoundation.lams.tool.SystemTool; import org.lamsfoundation.lams.tool.Tool; @@ -167,6 +168,8 @@ protected IGradebookService gradebookService; + protected IOutcomeService outcomeService; + protected ToolContentIDGenerator contentIDGenerator; /** The bean factory is used to create ObjectExtractor objects */ @@ -353,6 +356,10 @@ this.logEventService = logEventService; } + public void setOutcomeService(IOutcomeService outcomeService) { + this.outcomeService = outcomeService; + } + /** * @param contentIDGenerator * The contentIDGenerator to set. @@ -449,16 +456,17 @@ for (Lesson lesson : (Set) design.getLessons()) { lesson.setLockedForEdit(true); - if ( design.getEditOverrideUser() == null || design.getEditOverrideLock() == null || !design.getEditOverrideLock() ) { + if (design.getEditOverrideUser() == null || design.getEditOverrideLock() == null + || !design.getEditOverrideLock()) { // create audit log entry only the first time - do not redo one if the monitor has restarted editing. - String message = messageService.getMessage("audit.live.edit.start", new Object[] { design.getTitle(), - design.getLearningDesignId(), lesson.getLessonId(), user.getLogin(), user.getUserId() }); - logEventService.logEvent(LogEvent.TYPE_LIVE_EDIT, user.getUserId(), null, lesson.getLessonId(), null, - message); + String message = messageService.getMessage("audit.live.edit.start", + new Object[] { design.getTitle(), design.getLearningDesignId(), lesson.getLessonId(), + user.getLogin(), user.getUserId() }); + logEventService.logEvent(LogEvent.TYPE_LIVE_EDIT, user.getUserId(), null, lesson.getLessonId(), + null, message); } } - // lock Learning Design design.setEditOverrideLock(true); design.setEditOverrideUser(user); @@ -1004,11 +1012,11 @@ ToolActivity toolActivity = (ToolActivity) activity; // copy the content Long newContentId = lamsCoreToolService.notifyToolToCopyContent(toolActivity, customCSV); + outcomeService.copyOutcomeMappings(null, toolActivity.getToolContentId(), null, null, newContentId, null); toolActivity.setToolContentId(newContentId); // clear read only field toolActivity.setReadOnly(false); - } catch (DataMissingException e) { String error = "Unable to copy a design / initialise the lesson. Data is missing for activity " + activity.getActivityUIID() + " in learning design " + originalLearningDesignId @@ -1598,7 +1606,9 @@ @Override public Long copyToolContent(Long toolContentID, String customCSV) throws IOException { - return lamsCoreToolService.notifyToolToCopyContent(toolContentID, customCSV); + Long newToolContentID = lamsCoreToolService.notifyToolToCopyContent(toolContentID, customCSV); + outcomeService.copyOutcomeMappings(null, toolContentID, null, null, newToolContentID, null); + return newToolContentID; } /** Index: lams_central/src/java/org/lamsfoundation/lams/web/outcome/OutcomeAction.java =================================================================== diff -u -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b -r73e57b8ca1a3ddd6cd15b00240d90b79c5de063a --- lams_central/src/java/org/lamsfoundation/lams/web/outcome/OutcomeAction.java (.../OutcomeAction.java) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) +++ lams_central/src/java/org/lamsfoundation/lams/web/outcome/OutcomeAction.java (.../OutcomeAction.java) (revision 73e57b8ca1a3ddd6cd15b00240d90b79c5de063a) @@ -43,8 +43,11 @@ import org.apache.struts.actions.DispatchAction; import org.apache.tomcat.util.json.JSONArray; import org.apache.tomcat.util.json.JSONObject; +import org.lamsfoundation.lams.learningdesign.ToolActivity; +import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.outcome.Outcome; import org.lamsfoundation.lams.outcome.OutcomeMapping; +import org.lamsfoundation.lams.outcome.OutcomeResult; import org.lamsfoundation.lams.outcome.OutcomeScale; import org.lamsfoundation.lams.outcome.OutcomeScaleItem; import org.lamsfoundation.lams.outcome.service.IOutcomeService; @@ -190,6 +193,10 @@ outcome.setScale(scale); } getUserManagementService().save(outcome); + + if (log.isDebugEnabled()) { + log.debug("Saved outcome " + outcome.getOutcomeId()); + } request.setAttribute("saved", true); } catch (Exception e) { log.error("Exception while saving an outcome", e); @@ -227,6 +234,9 @@ } } getUserManagementService().delete(outcome); + if (log.isDebugEnabled()) { + log.debug("Deleted outcome " + outcomeId); + } return outcomeManage(mapping, form, request, response); } @@ -310,6 +320,11 @@ outcomeMapping.setItemId(itemId); getUserManagementService().save(outcomeMapping); + if (log.isDebugEnabled()) { + log.debug("Mapped outcome " + outcome.getOutcomeId() + " to lesson ID " + lessonId + " and tool content ID " + + toolContentId + " and item ID " + itemId); + } + response.setContentType("text/plain;charset=utf-8"); response.getWriter().print(outcomeMapping.getMappingId()); return null; @@ -367,9 +382,75 @@ "remove outcome mapping", true); } getUserManagementService().delete(outcomeMapping); + if (log.isDebugEnabled()) { + log.debug("Deleted outcome mapping " + outcomeMapping); + } return null; } + @SuppressWarnings("unchecked") + public ActionForward outcomeSetResult(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws Exception { + Long mappingId = WebUtil.readLongParam(request, "pk"); + Integer value = WebUtil.readIntParam(request, "value"); + Integer targetUserId = WebUtil.readIntParam(request, "name"); + OutcomeMapping outcomeMapping = (OutcomeMapping) getUserManagementService().findById(OutcomeMapping.class, + mappingId); + Long lessonId = outcomeMapping.getLessonId(); + if (lessonId == null) { + ToolActivity toolActivity = ((List) getUserManagementService() + .findByProperty(ToolActivity.class, "toolContentId", outcomeMapping.getToolContentId())).get(0); + lessonId = ((Lesson) toolActivity.getLearningDesign().getLessons().iterator().next()).getLessonId(); + } + Integer userId = getUserDTO().getUserID(); + getSecurityService().isLessonMonitor(lessonId, userId, "set outcome result", true); + + OutcomeResult result = getOutcomeService().getOutcomeResult(userId, mappingId); + if (result == null) { + // result does not exist; if value == -1, it means it is not meant to exist, otherwise create + if (value > -1) { + result = new OutcomeResult(); + User user = (User) getUserManagementService().findById(User.class, userId); + result.setCreateBy(user); + result.setCreateDateTime(new Date()); + result.setMapping(outcomeMapping); + User targetUser = (User) getUserManagementService().findById(User.class, targetUserId); + result.setUser(targetUser); + result.setValue(value); + getUserManagementService().save(result); + if (log.isDebugEnabled()) { + log.debug("Added outcome result " + result.getResultId()); + } + } + // modify only if value is different + } else if (!result.getValue().equals(value)) { + // if value is -1, remove the result + if (value == -1) { + Long resultId = result.getResultId(); + getUserManagementService().delete(result); + if (log.isDebugEnabled()) { + log.debug("Deleted outcome result " + resultId); + } + } else { + // update existing result + result.setValue(value); + User user = (User) getUserManagementService().findById(User.class, userId); + result.setCreateBy(user); + result.setCreateBy(user); + result.setValue(value); + getUserManagementService().save(result); + if (log.isDebugEnabled()) { + log.debug("Edited outcome result " + result.getResultId()); + } + } + } + + // if something else than OK is sent, x-editable will print ERROR! + response.setContentType("text/plain;charset=utf-8"); + response.getWriter().print("OK"); + return null; + } + public ActionForward scaleManage(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { Integer userId = getUserDTO().getUserID(); @@ -419,6 +500,9 @@ } } getUserManagementService().delete(scale); + if (log.isDebugEnabled()) { + log.debug("Deleted outcome scale " + scaleId); + } return scaleManage(mapping, form, request, response); } @@ -542,6 +626,10 @@ scale.getItems().addAll(newItems); getUserManagementService().save(scale); + if (log.isDebugEnabled()) { + log.debug("Saved outcome scale " + scale.getScaleId()); + } + request.setAttribute("saved", true); } } catch (Exception e) { Index: lams_central/web/css/x-editable-lams.css =================================================================== diff -u --- lams_central/web/css/x-editable-lams.css (revision 0) +++ lams_central/web/css/x-editable-lams.css (revision 73e57b8ca1a3ddd6cd15b00240d90b79c5de063a) @@ -0,0 +1,19 @@ +/* Overwrite gliphicon class used by x-editable.js*/ +.glyphicon{ + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-ok:before { + content: "\f00c"; +} +.glyphicon-remove:before { + content: "\f00d"; +} +/* Overwrite properties set in x-editable.css*/ +.editable-click, a.editable-click, a.editable-click:hover { + border-bottom: none; +} \ No newline at end of file Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/outcome/OutcomeResult.hbm.xml =================================================================== diff -u -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b -r73e57b8ca1a3ddd6cd15b00240d90b79c5de063a --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/outcome/OutcomeResult.hbm.xml (.../OutcomeResult.hbm.xml) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/outcome/OutcomeResult.hbm.xml (.../OutcomeResult.hbm.xml) (revision 73e57b8ca1a3ddd6cd15b00240d90b79c5de063a) @@ -21,7 +21,7 @@ - + getScalesSortedByName(Integer organisationId); List getAuthorOrganisations(Integer userId); + + List getOutcomeResults(Integer userId, Long lessonId, Long toolContentId, Long itemId); + + OutcomeResult getOutcomeResult(Integer userId, Long mappingId); } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/outcome/dao/hibernate/OutcomeDAO.java =================================================================== diff -u -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b -r73e57b8ca1a3ddd6cd15b00240d90b79c5de063a --- lams_common/src/java/org/lamsfoundation/lams/outcome/dao/hibernate/OutcomeDAO.java (.../OutcomeDAO.java) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) +++ lams_common/src/java/org/lamsfoundation/lams/outcome/dao/hibernate/OutcomeDAO.java (.../OutcomeDAO.java) (revision 73e57b8ca1a3ddd6cd15b00240d90b79c5de063a) @@ -32,6 +32,7 @@ import org.lamsfoundation.lams.dao.hibernate.LAMSBaseDAO; import org.lamsfoundation.lams.outcome.Outcome; import org.lamsfoundation.lams.outcome.OutcomeMapping; +import org.lamsfoundation.lams.outcome.OutcomeResult; import org.lamsfoundation.lams.outcome.OutcomeScale; import org.lamsfoundation.lams.outcome.dao.IOutcomeDAO; import org.lamsfoundation.lams.usermanagement.Role; @@ -121,4 +122,31 @@ public List getAuthorOrganisations(Integer userId) { return find(FIND_AUTHOR_ORGANISATIONS, new Object[] { userId }); } + + @SuppressWarnings("unchecked") + public List getOutcomeResults(Integer userId, Long lessonId, Long toolContentId, Long itemId) { + Map properties = new HashMap(); + if (lessonId != null) { + properties.put("mapping.outcome.lessonId", lessonId); + } + if (toolContentId != null) { + properties.put("mapping.outcome.toolContentId", toolContentId); + } + if (itemId != null) { + properties.put("mapping.outcome.itemId", itemId); + } + if (userId != null) { + properties.put("user.userId", userId); + } + return findByProperties(OutcomeResult.class, properties); + } + + @SuppressWarnings("unchecked") + public OutcomeResult getOutcomeResult(Integer userId, Long mappingId) { + Map properties = new HashMap(); + properties.put("user.userId", userId); + properties.put("mapping.mappingId", mappingId); + List result = findByProperties(OutcomeResult.class, properties); + return result.isEmpty() ? null : result.get(0); + } } Index: lams_common/src/java/org/lamsfoundation/lams/outcome/service/IOutcomeService.java =================================================================== diff -u -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b -r73e57b8ca1a3ddd6cd15b00240d90b79c5de063a --- lams_common/src/java/org/lamsfoundation/lams/outcome/service/IOutcomeService.java (.../IOutcomeService.java) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) +++ lams_common/src/java/org/lamsfoundation/lams/outcome/service/IOutcomeService.java (.../IOutcomeService.java) (revision 73e57b8ca1a3ddd6cd15b00240d90b79c5de063a) @@ -5,6 +5,7 @@ import org.lamsfoundation.lams.outcome.Outcome; import org.lamsfoundation.lams.outcome.OutcomeMapping; +import org.lamsfoundation.lams.outcome.OutcomeResult; import org.lamsfoundation.lams.outcome.OutcomeScale; public interface IOutcomeService { @@ -17,4 +18,11 @@ List getOutcomeMappings(Long lessonId, Long toolContentId, Long itemId); List getScales(Integer organisationId); + + List getOutcomeResults(Integer userId, Long lessonId, Long toolContentId, Long itemId); + + OutcomeResult getOutcomeResult(Integer userId, Long mappingId); + + void copyOutcomeMappings(Long sourceLessonId, Long sourceToolContentId, Long sourceItemId, Long targetLessonId, + Long targetToolContentId, Long targetItemId); } Index: lams_common/src/java/org/lamsfoundation/lams/outcome/service/OutcomeService.java =================================================================== diff -u -ra1bfe9d7972867fa2a0bcacc2bf263a9e34c856b -r73e57b8ca1a3ddd6cd15b00240d90b79c5de063a --- lams_common/src/java/org/lamsfoundation/lams/outcome/service/OutcomeService.java (.../OutcomeService.java) (revision a1bfe9d7972867fa2a0bcacc2bf263a9e34c856b) +++ lams_common/src/java/org/lamsfoundation/lams/outcome/service/OutcomeService.java (.../OutcomeService.java) (revision 73e57b8ca1a3ddd6cd15b00240d90b79c5de063a) @@ -8,6 +8,7 @@ import org.lamsfoundation.lams.outcome.Outcome; import org.lamsfoundation.lams.outcome.OutcomeMapping; +import org.lamsfoundation.lams.outcome.OutcomeResult; import org.lamsfoundation.lams.outcome.OutcomeScale; import org.lamsfoundation.lams.outcome.dao.IOutcomeDAO; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; @@ -43,6 +44,27 @@ return outcomeDAO.getOutcomeMappings(lessonId, toolContentId, itemId); } + public List getOutcomeResults(Integer userId, Long lessonId, Long toolContentId, Long itemId) { + return outcomeDAO.getOutcomeResults(userId, lessonId, toolContentId, itemId); + } + + public OutcomeResult getOutcomeResult(Integer userId, Long mappingId) { + return outcomeDAO.getOutcomeResult(userId, mappingId); + } + + public void copyOutcomeMappings(Long sourceLessonId, Long sourceToolContentId, Long sourceItemId, + Long targetLessonId, Long targetToolContentId, Long targetItemId) { + List sourceMappings = getOutcomeMappings(sourceLessonId, sourceToolContentId, sourceItemId); + for (OutcomeMapping sourceMapping : sourceMappings) { + OutcomeMapping targetMapping = new OutcomeMapping(); + targetMapping.setOutcome(sourceMapping.getOutcome()); + targetMapping.setLessonId(targetLessonId); + targetMapping.setToolContentId(targetToolContentId); + targetMapping.setItemId(targetItemId); + outcomeDAO.insert(targetMapping); + } + } + public void setOutcomeDAO(IOutcomeDAO outcomeDAO) { this.outcomeDAO = outcomeDAO; } Index: lams_gradebook/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -rb67bc25f161fa3bf350e4c89696c24620674c8ef -r73e57b8ca1a3ddd6cd15b00240d90b79c5de063a --- lams_gradebook/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision b67bc25f161fa3bf350e4c89696c24620674c8ef) +++ lams_gradebook/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 73e57b8ca1a3ddd6cd15b00240d90b79c5de063a) @@ -38,6 +38,7 @@ gradebook.columntitle.attempt =Attempt # gradebook.columntitle.restart =Restart date gradebook.columntitle.lesson.mark =Lesson mark +gradebook.columntitle.outcome =Learning outcomes gradebook.function.window.showColumns =Show/Hide columns gradebook.function.error.enterNumber =Please enter a number value gradebook.function.search.title =Search grid @@ -125,4 +126,6 @@ outcome.authoring.input =Search and select by outcome name or code outcome.authoring.existing =Added outcomes outcome.authoring.existing.none =none +outcome.result.not.set =not set +outcome.result.error =Error! #======= End labels: Exported 112 labels for en AU ===== Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBActivityGridRowDTO.java =================================================================== diff -u -r352e16d0ad309caa12c5422fddebfc221c83714b -r73e57b8ca1a3ddd6cd15b00240d90b79c5de063a --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBActivityGridRowDTO.java (.../GBActivityGridRowDTO.java) (revision 352e16d0ad309caa12c5422fddebfc221c83714b) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBActivityGridRowDTO.java (.../GBActivityGridRowDTO.java) (revision 73e57b8ca1a3ddd6cd15b00240d90b79c5de063a) @@ -20,7 +20,6 @@ * **************************************************************** */ - package org.lamsfoundation.lams.gradebook.dto; import java.util.ArrayList; @@ -56,57 +55,58 @@ this.groupId = groupId; } - /** The Spring htmlEscape method escapes Greek letters (https://jira.spring.io/browse/SPR-9293) - * so when the escaping is done for the Excel Exports, any Greek activity names are escaped. + /** + * The Spring htmlEscape method escapes Greek letters (https://jira.spring.io/browse/SPR-9293) + * so when the escaping is done for the Excel Exports, any Greek activity names are escaped. * So we default to escaping (works fine sent to the browser) and then we have XSS protection for the * web pages. But do not escape when it will be saved in an Excel file. This issue will be resolved * when we upgrade Spring to v4.1.2 and then we can go back to one single creator method. */ - public GBActivityGridRowDTO(Activity activity, String groupName, Long groupId) { + public GBActivityGridRowDTO(Activity activity, String groupName, Long groupId) { this(activity, groupName, groupId, true); } - public GBActivityGridRowDTO(Activity activity, String groupName, Long groupId, boolean escapeTitles) { - + public GBActivityGridRowDTO(Activity activity, String groupName, Long groupId, boolean escapeTitles) { + if (groupName != null && groupId != null) { // Need to make the id unique, so appending the group id for this row this.id = activity.getActivityId().toString() + "_" + groupId.toString(); this.groupId = groupId; // If grouped acitivty, append group name - if ( escapeTitles ) { + if (escapeTitles) { this.rowName = HtmlUtils.htmlEscape(activity.getTitle()) + " (" + groupName + ")"; } else { - this.rowName = activity.getTitle() + " (" + groupName + ")"; + this.rowName = activity.getTitle() + " (" + groupName + ")"; } } else { this.id = activity.getActivityId().toString(); - if ( escapeTitles ) { + if (escapeTitles) { this.rowName = HtmlUtils.htmlEscape(activity.getTitle()); } else { this.rowName = activity.getTitle(); } } String competenceMappingsStr = ""; - if ( activity.isToolActivity() ) { + if (activity.isToolActivity()) { ToolActivity toolActivity = (ToolActivity) activity; - //Constructs the competences for this activity. - Set competenceMappings = toolActivity.getCompetenceMappings(); - - if (competenceMappings != null) { - for (CompetenceMapping mapping : competenceMappings) { - competenceMappingsStr += mapping.getCompetence().getTitle() + ", "; - } - - // trim the last comma off - if (competenceMappingsStr.length() > 0) { - competenceMappingsStr = competenceMappingsStr.substring(0, competenceMappingsStr.lastIndexOf(",")); - } - } - - } + //Constructs the competences for this activity. + Set competenceMappings = toolActivity.getCompetenceMappings(); + + if (competenceMappings != null) { + for (CompetenceMapping mapping : competenceMappings) { + competenceMappingsStr += mapping.getCompetence().getTitle() + ", "; + } + + // trim the last comma off + if (competenceMappingsStr.length() > 0) { + competenceMappingsStr = competenceMappingsStr.substring(0, competenceMappingsStr.lastIndexOf(",")); + } + } + + } this.competences = competenceMappingsStr; } @@ -131,6 +131,7 @@ ret.add(finishDate != null ? convertDateToString(finishDate, null) : CELL_EMPTY); ret.add(feedback); ret.add(mark != null ? GradebookUtil.niceFormatting(mark) : CELL_EMPTY); + ret.add(outcomes != null ? outcomes : CELL_EMPTY); } else if (view == GBGridView.MON_ACTIVITY) { Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GradebookGridRowDTO.java =================================================================== diff -u -r87806866f673458de317c4d1c6656b3bf5a81039 -r73e57b8ca1a3ddd6cd15b00240d90b79c5de063a --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GradebookGridRowDTO.java (.../GradebookGridRowDTO.java) (revision 87806866f673458de317c4d1c6656b3bf5a81039) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GradebookGridRowDTO.java (.../GradebookGridRowDTO.java) (revision 73e57b8ca1a3ddd6cd15b00240d90b79c5de063a) @@ -55,10 +55,10 @@ // Another unit of time that represents average time taken for a corresponding task protected Long medianTimeTaken; - + // Another unit of time that represents minimum time taken for a corresponding task protected Long minTimeTaken; - + // Another unit of time that represents maximum time taken for a corresponding task protected Long maxTimeTaken; @@ -74,6 +74,8 @@ protected String status; protected String feedback; + protected String outcomes; + protected boolean displayMarkAsPercent = false; /** @@ -189,12 +191,11 @@ public void setMedianTimeTaken(Long medianTimeTaken) { this.medianTimeTaken = medianTimeTaken; } - - + public Long getMinTimeTaken() { - return minTimeTaken; + return minTimeTaken; } - + public Long getMinTimeTakenSeconds() { if (minTimeTaken != null) { return minTimeTaken / 1000; @@ -204,13 +205,13 @@ } public void setMinTimeTaken(Long minTimeTaken) { - this.minTimeTaken = minTimeTaken; + this.minTimeTaken = minTimeTaken; } public Long getMaxTimeTaken() { - return maxTimeTaken; + return maxTimeTaken; } - + public Long getMaxTimeTakenSeconds() { if (maxTimeTaken != null) { return maxTimeTaken / 1000; @@ -220,7 +221,7 @@ } public void setMaxTimeTaken(Long maxTimeTaken) { - this.maxTimeTaken = maxTimeTaken; + this.maxTimeTaken = maxTimeTaken; } public Double getAverageMark() { @@ -271,12 +272,19 @@ this.finishDate = finishDate; } + public String getOutcomes() { + return outcomes; + } + + public void setOutcomes(String outcomes) { + this.outcomes = outcomes; + } + public boolean getDisplayMarkAsPercent() { return displayMarkAsPercent; } public void setDisplayMarkAsPercent(boolean displayMarkAsPercent) { this.displayMarkAsPercent = displayMarkAsPercent; } - -} +} \ No newline at end of file Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/gradebookApplicationContext.xml =================================================================== diff -u -rfcc5eca8a605afdc9e927366827553a7862000cd -r73e57b8ca1a3ddd6cd15b00240d90b79c5de063a --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/gradebookApplicationContext.xml (.../gradebookApplicationContext.xml) (revision fcc5eca8a605afdc9e927366827553a7862000cd) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/gradebookApplicationContext.xml (.../gradebookApplicationContext.xml) (revision 73e57b8ca1a3ddd6cd15b00240d90b79c5de063a) @@ -24,6 +24,7 @@ + Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java =================================================================== diff -u -r3cff6b5be84fc9d559306f2d434ffaf92bdc8c7c -r73e57b8ca1a3ddd6cd15b00240d90b79c5de063a --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 3cff6b5be84fc9d559306f2d434ffaf92bdc8c7c) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 73e57b8ca1a3ddd6cd15b00240d90b79c5de063a) @@ -37,6 +37,9 @@ import java.util.TreeSet; import org.apache.log4j.Logger; +import org.apache.tomcat.util.json.JSONArray; +import org.apache.tomcat.util.json.JSONException; +import org.apache.tomcat.util.json.JSONObject; import org.lamsfoundation.lams.dao.IBaseDAO; import org.lamsfoundation.lams.gradebook.GradebookUserActivity; import org.lamsfoundation.lams.gradebook.GradebookUserActivityArchive; @@ -76,6 +79,11 @@ import org.lamsfoundation.lams.lesson.service.ILessonService; import org.lamsfoundation.lams.logevent.LogEvent; import org.lamsfoundation.lams.logevent.service.ILogEventService; +import org.lamsfoundation.lams.outcome.Outcome; +import org.lamsfoundation.lams.outcome.OutcomeMapping; +import org.lamsfoundation.lams.outcome.OutcomeResult; +import org.lamsfoundation.lams.outcome.OutcomeScaleItem; +import org.lamsfoundation.lams.outcome.service.IOutcomeService; import org.lamsfoundation.lams.tool.ToolOutput; import org.lamsfoundation.lams.tool.ToolOutputValue; import org.lamsfoundation.lams.tool.ToolSession; @@ -107,7 +115,6 @@ * */ public class GradebookService implements IGradebookService { - private static Logger logger = Logger.getLogger(GradebookService.class); private static final ExcelCell[] EMPTY_ROW = new ExcelCell[4]; @@ -128,9 +135,11 @@ private MessageService messageService; private ILogEventService logEventService; private static ICoreLearnerService learnerService; + private IOutcomeService outcomeService; @Override - public List getGBActivityRowsForLearner(Long lessonId, Integer userId, TimeZone userTimezone) { + public List getGBActivityRowsForLearner(Long lessonId, Integer userId, TimeZone userTimezone) + throws JSONException { GradebookService.logger.debug("Getting gradebook user data for lesson: " + lessonId + ". For user: " + userId); Lesson lesson = lessonService.getLesson(lessonId); @@ -189,6 +198,30 @@ } } + List outcomeMappings = outcomeService.getOutcomeMappings(null, activity.getToolContentId(), + null); + if (!outcomeMappings.isEmpty()) { + JSONArray outcomeMappingsJSON = new JSONArray(); + for (OutcomeMapping outcomeMapping : outcomeMappings) { + JSONObject outcomeMappingJSON = new JSONObject(); + Outcome outcome = outcomeMapping.getOutcome(); + outcomeMappingJSON.put("mappingId", outcomeMapping.getMappingId()); + outcomeMappingJSON.put("name", outcome.getName()); + outcomeMappingJSON.put("code", outcome.getCode()); + JSONArray possibleValues = new JSONArray(); + for (OutcomeScaleItem possibleValue : outcome.getScale().getItems()) { + possibleValues.put(possibleValue.getName()); + } + outcomeMappingJSON.put("possibleValues", possibleValues); + OutcomeResult result = outcomeService.getOutcomeResult(userId, outcomeMapping.getMappingId()); + if (result != null) { + outcomeMappingJSON.put("value", result.getValue()); + } + outcomeMappingsJSON.put(outcomeMappingJSON); + } + activityDTO.setOutcomes(outcomeMappingsJSON.toString()); + } + gradebookActivityDTOs.add(activityDTO); } @@ -2486,5 +2519,9 @@ public void setMessageService(MessageService messageService) { this.messageService = messageService; } + + public void setOutcomeService(IOutcomeService outcomeService) { + this.outcomeService = outcomeService; + } // ------------------------------------------------------------------------- } \ No newline at end of file Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookService.java =================================================================== diff -u -r0ed9749f00a1e1f92b989b270857d7f3c3f237cb -r73e57b8ca1a3ddd6cd15b00240d90b79c5de063a --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookService.java (.../IGradebookService.java) (revision 0ed9749f00a1e1f92b989b270857d7f3c3f237cb) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookService.java (.../IGradebookService.java) (revision 73e57b8ca1a3ddd6cd15b00240d90b79c5de063a) @@ -28,6 +28,7 @@ import java.util.List; import java.util.TimeZone; +import org.apache.tomcat.util.json.JSONException; import org.lamsfoundation.lams.gradebook.GradebookUserActivity; import org.lamsfoundation.lams.gradebook.GradebookUserLesson; import org.lamsfoundation.lams.gradebook.dto.GBLessonGridRowDTO; @@ -63,8 +64,10 @@ * @param * @param learner * @return + * @throws JSONException */ - List getGBActivityRowsForLearner(Long lessonId, Integer userId, TimeZone userTimezone); + List getGBActivityRowsForLearner(Long lessonId, Integer userId, TimeZone userTimezone) + throws JSONException; /** * Gets the GBActivityDTO list for an activity, which provides the marks for all users in an activity Index: lams_gradebook/web/gradebookMonitor.jsp =================================================================== diff -u -r294a26345c2dec685d6a5fe5aa37ab9ce1433dab -r73e57b8ca1a3ddd6cd15b00240d90b79c5de063a --- lams_gradebook/web/gradebookMonitor.jsp (.../gradebookMonitor.jsp) (revision 294a26345c2dec685d6a5fe5aa37ab9ce1433dab) +++ lams_gradebook/web/gradebookMonitor.jsp (.../gradebookMonitor.jsp) (revision 73e57b8ca1a3ddd6cd15b00240d90b79c5de063a) @@ -14,6 +14,8 @@ + + @@ -23,6 +25,7 @@ +