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}
+
+
+
+
+