Skip to content
Snippets Groups Projects
Commit a572aa38 authored by srosse's avatar srosse
Browse files

OO-2011: implement concurrent edit / collect of documents by coaches

parent b7e7069c
No related branches found
No related tags found
No related merge requests found
...@@ -38,6 +38,7 @@ import org.olat.core.gui.control.generic.modal.DialogBoxController; ...@@ -38,6 +38,7 @@ import org.olat.core.gui.control.generic.modal.DialogBoxController;
import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
import org.olat.core.id.Identity; import org.olat.core.id.Identity;
import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.coordinate.CoordinatorManager;
import org.olat.core.util.io.SystemFilenameFilter;
import org.olat.core.util.mail.ContactList; import org.olat.core.util.mail.ContactList;
import org.olat.core.util.mail.ContactMessage; import org.olat.core.util.mail.ContactMessage;
import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSContainer;
...@@ -45,6 +46,7 @@ import org.olat.course.nodes.GTACourseNode; ...@@ -45,6 +46,7 @@ import org.olat.course.nodes.GTACourseNode;
import org.olat.course.nodes.gta.GTAType; import org.olat.course.nodes.gta.GTAType;
import org.olat.course.nodes.gta.Task; import org.olat.course.nodes.gta.Task;
import org.olat.course.nodes.gta.TaskHelper; import org.olat.course.nodes.gta.TaskHelper;
import org.olat.course.nodes.gta.TaskHelper.FilesLocked;
import org.olat.course.nodes.gta.TaskProcess; import org.olat.course.nodes.gta.TaskProcess;
import org.olat.course.nodes.gta.model.TaskDefinition; import org.olat.course.nodes.gta.model.TaskDefinition;
import org.olat.course.nodes.gta.ui.events.SubmitEvent; import org.olat.course.nodes.gta.ui.events.SubmitEvent;
...@@ -357,10 +359,10 @@ public class GTACoachController extends GTAAbstractController { ...@@ -357,10 +359,10 @@ public class GTACoachController extends GTAAbstractController {
if(GTAType.individual.name().equals(config.getStringValue(GTACourseNode.GTASK_TYPE))) { if(GTAType.individual.name().equals(config.getStringValue(GTACourseNode.GTASK_TYPE))) {
UserCourseEnvironment assessedUserCourseEnv = getAssessedUserCourseEnvironment(); UserCourseEnvironment assessedUserCourseEnv = getAssessedUserCourseEnvironment();
revisionDocumentsCtrl = new GTACoachRevisionAndCorrectionsController(ureq, getWindowControl(), revisionDocumentsCtrl = new GTACoachRevisionAndCorrectionsController(ureq, getWindowControl(),
courseEnv, assignedTask, gtaNode, assessedGroup, assessedIdentity, assessedUserCourseEnv); courseEnv, assignedTask, gtaNode, assessedGroup, assessedIdentity, assessedUserCourseEnv, taskListEventResource);
} else { } else {
revisionDocumentsCtrl = new GTACoachRevisionAndCorrectionsController(ureq, getWindowControl(), revisionDocumentsCtrl = new GTACoachRevisionAndCorrectionsController(ureq, getWindowControl(),
courseEnv, assignedTask, gtaNode, assessedGroup, null, null); courseEnv, assignedTask, gtaNode, assessedGroup, null, null, taskListEventResource);
} }
listenTo(revisionDocumentsCtrl); listenTo(revisionDocumentsCtrl);
mainVC.put("revisionDocs", revisionDocumentsCtrl.getInitialComponent()); mainVC.put("revisionDocs", revisionDocumentsCtrl.getInitialComponent());
...@@ -594,13 +596,30 @@ public class GTACoachController extends GTAAbstractController { ...@@ -594,13 +596,30 @@ public class GTACoachController extends GTAAbstractController {
} else if (assessedIdentity != null) { } else if (assessedIdentity != null) {
toName = userManager.getUserDisplayName(assessedIdentity); toName = userManager.getUserDisplayName(assessedIdentity);
} }
String title = translate("coach.collect.confirm.title"); File[] submittedDocuments;
String text = translate("coach.collect.confirm.text", new String[]{ toName }); VFSContainer documentsContainer;
text = "<div class='o_warning'>" + text + "</div>"; if(GTAType.group.name().equals(config.getStringValue(GTACourseNode.GTASK_TYPE))) {
confirmCollectCtrl = activateOkCancelDialog(ureq, title, text, confirmCollectCtrl); documentsContainer = gtaManager.getSubmitContainer(courseEnv, gtaNode, assessedGroup);
confirmCollectCtrl.setUserObject(assignedTask); File documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, assessedGroup);
listenTo(confirmCollectCtrl); submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false));
} else {
documentsContainer = gtaManager.getSubmitContainer(courseEnv, gtaNode, getIdentity());
File documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, getIdentity());
submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false));
}
FilesLocked lockedBy = TaskHelper.getDocumentsLocked(documentsContainer, submittedDocuments);
if(lockedBy != null) {
showWarning("warning.submit.documents.edited", new String[]{ lockedBy.getLockedBy(), lockedBy.getLockedFiles() });
} else {
String title = translate("coach.collect.confirm.title");
String text = translate("coach.collect.confirm.text", new String[]{ toName });
text = "<div class='o_warning'>" + text + "</div>";
confirmCollectCtrl = activateOkCancelDialog(ureq, title, text, confirmCollectCtrl);
confirmCollectCtrl.setUserObject(assignedTask);
listenTo(confirmCollectCtrl);
}
} }
private void doCollectTask(UserRequest ureq, Task task) { private void doCollectTask(UserRequest ureq, Task task) {
......
...@@ -37,6 +37,9 @@ import org.olat.core.gui.control.controller.BasicController; ...@@ -37,6 +37,9 @@ import org.olat.core.gui.control.controller.BasicController;
import org.olat.core.gui.control.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.modal.DialogBoxController;
import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
import org.olat.core.id.Identity; import org.olat.core.id.Identity;
import org.olat.core.id.OLATResourceable;
import org.olat.core.util.coordinate.CoordinatorManager;
import org.olat.core.util.io.SystemFilenameFilter;
import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSContainer;
import org.olat.course.CourseFactory; import org.olat.course.CourseFactory;
import org.olat.course.ICourse; import org.olat.course.ICourse;
...@@ -47,8 +50,10 @@ import org.olat.course.nodes.gta.GTAManager; ...@@ -47,8 +50,10 @@ import org.olat.course.nodes.gta.GTAManager;
import org.olat.course.nodes.gta.GTAType; import org.olat.course.nodes.gta.GTAType;
import org.olat.course.nodes.gta.Task; import org.olat.course.nodes.gta.Task;
import org.olat.course.nodes.gta.TaskHelper; import org.olat.course.nodes.gta.TaskHelper;
import org.olat.course.nodes.gta.TaskHelper.FilesLocked;
import org.olat.course.nodes.gta.TaskProcess; import org.olat.course.nodes.gta.TaskProcess;
import org.olat.course.nodes.gta.ui.events.SubmitEvent; import org.olat.course.nodes.gta.ui.events.SubmitEvent;
import org.olat.course.nodes.gta.ui.events.TaskMultiUserEvent;
import org.olat.course.run.environment.CourseEnvironment; import org.olat.course.run.environment.CourseEnvironment;
import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroup;
...@@ -77,6 +82,7 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController { ...@@ -77,6 +82,7 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController {
private final Identity assessedIdentity; private final Identity assessedIdentity;
private final BusinessGroup assessedGroup; private final BusinessGroup assessedGroup;
private final CourseEnvironment courseEnv; private final CourseEnvironment courseEnv;
private final OLATResourceable taskListEventResource;
private final UserCourseEnvironment assessedUserCourseEnv; private final UserCourseEnvironment assessedUserCourseEnv;
@Autowired @Autowired
...@@ -88,7 +94,7 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController { ...@@ -88,7 +94,7 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController {
public GTACoachRevisionAndCorrectionsController(UserRequest ureq, WindowControl wControl, CourseEnvironment courseEnv, public GTACoachRevisionAndCorrectionsController(UserRequest ureq, WindowControl wControl, CourseEnvironment courseEnv,
Task assignedTask, GTACourseNode gtaNode, BusinessGroup assessedGroup, Task assignedTask, GTACourseNode gtaNode, BusinessGroup assessedGroup,
Identity assessedIdentity, UserCourseEnvironment assessedUserCourseEnv) { Identity assessedIdentity, UserCourseEnvironment assessedUserCourseEnv, OLATResourceable taskListEventResource) {
super(ureq, wControl); super(ureq, wControl);
this.gtaNode = gtaNode; this.gtaNode = gtaNode;
this.courseEnv = courseEnv; this.courseEnv = courseEnv;
...@@ -96,6 +102,7 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController { ...@@ -96,6 +102,7 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController {
this.assessedGroup = assessedGroup; this.assessedGroup = assessedGroup;
this.assessedIdentity = assessedIdentity; this.assessedIdentity = assessedIdentity;
this.assessedUserCourseEnv = assessedUserCourseEnv; this.assessedUserCourseEnv = assessedUserCourseEnv;
this.taskListEventResource = taskListEventResource;
this.businessGroupTask = GTAType.group.name().equals(gtaNode.getModuleConfiguration().getStringValue(GTACourseNode.GTASK_TYPE)); this.businessGroupTask = GTAType.group.name().equals(gtaNode.getModuleConfiguration().getStringValue(GTACourseNode.GTASK_TYPE));
currentIteration = assignedTask.getRevisionLoop(); currentIteration = assignedTask.getRevisionLoop();
...@@ -312,11 +319,29 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController { ...@@ -312,11 +319,29 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController {
toName = userManager.getUserDisplayName(assessedIdentity); toName = userManager.getUserDisplayName(assessedIdentity);
} }
String title = translate("coach.collect.revisions.confirm.title"); File[] submittedDocuments;
String text = translate("coach.collect.revisions.confirm.text", new String[]{ toName }); VFSContainer documentsContainer;
text = "<div class='o_warning'>" + text + "</div>"; int iteration = assignedTask.getRevisionLoop();
confirmCollectCtrl = activateOkCancelDialog(ureq, title, text, confirmCollectCtrl); if(GTAType.group.name().equals(gtaNode.getModuleConfiguration().getStringValue(GTACourseNode.GTASK_TYPE))) {
listenTo(confirmCollectCtrl); documentsContainer = gtaManager.getRevisedDocumentsContainer(courseEnv, gtaNode, iteration, assessedGroup);
File documentsDir = gtaManager.getRevisedDocumentsDirectory(courseEnv, gtaNode, iteration, assessedGroup);
submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false));
} else {
documentsContainer = gtaManager.getRevisedDocumentsContainer(courseEnv, gtaNode, iteration, getIdentity());
File documentsDir = gtaManager.getRevisedDocumentsDirectory(courseEnv, gtaNode, iteration, getIdentity());
submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false));
}
FilesLocked lockedBy = TaskHelper.getDocumentsLocked(documentsContainer, submittedDocuments);
if(lockedBy != null) {
showWarning("warning.submit.documents.edited", new String[]{ lockedBy.getLockedBy(), lockedBy.getLockedFiles() });
} else {
String title = translate("coach.collect.revisions.confirm.title");
String text = translate("coach.collect.revisions.confirm.text", new String[]{ toName });
text = "<div class='o_warning'>" + text + "</div>";
confirmCollectCtrl = activateOkCancelDialog(ureq, title, text, confirmCollectCtrl);
listenTo(confirmCollectCtrl);
}
} }
private void doCollect() { private void doCollect() {
...@@ -335,6 +360,11 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController { ...@@ -335,6 +360,11 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController {
} else { } else {
gtaNode.incrementUserAttempts(assessedUserCourseEnv); gtaNode.incrementUserAttempts(assessedUserCourseEnv);
} }
TaskMultiUserEvent event = new TaskMultiUserEvent(TaskMultiUserEvent.SUBMIT_REVISION,
assessedGroup == null ? getIdentity() : null, assessedGroup, getIdentity());
CoordinatorManager.getInstance().getCoordinator().getEventBus()
.fireEventToListenersOf(event, taskListEventResource);
} }
private void doReturnToRevisions() { private void doReturnToRevisions() {
......
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