From 5377f8a263a72baa1778b42ff2ff46eee52b8cea Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Sun, 8 Apr 2018 18:40:20 +0800 Subject: [PATCH] MDL-61819 core_editor: Implement core provider --- lang/en/editor.php | 2 + lib/editor/classes/privacy/provider.php | 71 +++++++++++++++++++ lib/editor/tests/privacy_provider_test.php | 79 ++++++++++++++++++++++ 3 files changed, 152 insertions(+) create mode 100644 lib/editor/classes/privacy/provider.php create mode 100644 lib/editor/tests/privacy_provider_test.php diff --git a/lang/en/editor.php b/lang/en/editor.php index 123bdad3116..54c35b5c876 100644 --- a/lang/en/editor.php +++ b/lang/en/editor.php @@ -117,6 +117,8 @@ $string['pleaseenteralt'] = 'Please enter the alternate text'; $string['popupeditor'] = 'Enlarge Editor'; $string['preformatted'] = 'Preformatted'; $string['preview'] = 'Preview'; +$string['privacy:metadata:preference:htmleditor'] = 'The preferred editor to use when using an HTML Text Area'; +$string['privacy:preference:htmleditor'] = 'Your preferred editor to use for writing HTML text is {$a}'; $string['properties'] = 'Properties'; $string['redo'] = 'Redo your last action'; $string['regularexpressions'] = 'Use regular expressions'; diff --git a/lib/editor/classes/privacy/provider.php b/lib/editor/classes/privacy/provider.php new file mode 100644 index 00000000000..40c0786bfe1 --- /dev/null +++ b/lib/editor/classes/privacy/provider.php @@ -0,0 +1,71 @@ +. + +/** + * Privacy class for requesting user data. + * + * @package core_editor + * @copyright 2018 Andrew Nicols + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core_editor\privacy; + +defined('MOODLE_INTERNAL') || die(); + +use \core_privacy\local\metadata\collection; +use core_privacy\local\request\writer; + +/** + * Provider for the editor API. + * + * @copyright 2018 Andrew Nicols + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class provider implements + // The Editor subsystem does not store any data itself. + // It has no database tables, and it purely acts as a conduit to the various editors. + \core_privacy\local\metadata\provider, + + // The Editor subsystem has user preferences. + \core_privacy\local\request\user_preference_provider { + + /** + * Returns meta data about this system. + * + * @param collection $collection The initialised collection to add items to. + * @return collection A listing of user data stored through this system. + */ + public static function get_metadata(collection $collection) : collection { + $collection->add_user_preference('htmleditor', 'privacy:metadata:preference:htmleditor'); + + return $collection; + } + + /** + * Export all user preferences for the plugin. + * + * @param int $userid The userid of the user whose data is to be exported. + */ + public static function export_user_preferences(int $userid) { + $preference = get_user_preferences('htmleditor'); + if (null !== $preference) { + $desc = get_string('privacy:preference:htmleditor', 'core_editor', + get_string('pluginname', "editor_{$preference}")); + writer::export_user_preference('core_editor', 'htmleditor', $preference, $desc); + } + } +} diff --git a/lib/editor/tests/privacy_provider_test.php b/lib/editor/tests/privacy_provider_test.php new file mode 100644 index 00000000000..d33e0071d17 --- /dev/null +++ b/lib/editor/tests/privacy_provider_test.php @@ -0,0 +1,79 @@ +. + +/** + * Privacy provider tests. + * + * @package core_editor + * @copyright 2018 Andrew Nicols + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +use core_privacy\local\metadata\collection; +use core_privacy\local\request\writer; +use core_editor\privacy\provider; + +defined('MOODLE_INTERNAL') || die(); + +/** + * Privacy provider tests class. + * + * @package core_editor + * @copyright 2018 Andrew Nicols + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class core_editor_privacy_provider_testcase extends \core_privacy\tests\provider_testcase { + /** + * When no preference exists, there should be no export. + */ + public function test_no_preference() { + global $USER; + $this->resetAfterTest(); + $this->setAdminUser(); + + provider::export_user_preferences($USER->id); + $this->assertFalse(writer::with_context(\context_system::instance())->has_any_data()); + } + + /** + * When an editor is set, the name of that editor will be reported. + */ + public function test_editor_atto() { + global $USER; + $this->resetAfterTest(); + $this->setAdminUser(); + + set_user_preference('htmleditor', 'atto'); + + provider::export_user_preferences($USER->id); + $this->assertTrue(writer::with_context(\context_system::instance())->has_any_data()); + + $prefs = writer::with_context(\context_system::instance())->get_user_preferences('core_editor'); + $this->assertNotEmpty($prefs->htmleditor); + $this->assertNotEmpty($prefs->htmleditor->value); + $this->assertNotEmpty($prefs->htmleditor->description); + $this->assertEquals('atto', $prefs->htmleditor->value); + + $this->assertEquals( + get_string( + 'privacy:preference:htmleditor', + 'core_editor', + get_string('pluginname', "editor_atto") + ), + $prefs->htmleditor->description + ); + } +}