diff --git a/mod/feedback/classes/external.php b/mod/feedback/classes/external.php index 2d89f597a78..9642de3afc2 100644 --- a/mod/feedback/classes/external.php +++ b/mod/feedback/classes/external.php @@ -147,34 +147,48 @@ class mod_feedback_external extends external_api { * Utility function for validating a feedback. * * @param int $feedbackid feedback instance id - * @return array array containing the feedback persistent, course, context and course module objects + * @param int $courseid courseid course where user completes the feedback (for site feedbacks only) + * @return array containing the feedback, feedback course, context, course module and the course where is being completed. + * @throws moodle_exception * @since Moodle 3.3 */ - protected static function validate_feedback($feedbackid) { + protected static function validate_feedback($feedbackid, $courseid = 0) { global $DB, $USER; // Request and permission validation. $feedback = $DB->get_record('feedback', array('id' => $feedbackid), '*', MUST_EXIST); - list($course, $cm) = get_course_and_cm_from_instance($feedback, 'feedback'); + list($feedbackcourse, $cm) = get_course_and_cm_from_instance($feedback, 'feedback'); $context = context_module::instance($cm->id); self::validate_context($context); - return array($feedback, $course, $cm, $context); + // Set default completion course. + $completioncourse = (object) array('id' => 0); + if ($feedbackcourse->id == SITEID && $courseid) { + $completioncourse = get_course($courseid); + self::validate_context(context_course::instance($courseid)); + + $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $courseid); + if (!$feedbackcompletion->check_course_is_mapped()) { + throw new moodle_exception('cannotaccess', 'mod_feedback'); + } + } + + return array($feedback, $feedbackcourse, $cm, $context, $completioncourse); } /** * Utility function for validating access to feedback. * * @param stdClass $feedback feedback object - * @param stdClass $course course object + * @param stdClass $course course where user completes the feedback (for site feedbacks only) * @param stdClass $cm course module * @param stdClass $context context object * @throws moodle_exception - * @return feedback_completion feedback completion instance + * @return mod_feedback_completion feedback completion instance * @since Moodle 3.3 */ - protected static function validate_feedback_access($feedback, $course, $cm, $context, $checksubmit = false) { + protected static function validate_feedback_access($feedback, $course, $cm, $context, $checksubmit = false) { $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $course->id); if (!$feedbackcompletion->can_complete()) { @@ -204,7 +218,9 @@ class mod_feedback_external extends external_api { public static function get_feedback_access_information_parameters() { return new external_function_parameters ( array( - 'feedbackid' => new external_value(PARAM_INT, 'Feedback instance id.') + 'feedbackid' => new external_value(PARAM_INT, 'Feedback instance id.'), + 'courseid' => new external_value(PARAM_INT, 'Course where user completes the feedback (for site feedbacks only).', + VALUE_DEFAULT, 0), ) ); } @@ -213,20 +229,23 @@ class mod_feedback_external extends external_api { * Return access information for a given feedback. * * @param int $feedbackid feedback instance id + * @param int $courseid course where user completes the feedback (for site feedbacks only) * @return array of warnings and the access information * @since Moodle 3.3 * @throws moodle_exception */ - public static function get_feedback_access_information($feedbackid) { + public static function get_feedback_access_information($feedbackid, $courseid = 0) { global $PAGE; $params = array( - 'feedbackid' => $feedbackid + 'feedbackid' => $feedbackid, + 'courseid' => $courseid, ); $params = self::validate_parameters(self::get_feedback_access_information_parameters(), $params); - list($feedback, $course, $cm, $context) = self::validate_feedback($params['feedbackid']); - $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $course->id); + list($feedback, $course, $cm, $context, $completioncourse) = self::validate_feedback($params['feedbackid'], + $params['courseid']); + $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $completioncourse->id); $result = array(); // Capabilities first. @@ -284,6 +303,8 @@ class mod_feedback_external extends external_api { 'feedbackid' => new external_value(PARAM_INT, 'Feedback instance id'), 'moduleviewed' => new external_value(PARAM_BOOL, 'If we need to mark the module as viewed for completion', VALUE_DEFAULT, false), + 'courseid' => new external_value(PARAM_INT, 'Course where user completes the feedback (for site feedbacks only).', + VALUE_DEFAULT, 0), ) ); } @@ -293,18 +314,20 @@ class mod_feedback_external extends external_api { * * @param int $feedbackid feedback instance id * @param bool $moduleviewed If we need to mark the module as viewed for completion + * @param int $courseid course where user completes the feedback (for site feedbacks only) * @return array of warnings and status result * @since Moodle 3.3 * @throws moodle_exception */ - public static function view_feedback($feedbackid, $moduleviewed = false) { + public static function view_feedback($feedbackid, $moduleviewed = false, $courseid = 0) { - $params = array('feedbackid' => $feedbackid, 'moduleviewed' => $moduleviewed); + $params = array('feedbackid' => $feedbackid, 'moduleviewed' => $moduleviewed, 'courseid' => $courseid); $params = self::validate_parameters(self::view_feedback_parameters(), $params); $warnings = array(); - list($feedback, $course, $cm, $context) = self::validate_feedback($params['feedbackid']); - $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $course->id); + list($feedback, $course, $cm, $context, $completioncourse) = self::validate_feedback($params['feedbackid'], + $params['courseid']); + $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $completioncourse->id); // Trigger module viewed event. $feedbackcompletion->trigger_module_viewed(); @@ -348,6 +371,8 @@ class mod_feedback_external extends external_api { return new external_function_parameters ( array( 'feedbackid' => new external_value(PARAM_INT, 'Feedback instance id'), + 'courseid' => new external_value(PARAM_INT, 'Course where user completes the feedback (for site feedbacks only).', + VALUE_DEFAULT, 0), ) ); } @@ -356,19 +381,21 @@ class mod_feedback_external extends external_api { * Returns the temporary completion record for the current user. * * @param int $feedbackid feedback instance id + * @param int $courseid course where user completes the feedback (for site feedbacks only) * @return array of warnings and status result * @since Moodle 3.3 * @throws moodle_exception */ - public static function get_current_completed_tmp($feedbackid) { + public static function get_current_completed_tmp($feedbackid, $courseid = 0) { global $PAGE; - $params = array('feedbackid' => $feedbackid); + $params = array('feedbackid' => $feedbackid, 'courseid' => $courseid); $params = self::validate_parameters(self::get_current_completed_tmp_parameters(), $params); $warnings = array(); - list($feedback, $course, $cm, $context) = self::validate_feedback($params['feedbackid']); - $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $course->id); + list($feedback, $course, $cm, $context, $completioncourse) = self::validate_feedback($params['feedbackid'], + $params['courseid']); + $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $completioncourse->id); if ($completed = $feedbackcompletion->get_current_completed_tmp()) { $exporter = new feedback_completedtmp_exporter($completed); @@ -405,6 +432,8 @@ class mod_feedback_external extends external_api { return new external_function_parameters ( array( 'feedbackid' => new external_value(PARAM_INT, 'Feedback instance id'), + 'courseid' => new external_value(PARAM_INT, 'Course where user completes the feedback (for site feedbacks only).', + VALUE_DEFAULT, 0), ) ); } @@ -413,19 +442,21 @@ class mod_feedback_external extends external_api { * Returns the items (questions) in the given feedback. * * @param int $feedbackid feedback instance id + * @param int $courseid course where user completes the feedback (for site feedbacks only) * @return array of warnings and feedbacks * @since Moodle 3.3 */ - public static function get_items($feedbackid) { + public static function get_items($feedbackid, $courseid = 0) { global $PAGE; - $params = array('feedbackid' => $feedbackid); + $params = array('feedbackid' => $feedbackid, 'courseid' => $courseid); $params = self::validate_parameters(self::get_items_parameters(), $params); $warnings = array(); - list($feedback, $course, $cm, $context) = self::validate_feedback($params['feedbackid']); + list($feedback, $course, $cm, $context, $completioncourse) = self::validate_feedback($params['feedbackid'], + $params['courseid']); - $feedbackstructure = new mod_feedback_structure($feedback, $cm, $course->id); + $feedbackstructure = new mod_feedback_structure($feedback, $cm, $completioncourse->id); $returneditems = array(); if ($items = $feedbackstructure->get_items()) { foreach ($items as $item) { @@ -470,6 +501,8 @@ class mod_feedback_external extends external_api { return new external_function_parameters ( array( 'feedbackid' => new external_value(PARAM_INT, 'Feedback instance id'), + 'courseid' => new external_value(PARAM_INT, 'Course where user completes the feedback (for site feedbacks only).', + VALUE_DEFAULT, 0), ) ); } @@ -478,19 +511,21 @@ class mod_feedback_external extends external_api { * Starts or continues a feedback submission * * @param array $feedbackid feedback instance id + * @param int $courseid course where user completes a feedback (for site feedbacks only). * @return array of warnings and launch information * @since Moodle 3.3 */ - public static function launch_feedback($feedbackid) { + public static function launch_feedback($feedbackid, $courseid = 0) { global $PAGE; - $params = array('feedbackid' => $feedbackid); + $params = array('feedbackid' => $feedbackid, 'courseid' => $courseid); $params = self::validate_parameters(self::launch_feedback_parameters(), $params); $warnings = array(); - list($feedback, $course, $cm, $context) = self::validate_feedback($params['feedbackid']); + list($feedback, $course, $cm, $context, $completioncourse) = self::validate_feedback($params['feedbackid'], + $params['courseid']); // Check we can do a new submission (or continue an existing). - $feedbackcompletion = self::validate_feedback_access($feedback, $course, $cm, $context, true); + $feedbackcompletion = self::validate_feedback_access($feedback, $completioncourse, $cm, $context, true); $gopage = $feedbackcompletion->get_resume_page(); if ($gopage === null) { @@ -530,6 +565,8 @@ class mod_feedback_external extends external_api { array( 'feedbackid' => new external_value(PARAM_INT, 'Feedback instance id'), 'page' => new external_value(PARAM_INT, 'The page to get starting by 0'), + 'courseid' => new external_value(PARAM_INT, 'Course where user completes the feedback (for site feedbacks only).', + VALUE_DEFAULT, 0), ) ); } @@ -539,19 +576,21 @@ class mod_feedback_external extends external_api { * * @param int $feedbackid feedback instance id * @param int $page the page to get starting by 0 + * @param int $courseid course where user completes the feedback (for site feedbacks only) * @return array of warnings and launch information * @since Moodle 3.3 */ - public static function get_page_items($feedbackid, $page) { + public static function get_page_items($feedbackid, $page, $courseid = 0) { global $PAGE; - $params = array('feedbackid' => $feedbackid, 'page' => $page); + $params = array('feedbackid' => $feedbackid, 'page' => $page, 'courseid' => $courseid); $params = self::validate_parameters(self::get_page_items_parameters(), $params); $warnings = array(); - list($feedback, $course, $cm, $context) = self::validate_feedback($params['feedbackid']); + list($feedback, $course, $cm, $context, $completioncourse) = self::validate_feedback($params['feedbackid'], + $params['courseid']); - $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $course->id); + $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $completioncourse->id); $page = $params['page']; $pages = $feedbackcompletion->get_pages(); @@ -615,6 +654,8 @@ class mod_feedback_external extends external_api { ), 'The data to be processed.', VALUE_DEFAULT, array() ), 'goprevious' => new external_value(PARAM_BOOL, 'Whether we want to jump to previous page.', VALUE_DEFAULT, false), + 'courseid' => new external_value(PARAM_INT, 'Course where user completes the feedback (for site feedbacks only).', + VALUE_DEFAULT, 0), ) ); } @@ -626,20 +667,23 @@ class mod_feedback_external extends external_api { * @param array $page the page being processed * @param array $responses the responses to be processed * @param bool $goprevious whether we want to jump to previous page + * @param int $courseid course where user completes the feedback (for site feedbacks only) * @return array of warnings and launch information * @since Moodle 3.3 */ - public static function process_page($feedbackid, $page, $responses = [], $goprevious = false) { + public static function process_page($feedbackid, $page, $responses = [], $goprevious = false, $courseid = 0) { global $USER, $SESSION; - $params = array('feedbackid' => $feedbackid, 'page' => $page, 'responses' => $responses, 'goprevious' => $goprevious); + $params = array('feedbackid' => $feedbackid, 'page' => $page, 'responses' => $responses, 'goprevious' => $goprevious, + 'courseid' => $courseid); $params = self::validate_parameters(self::process_page_parameters(), $params); $warnings = array(); $siteaftersubmit = $completionpagecontents = ''; - list($feedback, $course, $cm, $context) = self::validate_feedback($params['feedbackid']); + list($feedback, $course, $cm, $context, $completioncourse) = self::validate_feedback($params['feedbackid'], + $params['courseid']); // Check we can do a new submission (or continue an existing). - $feedbackcompletion = self::validate_feedback_access($feedback, $course, $cm, $context, true); + $feedbackcompletion = self::validate_feedback_access($feedback, $completioncourse, $cm, $context, true); // Create the $_POST object required by the feedback question engine. $_POST = array(); @@ -653,7 +697,7 @@ class mod_feedback_external extends external_api { } // Force fields. $_POST['id'] = $cm->id; - $_POST['courseid'] = $course->id; + $_POST['courseid'] = $courseid; $_POST['gopage'] = $params['page']; $_POST['_qf__mod_feedback_complete_form'] = 1; @@ -725,6 +769,8 @@ class mod_feedback_external extends external_api { 'feedbackid' => new external_value(PARAM_INT, 'Feedback instance id'), 'groupid' => new external_value(PARAM_INT, 'Group id, 0 means that the function will determine the user group', VALUE_DEFAULT, 0), + 'courseid' => new external_value(PARAM_INT, 'Course where user completes the feedback (for site feedbacks only).', + VALUE_DEFAULT, 0), ) ); } @@ -733,20 +779,23 @@ class mod_feedback_external extends external_api { * Retrieves the feedback analysis. * * @param array $feedbackid feedback instance id + * @param int $groupid group id, 0 means that the function will determine the user group + * @param int $courseid course where user completes the feedback (for site feedbacks only) * @return array of warnings and launch information * @since Moodle 3.3 */ - public static function get_analysis($feedbackid, $groupid = 0) { + public static function get_analysis($feedbackid, $groupid = 0, $courseid = 0) { global $PAGE; - $params = array('feedbackid' => $feedbackid, 'groupid' => $groupid); + $params = array('feedbackid' => $feedbackid, 'groupid' => $groupid, 'courseid' => $courseid); $params = self::validate_parameters(self::get_analysis_parameters(), $params); $warnings = $itemsdata = array(); - list($feedback, $course, $cm, $context) = self::validate_feedback($params['feedbackid']); + list($feedback, $course, $cm, $context, $completioncourse) = self::validate_feedback($params['feedbackid'], + $params['courseid']); // Check permissions. - $feedbackstructure = new mod_feedback_structure($feedback, $cm); + $feedbackstructure = new mod_feedback_structure($feedback, $cm, $completioncourse->id); if (!$feedbackstructure->can_view_analysis()) { throw new required_capability_exception($context, 'mod/feedback:viewanalysepage', 'nopermission', ''); } @@ -850,6 +899,8 @@ class mod_feedback_external extends external_api { return new external_function_parameters ( array( 'feedbackid' => new external_value(PARAM_INT, 'Feedback instance id.'), + 'courseid' => new external_value(PARAM_INT, 'Course where user completes the feedback (for site feedbacks only).', + VALUE_DEFAULT, 0), ) ); } @@ -858,18 +909,20 @@ class mod_feedback_external extends external_api { * Retrieves responses from the current unfinished attempt. * * @param array $feedbackid feedback instance id + * @param int $courseid course where user completes the feedback (for site feedbacks only) * @return array of warnings and launch information * @since Moodle 3.3 */ - public static function get_unfinished_responses($feedbackid) { + public static function get_unfinished_responses($feedbackid, $courseid = 0) { global $PAGE; - $params = array('feedbackid' => $feedbackid); + $params = array('feedbackid' => $feedbackid, 'courseid' => $courseid); $params = self::validate_parameters(self::get_unfinished_responses_parameters(), $params); $warnings = $itemsdata = array(); - list($feedback, $course, $cm, $context) = self::validate_feedback($params['feedbackid']); - $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $course->id); + list($feedback, $course, $cm, $context, $completioncourse) = self::validate_feedback($params['feedbackid'], + $params['courseid']); + $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $completioncourse->id); $responses = array(); $unfinished = $feedbackcompletion->get_unfinished_responses(); @@ -912,6 +965,8 @@ class mod_feedback_external extends external_api { return new external_function_parameters ( array( 'feedbackid' => new external_value(PARAM_INT, 'Feedback instance id.'), + 'courseid' => new external_value(PARAM_INT, 'Course where user completes the feedback (for site feedbacks only).', + VALUE_DEFAULT, 0), ) ); } @@ -920,18 +975,20 @@ class mod_feedback_external extends external_api { * Retrieves responses from the last finished attempt. * * @param array $feedbackid feedback instance id + * @param int $courseid course where user completes the feedback (for site feedbacks only) * @return array of warnings and the responses * @since Moodle 3.3 */ - public static function get_finished_responses($feedbackid) { + public static function get_finished_responses($feedbackid, $courseid = 0) { global $PAGE; - $params = array('feedbackid' => $feedbackid); + $params = array('feedbackid' => $feedbackid, 'courseid' => $courseid); $params = self::validate_parameters(self::get_finished_responses_parameters(), $params); $warnings = $itemsdata = array(); - list($feedback, $course, $cm, $context) = self::validate_feedback($params['feedbackid']); - $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $course->id); + list($feedback, $course, $cm, $context, $completioncourse) = self::validate_feedback($params['feedbackid'], + $params['courseid']); + $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $completioncourse->id); $responses = array(); // Load and get the responses from the last completed feedback. @@ -982,6 +1039,8 @@ class mod_feedback_external extends external_api { VALUE_DEFAULT, 'lastaccess'), 'page' => new external_value(PARAM_INT, 'The page of records to return.', VALUE_DEFAULT, 0), 'perpage' => new external_value(PARAM_INT, 'The number of records to return per page.', VALUE_DEFAULT, 0), + 'courseid' => new external_value(PARAM_INT, 'Course where user completes the feedback (for site feedbacks only).', + VALUE_DEFAULT, 0), ) ); } @@ -994,18 +1053,25 @@ class mod_feedback_external extends external_api { * @param str $sort sort param, must be firstname, lastname or lastaccess (default) * @param int $page the page of records to return * @param int $perpage the number of records to return per page + * @param int $courseid course where user completes the feedback (for site feedbacks only) * @return array of warnings and users ids * @since Moodle 3.3 */ - public static function get_non_respondents($feedbackid, $groupid = 0, $sort = 'lastaccess', $page = 0, $perpage = 0) { + public static function get_non_respondents($feedbackid, $groupid = 0, $sort = 'lastaccess', $page = 0, $perpage = 0, + $courseid = 0) { + global $CFG; require_once($CFG->dirroot . '/mod/feedback/lib.php'); - $params = array('feedbackid' => $feedbackid, 'groupid' => $groupid, 'sort' => $sort, 'page' => $page, 'perpage' => $perpage); + $params = array('feedbackid' => $feedbackid, 'groupid' => $groupid, 'sort' => $sort, 'page' => $page, + 'perpage' => $perpage, 'courseid' => $courseid); $params = self::validate_parameters(self::get_non_respondents_parameters(), $params); $warnings = $nonrespondents = array(); - list($feedback, $course, $cm, $context) = self::validate_feedback($params['feedbackid']); + list($feedback, $course, $cm, $context, $completioncourse) = self::validate_feedback($params['feedbackid'], + $params['courseid']); + $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $completioncourse->id); + $completioncourseid = $feedbackcompletion->get_courseid(); if ($feedback->anonymous != FEEDBACK_ANONYMOUS_NO || $feedback->course == SITEID) { throw new moodle_exception('anonymous', 'feedback'); @@ -1048,7 +1114,7 @@ class mod_feedback_external extends external_api { $users = feedback_get_incomplete_users($cm, $groupid, $params['sort'], $page, $perpage, true); foreach ($users as $user) { $nonrespondents[] = [ - 'courseid' => $course->id, + 'courseid' => $completioncourseid, 'userid' => $user->id, 'fullname' => fullname($user), 'started' => $user->feedbackstarted @@ -1102,6 +1168,8 @@ class mod_feedback_external extends external_api { VALUE_DEFAULT, 0), 'page' => new external_value(PARAM_INT, 'The page of records to return.', VALUE_DEFAULT, 0), 'perpage' => new external_value(PARAM_INT, 'The number of records to return per page', VALUE_DEFAULT, 0), + 'courseid' => new external_value(PARAM_INT, 'Course where user completes the feedback (for site feedbacks only).', + VALUE_DEFAULT, 0), ) ); } @@ -1113,17 +1181,20 @@ class mod_feedback_external extends external_api { * @param int $groupid Group id, 0 means that the function will determine the user group * @param int $page the page of records to return * @param int $perpage the number of records to return per page + * @param int $courseid course where user completes the feedback (for site feedbacks only) * @return array of warnings and users attemps and responses * @throws moodle_exception * @since Moodle 3.3 */ - public static function get_responses_analysis($feedbackid, $groupid = 0, $page = 0, $perpage = 0) { + public static function get_responses_analysis($feedbackid, $groupid = 0, $page = 0, $perpage = 0, $courseid = 0) { - $params = array('feedbackid' => $feedbackid, 'groupid' => $groupid, 'page' => $page, 'perpage' => $perpage); + $params = array('feedbackid' => $feedbackid, 'groupid' => $groupid, 'page' => $page, 'perpage' => $perpage, + 'courseid' => $courseid); $params = self::validate_parameters(self::get_responses_analysis_parameters(), $params); $warnings = $itemsdata = array(); - list($feedback, $course, $cm, $context) = self::validate_feedback($params['feedbackid']); + list($feedback, $course, $cm, $context, $completioncourse) = self::validate_feedback($params['feedbackid'], + $params['courseid']); // Check permissions. require_capability('mod/feedback:viewreports', $context); @@ -1147,7 +1218,7 @@ class mod_feedback_external extends external_api { } } - $feedbackstructure = new mod_feedback_structure($feedback, $cm, $course->id); + $feedbackstructure = new mod_feedback_structure($feedback, $cm, $completioncourse->id); $responsestable = new mod_feedback_responses_table($feedbackstructure, $groupid); // Ensure responses number is correct prior returning them. $feedbackstructure->shuffle_anonym_responses(); @@ -1222,6 +1293,8 @@ class mod_feedback_external extends external_api { return new external_function_parameters ( array( 'feedbackid' => new external_value(PARAM_INT, 'Feedback instance id'), + 'courseid' => new external_value(PARAM_INT, 'Course where user completes the feedback (for site feedbacks only).', + VALUE_DEFAULT, 0), ) ); } @@ -1234,15 +1307,16 @@ class mod_feedback_external extends external_api { * @since Moodle 3.3 * @throws moodle_exception */ - public static function get_last_completed($feedbackid) { + public static function get_last_completed($feedbackid, $courseid = 0) { global $PAGE; - $params = array('feedbackid' => $feedbackid); + $params = array('feedbackid' => $feedbackid, 'courseid' => $courseid); $params = self::validate_parameters(self::get_last_completed_parameters(), $params); $warnings = array(); - list($feedback, $course, $cm, $context) = self::validate_feedback($params['feedbackid']); - $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $course->id); + list($feedback, $course, $cm, $context, $completioncourse) = self::validate_feedback($params['feedbackid'], + $params['courseid']); + $feedbackcompletion = new mod_feedback_completion($feedback, $cm, $completioncourse->id); if ($feedbackcompletion->is_anonymous()) { throw new moodle_exception('anonymous', 'feedback'); diff --git a/mod/feedback/tests/external_test.php b/mod/feedback/tests/external_test.php index 813810765a8..3ab5d194938 100644 --- a/mod/feedback/tests/external_test.php +++ b/mod/feedback/tests/external_test.php @@ -531,6 +531,88 @@ class mod_feedback_external_testcase extends externallib_advanced_testcase { $itemid = $itemscreated[4]->id; $itemsaved = $DB->get_field('feedback_value', 'value', array('item' => $itemid)); $this->assertEquals('b', $itemsaved); + + // Check that the answers are saved for course 0. + foreach ($items as $item) { + $this->assertEquals(0, $item->course_id); + } + $completed = $DB->get_record('feedback_completed', []); + $this->assertEquals(0, $completed->courseid); + } + + /** + * Test process_page for a site feedback. + */ + public function test_process_page_site_feedback() { + global $DB; + $pagecontents = 'You finished it!'; + $this->feedback = $this->getDataGenerator()->create_module('feedback', + array('course' => SITEID, 'page_after_submit' => $pagecontents)); + + // Test user with full capabilities. + $this->setUser($this->student); + + // Add questions to the feedback, we are adding 2 pages of questions. + $itemscreated = self::populate_feedback($this->feedback, 2); + + $data = []; + foreach ($itemscreated as $item) { + + if (empty($item->hasvalue)) { + continue; + } + + switch ($item->typ) { + case 'textarea': + case 'textfield': + $value = 'Lorem ipsum'; + break; + case 'numeric': + $value = 5; + break; + case 'multichoice': + $value = '1'; + break; + case 'multichoicerated': + $value = '1'; + break; + case 'info': + $value = format_string($this->course->shortname, true, array('context' => $this->context)); + break; + default: + $value = ''; + } + $data[] = ['name' => $item->typ . '_' . $item->id, 'value' => $value]; + } + + // Process first page. + $firstpagedata = [$data[0], $data[1]]; + $result = mod_feedback_external::process_page($this->feedback->id, 0, $firstpagedata, false, $this->course->id); + $result = external_api::clean_returnvalue(mod_feedback_external::process_page_returns(), $result); + $this->assertEquals(1, $result['jumpto']); + $this->assertFalse($result['completed']); + + // Process second page. + $data[2]['value'] = 'b'; + $secondpagedata = [$data[2], $data[3], $data[4], $data[5], $data[6]]; + $result = mod_feedback_external::process_page($this->feedback->id, 1, $secondpagedata, false, $this->course->id); + $result = external_api::clean_returnvalue(mod_feedback_external::process_page_returns(), $result); + $this->assertTrue($result['completed']); + $this->assertTrue(strpos($result['completionpagecontents'], $pagecontents) !== false); + // Check all the items were saved. + $items = $DB->get_records('feedback_value'); + $this->assertCount(7, $items); + // Check if the one we modified was correctly saved. + $itemid = $itemscreated[4]->id; + $itemsaved = $DB->get_field('feedback_value', 'value', array('item' => $itemid)); + $this->assertEquals('b', $itemsaved); + + // Check that the answers are saved for the correct course. + foreach ($items as $item) { + $this->assertEquals($this->course->id, $item->course_id); + } + $completed = $DB->get_record('feedback_completed', []); + $this->assertEquals($this->course->id, $completed->courseid); } /** @@ -936,4 +1018,55 @@ class mod_feedback_external_testcase extends externallib_advanced_testcase { $this->expectException('moodle_exception'); mod_feedback_external::get_last_completed($this->feedback->id); } + + /** + * Test get_feedback_access_information for site feedback. + */ + public function test_get_feedback_access_information_for_site_feedback() { + + $sitefeedback = $this->getDataGenerator()->create_module('feedback', array('course' => SITEID)); + $this->setUser($this->student); + // Access the site feedback via the site activity. + $result = mod_feedback_external::get_feedback_access_information($sitefeedback->id); + $result = external_api::clean_returnvalue(mod_feedback_external::get_feedback_access_information_returns(), $result); + $this->assertTrue($result['cancomplete']); + $this->assertTrue($result['cansubmit']); + + // Access the site feedback via course where I'm enrolled. + $result = mod_feedback_external::get_feedback_access_information($sitefeedback->id, $this->course->id); + $result = external_api::clean_returnvalue(mod_feedback_external::get_feedback_access_information_returns(), $result); + $this->assertTrue($result['cancomplete']); + $this->assertTrue($result['cansubmit']); + + // Access the site feedback via course where I'm not enrolled. + $othercourse = $this->getDataGenerator()->create_course(); + + $this->expectException('moodle_exception'); + mod_feedback_external::get_feedback_access_information($sitefeedback->id, $othercourse->id); + } + + /** + * Test get_feedback_access_information for site feedback mapped. + */ + public function test_get_feedback_access_information_for_site_feedback_mapped() { + global $DB; + + $sitefeedback = $this->getDataGenerator()->create_module('feedback', array('course' => SITEID)); + $this->setUser($this->student); + $DB->insert_record('feedback_sitecourse_map', array('feedbackid' => $sitefeedback->id, 'courseid' => $this->course->id)); + + // Access the site feedback via course where I'm enrolled and mapped. + $result = mod_feedback_external::get_feedback_access_information($sitefeedback->id, $this->course->id); + $result = external_api::clean_returnvalue(mod_feedback_external::get_feedback_access_information_returns(), $result); + $this->assertTrue($result['cancomplete']); + $this->assertTrue($result['cansubmit']); + + // Access the site feedback via course where I'm enrolled but not mapped. + $othercourse = $this->getDataGenerator()->create_course(); + $this->getDataGenerator()->enrol_user($this->student->id, $othercourse->id, $this->studentrole->id, 'manual'); + + $this->expectException('moodle_exception'); + $this->expectExceptionMessage(get_string('cannotaccess', 'mod_feedback')); + mod_feedback_external::get_feedback_access_information($sitefeedback->id, $othercourse->id); + } } diff --git a/mod/feedback/upgrade.txt b/mod/feedback/upgrade.txt index 705655e0e67..e084e600736 100644 --- a/mod/feedback/upgrade.txt +++ b/mod/feedback/upgrade.txt @@ -19,6 +19,8 @@ * feedback_is_feedback_in_sitecourse_map() * feedback_clean_up_sitecourse_map() * feedback_print_numeric_option_list() +* Web Service functions now support an optional courseid parameter (course where user completes the feedback). + This new parameter was necessary to support site feedbacks. === 3.5 ===