From 1206a4878cdd2da2af6852613dafd8529fe2fba7 Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Wed, 10 Oct 2018 12:53:33 +0200 Subject: [PATCH] MDL-63522 course: Return more fields in get_course_content WS We need those fields on the mobile app to be able to render the course view properly. --- course/externallib.php | 7 ++++++ course/tests/externallib_test.php | 37 ++++++++++++++++++++++++------- course/upgrade.txt | 6 ++++- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/course/externallib.php b/course/externallib.php index 0873f466e3c..6b1ff3424d9 100644 --- a/course/externallib.php +++ b/course/externallib.php @@ -261,6 +261,9 @@ class core_course_external extends external_api { $module['modplural'] = $cm->modplural; $module['modicon'] = $cm->get_icon_url()->out(false); $module['indent'] = $cm->indent; + $module['onclick'] = $cm->onclick; + $module['afterlink'] = $cm->afterlink; + $module['customdata'] = json_encode($cm->customdata); if (!empty($cm->showdescription) or $cm->modname == 'label') { // We want to use the external format. However from reading get_formatted_content(), $cm->content format is always FORMAT_HTML. @@ -408,6 +411,10 @@ class core_course_external extends external_api { 'modplural' => new external_value(PARAM_TEXT, 'activity module plural name'), 'availability' => new external_value(PARAM_RAW, 'module availability settings', VALUE_OPTIONAL), 'indent' => new external_value(PARAM_INT, 'number of identation in the site'), + 'onclick' => new external_value(PARAM_RAW, 'Onclick action.', VALUE_OPTIONAL), + 'afterlink' => new external_value(PARAM_RAW, 'After link info to be displayed.', + VALUE_OPTIONAL), + 'customdata' => new external_value(PARAM_RAW, 'Custom data (JSON encoded).', VALUE_OPTIONAL), 'contents' => new external_multiple_structure( new external_single_structure( array( diff --git a/course/tests/externallib_test.php b/course/tests/externallib_test.php index e7759b05647..5981b0c7f0a 100644 --- a/course/tests/externallib_test.php +++ b/course/tests/externallib_test.php @@ -809,15 +809,24 @@ class core_course_externallib_testcase extends externallib_advanced_testcase { global $DB, $CFG; $CFG->allowstealth = 1; // Allow stealth activities. + $CFG->enablecompletion = true; + $CFG->forum_allowforcedreadtracking = 1; + $course = self::getDataGenerator()->create_course(['numsections' => 4, 'enablecompletion' => 1]); - $course = self::getDataGenerator()->create_course(['numsections' => 4]); $forumdescription = 'This is the forum description'; $forum = $this->getDataGenerator()->create_module('forum', - array('course' => $course->id, 'intro' => $forumdescription), - array('showdescription' => true)); + array('course' => $course->id, 'intro' => $forumdescription, 'trackingtype' => 2), + array('showdescription' => true, 'completion' => COMPLETION_TRACKING_MANUAL)); $forumcm = get_coursemodule_from_id('forum', $forum->cmid); - $data = $this->getDataGenerator()->create_module('data', array('assessed' => 1, 'scale' => 100, 'course' => $course->id)); - $datacm = get_coursemodule_from_instance('page', $data->id); + // Add discussions to the tracking forced forum. + $record = new stdClass(); + $record->course = $course->id; + $record->userid = 0; + $record->forum = $forum->id; + $discussionforce = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record); + $data = $this->getDataGenerator()->create_module('data', + array('assessed' => 1, 'scale' => 100, 'course' => $course->id, 'completion' => 2, 'completionentries' => 3)); + $datacm = get_coursemodule_from_instance('data', $data->id); $page = $this->getDataGenerator()->create_module('page', array('course' => $course->id)); $pagecm = get_coursemodule_from_instance('page', $page->id); // This is an stealth page (set by visibleoncoursepage). @@ -830,7 +839,8 @@ class core_course_externallib_testcase extends externallib_advanced_testcase { $tomorrow = time() + DAYSECS; // Module with availability restrictions not met. $url = $this->getDataGenerator()->create_module('url', - array('course' => $course->id, 'name' => 'URL: % & $ ../', 'section' => 2), + array('course' => $course->id, 'name' => 'URL: % & $ ../', 'section' => 2, 'display' => RESOURCELIB_DISPLAY_POPUP, + 'popupwidth' => 100, 'popupheight' => 100), array('availability' => '{"op":"&","c":[{"type":"date","d":">=","t":' . $tomorrow . '}],"showc":[true]}')); $urlcm = get_coursemodule_from_instance('url', $url->id); // Module for the last section. @@ -891,7 +901,8 @@ class core_course_externallib_testcase extends externallib_advanced_testcase { array('noclean' => true, 'para' => false, 'filter' => false)); $this->assertEquals($formattedtext, $module['description']); $this->assertEquals($forumcm->instance, $module['instance']); - $testexecuted = $testexecuted + 1; + $this->assertContains('1 unread post', $module['afterlink']); + $testexecuted = $testexecuted + 2; } else if ($module['id'] == $labelcm->id and $module['modname'] == 'label') { $cm = $modinfo->cms[$labelcm->id]; $formattedtext = format_text($cm->content, FORMAT_HTML, @@ -899,9 +910,19 @@ class core_course_externallib_testcase extends externallib_advanced_testcase { $this->assertEquals($formattedtext, $module['description']); $this->assertEquals($labelcm->instance, $module['instance']); $testexecuted = $testexecuted + 1; + } else if ($module['id'] == $datacm->id and $module['modname'] == 'data') { + $this->assertContains('customcompletionrules', $module['customdata']); + $testexecuted = $testexecuted + 1; } } - $this->assertEquals(2, $testexecuted); + foreach ($sections[2]['modules'] as $module) { + if ($module['id'] == $urlcm->id and $module['modname'] == 'url') { + $this->assertContains('width=100,height=100', $module['onclick']); + $testexecuted = $testexecuted + 1; + } + } + + $this->assertEquals(5, $testexecuted); $this->assertEquals(0, $sections[0]['section']); $this->assertCount(5, $sections[0]['modules']); diff --git a/course/upgrade.txt b/course/upgrade.txt index d95217078aa..a1fa8bafb2d 100644 --- a/course/upgrade.txt +++ b/course/upgrade.txt @@ -3,8 +3,12 @@ information provided here is intended especially for developers. === 3.6 === - * External function core_course_external::get_course_public_information now returns the roles and the primary role of course + * External function core_course_external::get_course_public_information now returns the roles and the primary role of course contacts. + * External function core_course_external::get_course_contents now return the following additional file fields: + - onclick (onclick javascript action code) + - afterlink (after link info to be displayed) + - customdata (module custom data (JSON encoded)) === 3.5 ===