diff --git a/mod/assign/lib.php b/mod/assign/lib.php index c4ce5673689..cd23c8ec064 100644 --- a/mod/assign/lib.php +++ b/mod/assign/lib.php @@ -1411,7 +1411,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 c5a2b1e7a94..b506521625e 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -5633,7 +5633,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) { @@ -6325,7 +6330,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) { @@ -7991,6 +8001,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; + } + } /** diff --git a/mod/assign/tests/base_test.php b/mod/assign/tests/base_test.php index 57c234b7bb7..5c92b96e622 100644 --- a/mod/assign/tests/base_test.php +++ b/mod/assign/tests/base_test.php @@ -90,7 +90,7 @@ class mod_assign_base_testcase extends advanced_testcase { $this->resetAfterTest(true); - $this->course = $this->getDataGenerator()->create_course(); + $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()); @@ -350,4 +350,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 2062696d040..65670a5d0b6 100644 --- a/mod/assign/tests/locallib_test.php +++ b/mod/assign/tests/locallib_test.php @@ -2631,4 +2631,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); + } }