Index: lams_build/lib/lams/lams-gradebook.jar =================================================================== diff -u -r8daec7e047f7ea8404c6f16218b63a8e855a15b2 -ra949c337adc53b2df9207aa1de6e500281de7c20 Binary files differ Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -ra83cc751c307aa62dd4c7fa568dccfb7c51bdc60 -ra949c337adc53b2df9207aa1de6e500281de7c20 Binary files differ Index: lams_central/src/java/org/lamsfoundation/lams/authoring/authoringApplicationContext.xml =================================================================== diff -u -ra6641bf9262a01d07740a517643f8fe187ec5b1f -ra949c337adc53b2df9207aa1de6e500281de7c20 --- lams_central/src/java/org/lamsfoundation/lams/authoring/authoringApplicationContext.xml (.../authoringApplicationContext.xml) (revision a6641bf9262a01d07740a517643f8fe187ec5b1f) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/authoringApplicationContext.xml (.../authoringApplicationContext.xml) (revision a949c337adc53b2df9207aa1de6e500281de7c20) @@ -63,6 +63,7 @@ + Index: lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java =================================================================== diff -u -r463716d6023591c9c35eeb5057a16c903289029e -ra949c337adc53b2df9207aa1de6e500281de7c20 --- lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java (.../AuthoringService.java) (revision 463716d6023591c9c35eeb5057a16c903289029e) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java (.../AuthoringService.java) (revision a949c337adc53b2df9207aa1de6e500281de7c20) @@ -49,6 +49,7 @@ import org.lamsfoundation.lams.authoring.IObjectExtractor; import org.lamsfoundation.lams.authoring.ObjectExtractorException; import org.lamsfoundation.lams.dao.IBaseDAO; +import org.lamsfoundation.lams.gradebook.service.IGradebookService; import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.learningdesign.ActivityEvaluation; import org.lamsfoundation.lams.learningdesign.BranchActivityEntry; @@ -164,6 +165,8 @@ protected IWorkspaceManagementService workspaceManagementService; protected ILogEventService logEventService; + + protected IGradebookService gradebookService; protected ToolContentIDGenerator contentIDGenerator; @@ -339,6 +342,10 @@ this.monitoringService = monitoringService; } + public void setGradebookService(IGradebookService gradebookService) { + this.gradebookService = gradebookService; + } + public void setWorkspaceManagementService(IWorkspaceManagementService workspaceManagementService) { this.workspaceManagementService = workspaceManagementService; } @@ -487,7 +494,7 @@ @SuppressWarnings("unchecked") @Override - public void finishEditOnFly(Long learningDesignID, Integer userID, boolean cancelled) throws IOException { + public void finishEditOnFly(Long learningDesignID, Integer userID, boolean cancelled) throws Exception { User user = (User) baseDAO.find(User.class, userID); if (user == null) { throw new IOException("User not found, ID: " + userID); @@ -501,6 +508,7 @@ } // only the user who is editing the design may unlock it if (design.getEditOverrideUser().equals(user)) { + design.setEditOverrideLock(false); design.setEditOverrideUser(null); @@ -535,6 +543,10 @@ initialiseToolActivityForRuntime(design, lesson); learningDesignDAO.update(design); + + // if the weightings have been changed need to recalculate the marks + if ( gradebookService.isWeightedMarks(design) ) + gradebookService.recalculateTotalMarksForLesson(lesson.getLessonId()); } } } Index: lams_central/src/java/org/lamsfoundation/lams/authoring/service/IAuthoringService.java =================================================================== diff -u -r51fb2a37254f24bb2a805d4ffd54482c779f43fa -ra949c337adc53b2df9207aa1de6e500281de7c20 --- lams_central/src/java/org/lamsfoundation/lams/authoring/service/IAuthoringService.java (.../IAuthoringService.java) (revision 51fb2a37254f24bb2a805d4ffd54482c779f43fa) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/service/IAuthoringService.java (.../IAuthoringService.java) (revision a949c337adc53b2df9207aa1de6e500281de7c20) @@ -237,8 +237,9 @@ * @param cancelled * flag specifying whether user cancelled or saved the edit * @throws IOException + * @throws Exception */ - void finishEditOnFly(Long learningDesignID, Integer userID, boolean cancelled) throws IOException; + void finishEditOnFly(Long learningDesignID, Integer userID, boolean cancelled) throws Exception; /** Get the message service, which gives access to the I18N text */ MessageService getMessageService(); Index: lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringAction.java =================================================================== diff -u -rde9985942f0437346c5782b730270b1f65e6b9e6 -ra949c337adc53b2df9207aa1de6e500281de7c20 --- lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringAction.java (.../AuthoringAction.java) (revision de9985942f0437346c5782b730270b1f65e6b9e6) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringAction.java (.../AuthoringAction.java) (revision a949c337adc53b2df9207aa1de6e500281de7c20) @@ -212,7 +212,14 @@ Long learningDesignID = WebUtil.readLongParam(request, "learningDesignID", false); boolean cancelled = WebUtil.readBooleanParam(request, "cancelled", false); - authoringService.finishEditOnFly(learningDesignID, getUserId(), cancelled); + try { + authoringService.finishEditOnFly(learningDesignID, getUserId(), cancelled); + } catch (Exception e) { + String errorMsg = "Error occured ending EditOnFly" + e.getMessage()+" learning design id "+learningDesignID; + log.error(errorMsg, e); + throw new IOException(e); + } + return null; } Index: lams_common/src/java/org/lamsfoundation/lams/gradebook/dao/IGradebookDAO.java =================================================================== diff -u -r7933051bd1404465e4224cb06b025568de188fcd -ra949c337adc53b2df9207aa1de6e500281de7c20 --- lams_common/src/java/org/lamsfoundation/lams/gradebook/dao/IGradebookDAO.java (.../IGradebookDAO.java) (revision 7933051bd1404465e4224cb06b025568de188fcd) +++ lams_common/src/java/org/lamsfoundation/lams/gradebook/dao/IGradebookDAO.java (.../IGradebookDAO.java) (revision a949c337adc53b2df9207aa1de6e500281de7c20) @@ -39,7 +39,9 @@ GradebookUserActivity getGradebookUserDataForActivity(Long activityID, Integer userID); - Double getGradebookUserActivityMarkSum(Long lessonID, Integer userID); + List getGradebookUserActivitiesForLesson(Long lessonID, Integer userID); + +// Double getGradebookUserActivityMarkSum(Long lessonID, Integer userID); List getAllGradebookUserActivitiesForActivity(Long activityID); Index: lams_common/src/java/org/lamsfoundation/lams/gradebook/dao/hibernate/GradebookDAO.java =================================================================== diff -u -r7933051bd1404465e4224cb06b025568de188fcd -ra949c337adc53b2df9207aa1de6e500281de7c20 --- lams_common/src/java/org/lamsfoundation/lams/gradebook/dao/hibernate/GradebookDAO.java (.../GradebookDAO.java) (revision 7933051bd1404465e4224cb06b025568de188fcd) +++ lams_common/src/java/org/lamsfoundation/lams/gradebook/dao/hibernate/GradebookDAO.java (.../GradebookDAO.java) (revision a949c337adc53b2df9207aa1de6e500281de7c20) @@ -48,9 +48,12 @@ private static final String GET_GRADEBOOK_USER_LESSONS = "from GradebookUserLesson gles where " + "gles.lesson.lessonId=:lessonID"; - private static final String GET_GRADEBOOK_ACTIVITIES_FROM_LESSON_SUM = "select sum(gact.mark) from GradebookUserActivity gact where " + private static final String GET_GRADEBOOK_ACTIVITIES_FROM_LESSON = "from GradebookUserActivity gact where " + "gact.learner=:userID and gact.activity in (select distinct tses.toolActivity from ToolSession tses where tses.lesson=:lessonID)"; +// private static final String GET_GRADEBOOK_ACTIVITIES_FROM_LESSON_SUM = "select sum(gact.mark) from GradebookUserActivity gact where " +// + "gact.learner=:userID and gact.activity in (select distinct tses.toolActivity from ToolSession tses where tses.lesson=:lessonID)"; + private static final String GET_GRADEBOOK_USER_ACTIVITIES_FOR_ACTIVITY = "FROM GradebookUserActivity gact where " + "gact.activity.activityId=:activityID"; @@ -107,19 +110,27 @@ @Override @SuppressWarnings("unchecked") - public Double getGradebookUserActivityMarkSum(Long lessonID, Integer userID) { - List result = getSessionFactory().getCurrentSession().createQuery(GET_GRADEBOOK_ACTIVITIES_FROM_LESSON_SUM) + public List getGradebookUserActivitiesForLesson(Long lessonID, Integer userID) { + List result = getSessionFactory().getCurrentSession().createQuery(GET_GRADEBOOK_ACTIVITIES_FROM_LESSON) .setInteger("userID", userID.intValue()).setLong("lessonID", lessonID.longValue()).list(); - - if (result != null) { - if (result.size() > 0) { - return (Double) result.get(0); - } - } - - return 0.0; + return result; } +// @Override +// @SuppressWarnings("unchecked") +// public Double getGradebookUserActivityMarkSum(Long lessonID, Integer userID) { +// List result = getSessionFactory().getCurrentSession().createQuery(GET_GRADEBOOK_ACTIVITIES_FROM_LESSON_SUM) +// .setInteger("userID", userID.intValue()).setLong("lessonID", lessonID.longValue()).list(); +// +// if (result != null) { +// if (result.size() > 0) { +// return (Double) result.get(0); +// } +// } +// +// return 0.0; +// } + @Override @SuppressWarnings("unchecked") public List getAllGradebookUserActivitiesForActivity(Long activityID) { Index: lams_gradebook/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r271d374f37c513e19ec64591efa9df228923ef09 -ra949c337adc53b2df9207aa1de6e500281de7c20 --- lams_gradebook/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 271d374f37c513e19ec64591efa9df228923ef09) +++ lams_gradebook/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision a949c337adc53b2df9207aa1de6e500281de7c20) @@ -109,5 +109,8 @@ label.show.marks.chart =Show marks chart label.hide.marks.chart =Hide marks chart - +label.button.show.weights =Show Weights +label.button.hide.weights =Hide Weights +label.weights.title =Weights on activity outputs + #======= End labels: Exported 102 labels for en AU ===== Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBLessonGridRowDTO.java =================================================================== diff -u -r15e70deb1c79e4c3098eb11b84287bb31c8f64c9 -ra949c337adc53b2df9207aa1de6e500281de7c20 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBLessonGridRowDTO.java (.../GBLessonGridRowDTO.java) (revision 15e70deb1c79e4c3098eb11b84287bb31c8f64c9) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBLessonGridRowDTO.java (.../GBLessonGridRowDTO.java) (revision a949c337adc53b2df9207aa1de6e500281de7c20) @@ -66,7 +66,7 @@ ret.add(startDate != null ? convertDateToString(startDate, null) : CELL_EMPTY); ret.add((medianTimeTaken != null && medianTimeTaken != 0) ? convertTimeToString(medianTimeTaken) : CELL_EMPTY); - ret.add((averageMark != null) ? GradebookUtil.niceFormatting(averageMark) : CELL_EMPTY); + ret.add((averageMark != null) ? GradebookUtil.niceFormatting(averageMark, displayMarkAsPercent) : CELL_EMPTY); } else if ((view == GBGridView.LRN_COURSE) || (view == GBGridView.MON_USER)) { if (gradebookLearnerURL != null && gradebookLearnerURL.length() != 0) { @@ -83,8 +83,8 @@ ret.add((medianTimeTaken != null && medianTimeTaken != 0) ? toItalic(convertTimeToString(medianTimeTaken)) : CELL_EMPTY); ret.add((timeTaken != null) ? convertTimeToString(timeTaken) : CELL_EMPTY); - ret.add((averageMark != null) ? toItalic(GradebookUtil.niceFormatting(averageMark)) : CELL_EMPTY); - ret.add((mark != null) ? GradebookUtil.niceFormatting(mark) : CELL_EMPTY); + ret.add((averageMark != null) ? toItalic(GradebookUtil.niceFormatting(averageMark, displayMarkAsPercent)) : CELL_EMPTY); + ret.add((mark != null) ? GradebookUtil.niceFormatting(mark, displayMarkAsPercent) : CELL_EMPTY); //plain lesson list case } else if (view == GBGridView.LIST) { Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBUserGridRowDTO.java =================================================================== diff -u -r15e70deb1c79e4c3098eb11b84287bb31c8f64c9 -ra949c337adc53b2df9207aa1de6e500281de7c20 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBUserGridRowDTO.java (.../GBUserGridRowDTO.java) (revision 15e70deb1c79e4c3098eb11b84287bb31c8f64c9) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GBUserGridRowDTO.java (.../GBUserGridRowDTO.java) (revision a949c337adc53b2df9207aa1de6e500281de7c20) @@ -68,7 +68,7 @@ ret.add(startDate != null ? convertDateToString(startDate, null) : CELL_EMPTY); ret.add(finishDate != null ? convertDateToString(finishDate, null) : CELL_EMPTY); ret.add(feedback); - ret.add((mark != null) ? GradebookUtil.niceFormatting(mark) : CELL_EMPTY); + ret.add((mark != null) ? GradebookUtil.niceFormatting(mark, displayMarkAsPercent) : CELL_EMPTY); } else if (view == GBGridView.MON_ACTIVITY) { @@ -93,7 +93,7 @@ ret.add(startDate != null ? convertDateToString(startDate, null) : CELL_EMPTY); ret.add(finishDate != null ? convertDateToString(finishDate, null) : CELL_EMPTY); ret.add(feedback); - ret.add((mark != null) ? GradebookUtil.niceFormatting(mark) : CELL_EMPTY); + ret.add((mark != null) ? GradebookUtil.niceFormatting(mark, displayMarkAsPercent) : CELL_EMPTY); } else if (view == GBGridView.LIST) { ret.add(rowName); Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GradebookGridRowDTO.java =================================================================== diff -u -r15e70deb1c79e4c3098eb11b84287bb31c8f64c9 -ra949c337adc53b2df9207aa1de6e500281de7c20 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GradebookGridRowDTO.java (.../GradebookGridRowDTO.java) (revision 15e70deb1c79e4c3098eb11b84287bb31c8f64c9) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/dto/GradebookGridRowDTO.java (.../GradebookGridRowDTO.java) (revision a949c337adc53b2df9207aa1de6e500281de7c20) @@ -69,6 +69,9 @@ protected String status; protected String feedback; + + protected boolean displayMarkAsPercent = false; + /** * A shared function to convert milliseconds into a readable string @@ -264,5 +267,13 @@ this.finishDate = finishDate; } + public boolean getDisplayMarkAsPercent() { + return displayMarkAsPercent; + } + public void setDisplayMarkAsPercent(boolean displayMarkAsPercent) { + this.displayMarkAsPercent = displayMarkAsPercent; + } + + } Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java =================================================================== diff -u -r463716d6023591c9c35eeb5057a16c903289029e -ra949c337adc53b2df9207aa1de6e500281de7c20 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 463716d6023591c9c35eeb5057a16c903289029e) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision a949c337adc53b2df9207aa1de6e500281de7c20) @@ -51,6 +51,7 @@ import org.lamsfoundation.lams.gradebook.dto.GradebookGridRowDTO; import org.lamsfoundation.lams.gradebook.util.GBGridView; import org.lamsfoundation.lams.gradebook.util.GradebookConstants; +import org.lamsfoundation.lams.gradebook.util.GradebookUtil; import org.lamsfoundation.lams.gradebook.util.LessonComparator; import org.lamsfoundation.lams.gradebook.util.UserComparator; import org.lamsfoundation.lams.learning.service.ICoreLearnerService; @@ -61,6 +62,8 @@ import org.lamsfoundation.lams.learningdesign.FloatingActivity; import org.lamsfoundation.lams.learningdesign.Group; import org.lamsfoundation.lams.learningdesign.Grouping; +import org.lamsfoundation.lams.learningdesign.GroupingActivity; +import org.lamsfoundation.lams.learningdesign.LearningDesign; import org.lamsfoundation.lams.learningdesign.OptionsActivity; import org.lamsfoundation.lams.learningdesign.ParallelActivity; import org.lamsfoundation.lams.learningdesign.SequenceActivity; @@ -327,6 +330,8 @@ userToGradebookUserLessonMap = getUserToGradebookUserLessonMap(lesson, learners); } + boolean isWeighted = isWeightedMarks(lesson.getLearningDesign()); + for (User learner : learners) { LearnerProgress learnerProgress = userToLearnerProgressMap.get(learner.getUserId()); GBUserGridRowDTO gradebookUserDTO = new GBUserGridRowDTO(learner); @@ -369,6 +374,7 @@ if (gradebookUserLesson != null) { gradebookUserDTO.setMark(gradebookUserLesson.getMark()); gradebookUserDTO.setFeedback(gradebookUserLesson.getFeedback()); + gradebookUserDTO.setDisplayMarkAsPercent(isWeighted); } } @@ -481,7 +487,9 @@ Integer userId = user.getUserId(); GradebookUserLesson gradebookUserLesson = userToGradebookUserLessonMap.get(userId); - Double totalMark = gradebookDAO.getGradebookUserActivityMarkSum(lessonId, userId); + List userActivities = gradebookDAO.getGradebookUserActivitiesForLesson(lessonId, userId); + Double totalMark = calculateLessonMark(isWeightedMarks(lesson.getLearningDesign()), userActivities, null); + if (totalMark != null) { if (totalMark > 0 && gradebookUserLesson == null) { @@ -596,6 +604,40 @@ gradebookUserActivity, gradebookUserLesson); } + public boolean isWeightedMarks(LearningDesign design) { + Set activities = (Set) design.getActivities(); + for ( Activity activity : activities) { + if ( activity.isToolActivity() ) { + // fetch real object, otherwise there is a cast error + ToolActivity act = (ToolActivity) activityDAO.getActivityByActivityId(activity.getActivityId()); + ActivityEvaluation eval = act.getEvaluation(); + if ( eval != null && eval.getWeight() != null && eval.getWeight() > 0) + return true; + } + } + return false; + } + + public List getWeights(LearningDesign design) { + List evaluations = new ArrayList(); + Set activities = (Set) design.getActivities(); + for ( Activity activity : activities) { + if ( activity.isToolActivity() ) { + // fetch real object, otherwise there is a cast error + ToolActivity act = (ToolActivity) activityDAO.getActivityByActivityId(activity.getActivityId()); + ActivityEvaluation eval = act.getEvaluation(); + if ( eval != null && eval.getWeight() != null && eval.getWeight() > 0) { + String[] evaluation = new String[3]; + evaluation[0] = act.getTitle(); + evaluation[1] = eval.getToolOutputDefinition(); + evaluation[2] = eval.getWeight().toString() + '%'; + evaluations.add(evaluation); + } + } + } + return evaluations; + } + /** * It's the same method as above, it only also accepts gradebookUserActivity and gradebookUserLesson as parameters. */ @@ -626,7 +668,8 @@ gradebookUserLesson.setLesson(lesson); } - aggregateTotalMarkForLesson(gradebookUserLesson, mark, oldActivityMark); + aggregateTotalMarkForLesson(isWeightedMarks(lesson.getLearningDesign()), + gradebookUserLesson, gradebookUserActivity, oldActivityMark); // audit log changed gradebook mark if (isAuditLogRequired) { @@ -716,6 +759,7 @@ lessonRows.add(lessonRow); lessonRow.setLessonName(lesson.getLessonName()); lessonRow.setId(lesson.getLessonId().toString()); + lessonRow.setDisplayMarkAsPercent(isWeightedMarks(lesson.getLearningDesign())); if (view == GBGridView.LIST) { continue; @@ -880,6 +924,8 @@ @SuppressWarnings("unchecked") public LinkedHashMap exportLessonGradebook(Lesson lesson) { + boolean isWeighted = isWeightedMarks(lesson.getLearningDesign()); + LinkedHashMap dataToExport = new LinkedHashMap(); // -------------------- process summary excel page -------------------------------- @@ -888,9 +934,13 @@ List rowList = new LinkedList(); // Adding the lesson average data to the summary + Object lessonAverageMarkValue = getAverageMarkForLesson(lesson.getLessonId()); + if ( isWeighted ) + lessonAverageMarkValue = GradebookUtil.niceFormatting((Double)lessonAverageMarkValue, true); + ExcelCell[] lessonAverageMark = new ExcelCell[2]; lessonAverageMark[0] = new ExcelCell(getMessage("gradebook.export.average.lesson.mark"), true); - lessonAverageMark[1] = new ExcelCell(getAverageMarkForLesson(lesson.getLessonId()), false); + lessonAverageMark[1] = new ExcelCell(lessonAverageMarkValue, false); rowList.add(lessonAverageMark); ExcelCell[] lessonMedianTimeTaken = new ExcelCell[2]; @@ -947,13 +997,17 @@ for (GBUserGridRowDTO userRow : userRows) { // Adding the user data for the lesson + Object userMarkValue = userRow.getMark(); + if ( userMarkValue != null && isWeighted ) + userMarkValue = GradebookUtil.niceFormatting((Double)userMarkValue, true); + ExcelCell[] userDataRow = new ExcelCell[6]; userDataRow[0] = new ExcelCell(userRow.getLastName(), false); userDataRow[1] = new ExcelCell(userRow.getFirstName(), false); userDataRow[2] = new ExcelCell(userRow.getLogin(), false); userDataRow[3] = new ExcelCell(getProgressMessage(userRow), false); userDataRow[4] = new ExcelCell(userRow.getTimeTakenSeconds(), false); - userDataRow[5] = new ExcelCell(userRow.getMark(), false); + userDataRow[5] = new ExcelCell(userMarkValue, false); rowList.add(userDataRow); } @@ -1696,21 +1750,64 @@ * * @param gradebookUserLesson */ - private void aggregateTotalMarkForLesson(GradebookUserLesson gradebookUserLesson, Double newActivityMark, + private void aggregateTotalMarkForLesson(boolean useWeightings, GradebookUserLesson gradebookUserLesson, GradebookUserActivity markedActivity, Double oldActivityMark) { - newActivityMark = newActivityMark == null ? 0 : newActivityMark; + + List userActivities = gradebookDAO.getGradebookUserActivitiesForLesson(gradebookUserLesson.getLesson().getLessonId(), + gradebookUserLesson.getLearner().getUserId()); Double totalMark; - if (oldActivityMark == null || gradebookUserLesson.getMark() == null) { - totalMark = gradebookDAO.getGradebookUserActivityMarkSum(gradebookUserLesson.getLesson().getLessonId(), - gradebookUserLesson.getLearner().getUserId()); + if (oldActivityMark == null || gradebookUserLesson.getMark() == null || useWeightings) { + totalMark = calculateLessonMark(useWeightings, userActivities, markedActivity); } else { - totalMark = gradebookUserLesson.getMark() - oldActivityMark + newActivityMark; + totalMark = gradebookUserLesson.getMark() - oldActivityMark; + if ( markedActivity.getMark() != null ) + totalMark += markedActivity.getMark(); } gradebookUserLesson.setMark(totalMark); gradebookDAO.insertOrUpdate(gradebookUserLesson); } + + private Double calculateLessonMark(boolean useWeightings, List userActivities, + GradebookUserActivity markedActivity) { + + Double totalMark = markedActivity != null ? getWeightedMark(useWeightings, markedActivity) : 0.0; + + for ( GradebookUserActivity guact : userActivities ) { + if ( markedActivity == null || guact.getUid() != markedActivity.getUid() ) { + if ( useWeightings ) { + totalMark = totalMark + getWeightedMark(useWeightings, guact); + } else { + totalMark = totalMark + guact.getMark(); + } + } + } + return totalMark; + } + + private Double getWeightedMark( boolean useWeightings, GradebookUserActivity guact) { + Double rawMark = ( guact.getMark() != null ? guact.getMark() : 0.0); + if ( useWeightings ) { + ToolActivity activity = guact.getActivity(); + ActivityEvaluation eval = activity.getEvaluation(); + Long maxMark = toolService.getActivityMaxPossibleMark(activity); + if ( maxMark == null ) { + logger.error(new StringBuilder("Unable to correctly calculate weighted mark as no maximum mark is known for activity \"") + .append(activity.getTitle()) + .append("\" (") + .append(activity.getActivityId()) + .append("). This activity will be skipped.") + .toString()); + return 0.0; + } + if ( maxMark == 0 ) { + return 0.0; + } + return rawMark / maxMark * eval.getWeight(); + } + return rawMark; + } /** * Gets the GBActivityGridRowDTO fro a given activity and lesson Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookService.java =================================================================== diff -u -r2fc9dd8b82fc3c3a2363cbc13e60eaba86e6a476 -ra949c337adc53b2df9207aa1de6e500281de7c20 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookService.java (.../IGradebookService.java) (revision 2fc9dd8b82fc3c3a2363cbc13e60eaba86e6a476) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookService.java (.../IGradebookService.java) (revision a949c337adc53b2df9207aa1de6e500281de7c20) @@ -34,6 +34,7 @@ import org.lamsfoundation.lams.gradebook.dto.GradebookGridRowDTO; import org.lamsfoundation.lams.gradebook.util.GBGridView; import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.LearningDesign; import org.lamsfoundation.lams.learningdesign.ToolActivity; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.usermanagement.Organisation; @@ -318,5 +319,10 @@ */ List getMarksArray(Long lessonId); + /** Will the marks caculation take into account weighting? */ + boolean isWeightedMarks(LearningDesign design); + + /** Get a summary of the weightings */ + List getWeights(LearningDesign design); } \ No newline at end of file Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/util/GradebookUtil.java =================================================================== diff -u -r506e82d55455419723f11c0a8f99270b39f04055 -ra949c337adc53b2df9207aa1de6e500281de7c20 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/util/GradebookUtil.java (.../GradebookUtil.java) (revision 506e82d55455419723f11c0a8f99270b39f04055) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/util/GradebookUtil.java (.../GradebookUtil.java) (revision a949c337adc53b2df9207aa1de6e500281de7c20) @@ -172,6 +172,15 @@ } + public static String niceFormatting(Double mark, boolean displayAsPercentage) { + + String markStr = new DecimalFormat("##0.00").format(mark); + if ( displayAsPercentage ) + markStr += "%"; + return markStr; + + } + private static Document getDocument() throws ParserConfigurationException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/action/GradebookMonitoringAction.java =================================================================== diff -u -r2fc9dd8b82fc3c3a2363cbc13e60eaba86e6a476 -ra949c337adc53b2df9207aa1de6e500281de7c20 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/action/GradebookMonitoringAction.java (.../GradebookMonitoringAction.java) (revision 2fc9dd8b82fc3c3a2363cbc13e60eaba86e6a476) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/action/GradebookMonitoringAction.java (.../GradebookMonitoringAction.java) (revision a949c337adc53b2df9207aa1de6e500281de7c20) @@ -105,6 +105,11 @@ request.setAttribute("lessonDetails", lessonDetatilsDTO); request.setAttribute("marksReleased", marksReleased); + List weights = getGradebookService().getWeights(lesson.getLearningDesign()); + if ( weights.size() > 0 ) { + request.setAttribute("weights", weights); + } + request.setAttribute("isInTabs", WebUtil.readBooleanParam(request, "isInTabs", false)); return mapping.findForward("monitorgradebook"); @@ -213,18 +218,11 @@ // Fetch the id based on which grid it came from if (view == GBGridView.MON_ACTIVITY) { String rowID = WebUtil.readStrParam(request, AttributeNames.PARAM_ACTIVITY_ID); - - // Splitting the rowID param to get the activity/group id pair - String[] split = rowID.split("_"); - if (split.length == 2) { - activityID = Long.parseLong(split[0]); - } else { - activityID = Long.parseLong(rowID); - } - + activityID = getActivityFromParameter(rowID); userID = WebUtil.readIntParam(request, GradebookConstants.PARAM_ID); } else if (view == GBGridView.MON_USER) { - activityID = WebUtil.readLongParam(request, GradebookConstants.PARAM_ID); + String rowID = WebUtil.readStrParam(request, GradebookConstants.PARAM_ID); + activityID = getActivityFromParameter(rowID); userID = WebUtil.readIntParam(request, GradebookConstants.PARAM_USERID); } @@ -259,6 +257,18 @@ return null; } + private Long getActivityFromParameter(String rowID) { + Long activityID; + // Splitting the rowID param to get the activity/group id pair + String[] split = rowID.split("_"); + if (split.length == 2) { + activityID = Long.parseLong(split[0]); + } else { + activityID = Long.parseLong(rowID); + } + return activityID; + } + /** * Toggles the release mark flag for a lesson * Index: lams_gradebook/web/gradebookMonitor.jsp =================================================================== diff -u -r4583983b64efe1d91fbb47cdde6a759a6a30e859 -ra949c337adc53b2df9207aa1de6e500281de7c20 --- lams_gradebook/web/gradebookMonitor.jsp (.../gradebookMonitor.jsp) (revision 4583983b64efe1d91fbb47cdde6a759a6a30e859) +++ lams_gradebook/web/gradebookMonitor.jsp (.../gradebookMonitor.jsp) (revision a949c337adc53b2df9207aa1de6e500281de7c20) @@ -6,6 +6,8 @@ <%@ taglib uri="tags-fmt" prefix="fmt"%> <%@ taglib uri="tags-core" prefix="c"%> +${not empty weights} + @@ -56,7 +58,22 @@ $("#markChartShown").css("display", "none"); $("#markChartHidden").css("display", "inline"); } - + + + function toggleWeight() { + if ( $("#weights").css("display") == "none" ) { + $("#weights").css("display","block"); + $("#weightShown").css("display","inline"); + $("#weightHidden").css("display","none"); + } else { + $("#weights").css("display","none"); + $("#weightShown").css("display","none"); + $("#weightHidden").css("display","inline"); + } + } + + + function toggleRelease() { var conf; @@ -501,6 +518,7 @@ setTimeout(function(){ window.dispatchEvent(new Event('resize')); }, 300); }); + @@ -574,6 +592,27 @@ + + + + + + + + + + + + + + + + + + + + + <%-- replacement for Page type admin --%> @@ -592,6 +631,7 @@ ${chartButtonCode} + ${weightButtonCode} ${tourDatesCode} @@ -642,6 +682,7 @@ ${chartButtonCode} + ${weightButtonCode} ${tourDatesCode} @@ -653,7 +694,28 @@ - + + + + + + + + + <%-- Display weights in four columns --%> + + + + + + ${weightArray[0]}: ${weightArray[2]} + + <%-- close off row started in the loop --%> + + + + +