# This patch file was generated by NetBeans IDE # This patch can be applied using context Tools: Apply Diff Patch action on respective folder. # It uses platform neutral UTF-8 encoding. # Above lines and this line are ignored by the patching process. Index: moodle/course/externallib.php --- moodle/course/externallib.php Base (1.2) +++ moodle/course/externallib.php Locally Modified (Based On 1.2) @@ -16,18 +16,149 @@ // along with Moodle. If not, see . /** - * External user API + * External course API * * @package core * @subpackage course - * @copyright 2009 Moodle Pty Ltd (http://moodle.com) + * @copyright 2010 Moodle Pty Ltd (http://moodle.com) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ - defined('MOODLE_INTERNAL') || die; require_once("$CFG->libdir/externallib.php"); class moodle_course_external extends external_api { + /** + * Returns description of method parameters + * @return external_function_parameters + */ + public static function get_courses_parameters() { + return new external_function_parameters( + array('options' => new external_single_structure( + array('ids' => new external_multiple_structure( + new external_value(PARAM_INT, 'Course id') + , 'List of course id.', VALUE_OPTIONAL) + ), 'options - operator OR is used', VALUE_DEFAULT, array()) + ) + ); } + + /** + * Get courses + * @param array $options + * @return array + */ + public static function get_courses($options) { + global $CFG, $DB; + require_once($CFG->dirroot . "/course/lib.php"); + + // Ensure the current user is allowed to run this function + $context = get_context_instance(CONTEXT_SYSTEM); + self::validate_context($context); + require_capability('moodle/course:view', $context); + + //validate parameter + $params = self::validate_parameters(self::get_courses_parameters(), array('options' => $options)); + + //retrieve courses + $courses = get_courses_by_ids($params['options']['ids']); + + //create return value + $coursesinfo = array(); + foreach ($courses as $course) { + + $courseinfo = array(); + $courseinfo['id'] = $course->id; + $courseinfo['fullname'] = $course->fullname; + $courseinfo['shortname'] = $course->shortname; + $courseinfo['categoryid'] = $course->category; + $courseinfo['categorysortorder'] = $course->sortorder; + $courseinfo['idnumber'] = $course->idnumber; + $courseinfo['summary'] = $course->summary; + $courseinfo['summaryformat'] = $course->summaryformat; + $courseinfo['format'] = $course->format; + $courseinfo['showgrades'] = $course->showgrades; + $courseinfo['showreports'] = $course->showreports; + $courseinfo['newsitems'] = $course->newsitems; + $courseinfo['startdate'] = $course->startdate; + $courseinfo['numsections'] = $course->numsections; + $courseinfo['maxbytes'] = $course->maxbytes; + $courseinfo['visible'] = $course->visible; + $courseinfo['hiddensections'] = $course->hiddensections; + $courseinfo['groupmode'] = $course->groupmode; + $courseinfo['groupmodeforce'] = $course->groupmodeforce; + $courseinfo['defaultgroupingid'] = $course->defaultgroupingid; + $courseinfo['lang'] = $course->lang; + $courseinfo['timecreated'] = $course->timecreated; + $courseinfo['timemodified'] = $course->timemodified; + $courseinfo['forcetheme'] = $course->theme; + + //some field should be returned only if admin right + //TODO: confirm the fields with Martin + if (require_capability('moodle/course:update', $context)) { + $courseinfo['enablecompletion'] = $course->enablecompletion; + $courseinfo['completionstartonenrol'] = $course->completionstartonenrol; + $courseinfo['completionnotify'] = $course->completionnotify; + } + + /// TODO: Retrieve some major enrolment settings + //manuel enrolment + //guest enrolment + //self enrolment + + $coursesinfo[] = $courseinfo; + } + + + + return $coursesinfo; + } + + /** + * Returns description of method result value + * @return external_description + */ + public static function get_courses_returns() { + return new external_multiple_structure( + new external_single_structure( + array( + 'id' => new external_value(PARAM_INT, 'course id'), + 'shortname' => new external_value(PARAM_TEXT, 'course short name'), + 'categoryid' => new external_value(PARAM_INT, 'category id'), + 'categorysortorder' => new external_value(PARAM_INT, 'sort order into the category'), + 'fullname' => new external_value(PARAM_TEXT, 'full name'), + 'idnumber' => new external_value(PARAM_RAW, 'id number'), + 'summary' => new external_value(PARAM_RAW, 'summary'), + 'summaryformat' => new external_value(PARAM_INT, 'the summary text Moodle format'), + 'format' => new external_value(PARAM_ALPHANUMEXT, 'course format: weeks, topins, social, site,..'), + 'showgrades' => new external_value(PARAM_INT, '1 if grades are shown, otherwise 0'), + 'newsitems' => new external_value(PARAM_INT, 'number of recent items appearing on the course page'), + 'startdate' => new external_value(PARAM_INT, 'timestamp when the course start'), + 'numsections' => new external_value(PARAM_INT, 'number of weeks/topics'), + 'maxbytes' => new external_value(PARAM_INT, 'largest size of file that can be uploaded into the course'), + 'showreports' => new external_value(PARAM_INT, 'are activity report shown (yes = 1, no =0)'), + 'visible' => new external_value(PARAM_INT, '1: available to student, 0:not available'), + 'hiddensections' => new external_value(PARAM_INT, 'How the hidden sections in the course are displayed to students'), + 'groupmode' => new external_value(PARAM_INT, 'no group, separate, visible'), + 'groupmodeforce' => new external_value(PARAM_INT, '1: yes, 0: no'), + 'defaultgroupingid' => new external_value(PARAM_INT, 'default grouping id'), + 'timecreated' => new external_value(PARAM_INT, 'timestamp when the course have been created'), + 'timemodified' => new external_value(PARAM_INT, 'timestamp when the course have been modified'), + 'enablecompletion' => new external_value(PARAM_INT, 'Enabled, control via completion and activity settings. Disbaled, not shown in activity settings.', VALUE_OPTIONAL), + 'completionstartonenrol' => new external_value(PARAM_INT, '1: begin tracking a student\'s progress in course completion after course enrolment. 0: does not', VALUE_OPTIONAL), + 'completionnotify' => new external_value(PARAM_INT, '1: yes 0: no', VALUE_OPTIONAL), + 'lang' => new external_value(PARAM_ALPHANUMEXT, 'forced course language', VALUE_OPTIONAL), + 'forcetheme' => new external_value(PARAM_ALPHANUMEXT, 'name of the force theme', VALUE_OPTIONAL), + 'manualenrol' => new external_value(PARAM_INT, '1: manual enrolment enabled 0: no', VALUE_OPTIONAL), + 'guestallowed' => new external_value(PARAM_INT, '1: guests allowed 0: no', VALUE_OPTIONAL), + 'guestpassword' => new external_value(PARAM_RAW, 'password for guest', VALUE_OPTIONAL), + 'selfenrol' => new external_value(PARAM_INT, '1: self enrolment allowed 0: no', VALUE_OPTIONAL), + 'enrolkey' => new external_value(PARAM_RAW, 'key for enrolment', VALUE_OPTIONAL), + 'selfenrolroleid' => new external_value(PARAM_INT, 'role id of role assigned to people self enrolled', VALUE_OPTIONAL), + ), 'course' + ) + ); + } + +} \ No newline at end of file Index: moodle/course/lib.php --- moodle/course/lib.php Base (1.747) +++ moodle/course/lib.php Locally Modified (Based On 1.747) @@ -1875,6 +1875,18 @@ } /** + * Return courses for some given ids + * @param object $options + * $options->ids array of integer + * @return array of courses + */ +function get_courses_by_ids($ids) { + global $DB; + $courses = $DB->get_records_list('course', 'id', $ids); + return $courses; +} + +/** * This function generates a structured array of courses and categories. * * The depth of categories is limited by $CFG->maxcategorydepth however there Index: moodle/lib/db/services.php --- moodle/lib/db/services.php Base (1.15) +++ moodle/lib/db/services.php Locally Modified (Based On 1.15) @@ -83,6 +83,10 @@ 'description' => 'Deletes group members.', 'type' => 'delete', ), + + + // === file related functions === + 'moodle_file_get_files' => array( 'classname' => 'moodle_file_external', 'methodname' => 'get_files', @@ -99,6 +103,7 @@ ), // === user related functions === + 'moodle_user_create_users' => array( 'classname' => 'moodle_user_external', 'methodname' => 'create_users', @@ -155,4 +160,13 @@ 'type' => 'write', ), + // === user related functions === + + 'moodle_course_get_courses' => array( + 'classname' => 'moodle_course_external', + 'methodname' => 'get_courses', + 'classpath' => 'course/externallib.php', + 'description' => 'Return course details', + 'type' => 'read', + ), ); Index: moodle/webservice/simpletest/testwebservice.php --- moodle/webservice/simpletest/testwebservice.php Base (1.1) +++ moodle/webservice/simpletest/testwebservice.php Locally Modified (Based On 1.1) @@ -62,12 +62,13 @@ //protocols to test $this->testrest = false; //Does not work till XML => PHP is implemented (MDL-22965) - $this->testxmlrpc = false; - $this->testsoap = false; + $this->testxmlrpc = true; + $this->testsoap = true; ////// DB READ-ONLY tests //// $this->readonlytests = array( - 'moodle_group_get_groups' => false + 'moodle_group_get_groups' => false, + 'moodle_course_get_courses' => true ); ////// DB WRITE tests //// @@ -194,6 +195,71 @@ $this->assertEqual(count($groups), count($groupids)); } + function moodle_course_get_courses($client) { + global $DB; + + $function = 'moodle_course_get_courses'; + + //retrieve all courses from db + $dbcourses = $DB->get_records('course'); + $courseids = array(); + foreach ($dbcourses as $dbcourse) { + $courseids[] = $dbcourse->id; + } + + //retrieve all courses by id + $params = array('options' => array('ids' => $courseids)); + $courses = $client->call($function, $params); + + //check it is the same course count + $this->assertEqual(count($courses), count($courseids)); + + //check all course values are identic + foreach ($courses as $course) { + $this->assertEqual($course['fullname'], $dbcourses[$course['id']]->fullname); + $this->assertEqual($course['shortname'], $dbcourses[$course['id']]->shortname); + $this->assertEqual($course['categoryid'], $dbcourses[$course['id']]->category); + $this->assertEqual($course['categorysortorder'], $dbcourses[$course['id']]->sortorder); + $this->assertEqual($course['idnumber'], $dbcourses[$course['id']]->idnumber); + $this->assertEqual($course['summary'], $dbcourses[$course['id']]->summary); + $this->assertEqual($course['summaryformat'], $dbcourses[$course['id']]->summaryformat); + $this->assertEqual($course['format'], $dbcourses[$course['id']]->format); + $this->assertEqual($course['showgrades'], $dbcourses[$course['id']]->showgrades); + $this->assertEqual($course['newsitems'], $dbcourses[$course['id']]->newsitems); + $this->assertEqual($course['startdate'], $dbcourses[$course['id']]->startdate); + $this->assertEqual($course['numsections'], $dbcourses[$course['id']]->numsections); + $this->assertEqual($course['maxbytes'], $dbcourses[$course['id']]->maxbytes); + $this->assertEqual($course['visible'], $dbcourses[$course['id']]->visible); + $this->assertEqual($course['hiddensections'], $dbcourses[$course['id']]->hiddensections); + $this->assertEqual($course['groupmode'], $dbcourses[$course['id']]->groupmode); + $this->assertEqual($course['groupmodeforce'], $dbcourses[$course['id']]->groupmodeforce); + $this->assertEqual($course['defaultgroupingid'], $dbcourses[$course['id']]->defaultgroupingid); + $this->assertEqual($course['lang'], $dbcourses[$course['id']]->lang); + $this->assertEqual($course['timecreated'], $dbcourses[$course['id']]->timecreated); + $this->assertEqual($course['timemodified'], $dbcourses[$course['id']]->timemodified); + if (!empty($dbcourses[$course['id']]->enablecompletion)) { + $this->assertEqual($course['enablecompletion'], $dbcourses[$course['id']]->enablecompletion); + } + if (!empty($dbcourses[$course['id']]->completionstartonenrol)) { + $this->assertEqual($course['completionstartonenrol'], $dbcourses[$course['id']]->completionstartonenrol); + } + if (!empty($dbcourses[$course['id']]->completionnotify)) { + $this->assertEqual($course['completionnotify'], $dbcourses[$course['id']]->completionnotify); + } + $this->assertEqual($course['forcetheme'], $dbcourses[$course['id']]->theme); + + //TODO: Retrieve enrolment settings + // + //Test enrolement settings +// $this->assertEqual($course['manualenrol'], $dbcourses[$course['id']]->manualenrol); +// $this->assertEqual($course['guestallowed'], $dbcourses[$course['id']]->guestallowed); +// $this->assertEqual($course['guestpassword'], $dbcourses[$course['id']]->guestpassword); +// $this->assertEqual($course['selfenrol'], $dbcourses[$course['id']]->selfenrol); +// $this->assertEqual($course['enrolkey'], $dbcourses[$course['id']]->enrolkey); +// $this->assertEqual($course['selfenrolroleid'], $dbcourses[$course['id']]->selfenrolroleid); + } + } + function moodle_user_create_users($client) { global $DB; //do not run the test if users already exists