From c80268a1976a15586b99b61029342cd6a82f6ebc Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Mon, 26 Jan 2015 14:03:43 +0100
Subject: [PATCH] OO-1349: course node filter check parent line, limit edition
 of running assessments, fix some RS

---
 .../fullWebApp/BaseFullWebappController.java  |  6 ++-
 ...AssessmentModeCoordinationServiceImpl.java |  2 +-
 .../ui/AssessmentModeEditController.java      | 24 +++++++++++-
 .../ui/AssessmentModeGuardController.java     |  6 +--
 .../ui/AssessmentModeListController.java      | 38 +++++++++++++++----
 .../ui/_i18n/LocalStrings_de.properties       |  4 ++
 .../olat/course/run/RunMainController.java    |  2 +-
 .../userview/AssessmentModeTreeFilter.java    | 12 ++++--
 8 files changed, 75 insertions(+), 19 deletions(-)

diff --git a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
index ded3b9b07f7..35f4100b1ad 100644
--- a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
+++ b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
@@ -84,6 +84,7 @@ import org.olat.core.gui.control.winmgr.JSCommand;
 import org.olat.core.gui.themes.Theme;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.helpers.Settings;
+import org.olat.core.id.IdentityEnvironment;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.id.context.ContextEntry;
@@ -199,8 +200,9 @@ public class BaseFullWebappController extends BasicController implements ChiefCo
 		WindowSettings settings = WindowSettings.parse(windowSettings);
 		wbo = winman.createWindowBackOffice("basechiefwindow", this, settings);
 		
-		if(ureq.getUserSession().getRoles() != null) {	
-			isAdmin = ureq.getUserSession().getRoles().isOLATAdmin();
+		IdentityEnvironment identityEnv = ureq.getUserSession().getIdentityEnvironment();
+		if(identityEnv != null && identityEnv.getRoles() != null) {	
+			isAdmin = identityEnv.getRoles().isOLATAdmin();
 		} else {
 			isAdmin = false;
 		}
diff --git a/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java b/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java
index 03a5767a2fa..67006473cc5 100644
--- a/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java
+++ b/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java
@@ -182,7 +182,7 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor
 	public boolean canStart(AssessmentMode assessmentMode) {
 		boolean canStart;
 		Status status = assessmentMode.getStatus();
-		if(status == Status.end) {
+		if(status == Status.end || status == Status.assessment) {
 			canStart = false;
 		} else {
 			canStart = true;
diff --git a/src/main/java/org/olat/course/assessment/ui/AssessmentModeEditController.java b/src/main/java/org/olat/course/assessment/ui/AssessmentModeEditController.java
index 03d4e0f9f68..1a069c75c73 100644
--- a/src/main/java/org/olat/course/assessment/ui/AssessmentModeEditController.java
+++ b/src/main/java/org/olat/course/assessment/ui/AssessmentModeEditController.java
@@ -145,17 +145,21 @@ public class AssessmentModeEditController extends FormBasicController {
 		}
 		setFormDescription("form.mode.description");
 		
+		Status status = assessmentMode.getStatus();
 		String name = assessmentMode.getName();
 		nameEl = uifactory.addTextElement("mode.name", "mode.name", 255, name, formLayout);
 		nameEl.setMandatory(true);
+		nameEl.setEnabled(status != Status.followup && status != Status.end);
 		
 		String desc = assessmentMode.getDescription();
 		descriptionEl = uifactory.addRichTextElementForStringData("mode.description", "mode.description",
 				desc, 6, -1, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
+		descriptionEl.setEnabled(status != Status.followup && status != Status.end);
 		
 		beginEl = uifactory.addDateChooser("mode.begin", assessmentMode.getBegin(), formLayout);
 		beginEl.setDateChooserTimeEnabled(true);
 		beginEl.setMandatory(true);
+		beginEl.setEnabled(status == Status.none || status == Status.leadtime);
 		
 		int leadTime = assessmentMode.getLeadTime();
 		if(leadTime < 0) {
@@ -163,10 +167,12 @@ public class AssessmentModeEditController extends FormBasicController {
 		}
 		leadTimeEl = uifactory.addIntegerElement("mode.leadTime", leadTime, formLayout);
 		leadTimeEl.setDisplaySize(3);
+		leadTimeEl.setEnabled(status == Status.none || status == Status.leadtime);
 		
 		endEl = uifactory.addDateChooser("mode.end", assessmentMode.getEnd(), formLayout);
 		endEl.setDateChooserTimeEnabled(true);
 		endEl.setMandatory(true);
+		endEl.setEnabled(status != Status.end);
 		
 		int followupTime = assessmentMode.getFollowupTime();
 		if(followupTime < 0) {
@@ -174,6 +180,7 @@ public class AssessmentModeEditController extends FormBasicController {
 		}
 		followupTimeEl = uifactory.addIntegerElement("mode.followupTime", followupTime, formLayout);
 		followupTimeEl.setDisplaySize(3);
+		followupTimeEl.setEnabled(status != Status.end);
 		
 		String[] startModeValues = new String[] {
 				translate("mode.beginend.automatic"), translate("mode.beginend.manual")
@@ -184,6 +191,7 @@ public class AssessmentModeEditController extends FormBasicController {
 		} else {
 			startModeEl.select(startModeKeys[0], true);
 		}
+		startModeEl.setEnabled(status != Status.end);
 		
 		String[] audienceKeys = new String[] {
 			AssessmentMode.Target.courseAndGroups.name(),
@@ -196,6 +204,7 @@ public class AssessmentModeEditController extends FormBasicController {
 			translate("target.groups")
 		};
 		targetEl = uifactory.addRadiosVertical("audience", "mode.target", formLayout, audienceKeys, audienceValues);
+		targetEl.setEnabled(status != Status.end);
 		Target target = assessmentMode.getTargetAudience();
 		if(target != null) {
 			for(String audienceKey:audienceKeys) {
@@ -214,7 +223,9 @@ public class AssessmentModeEditController extends FormBasicController {
 		formLayout.add(chooseGroupsCont);
 		
 		chooseGroupsButton = uifactory.addFormLink("choose.groups", chooseGroupsCont, Link.BUTTON);
+		chooseGroupsButton.setEnabled(status != Status.end);
 		chooseAreasButton = uifactory.addFormLink("choose.areas", chooseGroupsCont, Link.BUTTON);
+		chooseAreasButton.setEnabled(status != Status.end);
 
 		groupKeys = new ArrayList<>();
 		groupNames = new ArrayList<>();
@@ -238,6 +249,7 @@ public class AssessmentModeEditController extends FormBasicController {
 		courseElementsRestrictionEl = uifactory.addCheckboxesHorizontal("cer", "mode.course.element.restriction", formLayout, onKeys, onValues);
 		courseElementsRestrictionEl.addActionListener(FormEvent.ONCHANGE);
 		courseElementsRestrictionEl.select(onKeys[0], assessmentMode.isRestrictAccessElements());
+		courseElementsRestrictionEl.setEnabled(status != Status.end);
 		
 		String coursePage = velocity_root + "/choose_elements.html";
 		chooseElementsCont = FormLayoutContainer.createCustomFormLayout("chooseElements", getTranslator(), coursePage);
@@ -260,6 +272,7 @@ public class AssessmentModeEditController extends FormBasicController {
 		chooseElementsCont.getFormItemComponent().contextPut("elementNames", elementNames);
 		
 		chooseElementsButton = uifactory.addFormLink("choose.elements", chooseElementsCont, Link.BUTTON);
+		chooseElementsButton.setEnabled(status != Status.end);
 		
 		startElementKey = assessmentMode.getStartElement();
 		String startElementName = "";
@@ -268,32 +281,41 @@ public class AssessmentModeEditController extends FormBasicController {
 		}
 		startElementEl = uifactory.addStaticTextElement("mode.start.element", "mode.start.element", startElementName, formLayout);
 		chooseStartElementButton = uifactory.addFormLink("choose.start.element", formLayout, Link.BUTTON);
+		chooseStartElementButton.setEnabled(status != Status.end);
 
 		//ips
 		ipsEl = uifactory.addCheckboxesHorizontal("ips", "mode.ips", formLayout, onKeys, onValues);
 		ipsEl.select(onKeys[0], assessmentMode.isRestrictAccessIps());
 		ipsEl.addActionListener(FormEvent.ONCHANGE);
+		ipsEl.setEnabled(status != Status.end);
 		String ipList = assessmentMode.getIpList();
 		ipListEl = uifactory.addTextAreaElement("mode.ips.list", "mode.ips.list", 4096, 4, 60, false, ipList, formLayout);
 		ipListEl.setVisible(assessmentMode.isRestrictAccessIps());
+		ipListEl.setEnabled(status != Status.end);
 		
 		safeExamBrowserEl = uifactory.addCheckboxesHorizontal("safeexam", "mode.safeexambrowser", formLayout, onKeys, onValues);
 		safeExamBrowserEl.select(onKeys[0], assessmentMode.isSafeExamBrowser());
 		safeExamBrowserEl.addActionListener(FormEvent.ONCHANGE);
+		safeExamBrowserEl.setEnabled(status != Status.end);
 		String key = assessmentMode.getSafeExamBrowserKey();
 		safeExamBrowserKeyEl = uifactory.addTextAreaElement("safeexamkey", "mode.safeexambrowser.key", 4096, 6, 60, false, key, formLayout);
 		safeExamBrowserKeyEl.setVisible(assessmentMode.isSafeExamBrowser());
+		safeExamBrowserKeyEl.setEnabled(status != Status.end);
 		String hint = assessmentMode.getSafeExamBrowserHint();
 		safeExamBrowserHintEl = uifactory.addRichTextElementForStringData("safeexamhint", "mode.safeexambrowser.hint",
 				hint, 10, -1, false, null, null, formLayout, ureq.getUserSession(), getWindowControl());
 		safeExamBrowserHintEl.setVisible(assessmentMode.isSafeExamBrowser());
+		safeExamBrowserHintEl.setEnabled(status != Status.end);
 		
 		forCoachEl = uifactory.addCheckboxesHorizontal("forcoach", "mode.for.coach", formLayout, onKeys, onValues);
 		forCoachEl.select(onKeys[0], assessmentMode.isApplySettingsForCoach());
+		forCoachEl.setEnabled(status != Status.end);
 		
 		FormLayoutContainer buttonCont = FormLayoutContainer.createButtonLayout("button", getTranslator());
 		formLayout.add(buttonCont);
-		uifactory.addFormSubmitButton("save", buttonCont);
+		if(status != Status.end) {
+			uifactory.addFormSubmitButton("save", buttonCont);
+		}
 		uifactory.addFormCancelButton("cancel", buttonCont, ureq, getWindowControl());
 	}
 	
diff --git a/src/main/java/org/olat/course/assessment/ui/AssessmentModeGuardController.java b/src/main/java/org/olat/course/assessment/ui/AssessmentModeGuardController.java
index 411aca0a86f..8501784db16 100644
--- a/src/main/java/org/olat/course/assessment/ui/AssessmentModeGuardController.java
+++ b/src/main/java/org/olat/course/assessment/ui/AssessmentModeGuardController.java
@@ -409,9 +409,9 @@ public class AssessmentModeGuardController extends BasicController implements Ge
 			this.continueButton = continueButton;
 		}
 		
-		public void sync(String status, String errors, TransientAssessmentMode mode, Locale locale) {
-			this.errors = errors;
-			this.status = status;
+		public void sync(String newStatus, String newErrors, TransientAssessmentMode mode, Locale locale) {
+			errors = newErrors;
+			status = newStatus;
 			
 			reference = mode;
 			name = mode.getName();
diff --git a/src/main/java/org/olat/course/assessment/ui/AssessmentModeListController.java b/src/main/java/org/olat/course/assessment/ui/AssessmentModeListController.java
index a85203d887c..a8e59cd1de4 100644
--- a/src/main/java/org/olat/course/assessment/ui/AssessmentModeListController.java
+++ b/src/main/java/org/olat/course/assessment/ui/AssessmentModeListController.java
@@ -71,7 +71,7 @@ public class AssessmentModeListController extends FormBasicController implements
 	private AssessmentModeListModel model;
 	private final TooledStackedPanel toolbarPanel;
 
-	private DialogBoxController deleteDialogBox;
+	private DialogBoxController startDialogBox, stopDialogBox,deleteDialogBox;
 	private AssessmentModeEditController editCtrl;
 	
 	private final RepositoryEntry entry;
@@ -161,11 +161,20 @@ public class AssessmentModeListController extends FormBasicController implements
 			removeAsListenerAndDispose(editCtrl);
 			editCtrl = null;
 		} else if(deleteDialogBox == source) {
-			if(DialogBoxUIFactory.isYesEvent(event)) {
+			if(DialogBoxUIFactory.isYesEvent(event) || DialogBoxUIFactory.isOkEvent(event)) {
 				@SuppressWarnings("unchecked")
 				List<AssessmentMode> rows = (List<AssessmentMode>)deleteDialogBox.getUserObject();
 				doDelete(rows);
-				loadModel();
+			}
+		} else if(startDialogBox == source) {
+			if(DialogBoxUIFactory.isYesEvent(event) || DialogBoxUIFactory.isOkEvent(event)) {
+				AssessmentMode row = (AssessmentMode)startDialogBox.getUserObject();
+				doStart(row);
+			}
+		} else if(stopDialogBox == source) {
+			if(DialogBoxUIFactory.isYesEvent(event) || DialogBoxUIFactory.isOkEvent(event)) {
+				AssessmentMode row = (AssessmentMode)stopDialogBox.getUserObject();
+				doStop(row);
 			}
 		}
 		super.event(ureq, source, event);
@@ -208,9 +217,9 @@ public class AssessmentModeListController extends FormBasicController implements
 				if("edit".equals(cmd)) {
 					doEdit(ureq, row);
 				} else if("start".equals(cmd)) {
-					doStart(ureq, row);
+					doConfirmStart(ureq, row);
 				} else if("stop".equals(cmd)) {
-					doStop(ureq, row);
+					doConfirmStop(ureq, row);
 				}
 			}
 		}
@@ -248,6 +257,7 @@ public class AssessmentModeListController extends FormBasicController implements
 		for(AssessmentMode modeToDelete:modesToDelete) {
 			assessmentModeMgr.delete(modeToDelete);
 		}
+		loadModel();
 	}
 	
 	private void doEdit(UserRequest ureq, AssessmentMode mode) {
@@ -256,13 +266,27 @@ public class AssessmentModeListController extends FormBasicController implements
 		listenTo(editCtrl);
 		toolbarPanel.pushController(translate("new.mode"), editCtrl);
 	}
+	
+	private void doConfirmStart(UserRequest ureq, AssessmentMode mode) {
+		String title = translate("confirm.start.title");
+		String text = translate("confirm.start.text");
+		startDialogBox = activateYesNoDialog(ureq, title, text, startDialogBox);
+		startDialogBox.setUserObject(mode);
+	}
 
-	private void doStart(UserRequest ureq, AssessmentMode mode) {
+	private void doStart(AssessmentMode mode) {
 		assessmentModeCoordinationService.startAssessment(mode);
 		loadModel();
 	}
 	
-	private void doStop(UserRequest ureq, AssessmentMode mode) {
+	private void doConfirmStop(UserRequest ureq, AssessmentMode mode) {
+		String title = translate("confirm.stop.title");
+		String text = translate("confirm.stop.text");
+		stopDialogBox = activateYesNoDialog(ureq, title, text, stopDialogBox);
+		stopDialogBox.setUserObject(mode);
+	}
+	
+	private void doStop(AssessmentMode mode) {
 		assessmentModeCoordinationService.stopAssessment(mode);
 		loadModel();
 	}
diff --git a/src/main/java/org/olat/course/assessment/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/assessment/ui/_i18n/LocalStrings_de.properties
index cbc90e6ebe2..487d4f80886 100644
--- a/src/main/java/org/olat/course/assessment/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/assessment/ui/_i18n/LocalStrings_de.properties
@@ -8,12 +8,16 @@ choose.groups=Gruppen ausw\u00E4hlen
 choose.start.element=Kursbaustein ausw\u00E4hlen
 confirm.delete.title=Pr\u00FCfungsettings l\u00F6schen
 confirm.delete.text=Wollen Sie wirklich diese Pr\u00FCfungsettings "{0}" l\u00F6schen?
+confirm.start.title=Pr\u00FCfung starten
+confirm.start.text=Wollen Sie die Pr\u00FCfung jetzt starten?
 confirm.status.change.title=Status von Pr\u00FCfungssettings wird ge\u00E4ndert
 confirm.status.change.none=Pr\u00FCfung wird als nicht gestartet gesetzt.
 confirm.status.change.leadtime=Pr\u00FCfung ist in Vorlaufzeit.
 confirm.status.change.assessment=Pr\u00FCfung wird gestartet.
 confirm.status.change.followup=Pr\u00FCfung ist in Nachlaufzeit.
 confirm.status.change.end=Pr\u00FCfung wird beendet.
+confirm.stop.title=Pr\u00FCfung beenden
+confirm.stop.text=Wollen Sie die Pr\u00FCfung jetzt beenden?
 current.mode=Aktuelle Pr\u00FCfung
 current.mode.continue=Zur\u00FCck zu OpenOLAT
 current.mode.desc=Im folgenden Kurs ist f\u00FCr den aktuellen Zeitraum eine Pr\u00FCfung f\u00FCr Sie vorgesehen. W\u00E4hrend dieser Pr\u00FCfung k\u00F6nnen keine anderen Funktionen in OpenOLAT verwendet werden:
diff --git a/src/main/java/org/olat/course/run/RunMainController.java b/src/main/java/org/olat/course/run/RunMainController.java
index 9f16fd7d80b..6f5c396ad2e 100644
--- a/src/main/java/org/olat/course/run/RunMainController.java
+++ b/src/main/java/org/olat/course/run/RunMainController.java
@@ -199,7 +199,7 @@ public class RunMainController extends MainLayoutBasicController implements Gene
 		uce.getScoreAccounting().evaluateAll();
 		
 		if(assessmentMode != null && assessmentMode.isRestrictAccessElements()) {
-			treeFilter = new AssessmentModeTreeFilter(assessmentMode);
+			treeFilter = new AssessmentModeTreeFilter(assessmentMode, uce.getCourseEnvironment().getRunStructure());
 		} else {
 			treeFilter = new VisibleTreeFilter();
 		}
diff --git a/src/main/java/org/olat/course/run/userview/AssessmentModeTreeFilter.java b/src/main/java/org/olat/course/run/userview/AssessmentModeTreeFilter.java
index 46d7026195b..ada79e28c2d 100644
--- a/src/main/java/org/olat/course/run/userview/AssessmentModeTreeFilter.java
+++ b/src/main/java/org/olat/course/run/userview/AssessmentModeTreeFilter.java
@@ -23,6 +23,8 @@ import java.util.HashSet;
 import java.util.Set;
 
 import org.olat.core.util.StringHelper;
+import org.olat.core.util.nodes.INode;
+import org.olat.course.Structure;
 import org.olat.course.assessment.AssessmentMode;
 import org.olat.course.nodes.CourseNode;
 
@@ -37,14 +39,17 @@ public class AssessmentModeTreeFilter implements TreeFilter {
 	private final boolean enable;
 	private final Set<String> nodeIds = new HashSet<>();
 	
-	public AssessmentModeTreeFilter(AssessmentMode mode) {
+	public AssessmentModeTreeFilter(AssessmentMode mode, Structure structure) {
 		String nodes = mode.getElementList();
 		if(StringHelper.containsNonWhitespace(nodes)) {
 			enable = true;
 			
 			String[] nodeIdArr = nodes.split(",");
 			for(String nodeId:nodeIdArr) {
-				nodeIds.add(nodeId);
+				//allow the parent line
+				for(INode courseNode = structure.getNode(nodeId); courseNode != null; courseNode = courseNode.getParent()) {
+					nodeIds.add(courseNode.getIdent());
+				}
 			}
 		} else {
 			enable = false;
@@ -55,5 +60,4 @@ public class AssessmentModeTreeFilter implements TreeFilter {
 	public boolean isVisible(CourseNode node) {
 		return !enable || nodeIds.contains(node.getIdent());
 	}
-
-}
+}
\ No newline at end of file
-- 
GitLab