Merge branch 'MDL-60578-master' of git://github.com/jleyva/moodle

This commit is contained in:
Jun Pataleta
2018-09-04 21:18:02 +08:00
3 changed files with 270 additions and 61 deletions
+135 -61
View File
@@ -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');
+133
View File
@@ -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);
}
}
+2
View File
@@ -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 ===