From 7361b9682ee7466774d291123c123ae52641895f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Fri, 11 Mar 2016 09:50:20 +0100 Subject: [PATCH] MDL-53409 question: New WS core_question_update_flag --- lib/db/services.php | 10 +++ question/classes/external.php | 117 ++++++++++++++++++++++++++++ question/tests/externallib_test.php | 86 ++++++++++++++++++++ 3 files changed, 213 insertions(+) create mode 100644 question/classes/external.php create mode 100644 question/tests/externallib_test.php diff --git a/lib/db/services.php b/lib/db/services.php index 78c89f74ab7..fcba61030e9 100644 --- a/lib/db/services.php +++ b/lib/db/services.php @@ -1186,6 +1186,15 @@ $functions = array( 'ajax' => true ), + // Question related functions. + 'core_question_update_flag' => array( + 'classname' => 'core_question_external', + 'methodname' => 'update_flag', + 'description' => 'Update the flag state of a question attempt.', + 'type' => 'write', + 'capabilities' => 'moodle/question:flag', + ), + ); $services = array( @@ -1252,6 +1261,7 @@ $services = array( 'core_rating_get_item_ratings', 'core_user_get_users_by_field', 'core_user_add_user_private_files', + 'core_question_update_flag' ), 'enabled' => 0, 'restrictedusers' => 0, diff --git a/question/classes/external.php b/question/classes/external.php new file mode 100644 index 00000000000..0ba722e4c0f --- /dev/null +++ b/question/classes/external.php @@ -0,0 +1,117 @@ +. + + +/** + * External question API + * + * @package core_question + * @category external + * @copyright 2016 Pau Ferrer + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +require_once("$CFG->libdir/externallib.php"); +require_once($CFG->dirroot . '/question/engine/lib.php'); + +/** + * Question external functions + * + * @package core_question + * @category external + * @copyright 2016 Pau Ferrer + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @since Moodle 3.1 + */ +class core_question_external extends external_api { + + /** + * Returns description of method parameters + * + * @return external_function_parameters + * @since Moodle 3.1 + */ + public static function update_flag_parameters() { + return new external_function_parameters( + array( + 'qubaid' => new external_value(PARAM_INT, 'the question usage id.'), + 'questionid' => new external_value(PARAM_INT, 'the question id'), + 'qaid' => new external_value(PARAM_INT, 'the question_attempt id'), + 'slot' => new external_value(PARAM_INT, 'the slot number within the usage'), + 'checksum' => new external_value(PARAM_ALPHANUM, 'computed checksum with the last three arguments and + the users username'), + 'newstate' => new external_value(PARAM_BOOL, 'the new state of the flag. true = flagged') + ) + ); + } + + /** + * Update the flag state of a question attempt. + * + * @param int $qubaid the question usage id. + * @param int $questionid the question id. + * @param int $qaid the question_attempt id. + * @param int $slot the slot number within the usage. + * @param string $checksum checksum, as computed by {@link get_toggle_checksum()} + * corresponding to the last three arguments and the users username. + * @param bool $newstate the new state of the flag. true = flagged. + * @return array (success infos and fail infos) + * @since Moodle 3.1 + */ + public static function update_flag($qubaid, $questionid, $qaid, $slot, $checksum, $newstate) { + global $CFG, $DB; + + $params = self::validate_parameters(self::update_flag_parameters(), + array( + 'qubaid' => $qubaid, + 'questionid' => $questionid, + 'qaid' => $qaid, + 'slot' => $slot, + 'checksum' => $checksum, + 'newstate' => $newstate + ) + ); + + $warnings = array(); + + // Check user is logged in. + require_login(null, false, null, false, true); + + // The checksum will be checked to provide security flagging other users questions. + question_flags::update_flag($params['qubaid'], $params['questionid'], $params['qaid'], $params['slot'], $params['checksum'], + $params['newstate']); + + $result = array(); + $result['status'] = true; + $result['warnings'] = $warnings; + return $result; + } + + /** + * Returns description of method result value + * + * @return external_description + * @since Moodle 3.1 + */ + public static function update_flag_returns() { + return new external_single_structure( + array( + 'status' => new external_value(PARAM_BOOL, 'status: true if success'), + 'warnings' => new external_warnings() + ) + ); + } +} diff --git a/question/tests/externallib_test.php b/question/tests/externallib_test.php new file mode 100644 index 00000000000..ff19a0f9156 --- /dev/null +++ b/question/tests/externallib_test.php @@ -0,0 +1,86 @@ +. + +/** + * Question external functions tests. + * + * @package core_question + * @category external + * @copyright 2016 Pau Ferrer + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @since Moodle 3.1 + */ + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +require_once($CFG->dirroot . '/webservice/tests/helpers.php'); +require_once($CFG->dirroot . '/mod/wiki/lib.php'); + +/** + * Wiki module external functions tests + * + * @package core_question + * @category external + * @copyright 2016 Pau Ferrer + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @since Moodle 3.1 + */ +class core_question_external_testcase extends externallib_advanced_testcase { + + /** + * Set up for every test + */ + public function setUp() { + global $DB; + $this->resetAfterTest(); + + // Setup test data. + $this->course = $this->getDataGenerator()->create_course(); + $this->wiki = $this->getDataGenerator()->create_module('wiki', array('course' => $this->course->id)); + + // Create users. + $this->student = self::getDataGenerator()->create_user(); + + // Users enrolments. + $this->studentrole = $DB->get_record('role', array('shortname' => 'student')); + $this->getDataGenerator()->enrol_user($this->student->id, $this->course->id, $this->studentrole->id, 'manual'); + + // Create first page. + $this->firstpage = $this->getDataGenerator()->get_plugin_generator('mod_wiki')->create_first_page($this->wiki); + } + + /** + * Test update question flag + */ + public function test_core_question_update_flag() { + + $question = test_question_maker::make_question('shortanswer'); + $quba = question_engine::make_questions_usage_by_activity('test', context_system::instance()); + $slot = $quba->add_question($question); + $quba->start_all_questions(); + $qa = $quba->get_question_attempt($slot); + + $qubaid = $quba->get_id(); + $questionid = $question->id; + $qaid = $qa->id; + $checksum = md5($qubaid . "_" . $this->student->secret . "_" . $questionid . "_" . $qaid . "_" . $slot); + + $flag = core_question_external::update_flag($qubaid, $questionid, $qaid, $slot, $checksum, true); + $this->assertTrue($flag['status']); + } +} -- 2.43.0