Merge branch 'MDL-77726-master' of https://github.com/jleyva/moodle

This commit is contained in:
Sara Arjona 2023-03-30 16:56:56 +02:00
commit 09171a3c3a
5 changed files with 60 additions and 20 deletions

View File

@ -1149,7 +1149,9 @@ class core_user_external extends \core_external\external_api {
new external_single_structure(
array(
'type' => new external_value(PARAM_ALPHANUMEXT, 'The type of the custom field - text field, checkbox...'),
'value' => new external_value(PARAM_RAW, 'The value of the custom field'),
'value' => new external_value(PARAM_RAW, 'The value of the custom field (as stored in the database)'),
'displayvalue' => new external_value(PARAM_RAW, 'The value of the custom field for display',
VALUE_OPTIONAL),
'name' => new external_value(PARAM_RAW, 'The name of the custom field'),
'shortname' => new external_value(PARAM_RAW, 'The shortname of the custom field - to be able to build the field class in the code'),
)

View File

@ -361,19 +361,13 @@ function user_get_user_details($user, $course = null, array $userfields = array(
foreach ($fields as $formfield) {
if ($formfield->is_visible() and !$formfield->is_empty()) {
// TODO: Part of MDL-50728, this conditional coding must be moved to
// proper profile fields API so they are self-contained.
// We only use display_data in fields that require text formatting.
if ($formfield->field->datatype == 'text' or $formfield->field->datatype == 'textarea') {
$fieldvalue = $formfield->display_data();
} else {
// Cases: datetime, checkbox and menu.
$fieldvalue = $formfield->data;
}
$userdetails['customfields'][] =
array('name' => $formfield->field->name, 'value' => $fieldvalue,
'type' => $formfield->field->datatype, 'shortname' => $formfield->field->shortname);
$userdetails['customfields'][] = [
'name' => $formfield->field->name,
'value' => $formfield->data,
'displayvalue' => $formfield->display_data(),
'type' => $formfield->field->datatype,
'shortname' => $formfield->field->shortname
];
}
}
}

View File

@ -168,6 +168,24 @@ class profile_field_menu extends profile_field_base {
public function get_field_properties() {
return array(PARAM_TEXT, NULL_NOT_ALLOWED);
}
/**
* Return the field settings suitable to be exported via an external function.
*
* @return array all the settings
*/
public function get_field_config_for_external() {
if (isset($this->field->param1) && !empty($this->options)) {
// Remove "Choose" option to make it consisten with the rest of the data.
if (!empty($this->field->required)) {
unset($this->options['']);
}
$this->field->param2 = implode("\n", array_values($this->options));
}
return (array) $this->field;
}
}

View File

@ -184,7 +184,20 @@ class externallib_test extends externallib_advanced_testcase {
$this->resetAfterTest(true);
$course = self::getDataGenerator()->create_course();
$generator = self::getDataGenerator();
// Create complex user profile field supporting multi-lang.
filter_set_global_state('multilang', TEXTFILTER_ON);
$statuses = 'UE\nSE\n<span lang="en" class="multilang">Other</span><span lang="es" class="multilang">Otro</span>';
$generator->create_custom_profile_field(
[
'datatype' => 'menu',
'shortname' => 'employmentstatus', 'name' => 'Employment status',
'param1' => $statuses
]
);
$course = $generator->create_course();
$user1 = array(
'username' => 'usernametest1',
'idnumber' => 'idnumbertest1',
@ -200,14 +213,16 @@ class externallib_test extends externallib_advanced_testcase {
'descriptionformat' => FORMAT_MOODLE,
'city' => 'Perth',
'country' => 'AU',
'profile_field_jobposition' => 'Manager',
'profile_field_employmentstatus' => explode('\n', $statuses)[2],
);
$user1 = self::getDataGenerator()->create_user($user1);
$user1 = $generator->create_user($user1);
if (!empty($CFG->usetags)) {
require_once($CFG->dirroot . '/user/editlib.php');
$user1->interests = array('Cinema', 'Tennis', 'Dance', 'Guitar', 'Cooking');
useredit_update_interests($user1, $user1->interests);
}
$user2 = self::getDataGenerator()->create_user(
$user2 = $generator->create_user(
array('username' => 'usernametest2', 'idnumber' => 'idnumbertest2'));
$generatedusers = array();
@ -218,9 +233,9 @@ class externallib_test extends externallib_advanced_testcase {
$roleid = $this->assignUserCapability('moodle/user:viewdetails', $context->id);
// Enrol the users in the course.
$this->getDataGenerator()->enrol_user($user1->id, $course->id, $roleid, 'manual');
$this->getDataGenerator()->enrol_user($user2->id, $course->id, $roleid, 'manual');
$this->getDataGenerator()->enrol_user($USER->id, $course->id, $roleid, 'manual');
$generator->enrol_user($user1->id, $course->id, $roleid, 'manual');
$generator->enrol_user($user2->id, $course->id, $roleid, 'manual');
$generator->enrol_user($USER->id, $course->id, $roleid, 'manual');
// call as admin and receive all possible fields.
$this->setAdminUser();
@ -290,6 +305,13 @@ class externallib_test extends externallib_advanced_testcase {
// Default language and no theme were used for the user.
$this->assertEquals($CFG->lang, $returneduser['lang']);
$this->assertEmpty($returneduser['theme']);
if ($returneduser['id'] == $user1->id) {
$this->assertCount(1, $returneduser['customfields']);
$dbvalue = explode('\n', $statuses)[2];
$this->assertEquals($dbvalue, $returneduser['customfields'][0]['value']);
$this->assertEquals('Other', $returneduser['customfields'][0]['displayvalue']);
}
}
}

View File

@ -15,6 +15,10 @@ This files describes API changes for code that uses the user API.
* New `profile_get_user_field` method for returning profile field instance of given type
* The `profile_field_base::is_visible` method now accepts an optional `$context` argument
* External function core_user_external::add_user_private_files() now returns moodle_exception when the user quota is exceeded
* The `customfields` structure used for returning user profile fields information has been updated to:
* Return in the field `value` the value of the custom field (as stored in the database)
* Return in the field `displayvalue` the value of the custom field for display
External systems displaying user information should always use `displayvalue`.
=== 4.1 ===