mirror of
https://github.com/moodle/moodle.git
synced 2025-01-17 13:38:32 +01:00
MDL-71258 questions: privacy support for settings defaults preferences
This commit is contained in:
parent
a5f0b354e7
commit
95782015ba
@ -80,4 +80,18 @@ class transform {
|
||||
return get_string('no');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate a float value which should be between 0.0 and 1.0 into percentage.
|
||||
*
|
||||
* @param float $value The value between 0.0 and 1.0.
|
||||
* @return float|string
|
||||
*/
|
||||
public static function percentage(float $value) {
|
||||
if (is_float($value)) {
|
||||
return (100 * $value) . '%';
|
||||
} else {
|
||||
return $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -24,23 +24,60 @@
|
||||
|
||||
namespace qtype_ddimageortext\privacy;
|
||||
|
||||
use core_privacy\local\metadata\collection;
|
||||
use core_privacy\local\request\transform;
|
||||
use core_privacy\local\request\writer;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
* Privacy Subsystem for qtype_ddimageortext implementing null_provider.
|
||||
* Privacy Subsystem for qtype_ddimageortext implementing user_preference_provider.
|
||||
*
|
||||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class provider implements \core_privacy\local\metadata\null_provider {
|
||||
class provider implements
|
||||
// This component has data.
|
||||
// We need to return default options that have been set a user preferences.
|
||||
\core_privacy\local\metadata\provider,
|
||||
\core_privacy\local\request\user_preference_provider
|
||||
{
|
||||
|
||||
/**
|
||||
* Get the language string identifier with the component's language
|
||||
* file to explain why this plugin stores no data.
|
||||
* Returns meta data about this system.
|
||||
*
|
||||
* @return string
|
||||
* @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_reason() : string {
|
||||
return 'privacy:metadata';
|
||||
public static function get_metadata(collection $collection) : collection {
|
||||
$collection->add_user_preference('qtype_ddimageortext_defaultmark', 'privacy:preference:defaultmark');
|
||||
$collection->add_user_preference('qtype_ddimageortext_penalty', 'privacy:preference:penalty');
|
||||
$collection->add_user_preference('qtype_ddimageortext_shuffleanswers', 'privacy:preference:shuffleanswers');
|
||||
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('qtype_ddimageortext_defaultmark', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:defaultmark', 'qtype_ddimageortext');
|
||||
writer::export_user_preference('qtype_ddimageortext', 'defaultmark', $preference, $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_ddimageortext_penalty', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:penalty', 'qtype_ddimageortext');
|
||||
writer::export_user_preference('qtype_ddimageortext', 'penalty', transform::percentage($preference), $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_ddimageortext_shuffleanswers', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:shuffleanswers', 'qtype_ddimageortext');
|
||||
writer::export_user_preference('qtype_ddimageortext', 'shuffleanswers', transform::yesno($preference), $desc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -63,7 +63,10 @@ $string['pluginnamesummary'] = 'Images or text labels are dragged and dropped in
|
||||
Note: This question type is not accessible to users who are visually impaired.';
|
||||
$string['previewareaheader'] = 'Preview';
|
||||
$string['previewareamessage'] = 'Select a background image, specify draggable items and define drop zones on the background image into which they must be dragged.';
|
||||
$string['privacy:metadata'] = 'The Drag and drop onto image question type plugin does not store any personal data.';
|
||||
$string['privacy:metadata'] = 'Drag and drop onto image question type plugin allows question authors to set default options as user preferences.';
|
||||
$string['privacy:preference:defaultmark'] = 'The default mark set for a given question.';
|
||||
$string['privacy:preference:penalty'] = 'The penalty for each incorrect try when questions are run using the \'Interactive with multiple tries\' or \'Adaptive mode\' behaviour.';
|
||||
$string['privacy:preference:shuffleanswers'] = 'Whether the answers should be automatically shuffled.';
|
||||
$string['refresh'] = 'Refresh preview';
|
||||
$string['shuffleimages'] = 'Shuffle drag items each time question is attempted';
|
||||
$string['summarisechoice'] = '{$a->no}. {$a->text}';
|
||||
|
101
question/type/ddimageortext/tests/privacy_provider_test.php
Normal file
101
question/type/ddimageortext/tests/privacy_provider_test.php
Normal file
@ -0,0 +1,101 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Privacy provider tests.
|
||||
*
|
||||
* @package qtype_ddimageortext
|
||||
* @copyright 2021 The Open university
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
use core_privacy\local\metadata\collection;
|
||||
use \core_privacy\local\request\user_preference_provider;
|
||||
use qtype_ddimageortext\privacy\provider;
|
||||
use core_privacy\local\request\writer;
|
||||
use core_privacy\local\request\transform;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
require_once($CFG->dirroot . '/question/type/ddimageortext/classes/privacy/provider.php');
|
||||
|
||||
/**
|
||||
* Privacy provider tests class.
|
||||
*
|
||||
* @package qtype_ddimageortext
|
||||
* @copyright 2021 The Open university
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class qtype_ddimageortext_privacy_provider_testcase extends \core_privacy\tests\provider_testcase {
|
||||
// Include the privacy helper which has assertions on it.
|
||||
|
||||
public function test_get_metadata() {
|
||||
$collection = new \core_privacy\local\metadata\collection('qtype_ddimageortext');
|
||||
$actual = \qtype_ddimageortext\privacy\provider::get_metadata($collection);
|
||||
$this->assertEquals($collection, $actual);
|
||||
}
|
||||
|
||||
public function test_export_user_preferences_no_pref() {
|
||||
$this->resetAfterTest();
|
||||
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
provider::export_user_preferences($user->id);
|
||||
$writer = writer::with_context(\context_system::instance());
|
||||
$this->assertFalse($writer->has_any_data());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the export_user_preferences given different inputs
|
||||
* @dataProvider user_preference_provider
|
||||
|
||||
* @param string $name The name of the user preference to get/set
|
||||
* @param string $value The value stored in the database
|
||||
* @param string $expected The expected transformed value
|
||||
*/
|
||||
public function test_export_user_preferences($name, $value, $expected) {
|
||||
$this->resetAfterTest();
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
set_user_preference("qtype_ddimageortext_$name", $value, $user);
|
||||
provider::export_user_preferences($user->id);
|
||||
$writer = writer::with_context(\context_system::instance());
|
||||
$this->assertTrue($writer->has_any_data());
|
||||
$preferences = $writer->get_user_preferences('qtype_ddimageortext');
|
||||
foreach ($preferences as $key => $pref) {
|
||||
$preference = get_user_preferences("qtype_ddimageortext_{$key}", null, $user->id);
|
||||
if ($preference === null) {
|
||||
continue;
|
||||
}
|
||||
$desc = get_string("privacy:preference:{$key}", 'qtype_ddimageortext');
|
||||
$this->assertEquals($expected, $pref->value);
|
||||
$this->assertEquals($desc, $pref->description);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an array of valid user preferences for the multiple choice question type.
|
||||
*
|
||||
* @return array Array of valid user preferences.
|
||||
*/
|
||||
public function user_preference_provider() {
|
||||
return [
|
||||
'default mark 1' => ['defaultmark', 1, 1],
|
||||
'penalty 33.33333%' => ['penalty', 0.3333333, '33.33333%'],
|
||||
'shuffle yes' => ['shuffleanswers', 1, 'Yes'],
|
||||
'shuffle no' => ['shuffleanswers', 0, 'No']
|
||||
];
|
||||
}
|
||||
}
|
@ -24,23 +24,60 @@
|
||||
|
||||
namespace qtype_ddmarker\privacy;
|
||||
|
||||
use core_privacy\local\metadata\collection;
|
||||
use core_privacy\local\request\transform;
|
||||
use core_privacy\local\request\writer;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
* Privacy Subsystem for qtype_ddmarker implementing null_provider.
|
||||
* Privacy Subsystem for qtype_ddmarker implementing user_preference_provider.
|
||||
*
|
||||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class provider implements \core_privacy\local\metadata\null_provider {
|
||||
class provider implements
|
||||
// This component has data.
|
||||
// We need to return default options that have been set a user preferences.
|
||||
\core_privacy\local\metadata\provider,
|
||||
\core_privacy\local\request\user_preference_provider
|
||||
{
|
||||
|
||||
/**
|
||||
* Get the language string identifier with the component's language
|
||||
* file to explain why this plugin stores no data.
|
||||
* Returns meta data about this system.
|
||||
*
|
||||
* @return string
|
||||
* @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_reason() : string {
|
||||
return 'privacy:metadata';
|
||||
public static function get_metadata(collection $collection) : collection {
|
||||
$collection->add_user_preference('qtype_ddmarker_defaultmark', 'privacy:preference:defaultmark');
|
||||
$collection->add_user_preference('qtype_ddmarker_penalty', 'privacy:preference:penalty');
|
||||
$collection->add_user_preference('qtype_ddmarker_shuffleanswers', 'privacy:preference:shuffleanswers');
|
||||
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('qtype_ddmarker_defaultmark', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:defaultmark', 'qtype_ddmarker');
|
||||
writer::export_user_preference('qtype_ddmarker', 'defaultmark', $preference, $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_ddmarker_penalty', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:penalty', 'qtype_ddmarker');
|
||||
writer::export_user_preference('qtype_ddmarker', 'penalty', transform::percentage($preference), $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_ddmarker_shuffleanswers', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:shuffleanswers', 'qtype_ddmarker');
|
||||
writer::export_user_preference('qtype_ddmarker', 'shuffleanswers', transform::yesno($preference), $desc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -81,7 +81,10 @@ $string['pluginnamesummary'] = 'Markers are dragged and dropped onto a backgroun
|
||||
Note: This question type is not accessible to users who are visually impaired.';
|
||||
$string['previewareaheader'] = 'Preview';
|
||||
$string['previewareamessage'] = 'Select a background image file, enter text labels for markers and define the drop zones on the background image to which they must be dragged.';
|
||||
$string['privacy:metadata'] = 'The Drag and drop markers question type plugin does not store any personal data.';
|
||||
$string['privacy:metadata'] = 'Drag and drop markers question type plugin allows question authors to set default options as user preferences.';
|
||||
$string['privacy:preference:defaultmark'] = 'The default mark set for a given question.';
|
||||
$string['privacy:preference:penalty'] = 'The penalty for each incorrect try when questions are run using the \'Interactive with multiple tries\' or \'Adaptive mode\' behaviour.';
|
||||
$string['privacy:preference:shuffleanswers'] = 'Whether the answers should be automatically shuffled.';
|
||||
$string['refresh'] = 'Refresh preview';
|
||||
$string['clearwrongparts'] = 'Move incorrectly placed markers back to default start position below image';
|
||||
$string['shape'] = 'Shape';
|
||||
|
101
question/type/ddmarker/tests/privacy_provider_test.php
Normal file
101
question/type/ddmarker/tests/privacy_provider_test.php
Normal file
@ -0,0 +1,101 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Privacy provider tests.
|
||||
*
|
||||
* @package qtype_ddmarker
|
||||
* @copyright 2021 The Open university
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
use core_privacy\local\metadata\collection;
|
||||
use \core_privacy\local\request\user_preference_provider;
|
||||
use qtype_ddmarker\privacy\provider;
|
||||
use core_privacy\local\request\writer;
|
||||
use core_privacy\local\request\transform;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
require_once($CFG->dirroot . '/question/type/ddmarker/classes/privacy/provider.php');
|
||||
|
||||
/**
|
||||
* Privacy provider tests class.
|
||||
*
|
||||
* @package qtype_ddmarker
|
||||
* @copyright 2021 The Open university
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class qtype_ddmarker_privacy_provider_testcase extends \core_privacy\tests\provider_testcase {
|
||||
// Include the privacy helper which has assertions on it.
|
||||
|
||||
public function test_get_metadata() {
|
||||
$collection = new \core_privacy\local\metadata\collection('qtype_ddmarker');
|
||||
$actual = \qtype_ddmarker\privacy\provider::get_metadata($collection);
|
||||
$this->assertEquals($collection, $actual);
|
||||
}
|
||||
|
||||
public function test_export_user_preferences_no_pref() {
|
||||
$this->resetAfterTest();
|
||||
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
provider::export_user_preferences($user->id);
|
||||
$writer = writer::with_context(\context_system::instance());
|
||||
$this->assertFalse($writer->has_any_data());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the export_user_preferences given different inputs
|
||||
* @dataProvider user_preference_provider
|
||||
|
||||
* @param string $name The name of the user preference to get/set
|
||||
* @param string $value The value stored in the database
|
||||
* @param string $expected The expected transformed value
|
||||
*/
|
||||
public function test_export_user_preferences($name, $value, $expected) {
|
||||
$this->resetAfterTest();
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
set_user_preference("qtype_ddmarker_$name", $value, $user);
|
||||
provider::export_user_preferences($user->id);
|
||||
$writer = writer::with_context(\context_system::instance());
|
||||
$this->assertTrue($writer->has_any_data());
|
||||
$preferences = $writer->get_user_preferences('qtype_ddmarker');
|
||||
foreach ($preferences as $key => $pref) {
|
||||
$preference = get_user_preferences("qtype_ddmarker_{$key}", null, $user->id);
|
||||
if ($preference === null) {
|
||||
continue;
|
||||
}
|
||||
$desc = get_string("privacy:preference:{$key}", 'qtype_ddmarker');
|
||||
$this->assertEquals($expected, $pref->value);
|
||||
$this->assertEquals($desc, $pref->description);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an array of valid user preferences for the multiple choice question type.
|
||||
*
|
||||
* @return array Array of valid user preferences.
|
||||
*/
|
||||
public function user_preference_provider() {
|
||||
return [
|
||||
'default mark 1.5' => ['defaultmark', 1.5, 1.5],
|
||||
'penalty 33.33333%' => ['penalty', 0.3333333, '33.33333%'],
|
||||
'shuffle yes' => ['shuffleanswers', 1, 'Yes'],
|
||||
'shuffle no' => ['shuffleanswers', 0, 'No']
|
||||
];
|
||||
}
|
||||
}
|
@ -24,23 +24,60 @@
|
||||
|
||||
namespace qtype_ddwtos\privacy;
|
||||
|
||||
use core_privacy\local\metadata\collection;
|
||||
use core_privacy\local\request\transform;
|
||||
use core_privacy\local\request\writer;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
* Privacy Subsystem for qtype_ddwtos implementing null_provider.
|
||||
* Privacy Subsystem for qtype_ddwtos implementing user_preference_provider.
|
||||
*
|
||||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class provider implements \core_privacy\local\metadata\null_provider {
|
||||
class provider implements
|
||||
// This component has data.
|
||||
// We need to return default options that have been set a user preferences.
|
||||
\core_privacy\local\metadata\provider,
|
||||
\core_privacy\local\request\user_preference_provider
|
||||
{
|
||||
|
||||
/**
|
||||
* Get the language string identifier with the component's language
|
||||
* file to explain why this plugin stores no data.
|
||||
* Returns meta data about this system.
|
||||
*
|
||||
* @return string
|
||||
* @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_reason() : string {
|
||||
return 'privacy:metadata';
|
||||
public static function get_metadata(collection $collection) : collection {
|
||||
$collection->add_user_preference('qtype_ddwtos_defaultmark', 'privacy:preference:defaultmark');
|
||||
$collection->add_user_preference('qtype_ddwtos_penalty', 'privacy:preference:penalty');
|
||||
$collection->add_user_preference('qtype_ddwtos_shuffleanswers', 'privacy:preference:shuffleanswers');
|
||||
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('qtype_ddwtos_defaultmark', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:defaultmark', 'qtype_ddwtos');
|
||||
writer::export_user_preference('qtype_ddwtos', 'defaultmark', $preference, $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_ddwtos_penalty', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:penalty', 'qtype_ddwtos');
|
||||
writer::export_user_preference('qtype_ddwtos', 'penalty', transform::percentage($preference), $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_ddwtos_shuffleanswers', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:shuffleanswers', 'qtype_ddwtos');
|
||||
writer::export_user_preference('qtype_ddwtos', 'shuffleanswers', transform::yesno($preference), $desc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -34,4 +34,7 @@ $string['pluginname_link'] = 'question/type/ddwtos';
|
||||
$string['pluginnameadding'] = 'Adding a drag and drop into text';
|
||||
$string['pluginnameediting'] = 'Editing a drag and drop into text';
|
||||
$string['pluginnamesummary'] = 'Missing words in the question text are filled in using drag and drop.';
|
||||
$string['privacy:metadata'] = 'The Drag and drop into text question type plugin does not store any personal data.';
|
||||
$string['privacy:metadata'] = 'Drag and drop into text question type plugin allows question authors to set default options as user preferences.';
|
||||
$string['privacy:preference:defaultmark'] = 'The default mark set for a given question.';
|
||||
$string['privacy:preference:penalty'] = 'The penalty for each incorrect try when questions are run using the \'Interactive with multiple tries\' or \'Adaptive mode\' behaviour.';
|
||||
$string['privacy:preference:shuffleanswers'] = 'Whether the answers should be automatically shuffled.';
|
||||
|
101
question/type/ddwtos/tests/privacy_provider_test.php
Normal file
101
question/type/ddwtos/tests/privacy_provider_test.php
Normal file
@ -0,0 +1,101 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Privacy provider tests.
|
||||
*
|
||||
* @package qtype_ddwtos
|
||||
* @copyright 2021 The Open university
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
use core_privacy\local\metadata\collection;
|
||||
use \core_privacy\local\request\user_preference_provider;
|
||||
use qtype_ddwtos\privacy\provider;
|
||||
use core_privacy\local\request\writer;
|
||||
use core_privacy\local\request\transform;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
require_once($CFG->dirroot . '/question/type/ddwtos/classes/privacy/provider.php');
|
||||
|
||||
/**
|
||||
* Privacy provider tests class.
|
||||
*
|
||||
* @package qtype_ddwtos
|
||||
* @copyright 2021 The Open university
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class qtype_ddwtos_privacy_provider_testcase extends \core_privacy\tests\provider_testcase {
|
||||
// Include the privacy helper which has assertions on it.
|
||||
|
||||
public function test_get_metadata() {
|
||||
$collection = new \core_privacy\local\metadata\collection('qtype_ddwtos');
|
||||
$actual = \qtype_ddwtos\privacy\provider::get_metadata($collection);
|
||||
$this->assertEquals($collection, $actual);
|
||||
}
|
||||
|
||||
public function test_export_user_preferences_no_pref() {
|
||||
$this->resetAfterTest();
|
||||
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
provider::export_user_preferences($user->id);
|
||||
$writer = writer::with_context(\context_system::instance());
|
||||
$this->assertFalse($writer->has_any_data());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the export_user_preferences given different inputs
|
||||
* @dataProvider user_preference_provider
|
||||
|
||||
* @param string $name The name of the user preference to get/set
|
||||
* @param string $value The value stored in the database
|
||||
* @param string $expected The expected transformed value
|
||||
*/
|
||||
public function test_export_user_preferences($name, $value, $expected) {
|
||||
$this->resetAfterTest();
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
set_user_preference("qtype_ddwtos_$name", $value, $user);
|
||||
provider::export_user_preferences($user->id);
|
||||
$writer = writer::with_context(\context_system::instance());
|
||||
$this->assertTrue($writer->has_any_data());
|
||||
$preferences = $writer->get_user_preferences('qtype_ddwtos');
|
||||
foreach ($preferences as $key => $pref) {
|
||||
$preference = get_user_preferences("qtype_ddwtos_{$key}", null, $user->id);
|
||||
if ($preference === null) {
|
||||
continue;
|
||||
}
|
||||
$desc = get_string("privacy:preference:{$key}", 'qtype_ddwtos');
|
||||
$this->assertEquals($expected, $pref->value);
|
||||
$this->assertEquals($desc, $pref->description);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an array of valid user preferences for the multiple choice question type.
|
||||
*
|
||||
* @return array Array of valid user preferences.
|
||||
*/
|
||||
public function user_preference_provider() {
|
||||
return [
|
||||
'default mark 2' => ['defaultmark', 2, 2],
|
||||
'penalty 33.33333%' => ['penalty', 0.3333333, '33.33333%'],
|
||||
'shuffle yes' => ['shuffleanswers', 1, 'Yes'],
|
||||
'shuffle no' => ['shuffleanswers', 0, 'No']
|
||||
];
|
||||
}
|
||||
}
|
@ -24,23 +24,160 @@
|
||||
|
||||
namespace qtype_essay\privacy;
|
||||
|
||||
use \core_privacy\local\metadata\collection;
|
||||
use \core_privacy\local\request\user_preference_provider;
|
||||
use \core_privacy\local\request\writer;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
* Privacy Subsystem for qtype_essay implementing null_provider.
|
||||
* Privacy Subsystem for qtype_essay implementing user_preference_provider.
|
||||
*
|
||||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class provider implements \core_privacy\local\metadata\null_provider {
|
||||
class provider implements
|
||||
// This component has data.
|
||||
// We need to return default options that have been set a user preferences.
|
||||
\core_privacy\local\metadata\provider,
|
||||
\core_privacy\local\request\user_preference_provider
|
||||
{
|
||||
|
||||
/**
|
||||
* Get the language string identifier with the component's language
|
||||
* file to explain why this plugin stores no data.
|
||||
* Returns meta data about this system.
|
||||
*
|
||||
* @return string
|
||||
* @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_reason() : string {
|
||||
return 'privacy:metadata';
|
||||
public static function get_metadata(collection $collection) : collection {
|
||||
$collection->add_user_preference('qtype_essay_defaultmark', 'privacy:preference:defaultmark');
|
||||
$collection->add_user_preference('qtype_essay_responseformat', 'privacy:preference:responseformat');
|
||||
$collection->add_user_preference('qtype_essay_responserequired', 'privacy:preference:responserequired');
|
||||
$collection->add_user_preference('qtype_essay_responsefieldlines', 'privacy:preference:responsefieldlines');
|
||||
$collection->add_user_preference('qtype_essay_attachments', 'privacy:preference:attachments');
|
||||
$collection->add_user_preference('qtype_essay_attachmentsrequired', 'privacy:preference:attachmentsrequired');
|
||||
$collection->add_user_preference('qtype_essay_maxbytes', 'privacy:preference:maxbytes');
|
||||
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('qtype_essay_defaultmark', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:defaultmark', 'qtype_essay');
|
||||
writer::export_user_preference('qtype_essay', 'defaultmark', $preference, $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_essay_responseformat', null, $userid);
|
||||
if (null !== $preference) {
|
||||
switch($preference) {
|
||||
case 'editor':
|
||||
$stringvalue = get_string('formateditor', 'qtype_essay');
|
||||
break;
|
||||
case 'editorfilepicker':
|
||||
$stringvalue = get_string('formateditorfilepicker', 'qtype_essay');
|
||||
break;
|
||||
case 'plain':
|
||||
$stringvalue = get_string('formatplain', 'qtype_essay');
|
||||
break;
|
||||
case 'monospaced':
|
||||
$stringvalue = get_string('formatmonospaced', 'qtype_essay');
|
||||
break;
|
||||
case 'noinline':
|
||||
$stringvalue = get_string('formatnoinline', 'qtype_essay');
|
||||
break;
|
||||
default:
|
||||
$stringvalue = get_string('formateditor', 'qtype_essay');
|
||||
break;
|
||||
}
|
||||
$desc = get_string('privacy:preference:responseformat', 'qtype_essay');
|
||||
writer::export_user_preference('qtype_essay', 'responseformat', $stringvalue, $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_essay_responserequired', null, $userid);
|
||||
if (null !== $preference) {
|
||||
if ($preference) {
|
||||
$stringvalue = get_string('responseisrequired', 'qtype_essay');
|
||||
} else {
|
||||
$stringvalue = get_string('responsenotrequired', 'qtype_essay');
|
||||
}
|
||||
$desc = get_string('privacy:preference:responserequired', 'qtype_essay');
|
||||
writer::export_user_preference('qtype_essay', 'responserequired', $stringvalue, $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_essay_responsefieldlines', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:responsefieldlines', 'qtype_essay');
|
||||
writer::export_user_preference('qtype_essay', 'responsefieldlines',
|
||||
get_string('nlines', 'qtype_essay', $preference), $desc);
|
||||
}
|
||||
$preference = get_user_preferences('qtype_essay_attachments', null, $userid);
|
||||
if (null !== $preference) {
|
||||
if ($preference == 0) {
|
||||
$stringvalue = get_string('no');
|
||||
} else if ($preference == -1) {
|
||||
$stringvalue = get_string('unlimited');
|
||||
} else {
|
||||
$stringvalue = $preference;
|
||||
}
|
||||
$desc = get_string('privacy:preference:attachments', 'qtype_essay');
|
||||
writer::export_user_preference('qtype_essay', 'attachments', $stringvalue, $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_essay_attachmentsrequired', null, $userid);
|
||||
if (null !== $preference) {
|
||||
if ($preference == 0) {
|
||||
$stringvalue = get_string('attachmentsoptional', 'qtype_essay');
|
||||
} else {
|
||||
$stringvalue = $preference;
|
||||
}
|
||||
$desc = get_string('privacy:preference:attachmentsrequired', 'qtype_essay');
|
||||
writer::export_user_preference('qtype_essay', 'attachmentsrequired', $stringvalue, $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_essay_maxbytes', null, $userid);
|
||||
if (null !== $preference) {
|
||||
switch ($preference) {
|
||||
case 52428800:
|
||||
$stringvalue = '50MB';
|
||||
break;
|
||||
case 20971520:
|
||||
$stringvalue = '20MB';
|
||||
break;
|
||||
case 10485760:
|
||||
$stringvalue = '10MB';
|
||||
break;
|
||||
case 5242880:
|
||||
$stringvalue = '5MB';
|
||||
break;
|
||||
case 2097152:
|
||||
$stringvalue = '2MB';
|
||||
break;
|
||||
case 1048576:
|
||||
$stringvalue = '1MB';
|
||||
break;
|
||||
case 512000:
|
||||
$stringvalue = '500KB';
|
||||
break;
|
||||
case 102400:
|
||||
$stringvalue = '100KB';
|
||||
break;
|
||||
case 51200:
|
||||
$stringvalue = '50KB';
|
||||
break;
|
||||
case 10240:
|
||||
$stringvalue = '10KB';
|
||||
break;
|
||||
default:
|
||||
$stringvalue = '50MB';
|
||||
break;
|
||||
}
|
||||
$desc = get_string('privacy:preference:maxbytes', 'qtype_essay');
|
||||
writer::export_user_preference('qtype_essay', 'maxbytes', $stringvalue, $desc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -60,7 +60,14 @@ $string['pluginname_link'] = 'question/type/essay';
|
||||
$string['pluginnameadding'] = 'Adding an Essay question';
|
||||
$string['pluginnameediting'] = 'Editing an Essay question';
|
||||
$string['pluginnamesummary'] = 'Allows a response of a file upload and/or online text. This must then be graded manually.';
|
||||
$string['privacy:metadata'] = 'The Essay question type plugin does not store any personal data.';
|
||||
$string['privacy:metadata'] = 'Essay question type plugin allows question authors to set default options as user preferences.';
|
||||
$string['privacy:preference:defaultmark'] = 'The default mark set for a given question.';
|
||||
$string['privacy:preference:responseformat'] = 'What is the response forma (HTML editor, Plain test, ect.)?';
|
||||
$string['privacy:preference:responserequired'] = 'Whether the student is required to enter text or the text input ias optional.';
|
||||
$string['privacy:preference:responsefieldlines'] = 'Number of lines indicating the size of the input box (textarea).';
|
||||
$string['privacy:preference:attachments'] = 'Number of allowed attachments.';
|
||||
$string['privacy:preference:attachmentsrequired'] = 'Number of required attachments.';
|
||||
$string['privacy:preference:maxbytes'] = 'Maximum file size.';
|
||||
$string['responsefieldlines'] = 'Input box size';
|
||||
$string['responseformat'] = 'Response format';
|
||||
$string['responseoptions'] = 'Response Options';
|
||||
|
113
question/type/essay/tests/privacy_provider_test.php
Normal file
113
question/type/essay/tests/privacy_provider_test.php
Normal file
@ -0,0 +1,113 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Privacy provider tests.
|
||||
*
|
||||
* @package qtype_essay
|
||||
* @copyright 2021 The Open university
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
use core_privacy\local\metadata\collection;
|
||||
use \core_privacy\local\request\user_preference_provider;
|
||||
use qtype_essay\privacy\provider;
|
||||
use core_privacy\local\request\writer;
|
||||
use core_privacy\local\request\transform;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
require_once($CFG->dirroot . '/question/type/essay/classes/privacy/provider.php');
|
||||
|
||||
/**
|
||||
* Privacy provider tests class.
|
||||
*
|
||||
* @package qtype_essay
|
||||
* @copyright 2021 The Open university
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class qtype_essay_privacy_provider_testcase extends \core_privacy\tests\provider_testcase {
|
||||
// Include the privacy helper which has assertions on it.
|
||||
|
||||
public function test_get_metadata() {
|
||||
$collection = new \core_privacy\local\metadata\collection('qtype_essay');
|
||||
$actual = \qtype_essay\privacy\provider::get_metadata($collection);
|
||||
$this->assertEquals($collection, $actual);
|
||||
}
|
||||
|
||||
public function test_export_user_preferences_no_pref() {
|
||||
$this->resetAfterTest();
|
||||
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
provider::export_user_preferences($user->id);
|
||||
$writer = writer::with_context(\context_system::instance());
|
||||
$this->assertFalse($writer->has_any_data());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the export_user_preferences given different inputs
|
||||
* @dataProvider user_preference_provider
|
||||
|
||||
* @param string $name The name of the user preference to get/set
|
||||
* @param string $value The value stored in the database
|
||||
* @param string $expected The expected transformed value
|
||||
*/
|
||||
public function test_export_user_preferences($name, $value, $expected) {
|
||||
$this->resetAfterTest();
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
set_user_preference("qtype_essay_$name", $value, $user);
|
||||
provider::export_user_preferences($user->id);
|
||||
$writer = writer::with_context(\context_system::instance());
|
||||
$this->assertTrue($writer->has_any_data());
|
||||
$preferences = $writer->get_user_preferences('qtype_essay');
|
||||
foreach ($preferences as $key => $pref) {
|
||||
$preference = get_user_preferences("qtype_essay_{$key}", null, $user->id);
|
||||
if ($preference === null) {
|
||||
continue;
|
||||
}
|
||||
$desc = get_string("privacy:preference:{$key}", 'qtype_essay');
|
||||
$this->assertEquals($expected, $pref->value);
|
||||
$this->assertEquals($desc, $pref->description);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an array of valid user preferences for the multiple choice question type.
|
||||
*
|
||||
* @return array Array of valid user preferences.
|
||||
*/
|
||||
public function user_preference_provider() {
|
||||
return [
|
||||
'default mark 2' => ['defaultmark', 2, 2],
|
||||
'responseformat editror ' => ['responseformat', 'editor', get_string('formateditor', 'qtype_essay')],
|
||||
'responseformat editor and filepicker ' =>
|
||||
['responseformat', 'editorfilepicker', get_string('formateditorfilepicker', 'qtype_essay')],
|
||||
'responseformat plain ' => ['responseformat', 'plain', get_string('formatplain', 'qtype_essay')],
|
||||
'responseformat monospaced ' => ['responseformat', 'monospaced', get_string('formatmonospaced', 'qtype_essay')],
|
||||
'responseformat noinline ' => ['responseformat', 'noinline', get_string('formatnoinline', 'qtype_essay')],
|
||||
'responserequired yes' => ['responserequired', 1, get_string('responseisrequired', 'qtype_essay')],
|
||||
'responserequired no ' => ['responserequired', 0, get_string('responsenotrequired', 'qtype_essay')],
|
||||
'responsefieldlines 10' => ['responsefieldlines', 10, '10 lines'],
|
||||
'attachments none' => ['attachments', 0, get_string('no')],
|
||||
'attachments 3' => ['attachments', 3, '3'],
|
||||
'attachments unlimited' => ['attachments', -1, get_string('unlimited')],
|
||||
'attachmentsrequired optional' => ['attachmentsrequired', 0, get_string('attachmentsoptional', 'qtype_essay')],
|
||||
'attachmentsrequired 1' => ['attachmentsrequired', 1, '1'],
|
||||
'maxbytes 50KB' => ['maxbytes', 51200, '50KB']
|
||||
];
|
||||
}
|
||||
}
|
@ -24,23 +24,60 @@
|
||||
|
||||
namespace qtype_gapselect\privacy;
|
||||
|
||||
use core_privacy\local\metadata\collection;
|
||||
use core_privacy\local\request\transform;
|
||||
use core_privacy\local\request\writer;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
* Privacy Subsystem for qtype_gapselect implementing null_provider.
|
||||
* Privacy Subsystem for qtype_gapselect implementing user_preference_provider.
|
||||
*
|
||||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class provider implements \core_privacy\local\metadata\null_provider {
|
||||
class provider implements
|
||||
// This component has data.
|
||||
// We need to return default options that have been set a user preferences.
|
||||
\core_privacy\local\metadata\provider,
|
||||
\core_privacy\local\request\user_preference_provider
|
||||
{
|
||||
|
||||
/**
|
||||
* Get the language string identifier with the component's language
|
||||
* file to explain why this plugin stores no data.
|
||||
* Returns meta data about this system.
|
||||
*
|
||||
* @return string
|
||||
* @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_reason() : string {
|
||||
return 'privacy:metadata';
|
||||
public static function get_metadata(collection $collection) : collection {
|
||||
$collection->add_user_preference('qtype_gapselect_defaultmark', 'privacy:preference:defaultmark');
|
||||
$collection->add_user_preference('qtype_gapselect_penalty', 'privacy:preference:penalty');
|
||||
$collection->add_user_preference('qtype_gapselect_shuffleanswers', 'privacy:preference:shuffleanswers');
|
||||
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('qtype_gapselect_defaultmark', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:defaultmark', 'qtype_gapselect');
|
||||
writer::export_user_preference('qtype_gapselect', 'defaultmark', $preference, $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_gapselect_penalty', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:penalty', 'qtype_gapselect');
|
||||
writer::export_user_preference('qtype_gapselect', 'penalty', transform::percentage($preference), $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_gapselect_shuffleanswers', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:shuffleanswers', 'qtype_gapselect');
|
||||
writer::export_user_preference('qtype_gapselect', 'shuffleanswers', transform::yesno($preference), $desc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -41,7 +41,10 @@ $string['pluginname_link'] = 'question/type/gapselect';
|
||||
$string['pluginnameadding'] = 'Adding a select missing words question';
|
||||
$string['pluginnameediting'] = 'Editing a select missing words question';
|
||||
$string['pluginnamesummary'] = 'Missing words in the question text are filled in using drop-down menus.';
|
||||
$string['privacy:metadata'] = 'The Select missing words plugin does not store any personal data.';
|
||||
$string['privacy:metadata'] = 'Select missing words question type plugin allows question authors to set default options as user preferences.';
|
||||
$string['privacy:preference:defaultmark'] = 'The default mark set for a given question.';
|
||||
$string['privacy:preference:penalty'] = 'The penalty for each incorrect try when questions are run using the \'Interactive with multiple tries\' or \'Adaptive mode\' behaviour.';
|
||||
$string['privacy:preference:shuffleanswers'] = 'Whether the answers should be automatically shuffled.';
|
||||
$string['shuffle'] = 'Shuffle';
|
||||
$string['tagsnotallowed'] = '{$a->tag} is not allowed. (Only {$a->allowed} are permitted.)';
|
||||
$string['tagsnotallowedatall'] = '{$a->tag} is not allowed. (No HTML is allowed here.)';
|
||||
|
101
question/type/gapselect/tests/privacy_provider_test.php
Normal file
101
question/type/gapselect/tests/privacy_provider_test.php
Normal file
@ -0,0 +1,101 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Privacy provider tests.
|
||||
*
|
||||
* @package qtype_gapselect
|
||||
* @copyright 2021 The Open university
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
use core_privacy\local\metadata\collection;
|
||||
use \core_privacy\local\request\user_preference_provider;
|
||||
use qtype_gapselect\privacy\provider;
|
||||
use core_privacy\local\request\writer;
|
||||
use core_privacy\local\request\transform;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
require_once($CFG->dirroot . '/question/type/gapselect/classes/privacy/provider.php');
|
||||
|
||||
/**
|
||||
* Privacy provider tests class.
|
||||
*
|
||||
* @package qtype_gapselect
|
||||
* @copyright 2021 The Open university
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class qtype_gapselect_privacy_provider_testcase extends \core_privacy\tests\provider_testcase {
|
||||
// Include the privacy helper which has assertions on it.
|
||||
|
||||
public function test_get_metadata() {
|
||||
$collection = new \core_privacy\local\metadata\collection('qtype_gapselect');
|
||||
$actual = \qtype_gapselect\privacy\provider::get_metadata($collection);
|
||||
$this->assertEquals($collection, $actual);
|
||||
}
|
||||
|
||||
public function test_export_user_preferences_no_pref() {
|
||||
$this->resetAfterTest();
|
||||
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
provider::export_user_preferences($user->id);
|
||||
$writer = writer::with_context(\context_system::instance());
|
||||
$this->assertFalse($writer->has_any_data());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the export_user_preferences given different inputs
|
||||
* @dataProvider user_preference_provider
|
||||
|
||||
* @param string $name The name of the user preference to get/set
|
||||
* @param string $value The value stored in the database
|
||||
* @param string $expected The expected transformed value
|
||||
*/
|
||||
public function test_export_user_preferences($name, $value, $expected) {
|
||||
$this->resetAfterTest();
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
set_user_preference("qtype_gapselect_$name", $value, $user);
|
||||
provider::export_user_preferences($user->id);
|
||||
$writer = writer::with_context(\context_system::instance());
|
||||
$this->assertTrue($writer->has_any_data());
|
||||
$preferences = $writer->get_user_preferences('qtype_gapselect');
|
||||
foreach ($preferences as $key => $pref) {
|
||||
$preference = get_user_preferences("qtype_gapselect_{$key}", null, $user->id);
|
||||
if ($preference === null) {
|
||||
continue;
|
||||
}
|
||||
$desc = get_string("privacy:preference:{$key}", 'qtype_gapselect');
|
||||
$this->assertEquals($expected, $pref->value);
|
||||
$this->assertEquals($desc, $pref->description);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an array of valid user preferences for the multiple choice question type.
|
||||
*
|
||||
* @return array Array of valid user preferences.
|
||||
*/
|
||||
public function user_preference_provider() {
|
||||
return [
|
||||
'default mark 1.5' => ['defaultmark', 1.5, 1.5],
|
||||
'penalty 25%' => ['penalty', 0.2500000, '25%'],
|
||||
'shuffle yes' => ['shuffleanswers', 1, 'Yes'],
|
||||
'shuffle no' => ['shuffleanswers', 0, 'No']
|
||||
];
|
||||
}
|
||||
}
|
@ -24,23 +24,60 @@
|
||||
|
||||
namespace qtype_match\privacy;
|
||||
|
||||
use core_privacy\local\metadata\collection;
|
||||
use core_privacy\local\request\transform;
|
||||
use core_privacy\local\request\writer;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
* Privacy Subsystem for qtype_match implementing null_provider.
|
||||
* Privacy Subsystem for qtype_match implementing user_preference_provider.
|
||||
*
|
||||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class provider implements \core_privacy\local\metadata\null_provider {
|
||||
class provider implements
|
||||
// This component has data.
|
||||
// We need to return default options that have been set a user preferences.
|
||||
\core_privacy\local\metadata\provider,
|
||||
\core_privacy\local\request\user_preference_provider
|
||||
{
|
||||
|
||||
/**
|
||||
* Get the language string identifier with the component's language
|
||||
* file to explain why this plugin stores no data.
|
||||
* Returns meta data about this system.
|
||||
*
|
||||
* @return string
|
||||
* @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_reason() : string {
|
||||
return 'privacy:metadata';
|
||||
public static function get_metadata(collection $collection) : collection {
|
||||
$collection->add_user_preference('qtype_match_defaultmark', 'privacy:preference:defaultmark');
|
||||
$collection->add_user_preference('qtype_match_penalty', 'privacy:preference:penalty');
|
||||
$collection->add_user_preference('qtype_match_shuffleanswers', 'privacy:preference:shuffleanswers');
|
||||
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('qtype_match_defaultmark', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:defaultmark', 'qtype_match');
|
||||
writer::export_user_preference('qtype_match', 'defaultmark', $preference, $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_match_penalty', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:penalty', 'qtype_match');
|
||||
writer::export_user_preference('qtype_match', 'penalty', transform::percentage($preference), $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_match_shuffleanswers', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:shuffleanswers', 'qtype_match');
|
||||
writer::export_user_preference('qtype_match', 'shuffleanswers', transform::yesno($preference), $desc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -42,4 +42,7 @@ $string['pluginname_link'] = 'question/type/match';
|
||||
$string['pluginnameadding'] = 'Adding a Matching question';
|
||||
$string['pluginnameediting'] = 'Editing a Matching question';
|
||||
$string['pluginnamesummary'] = 'The answer to each of a number of sub-question must be selected from a list of possibilities.';
|
||||
$string['privacy:metadata'] = 'The Matching question type plugin does not store any personal data.';
|
||||
$string['privacy:metadata'] = 'Matching question type plugin allows question authors to set default options as user preferences.';
|
||||
$string['privacy:preference:defaultmark'] = 'The default mark set for a given question.';
|
||||
$string['privacy:preference:penalty'] = 'The penalty for each incorrect try when questions are run using the \'Interactive with multiple tries\' or \'Adaptive mode\' behaviour.';
|
||||
$string['privacy:preference:shuffleanswers'] = 'Whether the answers should be automatically shuffled.';
|
||||
|
101
question/type/match/tests/privacy_provider_test.php
Normal file
101
question/type/match/tests/privacy_provider_test.php
Normal file
@ -0,0 +1,101 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Privacy provider tests.
|
||||
*
|
||||
* @package qtype_match
|
||||
* @copyright 2021 The Open university
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
use core_privacy\local\metadata\collection;
|
||||
use \core_privacy\local\request\user_preference_provider;
|
||||
use qtype_match\privacy\provider;
|
||||
use core_privacy\local\request\writer;
|
||||
use core_privacy\local\request\transform;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
require_once($CFG->dirroot . '/question/type/match/classes/privacy/provider.php');
|
||||
|
||||
/**
|
||||
* Privacy provider tests class.
|
||||
*
|
||||
* @package qtype_match
|
||||
* @copyright 2021 The Open university
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class qtype_match_privacy_provider_testcase extends \core_privacy\tests\provider_testcase {
|
||||
// Include the privacy helper which has assertions on it.
|
||||
|
||||
public function test_get_metadata() {
|
||||
$collection = new \core_privacy\local\metadata\collection('qtype_match');
|
||||
$actual = \qtype_match\privacy\provider::get_metadata($collection);
|
||||
$this->assertEquals($collection, $actual);
|
||||
}
|
||||
|
||||
public function test_export_user_preferences_no_pref() {
|
||||
$this->resetAfterTest();
|
||||
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
provider::export_user_preferences($user->id);
|
||||
$writer = writer::with_context(\context_system::instance());
|
||||
$this->assertFalse($writer->has_any_data());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the export_user_preferences given different inputs
|
||||
* @dataProvider user_preference_provider
|
||||
|
||||
* @param string $name The name of the user preference to get/set
|
||||
* @param string $value The value stored in the database
|
||||
* @param string $expected The expected transformed value
|
||||
*/
|
||||
public function test_export_user_preferences($name, $value, $expected) {
|
||||
$this->resetAfterTest();
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
set_user_preference("qtype_match_$name", $value, $user);
|
||||
provider::export_user_preferences($user->id);
|
||||
$writer = writer::with_context(\context_system::instance());
|
||||
$this->assertTrue($writer->has_any_data());
|
||||
$preferences = $writer->get_user_preferences('qtype_match');
|
||||
foreach ($preferences as $key => $pref) {
|
||||
$preference = get_user_preferences("qtype_match_{$key}", null, $user->id);
|
||||
if ($preference === null) {
|
||||
continue;
|
||||
}
|
||||
$desc = get_string("privacy:preference:{$key}", 'qtype_match');
|
||||
$this->assertEquals($expected, $pref->value);
|
||||
$this->assertEquals($desc, $pref->description);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an array of valid user preferences for the multiple choice question type.
|
||||
*
|
||||
* @return array Array of valid user preferences.
|
||||
*/
|
||||
public function user_preference_provider() {
|
||||
return [
|
||||
'default mark 1' => ['defaultmark', 1, 1],
|
||||
'penalty 33.33333%' => ['penalty', 0.3333333, '33.33333%'],
|
||||
'shuffle yes' => ['shuffleanswers', 1, 'Yes'],
|
||||
'shuffle no' => ['shuffleanswers', 0, 'No']
|
||||
];
|
||||
}
|
||||
}
|
@ -24,23 +24,88 @@
|
||||
|
||||
namespace qtype_multichoice\privacy;
|
||||
|
||||
use \core_privacy\local\metadata\collection;
|
||||
use \core_privacy\local\request\transform;
|
||||
use \core_privacy\local\request\user_preference_provider;
|
||||
use \core_privacy\local\request\writer;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
* Privacy Subsystem for qtype_multichoice implementing null_provider.
|
||||
* Privacy Subsystem for qtype_multichoice implementing user_preference_provider.
|
||||
*
|
||||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class provider implements \core_privacy\local\metadata\null_provider {
|
||||
class provider implements
|
||||
// This component has data.
|
||||
// We need to return default options that have been set a user preferences.
|
||||
\core_privacy\local\metadata\provider,
|
||||
\core_privacy\local\request\user_preference_provider
|
||||
{
|
||||
|
||||
/**
|
||||
* Get the language string identifier with the component's language
|
||||
* file to explain why this plugin stores no data.
|
||||
* Returns meta data about this system.
|
||||
*
|
||||
* @return string
|
||||
* @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_reason() : string {
|
||||
return 'privacy:metadata';
|
||||
public static function get_metadata(collection $collection) : collection {
|
||||
$collection->add_user_preference('qtype_multichoice_defaultmark', 'privacy:preference:defaultmark');
|
||||
$collection->add_user_preference('qtype_multichoice_penalty', 'privacy:preference:penalty');
|
||||
$collection->add_user_preference('qtype_multichoice_single', 'privacy:preference:single');
|
||||
$collection->add_user_preference('qtype_multichoice_shuffleanswers', 'privacy:preference:shuffleanswers');
|
||||
$collection->add_user_preference('qtype_multichoice_answernumbering', 'privacy:preference:answernumbering');
|
||||
$collection->add_user_preference('qtype_multichoice_showstandardinstruction', 'privacy:preference:showstandardinstruction');
|
||||
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('qtype_multichoice_defaultmark', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:defaultmark', 'qtype_multichoice');
|
||||
writer::export_user_preference('qtype_multichoice', 'defaultmark', $preference, $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_multichoice_penalty', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:penalty', 'qtype_multichoice');
|
||||
writer::export_user_preference('qtype_multichoice', 'penalty', transform::percentage($preference), $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_multichoice_single', null, $userid);
|
||||
if (null !== $preference) {
|
||||
if ($preference) {
|
||||
$stringvalue = get_string('answersingleyes', 'qtype_multichoice');
|
||||
} else {
|
||||
$stringvalue = get_string('answersingleno', 'qtype_multichoice');
|
||||
}
|
||||
$desc = get_string('privacy:preference:single', 'qtype_multichoice');
|
||||
writer::export_user_preference('qtype_multichoice', 'single', $stringvalue, $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_multichoice_answernumbering', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:answernumbering', 'qtype_multichoice');
|
||||
writer::export_user_preference('qtype_multichoice', 'answernumbering',
|
||||
get_string('answernumbering' . $preference, 'qtype_multichoice'), $desc);
|
||||
}
|
||||
|
||||
$preferences = [
|
||||
'shuffleanswers',
|
||||
'showstandardinstruction'
|
||||
];
|
||||
foreach ($preferences as $key) {
|
||||
$preference = get_user_preferences("qtype_multichoice_{$key}", null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string("privacy:preference:{$key}", 'qtype_multichoice');
|
||||
writer::export_user_preference('qtype_multichoice', $key, transform::yesno($preference), $desc);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -65,7 +65,13 @@ $string['pluginname_link'] = 'question/type/multichoice';
|
||||
$string['pluginnameadding'] = 'Adding a Multiple choice question';
|
||||
$string['pluginnameediting'] = 'Editing a Multiple choice question';
|
||||
$string['pluginnamesummary'] = 'Allows the selection of a single or multiple responses from a pre-defined list.';
|
||||
$string['privacy:metadata'] = 'The Multiple choice question type plugin does not store any personal data.';
|
||||
$string['privacy:metadata'] = 'Multiple choice question type plugin allows question authors to set default options as user preferences.';
|
||||
$string['privacy:preference:defaultmark'] = 'The default mark set for a given question.';
|
||||
$string['privacy:preference:penalty'] = 'The penalty for each incorrect try when questions are run using the \'Interactive with multiple tries\' or \'Adaptive mode\' behaviour.';
|
||||
$string['privacy:preference:single'] = 'Whether the answer is single with radio buttons or multiple with checkboxes.';
|
||||
$string['privacy:preference:shuffleanswers'] = 'Whether the answers should be automatically shuffled.';
|
||||
$string['privacy:preference:answernumbering'] = 'Which numbering stye should be used (1., 2., 3., .../a., b., c., ... etc.)';
|
||||
$string['privacy:preference:showstandardinstruction'] = 'Whether showing standard instruction.';
|
||||
$string['selectmulti'] = 'Select one or more:';
|
||||
$string['selectone'] = 'Select one:';
|
||||
$string['shuffleanswers'] = 'Shuffle the choices?';
|
||||
|
110
question/type/multichoice/tests/privacy_provider_test.php
Normal file
110
question/type/multichoice/tests/privacy_provider_test.php
Normal file
@ -0,0 +1,110 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Privacy provider tests.
|
||||
*
|
||||
* @package qtype_multichoice
|
||||
* @copyright 2021 The Open university
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
use core_privacy\local\metadata\collection;
|
||||
use \core_privacy\local\request\user_preference_provider;
|
||||
use qtype_multichoice\privacy\provider;
|
||||
use core_privacy\local\request\writer;
|
||||
use core_privacy\local\request\transform;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
require_once($CFG->dirroot . '/question/type/multichoice/classes/privacy/provider.php');
|
||||
|
||||
/**
|
||||
* Privacy provider tests class.
|
||||
*
|
||||
* @package qtype_multichoice
|
||||
* @copyright 2021 The Open university
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class qtype_multichoice_privacy_provider_testcase extends \core_privacy\tests\provider_testcase {
|
||||
// Include the privacy helper which has assertions on it.
|
||||
|
||||
public function test_get_metadata() {
|
||||
$collection = new \core_privacy\local\metadata\collection('qtype_multichoice');
|
||||
$actual = \qtype_multichoice\privacy\provider::get_metadata($collection);
|
||||
$this->assertEquals($collection, $actual);
|
||||
}
|
||||
|
||||
public function test_export_user_preferences_no_pref() {
|
||||
$this->resetAfterTest();
|
||||
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
provider::export_user_preferences($user->id);
|
||||
$writer = writer::with_context(\context_system::instance());
|
||||
$this->assertFalse($writer->has_any_data());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the export_user_preferences given different inputs
|
||||
* @dataProvider user_preference_provider
|
||||
|
||||
* @param string $name The name of the user preference to get/set
|
||||
* @param string $value The value stored in the database
|
||||
* @param string $expected The expected transformed value
|
||||
*/
|
||||
public function test_export_user_preferences($name, $value, $expected) {
|
||||
$this->resetAfterTest();
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
set_user_preference("qtype_multichoice_$name", $value, $user);
|
||||
provider::export_user_preferences($user->id);
|
||||
$writer = writer::with_context(\context_system::instance());
|
||||
$this->assertTrue($writer->has_any_data());
|
||||
$preferences = $writer->get_user_preferences('qtype_multichoice');
|
||||
foreach ($preferences as $key => $pref) {
|
||||
$preference = get_user_preferences("qtype_multichoice_{$key}", null, $user->id);
|
||||
if ($preference === null) {
|
||||
continue;
|
||||
}
|
||||
$desc = get_string("privacy:preference:{$key}", 'qtype_multichoice');
|
||||
$this->assertEquals($expected, $pref->value);
|
||||
$this->assertEquals($desc, $pref->description);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an array of valid user preferences for the multiple choice question type.
|
||||
*
|
||||
* @return array Array of valid user preferences.
|
||||
*/
|
||||
public function user_preference_provider() {
|
||||
return [
|
||||
'default mark 2' => ['defaultmark', 2, 2],
|
||||
'penalty 33.33333%' => ['penalty', 0.3333333, '33.33333%'],
|
||||
'single/multiple radio buttons' => ['single', 1, 'One answer only'],
|
||||
'single/multiple checkboxes' => ['single', 0, 'Multiple answers allowed'],
|
||||
'shuffle yes' => ['shuffleanswers', 1, 'Yes'],
|
||||
'shuffle no' => ['shuffleanswers', 0, 'No'],
|
||||
'answernumbering abc' => ['answernumbering', 'abc', 'a., b., c., ...'],
|
||||
'answernumbering ABC' => ['answernumbering', 'ABCD', 'A., B., C., ...'],
|
||||
'answernumbering 123' => ['answernumbering', '123', '1., 2., 3., ...'],
|
||||
'answernumbering iii' => ['answernumbering', 'iii', 'i., ii., iii., ...'],
|
||||
'answernumbering III' => ['answernumbering', 'IIII', 'I., II., III., ...'],
|
||||
'show standard instruction yes' => ['showstandardinstruction', 1, 'Yes'],
|
||||
'show standard instruction no' => ['showstandardinstruction', 0, 'No']
|
||||
];
|
||||
}
|
||||
}
|
@ -24,23 +24,113 @@
|
||||
|
||||
namespace qtype_numerical\privacy;
|
||||
|
||||
use \core_privacy\local\metadata\collection;
|
||||
use \core_privacy\local\request\transform;
|
||||
use \core_privacy\local\request\user_preference_provider;
|
||||
use \core_privacy\local\request\writer;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
* Privacy Subsystem for qtype_numerical implementing null_provider.
|
||||
* Privacy Subsystem for qtype_numerical implementing user_preference_provider.
|
||||
*
|
||||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class provider implements \core_privacy\local\metadata\null_provider {
|
||||
class provider implements
|
||||
// This component has data.
|
||||
// We need to return default options that have been set a user preferences.
|
||||
\core_privacy\local\metadata\provider,
|
||||
\core_privacy\local\request\user_preference_provider
|
||||
{
|
||||
|
||||
/**
|
||||
* Get the language string identifier with the component's language
|
||||
* file to explain why this plugin stores no data.
|
||||
* Returns meta data about this system.
|
||||
*
|
||||
* @return string
|
||||
* @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_reason() : string {
|
||||
return 'privacy:metadata';
|
||||
public static function get_metadata(collection $collection) : collection {
|
||||
$collection->add_user_preference('qtype_numerical_defaultmark', 'privacy:preference:defaultmark');
|
||||
$collection->add_user_preference('qtype_numerical_penalty', 'privacy:preference:penalty');
|
||||
$collection->add_user_preference('qtype_numerical_unitrole', 'privacy:preference:unitrole');
|
||||
$collection->add_user_preference('qtype_numerical_unitpenalty', 'privacy:preference:unitpenalty');
|
||||
$collection->add_user_preference('qtype_numerical_unitgradingtypes', 'privacy:preference:unitgradingtypes');
|
||||
$collection->add_user_preference('qtype_numerical_multichoicedisplay', 'privacy:preference:multichoicedisplay');
|
||||
$collection->add_user_preference('qtype_numerical_unitsleft', 'privacy:preference:unitsleft');
|
||||
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('qtype_numerical_defaultmark', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:defaultmark', 'qtype_numerical');
|
||||
writer::export_user_preference('qtype_numerical', 'defaultmark', $preference, $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_numerical_penalty', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:penalty', 'qtype_numerical');
|
||||
writer::export_user_preference('qtype_numerical', 'penalty', transform::percentage($preference), $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_numerical_unitrole', null, $userid);
|
||||
if (null !== $preference) {
|
||||
if ($preference == \qtype_numerical::UNITNONE) {
|
||||
$stringvalue = get_string('onlynumerical', 'qtype_numerical');
|
||||
} else if ($preference == \qtype_numerical::UNITOPTIONAL) {
|
||||
$stringvalue = get_string('manynumerical', 'qtype_numerical');
|
||||
} else if ($preference == \qtype_numerical::UNITGRADED) {
|
||||
$stringvalue = get_string('unitgraded', 'qtype_numerical');
|
||||
}
|
||||
$desc = get_string('privacy:preference:unitrole', 'qtype_numerical');
|
||||
writer::export_user_preference('qtype_numerical', 'unitrole', $stringvalue, $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_numerical_unitpenalty', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:unitpenalty', 'qtype_numerical');
|
||||
writer::export_user_preference('qtype_numerical', 'unitpenalty', $preference, $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_numerical_unitgradingtypes', null, $userid);
|
||||
if (null !== $preference) {
|
||||
if ($preference == \qtype_numerical::UNITGRADEDOUTOFMARK) {
|
||||
$stringvalue = get_string('decfractionofresponsegrade', 'qtype_numerical');
|
||||
} else if ($preference == \qtype_numerical::UNITGRADEDOUTOFMAX) {
|
||||
$stringvalue = get_string('decfractionofquestiongrade', 'qtype_numerical');
|
||||
}
|
||||
$desc = get_string('privacy:preference:unitgradingtypes', 'qtype_numerical');
|
||||
writer::export_user_preference('qtype_numerical', 'unitgradingtypes', $stringvalue, $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_numerical_multichoicedisplay', null, $userid);
|
||||
if (null !== $preference) {
|
||||
if ($preference == \qtype_numerical::UNITINPUT) {
|
||||
$stringvalue = get_string('editableunittext', 'qtype_numerical');
|
||||
} else if ($preference == \qtype_numerical::UNITRADIO) {
|
||||
$stringvalue = get_string('unitchoice', 'qtype_numerical');
|
||||
} else if ($preference == \qtype_numerical::UNITSELECT) {
|
||||
$stringvalue = get_string('unitselect', 'qtype_numerical');
|
||||
}
|
||||
$desc = get_string('privacy:preference:multichoicedisplay', 'qtype_numerical');
|
||||
writer::export_user_preference('qtype_numerical', 'multichoicedisplay', $stringvalue, $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_numerical_unitsleft', null, $userid);
|
||||
if (null !== $preference) {
|
||||
if ($preference) {
|
||||
$stringvalue = get_string('leftexample', 'qtype_numerical');
|
||||
} else {
|
||||
$stringvalue = get_string('rightexample', 'qtype_numerical');
|
||||
}
|
||||
$desc = get_string('privacy:preference:unitsleft', 'qtype_numerical');
|
||||
writer::export_user_preference('qtype_numerical', 'unitsleft', $stringvalue, $desc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -67,7 +67,14 @@ $string['pluginname_link'] = 'question/type/numerical';
|
||||
$string['pluginnameadding'] = 'Adding a Numerical question';
|
||||
$string['pluginnameediting'] = 'Editing a Numerical question';
|
||||
$string['pluginnamesummary'] = 'Allows a numerical response, possibly with units, that is graded by comparing against various model answers, possibly with tolerances.';
|
||||
$string['privacy:metadata'] = 'The Numerical question type plugin does not store any personal data.';
|
||||
$string['privacy:metadata'] = 'Numerical question type plugin allows question authors to set default options as user preferences.';
|
||||
$string['privacy:preference:defaultmark'] = 'The default mark set for a given question.';
|
||||
$string['privacy:preference:penalty'] = 'The penalty for each incorrect try when questions are run using the \'Interactive with multiple tries\' or \'Adaptive mode\' behaviour.';
|
||||
$string['privacy:preference:unitrole'] = 'Whether the unit is essential, optional or not expected.';
|
||||
$string['privacy:preference:unitpenalty'] = 'What fraction (0-1) of the response grade or the question grade should apply?';
|
||||
$string['privacy:preference:unitgradingtypes'] = 'Whether unit penalty applies as a fraction (0-1) of the response grade or the question grade.';
|
||||
$string['privacy:preference:multichoicedisplay'] = 'Whether units are displayed as the text input element, multiple choice selection or a drop-down menu.';
|
||||
$string['privacy:preference:unitsleft'] = 'Whether unit displays on the left (eg. $, £) or on the right (eg. kg, km, cm).';
|
||||
$string['relative'] = 'Relative';
|
||||
$string['rightexample'] = 'on the right, for example 1.00cm or 1.00km';
|
||||
$string['selectunits'] = 'Select units';
|
||||
|
115
question/type/numerical/tests/privacy_provider_test.php
Normal file
115
question/type/numerical/tests/privacy_provider_test.php
Normal file
@ -0,0 +1,115 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Privacy provider tests.
|
||||
*
|
||||
* @package qtype_numerical
|
||||
* @copyright 2021 The Open university
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
use core_privacy\local\metadata\collection;
|
||||
use \core_privacy\local\request\user_preference_provider;
|
||||
use qtype_numerical\privacy\provider;
|
||||
use core_privacy\local\request\writer;
|
||||
use core_privacy\local\request\transform;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
* Privacy provider tests class.
|
||||
*
|
||||
* @package qtype_numerical
|
||||
* @copyright 2021 The Open university
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class qtype_numerical_privacy_provider_testcase extends \core_privacy\tests\provider_testcase {
|
||||
// Include the privacy helper which has assertions on it.
|
||||
|
||||
public function test_get_metadata() {
|
||||
$collection = new \core_privacy\local\metadata\collection('qtype_numerical');
|
||||
$actual = \qtype_numerical\privacy\provider::get_metadata($collection);
|
||||
$this->assertEquals($collection, $actual);
|
||||
}
|
||||
|
||||
public function test_export_user_preferences_no_pref() {
|
||||
$this->resetAfterTest();
|
||||
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
provider::export_user_preferences($user->id);
|
||||
$writer = writer::with_context(\context_system::instance());
|
||||
$this->assertFalse($writer->has_any_data());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the export_user_preferences given different inputs
|
||||
* @dataProvider user_preference_provider
|
||||
|
||||
* @param string $name The name of the user preference to get/set
|
||||
* @param string $value The value stored in the database
|
||||
* @param string $expected The expected transformed value
|
||||
*/
|
||||
public function test_export_user_preferences($name, $value, $expected) {
|
||||
$this->resetAfterTest();
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
set_user_preference("qtype_numerical_$name", $value, $user);
|
||||
provider::export_user_preferences($user->id);
|
||||
$writer = writer::with_context(\context_system::instance());
|
||||
$this->assertTrue($writer->has_any_data());
|
||||
$preferences = $writer->get_user_preferences('qtype_numerical');
|
||||
foreach ($preferences as $key => $pref) {
|
||||
$preference = get_user_preferences("qtype_numerical_{$key}", null, $user->id);
|
||||
if ($preference === null) {
|
||||
continue;
|
||||
}
|
||||
$desc = get_string("privacy:preference:{$key}", 'qtype_numerical');
|
||||
$this->assertEquals($expected, $pref->value);
|
||||
$this->assertEquals($desc, $pref->description);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an array of valid user preferences for the multiple choice question type.
|
||||
*
|
||||
* @return array Array of valid user preferences.
|
||||
*/
|
||||
public function user_preference_provider() {
|
||||
return [
|
||||
'default mark 1.5' => ['defaultmark', 1.5, 1.5],
|
||||
'penalty 20%' => ['penalty', 0.2000000, '20%'],
|
||||
'unitrole only numerical' => ['unitrole', qtype_numerical::UNITNONE,
|
||||
get_string('onlynumerical', 'qtype_numerical')],
|
||||
'unitrole many numerical' => ['unitrole', qtype_numerical::UNITOPTIONAL,
|
||||
get_string('manynumerical', 'qtype_numerical')],
|
||||
'unitrole unit graded' => ['unitrole', qtype_numerical::UNITGRADED,
|
||||
get_string('unitgraded', 'qtype_numerical')],
|
||||
'unit penalty 0' => ['unitpenalty', 0.01, 0.01],
|
||||
'unit grading types response grade' => ['unitgradingtypes', qtype_numerical::UNITGRADEDOUTOFMARK,
|
||||
get_string('decfractionofresponsegrade', 'qtype_numerical')],
|
||||
'unit grading types question grade' => ['unitgradingtypes', qtype_numerical::UNITGRADEDOUTOFMAX,
|
||||
get_string('decfractionofquestiongrade', 'qtype_numerical')],
|
||||
'multichoice display editable unit text' => ['multichoicedisplay', qtype_numerical::UNITINPUT,
|
||||
get_string('editableunittext', 'qtype_numerical')],
|
||||
'multichoice display radio buttons' => ['multichoicedisplay', qtype_numerical::UNITRADIO,
|
||||
get_string('unitchoice', 'qtype_numerical')],
|
||||
'multichoice display select menu' => ['multichoicedisplay', qtype_numerical::UNITSELECT,
|
||||
get_string('unitselect', 'qtype_numerical')],
|
||||
'unitsleft left example' => ['unitsleft', '1', get_string('leftexample', 'qtype_numerical')],
|
||||
'unitsleft left example' => ['unitsleft', '0', get_string('rightexample', 'qtype_numerical')]
|
||||
];
|
||||
}
|
||||
}
|
@ -24,23 +24,65 @@
|
||||
|
||||
namespace qtype_shortanswer\privacy;
|
||||
|
||||
use core_privacy\local\metadata\collection;
|
||||
use core_privacy\local\request\transform;
|
||||
use core_privacy\local\request\writer;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
* Privacy Subsystem for qtype_shortanswer implementing null_provider.
|
||||
* Privacy Subsystem for qtype_shortanswer implementing user_preference_provider.
|
||||
*
|
||||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class provider implements \core_privacy\local\metadata\null_provider {
|
||||
class provider implements
|
||||
// This component has data.
|
||||
// We need to return default options that have been set a user preferences.
|
||||
\core_privacy\local\metadata\provider,
|
||||
\core_privacy\local\request\user_preference_provider
|
||||
{
|
||||
|
||||
/**
|
||||
* Get the language string identifier with the component's language
|
||||
* file to explain why this plugin stores no data.
|
||||
* Returns meta data about this system.
|
||||
*
|
||||
* @return string
|
||||
* @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_reason() : string {
|
||||
return 'privacy:metadata';
|
||||
public static function get_metadata(collection $collection) : collection {
|
||||
$collection->add_user_preference('qtype_shortanswer_defaultmark', 'privacy:preference:defaultmark');
|
||||
$collection->add_user_preference('qtype_shortanswer_penalty', 'privacy:preference:penalty');
|
||||
$collection->add_user_preference('qtype_shortanswer_usecase', 'privacy:preference:usecase');
|
||||
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('qtype_shortanswer_defaultmark', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:defaultmark', 'qtype_shortanswer');
|
||||
writer::export_user_preference('qtype_shortanswer', 'defaultmark', $preference, $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_shortanswer_penalty', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:penalty', 'qtype_shortanswer');
|
||||
writer::export_user_preference('qtype_shortanswer', 'penalty', transform::percentage($preference), $desc);
|
||||
}
|
||||
|
||||
$preference = get_user_preferences('qtype_shortanswer_usecase', null, $userid);
|
||||
if (null !== $preference) {
|
||||
$desc = get_string('privacy:preference:usecase', 'qtype_shortanswer');
|
||||
if ($preference) {
|
||||
$strvalue = get_string('caseyes', 'qtype_shortanswer');
|
||||
} else {
|
||||
$strvalue = get_string('caseno', 'qtype_shortanswer');
|
||||
}
|
||||
writer::export_user_preference('qtype_shortanswer', 'shuffleanswers', $strvalue, $desc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -41,4 +41,7 @@ $string['pluginname_link'] = 'question/type/shortanswer';
|
||||
$string['pluginnameadding'] = 'Adding a short answer question';
|
||||
$string['pluginnameediting'] = 'Editing a Short answer question';
|
||||
$string['pluginnamesummary'] = 'Allows a response of one or a few words that is graded by comparing against various model answers, which may contain wildcards.';
|
||||
$string['privacy:metadata'] = 'The Short answer question type plugin does not store any personal data.';
|
||||
$string['privacy:metadata'] = 'Short answer question type plugin allows question authors to set default options as user preferences.';
|
||||
$string['privacy:preference:defaultmark'] = 'The default mark set for a given question.';
|
||||
$string['privacy:preference:penalty'] = 'The penalty for each incorrect try when questions are run using the \'Interactive with multiple tries\' or \'Adaptive mode\' behaviour.';
|
||||
$string['privacy:preference:usecase'] = 'Whether the answers should be case sensitive.';
|
||||
|
101
question/type/shortanswer/tests/privacy_provider_test.php
Normal file
101
question/type/shortanswer/tests/privacy_provider_test.php
Normal file
@ -0,0 +1,101 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Privacy provider tests.
|
||||
*
|
||||
* @package qtype_shortanswer
|
||||
* @copyright 2021 The Open university
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
use core_privacy\local\metadata\collection;
|
||||
use \core_privacy\local\request\user_preference_provider;
|
||||
use qtype_shortanswer\privacy\provider;
|
||||
use core_privacy\local\request\writer;
|
||||
use core_privacy\local\request\transform;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
require_once($CFG->dirroot . '/question/type/shortanswer/classes/privacy/provider.php');
|
||||
|
||||
/**
|
||||
* Privacy provider tests class.
|
||||
*
|
||||
* @package qtype_shortanswer
|
||||
* @copyright 2021 The Open university
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class qtype_shortanswer_privacy_provider_testcase extends \core_privacy\tests\provider_testcase {
|
||||
// Include the privacy helper which has assertions on it.
|
||||
|
||||
public function test_get_metadata() {
|
||||
$collection = new \core_privacy\local\metadata\collection('qtype_shortanswer');
|
||||
$actual = \qtype_shortanswer\privacy\provider::get_metadata($collection);
|
||||
$this->assertEquals($collection, $actual);
|
||||
}
|
||||
|
||||
public function test_export_user_preferences_no_pref() {
|
||||
$this->resetAfterTest();
|
||||
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
provider::export_user_preferences($user->id);
|
||||
$writer = writer::with_context(\context_system::instance());
|
||||
$this->assertFalse($writer->has_any_data());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the export_user_preferences given different inputs
|
||||
* @dataProvider user_preference_provider
|
||||
|
||||
* @param string $name The name of the user preference to get/set
|
||||
* @param string $value The value stored in the database
|
||||
* @param string $expected The expected transformed value
|
||||
*/
|
||||
public function test_export_user_preferences($name, $value, $expected) {
|
||||
$this->resetAfterTest();
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
set_user_preference("qtype_shortanswer_$name", $value, $user);
|
||||
provider::export_user_preferences($user->id);
|
||||
$writer = writer::with_context(\context_system::instance());
|
||||
$this->assertTrue($writer->has_any_data());
|
||||
$preferences = $writer->get_user_preferences('qtype_shortanswer');
|
||||
foreach ($preferences as $key => $pref) {
|
||||
$preference = get_user_preferences("qtype_shortanswer_{$key}", null, $user->id);
|
||||
if ($preference === null) {
|
||||
continue;
|
||||
}
|
||||
$desc = get_string("privacy:preference:{$key}", 'qtype_shortanswer');
|
||||
$this->assertEquals($expected, $pref->value);
|
||||
$this->assertEquals($desc, $pref->description);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an array of valid user preferences for the multiple choice question type.
|
||||
*
|
||||
* @return array Array of valid user preferences.
|
||||
*/
|
||||
public function user_preference_provider() {
|
||||
return [
|
||||
'default mark 2' => ['defaultmark', 2, 2],
|
||||
'penalty 33.33333%' => ['penalty', 0.3333333, '33.33333%'],
|
||||
'usecase yes' => ['usecase', 1, 'Yes, case must match'],
|
||||
'usecase no' => ['usecase', 0, 'No, case is unimportant']
|
||||
];
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user