Index: lams_admin/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -rc237005f7628b877893619745e0c166202caba89 -r54a14306d3b36e6da9aedbaa6700c91048ebc53a --- lams_admin/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision c237005f7628b877893619745e0c166202caba89) +++ lams_admin/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 54a14306d3b36e6da9aedbaa6700c91048ebc53a) @@ -635,6 +635,10 @@ sysadmin.lesson.allow.restart =Learners can restart the lesson sysadmin.lesson.default =Lesson default settings config.enable.portrait.editing =Enable profile portrait editing +admin.outcome.title =Outcomes management +outcome.authoring.title =Learning outcomes +outcome.authoring.input =Search and select by outcome name or code +outcome.authoring.existing =Added outcomes +outcome.authoring.existing.none =none - #======= End labels: Exported 629 labels for en AU ===== Index: lams_central/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r1e612192adc45476d007a3254ee9d1903158c064 -r54a14306d3b36e6da9aedbaa6700c91048ebc53a --- lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 1e612192adc45476d007a3254ee9d1903158c064) +++ lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 54a14306d3b36e6da9aedbaa6700c91048ebc53a) @@ -793,6 +793,7 @@ register.email.verify =A confirmation email will be sent before you are able to log in. signup.email.verify.sent =A confirmation email has been sent to {0}
Check your email and follow the instructions. + #====== Templates authoring.msg.close.cancel.save=Do you want to close this window without saving? authoring.msg.list.cancel.save=Do you want to return to the template list without saving? @@ -839,12 +840,53 @@ authoring.error.application.exercise.not.blank.and.grade=Application Exercise {0} may not be blank and must have a grade. authoring.label.grade=Grade authoring.label.none=None +index.outcome.manage =Outcomes +index.outcome.manage.tooltip =Manage learning outcomes and scales +outcome.manage.title =Course outcomes +outcome.manage.remove =Remove outcome +outcome.manage.remove.confirm =Are you sure you want to remove this outcome? +outcome.manage.add =Add outcome +outcome.manage.edit =Edit outcome +outcome.manage.view =View outcome +outcome.manage.add.name =Name +outcome.manage.add.code =Code +outcome.manage.add.description =Description +outcome.manage.add.global =Global +outcome.manage.add.scale =Scale +outcome.manage.add.save =Save +outcome.manage.scope =Scope +outcome.manage.scope.global =global +outcome.manage.scope.course =course +outcome.manage.add.error =Error while saving an outcome +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 +scale.title =Scales +scale.manage =Manage scales +scale.manage.add =Add scale +scale.manage.edit =Edit scale +scale.manage.view =View scale +scale.manage.title =Course scales +scale.manage.remove =Remove scale +scale.manage.remove.scale =Error while removing a scale. It is probably used in some outcomes. +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. +scale.manage.add.value.error.blank =A value must not be blank +scale.manage.add.error =Error while saving an outcome scale +outcome.authoring.title =Learning outcomes +outcome.authoring.input =Search and select by outcome name or code +outcome.authoring.existing =Added outcomes +outcome.authoring.existing.none =none +outcome.export.date =Exported on: +outcome.export =Export +outcome.import =Import +outcome.import.error =Error while importing outcomes or scales. Check logs. authoring.enable.confidence.levels=Enable confidence levels #=================== Specific to Team Based Learning (TBL) =========================# authoring.tbl.template.title=Team Based Learning authoring.tbl.template.description=Individual and Team Readiness Assessments followed by Application Exercises. authoring.tbl.desc.question=These questions are for iRA and tRA. Click "Create Question" to add more questions. Turn on "Enable confidence levels" to have the learners' confidence levels from the iRA shown on the tRA screen. authoring.tbl.desc.ae=State the questions for AE. Click "Create Question" to add more questions. - #======= End labels: Exported 786 labels for en AU ===== Index: lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java =================================================================== diff -u -rddb049f146b313155b63bfd2459132df4d57a452 -r54a14306d3b36e6da9aedbaa6700c91048ebc53a --- lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java (.../AuthoringService.java) (revision ddb049f146b313155b63bfd2459132df4d57a452) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java (.../AuthoringService.java) (revision 54a14306d3b36e6da9aedbaa6700c91048ebc53a) @@ -78,7 +78,6 @@ import org.lamsfoundation.lams.learningdesign.dao.ILearningLibraryDAO; import org.lamsfoundation.lams.learningdesign.dao.ILicenseDAO; import org.lamsfoundation.lams.learningdesign.dao.ITransitionDAO; -import org.lamsfoundation.lams.learningdesign.dto.AuthoringActivityDTO; import org.lamsfoundation.lams.learningdesign.dto.ValidationErrorDTO; import org.lamsfoundation.lams.learningdesign.exception.LearningDesignException; import org.lamsfoundation.lams.learningdesign.service.ILearningDesignService; @@ -89,6 +88,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.tool.SystemTool; import org.lamsfoundation.lams.tool.Tool; import org.lamsfoundation.lams.tool.ToolContentIDGenerator; @@ -165,6 +165,8 @@ protected IGradebookService gradebookService; + protected IOutcomeService outcomeService; + protected ToolContentIDGenerator contentIDGenerator; /** The bean factory is used to create ObjectExtractor objects */ @@ -305,6 +307,10 @@ this.logEventService = logEventService; } + public void setOutcomeService(IOutcomeService outcomeService) { + this.outcomeService = outcomeService; + } + /** * @param contentIDGenerator * The contentIDGenerator to set. @@ -345,7 +351,8 @@ } /** - * @see org.lamsfoundation.lams.authoring.service.IAuthoringFullService#getToolOutputDefinitions(java.lang.Long, int) + * @see org.lamsfoundation.lams.authoring.service.IAuthoringFullService#getToolOutputDefinitions(java.lang.Long, + * int) */ @Override public List getToolOutputDefinitions(Long toolContentID, int definitionType) { @@ -392,16 +399,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); @@ -869,11 +877,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 @@ -1382,7 +1390,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; } /** @@ -1580,7 +1590,7 @@ access.setAccessDate(new Date()); learningDesignDAO.insertOrUpdate(access); } - + @Override public FolderContentDTO getUserWorkspaceFolder(Integer userID) throws IOException { return workspaceManagementService.getUserWorkspaceFolder(userID); Index: lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupAction.java =================================================================== diff -u -rcad6ecebe29a61651bdf8c7500a6a17471c65970 -r54a14306d3b36e6da9aedbaa6700c91048ebc53a --- lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupAction.java (.../DisplayGroupAction.java) (revision cad6ecebe29a61651bdf8c7500a6a17471c65970) +++ lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupAction.java (.../DisplayGroupAction.java) (revision 54a14306d3b36e6da9aedbaa6700c91048ebc53a) @@ -214,6 +214,12 @@ } } + if (roles.contains(Role.ROLE_AUTHOR) && orgBean.getType().equals(OrganisationType.COURSE_TYPE)) { + moreLinks.add( + new IndexLinkBean("index.outcome.manage", "javascript:showOutcomeDialog(" + organisationId + ")", + "fa fa-fw fa-check-circle-o", "index.outcome.manage.tooltip")); + } + if (Configuration.getAsBoolean(ConfigurationKeys.ALLOW_KUMALIVE) && org.getEnableKumalive() && (roles.contains(Role.ROLE_GROUP_MANAGER) || roles.contains(Role.ROLE_MONITOR) || roles.contains(Role.ROLE_LEARNER))) { Index: lams_central/web/WEB-INF/struts-config.xml =================================================================== diff -u -r5caa0c70153ab564c5d8e347c4af4baf53b01fd0 -r54a14306d3b36e6da9aedbaa6700c91048ebc53a --- lams_central/web/WEB-INF/struts-config.xml (.../struts-config.xml) (revision 5caa0c70153ab564c5d8e347c4af4baf53b01fd0) +++ lams_central/web/WEB-INF/struts-config.xml (.../struts-config.xml) (revision 54a14306d3b36e6da9aedbaa6700c91048ebc53a) @@ -33,7 +33,14 @@ name="uploadForm" type="org.lamsfoundation.lams.monitoring.web.FileUploadForm" /> - + + @@ -788,9 +795,30 @@ > + + + + + - - + + + + Index: lams_central/web/main.jsp =================================================================== diff -u -rd961ba28b63782744357d367fddb26ecc5701a1e -r54a14306d3b36e6da9aedbaa6700c91048ebc53a --- lams_central/web/main.jsp (.../main.jsp) (revision d961ba28b63782744357d367fddb26ecc5701a1e) +++ lams_central/web/main.jsp (.../main.jsp) (revision 54a14306d3b36e6da9aedbaa6700c91048ebc53a) @@ -94,6 +94,10 @@ MARK_ORG_FAVORITE : '', KUMALIVE_TITLE : '', + + OUTCOME_MANAGE_TITLE : '', + + OUTCOME_COURSE_MANAGE_TITLE : '' }, activeOrgId = null${activeOrgId}; Index: lams_common/src/java/org/lamsfoundation/lams/commonContext.xml =================================================================== diff -u -r8247b17119f9b3d3c9258069313ed2510a5f0650 -r54a14306d3b36e6da9aedbaa6700c91048ebc53a --- lams_common/src/java/org/lamsfoundation/lams/commonContext.xml (.../commonContext.xml) (revision 8247b17119f9b3d3c9258069313ed2510a5f0650) +++ lams_common/src/java/org/lamsfoundation/lams/commonContext.xml (.../commonContext.xml) (revision 54a14306d3b36e6da9aedbaa6700c91048ebc53a) @@ -493,6 +493,28 @@ + + + + + + + + + + + true + + + + + + + + PROPAGATION_REQUIRED + + + @@ -627,11 +649,16 @@ - + + + + + + + Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java =================================================================== diff -u -r468d69b9c1d4817c71e5449ce78f919ea9aa6234 -r54a14306d3b36e6da9aedbaa6700c91048ebc53a --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 468d69b9c1d4817c71e5449ce78f919ea9aa6234) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 54a14306d3b36e6da9aedbaa6700c91048ebc53a) @@ -42,21 +42,19 @@ 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; import org.lamsfoundation.lams.gradebook.GradebookUserLesson; -import org.lamsfoundation.lams.gradebook.GradebookUserLessonArchive; import org.lamsfoundation.lams.gradebook.dao.IGradebookDAO; import org.lamsfoundation.lams.gradebook.dto.GBActivityArchiveGridRowDTO; import org.lamsfoundation.lams.gradebook.dto.GBActivityGridRowDTO; import org.lamsfoundation.lams.gradebook.dto.GBLessonGridRowDTO; import org.lamsfoundation.lams.gradebook.dto.GBUserGridRowDTO; import org.lamsfoundation.lams.gradebook.dto.GradebookGridRowDTO; +import org.lamsfoundation.lams.gradebook.model.GradebookUserActivityArchive; +import org.lamsfoundation.lams.gradebook.model.GradebookUserLessonArchive; import org.lamsfoundation.lams.gradebook.util.GBGridView; 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; -import org.lamsfoundation.lams.learning.web.bean.ActivityURL; +import org.lamsfoundation.lams.learning.service.ILearnerService; import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.learningdesign.ActivityEvaluation; import org.lamsfoundation.lams.learningdesign.ComplexActivity; @@ -69,6 +67,7 @@ import org.lamsfoundation.lams.learningdesign.SequenceActivity; import org.lamsfoundation.lams.learningdesign.ToolActivity; import org.lamsfoundation.lams.learningdesign.dao.IActivityDAO; +import org.lamsfoundation.lams.learningdesign.dto.ActivityURL; import org.lamsfoundation.lams.lesson.CompletedActivityProgress; import org.lamsfoundation.lams.lesson.CompletedActivityProgressArchive; import org.lamsfoundation.lams.lesson.LearnerProgress; @@ -95,6 +94,7 @@ import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; +import org.lamsfoundation.lams.usermanagement.util.LastNameAlphabeticComparator; import org.lamsfoundation.lams.util.Configuration; import org.lamsfoundation.lams.util.ConfigurationKeys; import org.lamsfoundation.lams.util.DateUtil; @@ -112,9 +112,8 @@ * This service handles all gradebook-related service calls * * @author lfoxton - * */ -public class GradebookService implements IGradebookService { +public class GradebookService implements IGradebookFullService { private static Logger logger = Logger.getLogger(GradebookService.class); private static final ExcelCell[] EMPTY_ROW = new ExcelCell[4]; @@ -134,7 +133,8 @@ private IActivityDAO activityDAO; private MessageService messageService; private ILogEventService logEventService; - private static ICoreLearnerService learnerService; + private static ILearnerService learnerService; + private IOutcomeService outcomeService; @Override @@ -413,6 +413,10 @@ gUserDTO.setMark(gradebookUserActivity.getMark()); } + + boolean hasArchivedMarks = gradebookDAO.hasArchivedMarks(lesson.getLessonId(), learner.getUserId()); + gUserDTO.setHasArchivedMarks(hasArchivedMarks); + gradebookUserDTOs.add(gUserDTO); } } @@ -439,7 +443,7 @@ //size will be 0 in case of excel export if (size == 0) { learners = new LinkedList(lesson.getAllLearners()); - Collections.sort(learners, new UserComparator()); + Collections.sort(learners, new LastNameAlphabeticComparator()); userToLearnerProgressMap = getUserToLearnerProgressMap(lesson, null); userToGradebookUserLessonMap = getUserToGradebookUserLessonMap(lesson, null); @@ -684,7 +688,7 @@ } @Override - public void updateUserActivityGradebookMark(Lesson lesson, Activity activity, User learner) { + public void updateGradebookUserActivityMark(Lesson lesson, Activity activity, User learner) { ToolSession toolSession = toolService.getToolSessionByLearner(learner, activity); if ((toolSession == null) || (toolSession == null) || (learner == null) || (lesson == null) @@ -711,7 +715,7 @@ // Only set the mark if it hasnt previously been set by a teacher if ((gradebookUserActivity == null) || !gradebookUserActivity.getMarkedInGradebook()) { - updateUserActivityGradebookMark(lesson, learner, toolActivity, outputDouble, false, false); + updateGradebookUserActivityMark(lesson, learner, toolActivity, outputDouble, false, false); } } } @@ -723,7 +727,7 @@ } @Override - public void updateUserActivityGradebookMark(Lesson lesson, User learner, Activity activity, Double mark, + public void updateGradebookUserActivityMark(Lesson lesson, User learner, Activity activity, Double mark, Boolean markedInGradebook, boolean isAuditLogRequired) { GradebookUserActivity gradebookUserActivity = gradebookDAO @@ -735,7 +739,20 @@ updateUserActivityGradebookMark(lesson, learner, activity, mark, markedInGradebook, isAuditLogRequired, gradebookUserActivity, gradebookUserLesson); } + + private void updateUserActivityGradebookMark(Lesson lesson, User learner, Activity activity, Double mark, + Boolean markedInGradebook, boolean isAuditLogRequired) { + GradebookUserActivity gradebookUserActivity = gradebookDAO + .getGradebookUserDataForActivity(activity.getActivityId(), learner.getUserId()); + + GradebookUserLesson gradebookUserLesson = gradebookDAO.getGradebookUserDataForLesson(lesson.getLessonId(), + learner.getUserId()); + + updateUserActivityGradebookMark(lesson, learner, activity, mark, markedInGradebook, isAuditLogRequired, + gradebookUserActivity, gradebookUserLesson); + } + @Override public boolean isWeightedMarks(Long lessonId) { Lesson lesson = lessonService.getLesson(lessonId); @@ -762,7 +779,45 @@ } return evaluations; } + + private void updateUserActivityGradebookMark(Lesson lesson, Activity activity, User learner) { + ToolSession toolSession = toolService.getToolSessionByLearner(learner, activity); + if ((toolSession == null) || (toolSession == null) || (learner == null) || (lesson == null) + || (activity == null) || !(activity instanceof ToolActivity) + || (((ToolActivity) activity).getEvaluation() == null)) { + return; + } + ToolActivity toolActivity = (ToolActivity) activity; + + // Getting the first activity evaluation + ActivityEvaluation eval = toolActivity.getEvaluation(); + + try { + ToolOutput toolOutput = toolService.getOutputFromTool(eval.getToolOutputDefinition(), toolSession, + learner.getUserId()); + + if (toolOutput != null) { + ToolOutputValue outputVal = toolOutput.getValue(); + if (outputVal != null) { + Double outputDouble = outputVal.getDouble(); + + GradebookUserActivity gradebookUserActivity = getGradebookUserActivity(toolActivity.getActivityId(), + learner.getUserId()); + + // Only set the mark if it hasnt previously been set by a teacher + if ((gradebookUserActivity == null) || !gradebookUserActivity.getMarkedInGradebook()) { + updateUserActivityGradebookMark(lesson, learner, toolActivity, outputDouble, false, false); + } + } + } + + } catch (ToolException e) { + GradebookService.logger.debug( + "Runtime exception when attempted to get outputs for activity: " + toolActivity.getActivityId(), e); + } + } + /** * It's the same method as above, it only also accepts gradebookUserActivity and gradebookUserLesson as parameters. */ @@ -825,7 +880,7 @@ } @Override - public void updateUserActivityGradebookFeedback(Activity activity, User learner, String feedback) { + public void updateGradebookUserActivityFeedback(Activity activity, User learner, String feedback) { GradebookUserActivity gradebookUserActivity = gradebookDAO .getGradebookUserDataForActivity(activity.getActivityId(), learner.getUserId()); @@ -838,7 +893,21 @@ gradebookUserActivity.setUpdateDate(new Date()); gradebookDAO.insertOrUpdate(gradebookUserActivity); } + + private void updateUserActivityGradebookFeedback(Activity activity, User learner, String feedback) { + GradebookUserActivity gradebookUserActivity = gradebookDAO + .getGradebookUserDataForActivity(activity.getActivityId(), learner.getUserId()); + + if (gradebookUserActivity == null) { + gradebookUserActivity = new GradebookUserActivity((ToolActivity) activity, learner); + } + + gradebookUserActivity.setFeedback(feedback); + gradebookUserActivity.setUpdateDate(new Date()); + gradebookDAO.insertOrUpdate(gradebookUserActivity); + } + @Override public void toggleMarksReleased(Long lessonId) { @@ -970,7 +1039,7 @@ Map> activityToUserDTOMap = new LinkedHashMap>(); - Set learners = new TreeSet(new UserComparator()); + Set learners = new TreeSet(new LastNameAlphabeticComparator()); if (lesson.getAllLearners() != null) { learners.addAll(lesson.getAllLearners()); } @@ -1000,7 +1069,7 @@ if (activity instanceof SequenceActivity) { // use only a subset of learners for this branch of the branching activity based on who has started the branch - complexLearners = new TreeSet(new UserComparator()); + complexLearners = new TreeSet(new LastNameAlphabeticComparator()); for (User learner : learners) { LearnerProgress learnerProgress = userToLearnerProgressMap.get(learner.getUserId()); if (learnerProgress != null && (learnerProgress.getCompletedActivities().get(activity) != null @@ -1251,7 +1320,7 @@ // -------------------- process Learner View page -------------------------------- - Set learners = new TreeSet(new UserComparator()); + Set learners = new TreeSet(new LastNameAlphabeticComparator()); if (lesson.getAllLearners() != null) { learners.addAll(lesson.getAllLearners()); } @@ -1457,7 +1526,7 @@ } //sort users by last name - TreeSet sortedLearners = new TreeSet(new UserComparator()); + TreeSet sortedLearners = new TreeSet(new LastNameAlphabeticComparator()); sortedLearners.addAll(allLearners); for (User learner : sortedLearners) { @@ -1863,6 +1932,25 @@ } @Override + public void updateGradebookUserActivityMark(Double mark, String feedback, Integer userID, Long toolSessionID, + Boolean markedInGradebook) { + ToolSession toolSession = toolService.getToolSessionById(toolSessionID); + User learner = (User) userService.findById(User.class, userID); + if ((learner != null) && (toolSession != null)) { + ToolActivity activity = toolSession.getToolActivity(); + GradebookUserActivity gradebookUserActivity = getGradebookUserActivity(activity.getActivityId(), userID); + + // If gradebook user activity is null or the mark is set by teacher or was set previously by user - save the + // mark and feedback + if ((gradebookUserActivity == null) || markedInGradebook || !gradebookUserActivity.getMarkedInGradebook()) { + updateGradebookUserActivityMark(toolSession.getLesson(), learner, activity, mark, markedInGradebook, + false); + updateGradebookUserActivityFeedback(activity, learner, feedback); + } + } + } + + @Override public void updateActivityMark(Double mark, String feedback, Integer userID, Long toolSessionID, Boolean markedInGradebook) { ToolSession toolSession = toolService.getToolSessionById(toolSessionID); @@ -2494,13 +2582,13 @@ return gradebookDAO.getAllMarksForLesson(lessonId); } - private ICoreLearnerService getLearnerService() { - if (GradebookService.learnerService == null) { + private ILearnerService getLearnerService() { + if (learnerService == null) { WebApplicationContext ctx = WebApplicationContextUtils .getWebApplicationContext(SessionManager.getServletContext()); - GradebookService.learnerService = (ICoreLearnerService) ctx.getBean("learnerService"); + learnerService = (ILearnerService) ctx.getBean("learnerService"); } - return GradebookService.learnerService; + return learnerService; } @Override @@ -2585,5 +2673,4 @@ public void setOutcomeService(IOutcomeService outcomeService) { this.outcomeService = outcomeService; } - // ------------------------------------------------------------------------- } \ No newline at end of file Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookFullService.java =================================================================== diff -u -r471b903caa3365758fbdec0a22440b1b0b3f2947 -r54a14306d3b36e6da9aedbaa6700c91048ebc53a --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookFullService.java (.../IGradebookFullService.java) (revision 471b903caa3365758fbdec0a22440b1b0b3f2947) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookFullService.java (.../IGradebookFullService.java) (revision 54a14306d3b36e6da9aedbaa6700c91048ebc53a) @@ -23,11 +23,11 @@ package org.lamsfoundation.lams.gradebook.service; import java.util.ArrayList; -import java.util.Date; import java.util.LinkedHashMap; 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.dto.GBLessonGridRowDTO; import org.lamsfoundation.lams.gradebook.dto.GBUserGridRowDTO; @@ -62,8 +62,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 @@ -134,6 +136,7 @@ * * @param activity */ + @Override void recalculateGradebookMarksForActivity(Activity activity); /** @@ -144,6 +147,7 @@ * @param lessonId * @throws Exception */ + @Override void recalculateTotalMarksForLesson(Long lessonId) throws Exception; /** @@ -257,6 +261,7 @@ */ Activity getActivityById(Long activityID); + @Override void removeLearnerFromLesson(Long lessonId, Integer learnerId); /** Index: lams_gradebook/web/gradebookMonitor.jsp =================================================================== diff -u -r87f0e1a1f4681221cf031059ea7fe5c6344cbc08 -r54a14306d3b36e6da9aedbaa6700c91048ebc53a --- lams_gradebook/web/gradebookMonitor.jsp (.../gradebookMonitor.jsp) (revision 87f0e1a1f4681221cf031059ea7fe5c6344cbc08) +++ lams_gradebook/web/gradebookMonitor.jsp (.../gradebookMonitor.jsp) (revision 54a14306d3b36e6da9aedbaa6700c91048ebc53a) @@ -25,7 +25,7 @@ - +