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