Skip to content

Commit

Permalink
Merge branch 'MDL-61033-master' of https://github.com/nashtechdev01/m…
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewnicols committed Apr 9, 2018
2 parents 853508e + f4695ec commit c36eea3
Show file tree
Hide file tree
Showing 13 changed files with 156 additions and 44 deletions.
3 changes: 2 additions & 1 deletion mod/quiz/attempt.php
Expand Up @@ -39,8 +39,9 @@
// Get submitted parameters.
$attemptid = required_param('attempt', PARAM_INT);
$page = optional_param('page', 0, PARAM_INT);
$cmid = optional_param('cmid', null, PARAM_INT);

$attemptobj = quiz_attempt::create($attemptid);
$attemptobj = quiz_create_attempt_handling_errors($attemptid, $cmid);
$page = $attemptobj->force_page_number_into_range($page);
$PAGE->set_url($attemptobj->attempt_url(null, $page));

Expand Down
9 changes: 5 additions & 4 deletions mod/quiz/attemptlib.php
Expand Up @@ -340,6 +340,7 @@ public function attempt_url($attemptid, $page = 0) {
if ($page) {
$url .= '&page=' . $page;
}
$url .= '&cmid=' . $this->get_cmid();
return $url;
}

Expand All @@ -359,15 +360,15 @@ public function start_attempt_url($page = 0) {
* @return string the URL of the review of that attempt.
*/
public function review_url($attemptid) {
return new moodle_url('/mod/quiz/review.php', array('attempt' => $attemptid));
return new moodle_url('/mod/quiz/review.php', array('attempt' => $attemptid, 'cmid' => $this->get_cmid()));
}

/**
* @param int $attemptid the id of an attempt.
* @return string the URL of the review of that attempt.
*/
public function summary_url($attemptid) {
return new moodle_url('/mod/quiz/summary.php', array('attempt' => $attemptid));
return new moodle_url('/mod/quiz/summary.php', array('attempt' => $attemptid, 'cmid' => $this->get_cmid()));
}

// Bits of content =========================================================
Expand Down Expand Up @@ -1400,7 +1401,7 @@ public function attempt_url($slot = null, $page = -1, $thispage = -1) {
* @return string the URL of this quiz's summary page.
*/
public function summary_url() {
return new moodle_url('/mod/quiz/summary.php', array('attempt' => $this->attempt->id));
return new moodle_url('/mod/quiz/summary.php', array('attempt' => $this->attempt->id, 'cmid' => $this->get_cmid()));
}

/**
Expand Down Expand Up @@ -2104,7 +2105,7 @@ protected function page_and_question_url($script, $slot, $page, $showall, $thisp

} else {
$url = new moodle_url('/mod/quiz/' . $script . '.php' . $fragment,
array('attempt' => $this->attempt->id));
array('attempt' => $this->attempt->id, 'cmid' => $this->get_cmid()));
if ($page == 0 && $showall != $defaultshowall) {
$url->param('showall', (int) $showall);
} else if ($page > 0) {
Expand Down
3 changes: 2 additions & 1 deletion mod/quiz/autosave.ajax.php
Expand Up @@ -35,9 +35,10 @@
// Get submitted parameters.
$attemptid = required_param('attempt', PARAM_INT);
$thispage = optional_param('thispage', 0, PARAM_INT);
$cmid = optional_param('cmid', null, PARAM_INT);

$transaction = $DB->start_delegated_transaction();
$attemptobj = quiz_attempt::create($attemptid);
$attemptobj = quiz_create_attempt_handling_errors($attemptid, $cmid);

// Check login.
require_login($attemptobj->get_course(), false, $attemptobj->get_cm());
Expand Down
3 changes: 2 additions & 1 deletion mod/quiz/comment.php
Expand Up @@ -28,10 +28,11 @@

$attemptid = required_param('attempt', PARAM_INT);
$slot = required_param('slot', PARAM_INT); // The question number in the attempt.
$cmid = optional_param('cmid', null, PARAM_INT);

$PAGE->set_url('/mod/quiz/comment.php', array('attempt' => $attemptid, 'slot' => $slot));

$attemptobj = quiz_attempt::create($attemptid);
$attemptobj = quiz_create_attempt_handling_errors($attemptid, $cmid);
$student = $DB->get_record('user', array('id' => $attemptobj->get_userid()));

// Can only grade finished attempts.
Expand Down
3 changes: 3 additions & 0 deletions mod/quiz/lang/en/quiz.php
Expand Up @@ -90,6 +90,9 @@
$string['attemptduration'] = 'Time taken';
$string['attemptedon'] = 'Attempted on';
$string['attempterror'] = 'You are not allowed to attempt this quiz at this time because: {$a}';
$string['attempterrorinvalid'] = 'Invalid quiz attempt ID';
$string['attempterrorcontentchange'] = 'This quiz attempt no longer exists. (When a quiz is edited in-progress previews are automatically deleted.)';
$string['attempterrorcontentchangeforuser'] = 'This quiz attempt no longer exists.';
$string['attemptfirst'] = 'First attempt';
$string['attemptincomplete'] = 'That attempt (by {$a}) is not yet completed.';
$string['attemptlast'] = 'Last attempt';
Expand Down
34 changes: 33 additions & 1 deletion mod/quiz/locallib.php
Expand Up @@ -2516,4 +2516,36 @@ function quiz_extract_random_question_tag_ids($tagsjson, $matchbyid = true) {

// Only work with tags that exist.
return array_filter(array_column($tags, 'id'));
}
}

/**
* Get quiz attempt and handling error.
*
* @param int $attemptid the id of the current attempt.
* @param int|null $cmid the course_module id for this quiz.
* @return quiz_attempt $attemptobj all the data about the quiz attempt.
* @throws moodle_exception
*/
function quiz_create_attempt_handling_errors($attemptid, $cmid = null) {
try {
$attempobj = quiz_attempt::create($attemptid);
} catch (moodle_exception $e) {
if (!empty($cmid)) {
list($course, $cm) = get_course_and_cm_from_cmid($cmid, 'quiz');
$continuelink = new moodle_url('/mod/quiz/view.php', array('id' => $cmid));
$context = context_module::instance($cm->id);
if (has_capability('mod/quiz:preview', $context)) {
throw new moodle_exception('attempterrorcontentchange', 'quiz', $continuelink);
} else {
throw new moodle_exception('attempterrorcontentchangeforuser', 'quiz', $continuelink);
}
} else {
throw new moodle_exception('attempterrorinvalid', 'quiz');
}
}
if (!empty($cmid) && $attempobj->get_cmid() != $cmid) {
throw new moodle_exception('invalidcoursemodule');
} else {
return $attempobj;
}
}
3 changes: 2 additions & 1 deletion mod/quiz/processattempt.php
Expand Up @@ -44,8 +44,9 @@
$finishattempt = optional_param('finishattempt', false, PARAM_BOOL);
$timeup = optional_param('timeup', 0, PARAM_BOOL); // True if form was submitted by timer.
$scrollpos = optional_param('scrollpos', '', PARAM_RAW);
$cmid = optional_param('cmid', null, PARAM_INT);

$attemptobj = quiz_attempt::create($attemptid);
$attemptobj = quiz_create_attempt_handling_errors($attemptid, $cmid);

// Set $nexturl now.
if ($next) {
Expand Down
4 changes: 3 additions & 1 deletion mod/quiz/renderer.php
Expand Up @@ -479,7 +479,8 @@ public function attempt_form($attemptobj, $page, $slots, $id, $nextpage) {

// Start the form.
$output .= html_writer::start_tag('form',
array('action' => $attemptobj->processattempt_url(), 'method' => 'post',
array('action' => new moodle_url($attemptobj->processattempt_url(),
array('cmid' => $attemptobj->get_cmid())), 'method' => 'post',
'enctype' => 'multipart/form-data', 'accept-charset' => 'utf-8',
'id' => 'responseform'));
$output .= html_writer::start_tag('div');
Expand Down Expand Up @@ -731,6 +732,7 @@ public function summary_page_controls($attemptobj) {
'finishattempt' => 1,
'timeup' => 0,
'slots' => '',
'cmid' => $attemptobj->get_cmid(),
'sesskey' => sesskey(),
);

Expand Down
3 changes: 2 additions & 1 deletion mod/quiz/review.php
Expand Up @@ -33,6 +33,7 @@
$attemptid = required_param('attempt', PARAM_INT);
$page = optional_param('page', 0, PARAM_INT);
$showall = optional_param('showall', null, PARAM_BOOL);
$cmid = optional_param('cmid', null, PARAM_INT);

$url = new moodle_url('/mod/quiz/review.php', array('attempt'=>$attemptid));
if ($page !== 0) {
Expand All @@ -42,7 +43,7 @@
}
$PAGE->set_url($url);

$attemptobj = quiz_attempt::create($attemptid);
$attemptobj = quiz_create_attempt_handling_errors($attemptid, $cmid);
$page = $attemptobj->force_page_number_into_range($page);

// Now we can validate the params better, re-genrate the page URL.
Expand Down
3 changes: 2 additions & 1 deletion mod/quiz/reviewquestion.php
Expand Up @@ -30,6 +30,7 @@
$attemptid = required_param('attempt', PARAM_INT);
$slot = required_param('slot', PARAM_INT);
$seq = optional_param('step', null, PARAM_INT);
$cmid = optional_param('cmid', null, PARAM_INT);

$baseurl = new moodle_url('/mod/quiz/reviewquestion.php',
array('attempt' => $attemptid, 'slot' => $slot));
Expand All @@ -39,7 +40,7 @@
}
$PAGE->set_url($currenturl);

$attemptobj = quiz_attempt::create($attemptid);
$attemptobj = quiz_create_attempt_handling_errors($attemptid, $cmid);

// Check login.
require_login($attemptobj->get_course(), false, $attemptobj->get_cm());
Expand Down
3 changes: 2 additions & 1 deletion mod/quiz/summary.php
Expand Up @@ -27,10 +27,11 @@
require_once($CFG->dirroot . '/mod/quiz/locallib.php');

$attemptid = required_param('attempt', PARAM_INT); // The attempt to summarise.
$cmid = optional_param('cmid', null, PARAM_INT);

$PAGE->set_url('/mod/quiz/summary.php', array('attempt' => $attemptid));

$attemptobj = quiz_attempt::create($attemptid);
$attemptobj = quiz_create_attempt_handling_errors($attemptid, $cmid);

// Check login.
require_login($attemptobj->get_course(), false, $attemptobj->get_cm());
Expand Down
62 changes: 31 additions & 31 deletions mod/quiz/tests/attempt_test.php
Expand Up @@ -105,19 +105,19 @@ public function test_attempt_url() {

// Attempt pages.
$this->assertEquals(new moodle_url(
'/mod/quiz/attempt.php?attempt=123'),
'/mod/quiz/attempt.php?attempt=123&cmid=0'),
$attempt->attempt_url());

$this->assertEquals(new moodle_url(
'/mod/quiz/attempt.php?attempt=123&page=2'),
'/mod/quiz/attempt.php?attempt=123&page=2&cmid=0'),
$attempt->attempt_url(null, 2));

$this->assertEquals(new moodle_url(
'/mod/quiz/attempt.php?attempt=123&page=1#'),
'/mod/quiz/attempt.php?attempt=123&page=1&cmid=0#'),
$attempt->attempt_url(3));

$this->assertEquals(new moodle_url(
'/mod/quiz/attempt.php?attempt=123&page=1#q4'),
'/mod/quiz/attempt.php?attempt=123&page=1&cmid=0#q4'),
$attempt->attempt_url(4));

$this->assertEquals(new moodle_url(
Expand All @@ -134,52 +134,52 @@ public function test_attempt_url() {

// Summary page.
$this->assertEquals(new moodle_url(
'/mod/quiz/summary.php?attempt=123'),
'/mod/quiz/summary.php?attempt=123&cmid=0'),
$attempt->summary_url());

// Review page.
$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=123'),
'/mod/quiz/review.php?attempt=123&cmid=0'),
$attempt->review_url());

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=123&page=2'),
'/mod/quiz/review.php?attempt=123&page=2&cmid=0'),
$attempt->review_url(null, 2));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=123&page=1'),
'/mod/quiz/review.php?attempt=123&page=1&cmid=0'),
$attempt->review_url(3, -1, false));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=123&page=1#q4'),
'/mod/quiz/review.php?attempt=123&page=1&cmid=0#q4'),
$attempt->review_url(4, -1, false));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=123'),
'/mod/quiz/review.php?attempt=123&cmid=0'),
$attempt->review_url(null, 2, true));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=123'),
'/mod/quiz/review.php?attempt=123&cmid=0'),
$attempt->review_url(1, -1, true));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=123&page=2'),
'/mod/quiz/review.php?attempt=123&page=2&cmid=0'),
$attempt->review_url(null, 2, false));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=123&showall=0'),
'/mod/quiz/review.php?attempt=123&showall=0&cmid=0'),
$attempt->review_url(null, 0, false));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=123&showall=0'),
'/mod/quiz/review.php?attempt=123&showall=0&cmid=0'),
$attempt->review_url(1, -1, false));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=123&page=1'),
'/mod/quiz/review.php?attempt=123&page=1&cmid=0'),
$attempt->review_url(3, -1, false));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=123&page=2'),
'/mod/quiz/review.php?attempt=123&page=2&cmid=0'),
$attempt->review_url(null, 2));

$this->assertEquals(new moodle_url(
Expand All @@ -203,7 +203,7 @@ public function test_attempt_url() {
$attempt->review_url(1, -1, true, 0));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=123&page=2'),
'/mod/quiz/review.php?attempt=123&page=2&cmid=0'),
$attempt->review_url(null, 2, false, 0));

$this->assertEquals(new moodle_url(
Expand All @@ -215,7 +215,7 @@ public function test_attempt_url() {
$attempt->review_url(1, -1, false, 0));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=123&page=1#'),
'/mod/quiz/review.php?attempt=123&page=1&cmid=0#'),
$attempt->review_url(3, -1, false, 0));

// Review with more than 50 questions in the quiz.
Expand All @@ -225,47 +225,47 @@ public function test_attempt_url() {
'41,42,43,44,45,46,47,48,49,50,0,51,52,53,54,55,56,57,58,59,60,0');

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=124'),
'/mod/quiz/review.php?attempt=124&cmid=0'),
$attempt->review_url());

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=124&page=2'),
'/mod/quiz/review.php?attempt=124&page=2&cmid=0'),
$attempt->review_url(null, 2));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=124&page=1'),
'/mod/quiz/review.php?attempt=124&page=1&cmid=0'),
$attempt->review_url(11, -1, false));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=124&page=1#q12'),
'/mod/quiz/review.php?attempt=124&page=1&cmid=0#q12'),
$attempt->review_url(12, -1, false));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=124&showall=1'),
'/mod/quiz/review.php?attempt=124&showall=1&cmid=0'),
$attempt->review_url(null, 2, true));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=124&showall=1'),
'/mod/quiz/review.php?attempt=124&showall=1&cmid=0'),
$attempt->review_url(1, -1, true));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=124&page=2'),
'/mod/quiz/review.php?attempt=124&page=2&cmid=0'),
$attempt->review_url(null, 2, false));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=124'),
'/mod/quiz/review.php?attempt=124&cmid=0'),
$attempt->review_url(null, 0, false));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=124&page=1'),
'/mod/quiz/review.php?attempt=124&page=1&cmid=0'),
$attempt->review_url(11, -1, false));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=124&page=1#q12'),
'/mod/quiz/review.php?attempt=124&page=1&cmid=0#q12'),
$attempt->review_url(12, -1, false));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=124&page=2'),
'/mod/quiz/review.php?attempt=124&page=2&cmid=0'),
$attempt->review_url(null, 2));

$this->assertEquals(new moodle_url(
Expand All @@ -289,7 +289,7 @@ public function test_attempt_url() {
$attempt->review_url(1, -1, true, 0));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=124&page=2'),
'/mod/quiz/review.php?attempt=124&page=2&cmid=0'),
$attempt->review_url(null, 2, false, 0));

$this->assertEquals(new moodle_url(
Expand All @@ -301,7 +301,7 @@ public function test_attempt_url() {
$attempt->review_url(1, -1, false, 0));

$this->assertEquals(new moodle_url(
'/mod/quiz/review.php?attempt=124&page=1#'),
'/mod/quiz/review.php?attempt=124&page=1&cmid=0#'),
$attempt->review_url(11, -1, false, 0));
}
}

0 comments on commit c36eea3

Please sign in to comment.