diff --git a/mod/quiz/index.php b/mod/quiz/index.php index 1e9c2fdca0d..c350ff26c0b 100644 --- a/mod/quiz/index.php +++ b/mod/quiz/index.php @@ -67,17 +67,13 @@ if (!$quizzes = get_all_instances_in_course("quiz", $course)) { die; } -// Check if we need the closing date header. -$showclosingheader = false; +// Check if we need the feedback header. $showfeedback = false; foreach ($quizzes as $quiz) { - if ($quiz->timeclose!=0) { - $showclosingheader=true; - } if (quiz_has_feedback($quiz)) { $showfeedback=true; } - if ($showclosingheader && $showfeedback) { + if ($showfeedback) { break; } } @@ -86,10 +82,8 @@ foreach ($quizzes as $quiz) { $headings = array(get_string('name')); $align = array('left'); -if ($showclosingheader) { - array_push($headings, get_string('quizcloses', 'quiz')); - array_push($align, 'left'); -} +array_push($headings, get_string('quizcloses', 'quiz')); +array_push($align, 'left'); if (course_format_uses_sections($course->format)) { array_unshift($headings, get_string('sectionname', 'format_'.$course->format)); @@ -159,14 +153,10 @@ foreach ($quizzes as $quiz) { format_string($quiz->name, true) . ''; // Close date. - if ($quiz->timeclose) { - if (($timeclosedates[$quiz->id]->usertimeclose == 0) AND ($timeclosedates[$quiz->id]->usertimelimit == 0)) { - $data[] = get_string('noclose', 'quiz'); - } else { - $data[] = userdate($timeclosedates[$quiz->id]->usertimeclose); - } - } else if ($showclosingheader) { - $data[] = ''; + if (($timeclosedates[$quiz->id]->usertimeclose != 0)) { + $data[] = userdate($timeclosedates[$quiz->id]->usertimeclose); + } else { + $data[] = get_string('noclose', 'quiz'); } if ($showing == 'stats') { diff --git a/mod/quiz/locallib.php b/mod/quiz/locallib.php index 765ec30df3a..8104a55c45c 100644 --- a/mod/quiz/locallib.php +++ b/mod/quiz/locallib.php @@ -1209,18 +1209,17 @@ function quiz_get_user_image_options() { /** * Return an user's timeclose for all quizzes in a course, hereby taking into account group and user overrides. - * The query used herein is very similar to the one in function quiz_get_attempt_usertime_sql, so, in case you - * would change either one of them, make sure to apply your changes to both. * * @param int $courseid the course id. - * @return object An object with quizids and unixdates of the most lenient close overrides, if any. + * @return object An object with of all quizids and close unixdates in this course, taking into account the most lenient + * overrides, if existing and 0 if no close date is set. */ function quiz_get_user_timeclose($courseid) { global $DB, $USER; // For teacher and manager/admins return timeclose. if (has_capability('moodle/course:update', context_course::instance($courseid))) { - $sql = "SELECT quiz.id, quiz.timeclose AS usertimeclose, COALESCE(quiz.timelimit, 0) AS usertimelimit + $sql = "SELECT quiz.id, quiz.timeclose AS usertimeclose FROM {quiz} quiz WHERE quiz.course = :courseid"; @@ -1228,34 +1227,22 @@ function quiz_get_user_timeclose($courseid) { return $results; } - // The multiple qgo JOINS are necessary because we want timeclose/timelimit = 0 (unlimited) to supercede - // any other group override. - $sql = "SELECT q.id, - COALESCE(v.oneclose, v.twoclose, v.threeclose, q.timeclose, 0) AS usertimeclose, - COALESCE(v.onelimit, v.twolimit, v.threelimit, q.timelimit, 0) AS usertimelimit + COALESCE(v.userclose, v.groupclose, q.timeclose, 0) AS usertimeclose FROM ( - SELECT quiz.id AS quizid, - MAX(quo.timeclose) AS oneclose, MAX(qgo1.timeclose) AS twoclose, MAX(qgo2.timeclose) AS threeclose, - MAX(quo.timelimit) AS onelimit, MAX(qgo3.timelimit) AS twolimit, MAX(qgo4.timelimit) AS threelimit + SELECT quiz.id as quizid, + MAX(quo.timeclose) AS userclose, MAX(qgo.timeclose) AS groupclose FROM {quiz} quiz - LEFT JOIN {quiz_overrides} quo ON quo.quiz = quiz.id - LEFT JOIN {groups_members} gm ON gm.userid = quo.userid - LEFT JOIN {quiz_overrides} qgo1 ON qgo1.timeclose = 0 AND qgo1.quiz = quiz.id - LEFT JOIN {quiz_overrides} qgo2 ON qgo2.timeclose > 0 AND qgo2.quiz = quiz.id - LEFT JOIN {quiz_overrides} qgo3 ON qgo3.timelimit = 0 AND qgo3.quiz = quiz.id - LEFT JOIN {quiz_overrides} qgo4 ON qgo4.timelimit > 0 AND qgo4.quiz = quiz.id - AND qgo1.groupid = gm.groupid - AND qgo2.groupid = gm.groupid - AND qgo3.groupid = gm.groupid - AND qgo4.groupid = gm.groupid + LEFT JOIN {quiz_overrides} quo on quiz.id = quo.quiz AND quo.userid = :userid + LEFT JOIN {groups_members} gm ON gm.userid = :useringroupid + LEFT JOIN {quiz_overrides} qgo on quiz.id = qgo.quiz AND qgo.groupid = gm.groupid WHERE quiz.course = :courseid - AND ((quo.userid = :userid) OR ((gm.userid IS NULL) AND (quo.userid IS NULL))) GROUP BY quiz.id) v - JOIN {quiz} q ON q.id = v.quizid"; + JOIN {quiz} q ON q.id = v.quizid"; - $results = $DB->get_records_sql($sql, array('courseid' => $courseid, 'userid' => $USER->id)); + $results = $DB->get_records_sql($sql, array('userid' => $USER->id, 'useringroupid' => $USER->id, 'courseid' => $courseid)); return $results; + } /** diff --git a/mod/quiz/tests/locallib_test.php b/mod/quiz/tests/locallib_test.php index 7da393e90e8..5e207d3e6e2 100644 --- a/mod/quiz/tests/locallib_test.php +++ b/mod/quiz/tests/locallib_test.php @@ -311,6 +311,7 @@ class mod_quiz_locallib_testcase extends advanced_testcase { // Create generator, course and quizzes. $student1 = $this->getDataGenerator()->create_user(); $student2 = $this->getDataGenerator()->create_user(); + $student3 = $this->getDataGenerator()->create_user(); $teacher = $this->getDataGenerator()->create_user(); $course = $this->getDataGenerator()->create_course(); $quizgenerator = $this->getDataGenerator()->get_plugin_generator('mod_quiz'); @@ -323,6 +324,7 @@ class mod_quiz_locallib_testcase extends advanced_testcase { $student1id = $student1->id; $student2id = $student2->id; + $student3id = $student3->id; $teacherid = $teacher->id; // Users enrolments. @@ -330,6 +332,7 @@ class mod_quiz_locallib_testcase extends advanced_testcase { $teacherrole = $DB->get_record('role', array('shortname' => 'editingteacher')); $this->getDataGenerator()->enrol_user($student1id, $course->id, $studentrole->id, 'manual'); $this->getDataGenerator()->enrol_user($student2id, $course->id, $studentrole->id, 'manual'); + $this->getDataGenerator()->enrol_user($student3id, $course->id, $studentrole->id, 'manual'); $this->getDataGenerator()->enrol_user($teacherid, $course->id, $teacherrole->id, 'manual'); // Create groups. @@ -357,14 +360,31 @@ class mod_quiz_locallib_testcase extends advanced_testcase { $object = new stdClass(); $object->id = $quiz1->id; $object->usertimeclose = $basetimestamp + 10800; // The overriden timeclose for quiz 1. - $object->usertimelimit = 0; $comparearray[$quiz1->id] = $object; $object = new stdClass(); $object->id = $quiz2->id; $object->usertimeclose = $basetimestamp + 7200; // The unchanged timeclose for quiz 2. - $object->usertimelimit = 0; + + $comparearray[$quiz2->id] = $object; + + $this->assertEquals($comparearray, quiz_get_user_timeclose($course->id)); + + // Let's test quiz 1 closes in two hours (the original value) for user student 3 since member of no group. + $this->setUser($student3id); + $params = new stdClass(); + + $comparearray = array(); + $object = new stdClass(); + $object->id = $quiz1->id; + $object->usertimeclose = $basetimestamp + 7200; // The original timeclose for quiz 1. + + $comparearray[$quiz1->id] = $object; + + $object = new stdClass(); + $object->id = $quiz2->id; + $object->usertimeclose = $basetimestamp + 7200; // The original timeclose for quiz 2. $comparearray[$quiz2->id] = $object; @@ -386,14 +406,12 @@ class mod_quiz_locallib_testcase extends advanced_testcase { $object = new stdClass(); $object->id = $quiz1->id; $object->usertimeclose = $basetimestamp + 14400; // The overriden timeclose for quiz 1. - $object->usertimelimit = 0; $comparearray[$quiz1->id] = $object; $object = new stdClass(); $object->id = $quiz2->id; $object->usertimeclose = $basetimestamp + 7200; // The unchanged timeclose for quiz 2. - $object->usertimelimit = 0; $comparearray[$quiz2->id] = $object; @@ -407,14 +425,12 @@ class mod_quiz_locallib_testcase extends advanced_testcase { $object = new stdClass(); $object->id = $quiz1->id; $object->usertimeclose = $basetimestamp + 7200; // The unchanged timeclose for quiz 1. - $object->usertimelimit = 0; $comparearray[$quiz1->id] = $object; $object = new stdClass(); $object->id = $quiz2->id; $object->usertimeclose = $basetimestamp + 7200; // The unchanged timeclose for quiz 2. - $object->usertimelimit = 0; $comparearray[$quiz2->id] = $object;