From ac9f0a6800b329d4132dfc0b38cbbc0e761ace8f Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Tue, 14 Mar 2017 10:55:16 +0100 Subject: [PATCH] MDL-58229 mod_feedback: New WS get_unfinished_responses --- mod/feedback/classes/completion.php | 27 +++++++-- mod/feedback/classes/external.php | 63 +++++++++++++++++++ .../external/feedback_valuetmp_exporter.php | 70 ++++++++++++++++++++++ mod/feedback/db/services.php | 8 +++ mod/feedback/tests/external_test.php | 38 ++++++++++++ mod/feedback/version.php | 2 +- 6 files changed, 201 insertions(+), 7 deletions(-) create mode 100644 mod/feedback/classes/external/feedback_valuetmp_exporter.php diff --git a/mod/feedback/classes/completion.php b/mod/feedback/classes/completion.php index 25980cbc909..b9e2adf897f 100644 --- a/mod/feedback/classes/completion.php +++ b/mod/feedback/classes/completion.php @@ -217,6 +217,23 @@ class mod_feedback_completion extends mod_feedback_structure { } /** + * Retrieves responses from an unfinished attempt. + * + * @return array the responses (from the feedback_valuetmp table) + * @since Moodle 3.3 + */ + public function get_unfinished_responses() { + global $DB; + $responses = array(); + + $completedtmp = $this->get_current_completed_tmp(); + if ($completedtmp) { + $responses = $DB->get_records('feedback_valuetmp', ['completed' => $completedtmp->id]); + } + return $responses; + } + + /** * Returns all temporary values for this feedback or just a value for an item * @param stdClass $item * @return array @@ -224,12 +241,10 @@ class mod_feedback_completion extends mod_feedback_structure { protected function get_values_tmp($item = null) { global $DB; if ($this->valuestmp === null) { - $completedtmp = $this->get_current_completed_tmp(); - if ($completedtmp) { - $this->valuestmp = $DB->get_records_menu('feedback_valuetmp', - ['completed' => $completedtmp->id], '', 'item, value'); - } else { - $this->valuestmp = array(); + $this->valuestmp = array(); + $responses = $this->get_unfinished_responses(); + foreach ($responses as $r) { + $this->valuestmp[$r->item] = $r->value; } } if ($item) { diff --git a/mod/feedback/classes/external.php b/mod/feedback/classes/external.php index c3fa0c43810..17ed2513525 100644 --- a/mod/feedback/classes/external.php +++ b/mod/feedback/classes/external.php @@ -31,6 +31,7 @@ require_once("$CFG->libdir/externallib.php"); use mod_feedback\external\feedback_summary_exporter; use mod_feedback\external\feedback_completedtmp_exporter; use mod_feedback\external\feedback_item_exporter; +use mod_feedback\external\feedback_valuetmp_exporter; /** * Feedback external functions @@ -831,4 +832,66 @@ class mod_feedback_external extends external_api { ) ); } + + /** + * Describes the parameters for get_unfinished_responses. + * + * @return external_function_parameters + * @since Moodle 3.3 + */ + public static function get_unfinished_responses_parameters() { + return new external_function_parameters ( + array( + 'feedbackid' => new external_value(PARAM_INT, 'Feedback instance id.'), + ) + ); + } + + /** + * Retrieves responses from the current unfinished attempt. + * + * @param array $feedbackid feedback instance id + * @return array of warnings and launch information + * @since Moodle 3.3 + */ + public static function get_unfinished_responses($feedbackid) { + global $PAGE; + + $params = array('feedbackid' => $feedbackid); + $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); + + $responses = array(); + $unfinished = $feedbackcompletion->get_unfinished_responses(); + foreach ($unfinished as $u) { + $exporter = new feedback_valuetmp_exporter($u); + $responses[] = $exporter->export($PAGE->get_renderer('core')); + } + + $result = array( + 'responses' => $responses, + 'warnings' => $warnings + ); + return $result; + } + + /** + * Describes the get_unfinished_responses return value. + * + * @return external_single_structure + * @since Moodle 3.3 + */ + public static function get_unfinished_responses_returns() { + return new external_single_structure( + array( + 'responses' => new external_multiple_structure( + feedback_valuetmp_exporter::get_read_structure() + ), + 'warnings' => new external_warnings(), + ) + ); + } } diff --git a/mod/feedback/classes/external/feedback_valuetmp_exporter.php b/mod/feedback/classes/external/feedback_valuetmp_exporter.php new file mode 100644 index 00000000000..646d8e5805e --- /dev/null +++ b/mod/feedback/classes/external/feedback_valuetmp_exporter.php @@ -0,0 +1,70 @@ +. + +/** + * Class for exporting a feedback tmp response. + * + * @package mod_feedback + * @copyright 2017 Juan Leyva + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +namespace mod_feedback\external; +defined('MOODLE_INTERNAL') || die(); + +use core\external\exporter; + +/** + * Class for exporting a feedback tmp response. + * + * @copyright 2017 Juan Leyva + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class feedback_valuetmp_exporter extends exporter { + + /** + * Return the list of properties. + * + * @return array list of properties + */ + protected static function define_properties() { + return array( + 'id' => array( + 'type' => PARAM_INT, + 'description' => 'The record id.', + ), + 'course_id' => array( + 'type' => PARAM_INT, + 'description' => 'The course id this record belongs to.', + ), + 'item' => array( + 'type' => PARAM_INT, + 'description' => 'The item id that was responded.', + ), + 'completed' => array( + 'type' => PARAM_INT, + 'description' => 'Reference to the feedback_completedtmp table.', + ), + 'tmp_completed' => array( + 'type' => PARAM_INT, + 'description' => 'Old field - not used anymore.', + ), + 'value' => array( + 'type' => PARAM_RAW, + 'description' => 'The response value.', + ), + ); + } +} diff --git a/mod/feedback/db/services.php b/mod/feedback/db/services.php index 8665261084c..b696deaf417 100644 --- a/mod/feedback/db/services.php +++ b/mod/feedback/db/services.php @@ -101,4 +101,12 @@ $functions = array( 'capabilities' => 'mod/feedback:viewanalysepage', 'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE) ), + 'mod_feedback_get_unfinished_responses' => array( + 'classname' => 'mod_feedback_external', + 'methodname' => 'get_unfinished_responses', + 'description' => 'Retrieves responses from the current unfinished attempt.', + 'type' => 'read', + 'capabilities' => 'mod/feedback:view', + 'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE) + ), ); diff --git a/mod/feedback/tests/external_test.php b/mod/feedback/tests/external_test.php index 837d38505c9..b1e9fddb818 100644 --- a/mod/feedback/tests/external_test.php +++ b/mod/feedback/tests/external_test.php @@ -590,4 +590,42 @@ class mod_feedback_external_testcase extends externallib_advanced_testcase { $this->assertCount(2, $result['itemsdata'][0]['data']); // There are 2 responses per item. $this->assertCount(2, $result['itemsdata'][1]['data']); } + + /** + * Test get_unfinished_responses. + */ + public function test_get_unfinished_responses() { + // Test user with full capabilities. + $this->setUser($this->student); + + // Create a very simple feedback. + $feedbackgenerator = $this->getDataGenerator()->get_plugin_generator('mod_feedback'); + $numericitem = $feedbackgenerator->create_item_numeric($this->feedback); + $textfielditem = $feedbackgenerator->create_item_textfield($this->feedback); + $feedbackgenerator->create_item_pagebreak($this->feedback); + $labelitem = $feedbackgenerator->create_item_label($this->feedback); + $numericitem2 = $feedbackgenerator->create_item_numeric($this->feedback); + + $pagedata = [ + ['name' => $numericitem->typ .'_'. $numericitem->id, 'value' => 5], + ['name' => $textfielditem->typ .'_'. $textfielditem->id, 'value' => 'abc'], + ]; + // Process the feedback, there are two pages so the feedback will be unfinished yet. + $result = mod_feedback_external::process_page($this->feedback->id, 0, $pagedata); + $result = external_api::clean_returnvalue(mod_feedback_external::process_page_returns(), $result); + $this->assertFalse($result['completed']); + + // Retrieve the unfinished responses. + $result = mod_feedback_external::get_unfinished_responses($this->feedback->id); + $result = external_api::clean_returnvalue(mod_feedback_external::get_unfinished_responses_returns(), $result); + // Check that ids and responses match. + foreach ($result['responses'] as $r) { + if ($r['item'] == $numericitem->id) { + $this->assertEquals(5, $r['value']); + } else { + $this->assertEquals($textfielditem->id, $r['item']); + $this->assertEquals('abc', $r['value']); + } + } + } } diff --git a/mod/feedback/version.php b/mod/feedback/version.php index 6a9250fdffc..c7dfd44f965 100644 --- a/mod/feedback/version.php +++ b/mod/feedback/version.php @@ -24,7 +24,7 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2016120509; // The current module version (Date: YYYYMMDDXX) +$plugin->version = 2016120510; // The current module version (Date: YYYYMMDDXX) $plugin->requires = 2016112900; // Requires this Moodle version $plugin->component = 'mod_feedback'; // Full name of the plugin (used for diagnostics) $plugin->cron = 0; -- 2.11.4.GIT