From 2f61c533d4f71cbcaf5d6aa353970442be8b27d9 Mon Sep 17 00:00:00 2001 From: Steve Bader Date: Mon, 25 Jan 2016 11:56:51 -0500 Subject: [PATCH 1/2] MDL-49852 mod_assign: Fix group assignment completion tracking Fixes completion tracking for group assignments where either only one student is required to click Submit when submitting the assignment for grading, all students are required to submit, or no students are required to click submit (meaning that simply uploading submits for grading). --- mod/assign/lib.php | 6 ++++- mod/assign/locallib.php | 50 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/mod/assign/lib.php b/mod/assign/lib.php index 3a1f85aa234..497c8f48fa3 100644 --- a/mod/assign/lib.php +++ b/mod/assign/lib.php @@ -1365,7 +1365,11 @@ function assign_get_completion_state($course, $cm, $userid, $type) { // If completion option is enabled, evaluate it and return true/false. if ($assign->get_instance()->completionsubmit) { - $submission = $assign->get_user_submission($userid, false); + if ($assign->get_instance()->teamsubmission) { + $submission = $assign->get_group_submission($userid, 0, false); + } else { + $submission = $assign->get_user_submission($userid, false); + } return $submission && $submission->status == ASSIGN_SUBMISSION_STATUS_SUBMITTED; } else { // Completion option is not enabled so just return $type. diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index cc1b7425ef9..2724a6050bd 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -5157,7 +5157,12 @@ class assign { $this->update_submission($submission, $userid, true, $instance->teamsubmission); $completion = new completion_info($this->get_course()); if ($completion->is_enabled($this->get_course_module()) && $instance->completionsubmit) { - $completion->update_state($this->get_course_module(), COMPLETION_COMPLETE, $userid); + $this->update_activity_completion_records($instance->teamsubmission, + $instance->requireallteammemberssubmit, + $submission, + $userid, + COMPLETION_COMPLETE, + $completion); } if (!empty($data->submissionstatement) && $USER->id == $userid) { @@ -5849,7 +5854,12 @@ class assign { } $completion = new completion_info($this->get_course()); if ($completion->is_enabled($this->get_course_module()) && $instance->completionsubmit) { - $completion->update_state($this->get_course_module(), $complete, $USER->id); + $this->update_activity_completion_records($instance->teamsubmission, + $instance->requireallteammemberssubmit, + $submission, + $USER->id, + $complete, + $completion); } if (!$instance->submissiondrafts) { @@ -7498,6 +7508,42 @@ class assign { } return $this->get_course_module()->id . '_' . $id; } + + /** + * Updates and creates the completion records in mdl_course_modules_completion. + * + * @param int $teamsubmission value of 0 or 1 to indicate whether this is a group activity + * @param int $requireallteammemberssubmit value of 0 or 1 to indicate whether all group members must click Submit + * @param obj $submission the submission + * @param int $userid the user id + * @param int $complete + * @param obj $completion + * + * @return null + */ + protected function update_activity_completion_records($teamsubmission, + $requireallteammemberssubmit, + $submission, + $userid, + $complete, + $completion) { + + if (($teamsubmission && $submission->groupid > 0 && !$requireallteammemberssubmit) || + ($teamsubmission && $submission->groupid > 0 && $requireallteammemberssubmit && + $submission->status == ASSIGN_SUBMISSION_STATUS_SUBMITTED)) { + + $members = groups_get_members($submission->groupid); + + foreach ($members as $member) { + $completion->update_state($this->get_course_module(), $complete, $member->id); + } + } else { + $completion->update_state($this->get_course_module(), $complete, $userid); + } + + return; + } + } /** From 079c7e40229c320b7b93523949c18b1daf856e13 Mon Sep 17 00:00:00 2001 From: Adrian Greeve Date: Thu, 26 May 2016 16:40:04 +0800 Subject: [PATCH 2/2] MDL-49852 mod_assign: Unit tests for activity completion. --- mod/assign/tests/base_test.php | 18 +++++- mod/assign/tests/locallib_test.php | 90 ++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 1 deletion(-) diff --git a/mod/assign/tests/base_test.php b/mod/assign/tests/base_test.php index fb3d213816e..336488fbc46 100644 --- a/mod/assign/tests/base_test.php +++ b/mod/assign/tests/base_test.php @@ -90,7 +90,9 @@ class mod_assign_base_testcase extends advanced_testcase { $this->resetAfterTest(true); - $this->course = $this->getDataGenerator()->create_course(); + set_config('enablecompletion', 1); + + $this->course = $this->getDataGenerator()->create_course(array('enablecompletion' => 1)); $this->teachers = array(); for ($i = 0; $i < self::DEFAULT_TEACHER_COUNT; $i++) { array_push($this->teachers, $this->getDataGenerator()->create_user()); @@ -346,4 +348,18 @@ class testable_assign extends assign { return $mform; } + + public function testable_update_activity_completion_records($teamsubmission, + $requireallteammemberssubmit, + $submission, + $userid, + $complete, + $completion) { + return parent::update_activity_completion_records($teamsubmission, + $requireallteammemberssubmit, + $submission, + $userid, + $complete, + $completion); + } } diff --git a/mod/assign/tests/locallib_test.php b/mod/assign/tests/locallib_test.php index 72f2200b86f..0118581b50a 100644 --- a/mod/assign/tests/locallib_test.php +++ b/mod/assign/tests/locallib_test.php @@ -2494,4 +2494,94 @@ Anchor link 2:Link text $grade = $assign->get_user_grade($this->students[0]->id, false); $this->assertEquals('30.0', $grade->grade); } + + /** + * Test updating activity completion when submitting an assessment. + */ + public function test_update_activity_completion_records_solitary_submission() { + $assign = $this->create_instance(array('grade' => 100, + 'completion' => COMPLETION_TRACKING_AUTOMATIC, + 'requireallteammemberssubmit' => 0)); + + $cm = $assign->get_course_module(); + + $student = $this->students[0]; + $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign'); + + $this->setUser($student); + + // Simulate a submission. + $data = new stdClass(); + $data->onlinetext_editor = array( + 'itemid' => file_get_unused_draft_itemid(), + 'text' => 'Student submission text', + 'format' => FORMAT_MOODLE + ); + $completion = new completion_info($this->course); + + $notices = array(); + $assign->save_submission($data, $notices); + + $submission = $assign->get_user_submission($student->id, true); + + // Check that completion is not met yet. + $completiondata = $completion->get_data($cm, false, $student->id); + $this->assertEquals(0, $completiondata->completionstate); + $assign->testable_update_activity_completion_records(0, 0, $submission, + $student->id, COMPLETION_COMPLETE, $completion); + // Completion should now be met. + $completiondata = $completion->get_data($cm, false, $student->id); + $this->assertEquals(1, $completiondata->completionstate); + } + + /** + * Test updating activity completion when submitting an assessment. + */ + public function test_update_activity_completion_records_team_submission() { + $assign = $this->create_instance(array('grade' => 100, + 'completion' => COMPLETION_TRACKING_AUTOMATIC, + 'teamsubmission' => 1)); + + $cm = $assign->get_course_module(); + + $student1 = $this->students[0]; + $student2 = $this->students[1]; + $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign'); + + // Put both users into a group. + $group1 = $this->getDataGenerator()->create_group(array('courseid' => $this->course->id)); + $this->getDataGenerator()->create_group_member(array('groupid' => $group1->id, 'userid' => $student1->id)); + $this->getDataGenerator()->create_group_member(array('groupid' => $group1->id, 'userid' => $student2->id)); + + $this->setUser($student1); + + // Simulate a submission. + $data = new stdClass(); + $data->onlinetext_editor = array( + 'itemid' => file_get_unused_draft_itemid(), + 'text' => 'Student submission text', + 'format' => FORMAT_MOODLE + ); + $completion = new completion_info($this->course); + + $notices = array(); + $assign->save_submission($data, $notices); + + $submission = $assign->get_user_submission($student1->id, true); + $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED; + $submission->groupid = $group1->id; + + // Check that completion is not met yet. + $completiondata = $completion->get_data($cm, false, $student1->id); + $this->assertEquals(0, $completiondata->completionstate); + $completiondata = $completion->get_data($cm, false, $student2->id); + $this->assertEquals(0, $completiondata->completionstate); + $assign->testable_update_activity_completion_records(1, 0, $submission, $student1->id, + COMPLETION_COMPLETE, $completion); + // Completion should now be met. + $completiondata = $completion->get_data($cm, false, $student1->id); + $this->assertEquals(1, $completiondata->completionstate); + $completiondata = $completion->get_data($cm, false, $student2->id); + $this->assertEquals(1, $completiondata->completionstate); + } }