From ab14ab741e320c8a969a57a6b7e1e9b3a079d291 Mon Sep 17 00:00:00 2001 From: Frederic Massart Date: Fri, 14 Nov 2014 14:35:35 +0800 Subject: [PATCH] MDL-48180 mod_assign: By default do not count 'new' submissions --- mod/assign/locallib.php | 18 ++++-- mod/assign/tests/locallib_test.php | 91 ++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 4 deletions(-) diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index 2e3fec6a1c0..7d00af2e43a 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -1501,9 +1501,10 @@ class assign { /** * Load a count of submissions. * + * @param bool $includenew When true, also counts the submissions with status 'new'. * @return int number of submissions */ - public function count_submissions() { + public function count_submissions($includenew = false) { global $DB; if (!$this->has_instance()) { @@ -1511,6 +1512,12 @@ class assign { } $params = array(); + $sqlnew = ''; + + if (!$includenew) { + $sqlnew = ' AND s.status <> :status '; + $params['status'] = ASSIGN_SUBMISSION_STATUS_NEW; + } if ($this->get_instance()->teamsubmission) { // We cannot join on the enrolment tables for group submissions (no userid). @@ -1519,14 +1526,16 @@ class assign { WHERE s.assignment = :assignid AND s.timemodified IS NOT NULL AND - s.userid = :groupuserid'; + s.userid = :groupuserid' . + $sqlnew; $params['assignid'] = $this->get_instance()->id; $params['groupuserid'] = 0; } else { $currentgroup = groups_get_activity_group($this->get_course_module(), true); - list($esql, $params) = get_enrolled_sql($this->get_context(), 'mod/assign:submit', $currentgroup, true); + list($esql, $enrolparams) = get_enrolled_sql($this->get_context(), 'mod/assign:submit', $currentgroup, true); + $params = array_merge($params, $enrolparams); $params['assignid'] = $this->get_instance()->id; $sql = 'SELECT COUNT(DISTINCT s.userid) @@ -1534,7 +1543,8 @@ class assign { JOIN(' . $esql . ') e ON e.id = s.userid WHERE s.assignment = :assignid AND - s.timemodified IS NOT NULL'; + s.timemodified IS NOT NULL ' . + $sqlnew; } diff --git a/mod/assign/tests/locallib_test.php b/mod/assign/tests/locallib_test.php index f1a0c3bdaeb..94d10fdfe54 100644 --- a/mod/assign/tests/locallib_test.php +++ b/mod/assign/tests/locallib_test.php @@ -322,6 +322,13 @@ class mod_assign_locallib_testcase extends mod_assign_base_testcase { // Simulate a submission. $this->setUser($this->students[0]); $submission = $assign->get_user_submission($this->students[0]->id, true); + + // The submission is still new. + $this->assertEquals(false, $assign->has_submissions_or_grades()); + + // Submit the submission. + $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED; + $assign->testable_update_submission($submission, $this->students[0]->id, true, false); $data = new stdClass(); $data->onlinetext_editor = array('itemid'=>file_get_unused_draft_itemid(), 'text'=>'Submission text', @@ -742,13 +749,97 @@ class mod_assign_locallib_testcase extends mod_assign_base_testcase { $assign->testable_apply_grade_to_user($data, $this->extrastudents[3]->id, 0); $assign->testable_apply_grade_to_user($data, $this->extrasuspendedstudents[0]->id, 0); + // Create a new submission with status NEW. + $this->setUser($this->extrastudents[4]); + $submission = $assign->get_user_submission($this->extrastudents[4]->id, true); + $this->assertEquals(2, $assign->count_grades()); $this->assertEquals(4, $assign->count_submissions()); + $this->assertEquals(5, $assign->count_submissions(true)); $this->assertEquals(2, $assign->count_submissions_need_grading()); $this->assertEquals(3, $assign->count_submissions_with_status(ASSIGN_SUBMISSION_STATUS_SUBMITTED)); $this->assertEquals(1, $assign->count_submissions_with_status(ASSIGN_SUBMISSION_STATUS_DRAFT)); } + public function test_count_submissions_for_groups() { + $this->create_extra_users(); + $groupid = null; + $this->setUser($this->editingteachers[0]); + $assign = $this->create_instance(array('assignsubmission_onlinetext_enabled' => 1, 'teamsubmission' => 1)); + + // Simulate a submission. + $this->setUser($this->extrastudents[0]); + $submission = $assign->get_group_submission($this->extrastudents[0]->id, $groupid, true); + $submission->status = ASSIGN_SUBMISSION_STATUS_DRAFT; + $assign->testable_update_submission($submission, $this->extrastudents[0]->id, true, false); + // Leave this one as DRAFT. + $data = new stdClass(); + $data->onlinetext_editor = array('itemid' => file_get_unused_draft_itemid(), + 'text' => 'Submission text', + 'format' => FORMAT_MOODLE); + $plugin = $assign->get_submission_plugin_by_type('onlinetext'); + $plugin->save($submission, $data); + + // Simulate adding a grade. + $this->setUser($this->teachers[0]); + $data = new stdClass(); + $data->grade = '50.0'; + $assign->testable_apply_grade_to_user($data, $this->extrastudents[0]->id, 0); + + // Simulate a submission. + $this->setUser($this->extrastudents[1]); + $submission = $assign->get_group_submission($this->extrastudents[1]->id, $groupid, true); + $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED; + $assign->testable_update_submission($submission, $this->extrastudents[1]->id, true, false); + $data = new stdClass(); + $data->onlinetext_editor = array('itemid' => file_get_unused_draft_itemid(), + 'text' => 'Submission text', + 'format' => FORMAT_MOODLE); + $plugin = $assign->get_submission_plugin_by_type('onlinetext'); + $plugin->save($submission, $data); + + // Simulate a submission. + $this->setUser($this->extrastudents[2]); + $submission = $assign->get_group_submission($this->extrastudents[2]->id, $groupid, true); + $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED; + $assign->testable_update_submission($submission, $this->extrastudents[2]->id, true, false); + $data = new stdClass(); + $data->onlinetext_editor = array('itemid' => file_get_unused_draft_itemid(), + 'text' => 'Submission text', + 'format' => FORMAT_MOODLE); + $plugin = $assign->get_submission_plugin_by_type('onlinetext'); + $plugin->save($submission, $data); + + // Simulate a submission. + $this->setUser($this->extrastudents[3]); + $submission = $assign->get_group_submission($this->extrastudents[3]->id, $groupid, true); + $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED; + $assign->testable_update_submission($submission, $this->extrastudents[3]->id, true, false); + $data = new stdClass(); + $data->onlinetext_editor = array('itemid' => file_get_unused_draft_itemid(), + 'text' => 'Submission text', + 'format' => FORMAT_MOODLE); + $plugin = $assign->get_submission_plugin_by_type('onlinetext'); + $plugin->save($submission, $data); + + // Simulate adding a grade. + $this->setUser($this->teachers[0]); + $data = new stdClass(); + $data->grade = '50.0'; + $assign->testable_apply_grade_to_user($data, $this->extrastudents[3]->id, 0); + $assign->testable_apply_grade_to_user($data, $this->extrasuspendedstudents[0]->id, 0); + + // Create a new submission with status NEW. + $this->setUser($this->extrastudents[4]); + $submission = $assign->get_group_submission($this->extrastudents[4]->id, $groupid, true); + + $this->assertEquals(2, $assign->count_grades()); + $this->assertEquals(4, $assign->count_submissions()); + $this->assertEquals(5, $assign->count_submissions(true)); + $this->assertEquals(3, $assign->count_submissions_with_status(ASSIGN_SUBMISSION_STATUS_SUBMITTED)); + $this->assertEquals(1, $assign->count_submissions_with_status(ASSIGN_SUBMISSION_STATUS_DRAFT)); + } + public function test_get_grading_userid_list() { $this->create_extra_users(); $this->setUser($this->editingteachers[0]);