Index: lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java =================================================================== RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java,v diff -u -r1.41.2.12 -r1.41.2.13 --- lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java 2 Apr 2007 07:25:14 -0000 1.41.2.12 +++ lams_central/src/java/org/lamsfoundation/lams/authoring/service/AuthoringService.java 2 Apr 2007 07:50:39 -0000 1.41.2.13 @@ -399,8 +399,11 @@ } - learningDesignDAO.insertOrUpdate(design); + // the lesson may now have additional activities on the end, so clear any completed flags + lessonService.performMarkLessonUncompleted(lesson.getLessonId()); + learningDesignDAO.insertOrUpdate(design); + flashMessage = new FlashMessage("finishEditOnFly", lesson.getLessonId()); } else { Index: lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILearnerProgressDAO.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILearnerProgressDAO.java,v diff -u -r1.10.6.1 -r1.10.6.2 --- lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILearnerProgressDAO.java 20 Mar 2007 10:34:37 -0000 1.10.6.1 +++ lams_common/src/java/org/lamsfoundation/lams/lesson/dao/ILearnerProgressDAO.java 2 Apr 2007 07:49:46 -0000 1.10.6.2 @@ -74,4 +74,12 @@ * @return List */ public List getLearnerProgressReferringToActivity(final Activity activity); + + /** + * Get all the learner progress records for a lesson where the progress is marked as completed. + * @param lessonId + * @return List + */ + public List getCompletedLearnerProgressForLesson(final Long lessonId); + } Index: lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LearnerProgressDAO.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LearnerProgressDAO.java,v diff -u -r1.12.6.1 -r1.12.6.2 --- lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LearnerProgressDAO.java 20 Mar 2007 10:34:37 -0000 1.12.6.1 +++ lams_common/src/java/org/lamsfoundation/lams/lesson/dao/hibernate/LearnerProgressDAO.java 2 Apr 2007 07:49:46 -0000 1.12.6.2 @@ -51,6 +51,8 @@ "from LearnerProgress p where p.previousActivity = :activity or p.currentActivity = :activity or p.nextActivity = :activity "; // + // "or activity in elements(p.previousActivity) or activity in elements(p.completedActivities)"; + private final static String LOAD_COMPLETED_PROGRESS_BY_LESSON = + "from LearnerProgress p where p.lessonComplete = true and p.lesson.id = :lessonId"; /** * Retrieves the Lesson @@ -117,22 +119,41 @@ public List getLearnerProgressReferringToActivity(final Activity activity) { HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); - log.debug("Hibernate template is "+hibernateTemplate); return (List)hibernateTemplate.execute( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { - log.debug("activity is "+activity); - Query query = session.createQuery(LOAD_PROGRESS_BY_ACTIVITY); - query.setEntity("activity",activity); - List list = query.list(); - log.debug("list is "+list); - return list; + return session.createQuery(LOAD_PROGRESS_BY_ACTIVITY) + .setEntity("activity",activity) + .list(); } } ); } + /** + * Get all the learner progress records for a lesson where the progress is marked as completed. + * @param lessonId + * @return List + */ + public List getCompletedLearnerProgressForLesson(final Long lessonId) + { + HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory()); + log.debug("Hibernate template is "+hibernateTemplate); + + return (List)hibernateTemplate.execute( + new HibernateCallback() + { + public Object doInHibernate(Session session) throws HibernateException + { + return session.createQuery(LOAD_COMPLETED_PROGRESS_BY_LESSON) + .setLong("lessonId",lessonId) + .list(); + } + } + ); + } + } Index: lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java,v diff -u -r1.10.6.1 -r1.10.6.2 --- lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java 20 Mar 2007 10:34:37 -0000 1.10.6.1 +++ lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java 2 Apr 2007 07:49:46 -0000 1.10.6.2 @@ -207,4 +207,13 @@ * @param activity The activity for which learner progress references should be removed. */ public void removeProgressReferencesToActivity(Activity activity) throws LessonServiceException; + + /** + * Mark any learner progresses for this lesson as not completed. Called when Live Edit + * ends, to ensure that if there were any completed progress records, and the design + * was extended, then they are no longer marked as completed. + * @param lessonId The lesson for which learner progress entries should be updated. + */ + public void performMarkLessonUncompleted(Long lessonId) throws LessonServiceException; + } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java,v diff -u -r1.13.6.1 -r1.13.6.2 --- lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java 20 Mar 2007 10:34:37 -0000 1.13.6.1 +++ lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java 2 Apr 2007 07:49:46 -0000 1.13.6.2 @@ -499,7 +499,7 @@ /** * Remove references to an activity from all learner progress entries. * Used by Live Edit, to remove any references to the system gates - * @param activityId The activity for which learner progress references should be removed. + * @param activity The activity for which learner progress references should be removed. */ public void removeProgressReferencesToActivity(Activity activity) throws LessonServiceException { if ( activity != null ) { @@ -509,41 +509,78 @@ if ( progresses != null && progresses.size()>0) { Iterator iter = progresses.iterator(); while ( iter.hasNext() ) { - removeActivityReference(activity, (LearnerProgress) iter.next()); + LearnerProgress progress = (LearnerProgress) iter.next(); + if ( removeActivityReference(activity, progress) ); + learnerProgressDAO.updateLearnerProgress(progress); } } } } - private void removeActivityReference(Activity activity, LearnerProgress progress) { + private boolean removeActivityReference(Activity activity, LearnerProgress progress) { + if ( log.isDebugEnabled() ) { log.debug("Processing learner progress learner "+progress.getUser().getUserId()); } + boolean recordUpdated = false; + boolean removed = progress.getAttemptedActivities().remove(activity); - if ( removed && log.isDebugEnabled() ) { + if ( removed ) { + recordUpdated = true; log.debug("Removed activity from attempted activities"); } removed = progress.getCompletedActivities().remove(activity); - if ( removed && log.isDebugEnabled() ) { + if ( removed ) { + recordUpdated = true; log.debug("Removed activity from completed activities"); } if ( progress.getCurrentActivity() != null && progress.getCurrentActivity().equals(activity) ) { progress.setCurrentActivity(null); + recordUpdated = true; log.debug("Removed activity as current activity"); } if ( progress.getNextActivity() != null && progress.getNextActivity().equals(activity) ) { progress.setNextActivity(null); + recordUpdated = true; log.debug("Removed activity as next activity"); } if ( progress.getPreviousActivity() != null && progress.getPreviousActivity().equals(activity) ) { progress.setPreviousActivity(null); + recordUpdated = true; log.debug("Removed activity as previous activity"); } + + return recordUpdated; } + /** + * Mark any learner progresses for this lesson as not completed. Called when Live Edit + * ends, to ensure that if there were any completed progress records, and the design + * was extended, then they are no longer marked as completed. + * @param lessonId The lesson for which learner progress entries should be updated. + */ + public void performMarkLessonUncompleted(Long lessonId) throws LessonServiceException { + int count = 0; + if ( lessonId != null ) { + log.debug("Setting learner progress to uncompleted for lesson "+lessonId); + + List progresses = learnerProgressDAO.getCompletedLearnerProgressForLesson(lessonId); + if ( progresses != null && progresses.size()>0) { + Iterator iter = progresses.iterator(); + while ( iter.hasNext() ) { + LearnerProgress progress = (LearnerProgress) iter.next(); + progress.setLessonComplete(false); + count++; + } + } + } + if ( log.isDebugEnabled() ) + log.debug("Reset completed flag for "+count+" learners for lesson "+lessonId); + } + }