mirror of
https://github.com/moodle/moodle.git
synced 2025-08-05 00:46:50 +02:00
Merge branch 'MDL-57760-master' of git://github.com/jleyva/moodle
This commit is contained in:
commit
76e4853585
5 changed files with 232 additions and 67 deletions
|
@ -1883,4 +1883,99 @@ class mod_lesson_external extends external_api {
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes the parameters for get_pages_possible_jumps.
|
||||||
|
*
|
||||||
|
* @return external_external_function_parameters
|
||||||
|
* @since Moodle 3.3
|
||||||
|
*/
|
||||||
|
public static function get_pages_possible_jumps_parameters() {
|
||||||
|
return new external_function_parameters (
|
||||||
|
array(
|
||||||
|
'lessonid' => new external_value(PARAM_INT, 'lesson instance id'),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return all the possible jumps for the pages in a given lesson.
|
||||||
|
*
|
||||||
|
* You may expect different results on consecutive executions due to the random nature of the lesson module.
|
||||||
|
*
|
||||||
|
* @param int $lessonid lesson instance id
|
||||||
|
* @return array of warnings and possible jumps
|
||||||
|
* @since Moodle 3.3
|
||||||
|
* @throws moodle_exception
|
||||||
|
*/
|
||||||
|
public static function get_pages_possible_jumps($lessonid) {
|
||||||
|
global $USER;
|
||||||
|
|
||||||
|
$params = array('lessonid' => $lessonid);
|
||||||
|
$params = self::validate_parameters(self::get_pages_possible_jumps_parameters(), $params);
|
||||||
|
|
||||||
|
$warnings = $jumps = array();
|
||||||
|
|
||||||
|
list($lesson, $course, $cm, $context) = self::validate_lesson($params['lessonid']);
|
||||||
|
|
||||||
|
// Only return for managers or if offline attempts are enabled.
|
||||||
|
if ($lesson->can_manage() || $lesson->allowofflineattempts) {
|
||||||
|
|
||||||
|
$lessonpages = $lesson->load_all_pages();
|
||||||
|
foreach ($lessonpages as $page) {
|
||||||
|
$jump = array();
|
||||||
|
$jump['pageid'] = $page->id;
|
||||||
|
|
||||||
|
$answers = $page->get_answers();
|
||||||
|
if (count($answers) > 0) {
|
||||||
|
foreach ($answers as $answer) {
|
||||||
|
$jump['answerid'] = $answer->id;
|
||||||
|
$jump['jumpto'] = $answer->jumpto;
|
||||||
|
$jump['calculatedjump'] = $lesson->calculate_new_page_on_jump($page, $answer->jumpto);
|
||||||
|
// Special case, only applies to branch/end of branch.
|
||||||
|
if ($jump['calculatedjump'] == LESSON_RANDOMBRANCH) {
|
||||||
|
$jump['calculatedjump'] = lesson_unseen_branch_jump($lesson, $USER->id);
|
||||||
|
}
|
||||||
|
$jumps[] = $jump;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Imported lessons from 1.x.
|
||||||
|
$jump['answerid'] = 0;
|
||||||
|
$jump['jumpto'] = $page->nextpageid;
|
||||||
|
$jump['calculatedjump'] = $lesson->calculate_new_page_on_jump($page, $page->nextpageid);
|
||||||
|
$jumps[] = $jump;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = array(
|
||||||
|
'jumps' => $jumps,
|
||||||
|
'warnings' => $warnings,
|
||||||
|
);
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes the get_pages_possible_jumps return value.
|
||||||
|
*
|
||||||
|
* @return external_single_structure
|
||||||
|
* @since Moodle 3.3
|
||||||
|
*/
|
||||||
|
public static function get_pages_possible_jumps_returns() {
|
||||||
|
return new external_single_structure(
|
||||||
|
array(
|
||||||
|
'jumps' => new external_multiple_structure(
|
||||||
|
new external_single_structure(
|
||||||
|
array(
|
||||||
|
'pageid' => new external_value(PARAM_INT, 'The page id'),
|
||||||
|
'answerid' => new external_value(PARAM_INT, 'The answer id'),
|
||||||
|
'jumpto' => new external_value(PARAM_INT, 'The jump (page id or type of jump)'),
|
||||||
|
'calculatedjump' => new external_value(PARAM_INT, 'The real page id (or EOL) to jump'),
|
||||||
|
), 'Jump for a page answer'
|
||||||
|
)
|
||||||
|
),
|
||||||
|
'warnings' => new external_warnings(),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -148,4 +148,12 @@ $functions = array(
|
||||||
'capabilities' => 'mod/lesson:viewreports',
|
'capabilities' => 'mod/lesson:viewreports',
|
||||||
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE)
|
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE)
|
||||||
),
|
),
|
||||||
|
'mod_lesson_get_pages_possible_jumps' => array(
|
||||||
|
'classname' => 'mod_lesson_external',
|
||||||
|
'methodname' => 'get_pages_possible_jumps',
|
||||||
|
'description' => 'Return all the possible jumps for the pages in a given lesson.',
|
||||||
|
'type' => 'read',
|
||||||
|
'capabilities' => 'mod/lesson:view',
|
||||||
|
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE)
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
|
@ -3164,6 +3164,85 @@ class lesson extends lesson_base {
|
||||||
return array($page, $lessoncontent);
|
return array($page, $lessoncontent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This returns a real page id to jump to (or LESSON_EOL) after processing page responses.
|
||||||
|
*
|
||||||
|
* @param lesson_page $page lesson page
|
||||||
|
* @param int $newpageid the new page id
|
||||||
|
* @return int the real page to jump to (or end of lesson)
|
||||||
|
* @since Moodle 3.3
|
||||||
|
*/
|
||||||
|
public function calculate_new_page_on_jump(lesson_page $page, $newpageid) {
|
||||||
|
global $USER, $DB;
|
||||||
|
|
||||||
|
$canmanage = $this->can_manage();
|
||||||
|
|
||||||
|
if (isset($USER->modattempts[$this->properties->id])) {
|
||||||
|
// Make sure if the student is reviewing, that he/she sees the same pages/page path that he/she saw the first time.
|
||||||
|
if ($USER->modattempts[$this->properties->id]->pageid == $page->id && $page->nextpageid == 0) {
|
||||||
|
// Remember, this session variable holds the pageid of the last page that the user saw.
|
||||||
|
$newpageid = LESSON_EOL;
|
||||||
|
} else {
|
||||||
|
$nretakes = $DB->count_records("lesson_grades", array("lessonid" => $this->properties->id, "userid" => $USER->id));
|
||||||
|
$nretakes--; // Make sure we are looking at the right try.
|
||||||
|
$attempts = $DB->get_records("lesson_attempts", array("lessonid" => $this->properties->id, "userid" => $USER->id, "retry" => $nretakes), "timeseen", "id, pageid");
|
||||||
|
$found = false;
|
||||||
|
$temppageid = 0;
|
||||||
|
// Make sure that the newpageid always defaults to something valid.
|
||||||
|
$newpageid = LESSON_EOL;
|
||||||
|
foreach ($attempts as $attempt) {
|
||||||
|
if ($found && $temppageid != $attempt->pageid) {
|
||||||
|
// Now try to find the next page, make sure next few attempts do no belong to current page.
|
||||||
|
$newpageid = $attempt->pageid;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ($attempt->pageid == $page->id) {
|
||||||
|
$found = true; // If found current page.
|
||||||
|
$temppageid = $attempt->pageid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if ($newpageid != LESSON_CLUSTERJUMP && $page->id != 0 && $newpageid > 0) {
|
||||||
|
// Going to check to see if the page that the user is going to view next, is a cluster page.
|
||||||
|
// If so, dont display, go into the cluster.
|
||||||
|
// The $newpageid > 0 is used to filter out all of the negative code jumps.
|
||||||
|
$newpage = $this->load_page($newpageid);
|
||||||
|
if ($overridenewpageid = $newpage->override_next_page($newpageid)) {
|
||||||
|
$newpageid = $overridenewpageid;
|
||||||
|
}
|
||||||
|
} else if ($newpageid == LESSON_UNSEENBRANCHPAGE) {
|
||||||
|
if ($canmanage) {
|
||||||
|
if ($page->nextpageid == 0) {
|
||||||
|
$newpageid = LESSON_EOL;
|
||||||
|
} else {
|
||||||
|
$newpageid = $page->nextpageid;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$newpageid = lesson_unseen_question_jump($this, $USER->id, $page->id);
|
||||||
|
}
|
||||||
|
} else if ($newpageid == LESSON_PREVIOUSPAGE) {
|
||||||
|
$newpageid = $page->prevpageid;
|
||||||
|
} else if ($newpageid == LESSON_RANDOMPAGE) {
|
||||||
|
$newpageid = lesson_random_question_jump($this, $page->id);
|
||||||
|
} else if ($newpageid == LESSON_CLUSTERJUMP) {
|
||||||
|
if ($canmanage) {
|
||||||
|
if ($page->nextpageid == 0) { // If teacher, go to next page.
|
||||||
|
$newpageid = LESSON_EOL;
|
||||||
|
} else {
|
||||||
|
$newpageid = $page->nextpageid;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$newpageid = $this->cluster_jump($page->id);
|
||||||
|
}
|
||||||
|
} else if ($newpageid == 0) {
|
||||||
|
$newpageid = $page->id;
|
||||||
|
} else if ($newpageid == LESSON_NEXTPAGE) {
|
||||||
|
$newpageid = $this->get_next_page($page->nextpageid);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $newpageid;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process page responses.
|
* Process page responses.
|
||||||
*
|
*
|
||||||
|
@ -3171,9 +3250,6 @@ class lesson extends lesson_base {
|
||||||
* @since Moodle 3.3
|
* @since Moodle 3.3
|
||||||
*/
|
*/
|
||||||
public function process_page_responses(lesson_page $page) {
|
public function process_page_responses(lesson_page $page) {
|
||||||
global $USER, $DB;
|
|
||||||
|
|
||||||
$canmanage = $this->can_manage();
|
|
||||||
$context = $this->get_context();
|
$context = $this->get_context();
|
||||||
|
|
||||||
// Check the page has answers [MDL-25632].
|
// Check the page has answers [MDL-25632].
|
||||||
|
@ -3189,64 +3265,10 @@ class lesson extends lesson_base {
|
||||||
|
|
||||||
if ($result->inmediatejump) {
|
if ($result->inmediatejump) {
|
||||||
return $result;
|
return $result;
|
||||||
} else if (isset($USER->modattempts[$this->properties->id])) {
|
|
||||||
// Make sure if the student is reviewing, that he/she sees the same pages/page path that he/she saw the first time.
|
|
||||||
if ($USER->modattempts[$this->properties->id]->pageid == $page->id && $page->nextpageid == 0) {
|
|
||||||
// Remember, this session variable holds the pageid of the last page that the user saw.
|
|
||||||
$result->newpageid = LESSON_EOL;
|
|
||||||
} else {
|
|
||||||
$nretakes = $DB->count_records("lesson_grades", array("lessonid" => $this->properties->id, "userid" => $USER->id));
|
|
||||||
$nretakes--; // Make sure we are looking at the right try.
|
|
||||||
$attempts = $DB->get_records("lesson_attempts", array("lessonid" => $this->properties->id, "userid" => $USER->id, "retry" => $nretakes), "timeseen", "id, pageid");
|
|
||||||
$found = false;
|
|
||||||
$temppageid = 0;
|
|
||||||
// Make sure that the newpageid always defaults to something valid.
|
|
||||||
$result->newpageid = LESSON_EOL;
|
|
||||||
foreach ($attempts as $attempt) {
|
|
||||||
if ($found && $temppageid != $attempt->pageid) {
|
|
||||||
// Now try to find the next page, make sure next few attempts do no belong to current page.
|
|
||||||
$result->newpageid = $attempt->pageid;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if ($attempt->pageid == $page->id) {
|
|
||||||
$found = true; // If found current page.
|
|
||||||
$temppageid = $attempt->pageid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if ($result->newpageid != LESSON_CLUSTERJUMP && $page->id != 0 && $result->newpageid > 0) {
|
|
||||||
// Going to check to see if the page that the user is going to view next, is a cluster page.
|
|
||||||
// If so, dont display, go into the cluster.
|
|
||||||
// The $result->newpageid > 0 is used to filter out all of the negative code jumps.
|
|
||||||
$newpage = $this->load_page($result->newpageid);
|
|
||||||
if ($newpageid = $newpage->override_next_page($result->newpageid)) {
|
|
||||||
$result->newpageid = $newpageid;
|
|
||||||
}
|
|
||||||
} else if ($result->newpageid == LESSON_UNSEENBRANCHPAGE) {
|
|
||||||
if ($canmanage) {
|
|
||||||
if ($page->nextpageid == 0) {
|
|
||||||
$result->newpageid = LESSON_EOL;
|
|
||||||
} else {
|
|
||||||
$result->newpageid = $page->nextpageid;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$result->newpageid = lesson_unseen_question_jump($this, $USER->id, $page->id);
|
|
||||||
}
|
|
||||||
} else if ($result->newpageid == LESSON_PREVIOUSPAGE) {
|
|
||||||
$result->newpageid = $page->prevpageid;
|
|
||||||
} else if ($result->newpageid == LESSON_RANDOMPAGE) {
|
|
||||||
$result->newpageid = lesson_random_question_jump($this, $page->id);
|
|
||||||
} else if ($result->newpageid == LESSON_CLUSTERJUMP) {
|
|
||||||
if ($canmanage) {
|
|
||||||
if ($page->nextpageid == 0) { // If teacher, go to next page.
|
|
||||||
$result->newpageid = LESSON_EOL;
|
|
||||||
} else {
|
|
||||||
$result->newpageid = $page->nextpageid;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$result->newpageid = $this->cluster_jump($page->id);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$result->newpageid = $this->calculate_new_page_on_jump($page, $result->newpageid);
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3992,12 +4014,6 @@ abstract class lesson_page extends lesson_base {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// TODO: merge this code with the jump code below. Convert jumpto page into a proper page id
|
|
||||||
if ($result->newpageid == 0) {
|
|
||||||
$result->newpageid = $this->properties->id;
|
|
||||||
} elseif ($result->newpageid == LESSON_NEXTPAGE) {
|
|
||||||
$result->newpageid = $this->lesson->get_next_page($this->properties->nextpageid);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine default feedback if necessary
|
// Determine default feedback if necessary
|
||||||
if (empty($result->response)) {
|
if (empty($result->response)) {
|
||||||
|
|
|
@ -1236,4 +1236,50 @@ class mod_lesson_external_testcase extends externallib_advanced_testcase {
|
||||||
$this->setExpectedException('moodle_exception');
|
$this->setExpectedException('moodle_exception');
|
||||||
$result = mod_lesson_external::get_user_attempt($this->lesson->id, $this->teacher->id, 0);
|
$result = mod_lesson_external::get_user_attempt($this->lesson->id, $this->teacher->id, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test get_pages_possible_jumps
|
||||||
|
*/
|
||||||
|
public function test_get_pages_possible_jumps() {
|
||||||
|
$this->setAdminUser();
|
||||||
|
$result = mod_lesson_external::get_pages_possible_jumps($this->lesson->id);
|
||||||
|
$result = external_api::clean_returnvalue(mod_lesson_external::get_pages_possible_jumps_returns(), $result);
|
||||||
|
|
||||||
|
$this->assertCount(0, $result['warnings']);
|
||||||
|
$this->assertCount(3, $result['jumps']); // 3 jumps, 2 from the question page and 1 from the content.
|
||||||
|
foreach ($result['jumps'] as $jump) {
|
||||||
|
if ($jump['answerid'] != 0) {
|
||||||
|
// Check only pages with answers.
|
||||||
|
if ($jump['jumpto'] == 0) {
|
||||||
|
$this->assertEquals($jump['pageid'], $jump['calculatedjump']); // 0 means to jump to current page.
|
||||||
|
} else {
|
||||||
|
// Question is configured to jump to next page if correct.
|
||||||
|
$this->assertEquals($this->page1->id, $jump['calculatedjump']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test get_pages_possible_jumps when offline attemps are disabled for a normal user
|
||||||
|
*/
|
||||||
|
public function test_get_pages_possible_jumps_with_offlineattemps_disabled() {
|
||||||
|
$this->setUser($this->student->id);
|
||||||
|
$result = mod_lesson_external::get_pages_possible_jumps($this->lesson->id);
|
||||||
|
$result = external_api::clean_returnvalue(mod_lesson_external::get_pages_possible_jumps_returns(), $result);
|
||||||
|
$this->assertCount(0, $result['jumps']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test get_pages_possible_jumps when offline attemps are enabled for a normal user
|
||||||
|
*/
|
||||||
|
public function test_get_pages_possible_jumps_with_offlineattemps_enabled() {
|
||||||
|
global $DB;
|
||||||
|
|
||||||
|
$DB->set_field('lesson', 'allowofflineattempts', 1, array('id' => $this->lesson->id));
|
||||||
|
$this->setUser($this->student->id);
|
||||||
|
$result = mod_lesson_external::get_pages_possible_jumps($this->lesson->id);
|
||||||
|
$result = external_api::clean_returnvalue(mod_lesson_external::get_pages_possible_jumps_returns(), $result);
|
||||||
|
$this->assertCount(3, $result['jumps']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
defined('MOODLE_INTERNAL') || die();
|
defined('MOODLE_INTERNAL') || die();
|
||||||
|
|
||||||
$plugin->version = 2016120516; // The current module version (Date: YYYYMMDDXX)
|
$plugin->version = 2016120517; // The current module version (Date: YYYYMMDDXX)
|
||||||
$plugin->requires = 2016112900; // Requires this Moodle version
|
$plugin->requires = 2016112900; // Requires this Moodle version
|
||||||
$plugin->component = 'mod_lesson'; // Full name of the plugin (used for diagnostics)
|
$plugin->component = 'mod_lesson'; // Full name of the plugin (used for diagnostics)
|
||||||
$plugin->cron = 0;
|
$plugin->cron = 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue