From 784c09c8349620870795ad7e470d4069bb4a5343 Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Tue, 29 Sep 2020 17:34:57 +0200 Subject: [PATCH] MDL-63805 glossary: New WS mod_glossary_prepare_entry_for_edition --- .../classes/external/prepare_entry.php | 153 ++++++++++++++++++ mod/glossary/db/services.php | 9 ++ mod/glossary/tests/external/prepare_entry.php | 83 ++++++++++ mod/glossary/version.php | 2 +- 4 files changed, 246 insertions(+), 1 deletion(-) create mode 100644 mod/glossary/classes/external/prepare_entry.php create mode 100644 mod/glossary/tests/external/prepare_entry.php diff --git a/mod/glossary/classes/external/prepare_entry.php b/mod/glossary/classes/external/prepare_entry.php new file mode 100644 index 00000000000..77134f4897d --- /dev/null +++ b/mod/glossary/classes/external/prepare_entry.php @@ -0,0 +1,153 @@ +. + +/** + * This is the external method for preparing a entry for edition. + * + * @package mod_glossary + * @since Moodle 3.10 + * @copyright 2020 Juan Leyva + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace mod_glossary\external; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; +require_once($CFG->libdir . '/externallib.php'); +require_once($CFG->dirroot . '/mod/glossary/lib.php'); + +use external_api; +use external_function_parameters; +use external_multiple_structure; +use external_single_structure; +use external_value; +use external_warnings; + +/** + * This is the external method for preparing a entry for edition. + * + * @copyright 2020 Juan Leyva + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class prepare_entry extends external_api { + /** + * Parameters. + * + * @return external_function_parameters + */ + public static function execute_parameters(): external_function_parameters { + return new external_function_parameters([ + 'entryid' => new external_value(PARAM_INT, 'Glossary entry id to update'), + ]); + } + + /** + * Prepare for update the indicated entry from the glossary. + * + * @param int $entryid The entry to update + * @return array with result and warnings + * @throws moodle_exception + */ + public static function execute(int $entryid): array { + global $DB; + + $params = self::validate_parameters(self::execute_parameters(), compact('entryid')); + $id = $params['entryid']; + + // Get and validate the glossary. + $entry = $DB->get_record('glossary_entries', ['id' => $id], '*', MUST_EXIST); + list($glossary, $context, $course, $cm) = \mod_glossary_external::validate_glossary($entry->glossaryid); + + // Check permissions. + mod_glossary_can_update_entry($entry, $glossary, $context, $cm, false); + + list($definitionoptions, $attachmentoptions) = glossary_get_editor_and_attachment_options($course, $context, $entry); + + $entry->aliases = ''; + $entry->categories = []; + $entry = mod_glossary_prepare_entry_for_edition($entry); + $entry = file_prepare_standard_editor($entry, 'definition', $definitionoptions, $context, 'mod_glossary', 'entry', + $entry->id); + $entry = file_prepare_standard_filemanager($entry, 'attachment', $attachmentoptions, $context, 'mod_glossary', 'attachment', + $entry->id); + + // Just get a structure compatible with external API. + array_walk($definitionoptions, function(&$item, $key) use (&$definitionoptions) { + if (!is_scalar($item)) { + unset($definitionoptions[$key]); + return; + } + $item = ['name' => $key, 'value' => $item]; + }); + + array_walk($attachmentoptions, function(&$item, $key) use (&$attachmentoptions) { + if (!is_scalar($item)) { + unset($attachmentoptions[$key]); + return; + } + $item = ['name' => $key, 'value' => $item]; + }); + + return [ + 'inlineattachmentsid' => $entry->definition_editor['itemid'], + 'attachmentsid' => $entry->attachment_filemanager, + 'areas' => [ + [ + 'area' => 'definition', + 'options' => $definitionoptions, + ], + [ + 'area' => 'attachment', + 'options' => $attachmentoptions, + ], + ], + 'aliases' => explode("\n", trim($entry->aliases)), + 'categories' => $entry->categories, + ]; + } + + /** + * Return. + * + * @return external_single_structure + */ + public static function execute_returns(): external_single_structure { + return new external_single_structure([ + 'inlineattachmentsid' => new external_value(PARAM_INT, 'Draft item id for the text editor.'), + 'attachmentsid' => new external_value(PARAM_INT, 'Draft item id for the file manager.'), + 'areas' => new external_multiple_structure( + new external_single_structure( + [ + 'area' => new external_value(PARAM_ALPHA, 'File area name.'), + 'options' => new external_multiple_structure( + new external_single_structure( + [ + 'name' => new external_value(PARAM_RAW, 'Name of option.'), + 'value' => new external_value(PARAM_RAW, 'Value of option.'), + ] + ), 'Draft file area options.' + ) + ] + ), 'File areas including options' + ), + 'aliases' => new external_multiple_structure(new external_value(PARAM_RAW, 'Alias name.')), + 'categories' => new external_multiple_structure(new external_value(PARAM_INT, 'Category id')), + 'warnings' => new external_warnings(), + ]); + } +} diff --git a/mod/glossary/db/services.php b/mod/glossary/db/services.php index 63728bef0e6..1584e012a48 100644 --- a/mod/glossary/db/services.php +++ b/mod/glossary/db/services.php @@ -179,4 +179,13 @@ $functions = array( 'type' => 'write', 'services' => [MOODLE_OFFICIAL_MOBILE_SERVICE] ], + + 'mod_glossary_prepare_entry_for_edition' => [ + 'classname' => 'mod_glossary\external\prepare_entry', + 'methodname' => 'execute', + 'classpath' => '', + 'description' => 'Prepares the given entry for edition returning draft item areas and file areas information.', + 'type' => 'read', + 'services' => [MOODLE_OFFICIAL_MOBILE_SERVICE] + ], ); diff --git a/mod/glossary/tests/external/prepare_entry.php b/mod/glossary/tests/external/prepare_entry.php new file mode 100644 index 00000000000..b5870a5cc95 --- /dev/null +++ b/mod/glossary/tests/external/prepare_entry.php @@ -0,0 +1,83 @@ +. + +/** + * External function test for prepare_entry. + * + * @package mod_glossary + * @category external + * @since Moodle 3.10 + * @copyright 2020 Juan Leyva + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace mod_glossary\external; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; +require_once($CFG->dirroot . '/webservice/tests/helpers.php'); + +use external_api; +use externallib_advanced_testcase; +use mod_glossary_external; +use context_module; +use context_user; +use external_util; + +/** + * External function test for prepare_entry. + * + * @package mod_glossary + * @copyright 2020 Juan Leyva + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class prepare_entry_testcase extends externallib_advanced_testcase { + + /** + * test_prepare_entry + */ + public function test_prepare_entry() { + global $USER; + $this->resetAfterTest(true); + + $course = $this->getDataGenerator()->create_course(); + $glossary = $this->getDataGenerator()->create_module('glossary', ['course' => $course->id]); + $gg = $this->getDataGenerator()->get_plugin_generator('mod_glossary'); + + $this->setAdminUser(); + $aliases = ['alias1', 'alias2']; + $entry = $gg->create_content( + $glossary, + ['approved' => 1, 'userid' => $USER->id], + $aliases + ); + + $cat1 = $gg->create_category($glossary, [], [$entry]); + $gg->create_category($glossary); + + $return = prepare_entry::execute($entry->id); + $return = external_api::clean_returnvalue(prepare_entry::execute_returns(), $return); + + $this->assertNotEmpty($return['inlineattachmentsid']); + $this->assertNotEmpty($return['attachmentsid']); + $this->assertEquals($aliases, $return['aliases']); + $this->assertEquals([$cat1->id], $return['categories']); + $this->assertCount(2, $return['areas']); + $this->assertNotEmpty($return['areas'][0]['options']); + $this->assertNotEmpty($return['areas'][1]['options']); + } +} diff --git a/mod/glossary/version.php b/mod/glossary/version.php index d25f1a5ba9f..f6cb3fc7cab 100644 --- a/mod/glossary/version.php +++ b/mod/glossary/version.php @@ -24,7 +24,7 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2020061501; // The current module version (Date: YYYYMMDDXX) +$plugin->version = 2020061502; // The current module version (Date: YYYYMMDDXX) $plugin->requires = 2020060900; // Requires this Moodle version $plugin->component = 'mod_glossary'; // Full name of the plugin (used for diagnostics) $plugin->cron = 0; -- 2.43.0