Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r1af4378c901cea902392d4ef17f9d990f25e16f3 -r6950295e2d5e90ffae268faeae946718654ddc7b Binary files differ Index: lams_central/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r3ee797097930c234a68db449b2ff2b445e07fb68 -r6950295e2d5e90ffae268faeae946718654ddc7b --- lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 3ee797097930c234a68db449b2ff2b445e07fb68) +++ lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 6950295e2d5e90ffae268faeae946718654ddc7b) @@ -2,7 +2,7 @@ #language code: en #locale code: AU - # CVS ID: $Id$ Exported from the LAMS Community by Ernie Ghiglione on Mon Jan 23 09:23:44 CST 2012 + # CVS ID: $Id$ Exported from the LAMS Community by Ernie Ghiglione on Mon Jan 02 15:10:14 CST 2012 #=================== labels for LAMS Central =================# @@ -160,6 +160,7 @@ error.email.required =Email address is required. error.valid.email.required =Valid email address is required. message.lesson.not.started.cannot.participate =This lesson has not been started. You cannot participate in the lesson until it is started. +message.preceding.lessons.not.finished.cannot.participate =Preceding lessons have not been finished. You cannot participate in the lesson until this condition is met. index.mycourses =My Groups title.export.choose.format =Choose export content format msg.export.choose.format.instruction =Please choose format which you want to export Index: lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupAction.java =================================================================== diff -u -r0ac329a15d425a9d2648339a60b5b32572b9e2c5 -r6950295e2d5e90ffae268faeae946718654ddc7b --- lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupAction.java (.../DisplayGroupAction.java) (revision 0ac329a15d425a9d2648339a60b5b32572b9e2c5) +++ lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupAction.java (.../DisplayGroupAction.java) (revision 6950295e2d5e90ffae268faeae946718654ddc7b) @@ -28,8 +28,10 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import javax.naming.NamingException; @@ -295,6 +297,14 @@ // iterate through user's lessons where they are learner Map map = getLessonService().getLessonsByOrgAndUserWithCompletedFlag(userId, orgId, Role.ROLE_LEARNER); + // remove lessons which do not have preceding lessons completed + Iterator> lessonIter = map.entrySet().iterator(); + while (lessonIter.hasNext()) { + if (!lessonService.checkLessonReleaseConditions(lessonIter.next().getKey(), userId)) { + lessonIter.remove(); + } + } + for (IndexLessonBean bean : map.values()) { List lessonLinks = new ArrayList(); String url = null; Index: lams_central/src/java/org/lamsfoundation/lams/web/HomeAction.java =================================================================== diff -u -r1c1c6b24a18fffc7a7b2bccdee8fedb110d1669e -r6950295e2d5e90ffae268faeae946718654ddc7b --- lams_central/src/java/org/lamsfoundation/lams/web/HomeAction.java (.../HomeAction.java) (revision 1c1c6b24a18fffc7a7b2bccdee8fedb110d1669e) +++ lams_central/src/java/org/lamsfoundation/lams/web/HomeAction.java (.../HomeAction.java) (revision 6950295e2d5e90ffae268faeae946718654ddc7b) @@ -37,6 +37,7 @@ import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.actions.DispatchAction; +import org.lamsfoundation.lams.learning.service.LearnerServiceException; import org.lamsfoundation.lams.learningdesign.GroupUser; import org.lamsfoundation.lams.learningdesign.dao.IGroupUserDAO; import org.lamsfoundation.lams.lesson.Lesson; @@ -163,6 +164,10 @@ if (lesson == null || !lesson.isLessonStarted()) { return displayMessage(mapping, req, "message.lesson.not.started.cannot.participate"); } + if (!getLessonService().checkLessonReleaseConditions(lessonId, user.getUserID())) { + return displayMessage(mapping, req, "message.preceding.lessons.not.finished.cannot.participate"); + } + if (lesson.getLessonClass() == null || !lesson.getLessonClass().getLearners().contains(getRealUser(user))) { Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/lesson/Lesson.hbm.xml =================================================================== diff -u -rcb6d628cd53fe3d51e4f67cbaff7390651a048da -r6950295e2d5e90ffae268faeae946718654ddc7b --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/lesson/Lesson.hbm.xml (.../Lesson.hbm.xml) (revision cb6d628cd53fe3d51e4f67cbaff7390651a048da) +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/lesson/Lesson.hbm.xml (.../Lesson.hbm.xml) (revision 6950295e2d5e90ffae268faeae946718654ddc7b) @@ -124,6 +124,24 @@ lazy="false"> + + + + + + + + + + + + + + + + + + Index: lams_common/db/sql/create_lams_11_tables.sql =================================================================== diff -u -r097c7143c4edf7a649e785d0f58a1bbf640edd3b -r6950295e2d5e90ffae268faeae946718654ddc7b --- lams_common/db/sql/create_lams_11_tables.sql (.../create_lams_11_tables.sql) (revision 097c7143c4edf7a649e785d0f58a1bbf640edd3b) +++ lams_common/db/sql/create_lams_11_tables.sql (.../create_lams_11_tables.sql) (revision 6950295e2d5e90ffae268faeae946718654ddc7b) @@ -1203,3 +1203,13 @@ , config_value VARCHAR(255) NOT NULL , PRIMARY KEY (config_key) )TYPE=InnoDB; + +CREATE TABLE lams_lesson_release ( + lesson_id BIGINT(20) + , preceding_lesson_id BIGINT(20) + , CONSTRAINT FK_lams_lesson_release_1 FOREIGN KEY (lesson_id) + REFERENCES lams_lesson (lesson_id) ON DELETE CASCADE ON UPDATE CASCADE + , CONSTRAINT FK_lams_lesson_release_2 FOREIGN KEY (preceding_lesson_id) + REFERENCES lams_lesson (lesson_id) ON DELETE CASCADE ON UPDATE CASCADE + , PRIMARY KEY (lesson_id,preceding_lesson_id) +)TYPE=InnoDB; \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch02040006.sql =================================================================== diff -u -r1b5e1d1a56b7c671c57bbd9257fdba49c85abc3f -r6950295e2d5e90ffae268faeae946718654ddc7b --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch02040006.sql (.../patch02040006.sql) (revision 1b5e1d1a56b7c671c57bbd9257fdba49c85abc3f) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch02040006.sql (.../patch02040006.sql) (revision 6950295e2d5e90ffae268faeae946718654ddc7b) @@ -110,6 +110,17 @@ insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) values ('EnableServerRegistration', 'false', 'config.server2server.registration.enable', 'config.header.system', 'BOOLEAN', 1); +-- LDEV-2782 Conditional release for lessons +CREATE TABLE lams_lesson_release ( + lesson_id BIGINT(20) + , preceding_lesson_id BIGINT(20) + , CONSTRAINT FK_lams_lesson_release_1 FOREIGN KEY (lesson_id) + REFERENCES lams_lesson (lesson_id) ON DELETE CASCADE ON UPDATE CASCADE + , CONSTRAINT FK_lams_lesson_release_2 FOREIGN KEY (preceding_lesson_id) + REFERENCES lams_lesson (lesson_id) ON DELETE CASCADE ON UPDATE CASCADE + , PRIMARY KEY (lesson_id,preceding_lesson_id) +)TYPE=InnoDB; + COMMIT; SET AUTOCOMMIT = 1; set FOREIGN_KEY_CHECKS = 1; Index: lams_common/src/java/org/lamsfoundation/lams/lesson/Lesson.java =================================================================== diff -u -rcb6d628cd53fe3d51e4f67cbaff7390651a048da -r6950295e2d5e90ffae268faeae946718654ddc7b --- lams_common/src/java/org/lamsfoundation/lams/lesson/Lesson.java (.../Lesson.java) (revision cb6d628cd53fe3d51e4f67cbaff7390651a048da) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/Lesson.java (.../Lesson.java) (revision 6950295e2d5e90ffae268faeae946718654ddc7b) @@ -150,6 +150,12 @@ private Date releaseDate; + /** + * For lesson conditional release + */ + private Set precedingLessons; + private Set succeedingLessons; + //--------------------------------------------------------------------- // constructors //--------------------------------------------------------------------- @@ -705,4 +711,20 @@ public void setReleaseDate(Date releaseDate) { this.releaseDate = releaseDate; } + + public Set getPrecedingLessons() { + return precedingLessons; + } + + public void setPrecedingLessons(Set precedingLessons) { + this.precedingLessons = precedingLessons; + } + + public Set getSucceedingLessons() { + return succeedingLessons; + } + + public void setSucceedingLessons(Set succeedingLessons) { + this.succeedingLessons = succeedingLessons; + } } Index: lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java =================================================================== diff -u -r4020e48e252d3a5a9ace181e62bb78900f05128b -r6950295e2d5e90ffae268faeae946718654ddc7b --- lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java (.../ILessonService.java) (revision 4020e48e252d3a5a9ace181e62bb78900f05128b) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java (.../ILessonService.java) (revision 6950295e2d5e90ffae268faeae946718654ddc7b) @@ -27,6 +27,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Set; import org.lamsfoundation.lams.index.IndexLessonBean; import org.lamsfoundation.lams.learningdesign.Activity; @@ -416,4 +417,14 @@ * @return */ public LessonDetailsDTO getLessonDetailsFromSessionID(Long toolSessionID); + + /** + * Check if preceding lessons have been completed and the given lesson is available to the user. + */ + public boolean checkLessonReleaseConditions(Long lessonId, Integer learnerId); + + /** + * Find lessons which just got available after the given lesson has been completed. + */ + public Set getReleasedSucceedingLessons(Long completedLessonId, Integer learnerId); } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java =================================================================== diff -u -rcb6d628cd53fe3d51e4f67cbaff7390651a048da -r6950295e2d5e90ffae268faeae946718654ddc7b --- lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java (.../LessonService.java) (revision cb6d628cd53fe3d51e4f67cbaff7390651a048da) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java (.../LessonService.java) (revision 6950295e2d5e90ffae268faeae946718654ddc7b) @@ -834,4 +834,36 @@ } return null; } + + /** + * Check if preceding lessons have been completed and the given lesson is available to the user. + */ + public boolean checkLessonReleaseConditions(Long lessonId, Integer learnerId) { + Lesson lesson = getLesson(lessonId); + if (lesson != null) { + for (Lesson precedingLesson : lesson.getPrecedingLessons()) { + LearnerProgress progress = getUserProgressForLesson(learnerId, precedingLesson.getLessonId()); + if (progress == null || !progress.isComplete()) { + return false; + } + } + } + return true; + } + + /** + * Find lessons which just got available after the given lesson has been completed. + */ + public Set getReleasedSucceedingLessons(Long completedLessonId, Integer learnerId) { + Set releasedSucceedingLessons = new HashSet(); + Lesson lesson = getLesson(completedLessonId); + if (lesson != null) { + for (Lesson succeedingLesson : lesson.getSucceedingLessons()) { + if (checkLessonReleaseConditions(succeedingLesson.getLessonId(), learnerId)) { + releasedSucceedingLessons.add(succeedingLesson); + } + } + } + return releasedSucceedingLessons; + } } Index: lams_learning/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r3e839d147e5cb7e2afe7e39acc4b5e4ca928fc6b -r6950295e2d5e90ffae268faeae946718654ddc7b --- lams_learning/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 3e839d147e5cb7e2afe7e39acc4b5e4ca928fc6b) +++ lams_learning/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 6950295e2d5e90ffae268faeae946718654ddc7b) @@ -15,6 +15,7 @@ error.title =Error occured message.activity.loading =The next task is loading. Please wait.... message.lesson.finished =Congratulations, {0}, you have finished. +message.released.lessons =You are now able to participate in following lessons: {0}. exit.heading =You have exited from this Lesson. exit.message =You can resume this lesson using the Resume button. label.next.button =Next Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java =================================================================== diff -u -r1c1c6b24a18fffc7a7b2bccdee8fedb110d1669e -r6950295e2d5e90ffae268faeae946718654ddc7b --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision 1c1c6b24a18fffc7a7b2bccdee8fedb110d1669e) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java (.../LearnerService.java) (revision 6950295e2d5e90ffae268faeae946718654ddc7b) @@ -27,6 +27,7 @@ import java.sql.Timestamp; import java.util.ArrayList; import java.util.Calendar; +import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Iterator; @@ -244,7 +245,14 @@ */ public LessonDTO[] getActiveLessonsFor(Integer learnerId) { User learner = (User) userManagementService.findById(User.class, learnerId); - List activeLessons = lessonDAO.getActiveLessonsForLearner(learner); + List activeLessons = lessonDAO.getActiveLessonsForLearner(learner); + // remove lessons which do not have preceding lessons finished + Iterator lessonIter = activeLessons.iterator(); + while (lessonIter.hasNext()) { + if (!lessonService.checkLessonReleaseConditions(lessonIter.next().getLessonId(), learnerId)) { + lessonIter.remove(); + } + } return getLessonDataFor(activeLessons); } @@ -294,6 +302,9 @@ + " but lesson has not started"); throw new LearnerServiceException("Cannot join lesson as lesson has not started"); } + if (!lessonService.checkLessonReleaseConditions(lessonID, learnerId)) { + throw new LearnerServiceException("Cannot join lesson as preceding lessons have not been finished"); + } LearnerProgress learnerProgress = learnerProgressDAO.getLearnerProgressByLearner(learner.getUserId(), lessonID); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ActivityAction.java =================================================================== diff -u -r5863520d75343b47f77b05ad3bd7045a9a39af49 -r6950295e2d5e90ffae268faeae946718654ddc7b --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ActivityAction.java (.../ActivityAction.java) (revision 5863520d75343b47f77b05ad3bd7045a9a39af49) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/ActivityAction.java (.../ActivityAction.java) (revision 6950295e2d5e90ffae268faeae946718654ddc7b) @@ -36,6 +36,7 @@ public static final String ACTIVITY_REQUEST_ATTRIBUTE = "activity"; public static final String LEARNER_PROGRESS_REQUEST_ATTRIBUTE = "learnerprogress"; + public static final String RELEASED_LESSONS_REQUEST_ATTRIBUTE = "releasedLessons"; private ICoreLearnerService learnerService = null; Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LessonCompleteActivityAction.java =================================================================== diff -u -r8e56d1654c6d28d0d0bac2c48f6685c3142e5974 -r6950295e2d5e90ffae268faeae946718654ddc7b --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LessonCompleteActivityAction.java (.../LessonCompleteActivityAction.java) (revision 8e56d1654c6d28d0d0bac2c48f6685c3142e5974) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LessonCompleteActivityAction.java (.../LessonCompleteActivityAction.java) (revision 6950295e2d5e90ffae268faeae946718654ddc7b) @@ -25,6 +25,8 @@ package org.lamsfoundation.lams.learning.web.action; import java.io.UnsupportedEncodingException; +import java.util.HashSet; +import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -36,6 +38,8 @@ import org.lamsfoundation.lams.learning.web.form.ActivityForm; import org.lamsfoundation.lams.learning.web.util.LearningWebUtil; import org.lamsfoundation.lams.lesson.LearnerProgress; +import org.lamsfoundation.lams.lesson.Lesson; +import org.lamsfoundation.lams.lesson.service.ILessonService; import org.springframework.web.context.support.WebApplicationContextUtils; @@ -56,6 +60,7 @@ public class LessonCompleteActivityAction extends ActivityAction { private static IntegrationService integrationService = null; + private static ILessonService lessonService = null; /** * Gets an activity from the request (attribute) and forwards onto a display action using the ActionMappings class. @@ -66,6 +71,17 @@ LearnerProgress learnerProgress = LearningWebUtil.getLearnerProgress(request, getLearnerService()); LearningWebUtil.setupProgressInRequest((ActivityForm) actionForm, request, learnerProgress); + Set releasedLessons = getLessonService().getReleasedSucceedingLessons( + learnerProgress.getLesson().getLessonId(), learnerProgress.getUser().getUserId()); + if (!releasedLessons.isEmpty()) { + StringBuilder releasedLessonNames = new StringBuilder(); + for (Lesson releasedLesson : releasedLessons) { + releasedLessonNames.append(releasedLesson.getLessonName()).append(", "); + } + releasedLessonNames.delete(releasedLessonNames.length() - 2, releasedLessonNames.length()); + request.setAttribute(ActivityAction.RELEASED_LESSONS_REQUEST_ATTRIBUTE, releasedLessonNames.toString()); + } + //checks for lessonFinishUrl parameter String lessonFinishCallbackUrl = getIntegrationService().getLessonFinishCallbackUrl(learnerProgress.getUser(), learnerProgress.getLesson()); @@ -83,4 +99,12 @@ } return integrationService; } + + private ILessonService getLessonService() { + if (lessonService == null) { + lessonService = (ILessonService) WebApplicationContextUtils.getRequiredWebApplicationContext( + getServlet().getServletContext()).getBean("lessonService"); + } + return lessonService; + } } \ No newline at end of file Index: lams_learning/web/lessonComplete.jsp =================================================================== diff -u -r8e56d1654c6d28d0d0bac2c48f6685c3142e5974 -r6950295e2d5e90ffae268faeae946718654ddc7b --- lams_learning/web/lessonComplete.jsp (.../lessonComplete.jsp) (revision 8e56d1654c6d28d0d0bac2c48f6685c3142e5974) +++ lams_learning/web/lessonComplete.jsp (.../lessonComplete.jsp) (revision 6950295e2d5e90ffae268faeae946718654ddc7b) @@ -55,6 +55,16 @@

+ +

+ + + ${releasedLessons} + + +

+
+