Index: lams_learning/src/java/org/lamsfoundation/lams/learning/learningApplicationContext.xml
===================================================================
RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/learningApplicationContext.xml,v
diff -u -r1.32.2.12 -r1.32.2.13
--- lams_learning/src/java/org/lamsfoundation/lams/learning/learningApplicationContext.xml 28 Dec 2016 09:39:53 -0000 1.32.2.12
+++ lams_learning/src/java/org/lamsfoundation/lams/learning/learningApplicationContext.xml 11 Jan 2017 09:00:06 -0000 1.32.2.13
@@ -73,6 +73,7 @@
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED,readOnly
+ PROPAGATION_REQUIRES_NEW
Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/ICoreLearnerService.java
===================================================================
RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/service/ICoreLearnerService.java,v
diff -u -r1.18.10.9 -r1.18.10.10
--- lams_learning/src/java/org/lamsfoundation/lams/learning/service/ICoreLearnerService.java 15 Dec 2016 11:48:26 -0000 1.18.10.9
+++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/ICoreLearnerService.java 11 Jan 2017 09:00:06 -0000 1.18.10.10
@@ -23,6 +23,7 @@
package org.lamsfoundation.lams.learning.service;
+import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@@ -34,6 +35,7 @@
import org.lamsfoundation.lams.learningdesign.Group;
import org.lamsfoundation.lams.learningdesign.Grouping;
import org.lamsfoundation.lams.learningdesign.SequenceActivity;
+import org.lamsfoundation.lams.learningdesign.dao.IActivityDAO;
import org.lamsfoundation.lams.lesson.LearnerProgress;
import org.lamsfoundation.lams.lesson.Lesson;
import org.lamsfoundation.lams.lesson.dto.LessonDTO;
@@ -335,4 +337,9 @@
*/
SequenceActivity selectBranch(Lesson lesson, BranchingActivity branchingActivity, Integer learnerId, Long branchId)
throws LearnerServiceException;
+
+ /* Added for RepopulateProgressMarksServlet - can be removed later */
+ String[] recalcProgressForLearner(Lesson lesson, ArrayList activityList, LearnerProgress learnerProgress, boolean updateGradebookForAll);
+ IActivityDAO getActivityDAO();
+
}
Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java
===================================================================
RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java,v
diff -u -r1.112.2.17 -r1.112.2.18
--- lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java 5 Jan 2017 11:19:32 -0000 1.112.2.17
+++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java 11 Jan 2017 09:00:06 -0000 1.112.2.18
@@ -51,6 +51,7 @@
import org.lamsfoundation.lams.learningdesign.BranchActivityEntry;
import org.lamsfoundation.lams.learningdesign.BranchCondition;
import org.lamsfoundation.lams.learningdesign.BranchingActivity;
+import org.lamsfoundation.lams.learningdesign.ComplexActivity;
import org.lamsfoundation.lams.learningdesign.ConditionGateActivity;
import org.lamsfoundation.lams.learningdesign.DataFlowObject;
import org.lamsfoundation.lams.learningdesign.GateActivity;
@@ -69,6 +70,7 @@
import org.lamsfoundation.lams.learningdesign.dao.IDataFlowDAO;
import org.lamsfoundation.lams.learningdesign.dao.IGroupUserDAO;
import org.lamsfoundation.lams.learningdesign.dao.IGroupingDAO;
+import org.lamsfoundation.lams.lesson.CompletedActivityProgress;
import org.lamsfoundation.lams.lesson.LearnerProgress;
import org.lamsfoundation.lams.lesson.Lesson;
import org.lamsfoundation.lams.lesson.dao.ILearnerProgressDAO;
@@ -78,6 +80,8 @@
import org.lamsfoundation.lams.lesson.service.LessonServiceException;
import org.lamsfoundation.lams.logevent.LogEvent;
import org.lamsfoundation.lams.logevent.service.ILogEventService;
+import org.lamsfoundation.lams.tool.Tool;
+import org.lamsfoundation.lams.tool.ToolCompletionStatus;
import org.lamsfoundation.lams.tool.ToolOutput;
import org.lamsfoundation.lams.tool.ToolSession;
import org.lamsfoundation.lams.tool.exception.LamsToolServiceException;
@@ -1415,4 +1419,184 @@
}
return true;
}
+
+ /* Added for RepopulateProgressMarksServlet - can be removed later */
+ private static final String TOOL_SIGNATURE_ASSESSMENT = "laasse10";
+ private static final String TOOL_SIGNATURE_SCRATCHIE = "lascrt11";
+ private static final String TOOL_SIGNATURE_MCQ = "lamc11";
+
+ public String[] recalcProgressForLearner(Lesson lesson, ArrayList activityList, LearnerProgress learnerProgress, boolean updateGradebookForAll) {
+
+ StringBuilder auditLogBuilder = new StringBuilder("");
+ StringBuilder errorBuilder = new StringBuilder("");
+
+ User learner = learnerProgress.getUser();
+ Date lessonStartDate = learnerProgress.getStartDate();
+ auditLogBuilder.append("\n\nUpdating ").append(learner.getLogin()).append(" ")
+ .append(learner.getFullName()).append("\n");
+
+ boolean updated = false;
+ for (Activity activity : activityList) {
+
+ CompletedActivityProgress completedProgress = learnerProgress.getCompletedActivities().get(activity);
+ if (completedProgress == null || completedProgress.getStartDate() == null || completedProgress.getFinishDate() == null) {
+ updated = updateProgress(lesson.getLessonId(), auditLogBuilder, errorBuilder, learnerProgress,
+ learner, lessonStartDate, activity) || updated;
+ }
+
+ // is completed (previously or just now?), in which case update gradebook.
+ if (activity.isToolActivity()) {
+ CompletedActivityProgress updatedCompletedProgress = learnerProgress.getCompletedActivities().get(
+ activity);
+ if (updatedCompletedProgress != null) {
+ ToolActivity toolActivity = (ToolActivity) activity;
+ Tool tool = toolActivity.getTool();
+ if (updateGradebookForAll || TOOL_SIGNATURE_ASSESSMENT.equals(tool.getToolSignature())
+ || TOOL_SIGNATURE_SCRATCHIE.equals(tool.getToolSignature())
+ || TOOL_SIGNATURE_MCQ.equals(tool.getToolSignature())) {
+ auditLogBuilder.append("Pushing mark to Gradebook for activity ")
+ .append(activity.getActivityId()).append(" ").append(activity.getTitle()).append("\n");
+ gradebookService.updateUserActivityGradebookMark(lesson, activity, learner);
+ }
+ }
+ }
+
+ }
+
+ if ( updated )
+ learnerProgressDAO.updateLearnerProgress(learnerProgress);
+
+ return new String[] { auditLogBuilder.toString(), errorBuilder.toString() };
+ }
+
+ private boolean updateProgress(Long lessonId, StringBuilder auditLogBuilder, StringBuilder errorBuilder,
+ LearnerProgress learnerProgress, User learner, Date lessonStartDate, Activity activity) {
+
+ boolean updated = false;
+ ToolCompletionStatus results = recalcActivityProgress(activity, learner, lessonId, learnerProgress, auditLogBuilder, errorBuilder);
+
+ // results == null ignore - won't harm anything if it is in attempted and nothing in the tool and
+ // do not remove from completed in case it was force completed, or the tool doesn't support this
+
+ if (results != null) {
+
+ if (results.getStatus() == ToolCompletionStatus.ACTIVITY_COMPLETED) {
+ // completed
+ Date startedDateFromAttempted = learnerProgress.getAttemptedActivities().get(activity);
+ CompletedActivityProgress cap = learnerProgress.getCompletedActivities().get(activity);
+ if (cap != null) {
+ if (cap.getStartDate() == null) {
+ if (startedDateFromAttempted != null)
+ cap.setStartDate(startedDateFromAttempted);
+ else if (results.getStartDate() != null)
+ cap.setStartDate(results.getStartDate());
+ }
+ if (cap.getFinishDate() == null && results.getFinishDate() != null) {
+ cap.setFinishDate(results.getFinishDate());
+ }
+ } else {
+ cap = new CompletedActivityProgress(learnerProgress, activity,
+ startedDateFromAttempted != null ? startedDateFromAttempted : results.getStartDate(),
+ results.getFinishDate());
+ }
+ if ( cap.getStartDate() == null ) {
+ // must have something or it is not seen as completed
+ cap.setStartDate(lessonStartDate);
+ }
+ learnerProgress.getCompletedActivities().put(activity, cap);
+ learnerProgress.getAttemptedActivities().remove(activity);
+
+ auditLogBuilder.append("Progress updated for completed activity ").append(activity.getActivityId())
+ .append(" ").append(activity.getTitle()).append("\n");
+ updated = true;
+
+ } else if (results.getStatus() == ToolCompletionStatus.ACTIVITY_ATTEMPTED) {
+ // Attempted - if not already there add with tool's start date, or failing that the tool's value for
+ // session start date, or the core's value for session start date, or the lesson start date.
+ // Must have a date or it can't be saved.
+ if (results.getStartDate() != null)
+ learnerProgress.getAttemptedActivities().putIfAbsent(activity, results.getStartDate());
+ else {
+ learnerProgress.getAttemptedActivities().putIfAbsent(activity, lessonStartDate);
+ }
+ auditLogBuilder.append("Progress updated for attempted activity ").append(activity.getActivityId())
+ .append(" ").append(activity.getTitle()).append("\n");
+ updated = true;
+ }
+
+ }
+
+ return updated;
+ }
+
+ private ToolCompletionStatus recalcActivityProgress(Activity activity, User learner, Long lessonId, LearnerProgress learnerProgress, StringBuilder auditLogEntry, StringBuilder errorBuilder) {
+
+ ToolCompletionStatus status = null;
+
+ if (activity.isToolActivity()) {
+ ToolSession toolSession = lamsCoreToolService.getToolSessionByLearner(learner, activity);
+ if (toolSession != null) {
+ status = lamsCoreToolService.getCompletionStatusFromTool(learner, activity);
+ if ( status.getStartDate() == null )
+ status.setStartDate(toolSession.getCreateDateTime());
+ }
+
+ } else if ( activity.isComplexActivity() ) {
+ ComplexActivity complexActivity = (ComplexActivity) activity;
+ boolean attempted = false;
+ boolean allComplete = true;
+ Date caStartDate = null;
+ Date caEndDate = null;
+ for (Iterator i = complexActivity.getActivities().iterator(); i.hasNext();) {
+ Activity childActivity = (Activity) i.next();
+ Date childStartDate = learnerProgress.getAttemptedActivities().get(childActivity);
+ Date childEndDate = null;
+ if ( childStartDate != null ) {
+ attempted = true;
+ }
+ CompletedActivityProgress childCap = learnerProgress.getCompletedActivities().get(childActivity);
+ if ( childCap == null ) {
+ allComplete = false;
+ } else {
+ attempted = true;
+ if ( childStartDate == null )
+ childStartDate = childCap.getStartDate();
+ childEndDate = childCap.getFinishDate();
+ }
+ if ( caStartDate == null || (childStartDate != null && childStartDate.before(caStartDate)) )
+ caStartDate = childStartDate;
+ if ( caEndDate == null || (childEndDate != null && childEndDate.after(caStartDate)) )
+ caEndDate = childEndDate;
+ }
+
+ if ( attempted ) {
+ if ( allComplete )
+ status = new ToolCompletionStatus(ToolCompletionStatus.ACTIVITY_COMPLETED, caStartDate, caEndDate);
+ else
+ status = new ToolCompletionStatus(ToolCompletionStatus.ACTIVITY_ATTEMPTED, caStartDate, null);
+ }
+
+ } else if ( activity.isGateActivity() ){
+ // do nothing
+ ;
+ } else if ( activity.isGroupingActivity() ) {
+ GroupingActivity groupingActivity = (GroupingActivity) activity;
+ Grouping grouping = groupingActivity.getCreateGrouping();
+ if ( grouping.doesLearnerExist(learner) ) {
+ status = new ToolCompletionStatus(ToolCompletionStatus.ACTIVITY_COMPLETED, null, null);
+ }
+ } else {
+ errorBuilder.append("Unable to update status for unexpected activity ").append(activity.getActivityId())
+ .append(" ").append(activity.getTitle());
+ }
+ return status;
+
+ }
+
+ @Override
+ public IActivityDAO getActivityDAO() {
+ return activityDAO;
+ }
+
+
}
\ No newline at end of file
Fisheye: Tag 1.1 refers to a dead (removed) revision in file `lams_learning/src/java/org/lamsfoundation/lams/learning/web/RepopulateProgressMarksServlet.java'.
Fisheye: No comparison available. Pass `N' to diff?
Index: lams_learning/web/WEB-INF/web.xml
===================================================================
RCS file: /usr/local/cvsroot/lams_learning/web/WEB-INF/Attic/web.xml,v
diff -u -r1.39.2.8 -r1.39.2.9
--- lams_learning/web/WEB-INF/web.xml 28 Jul 2016 03:47:36 -0000 1.39.2.8
+++ lams_learning/web/WEB-INF/web.xml 11 Jan 2017 09:00:06 -0000 1.39.2.9
@@ -96,6 +96,18 @@
1
+
+
+ RepopulateProgressMarksServlet
+
+ org.lamsfoundation.lams.learning.web.RepopulateProgressMarksServlet
+
+
+
+ RepopulateProgressMarksServlet
+ /repopulateProgress
+
+