diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java index a327e916bea1072ed9b1858844061677b5d4dc5c..7f8cbbcc3760a16d8bd840f384181d156f2ac11c 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java @@ -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.id.Identity; 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.ContactMessage; import org.olat.core.util.vfs.VFSContainer; @@ -45,6 +46,7 @@ import org.olat.course.nodes.GTACourseNode; import org.olat.course.nodes.gta.GTAType; import org.olat.course.nodes.gta.Task; 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.model.TaskDefinition; import org.olat.course.nodes.gta.ui.events.SubmitEvent; @@ -357,10 +359,10 @@ public class GTACoachController extends GTAAbstractController { if(GTAType.individual.name().equals(config.getStringValue(GTACourseNode.GTASK_TYPE))) { UserCourseEnvironment assessedUserCourseEnv = getAssessedUserCourseEnvironment(); revisionDocumentsCtrl = new GTACoachRevisionAndCorrectionsController(ureq, getWindowControl(), - courseEnv, assignedTask, gtaNode, assessedGroup, assessedIdentity, assessedUserCourseEnv); + courseEnv, assignedTask, gtaNode, assessedGroup, assessedIdentity, assessedUserCourseEnv, taskListEventResource); } else { revisionDocumentsCtrl = new GTACoachRevisionAndCorrectionsController(ureq, getWindowControl(), - courseEnv, assignedTask, gtaNode, assessedGroup, null, null); + courseEnv, assignedTask, gtaNode, assessedGroup, null, null, taskListEventResource); } listenTo(revisionDocumentsCtrl); mainVC.put("revisionDocs", revisionDocumentsCtrl.getInitialComponent()); @@ -594,13 +596,30 @@ public class GTACoachController extends GTAAbstractController { } else if (assessedIdentity != null) { toName = userManager.getUserDisplayName(assessedIdentity); } - - 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); + + File[] submittedDocuments; + VFSContainer documentsContainer; + if(GTAType.group.name().equals(config.getStringValue(GTACourseNode.GTASK_TYPE))) { + documentsContainer = gtaManager.getSubmitContainer(courseEnv, gtaNode, assessedGroup); + File documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, assessedGroup); + 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) { diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachRevisionAndCorrectionsController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachRevisionAndCorrectionsController.java index 575e39e83844dc23d6037614034c2601630802d6..e7ada489bfcb2e07c4f80ce441520ee4f78d69d1 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachRevisionAndCorrectionsController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachRevisionAndCorrectionsController.java @@ -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.DialogBoxUIFactory; 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.course.CourseFactory; import org.olat.course.ICourse; @@ -47,8 +50,10 @@ import org.olat.course.nodes.gta.GTAManager; import org.olat.course.nodes.gta.GTAType; import org.olat.course.nodes.gta.Task; 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.ui.events.SubmitEvent; +import org.olat.course.nodes.gta.ui.events.TaskMultiUserEvent; import org.olat.course.run.environment.CourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.group.BusinessGroup; @@ -77,6 +82,7 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController { private final Identity assessedIdentity; private final BusinessGroup assessedGroup; private final CourseEnvironment courseEnv; + private final OLATResourceable taskListEventResource; private final UserCourseEnvironment assessedUserCourseEnv; @Autowired @@ -88,7 +94,7 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController { public GTACoachRevisionAndCorrectionsController(UserRequest ureq, WindowControl wControl, CourseEnvironment courseEnv, Task assignedTask, GTACourseNode gtaNode, BusinessGroup assessedGroup, - Identity assessedIdentity, UserCourseEnvironment assessedUserCourseEnv) { + Identity assessedIdentity, UserCourseEnvironment assessedUserCourseEnv, OLATResourceable taskListEventResource) { super(ureq, wControl); this.gtaNode = gtaNode; this.courseEnv = courseEnv; @@ -96,6 +102,7 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController { this.assessedGroup = assessedGroup; this.assessedIdentity = assessedIdentity; this.assessedUserCourseEnv = assessedUserCourseEnv; + this.taskListEventResource = taskListEventResource; this.businessGroupTask = GTAType.group.name().equals(gtaNode.getModuleConfiguration().getStringValue(GTACourseNode.GTASK_TYPE)); currentIteration = assignedTask.getRevisionLoop(); @@ -312,11 +319,29 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController { toName = userManager.getUserDisplayName(assessedIdentity); } - 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); + File[] submittedDocuments; + VFSContainer documentsContainer; + int iteration = assignedTask.getRevisionLoop(); + if(GTAType.group.name().equals(gtaNode.getModuleConfiguration().getStringValue(GTACourseNode.GTASK_TYPE))) { + 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() { @@ -335,6 +360,11 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController { } else { 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() {