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 ffdcdd05e52ec81949d1166ad4a07a16fd7ae49b..dee4fa8d05846783bfc6e583ca261133fcdf9900 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 @@ -51,6 +51,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.TaskList; import org.olat.course.nodes.gta.TaskHelper.FilesLocked; import org.olat.course.nodes.gta.TaskProcess; import org.olat.course.nodes.gta.model.DueDate; @@ -664,6 +665,12 @@ public class GTACoachController extends GTAAbstractController implements Assessm private void doReviewedDocument(UserRequest ureq, Task task) { //go to solution, grading or graded + if(task == null) { + TaskProcess firstStep = gtaManager.firstStep(gtaNode); + TaskList taskList = gtaManager.getTaskList(courseEnv.getCourseGroupManager().getCourseEntry(), gtaNode); + task = gtaManager.createAndPersistTask(null, taskList, firstStep, assessedGroup, assessedIdentity, gtaNode); + } + gtaManager.reviewedTask(task, gtaNode); showInfo("coach.documents.successfully.reviewed"); gtaManager.log("Review", "documents reviewed", task, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode, Role.coach); diff --git a/src/test/java/org/olat/selenium/AssessmentTest.java b/src/test/java/org/olat/selenium/AssessmentTest.java index 93838d287ab1e431a363f667f44ca23684a0ee53..62ebbbdca6402db2c8e3127478a5fd33815d4f48 100644 --- a/src/test/java/org/olat/selenium/AssessmentTest.java +++ b/src/test/java/org/olat/selenium/AssessmentTest.java @@ -1934,4 +1934,127 @@ public class AssessmentTest extends Deployments { .openSolutions() .assertSolution("solution_1.txt"); } + + + /** + * An author create a course with an heavy customized task + * course element. Assignment and submission are disabled. + * The task is optional. The participant doesn't need to + * interact with the course, the author / coach upload a + * correction and marks the task as reviewed and uses the + * assessment tool to set the score.<br> + * The participant checks if she successfully passed the task + * and if it can see the proposed solution. + * + * @param authorLoginPage The login page + * @param ryomouBrowser A browser for the student + * @throws IOException + * @throws URISyntaxException + */ + @Test + @RunAsClient + public void taskOptionalWithoutSubmission(@InitialPage LoginPage authorLoginPage, + @Drone @User WebDriver ryomouBrowser) + throws IOException, URISyntaxException { + + UserVO author = new UserRestClient(deploymentUrl).createAuthor(); + UserVO kanu = new UserRestClient(deploymentUrl).createRandomUser("kanu"); + UserVO ryomou = new UserRestClient(deploymentUrl).createRandomUser("ryomou"); + + authorLoginPage.loginAs(author.getLogin(), author.getPassword()); + + //create a course + String courseTitle = "Course-with-auto-task-" + UUID.randomUUID(); + navBar + .openAuthoringEnvironment() + .createCourse(courseTitle) + .clickToolbarBack(); + + //create a course element of type Test with the test that we create above + String gtaNodeTitle = "Individual task 1"; + CourseEditorPageFragment courseEditor = CoursePageFragment.getCourse(browser) + .edit(); + courseEditor + .createNode("ita") + .nodeTitle(gtaNodeTitle); + + GroupTaskConfigurationPage gtaConfig = new GroupTaskConfigurationPage(browser); + gtaConfig + .selectWorkflow() + .optional(true) + .enableAssignment(false) + .enableSubmission(false) + .saveWorkflow(); + + gtaConfig + .selectAssessment() + .setAssessmentOptions(0.0f, 6.0f, 4.0f) + .saveAssessmentOptions(); + + URL solutionUrl = JunitTestHelper.class.getResource("file_resources/solution_1.txt"); + File solutionFile = new File(solutionUrl.toURI()); + gtaConfig + .selectSolution() + .uploadSolution("A possible solution", solutionFile); + + courseEditor + .publish() + .quickPublish(UserAccess.membersOnly); + + MembersPage membersPage = courseEditor + .clickToolbarBack() + .members(); + + membersPage + .importMembers() + .setMembers(kanu, ryomou) + .nextUsers() + .nextOverview() + .nextPermissions() + .finish(); + + //go to the course + CoursePageFragment coursePage = membersPage + .clickToolbarBack(); + coursePage + .clickTree() + .selectWithTitle(gtaNodeTitle); + + URL correctionUrl = JunitTestHelper.class.getResource("file_resources/correction_1.txt"); + File correctionFile = new File(correctionUrl.toURI()); + GroupTaskToCoachPage participantToCoach = new GroupTaskToCoachPage(browser); + participantToCoach + .selectIdentityToCoach(ryomou) + .openRevisionsStep() + .uploadCorrection(correctionFile) + .reviewed() + .openIndividualAssessment() + .individualAssessment(null, 5.5f) + .assertPassed(); + + //Participant log in + LoginPage ryomouLoginPage = LoginPage.getLoginPage(ryomouBrowser, deploymentUrl); + ryomouLoginPage + .loginAs(ryomou) + .resume(); + + //open the course + NavigationPage ryomouNavBar = new NavigationPage(ryomouBrowser); + ryomouNavBar + .openMyCourses() + .select(courseTitle); + + //go to the group task + CoursePageFragment ryomouTestCourse = new CoursePageFragment(ryomouBrowser); + ryomouTestCourse + .clickTree() + .selectWithTitle(gtaNodeTitle); + + GroupTaskPage ryomouTask = new GroupTaskPage(ryomouBrowser); + //participant checks she passed the task + ryomouTask + .assertPassed() + .openSolutions() + .assertSolution("solution_1.txt"); + } } diff --git a/src/test/java/org/olat/selenium/page/course/GroupTaskToCoachPage.java b/src/test/java/org/olat/selenium/page/course/GroupTaskToCoachPage.java index 1e295cb6a2c8df15d3e9ea20f2b7bd4e96770115..82999f3aa2d7a8c97f2e03b84b6fd28aadbdd4fb 100644 --- a/src/test/java/org/olat/selenium/page/course/GroupTaskToCoachPage.java +++ b/src/test/java/org/olat/selenium/page/course/GroupTaskToCoachPage.java @@ -116,6 +116,18 @@ public class GroupTaskToCoachPage { return this; } + public GroupTaskToCoachPage openRevisionsStep() { + By uploadButtonBs = By.cssSelector("#o_step_review_content .o_sel_course_gta_submit_file"); + List<WebElement> buttons = browser.findElements(uploadButtonBs); + if(buttons.isEmpty() || !buttons.get(0).isDisplayed()) { + //open grading tab + By collpaseBy = By.xpath("//a[@href='#o_step_review_content']"); + OOGraphene.click(collpaseBy, browser); + OOGraphene.waitElement(uploadButtonBs, browser); + } + return this; + } + public GroupTaskToCoachPage uploadCorrection(File correctionFile) { By uploadButtonBy = By.cssSelector("#o_step_review_content .o_sel_course_gta_submit_file"); OOGraphene.clickAndWait(uploadButtonBy, browser);