Skip to content
Snippets Groups Projects
Commit 450f7c39 authored by uhensler's avatar uhensler
Browse files

OO-5338: Participation deadline for course element form

parent 84825ed2
No related branches found
No related tags found
No related merge requests found
...@@ -93,6 +93,7 @@ public class FormCourseNode extends AbstractAccessableCourseNode { ...@@ -93,6 +93,7 @@ public class FormCourseNode extends AbstractAccessableCourseNode {
.build(); .build();
public static final String CONFIG_KEY_REPOSITORY_SOFTKEY = "repository.softkey"; public static final String CONFIG_KEY_REPOSITORY_SOFTKEY = "repository.softkey";
public static final String CONFIG_KEY_PARTICIPATION_DEADLINE = "participation.deadline";
public static final String CONFIG_KEY_CONFIRMATION_ENABLED = "confirmation.enabled"; public static final String CONFIG_KEY_CONFIRMATION_ENABLED = "confirmation.enabled";
public FormCourseNode() { public FormCourseNode() {
...@@ -176,14 +177,6 @@ public class FormCourseNode extends AbstractAccessableCourseNode { ...@@ -176,14 +177,6 @@ public class FormCourseNode extends AbstractAccessableCourseNode {
List<StatusDescription> statusDescs = isConfigValidWithTranslator(cev, translatorStr, getConditionExpressions()); List<StatusDescription> statusDescs = isConfigValidWithTranslator(cev, translatorStr, getConditionExpressions());
return StatusDescriptionHelper.sort(statusDescs); return StatusDescriptionHelper.sort(statusDescs);
} }
@Override
public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
ModuleConfiguration config = getModuleConfiguration();
if (isNewNode) {
//
}
}
@Override @Override
public void exportNode(File exportDirectory, ICourse course) { public void exportNode(File exportDirectory, ICourse course) {
......
...@@ -74,6 +74,8 @@ public interface FormManager { ...@@ -74,6 +74,8 @@ public interface FormManager {
public EvaluationFormSession loadOrCreateSesssion(EvaluationFormParticipation participation); public EvaluationFormSession loadOrCreateSesssion(EvaluationFormParticipation participation);
public EvaluationFormSession getDoneSession(EvaluationFormSurvey survey, Identity identity);
public void onQuickSave(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Double completion); public void onQuickSave(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Double completion);
public void onExecutionFinished(CourseNode courseNode, UserCourseEnvironment userCourseEnv); public void onExecutionFinished(CourseNode courseNode, UserCourseEnvironment userCourseEnv);
......
...@@ -46,6 +46,7 @@ import org.olat.modules.ceditor.DataStorage; ...@@ -46,6 +46,7 @@ import org.olat.modules.ceditor.DataStorage;
import org.olat.modules.forms.EvaluationFormManager; import org.olat.modules.forms.EvaluationFormManager;
import org.olat.modules.forms.EvaluationFormParticipation; import org.olat.modules.forms.EvaluationFormParticipation;
import org.olat.modules.forms.EvaluationFormSession; import org.olat.modules.forms.EvaluationFormSession;
import org.olat.modules.forms.EvaluationFormSessionStatus;
import org.olat.modules.forms.EvaluationFormSurvey; import org.olat.modules.forms.EvaluationFormSurvey;
import org.olat.modules.forms.EvaluationFormSurveyIdentifier; import org.olat.modules.forms.EvaluationFormSurveyIdentifier;
import org.olat.modules.forms.SessionFilter; import org.olat.modules.forms.SessionFilter;
...@@ -169,6 +170,18 @@ public class FormManagerImpl implements FormManager { ...@@ -169,6 +170,18 @@ public class FormManagerImpl implements FormManager {
} }
return session; return session;
} }
@Override
public EvaluationFormSession getDoneSession(EvaluationFormSurvey survey, Identity identity) {
EvaluationFormParticipation participation = loadParticipation(survey, identity);
if (participation != null) {
EvaluationFormSession session = evaluationFormManager.loadSessionByParticipation(participation);
if (EvaluationFormSessionStatus.done == session.getEvaluationFormSessionStatus()) {
return session;
}
}
return null;
}
@Override @Override
public void onQuickSave(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Double competion) { public void onQuickSave(CourseNode courseNode, UserCourseEnvironment userCourseEnv, Double competion) {
......
...@@ -20,12 +20,14 @@ ...@@ -20,12 +20,14 @@
package org.olat.course.nodes.form.ui; package org.olat.course.nodes.form.ui;
import java.io.File; import java.io.File;
import java.util.Date;
import org.olat.NewControllerFactory; import org.olat.NewControllerFactory;
import org.olat.core.commons.fullWebApp.LayoutMain3ColsPreviewController; import org.olat.core.commons.fullWebApp.LayoutMain3ColsPreviewController;
import org.olat.core.gui.UserRequest; import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItem;
import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.FormItemContainer;
import org.olat.core.gui.components.form.flexible.elements.DateChooser;
import org.olat.core.gui.components.form.flexible.elements.FormLink; import org.olat.core.gui.components.form.flexible.elements.FormLink;
import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
import org.olat.core.gui.components.form.flexible.elements.StaticTextElement; import org.olat.core.gui.components.form.flexible.elements.StaticTextElement;
...@@ -68,6 +70,7 @@ public class FormConfigController extends FormBasicController { ...@@ -68,6 +70,7 @@ public class FormConfigController extends FormBasicController {
private FormLink chooseLink; private FormLink chooseLink;
private FormLink replaceLink; private FormLink replaceLink;
private FormLink editLink; private FormLink editLink;
private DateChooser participationDeadlineEl;
private MultipleSelectionElement confirmationEl; private MultipleSelectionElement confirmationEl;
private CloseableModalController cmc; private CloseableModalController cmc;
...@@ -108,6 +111,10 @@ public class FormConfigController extends FormBasicController { ...@@ -108,6 +111,10 @@ public class FormConfigController extends FormBasicController {
replaceLink = uifactory.addFormLink("edit.replace", buttonsCont, "btn btn-default o_xsmall"); replaceLink = uifactory.addFormLink("edit.replace", buttonsCont, "btn btn-default o_xsmall");
editLink = uifactory.addFormLink("edit.edit", buttonsCont, "btn btn-default o_xsmall"); editLink = uifactory.addFormLink("edit.edit", buttonsCont, "btn btn-default o_xsmall");
Date participationDeadline = config.getDateValue(FormCourseNode.CONFIG_KEY_PARTICIPATION_DEADLINE);
participationDeadlineEl = uifactory.addDateChooser("edit.participation.deadline", participationDeadline, formLayout);
participationDeadlineEl.addActionListener(FormEvent.ONCHANGE);
confirmationEl = uifactory.addCheckboxesVertical("edit.confirmation.enabled", formLayout, ON_KEYS, confirmationEl = uifactory.addCheckboxesVertical("edit.confirmation.enabled", formLayout, ON_KEYS,
TranslatorHelper.translateAll(getTranslator(), ON_KEYS), 1); TranslatorHelper.translateAll(getTranslator(), ON_KEYS), 1);
confirmationEl.addActionListener(FormEvent.ONCHANGE); confirmationEl.addActionListener(FormEvent.ONCHANGE);
...@@ -147,6 +154,8 @@ public class FormConfigController extends FormBasicController { ...@@ -147,6 +154,8 @@ public class FormConfigController extends FormBasicController {
doEditevaluationForm(ureq); doEditevaluationForm(ureq);
} else if (source == evaluationFormLink) { } else if (source == evaluationFormLink) {
doPreviewEvaluationForm(ureq); doPreviewEvaluationForm(ureq);
} else if (source == participationDeadlineEl) {
setParticipationDeadline(ureq);
} else if (source == confirmationEl) { } else if (source == confirmationEl) {
setConfirmation(ureq); setConfirmation(ureq);
} }
...@@ -231,6 +240,11 @@ public class FormConfigController extends FormBasicController { ...@@ -231,6 +240,11 @@ public class FormConfigController extends FormBasicController {
listenTo(previewCtr); listenTo(previewCtr);
} }
private void setParticipationDeadline(UserRequest ureq) {
config.setDateValue(FormCourseNode.CONFIG_KEY_PARTICIPATION_DEADLINE, participationDeadlineEl.getDate());
fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT);
}
private void setConfirmation(UserRequest ureq) { private void setConfirmation(UserRequest ureq) {
config.setBooleanEntry(FormCourseNode.CONFIG_KEY_CONFIRMATION_ENABLED, confirmationEl.isAtLeastSelected(1)); config.setBooleanEntry(FormCourseNode.CONFIG_KEY_CONFIRMATION_ENABLED, confirmationEl.isAtLeastSelected(1));
fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT);
......
...@@ -19,12 +19,16 @@ ...@@ -19,12 +19,16 @@
*/ */
package org.olat.course.nodes.form.ui; package org.olat.course.nodes.form.ui;
import java.util.Date;
import org.olat.core.gui.UserRequest; import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component; import org.olat.core.gui.components.Component;
import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Event; import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.controller.BasicController; import org.olat.core.gui.control.controller.BasicController;
import org.olat.core.gui.control.generic.messages.MessageController;
import org.olat.core.gui.control.generic.messages.MessageUIFactory;
import org.olat.course.nodes.FormCourseNode; import org.olat.course.nodes.FormCourseNode;
import org.olat.course.nodes.form.FormManager; import org.olat.course.nodes.form.FormManager;
import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironment;
...@@ -45,7 +49,8 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -45,7 +49,8 @@ import org.springframework.beans.factory.annotation.Autowired;
*/ */
public class FormRunController extends BasicController { public class FormRunController extends BasicController {
private final EvaluationFormExecutionController executionCtrl; private EvaluationFormExecutionController executionCtrl;
private MessageController messageCtrl;
private final FormCourseNode courseNode; private final FormCourseNode courseNode;
private final UserCourseEnvironment userCourseEnv; private final UserCourseEnvironment userCourseEnv;
...@@ -61,11 +66,26 @@ public class FormRunController extends BasicController { ...@@ -61,11 +66,26 @@ public class FormRunController extends BasicController {
RepositoryEntry courseEntry = userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); RepositoryEntry courseEntry = userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
EvaluationFormSurveyIdentifier surveyIdent = formManager.getSurveyIdentifier(courseNode, courseEntry); EvaluationFormSurveyIdentifier surveyIdent = formManager.getSurveyIdentifier(courseNode, courseEntry);
EvaluationFormSurvey survey = formManager.loadSurvey(surveyIdent); EvaluationFormSurvey survey = formManager.loadSurvey(surveyIdent);
EvaluationFormParticipation participation = formManager.loadOrCreateParticipation(survey, getIdentity()); if (checkDeadline()) {
EvaluationFormSession session = formManager.loadOrCreateSesssion(participation); EvaluationFormParticipation participation = formManager.loadOrCreateParticipation(survey, getIdentity());
executionCtrl = new EvaluationFormExecutionController(ureq, getWindowControl(), session, FormCourseNode.EMPTY_STATE); EvaluationFormSession session = formManager.loadOrCreateSesssion(participation);
listenTo(executionCtrl); executionCtrl = new EvaluationFormExecutionController(ureq, getWindowControl(), session, FormCourseNode.EMPTY_STATE);
putInitialPanel(executionCtrl.getInitialComponent()); listenTo(executionCtrl);
putInitialPanel(executionCtrl.getInitialComponent());
} else {
EvaluationFormSession session = formManager.getDoneSession(survey, getIdentity());
if (session != null) {
executionCtrl = new EvaluationFormExecutionController(ureq, getWindowControl(), session, FormCourseNode.EMPTY_STATE);
listenTo(executionCtrl);
putInitialPanel(executionCtrl.getInitialComponent());
} else {
String title = translate("participation.deadline.over.title");
String text = translate("participation.deadline.over.text");
messageCtrl = MessageUIFactory.createInfoMessage(ureq, wControl, title, text);
listenTo(messageCtrl);
putInitialPanel(messageCtrl.getInitialComponent());
}
}
} }
@Override @Override
...@@ -91,6 +111,11 @@ public class FormRunController extends BasicController { ...@@ -91,6 +111,11 @@ public class FormRunController extends BasicController {
// //
} }
private boolean checkDeadline() {
Date deadline = courseNode.getModuleConfiguration().getDateValue(FormCourseNode.CONFIG_KEY_PARTICIPATION_DEADLINE);
return deadline == null || deadline.after(new Date());
}
private void doExecutionFinished(UserRequest ureq) { private void doExecutionFinished(UserRequest ureq) {
formManager.onExecutionFinished(courseNode, userCourseEnv); formManager.onExecutionFinished(courseNode, userCourseEnv);
fireEvent(ureq, Event.CHANGED_EVENT); fireEvent(ureq, Event.CHANGED_EVENT);
......
...@@ -8,6 +8,7 @@ edit.preview=Vorschau ...@@ -8,6 +8,7 @@ edit.preview=Vorschau
edit.evaluation.form=Formular edit.evaluation.form=Formular
edit.evaluation.form.link={0} edit.evaluation.form.link={0}
edit.evaluation.form.not.choosen=Kein Formular ausw\u00E4hlt edit.evaluation.form.not.choosen=Kein Formular ausw\u00E4hlt
edit.participation.deadline=Teilnahme bis ...
edit.replace=Ersetzen edit.replace=Ersetzen
edit.title=Formular edit.title=Formular
error.repo.no.key.long=F\u00FCr "{0}" muss in der Konfiguration ein Formular im Reiter "Formular" ausgew\u00E4hlt werden. error.repo.no.key.long=F\u00FCr "{0}" muss in der Konfiguration ein Formular im Reiter "Formular" ausgew\u00E4hlt werden.
...@@ -20,6 +21,8 @@ fully.assessed.trigger.status.done=Formular ausgef\u00FCllt ...@@ -20,6 +21,8 @@ fully.assessed.trigger.status.done=Formular ausgef\u00FCllt
mail.confirmation.body=*** Das ist eine automatisch generierte Nachricht. Bitte antworten Sie nicht auf diese Nachricht ***\r\n\r\nHiermit wird best\u00E4tigt, dass $userDisplayName das Formular am $participationDate um $participationTime ausgef\u00FCllt hat.\r\n\r\nKurs: $courseName\r\nKursbaustein: $courseNodeShortName mail.confirmation.body=*** Das ist eine automatisch generierte Nachricht. Bitte antworten Sie nicht auf diese Nachricht ***\r\n\r\nHiermit wird best\u00E4tigt, dass $userDisplayName das Formular am $participationDate um $participationTime ausgef\u00FCllt hat.\r\n\r\nKurs: $courseName\r\nKursbaustein: $courseNodeShortName
mail.confirmation.subject=Teilnahmebest\u00E4tigung "$courseNodeShortName" mail.confirmation.subject=Teilnahmebest\u00E4tigung "$courseNodeShortName"
pane.tab.config=Formular pane.tab.config=Formular
participation.deadline.over.text=Der Abgabetermin ist vorbei. Sie k\u00F6nnen das Formular nicht mehr ausf\u00FCllen.
participation.deadline.over.title=Abgabetermin vorbei
participation.status.done=Ausgef\u00FCllt participation.status.done=Ausgef\u00FCllt
participation.status.inProgress=Gestartet participation.status.inProgress=Gestartet
participation.status.notStart=Nicht gestartet participation.status.notStart=Nicht gestartet
......
...@@ -8,6 +8,7 @@ edit.preview=Preview ...@@ -8,6 +8,7 @@ edit.preview=Preview
edit.evaluation.form=Form edit.evaluation.form=Form
edit.evaluation.form.link={0} edit.evaluation.form.link={0}
edit.evaluation.form.not.choosen=No form chosen edit.evaluation.form.not.choosen=No form chosen
edit.participation.deadline=Participation deadline
edit.replace=Replace edit.replace=Replace
edit.title=Form edit.title=Form
error.repo.no.key.long=For "{0}" you have to select a form in the tab "Form" within the configuration section. error.repo.no.key.long=For "{0}" you have to select a form in the tab "Form" within the configuration section.
...@@ -20,6 +21,8 @@ mail.confirmation.subject=Participation confirmation "$courseNodeShortName" ...@@ -20,6 +21,8 @@ mail.confirmation.subject=Participation confirmation "$courseNodeShortName"
form.not.filled.in=The user has not yet filled in the form. form.not.filled.in=The user has not yet filled in the form.
fully.assessed.trigger.status.done=Form filled in fully.assessed.trigger.status.done=Form filled in
pane.tab.config=Form pane.tab.config=Form
participation.deadline.over.text=The participation deadline is over. You can no longer fill in the form.
participation.deadline.over.title=Participation deadline over
participation.status.done=Done participation.status.done=Done
participation.status.inProgress=In progress participation.status.inProgress=In progress
participation.status.notStart=Not started participation.status.notStart=Not started
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment