MDL-55266 user: New WS core_user_get_user_preferences

This commit is contained in:
Juan Leyva
2016-07-28 12:08:58 +02:00
parent d1a3ea62ef
commit 45fec98358
4 changed files with 165 additions and 1 deletions
+8
View File
@@ -871,6 +871,14 @@ $functions = array(
'capabilities' => 'moodle/user:viewdetails',
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
),
'core_user_get_user_preferences' => array(
'classname' => 'core_user_external',
'methodname' => 'get_user_preferences',
'classpath' => 'user/externallib.php',
'description' => 'Return user preferences.',
'type' => 'read',
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
),
// Competencies functions.
'core_competency_create_competency_framework' => array(
+93
View File
@@ -1363,4 +1363,97 @@ class core_user_external extends external_api {
);
}
/**
* Returns description of method parameters
*
* @return external_function_parameters
* @since Moodle 3.2
*/
public static function get_user_preferences_parameters() {
return new external_function_parameters(
array(
'name' => new external_value(PARAM_RAW, 'preference name, empty for all', VALUE_DEFAULT, ''),
'userid' => new external_value(PARAM_INT, 'id of the user, default to current user', VALUE_DEFAULT, 0)
)
);
}
/**
* Return user preferences.
*
* @param string $name preference name, empty for all
* @param int $userid id of the user, 0 for current user
* @return array of warnings and preferences
* @since Moodle 3.2
* @throws moodle_exception
*/
public static function get_user_preferences($name = '', $userid = 0) {
global $USER;
$params = self::validate_parameters(self::get_user_preferences_parameters(),
array(
'name' => $name,
'userid' => $userid
));
$preferences = array();
$warnings = array();
$context = context_system::instance();
self::validate_context($context);
if (empty($params['name'])) {
$name = null;
}
if (empty($params['userid'])) {
$user = null;
} else {
$user = core_user::get_user($params['userid'], '*', MUST_EXIST);
core_user::require_active_user($user);
if ($user->id != $USER->id) {
// Only admins can retrieve other users preferences.
require_capability('moodle/site:config', $context);
}
}
$userpreferences = get_user_preferences($name, null, $user);
// Check if we received just one preference.
if (!is_array($userpreferences)) {
$userpreferences = array($name => $userpreferences);
}
foreach ($userpreferences as $name => $value) {
$preferences[] = array(
'name' => $name,
'value' => $value,
);
}
$result = array();
$result['preferences'] = $preferences;
$result['warnings'] = $warnings;
return $result;
}
/**
* Returns description of method result value
*
* @return external_description
* @since Moodle 3.2
*/
public static function get_user_preferences_returns() {
return new external_single_structure(
array(
'preferences' => new external_multiple_structure(
new external_single_structure(
array(
'name' => new external_value(PARAM_RAW, 'The name of the preference'),
'value' => new external_value(PARAM_RAW, 'The value of the preference'),
)
),
'User custom fields (also known as user profile fields)'
),
'warnings' => new external_warnings()
)
);
}
}
+63
View File
@@ -791,4 +791,67 @@ class core_user_externallib_testcase extends externallib_advanced_testcase {
$this->assertTrue($result['removed']);
}
/**
* Test get_user_preferences
*/
public function test_get_user_preferences() {
$this->resetAfterTest(true);
$user = self::getDataGenerator()->create_user();
set_user_preference('calendar_maxevents', 1, $user);
set_user_preference('some_random_text', 'text', $user);
$this->setUser($user);
$result = core_user_external::get_user_preferences();
$result = external_api::clean_returnvalue(core_user_external::get_user_preferences_returns(), $result);
$this->assertCount(0, $result['warnings']);
// Expect 3, _lastloaded is always returned.
$this->assertCount(3, $result['preferences']);
foreach ($result['preferences'] as $pref) {
if ($pref['name'] === '_lastloaded') {
continue;
}
// Check we receive the expected preferences.
$this->assertEquals(get_user_preferences($pref['name']), $pref['value']);
}
// Retrieve just one preference.
$result = core_user_external::get_user_preferences('some_random_text');
$result = external_api::clean_returnvalue(core_user_external::get_user_preferences_returns(), $result);
$this->assertCount(0, $result['warnings']);
$this->assertCount(1, $result['preferences']);
$this->assertEquals('text', $result['preferences'][0]['value']);
// Retrieve non-existent preference.
$result = core_user_external::get_user_preferences('non_existent');
$result = external_api::clean_returnvalue(core_user_external::get_user_preferences_returns(), $result);
$this->assertCount(0, $result['warnings']);
$this->assertCount(1, $result['preferences']);
$this->assertEquals(null, $result['preferences'][0]['value']);
// Check that as admin we can retrieve all the preferences for any user.
$this->setAdminUser();
$result = core_user_external::get_user_preferences('', $user->id);
$result = external_api::clean_returnvalue(core_user_external::get_user_preferences_returns(), $result);
$this->assertCount(0, $result['warnings']);
$this->assertCount(3, $result['preferences']);
foreach ($result['preferences'] as $pref) {
if ($pref['name'] === '_lastloaded') {
continue;
}
// Check we receive the expected preferences.
$this->assertEquals(get_user_preferences($pref['name'], null, $user), $pref['value']);
}
// Check that as a non admin user we cannot retrieve other users preferences.
$anotheruser = self::getDataGenerator()->create_user();
$this->setUser($anotheruser);
$this->setExpectedException('required_capability_exception');
$result = core_user_external::get_user_preferences('', $user->id);
}
}
+1 -1
View File
@@ -29,7 +29,7 @@
defined('MOODLE_INTERNAL') || die();
$version = 2016072800.00; // YYYYMMDD = weekly release date of this DEV branch.
$version = 2016072800.01; // YYYYMMDD = weekly release date of this DEV branch.
// RR = release increments - 00 in DEV branches.
// .XX = incremental changes.