diff --git a/src/main/java/org/olat/course/nodes/gta/GTAManager.java b/src/main/java/org/olat/course/nodes/gta/GTAManager.java index 0241757504fcbbb8ba9b3d2065f757095f6b880e..6eaef96a4c5b0b90f108a1cec77c5d3b7c78fe6a 100644 --- a/src/main/java/org/olat/course/nodes/gta/GTAManager.java +++ b/src/main/java/org/olat/course/nodes/gta/GTAManager.java @@ -130,7 +130,6 @@ public interface GTAManager { public void removeSolution(Solution removedSolution, CourseEnvironment courseEnv, GTACourseNode cNode); - /** * Create a subscription context. * @param courseEnv The course environment @@ -327,7 +326,7 @@ public interface GTAManager { public TaskProcess nextStep(TaskProcess currentStep, GTACourseNode cNode); - public Task collectTask(Task task, GTACourseNode cNode); + public Task collectTask(Task task, GTACourseNode cNode, int numOfDocs); /** * Task is reviewed and accepted. @@ -341,9 +340,9 @@ public interface GTAManager { public TaskDueDate updateTaskDueDate(TaskDueDate taskDueDate); - public Task submitTask(Task task, GTACourseNode cNode); + public Task submitTask(Task task, GTACourseNode cNode, int numOfDocs); - public Task submitRevisions(Task task, GTACourseNode cNode); + public Task submitRevisions(Task task, GTACourseNode cNode, int numOfDocs); public Task updateTask(Task task, TaskProcess newStatus, int iteration, GTACourseNode cNode); diff --git a/src/main/java/org/olat/course/nodes/gta/TaskLight.java b/src/main/java/org/olat/course/nodes/gta/TaskLight.java index 2661333fa324c9e2c1dfa54feae6fd8ad3c929a9..dbd0c94e656c877c630da6976416502d08095d44 100644 --- a/src/main/java/org/olat/course/nodes/gta/TaskLight.java +++ b/src/main/java/org/olat/course/nodes/gta/TaskLight.java @@ -49,10 +49,16 @@ public interface TaskLight extends TaskRef { public Date getSubmissionDate(); + public Integer getSubmissionNumOfDocs(); + public Date getSubmissionRevisionsDate(); + public Integer getSubmissionRevisionsNumOfDocs(); + public Date getCollectionDate(); + public Integer getCollectionNumOfDocs(); + public Long getIdentityKey(); public Long getBusinessGroupKey(); diff --git a/src/main/java/org/olat/course/nodes/gta/manager/GTAManagerImpl.java b/src/main/java/org/olat/course/nodes/gta/manager/GTAManagerImpl.java index d19b9cdab4bfd465766c7d30956dca1a2333ae8f..2f6bda7f5bc1924c50af68ccf8d115282c0b39cc 100644 --- a/src/main/java/org/olat/course/nodes/gta/manager/GTAManagerImpl.java +++ b/src/main/java/org/olat/course/nodes/gta/manager/GTAManagerImpl.java @@ -1423,18 +1423,20 @@ public class GTAManagerImpl implements GTAManager, DeletableGroupData { } @Override - public Task collectTask(Task task, GTACourseNode cNode) { + public Task collectTask(Task task, GTACourseNode cNode, int numOfDocs) { TaskProcess review = nextStep(TaskProcess.submit, cNode); TaskImpl taskImpl = (TaskImpl)task; taskImpl.setCollectionDate(new Date()); + taskImpl.setCollectionNumOfDocs(numOfDocs); return updateTask(task, review, cNode); } @Override - public Task submitTask(Task task, GTACourseNode cNode) { + public Task submitTask(Task task, GTACourseNode cNode, int numOfDocs) { TaskProcess review = nextStep(TaskProcess.submit, cNode); TaskImpl taskImpl = (TaskImpl)task; taskImpl.setSubmissionDate(new Date()); + taskImpl.setSubmissionNumOfDocs(numOfDocs); return updateTask(task, review, cNode); } @@ -1474,9 +1476,10 @@ public class GTAManagerImpl implements GTAManager, DeletableGroupData { } @Override - public Task submitRevisions(Task task, GTACourseNode cNode) { + public Task submitRevisions(Task task, GTACourseNode cNode, int numOfDocs) { TaskImpl taskImpl = (TaskImpl)task; taskImpl.setSubmissionRevisionsDate(new Date()); + taskImpl.setSubmissionRevisionsNumOfDocs(numOfDocs); //log the date createAndPersistTaskRevisionDate(taskImpl, taskImpl.getRevisionLoop(), TaskProcess.correction); return updateTask(taskImpl, TaskProcess.correction, cNode); @@ -1524,10 +1527,11 @@ public class GTAManagerImpl implements GTAManager, DeletableGroupData { taskImpl.setGraduationDate(null); } - //check submission date because of repon + //check submission date because of reopen if(newStatus == TaskProcess.assignment || newStatus == TaskProcess.submit) { if(taskImpl.getSubmissionDate() != null) { taskImpl.setSubmissionDate(null); + taskImpl.setSubmissionNumOfDocs(null); } } } diff --git a/src/main/java/org/olat/course/nodes/gta/manager/GTANotifications.java b/src/main/java/org/olat/course/nodes/gta/manager/GTANotifications.java index 132d662ed733d1c3a2871d4578d553b3a170ea04..3c9aa299ca52457fe0695e547c781a28cd138565 100644 --- a/src/main/java/org/olat/course/nodes/gta/manager/GTANotifications.java +++ b/src/main/java/org/olat/course/nodes/gta/manager/GTANotifications.java @@ -42,6 +42,7 @@ import org.olat.core.util.Formatter; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.core.util.io.SystemFileFilter; +import org.olat.core.util.io.SystemFilenameFilter; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.course.CourseFactory; @@ -653,13 +654,27 @@ class GTANotifications { RepositoryEntry re = courseEnv.getCourseGroupManager().getCourseEntry(); DueDate dueDate = gtaManager.getSubmissionDueDate(task, assessedIdentity, assessedGroup, gtaNode, re, true); if(dueDate != null && dueDate.getDueDate() != null && dueDate.getDueDate().before(new Date())) { - task = gtaManager.nextStep(task, gtaNode); + int numOfDocs = getNumberOfSubmittedDocuments(assessedIdentity, assessedGroup); + task = gtaManager.submitTask(task, gtaNode, numOfDocs); doUpdateAttempts(assessedIdentity, assessedGroup); } } return task; } + private int getNumberOfSubmittedDocuments(Identity assessedIdentity, BusinessGroup assessedGroup) { + File[] submittedDocuments; + if(GTAType.group.name().equals(gtaNode.getModuleConfiguration().getStringValue(GTACourseNode.GTASK_TYPE))) { + File documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, assessedGroup); + submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false)); + + } else { + File documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, assessedIdentity); + submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false)); + } + return submittedDocuments == null ? 0 : submittedDocuments.length; + } + private boolean checkRevisionLoop(TaskProcess status, int revisionLoop, List<TaskRevisionDate> taskRevisions) { for(TaskRevisionDate taskRevision:taskRevisions) { if(taskRevision.getTaskStatus() == status && taskRevision.getRevisionLoop() == revisionLoop) { diff --git a/src/main/java/org/olat/course/nodes/gta/model/TaskImpl.java b/src/main/java/org/olat/course/nodes/gta/model/TaskImpl.java index 0f9c1ee1e6ef30aa41a007ee0acad103ee115da6..e4fe25928042a896a20f7a92740601cae94cf588 100644 --- a/src/main/java/org/olat/course/nodes/gta/model/TaskImpl.java +++ b/src/main/java/org/olat/course/nodes/gta/model/TaskImpl.java @@ -1,4 +1,5 @@ /** + * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * <p> @@ -93,12 +94,19 @@ public class TaskImpl implements Task, CreateInfo, Persistable, ModifiedInfo { @Temporal(TemporalType.TIMESTAMP) @Column(name="g_submission_date", nullable=true, insertable=true, updatable=true) private Date submissionDate; + @Column(name="g_submission_ndocs", nullable=true, insertable=true, updatable=true) + private Integer submissionNumOfDocs; @Temporal(TemporalType.TIMESTAMP) @Column(name="g_submission_revisions_date", nullable=true, insertable=true, updatable=true) private Date submissionRevisionsDate; + @Column(name="g_submission_revisions_ndocs", nullable=true, insertable=true, updatable=true) + private Integer submissionRevisionsNumOfDocs; @Temporal(TemporalType.TIMESTAMP) @Column(name="g_collection_date", nullable=true, insertable=true, updatable=true) private Date collectionDate; + @Column(name="g_collection_ndocs", nullable=true, insertable=true, updatable=true) + private Integer collectionNumOfDocs; + @Temporal(TemporalType.TIMESTAMP) @Column(name="g_allow_reset_date", nullable=true, insertable=true, updatable=true) private Date allowResetDate; @@ -228,6 +236,14 @@ public class TaskImpl implements Task, CreateInfo, Persistable, ModifiedInfo { this.submissionDate = submissionDate; } + public Integer getSubmissionNumOfDocs() { + return submissionNumOfDocs; + } + + public void setSubmissionNumOfDocs(Integer submissionNumOfDocs) { + this.submissionNumOfDocs = submissionNumOfDocs; + } + @Override public Date getSubmissionRevisionsDate() { return submissionRevisionsDate; @@ -237,6 +253,14 @@ public class TaskImpl implements Task, CreateInfo, Persistable, ModifiedInfo { this.submissionRevisionsDate = submissionRevisionsDate; } + public Integer getSubmissionRevisionsNumOfDocs() { + return submissionRevisionsNumOfDocs; + } + + public void setSubmissionRevisionsNumOfDocs(Integer submissionRevisionsNumOfDocs) { + this.submissionRevisionsNumOfDocs = submissionRevisionsNumOfDocs; + } + @Override public Date getCollectionDate() { return collectionDate; @@ -246,6 +270,14 @@ public class TaskImpl implements Task, CreateInfo, Persistable, ModifiedInfo { this.collectionDate = collectionDate; } + public Integer getCollectionNumOfDocs() { + return collectionNumOfDocs; + } + + public void setCollectionNumOfDocs(Integer collectionNumOfDocs) { + this.collectionNumOfDocs = collectionNumOfDocs; + } + @Override public Date getAllowResetDate() { return allowResetDate; diff --git a/src/main/java/org/olat/course/nodes/gta/model/TaskLightImpl.java b/src/main/java/org/olat/course/nodes/gta/model/TaskLightImpl.java index b2e425dc892ea1507973fb92aae07f5e7d7001fa..8757c264f97c321765353093b587cddb8df491c0 100644 --- a/src/main/java/org/olat/course/nodes/gta/model/TaskLightImpl.java +++ b/src/main/java/org/olat/course/nodes/gta/model/TaskLightImpl.java @@ -81,12 +81,18 @@ public class TaskLightImpl implements TaskLight, CreateInfo, Persistable, Modifi @Temporal(TemporalType.TIMESTAMP) @Column(name="g_submission_date", nullable=true, insertable=true, updatable=true) private Date submissionDate; + @Column(name="g_submission_ndocs", nullable=true, insertable=true, updatable=true) + private Integer submissionNumOfDocs; @Temporal(TemporalType.TIMESTAMP) @Column(name="g_submission_revisions_date", nullable=true, insertable=true, updatable=true) private Date submissionRevisionsDate; + @Column(name="g_submission_revisions_ndocs", nullable=true, insertable=true, updatable=true) + private Integer submissionRevisionsNumOfDocs; @Temporal(TemporalType.TIMESTAMP) @Column(name="g_collection_date", nullable=true, insertable=true, updatable=true) private Date collectionDate; + @Column(name="g_collection_ndocs", nullable=true, insertable=true, updatable=true) + private Integer collectionNumOfDocs; @Temporal(TemporalType.TIMESTAMP) @Column(name="g_assignment_due_date", nullable=true, insertable=true, updatable=false) @@ -205,6 +211,15 @@ public class TaskLightImpl implements TaskLight, CreateInfo, Persistable, Modifi this.submissionDate = submissionDate; } + @Override + public Integer getSubmissionNumOfDocs() { + return submissionNumOfDocs; + } + + public void setSubmissionNumOfDocs(Integer submissionNumOfDocs) { + this.submissionNumOfDocs = submissionNumOfDocs; + } + @Override public Date getSubmissionRevisionsDate() { return submissionRevisionsDate; @@ -213,6 +228,15 @@ public class TaskLightImpl implements TaskLight, CreateInfo, Persistable, Modifi public void setSubmissionRevisionsDate(Date submissionRevisionsDate) { this.submissionRevisionsDate = submissionRevisionsDate; } + + @Override + public Integer getSubmissionRevisionsNumOfDocs() { + return submissionRevisionsNumOfDocs; + } + + public void setSubmissionRevisionsNumOfDocs(Integer submissionRevisionsNumOfDocs) { + this.submissionRevisionsNumOfDocs = submissionRevisionsNumOfDocs; + } @Override public Date getCollectionDate() { @@ -222,6 +246,15 @@ public class TaskLightImpl implements TaskLight, CreateInfo, Persistable, Modifi public void setCollectionDate(Date collectionDate) { this.collectionDate = collectionDate; } + + @Override + public Integer getCollectionNumOfDocs() { + return collectionNumOfDocs; + } + + public void setCollectionNumOfDocs(Integer collectionNumOfDocs) { + this.collectionNumOfDocs = collectionNumOfDocs; + } @Override public Date getAssignmentDueDate() { diff --git a/src/main/java/org/olat/course/nodes/gta/ui/CoachedElementRow.java b/src/main/java/org/olat/course/nodes/gta/ui/CoachedElementRow.java index bc2d28ebda237447c2a560f4eea0f8f7542a5a7c..6eb3de2b6c706c397e4d634c3da0ee4a38173dac 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/CoachedElementRow.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/CoachedElementRow.java @@ -37,17 +37,21 @@ public interface CoachedElementRow { public TaskProcess getTaskStatus(); - public Date getSubmissionDate(); - /** * @return Date only if there is a due date and the task is not submitted. */ public Date getSubmissionDueDate(); + public Date getSubmissionDate(); + public Date getSubmissionRevisionsDate(); public Date getCollectionDate(); + public Date getSyntheticSubmissionDate(); + + public boolean getHasSubmittedDocuments(); + public TaskLight getTask(); } diff --git a/src/main/java/org/olat/course/nodes/gta/ui/CoachedGroupRow.java b/src/main/java/org/olat/course/nodes/gta/ui/CoachedGroupRow.java index 8551d1dfa4212a0ff568c272b8ad29bd4d0a974e..bb7a58da910730edbcd1039cea812e8aa84279d0 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/CoachedGroupRow.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/CoachedGroupRow.java @@ -35,12 +35,17 @@ public class CoachedGroupRow implements CoachedElementRow { private final TaskLight task; private final Date submissionDueDate; + private final Date syntheticSubmissionDate; + private final boolean hasSubmittedDocuments; private final BusinessGroup businessGroup; - public CoachedGroupRow(BusinessGroup businessGroup, TaskLight task, Date submissionDueDate) { + public CoachedGroupRow(BusinessGroup businessGroup, TaskLight task, Date submissionDueDate, + Date syntheticSubmissionDate, boolean hasSubmittedDocuments) { this.task = task; this.businessGroup = businessGroup; this.submissionDueDate = submissionDueDate; + this.hasSubmittedDocuments = hasSubmittedDocuments; + this.syntheticSubmissionDate = syntheticSubmissionDate; } public String getName() { @@ -77,6 +82,16 @@ public class CoachedGroupRow implements CoachedElementRow { return task == null ? null : task.getCollectionDate(); } + @Override + public Date getSyntheticSubmissionDate() { + return syntheticSubmissionDate; + } + + @Override + public boolean getHasSubmittedDocuments() { + return hasSubmittedDocuments; + } + @Override public TaskLight getTask() { return task; diff --git a/src/main/java/org/olat/course/nodes/gta/ui/CoachedIdentityRow.java b/src/main/java/org/olat/course/nodes/gta/ui/CoachedIdentityRow.java index 70feb8a98aa63f0f0fbc26413a234045e67991d6..5d8cea03f80f53fec68a994082c92018d9ada9ec 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/CoachedIdentityRow.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/CoachedIdentityRow.java @@ -35,12 +35,17 @@ public class CoachedIdentityRow implements CoachedElementRow { private final TaskLight task; private final Date submissionDueDate; + private final Date syntheticSubmissionDate; + private final boolean hasSubmittedDocuments; private final UserPropertiesRow identity; - public CoachedIdentityRow(UserPropertiesRow identity, TaskLight task, Date submissionDueDate) { + public CoachedIdentityRow(UserPropertiesRow identity, TaskLight task, Date submissionDueDate, + Date syntheticSubmissionDate, boolean hasSubmittedDocuments) { this.identity = identity; this.task = task; this.submissionDueDate = submissionDueDate; + this.hasSubmittedDocuments = hasSubmittedDocuments; + this.syntheticSubmissionDate = syntheticSubmissionDate; } @Override @@ -72,6 +77,16 @@ public class CoachedIdentityRow implements CoachedElementRow { public Date getCollectionDate() { return task == null ? null : task.getCollectionDate(); } + + @Override + public Date getSyntheticSubmissionDate() { + return syntheticSubmissionDate; + } + + @Override + public boolean getHasSubmittedDocuments() { + return hasSubmittedDocuments; + } @Override public TaskLight getTask() { diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAAbstractController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAAbstractController.java index a58ec486c55fc11ed6ca06768588ad751d30c714..6292c77222707433ca160a100dff98e918f7ade5 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/GTAAbstractController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAAbstractController.java @@ -19,6 +19,7 @@ */ package org.olat.course.nodes.gta.ui; +import java.io.File; import java.util.Calendar; import java.util.Date; import java.util.List; @@ -39,6 +40,7 @@ import org.olat.core.util.Formatter; import org.olat.core.util.StringHelper; import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.event.GenericEventListener; +import org.olat.core.util.io.SystemFilenameFilter; import org.olat.core.util.resource.OresHelper; import org.olat.course.CourseFactory; import org.olat.course.CourseModule; @@ -360,7 +362,8 @@ public abstract class GTAAbstractController extends BasicController implements G if(assignedTask != null && assignedTask.getTaskStatus() == TaskProcess.submit && date.compareTo(new Date()) < 0) { //push to the next step - assignedTask = gtaManager.nextStep(assignedTask, gtaNode); + int numOfDocs = getNumberOfSubmittedDocuments(); + assignedTask = gtaManager.submitTask(assignedTask, gtaNode, numOfDocs); doUpdateAttempts(); } } else if(dueDate.getMessageKey() != null) { @@ -379,6 +382,19 @@ public abstract class GTAAbstractController extends BasicController implements G return submissionDueDate; } + protected int getNumberOfSubmittedDocuments() { + File[] submittedDocuments; + if(GTAType.group.name().equals(config.getStringValue(GTACourseNode.GTASK_TYPE))) { + File documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, assessedGroup); + submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false)); + + } else { + File documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, assessedIdentity); + submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false)); + } + return submittedDocuments == null ? 0 : submittedDocuments.length; + } + protected Task stepReviewAndCorrection(@SuppressWarnings("unused")UserRequest ureq, Task assignedTask) { return assignedTask; } @@ -391,13 +407,27 @@ public abstract class GTAAbstractController extends BasicController implements G if(assignedTask != null && assignedTask.getTaskStatus() == TaskProcess.revision && date.compareTo(new Date()) < 0) { //push to the next step - assignedTask = gtaManager.nextStep(assignedTask, gtaNode); + int numOfDocs = getNumberOfRevisionDocuments(assignedTask); + assignedTask = gtaManager.submitRevisions(assignedTask, gtaNode, numOfDocs); doUpdateAttempts(); } } return assignedTask; } + protected int getNumberOfRevisionDocuments(Task assignedTask) { + File[] submittedDocuments; + int iteration = assignedTask.getRevisionLoop(); + if(GTAType.group.name().equals(gtaNode.getModuleConfiguration().getStringValue(GTACourseNode.GTASK_TYPE))) { + File documentsDir = gtaManager.getRevisedDocumentsDirectory(courseEnv, gtaNode, iteration, assessedGroup); + submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false)); + } else { + File documentsDir = gtaManager.getRevisedDocumentsDirectory(courseEnv, gtaNode, iteration, assessedIdentity); + submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false)); + } + return submittedDocuments == null ? 0 : submittedDocuments.length; + } + protected Task stepSolution(@SuppressWarnings("unused")UserRequest ureq, Task assignedTask) { DueDate availableDate = getSolutionDueDate(assignedTask); if(availableDate != null) { 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 bdc3bc1f7f37a2a73f3b38e998eec3374617780e..3d610f840454eb462a46e1730dcc173ce047f9d1 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 @@ -715,7 +715,17 @@ public class GTACoachController extends GTAAbstractController implements Assessm } private void doCollectTask(UserRequest ureq, Task task) { - task = gtaManager.collectTask(task, gtaNode); + File[] submittedDocuments; + if(GTAType.group.name().equals(config.getStringValue(GTACourseNode.GTASK_TYPE))) { + File documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, assessedGroup); + submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false)); + } else { + File documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, getIdentity()); + submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false)); + } + + int numOfDocs = submittedDocuments == null ? 0 : submittedDocuments.length; + task = gtaManager.collectTask(task, gtaNode, numOfDocs); showInfo("run.documents.successfully.submitted"); TaskMultiUserEvent event = new TaskMultiUserEvent(TaskMultiUserEvent.SUMBIT_TASK, diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedGroupListController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedGroupListController.java index dd1d2d2781ec410ea1df3d1f792231b1c65efc07..057eff33801b587f4b764029dde7c48e70790785 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedGroupListController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedGroupListController.java @@ -149,7 +149,16 @@ public class GTACoachedGroupListController extends GTACoachedListController { submissionDueDate = dueDate.getDueDate(); } } - rows.add(new CoachedGroupRow(group, task, submissionDueDate)); + + Date syntheticSubmissionDate = null; + boolean hasSubmittedDocument = false; + if(task != null && task.getTaskStatus() != null && task.getTaskStatus() != TaskProcess.assignment && task.getTaskStatus() != TaskProcess.submit) { + syntheticSubmissionDate = getSyntheticSubmissionDate(task); + if(syntheticSubmissionDate != null) { + hasSubmittedDocument = this.hasSubmittedDocument(task); + } + } + rows.add(new CoachedGroupRow(group, task, submissionDueDate, syntheticSubmissionDate, hasSubmittedDocument)); } tableModel.setObjects(rows); diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedListController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedListController.java index e28e6a4fabd9f76139086ba2922266475957abfa..eedf6fc861738c05d3747213de8ee0dae5042390 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedListController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedListController.java @@ -19,6 +19,8 @@ */ package org.olat.course.nodes.gta.ui; +import java.util.Date; + import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; @@ -26,6 +28,7 @@ import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.course.nodes.GTACourseNode; +import org.olat.course.nodes.gta.TaskLight; import org.olat.course.run.environment.CourseEnvironment; import org.olat.modules.ModuleConfiguration; @@ -73,4 +76,28 @@ public abstract class GTACoachedListController extends FormBasicController { layoutCont.contextPut("gradingEnabled", grading); } } + + protected Date getSyntheticSubmissionDate(TaskLight task) { + Date date = task.getSubmissionDate(); + if(date == null || (task.getSubmissionRevisionsDate() != null && task.getSubmissionRevisionsDate().after(date))) { + date = task.getSubmissionRevisionsDate(); + } + if(date == null || (task.getCollectionDate() != null && task.getCollectionDate().after(date))) { + date = task.getCollectionDate(); + } + return date; + } + + public boolean hasSubmittedDocument(TaskLight task) { + Integer numOfDocs = task.getSubmissionNumOfDocs(); + Date date = task.getSubmissionDate(); + if(date == null || (task.getSubmissionRevisionsDate() != null && task.getSubmissionRevisionsDate().after(date))) { + date = task.getSubmissionRevisionsDate(); + numOfDocs = task.getSubmissionRevisionsNumOfDocs(); + } + if(date == null || (task.getCollectionDate() != null && task.getCollectionDate().after(date))) { + numOfDocs = task.getCollectionNumOfDocs(); + } + return numOfDocs == null ? false : numOfDocs.intValue() > 0; + } } diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantListController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantListController.java index 38e46c283d5fe12661c1f67cda07cc16865378d0..87679c878156eab968943f413609bb152012a49f 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantListController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantListController.java @@ -250,8 +250,17 @@ public class GTACoachedParticipantListController extends GTACoachedListControlle if(dueDate != null) { submissionDueDate = dueDate.getDueDate(); } + } + + Date syntheticSubmissionDate = null; + boolean hasSubmittedDocument = false; + if(task != null && task.getTaskStatus() != null && task.getTaskStatus() != TaskProcess.assignment && task.getTaskStatus() != TaskProcess.submit) { + syntheticSubmissionDate = getSyntheticSubmissionDate(task); + if(syntheticSubmissionDate != null) { + hasSubmittedDocument = hasSubmittedDocument(task); + } } - rows.add(new CoachedIdentityRow(assessableIdentity, task, submissionDueDate)); + rows.add(new CoachedIdentityRow(assessableIdentity, task, submissionDueDate, syntheticSubmissionDate, hasSubmittedDocument)); } tableModel.setObjects(rows); diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantController.java index c0df9e3180535dc9ac5d6e06e858ed30f554c2b2..0ff8d3bfe51436497b18f9533809952ca57d77da 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantController.java @@ -339,7 +339,8 @@ public class GTAParticipantController extends GTAAbstractController implements A } private void doSubmitDocuments(UserRequest ureq, Task task) { - task = gtaManager.submitTask(task, gtaNode); + int numOfDocs = getNumberOfSubmittedDocuments(); + task = gtaManager.submitTask(task, gtaNode, numOfDocs); showInfo("run.documents.successfully.submitted"); TaskMultiUserEvent event = new TaskMultiUserEvent(TaskMultiUserEvent.SUMBIT_TASK, diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java index e191342351d6702777aee0844f80772371b8a880..82b213f79af11a7d6f03bcb32c11db58c24201b6 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java @@ -312,7 +312,18 @@ public class GTAParticipantRevisionAndCorrectionsController extends BasicControl } private void doSubmitRevisions() { - assignedTask = gtaManager.submitRevisions(assignedTask, gtaNode); + File[] submittedDocuments; + int iteration = assignedTask.getRevisionLoop(); + if(GTAType.group.name().equals(gtaNode.getModuleConfiguration().getStringValue(GTACourseNode.GTASK_TYPE))) { + File documentsDir = gtaManager.getRevisedDocumentsDirectory(courseEnv, gtaNode, iteration, assessedGroup); + submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false)); + } else { + File documentsDir = gtaManager.getRevisedDocumentsDirectory(courseEnv, gtaNode, iteration, getIdentity()); + submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false)); + } + + int numOfDocs = submittedDocuments == null ? 0 : submittedDocuments.length; + assignedTask = gtaManager.submitRevisions(assignedTask, gtaNode, numOfDocs); gtaManager.log("Revision", "revision submitted", assignedTask, getIdentity(), getIdentity(), assessedGroup, courseEnv, gtaNode); TaskMultiUserEvent event = new TaskMultiUserEvent(TaskMultiUserEvent.SUBMIT_REVISION, diff --git a/src/main/java/org/olat/course/nodes/gta/ui/component/SubmissionDateCellRenderer.java b/src/main/java/org/olat/course/nodes/gta/ui/component/SubmissionDateCellRenderer.java index 3d498b6cd8bd2b8d39a009a2c62feb6f98650423..4fa9042b5ffd02fafeb404a722c657ac68f67e43 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/component/SubmissionDateCellRenderer.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/component/SubmissionDateCellRenderer.java @@ -55,15 +55,16 @@ public class SubmissionDateCellRenderer implements FlexiCellRenderer { if(object instanceof CoachedElementRow) { CoachedElementRow ciRow = (CoachedElementRow)object; TaskProcess status = ciRow.getTaskStatus(); - if(status == null || status == TaskProcess.assignment) { - Date dueDate = ciRow.getSubmissionDueDate(); - if(dueDate != null && dueDate.before(new Date())) { - target.append(translator.translate("no.submission")); - } - } else { - Date date = cascading(ciRow); + if(status == null || status == TaskProcess.assignment || status == TaskProcess.submit) { + //do nothing + } else { + Date date = ciRow.getSyntheticSubmissionDate(); if(date != null) { - target.append(formatter.formatDate(date)); + if(ciRow.getHasSubmittedDocuments()) { + target.append(formatter.formatDate(date)); + } else { + target.append(translator.translate("no.submission")); + } } } } diff --git a/src/main/resources/database/mysql/alter_11_5_x_to_12_0_0.sql b/src/main/resources/database/mysql/alter_11_5_x_to_12_0_0.sql index e602d69a65b82b0926b18be3991119c82919a022..1cbc01a36778b603419ba6715a07bbea0e0f5dbe 100644 --- a/src/main/resources/database/mysql/alter_11_5_x_to_12_0_0.sql +++ b/src/main/resources/database/mysql/alter_11_5_x_to_12_0_0.sql @@ -229,6 +229,10 @@ alter table o_gta_task add column g_acceptation_date datetime default null; alter table o_gta_task add column g_solution_date datetime default null; alter table o_gta_task add column g_graduation_date datetime default null; +alter table o_gta_task add column g_submission_ndocs bigint default null; +alter table o_gta_task add column g_submission_revisions_ndocs bigint default null; +alter table o_gta_task add column g_collection_ndocs bigint default null; + create table o_gta_task_revision_date ( id bigint not null auto_increment, creationdate datetime not null, diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql index d48bb6c9ac62fdb606176e64c3becf1c312335e3..4b21ab2d9dfcd27c0cbd4416209151e4320eb468 100644 --- a/src/main/resources/database/mysql/setupDatabase.sql +++ b/src/main/resources/database/mysql/setupDatabase.sql @@ -1857,8 +1857,11 @@ create table o_gta_task ( g_rev_loop mediumint not null default 0, g_assignment_date datetime, g_submission_date datetime, + g_submission_ndocs bigint, g_submission_revisions_date datetime, + g_submission_revisions_ndocs bigint, g_collection_date datetime, + g_collection_ndocs bigint, g_acceptation_date datetime, g_solution_date datetime, g_graduation_date datetime, diff --git a/src/main/resources/database/oracle/alter_11_5_x_to_12_0_0.sql b/src/main/resources/database/oracle/alter_11_5_x_to_12_0_0.sql index 135895b75683adbcff3beebe3381a0cf6c15c4aa..895acf581f141aed088961a2c4d67f6ebd68ac4c 100644 --- a/src/main/resources/database/oracle/alter_11_5_x_to_12_0_0.sql +++ b/src/main/resources/database/oracle/alter_11_5_x_to_12_0_0.sql @@ -230,6 +230,10 @@ alter table o_gta_task add g_acceptation_date date default null; alter table o_gta_task add g_solution_date date default null; alter table o_gta_task add g_graduation_date date default null; +alter table o_gta_task add g_submission_ndocs number(20) default null; +alter table o_gta_task add g_submission_revisions_ndocs number(20) default null; +alter table o_gta_task add g_collection_ndocs number(20) default null; + create table o_gta_task_revision_date ( id number(20) generated always as identity, creationdate date not null, diff --git a/src/main/resources/database/oracle/setupDatabase.sql b/src/main/resources/database/oracle/setupDatabase.sql index 616cd6aa53004f5f388ea338fac516e0a18df0b7..22088d9ab8d095e9f8cc9d38090ea8a70415061a 100644 --- a/src/main/resources/database/oracle/setupDatabase.sql +++ b/src/main/resources/database/oracle/setupDatabase.sql @@ -1881,8 +1881,11 @@ create table o_gta_task ( g_taskname varchar2(1024 char), g_assignment_date date, g_submission_date date, + g_submission_ndocs number(20), g_submission_revisions_date date, + g_submission_revisions_ndocs number(20), g_collection_date date, + g_collection_ndocs number(20), g_acceptation_date date, g_solution_date date, g_graduation_date date, diff --git a/src/main/resources/database/postgresql/alter_11_5_x_to_12_0_0.sql b/src/main/resources/database/postgresql/alter_11_5_x_to_12_0_0.sql index bc764ec42185e4eb869f9960bd150e16f29fc4e0..7a4fd7d2fe48f7dd8e0a292abb05e803bcacc5d5 100644 --- a/src/main/resources/database/postgresql/alter_11_5_x_to_12_0_0.sql +++ b/src/main/resources/database/postgresql/alter_11_5_x_to_12_0_0.sql @@ -230,6 +230,10 @@ alter table o_gta_task add column g_acceptation_date timestamp default null; alter table o_gta_task add column g_solution_date timestamp default null; alter table o_gta_task add column g_graduation_date timestamp default null; +alter table o_gta_task add column g_submission_ndocs int8 default null; +alter table o_gta_task add column g_submission_revisions_ndocs int8 default null; +alter table o_gta_task add column g_collection_ndocs int8 default null; + create table o_gta_task_revision_date ( id bigserial not null, creationdate timestamp not null, diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql index c5f3bda9345097553f59bb78adff750fe353f633..723deaec2fa5b3fd220f7b6240a7e3ed23ce2ef8 100644 --- a/src/main/resources/database/postgresql/setupDatabase.sql +++ b/src/main/resources/database/postgresql/setupDatabase.sql @@ -1854,8 +1854,11 @@ create table o_gta_task ( g_rev_loop int4 not null default 0, g_assignment_date timestamp, g_submission_date timestamp, + g_submission_ndocs int8, g_submission_revisions_date timestamp, + g_submission_revisions_ndocs int8, g_collection_date timestamp, + g_collection_ndocs int8, g_acceptation_date timestamp, g_solution_date timestamp, g_graduation_date timestamp,