diff --git a/admin/roles/lib.php b/admin/roles/lib.php
index d57233ff1a2..212cd211c6f 100644
--- a/admin/roles/lib.php
+++ b/admin/roles/lib.php
@@ -256,19 +256,14 @@ class permissions_table extends capability_table_base {
* @param string $contextname print_context_name($context) - to save recomputing.
*/
public function __construct($context, $contextname, $allowoverrides, $allowsafeoverrides, $overridableroles) {
- global $DB;
-
parent::__construct($context, 'permissions');
$this->contextname = $contextname;
$this->allowoverrides = $allowoverrides;
$this->allowsafeoverrides = $allowsafeoverrides;
$this->overridableroles = $overridableroles;
- $roles = $DB->get_records('role', null, 'sortorder DESC');
- foreach ($roles as $roleid=>$role) {
- $roles[$roleid] = $role->name;
- }
- $this->roles = role_fix_names($roles, $context);
+ $roles = get_all_roles($context);
+ $this->roles = role_fix_names(array_reverse($roles, true), $context, ROLENAME_ALIAS, true);
}
@@ -593,18 +588,6 @@ class define_role_table_advanced extends capability_table_with_risks {
global $DB;
$this->errors = array();
- // Role name.
- $name = optional_param('name', null, PARAM_MULTILANG);
- if (!is_null($name)) {
- $this->role->name = $name;
- if (html_is_blank($this->role->name)) {
- $this->errors['name'] = get_string('errorbadrolename', 'role');
- }
- }
- if ($DB->record_exists_select('role', 'name = ? and id <> ?', array($this->role->name, $this->roleid))) {
- $this->errors['name'] = get_string('errorexistsrolename', 'role');
- }
-
// Role short name. We clean this in a special way. We want to end up
// with only lowercase safe ASCII characters.
$shortname = optional_param('shortname', null, PARAM_RAW);
@@ -620,6 +603,20 @@ class define_role_table_advanced extends capability_table_with_risks {
$this->errors['shortname'] = get_string('errorexistsroleshortname', 'role');
}
+ // Role name.
+ $name = optional_param('name', null, PARAM_MULTILANG);
+ if (!is_null($name)) {
+ $this->role->name = $name;
+ // Hack: short names of standard roles are equal to archetypes, empty name means localised via lang packs.
+ $archetypes = get_role_archetypes();
+ if (!isset($archetypes[$shortname]) and html_is_blank($this->role->name)) {
+ $this->errors['name'] = get_string('errorbadrolename', 'role');
+ }
+ }
+ if ($this->role->name !== '' and $DB->record_exists_select('role', 'name = ? and id <> ?', array($this->role->name, $this->roleid))) {
+ $this->errors['name'] = get_string('errorexistsrolename', 'role');
+ }
+
// Description.
$description = optional_param('description', null, PARAM_RAW);
if (!is_null($description)) {
@@ -779,9 +776,9 @@ class define_role_table_advanced extends capability_table_with_risks {
global $OUTPUT;
// Extra fields at the top of the page.
echo '
';
- $this->print_field('name', get_string('rolefullname', 'role'), $this->get_name_field('name'));
- $this->print_field('shortname', get_string('roleshortname', 'role'), $this->get_shortname_field('shortname'));
- $this->print_field('edit-description', get_string('description'), $this->get_description_field('description'));
+ $this->print_field('shortname', get_string('roleshortname', 'role').' '.$OUTPUT->help_icon('roleshortname', 'role'), $this->get_shortname_field('shortname'));
+ $this->print_field('name', get_string('customrolename', 'role').' '.$OUTPUT->help_icon('customrolename', 'role'), $this->get_name_field('name'));
+ $this->print_field('edit-description', get_string('customroledescription', 'role').' '.$OUTPUT->help_icon('customroledescription', 'role'), $this->get_description_field('description'));
$this->print_field('menuarchetype', get_string('archetype', 'role').' '.$OUTPUT->help_icon('archetype', 'role'), $this->get_archetype_field('archetype'));
$this->print_field('', get_string('maybeassignedin', 'role'), $this->get_assignable_levels_control());
echo "
";
@@ -862,7 +859,7 @@ class view_role_definition_table extends define_role_table_advanced {
}
protected function get_name_field($id) {
- return strip_tags(format_string($this->role->name));
+ return role_get_name($this->role);
}
protected function get_shortname_field($id) {
@@ -870,7 +867,7 @@ class view_role_definition_table extends define_role_table_advanced {
}
protected function get_description_field($id) {
- return format_text($this->role->description, FORMAT_HTML);
+ return role_get_description($this->role);
}
protected function get_archetype_field($id) {
@@ -1273,8 +1270,7 @@ abstract class role_allow_role_page {
*/
protected function load_required_roles() {
/// Get all roles
- $this->roles = get_all_roles();
- role_fix_names($this->roles, get_context_instance(CONTEXT_SYSTEM), ROLENAME_ORIGINAL);
+ $this->roles = role_fix_names(get_all_roles(), get_context_instance(CONTEXT_SYSTEM), ROLENAME_ORIGINAL);
}
/**
diff --git a/admin/roles/manage.php b/admin/roles/manage.php
index 411abc8b466..85b1c0b240b 100644
--- a/admin/roles/manage.php
+++ b/admin/roles/manage.php
@@ -53,8 +53,7 @@
admin_externalpage_setup('defineroles');
/// Get some basic data we are going to need.
- $roles = get_all_roles();
- role_fix_names($roles, $systemcontext, ROLENAME_ORIGINAL);
+ $roles = role_fix_names(get_all_roles(), $systemcontext, ROLENAME_ORIGINAL);
$undeletableroles = array();
$undeletableroles[$CFG->notloggedinroleid] = 1;
@@ -214,7 +213,7 @@
/// Basic data.
$row = array(
'' . $role->localname . '',
- format_text($role->description, FORMAT_HTML),
+ role_get_description($role),
s($role->shortname),
'',
);
diff --git a/admin/roles/usersroles.php b/admin/roles/usersroles.php
index 968f0254814..11b2c28caf9 100644
--- a/admin/roles/usersroles.php
+++ b/admin/roles/usersroles.php
@@ -68,14 +68,11 @@ if ($course->id != $SITE->id || $userid != $USER->id) {
/// Now get the role assignments for this user.
$sql = "SELECT
ra.id, ra.userid, ra.contextid, ra.roleid, ra.component, ra.itemid,
- c.path,
- r.name AS rolename,
- COALESCE(rn.name, r.name) AS localname
+ c.path
FROM
{role_assignments} ra
JOIN {context} c ON ra.contextid = c.id
JOIN {role} r ON ra.roleid = r.id
- LEFT JOIN {role_names} rn ON rn.roleid = ra.roleid AND rn.contextid = ra.contextid
WHERE
ra.userid = ?
"./*AND ra.active = 1*/"
@@ -83,6 +80,8 @@ $sql = "SELECT
contextlevel DESC, contextid ASC, r.sortorder ASC";
$roleassignments = $DB->get_records_sql($sql, array($user->id));
+$allroles = role_fix_names(get_all_roles());
+
/// In order to display a nice tree of contexts, we need to get all the
/// ancestors of all the contexts in the query we just did.
$requiredcontexts = array();
@@ -142,14 +141,14 @@ echo $OUTPUT->box_start('generalbox boxaligncenter boxwidthnormal');
if (!$roleassignments) {
echo '', get_string('noroleassignments', 'role'), '
';
} else {
- print_report_tree($systemcontext->id, $contexts, $systemcontext, $fullname);
+ print_report_tree($systemcontext->id, $contexts, $systemcontext, $fullname, $allroles);
}
/// End of page.
echo $OUTPUT->box_end();
echo $OUTPUT->footer();
-function print_report_tree($contextid, $contexts, $systemcontext, $fullname) {
+function print_report_tree($contextid, $contexts, $systemcontext, $fullname, $allroles) {
global $CFG, $OUTPUT;
// Only compute lang strings, etc once.
@@ -170,15 +169,13 @@ function print_report_tree($contextid, $contexts, $systemcontext, $fullname) {
// If there are any role assignments here, print them.
foreach ($contexts[$contextid]->roleassignments as $ra) {
+ $role = $allroles[$ra->roleid];
+
$value = $ra->contextid . ',' . $ra->roleid;
$inputid = 'unassign' . $value;
echo '';
- if ($ra->rolename == $ra->localname) {
- echo strip_tags(format_string($ra->localname));
- } else {
- echo strip_tags(format_string($ra->localname . ' (' . $ra->rolename . ')'));
- }
+ echo $role->localname;
if (has_capability('moodle/role:assign', $context)) {
$raurl = $assignurl . '?contextid=' . $ra->contextid . '&roleid=' .
$ra->roleid . '&removeselect[]=' . $ra->userid;
@@ -210,7 +207,7 @@ function print_report_tree($contextid, $contexts, $systemcontext, $fullname) {
echo '
';
foreach ($contexts[$contextid]->children as $childcontextid) {
echo '- ';
- print_report_tree($childcontextid, $contexts, $systemcontext, $fullname);
+ print_report_tree($childcontextid, $contexts, $systemcontext, $fullname, $allroles);
echo '
';
}
echo '
';
diff --git a/admin/settings/frontpage.php b/admin/settings/frontpage.php
index c380e430281..fd5fafa6f32 100644
--- a/admin/settings/frontpage.php
+++ b/admin/settings/frontpage.php
@@ -54,9 +54,10 @@ if (!during_initial_install()) { //do not use during installation
// front page default role
$options = array(0=>new lang_string('none')); // roles to choose from
$defaultfrontpageroleid = 0;
- foreach (get_all_roles() as $role) {
+ $roles = role_fix_names(get_all_roles(), null, ROLENAME_ORIGINALANDSHORT);
+ foreach ($roles as $role) {
if (empty($role->archetype) or $role->archetype === 'guest' or $role->archetype === 'frontpage' or $role->archetype === 'student') {
- $options[$role->id] = strip_tags(format_string($role->name)) . ' ('. $role->shortname . ')';
+ $options[$role->id] = $role->localname;
if ($role->archetype === 'frontpage') {
$defaultfrontpageroleid = $role->id;
}
diff --git a/admin/settings/users.php b/admin/settings/users.php
index f317102050b..fa5968c5474 100644
--- a/admin/settings/users.php
+++ b/admin/settings/users.php
@@ -45,8 +45,9 @@ if ($hassiteconfig
$defaultuserid = null;
$defaultguestid = null;
- foreach (get_all_roles() as $role) {
- $rolename = strip_tags(format_string($role->name)) . ' ('. $role->shortname . ')';
+ $roles = role_fix_names(get_all_roles(), null, ROLENAME_ORIGINALANDSHORT);
+ foreach ($roles as $role) {
+ $rolename = $role->localname;
switch ($role->archetype) {
case 'manager':
$creatornewroles[$role->id] = $rolename;
diff --git a/admin/tool/capability/index.php b/admin/tool/capability/index.php
index 454caa0f557..7a0f2d64a6e 100644
--- a/admin/tool/capability/index.php
+++ b/admin/tool/capability/index.php
@@ -38,7 +38,7 @@ $roleids = optional_param_array('roles', array('0'), PARAM_INTEGER);
// Clean the passed in list of role ids. If 'All' selected as an option, or
// if none were selected, do all roles.
-$allroles = get_all_roles();
+$allroles = role_fix_names(get_all_roles());
$cleanedroleids = array();
foreach ($roleids as $roleid) {
if ($roleid == 0) {
@@ -73,7 +73,7 @@ foreach ($allcapabilities as $cap) {
// Prepare the list of roles to choose from
$rolechoices = array('0' => get_string('all'));
foreach ($allroles as $role) {
- $rolechoices[$role->id] = $role->name;
+ $rolechoices[$role->id] = $role->localname;
}
if (count($cleanedroleids) == count($allroles)) {
// Select 'All', rather than each role individually.
@@ -162,7 +162,7 @@ if ($capability) {
if (count($cleanedroleids) != count($allroles)) {
$rolenames = array();
foreach ($cleanedroleids as $roleid) {
- $rolenames[] = $allroles[$roleid]->name;
+ $rolenames[] = $allroles[$roleid]->localname;
}
echo '', get_string('forroles', 'tool_capability', implode(', ', $rolenames)), '
';
}
@@ -207,7 +207,7 @@ function print_report_tree($contextid, $contexts, $allroles) {
foreach ($allroles as $role) {
if (isset($contexts[$contextid]->rolecapabilities[$role->id])) {
$permission = $contexts[$contextid]->rolecapabilities[$role->id];
- echo '', $role->name,
+ echo ' |
---|
', $role->localname,
' | ' . $strpermissions[$permission] . ' |
';
$rowcounter++;
}
diff --git a/admin/tool/unsuproles/index.php b/admin/tool/unsuproles/index.php
index e1c6cf09a18..0018ec1bdd7 100644
--- a/admin/tool/unsuproles/index.php
+++ b/admin/tool/unsuproles/index.php
@@ -97,7 +97,7 @@ if (!$problems) {
$data = array();
foreach ($problems as $problem) {
$levelname = get_contextlevel_name($problem->contextlevel);
- $rolename = format_string($roles[$problem->roleid]->name);
+ $rolename = role_get_name($roles[$problem->roleid]);
//TODO: show list of users if count low
$count = $problem->racount;
$edit = array();
diff --git a/auth/upgrade.txt b/auth/upgrade.txt
index 328307e0272..f25d0eab87e 100644
--- a/auth/upgrade.txt
+++ b/auth/upgrade.txt
@@ -2,6 +2,13 @@ This files describes API changes in /auth/* - plugins,
information provided here is intended especially for developers.
+=== 2.4 ===
+
+required changes in code:
+* use role_get_name() or role_fix_names() if you need any role names, using role.name
+ directly from database is not correct any more
+
+
=== 2.2 ===
required changes in code:
diff --git a/backup/util/dbops/restore_dbops.class.php b/backup/util/dbops/restore_dbops.class.php
index 2e73e8fcee1..1e7cbbb773b 100644
--- a/backup/util/dbops/restore_dbops.class.php
+++ b/backup/util/dbops/restore_dbops.class.php
@@ -347,7 +347,6 @@ abstract class restore_dbops {
// Gather various information about roles
$coursectx = get_context_instance(CONTEXT_COURSE, $courseid);
- $allroles = $DB->get_records('role');
$assignablerolesshortname = get_assignable_roles($coursectx, ROLENAME_SHORT, false, $userid);
// Note: under 1.9 we had one function restore_samerole() that performed one complete
diff --git a/course/edit.php b/course/edit.php
index fc42d0a8307..d8a08c8acb4 100644
--- a/course/edit.php
+++ b/course/edit.php
@@ -69,6 +69,12 @@ if (!empty($course)) {
$editoroptions['context'] = $coursecontext;
$course = file_prepare_standard_editor($course, 'summary', $editoroptions, $coursecontext, 'course', 'summary', 0);
+ // Inject current aliases
+ $aliases = $DB->get_records('role_names', array('contextid'=>$coursecontext->id));
+ foreach($aliases as $alias) {
+ $course->{'role_'.$alias->roleid} = $alias->name;
+ }
+
} else {
//editor should respect category context if course context is not set.
$editoroptions['context'] = $catcontext;
diff --git a/course/edit_form.php b/course/edit_form.php
index dd3d4bd3dae..1b7584981b5 100644
--- a/course/edit_form.php
+++ b/course/edit_form.php
@@ -268,15 +268,10 @@ class course_edit_form extends moodleform {
$mform->addHelpButton('rolerenaming', 'rolerenaming');
if ($roles = get_all_roles()) {
- if ($coursecontext) {
- $roles = role_fix_names($roles, $coursecontext, ROLENAME_ALIAS_RAW);
- }
+ $roles = role_fix_names($roles, null, ROLENAME_ORIGINAL);
$assignableroles = get_roles_for_contextlevels(CONTEXT_COURSE);
foreach ($roles as $role) {
- $mform->addElement('text', 'role_'.$role->id, get_string('yourwordforx', '', $role->name));
- if (isset($role->localname)) {
- $mform->setDefault('role_'.$role->id, $role->localname);
- }
+ $mform->addElement('text', 'role_'.$role->id, get_string('yourwordforx', '', $role->localname));
$mform->setType('role_'.$role->id, PARAM_TEXT);
if (!in_array($role->id, $assignableroles)) {
$mform->setAdvanced('role_'.$role->id);
diff --git a/course/info.php b/course/info.php
index 4da6eb3e0c6..dfdfde98b9f 100644
--- a/course/info.php
+++ b/course/info.php
@@ -59,12 +59,15 @@
if (!empty($CFG->coursecontact)) {
$coursecontactroles = explode(',', $CFG->coursecontact);
foreach ($coursecontactroles as $roleid) {
- $role = $DB->get_record('role', array('id'=>$roleid));
- $roleid = (int) $roleid;
if ($users = get_role_users($roleid, $context, true)) {
foreach ($users as $teacher) {
+ $role = new stdClass();
+ $role->id = $teacher->roleid;
+ $role->name = $teacher->rolename;
+ $role->shortname = $teacher->roleshortname;
+ $role->coursealias = $teacher->rolecoursealias;
$fullname = fullname($teacher, has_capability('moodle/site:viewfullnames', $context));
- $namesarray[] = format_string(role_get_name($role, $context)).': wwwroot.'/user/view.php?id='.
$teacher->id.'&course='.SITEID.'">'.$fullname.'';
}
}
diff --git a/course/lib.php b/course/lib.php
index baea8940600..50366876458 100644
--- a/course/lib.php
+++ b/course/lib.php
@@ -2530,32 +2530,26 @@ function print_course($course, $highlightterms = '') {
/// first find all roles that are supposed to be displayed
if (!empty($CFG->coursecontact)) {
$managerroles = explode(',', $CFG->coursecontact);
- $namesarray = array();
$rusers = array();
if (!isset($course->managers)) {
$rusers = get_role_users($managerroles, $context, true,
- 'ra.id AS raid, u.id, u.username, u.firstname, u.lastname,
- r.name AS rolename, r.sortorder, r.id AS roleid',
+ 'ra.id AS raid, u.id, u.username, u.firstname, u.lastname, rn.name AS rolecoursealias,
+ r.name AS rolename, r.sortorder, r.id AS roleid, r.shortname AS roleshortname',
'r.sortorder ASC, u.lastname ASC');
} else {
// use the managers array if we have it for perf reasosn
// populate the datastructure like output of get_role_users();
foreach ($course->managers as $manager) {
- $u = new stdClass();
- $u = $manager->user;
- $u->roleid = $manager->roleid;
- $u->rolename = $manager->rolename;
-
- $rusers[] = $u;
+ $user = clone($manager->user);
+ $user->roleid = $manager->roleid;
+ $user->rolename = $manager->rolename;
+ $user->roleshortname = $manager->roleshortname;
+ $user->rolecoursealias = $manager->rolecoursealias;
+ $rusers[$user->id] = $user;
}
}
- /// Rename some of the role names if needed
- if (isset($context)) {
- $aliasnames = $DB->get_records('role_names', array('contextid'=>$context->id), '', 'roleid,contextid,name');
- }
-
$namesarray = array();
$canviewfullnames = has_capability('moodle/site:viewfullnames', $context);
foreach ($rusers as $ra) {
@@ -2564,12 +2558,15 @@ function print_course($course, $highlightterms = '') {
continue;
}
- if (isset($aliasnames[$ra->roleid])) {
- $ra->rolename = $aliasnames[$ra->roleid]->name;
- }
+ $role = new stdClass();
+ $role->id = $ra->roleid;
+ $role->name = $ra->rolename;
+ $role->shortname = $ra->roleshortname;
+ $role->coursealias = $ra->rolecoursealias;
+ $rolename = role_get_name($role, $context, ROLENAME_ALIAS);
$fullname = fullname($ra, $canviewfullnames);
- $namesarray[$ra->id] = format_string($ra->rolename).': '.
+ $namesarray[$ra->id] = $rolename.': '.
html_writer::link(new moodle_url('/user/view.php', array('id'=>$ra->id, 'course'=>SITEID)), $fullname);
}
diff --git a/enrol/flatfile/settings.php b/enrol/flatfile/settings.php
index 904e24e05b0..cce87869078 100644
--- a/enrol/flatfile/settings.php
+++ b/enrol/flatfile/settings.php
@@ -44,10 +44,10 @@ if ($ADMIN->fulltree) {
if (!during_initial_install()) {
$settings->add(new admin_setting_heading('enrol_flatfile_mapping', get_string('mapping', 'enrol_flatfile'), ''));
- $roles = $DB->get_records('role', null, '', 'id, name, shortname');
+ $roles = role_fix_names(get_all_roles());
- foreach ($roles as $id => $record) {
- $settings->add(new admin_setting_configtext('enrol_flatfile/map_'.$id, format_string($record->name), '', format_string($record->shortname)));
+ foreach ($roles as $id => $role) {
+ $settings->add(new admin_setting_configtext('enrol_flatfile/map_'.$id, $role->localname, '', $role->shortname));
}
}
}
diff --git a/enrol/ldap/settingslib.php b/enrol/ldap/settingslib.php
index 61397a6879e..f54b4a2afbf 100644
--- a/enrol/ldap/settingslib.php
+++ b/enrol/ldap/settingslib.php
@@ -89,13 +89,13 @@ class admin_setting_ldap_rolemapping extends admin_setting {
* @return mixed null if null, else an array
*/
public function get_setting() {
- $roles = get_all_roles();
+ $roles = role_fix_names(get_all_roles());
$result = array();
foreach ($roles as $role) {
$contexts = $this->config_read('contexts_role'.$role->id);
$memberattribute = $this->config_read('memberattribute_role'.$role->id);
$result[] = array('id' => $role->id,
- 'name' => $role->name,
+ 'name' => $role->localname,
'contexts' => $contexts,
'memberattribute' => $memberattribute);
}
diff --git a/enrol/locallib.php b/enrol/locallib.php
index f7d5030655d..a819ce9000f 100644
--- a/enrol/locallib.php
+++ b/enrol/locallib.php
@@ -450,7 +450,7 @@ class course_enrolment_manager {
*/
public function get_all_roles() {
if ($this->_roles === null) {
- $this->_roles = role_fix_names(get_all_roles(), $this->context);
+ $this->_roles = role_fix_names(get_all_roles($this->context), $this->context);
}
return $this->_roles;
}
diff --git a/enrol/meta/settings.php b/enrol/meta/settings.php
index c88ea264c93..afc0e2e53fd 100644
--- a/enrol/meta/settings.php
+++ b/enrol/meta/settings.php
@@ -31,11 +31,7 @@ if ($ADMIN->fulltree) {
$settings->add(new admin_setting_heading('enrol_meta_settings', '', get_string('pluginname_desc', 'enrol_meta')));
if (!during_initial_install()) {
- $allroles = array();
- foreach (get_all_roles() as $role) {
- $rolename = strip_tags(format_string($role->name)) . ' ('. $role->shortname . ')';
- $allroles[$role->id] = $rolename;
- }
+ $allroles = role_fix_names(get_all_roles(), null, ROLENAME_ORIGINALANDSHORT, true);
$settings->add(new admin_setting_configmultiselect('enrol_meta/nosyncroleids', get_string('nosyncroleids', 'enrol_meta'), get_string('nosyncroleids_desc', 'enrol_meta'), array(), $allroles));
$settings->add(new admin_setting_configcheckbox('enrol_meta/syncall', get_string('syncall', 'enrol_meta'), get_string('syncall_desc', 'enrol_meta'), 1));
diff --git a/enrol/self/edit_form.php b/enrol/self/edit_form.php
index 5919d697fee..3b252210a45 100644
--- a/enrol/self/edit_form.php
+++ b/enrol/self/edit_form.php
@@ -161,19 +161,18 @@ class enrol_self_edit_form extends moodleform {
* Gets a list of roles that this user can assign for the course as the default for self-enrolment
*
* @param context $context the context.
- * @param integer $defaultrole the id of the role that is set as the default for self-enrolement
+ * @param integer $defaultrole the id of the role that is set as the default for self-enrolment
* @return array index is the role id, value is the role name
*/
function extend_assignable_roles($context, $defaultrole) {
global $DB;
- $roles = get_assignable_roles($context);
- $sql = "SELECT r.id, r.name
- FROM {role} r
- WHERE r.id = $defaultrole";
- $results = $DB->get_record_sql($sql);
- if (isset($results->name)) {
- $roles[$results->id] = $results->name;
+
+ $roles = get_assignable_roles($context, ROLENAME_BOTH);
+ if (!isset($roles[$defaultrole])) {
+ if ($role = $DB->get_record('role', array('id'=>$defaultrole))) {
+ $roles[$defaultrole] = role_get_name($role, $context, ROLENAME_BOTH);
+ }
}
return $roles;
}
-}
\ No newline at end of file
+}
diff --git a/enrol/upgrade.txt b/enrol/upgrade.txt
index 14272ca091d..868912d19fd 100644
--- a/enrol/upgrade.txt
+++ b/enrol/upgrade.txt
@@ -2,6 +2,13 @@ This files describes API changes in /enrol/* - plugins,
information provided here is intended especially for developers.
+=== 2.4 ===
+
+required changes in code:
+* use role_get_name() or role_fix_names() if you need any role names, using role.name
+ directly from database is not correct any more
+
+
=== 2.2 ===
required changes in code:
diff --git a/group/autogroup.php b/group/autogroup.php
index 35d36d0e20b..344b3da907d 100644
--- a/group/autogroup.php
+++ b/group/autogroup.php
@@ -55,13 +55,8 @@ $strautocreategroups = get_string('autocreategroups', 'group');
$preview = '';
$error = '';
-/// Get applicable roles
-$rolenames = array();
-if ($roles = get_profile_roles($context)) {
- foreach ($roles as $role) {
- $rolenames[$role->id] = strip_tags(role_get_name($role, $context)); // Used in menus etc later on
- }
-}
+/// Get applicable roles - used in menus etc later on
+$rolenames = role_fix_names(get_profile_roles($context), $context, ROLENAME_ALIAS, true);
/// Create the form
$editform = new autogroup_form(null, array('roles' => $rolenames));
diff --git a/group/lib.php b/group/lib.php
index 8addc937e2a..d93ce756d80 100644
--- a/group/lib.php
+++ b/group/lib.php
@@ -695,8 +695,7 @@ function groups_get_members_by_role($groupid, $courseid, $fields='u.*',
$extrawheretest = ' AND ' . $extrawheretest;
}
- $sql = "SELECT r.id AS roleid, r.shortname AS roleshortname, r.name AS rolename,
- u.id AS userid, $fields
+ $sql = "SELECT r.id AS roleid, u.id AS userid, $fields
FROM {groups_members} gm
JOIN {user} u ON u.id = gm.userid
LEFT JOIN {role_assignments} ra ON (ra.userid = u.id AND ra.contextid ".get_related_contexts_string($context).")
@@ -726,8 +725,7 @@ function groups_calculate_role_people($rs, $context) {
return array();
}
- $roles = $DB->get_records_menu('role', null, 'name', 'id, name');
- $aliasnames = role_fix_names($roles, $context);
+ $allroles = role_fix_names(get_all_roles($context), $context);
// Array of all involved roles
$roles = array();
@@ -753,15 +751,12 @@ function groups_calculate_role_people($rs, $context) {
// If user has a role...
if (!is_null($rec->roleid)) {
// Create information about role if this is a new one
- if (!array_key_exists($rec->roleid,$roles)) {
+ if (!array_key_exists($rec->roleid, $roles)) {
+ $role = $allroles[$rec->roleid];
$roledata = new stdClass();
- $roledata->id = $rec->roleid;
- $roledata->shortname = $rec->roleshortname;
- if (array_key_exists($rec->roleid, $aliasnames)) {
- $roledata->name = $aliasnames[$rec->roleid];
- } else {
- $roledata->name = $rec->rolename;
- }
+ $roledata->id = $role->id;
+ $roledata->shortname = $role->shortname;
+ $roledata->name = $role->localname;
$roledata->users = array();
$roles[$roledata->id] = $roledata;
}
diff --git a/lang/en/role.php b/lang/en/role.php
index a8058ade8cb..b6a3de76418 100644
--- a/lang/en/role.php
+++ b/lang/en/role.php
@@ -147,6 +147,10 @@ $string['createrolebycopying'] = 'Create a new role by copying {$a}';
$string['createthisrole'] = 'Create this role';
$string['currentcontext'] = 'Current context';
$string['currentrole'] = 'Current role';
+$string['customroledescription'] = 'Custom description';
+$string['customroledescription_help'] = 'Descriptions of standard roles are localised automatically if the custom description is empty.';
+$string['customrolename'] = 'Custom full name';
+$string['customrolename_help'] = 'Names of standard roles are localised automatically if the custom name is empty. You must provide full name for all custom roles.';
$string['defaultrole'] = 'Default role';
$string['defaultx'] = 'Default: {$a}';
$string['defineroles'] = 'Define roles';
@@ -312,6 +316,7 @@ $string['roles_link'] = 'roles';
$string['role:safeoverride'] = 'Override safe permissions for others';
$string['roleselect'] = 'Select role';
$string['roleshortname'] = 'Short name';
+$string['roleshortname_help'] = 'Role short name is a low level role identifier, only ASCII alphanumeric characters are allowed. Do not change short names of standard roles.';
$string['role:switchroles'] = 'Switch to other roles';
$string['roletoassign'] = 'Role to assign';
$string['roletooverride'] = 'Role to override';
diff --git a/lib/accesslib.php b/lib/accesslib.php
index de180b40dd1..93e7ef8ebb6 100644
--- a/lib/accesslib.php
+++ b/lib/accesslib.php
@@ -168,9 +168,9 @@ define('RISK_SPAM', 0x0010);
/** capability allows mass delete of data belonging to other users - see {@link http://docs.moodle.org/dev/Hardening_new_Roles_system} */
define('RISK_DATALOSS', 0x0020);
-/** rolename displays - the name as defined in the role definition */
+/** rolename displays - the name as defined in the role definition, localised if name empty */
define('ROLENAME_ORIGINAL', 0);
-/** rolename displays - the name as defined by a role alias */
+/** rolename displays - the name as defined by a role alias at the course level, falls back to ROLENAME_ORIGINAL if alias not present */
define('ROLENAME_ALIAS', 1);
/** rolename displays - Both, like this: Role alias (Original) */
define('ROLENAME_BOTH', 2);
@@ -2840,8 +2840,15 @@ function get_profile_roles(context $context) {
list($contextlist, $cparams) = $DB->get_in_or_equal($context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'p');
$params = array_merge($params, $cparams);
- $sql = "SELECT DISTINCT r.id, r.name, r.shortname, r.sortorder
+ if ($coursecontext = $context->get_course_context(false)) {
+ $params['coursecontext'] = $coursecontext->id;
+ } else {
+ $params['coursecontext'] = 0;
+ }
+
+ $sql = "SELECT DISTINCT r.id, r.name, r.shortname, r.sortorder, rn.name AS coursealias
FROM {role_assignments} ra, {role} r
+ LEFT JOIN {role_names} rn ON (rn.contextid = :coursecontext AND rn.roleid = r.id)
WHERE r.id = ra.roleid
AND ra.contextid $contextlist
AND r.id $rallowed
@@ -2859,10 +2866,17 @@ function get_profile_roles(context $context) {
function get_roles_used_in_context(context $context) {
global $DB;
- list($contextlist, $params) = $DB->get_in_or_equal($context->get_parent_context_ids(true));
+ list($contextlist, $params) = $DB->get_in_or_equal($context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'cl');
- $sql = "SELECT DISTINCT r.id, r.name, r.shortname, r.sortorder
+ if ($coursecontext = $context->get_course_context(false)) {
+ $params['coursecontext'] = $coursecontext->id;
+ } else {
+ $params['coursecontext'] = 0;
+ }
+
+ $sql = "SELECT DISTINCT r.id, r.name, r.shortname, r.sortorder, rn.name AS coursealias
FROM {role_assignments} ra, {role} r
+ LEFT JOIN {role_names} rn ON (rn.contextid = :coursecontext AND rn.roleid = r.id)
WHERE r.id = ra.roleid
AND ra.contextid $contextlist
ORDER BY r.sortorder ASC";
@@ -2900,8 +2914,15 @@ function get_user_roles_in_course($userid, $courseid) {
list($contextlist, $cparams) = $DB->get_in_or_equal($context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'p');
$params = array_merge($params, $cparams);
- $sql = "SELECT DISTINCT r.id, r.name, r.shortname, r.sortorder
+ if ($coursecontext = $context->get_course_context(false)) {
+ $params['coursecontext'] = $coursecontext->id;
+ } else {
+ $params['coursecontext'] = 0;
+ }
+
+ $sql = "SELECT DISTINCT r.id, r.name, r.shortname, r.sortorder, rn.name AS coursealias
FROM {role_assignments} ra, {role} r
+ LEFT JOIN {role_names} rn ON (rn.contextid = :coursecontext AND rn.roleid = r.id)
WHERE r.id = ra.roleid
AND ra.contextid $contextlist
AND r.id $rallowed
@@ -2912,11 +2933,7 @@ function get_user_roles_in_course($userid, $courseid) {
$rolestring = '';
if ($roles = $DB->get_records_sql($sql, $params)) {
- foreach ($roles as $userrole) {
- $rolenames[$userrole->id] = $userrole->name;
- }
-
- $rolenames = role_fix_names($rolenames, $context); // Substitute aliases
+ $rolenames = role_fix_names($roles, $context, ROLENAME_ALIAS, true); // Substitute aliases
foreach ($rolenames as $roleid => $rolename) {
$rolenames[$roleid] = ''.$rolename.'';
@@ -2958,11 +2975,26 @@ function user_can_assign(context $context, $targetroleid) {
/**
* Returns all site roles in correct sort order.
*
- * @return array
+ * @param context $context optional context for course role name aliases
+ * @return array of role records with optional coursealias property
*/
-function get_all_roles() {
+function get_all_roles(context $context = null) {
global $DB;
- return $DB->get_records('role', null, 'sortorder ASC');
+
+ if (!$context or !$coursecontext = $context->get_course_context(false)) {
+ $coursecontext = null;
+ }
+
+ if ($coursecontext) {
+ $sql = "SELECT r.*, rn.name AS coursealias
+ FROM {role} r
+ LEFT JOIN {role_names} rn ON (rn.contextid = :coursecontext AND rn.roleid = r.id)
+ ORDER BY r.sortorder ASC";
+ return $DB->get_records_sql($sql, array('coursecontext'=>$coursecontext->id));
+
+ } else {
+ return $DB->get_records('role', array(), 'sortorder ASC');
+ }
}
/**
@@ -3098,14 +3130,8 @@ function get_assignable_roles(context $context, $rolenamedisplay = ROLENAME_ALIA
}
}
- $parents = $context->get_parent_context_ids(true);
- $contexts = implode(',' , $parents);
-
$params = array();
$extrafields = '';
- if ($rolenamedisplay == ROLENAME_ORIGINALANDSHORT or $rolenamedisplay == ROLENAME_SHORT) {
- $extrafields .= ', r.shortname';
- }
if ($withusercounts) {
$extrafields = ', (SELECT count(u.id)
@@ -3119,6 +3145,8 @@ function get_assignable_roles(context $context, $rolenamedisplay = ROLENAME_ALIA
// show all roles allowed in this context to admins
$assignrestriction = "";
} else {
+ $parents = $context->get_parent_context_ids(true);
+ $contexts = implode(',' , $parents);
$assignrestriction = "JOIN (SELECT DISTINCT raa.allowassign AS id
FROM {role_allow_assign} raa
JOIN {role_assignments} ra ON ra.roleid = raa.roleid
@@ -3127,28 +3155,22 @@ function get_assignable_roles(context $context, $rolenamedisplay = ROLENAME_ALIA
$params['userid'] = $userid;
}
$params['contextlevel'] = $context->contextlevel;
- $sql = "SELECT r.id, r.name $extrafields
+
+ if ($coursecontext = $context->get_course_context(false)) {
+ $params['coursecontext'] = $coursecontext->id;
+ } else {
+ $params['coursecontext'] = 0; // no course aliases
+ $coursecontext = null;
+ }
+ $sql = "SELECT r.id, r.name, r.shortname, rn.name AS coursealias $extrafields
FROM {role} r
$assignrestriction
- JOIN {role_context_levels} rcl ON r.id = rcl.roleid
- WHERE rcl.contextlevel = :contextlevel
+ JOIN {role_context_levels} rcl ON (rcl.contextlevel = :contextlevel AND r.id = rcl.roleid)
+ LEFT JOIN {role_names} rn ON (rn.contextid = :coursecontext AND rn.roleid = r.id)
ORDER BY r.sortorder ASC";
$roles = $DB->get_records_sql($sql, $params);
- $rolenames = array();
- foreach ($roles as $role) {
- if ($rolenamedisplay == ROLENAME_SHORT) {
- $rolenames[$role->id] = $role->shortname;
- continue;
- }
- $rolenames[$role->id] = $role->name;
- if ($rolenamedisplay == ROLENAME_ORIGINALANDSHORT) {
- $rolenames[$role->id] .= ' (' . $role->shortname . ')';
- }
- }
- if ($rolenamedisplay != ROLENAME_ORIGINALANDSHORT and $rolenamedisplay != ROLENAME_SHORT) {
- $rolenames = role_fix_names($rolenames, $context, $rolenamedisplay);
- }
+ $rolenames = role_fix_names($roles, $coursecontext, $rolenamedisplay, true);
if (!$withusercounts) {
return $rolenames;
@@ -3192,17 +3214,25 @@ function get_switchable_roles(context $context) {
$params['userid'] = $USER->id;
}
+ if ($coursecontext = $context->get_course_context(false)) {
+ $params['coursecontext'] = $coursecontext->id;
+ } else {
+ $params['coursecontext'] = 0; // no course aliases
+ $coursecontext = null;
+ }
+
$query = "
- SELECT r.id, r.name
+ SELECT r.id, r.name, r.shortname, rn.name AS coursealias
FROM (SELECT DISTINCT rc.roleid
FROM {role_capabilities} rc
$extrajoins
$extrawhere) idlist
JOIN {role} r ON r.id = idlist.roleid
+ LEFT JOIN {role_names} rn ON (rn.contextid = :coursecontext AND rn.roleid = r.id)
ORDER BY r.sortorder";
+ $roles = $DB->get_records_sql($query, $params);
- $rolenames = $DB->get_records_sql_menu($query, $params);
- return role_fix_names($rolenames, $context, ROLENAME_ALIAS);
+ return role_fix_names($roles, $context, ROLENAME_ALIAS, true);
}
/**
@@ -3232,9 +3262,6 @@ function get_overridable_roles(context $context, $rolenamedisplay = ROLENAME_ALI
$params = array();
$extrafields = '';
- if ($rolenamedisplay == ROLENAME_ORIGINALANDSHORT) {
- $extrafields .= ', ro.shortname';
- }
$params['userid'] = $USER->id;
if ($withcounts) {
@@ -3243,16 +3270,24 @@ function get_overridable_roles(context $context, $rolenamedisplay = ROLENAME_ALI
$params['conid'] = $context->id;
}
+ if ($coursecontext = $context->get_course_context(false)) {
+ $params['coursecontext'] = $coursecontext->id;
+ } else {
+ $params['coursecontext'] = 0; // no course aliases
+ $coursecontext = null;
+ }
+
if (is_siteadmin()) {
// show all roles to admins
$roles = $DB->get_records_sql("
- SELECT ro.id, ro.name$extrafields
+ SELECT ro.id, ro.name, ro.shortname, rn.name AS coursealias $extrafields
FROM {role} ro
+ LEFT JOIN {role_names} rn ON (rn.contextid = :coursecontext AND rn.roleid = ro.id)
ORDER BY ro.sortorder ASC", $params);
} else {
$roles = $DB->get_records_sql("
- SELECT ro.id, ro.name$extrafields
+ SELECT ro.id, ro.name, ro.shortname, rn.name AS coursealias $extrafields
FROM {role} ro
JOIN (SELECT DISTINCT r.id
FROM {role} r
@@ -3260,23 +3295,15 @@ function get_overridable_roles(context $context, $rolenamedisplay = ROLENAME_ALI
JOIN {role_assignments} ra ON rao.roleid = ra.roleid
WHERE ra.userid = :userid AND ra.contextid IN ($contexts)
) inline_view ON ro.id = inline_view.id
+ LEFT JOIN {role_names} rn ON (rn.contextid = :coursecontext AND rn.roleid = ro.id)
ORDER BY ro.sortorder ASC", $params);
}
- $rolenames = array();
- foreach ($roles as $role) {
- $rolenames[$role->id] = $role->name;
- if ($rolenamedisplay == ROLENAME_ORIGINALANDSHORT) {
- $rolenames[$role->id] .= ' (' . $role->shortname . ')';
- }
- }
- if ($rolenamedisplay != ROLENAME_ORIGINALANDSHORT) {
- $rolenames = role_fix_names($rolenames, $context, $rolenamedisplay);
- }
+ $rolenames = role_fix_names($roles, $context, $rolenamedisplay, true);
if (!$withcounts) {
return $rolenames;
-}
+ }
$rolecounts = array();
$nameswithcounts = array();
@@ -3300,22 +3327,31 @@ function get_default_enrol_roles(context $context, $addroleid = null) {
global $DB;
$params = array('contextlevel'=>CONTEXT_COURSE);
+
+ if ($coursecontext = $context->get_course_context(false)) {
+ $params['coursecontext'] = $coursecontext->id;
+ } else {
+ $params['coursecontext'] = 0; // no course names
+ $coursecontext = null;
+ }
+
if ($addroleid) {
$addrole = "OR r.id = :addroleid";
$params['addroleid'] = $addroleid;
} else {
$addrole = "";
}
- $sql = "SELECT r.id, r.name
+
+ $sql = "SELECT r.id, r.name, r.shortname, rn.name AS coursealias
FROM {role} r
LEFT JOIN {role_context_levels} rcl ON (rcl.roleid = r.id AND rcl.contextlevel = :contextlevel)
+ LEFT JOIN {role_names} rn ON (rn.contextid = :coursecontext AND rn.roleid = r.id)
WHERE rcl.id IS NOT NULL $addrole
ORDER BY sortorder DESC";
- $roles = $DB->get_records_sql_menu($sql, $params);
- $roles = role_fix_names($roles, $context, ROLENAME_BOTH);
+ $roles = $DB->get_records_sql($sql, $params);
- return $roles;
+ return role_fix_names($roles, $context, ROLENAME_BOTH, true);
}
/**
@@ -3776,7 +3812,8 @@ function get_role_users($roleid, context $context, $parent = false, $fields = ''
$fields = 'u.id, u.confirmed, u.username, u.firstname, u.lastname, '.
'u.maildisplay, u.mailformat, u.maildigest, u.email, u.emailstop, u.city, '.
'u.country, u.picture, u.idnumber, u.department, u.institution, '.
- 'u.lang, u.timezone, u.lastaccess, u.mnethostid, r.name AS rolename, r.sortorder';
+ 'u.lang, u.timezone, u.lastaccess, u.mnethostid, r.name AS rolename, r.sortorder, '.
+ 'r.shortname AS roleshortname, rn.name AS rolecoursealias';
}
$parentcontexts = '';
@@ -3789,23 +3826,29 @@ function get_role_users($roleid, context $context, $parent = false, $fields = ''
}
if ($roleid) {
- list($rids, $params) = $DB->get_in_or_equal($roleid, SQL_PARAMS_QM);
+ list($rids, $params) = $DB->get_in_or_equal($roleid, SQL_PARAMS_NAMED, 'r');
$roleselect = "AND ra.roleid $rids";
} else {
$params = array();
$roleselect = '';
}
+ if ($coursecontext = $context->get_course_context(false)) {
+ $params['coursecontext'] = $coursecontext->id;
+ } else {
+ $params['coursecontext'] = 0;
+ }
+
if ($group) {
$groupjoin = "JOIN {groups_members} gm ON gm.userid = u.id";
- $groupselect = " AND gm.groupid = ? ";
- $params[] = $group;
+ $groupselect = " AND gm.groupid = :groupid ";
+ $params['groupid'] = $group;
} else {
$groupjoin = '';
$groupselect = '';
}
- array_unshift($params, $context->id);
+ $params['contextid'] = $context->id;
if ($extrawheretest) {
$extrawheretest = ' AND ' . $extrawheretest;
@@ -3816,8 +3859,9 @@ function get_role_users($roleid, context $context, $parent = false, $fields = ''
FROM {role_assignments} ra
JOIN {user} u ON u.id = ra.userid
JOIN {role} r ON ra.roleid = r.id
+ LEFT JOIN {role_names} rn ON (rn.contextid = :coursecontext AND rn.roleid = r.id)
$groupjoin
- WHERE (ra.contextid = ? $parentcontexts)
+ WHERE (ra.contextid = :contextid $parentcontexts)
$roleselect
$groupselect
$extrawheretest
@@ -4123,75 +4167,175 @@ function user_has_role_assignment($userid, $roleid, $contextid = 0) {
* Get role name or alias if exists and format the text.
*
* @param stdClass $role role object
- * @param context_course $coursecontext
- * @return string name of role in course context
+ * - optional 'coursealias' property should be included for performance reasons if course context used
+ * - description property is not required here
+ * @param context|bool $context empty means system context
+ * @param int $rolenamedisplay type of role name
+ * @return string localised role name or course role name alias
*/
-function role_get_name($role, context_course $coursecontext) {
+function role_get_name(stdClass $role, $context = null, $rolenamedisplay = ROLENAME_ALIAS) {
global $DB;
- if ($r = $DB->get_record('role_names', array('roleid'=>$role->id, 'contextid'=>$coursecontext->id))) {
- return strip_tags(format_string($r->name));
+ if ($rolenamedisplay == ROLENAME_SHORT) {
+ return $role->shortname;
+ }
+
+ if (!$context or !$coursecontext = $context->get_course_context(false)) {
+ $coursecontext = null;
+ }
+
+ if ($coursecontext and !property_exists($role, 'coursealias') and ($rolenamedisplay == ROLENAME_ALIAS or $rolenamedisplay == ROLENAME_BOTH or $rolenamedisplay == ROLENAME_ALIAS_RAW)) {
+ $role = clone($role); // Do not modify parameters.
+ if ($r = $DB->get_record('role_names', array('roleid'=>$role->id, 'contextid'=>$coursecontext->id))) {
+ $role->coursealias = $r->name;
+ } else {
+ $role->coursealias = null;
+ }
+ }
+
+ if ($rolenamedisplay == ROLENAME_ALIAS_RAW) {
+ if ($coursecontext) {
+ return $role->coursealias;
+ } else {
+ return null;
+ }
+ }
+
+ if (trim($role->name) !== '') {
+ // For filtering always use context where was the thing defined - system for roles here.
+ $original = format_string($role->name, true, array('context'=>context_system::instance()));
+
} else {
- return strip_tags(format_string($role->name));
+ // Empty role->name means we want to see localised role name based on shortname,
+ // only default roles are supposed to be localised.
+ switch ($role->shortname) {
+ case 'manager': $original = get_string('manager', 'role'); break;
+ case 'coursecreator': $original = get_string('coursecreators'); break;
+ case 'editingteacher': $original = get_string('defaultcourseteacher'); break;
+ case 'teacher': $original = get_string('noneditingteacher'); break;
+ case 'student': $original = get_string('defaultcoursestudent'); break;
+ case 'guest': $original = get_string('guest'); break;
+ case 'user': $original = get_string('authenticateduser'); break;
+ case 'frontpage': $original = get_string('frontpageuser', 'role'); break;
+ // We should not get here, the role UI should require the name for custom roles!
+ default: $original = $role->shortname; break;
+ }
+ }
+
+ if ($rolenamedisplay == ROLENAME_ORIGINAL) {
+ return $original;
+ }
+
+ if ($rolenamedisplay == ROLENAME_ORIGINALANDSHORT) {
+ return "$original ($role->shortname)";
+ }
+
+ if ($rolenamedisplay == ROLENAME_ALIAS) {
+ if ($coursecontext and trim($role->coursealias) !== '') {
+ return format_string($role->coursealias, true, array('context'=>$coursecontext));
+ } else {
+ return $original;
+ }
+ }
+
+ if ($rolenamedisplay == ROLENAME_BOTH) {
+ if ($coursecontext and trim($role->coursealias) !== '') {
+ return format_string($role->coursealias, true, array('context'=>$coursecontext)) . " ($original)";
+ } else {
+ return $original;
+ }
+ }
+
+ throw new coding_exception('Invalid $rolenamedisplay parameter specified in role_get_name()');
+}
+
+/**
+ * Returns localised role description if available.
+ * If the name is empty it tries to find the default role name using
+ * hardcoded list of default role names or other methods in the future.
+ *
+ * @param stdClass $role
+ * @return string localised role name
+ */
+function role_get_description(stdClass $role) {
+ if (!html_is_blank($role->description)) {
+ return format_text($role->description, FORMAT_HTML, array('context'=>context_system::instance()));
+ }
+
+ switch ($role->shortname) {
+ case 'manager': return get_string('managerdescription', 'role');
+ case 'coursecreator': return get_string('coursecreatorsdescription');
+ case 'editingteacher': return get_string('defaultcourseteacherdescription');
+ case 'teacher': return get_string('noneditingteacherdescription');
+ case 'student': return get_string('defaultcoursestudentdescription');
+ case 'guest': return get_string('guestdescription');
+ case 'user': return get_string('authenticateduserdescription');
+ case 'frontpage': return get_string('frontpageuserdescription', 'role');
+ default: return '';
}
}
/**
* Prepare list of roles for display, apply aliases and format text
*
- * @param array $roleoptions array roleid => rolename or roleid => roleobject
- * @param context $context a context
+ * @param array $roleoptions array roleid => roleobject (with optional coursealias), strings are accepted for backwards compatibility only
+ * @param context|bool $context a context
* @param int $rolenamedisplay
+ * @param bool $returnmenu null means keep the same format as $roleoptions, true means id=>localname, false means id=>rolerecord
* @return array Array of context-specific role names, or role objects with a ->localname field added.
*/
-function role_fix_names($roleoptions, context $context, $rolenamedisplay = ROLENAME_ALIAS) {
+function role_fix_names($roleoptions, $context = null, $rolenamedisplay = ROLENAME_ALIAS, $returnmenu = null) {
global $DB;
- // Make sure we have a course context.
- $coursecontext = $context->get_course_context(false);
+ if (empty($roleoptions)) {
+ return array();
+ }
- // Make sure we are working with an array roleid => name. Normally we
- // want to use the unlocalised name if the localised one is not present.
- $newnames = array();
- foreach ($roleoptions as $rid => $roleorname) {
- if ($rolenamedisplay != ROLENAME_ALIAS_RAW) {
- if (is_object($roleorname)) {
- $newnames[$rid] = $roleorname->name;
- } else {
- $newnames[$rid] = $roleorname;
- }
- } else {
- $newnames[$rid] = '';
+ if (!$context or !$coursecontext = $context->get_course_context(false)) {
+ $coursecontext = null;
+ }
+
+ // We usually need all role columns...
+ $first = reset($roleoptions);
+ if ($returnmenu === null) {
+ $returnmenu = !is_object($first);
+ }
+
+ if (!is_object($first) or !property_exists($first, 'shortname')) {
+ $allroles = get_all_roles($context);
+ foreach ($roleoptions as $rid => $unused) {
+ $roleoptions[$rid] = $allroles[$rid];
}
}
- // If necessary, get the localised names.
- if ($rolenamedisplay != ROLENAME_ORIGINAL && !empty($coursecontext->id)) {
- // The get the relevant renames, and use them.
- $aliasnames = $DB->get_records('role_names', array('contextid'=>$coursecontext->id));
- foreach ($aliasnames as $alias) {
- if (isset($newnames[$alias->roleid])) {
- if ($rolenamedisplay == ROLENAME_ALIAS || $rolenamedisplay == ROLENAME_ALIAS_RAW) {
- $newnames[$alias->roleid] = $alias->name;
- } else if ($rolenamedisplay == ROLENAME_BOTH) {
- $newnames[$alias->roleid] = $alias->name . ' (' . $roleoptions[$alias->roleid] . ')';
+ // Inject coursealias if necessary.
+ if ($coursecontext and ($rolenamedisplay == ROLENAME_ALIAS_RAW or $rolenamedisplay == ROLENAME_ALIAS or $rolenamedisplay == ROLENAME_BOTH)) {
+ $first = reset($roleoptions);
+ if (!property_exists($first, 'coursealias')) {
+ $aliasnames = $DB->get_records('role_names', array('contextid'=>$coursecontext->id));
+ foreach ($aliasnames as $alias) {
+ if (isset($roleoptions[$alias->roleid])) {
+ $roleoptions[$alias->roleid]->coursealias = $alias->name;
}
}
}
}
- // Finally, apply format_string and put the result in the right place.
- foreach ($roleoptions as $rid => $roleorname) {
- if ($rolenamedisplay != ROLENAME_ALIAS_RAW) {
- $newnames[$rid] = strip_tags(format_string($newnames[$rid]));
- }
- if (is_object($roleorname)) {
- $roleoptions[$rid]->localname = $newnames[$rid];
- } else {
- $roleoptions[$rid] = $newnames[$rid];
- }
+ // Add localname property.
+ foreach ($roleoptions as $rid => $role) {
+ $roleoptions[$rid]->localname = role_get_name($role, $coursecontext, $rolenamedisplay);
}
- return $roleoptions;
+
+ if (!$returnmenu) {
+ return $roleoptions;
+ }
+
+ $menu = array();
+ foreach ($roleoptions as $rid => $role) {
+ $menu[$rid] = $role->localname;
+ }
+
+ return $menu;
}
/**
@@ -4404,19 +4548,14 @@ function get_role_names_with_caps_in_context($context, $capabilities) {
global $DB;
$rolesthatcanrate = get_roles_with_caps_in_context($context, $capabilities);
+ $allroles = $DB->get_records('role', null, 'sortorder DESC');
- $allroles = array();
- $roles = $DB->get_records('role', null, 'sortorder DESC');
- foreach ($roles as $roleid=>$role) {
- $allroles[$roleid] = $role->name;
- }
-
- $rolenames = array();
+ $roles = array();
foreach ($rolesthatcanrate as $r) {
- $rolenames[$r] = $allroles[$r];
+ $roles[$r] = $allroles[$r];
}
- $rolenames = role_fix_names($rolenames, $context);
- return $rolenames;
+
+ return role_fix_names($roles, $context, ROLENAME_ALIAS, true);
}
/**
diff --git a/lib/adminlib.php b/lib/adminlib.php
index 5062c998f0b..0626e662581 100644
--- a/lib/adminlib.php
+++ b/lib/adminlib.php
@@ -3880,10 +3880,7 @@ class admin_setting_pickroles extends admin_setting_configmulticheckbox {
return true;
}
if ($roles = get_all_roles()) {
- $this->choices = array();
- foreach($roles as $role) {
- $this->choices[$role->id] = format_string($role->name);
- }
+ $this->choices = role_fix_names($roles, null, ROLENAME_ORIGINAL, true);
return true;
} else {
return false;
diff --git a/lib/datalib.php b/lib/datalib.php
index 99f6b913be2..dea5c4b6f16 100644
--- a/lib/datalib.php
+++ b/lib/datalib.php
@@ -652,12 +652,13 @@ function get_courses_wmanagers($categoryid=0, $sort="c.sortorder ASC", $fields=a
*
*/
$sql = "SELECT ctx.path, ctx.instanceid, ctx.contextlevel,
- r.id AS roleid, r.name as rolename,
- u.id AS userid, u.firstname, u.lastname
+ r.id AS roleid, r.name AS rolename, r.shortname AS roleshortname,
+ rn.name AS rolecoursealias, u.id AS userid, u.firstname, u.lastname
FROM {role_assignments} ra
JOIN {context} ctx ON ra.contextid = ctx.id
JOIN {user} u ON ra.userid = u.id
JOIN {role} r ON ra.roleid = r.id
+ LEFT JOIN {role_names} rn ON (rn.contextid = ctx.id AND rn.roleid = r.id)
LEFT OUTER JOIN {course} c
ON (ctx.instanceid=c.id AND ctx.contextlevel=".CONTEXT_COURSE.")
WHERE ( c.id IS NOT NULL";
diff --git a/lib/db/install.php b/lib/db/install.php
index 787b871d8b2..2e401fe817a 100644
--- a/lib/db/install.php
+++ b/lib/db/install.php
@@ -243,14 +243,14 @@ function xmldb_main_install() {
// Install the roles system.
- $managerrole = create_role(get_string('manager', 'role'), 'manager', get_string('managerdescription', 'role'), 'manager');
- $coursecreatorrole = create_role(get_string('coursecreators'), 'coursecreator', get_string('coursecreatorsdescription'), 'coursecreator');
- $editteacherrole = create_role(get_string('defaultcourseteacher'), 'editingteacher', get_string('defaultcourseteacherdescription'), 'editingteacher');
- $noneditteacherrole = create_role(get_string('noneditingteacher'), 'teacher', get_string('noneditingteacherdescription'), 'teacher');
- $studentrole = create_role(get_string('defaultcoursestudent'), 'student', get_string('defaultcoursestudentdescription'), 'student');
- $guestrole = create_role(get_string('guest'), 'guest', get_string('guestdescription'), 'guest');
- $userrole = create_role(get_string('authenticateduser'), 'user', get_string('authenticateduserdescription'), 'user');
- $frontpagerole = create_role(get_string('frontpageuser', 'role'), 'frontpage', get_string('frontpageuserdescription', 'role'), 'frontpage');
+ $managerrole = create_role('', 'manager', '', 'manager');
+ $coursecreatorrole = create_role('', 'coursecreator', '', 'coursecreator');
+ $editteacherrole = create_role('', 'editingteacher', '', 'editingteacher');
+ $noneditteacherrole = create_role('', 'teacher', '', 'teacher');
+ $studentrole = create_role('', 'student', '', 'student');
+ $guestrole = create_role('', 'guest', '', 'guest');
+ $userrole = create_role('', 'user', '', 'user');
+ $frontpagerole = create_role('', 'frontpage', '', 'frontpage');
// Now is the correct moment to install capabilities - after creation of legacy roles, but before assigning of roles
update_capabilities('moodle');
diff --git a/lib/db/install.xml b/lib/db/install.xml
index fbc70a0268d..3a2a0544a28 100644
--- a/lib/db/install.xml
+++ b/lib/db/install.xml
@@ -1018,9 +1018,9 @@
-
+
-
+
@@ -1028,9 +1028,8 @@
-
-
-
+
+
diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php
index 030348fdcd6..99800de005f 100644
--- a/lib/db/upgrade.php
+++ b/lib/db/upgrade.php
@@ -1015,5 +1015,21 @@ function xmldb_main_upgrade($oldversion) {
upgrade_main_savepoint(true, 2012062500.09);
}
+ if ($oldversion < 2012062500.10) {
+
+ // Define index name (unique) to be dropped form role
+ $table = new xmldb_table('role');
+ $index = new xmldb_index('name', XMLDB_INDEX_UNIQUE, array('name'));
+
+ // Conditionally launch drop index name
+ if ($dbman->index_exists($table, $index)) {
+ $dbman->drop_index($table, $index);
+ }
+
+ // Main savepoint reached
+ upgrade_main_savepoint(true, 2012062500.10);
+ }
+
+
return true;
}
diff --git a/lib/tests/accesslib_test.php b/lib/tests/accesslib_test.php
index 6d7bc4e22a8..e6563966f03 100644
--- a/lib/tests/accesslib_test.php
+++ b/lib/tests/accesslib_test.php
@@ -624,6 +624,10 @@ class accesslib_testcase extends advanced_testcase {
* @return void
*/
public function test_get_all_roles() {
+ global $DB;
+
+ $this->resetAfterTest();
+
$allroles = get_all_roles();
$this->assertEquals('array', gettype($allroles));
$this->assertCount(8, $allroles); // there are 8 roles is standard install
@@ -636,6 +640,33 @@ class accesslib_testcase extends advanced_testcase {
foreach($allroles as $roleid => $role) {
$this->assertEquals($role->id, $roleid);
}
+
+ $teacher = $DB->get_record('role', array('shortname'=>'teacher'), '*', MUST_EXIST);
+ $course = $this->getDataGenerator()->create_course();
+ $coursecontext = context_course::instance($course->id);
+ $otherid = create_role('Other role', 'other', 'Some other role', '');
+ $teacherename = (object)array('roleid'=>$teacher->id, 'name'=>'Učitel', 'contextid'=>$coursecontext->id);
+ $DB->insert_record('role_names', $teacherename);
+ $otherrename = (object)array('roleid'=>$otherid, 'name'=>'Ostatní', 'contextid'=>$coursecontext->id);
+ $DB->insert_record('role_names', $otherrename);
+ $renames = $DB->get_records_menu('role_names', array('contextid'=>$coursecontext->id), '', 'roleid,name');
+
+ $allroles = get_all_roles($coursecontext);
+ $this->assertEquals('array', gettype($allroles));
+ $this->assertCount(9, $allroles);
+ $role = reset($allroles);
+ $role = (array)$role;
+
+ $this->assertEquals(array('id', 'name', 'shortname', 'description', 'sortorder', 'archetype', 'coursealias'), array_keys($role), '', 0, 10, true);
+
+ foreach($allroles as $roleid => $role) {
+ $this->assertEquals($role->id, $roleid);
+ if (isset($renames[$roleid])) {
+ $this->assertSame($renames[$roleid], $role->coursealias);
+ } else {
+ $this->assertSame(null, $role->coursealias);
+ }
+ }
}
/**
@@ -680,19 +711,43 @@ class accesslib_testcase extends advanced_testcase {
$this->resetAfterTest();
- $teacher = $DB->get_record('role', array('shortname'=>'teacher'), '*', MUST_EXIST);
$allroles = $DB->get_records('role');
+ $teacher = $DB->get_record('role', array('shortname'=>'teacher'), '*', MUST_EXIST);
$course = $this->getDataGenerator()->create_course();
$coursecontext = context_course::instance($course->id);
-
+ $otherid = create_role('Other role', 'other', 'Some other role', '');
$teacherename = (object)array('roleid'=>$teacher->id, 'name'=>'Učitel', 'contextid'=>$coursecontext->id);
$DB->insert_record('role_names', $teacherename);
+ $otherrename = (object)array('roleid'=>$otherid, 'name'=>'Ostatní', 'contextid'=>$coursecontext->id);
+ $DB->insert_record('role_names', $otherrename);
+ $renames = $DB->get_records_menu('role_names', array('contextid'=>$coursecontext->id), '', 'roleid,name');
foreach ($allroles as $role) {
- $this->assertNotEmpty(role_get_name($role, $coursecontext));
- if ($role->id == $teacher->id) {
- $this->assertSame($teacherename->name, role_get_name($role, $coursecontext));
+ // Get localised name from lang pack.
+ $this->assertSame('', $role->name);
+ $name = role_get_name($role, null, ROLENAME_ORIGINAL);
+ $this->assertNotEmpty($name);
+ $this->assertNotEquals($role->shortname, $name);
+
+ if (isset($renames[$role->id])) {
+ $this->assertSame($renames[$role->id], role_get_name($role, $coursecontext));
+ $this->assertSame($renames[$role->id], role_get_name($role, $coursecontext, ROLENAME_ALIAS));
+ $this->assertSame($renames[$role->id], role_get_name($role, $coursecontext, ROLENAME_ALIAS_RAW));
+ $this->assertSame("{$renames[$role->id]} ($name)", role_get_name($role, $coursecontext, ROLENAME_BOTH));
+ } else {
+ $this->assertSame($name, role_get_name($role, $coursecontext));
+ $this->assertSame($name, role_get_name($role, $coursecontext, ROLENAME_ALIAS));
+ $this->assertSame(null, role_get_name($role, $coursecontext, ROLENAME_ALIAS_RAW));
+ $this->assertSame($name, role_get_name($role, $coursecontext, ROLENAME_BOTH));
}
+ $this->assertSame($name, role_get_name($role));
+ $this->assertSame($name, role_get_name($role, $coursecontext, ROLENAME_ORIGINAL));
+ $this->assertSame($name, role_get_name($role, null, ROLENAME_ORIGINAL));
+ $this->assertSame($role->shortname, role_get_name($role, $coursecontext, ROLENAME_SHORT));
+ $this->assertSame($role->shortname, role_get_name($role, null, ROLENAME_SHORT));
+ $this->assertSame("$name ($role->shortname)", role_get_name($role, $coursecontext, ROLENAME_ORIGINALANDSHORT));
+ $this->assertSame("$name ($role->shortname)", role_get_name($role, null, ROLENAME_ORIGINALANDSHORT));
+ $this->assertSame(null, role_get_name($role, null, ROLENAME_ALIAS_RAW));
}
}
@@ -733,99 +788,22 @@ class accesslib_testcase extends advanced_testcase {
$rolenames[$role->id] = $role->name;
}
- /* TODO: unsupported! MDL-8249
- $fixed = role_fix_names($roles, $coursecontext, ROLENAME_SHORT);
- $this->assertCount(count($roles), $fixed);
- foreach($fixed as $rolename) {
- $this->assertInstanceOf('stdClass', $rolename);
- $role = $roles[$rolename->id];
- $this->assertSame($role->shortname, $rolename->localname);
- }
- */
-
- /* TODO: unsupported! MDL-8249
- $fixed = role_fix_names($roles, $coursecontext, ROLENAME_ORIGINALANDSHORT);
- $this->assertCount(count($roles), $fixed);
- foreach($fixed as $rolename) {
- $this->assertInstanceOf('stdClass', $rolename);
- $role = $roles[$rolename->id];
- $this->assertSame("$role->name ($role->shortname)", $rolename->localname);
- }
- */
-
- $fixed = role_fix_names($roles, $coursecontext, ROLENAME_ORIGINAL);
- $this->assertCount(count($roles), $fixed);
- foreach($fixed as $roleid=>$rolename) {
- $this->assertInstanceOf('stdClass', $rolename);
- $role = $roles[$roleid];
- $name = role_get_name($role, $frontcontext);
- $this->assertSame($name, $rolename->localname);
- }
- $fixed = role_fix_names($rolenames, $coursecontext, ROLENAME_ORIGINAL);
- $this->assertCount(count($rolenames), $fixed);
- foreach($fixed as $roleid=>$rolename) {
- $role = $roles[$roleid];
- $name = role_get_name($role, $frontcontext);
- $this->assertSame($name, $rolename);
- }
-
- $fixed = role_fix_names($roles, $coursecontext, ROLENAME_ALIAS);
- $this->assertCount(count($roles), $fixed);
- foreach($fixed as $roleid=>$rolename) {
- $this->assertInstanceOf('stdClass', $rolename);
- $role = $roles[$roleid];
- $this->assertSame(role_get_name($role, $coursecontext), $rolename->localname);
- }
- $fixed = role_fix_names($rolenames, $coursecontext, ROLENAME_ALIAS);
- $this->assertCount(count($rolenames), $fixed);
- foreach($fixed as $roleid=>$rolename) {
- $role = $roles[$roleid];
- $this->assertSame(role_get_name($role, $coursecontext), $rolename);
- }
-
- /* TODO: buggy! MDL-8249
- $fixed = role_fix_names($roles, $coursecontext, ROLENAME_BOTH);
- $this->assertCount(count($roles), $fixed);
- foreach($fixed as $roleid=>$rolename) {
- $this->assertInstanceOf('stdClass', $rolename);
- $role = $roles[$roleid];
- $name = role_get_name($role, $frontcontext);
- if (isset($renames[$roleid])) {
- $this->assertSame("$renames[$roleid] ($name)", $rolename->localname);
- } else {
- $this->assertSame(role_get_name($role, $coursecontext), $rolename->localname);
+ $alltypes = array(ROLENAME_ALIAS, ROLENAME_ALIAS_RAW, ROLENAME_BOTH, ROLENAME_ORIGINAL, ROLENAME_ORIGINALANDSHORT, ROLENAME_SHORT);
+ foreach ($alltypes as $type) {
+ $fixed = role_fix_names($roles, $coursecontext, $type);
+ $this->assertCount(count($roles), $fixed);
+ foreach($fixed as $roleid=>$rolename) {
+ $this->assertInstanceOf('stdClass', $rolename);
+ $role = $allroles[$roleid];
+ $name = role_get_name($role, $coursecontext, $type);
+ $this->assertSame($name, $rolename->localname);
}
- }
- */
- $fixed = role_fix_names($rolenames, $coursecontext, ROLENAME_BOTH);
- $this->assertCount(count($rolenames), $fixed);
- foreach($fixed as $roleid=>$rolename) {
- $role = $roles[$roleid];
- if (isset($renames[$roleid])) {
- $name = role_get_name($role, $frontcontext);
- $this->assertSame("$renames[$roleid] ($name)", $rolename);
- } else {
- $this->assertSame(role_get_name($role, $coursecontext), $rolename);
- }
- }
-
- $fixed = role_fix_names($roles, $coursecontext, ROLENAME_ALIAS_RAW);
- $this->assertCount(count($roles), $fixed);
- foreach($fixed as $roleid=>$rolename) {
- $this->assertInstanceOf('stdClass', $rolename);
- if (isset($renames[$roleid])) {
- $this->assertSame($renames[$roleid], $rolename->localname);
- } else {
- $this->assertSame('', $rolename->localname);
- }
- }
- $fixed = role_fix_names($rolenames, $coursecontext, ROLENAME_ALIAS_RAW);
- $this->assertCount(count($rolenames), $fixed);
- foreach($fixed as $roleid=>$rolename) {
- if (isset($renames[$roleid])) {
- $this->assertSame($renames[$roleid], $rolename);
- } else {
- $this->assertSame('', $rolename);
+ $fixed = role_fix_names($rolenames, $coursecontext, $type);
+ $this->assertCount(count($rolenames), $fixed);
+ foreach($fixed as $roleid=>$rolename) {
+ $role = $allroles[$roleid];
+ $name = role_get_name($role, $coursecontext, $type);
+ $this->assertSame($name, $rolename);
}
}
}
@@ -965,10 +943,6 @@ class accesslib_testcase extends advanced_testcase {
}
$alltypes = array(ROLENAME_ALIAS, ROLENAME_ALIAS_RAW, ROLENAME_BOTH, ROLENAME_ORIGINAL, ROLENAME_ORIGINALANDSHORT, ROLENAME_SHORT);
foreach ($alltypes as $type) {
- if ($type == ROLENAME_SHORT or $type == ROLENAME_ORIGINALANDSHORT or $type == ROLENAME_BOTH) {
- // TODO: skip for now, remove after role_fix_names() is fixed and supports all types MDL-8249
- continue;
- }
$rolenames = role_fix_names($allroles, $coursecontext, $type);
$roles = get_assignable_roles($coursecontext, $type, false, $admin);
foreach ($roles as $roleid=>$rolename) {
@@ -977,17 +951,19 @@ class accesslib_testcase extends advanced_testcase {
}
// Verify counts.
- //TODO: test all types - ROLENAME_SHORT is borked here for example MDL-8249
- $roles = get_assignable_roles($coursecontext, ROLENAME_ALIAS, false, $admin);
- list($rolenames, $rolecounts, $nameswithcounts) = get_assignable_roles($coursecontext, ROLENAME_ALIAS, true, $admin);
- $this->assertEquals($roles, $rolenames);
- foreach ($rolenames as $roleid=>$name) {
- if ($roleid == $teacherrole->id or $roleid == $studentrole->id) {
- $this->assertEquals(1, $rolecounts[$roleid]);
- } else {
- $this->assertEquals(0, $rolecounts[$roleid]);
+ $alltypes = array(ROLENAME_ALIAS, ROLENAME_ALIAS_RAW, ROLENAME_BOTH, ROLENAME_ORIGINAL, ROLENAME_ORIGINALANDSHORT, ROLENAME_SHORT);
+ foreach ($alltypes as $type) {
+ $roles = get_assignable_roles($coursecontext, $type, false, $admin);
+ list($rolenames, $rolecounts, $nameswithcounts) = get_assignable_roles($coursecontext, $type, true, $admin);
+ $this->assertEquals($roles, $rolenames);
+ foreach ($rolenames as $roleid=>$name) {
+ if ($roleid == $teacherrole->id or $roleid == $studentrole->id) {
+ $this->assertEquals(1, $rolecounts[$roleid]);
+ } else {
+ $this->assertEquals(0, $rolecounts[$roleid]);
+ }
+ $this->assertEquals("$name ($rolecounts[$roleid])", $nameswithcounts[$roleid]);
}
- $this->assertEquals("$name ($rolecounts[$roleid])", $nameswithcounts[$roleid]);
}
}
@@ -1043,12 +1019,7 @@ class accesslib_testcase extends advanced_testcase {
if (isset($roles[$roleid])) {
$coursecontext = $context->get_course_context(false);
- if ($coursecontext) {
- $this->assertEquals(role_get_name($role, $coursecontext), $roles[$roleid]);
- } else {
- // TODO: switch to role_get_name() once it supports all contexts and rolename types MDL-8249
- $this->assertEquals($role->name, $roles[$roleid]);
- }
+ $this->assertEquals(role_get_name($role, $coursecontext), $roles[$roleid]);
}
}
}
@@ -1114,8 +1085,7 @@ class accesslib_testcase extends advanced_testcase {
}
if (isset($roles[$roleid])) {
- //TODO: ROLENAME_SHORT borked! MDL-8249
- //$this->assertEquals($role->shortname, $roles[$roleid]);
+ $this->assertEquals($role->shortname, $roles[$roleid]);
}
}
}
@@ -1129,10 +1099,6 @@ class accesslib_testcase extends advanced_testcase {
$alltypes = array(ROLENAME_ALIAS, ROLENAME_ALIAS_RAW, ROLENAME_BOTH, ROLENAME_ORIGINAL, ROLENAME_ORIGINALANDSHORT, ROLENAME_SHORT);
foreach ($alltypes as $type) {
- if ($type == ROLENAME_SHORT or $type == ROLENAME_ORIGINALANDSHORT or $type == ROLENAME_BOTH) {
- // TODO: skip for now, remove after role_fix_names() is fixed and supports all types MDL-8249
- continue;
- }
$rolenames = role_fix_names($allroles, $coursecontext, $type);
$roles = get_overridable_roles($coursecontext, $type, false);
foreach ($roles as $roleid=>$rolename) {
@@ -1229,8 +1195,6 @@ class accesslib_testcase extends advanced_testcase {
$id2 = create_role('New student role', 'student2', 'New student description', 'student');
set_role_contextlevels($id2, array(CONTEXT_COURSE));
- //TODO: add role name alias MDL-8249
-
$allroles = get_all_roles();
$expected = array($id2=>$allroles[$id2]);
@@ -1253,6 +1217,126 @@ class accesslib_testcase extends advanced_testcase {
}
}
+ /**
+ * Test getting of role users.
+ * @return void
+ */
+ public function test_get_role_users() {
+ global $DB;
+
+ $this->resetAfterTest();
+
+ $systemcontext = context_system::instance();
+ $teacherrole = $DB->get_record('role', array('shortname'=>'editingteacher'), '*', MUST_EXIST);
+ $course = $this->getDataGenerator()->create_course();
+ $coursecontext = context_course::instance($course->id);
+ $otherid = create_role('Other role', 'other', 'Some other role', '');
+ $teacherrename = (object)array('roleid'=>$teacherrole->id, 'name'=>'Učitel', 'contextid'=>$coursecontext->id);
+ $DB->insert_record('role_names', $teacherrename);
+ $otherrename = (object)array('roleid'=>$otherid, 'name'=>'Ostatní', 'contextid'=>$coursecontext->id);
+ $DB->insert_record('role_names', $otherrename);
+
+ $user1 = $this->getDataGenerator()->create_user();
+ role_assign($teacherrole->id, $user1->id, $coursecontext->id);
+ $user2 = $this->getDataGenerator()->create_user();
+ role_assign($teacherrole->id, $user2->id, $systemcontext->id);
+
+ $users = get_role_users($teacherrole->id, $coursecontext);
+ $this->assertCount(1, $users);
+ $user = reset($users);
+ $userid = key($users);
+ $this->assertEquals($userid, $user->id);
+ $this->assertEquals($teacherrole->id, $user->roleid);
+ $this->assertEquals($teacherrole->name, $user->rolename);
+ $this->assertEquals($teacherrole->shortname, $user->roleshortname);
+ $this->assertEquals($teacherrename->name, $user->rolecoursealias);
+
+ $users = get_role_users($teacherrole->id, $coursecontext, true);
+ $this->assertCount(2, $users);
+
+ $users = get_role_users($teacherrole->id, $coursecontext, false, 'u.id, u.email, u.idnumber', 'u.idnumber', null, 1, 0, 10, 'u.deleted = 0');
+ }
+
+ /**
+ * Test used role query.
+ * @return void
+ */
+ public function test_get_roles_used_in_context() {
+ global $DB;
+
+ $this->resetAfterTest();
+
+ $systemcontext = context_system::instance();
+ $teacherrole = $DB->get_record('role', array('shortname'=>'editingteacher'), '*', MUST_EXIST);
+ $course = $this->getDataGenerator()->create_course();
+ $coursecontext = context_course::instance($course->id);
+ $otherid = create_role('Other role', 'other', 'Some other role', '');
+ $teacherrename = (object)array('roleid'=>$teacherrole->id, 'name'=>'Učitel', 'contextid'=>$coursecontext->id);
+ $DB->insert_record('role_names', $teacherrename);
+ $otherrename = (object)array('roleid'=>$otherid, 'name'=>'Ostatní', 'contextid'=>$coursecontext->id);
+ $DB->insert_record('role_names', $otherrename);
+
+ $user1 = $this->getDataGenerator()->create_user();
+ role_assign($teacherrole->id, $user1->id, $coursecontext->id);
+
+ $roles = get_roles_used_in_context($coursecontext);
+ $this->assertCount(1, $roles);
+ $role = reset($roles);
+ $roleid = key($roles);
+ $this->assertEquals($roleid, $role->id);
+ $this->assertEquals($teacherrole->id, $role->id);
+ $this->assertEquals($teacherrole->name, $role->name);
+ $this->assertEquals($teacherrole->shortname, $role->shortname);
+ $this->assertEquals($teacherrole->sortorder, $role->sortorder);
+ $this->assertEquals($teacherrename->name, $role->coursealias);
+
+ $user2 = $this->getDataGenerator()->create_user();
+ role_assign($teacherrole->id, $user2->id, $systemcontext->id);
+ role_assign($otherid, $user2->id, $systemcontext->id);
+
+ $roles = get_roles_used_in_context($systemcontext);
+ $this->assertCount(2, $roles);
+ }
+
+ /**
+ * Test roles used in course.
+ * @return void
+ */
+ public function test_get_user_roles_in_course() {
+ global $DB, $CFG;
+
+ $this->resetAfterTest();
+
+ $teacherrole = $DB->get_record('role', array('shortname'=>'editingteacher'), '*', MUST_EXIST);
+ $studentrole = $DB->get_record('role', array('shortname'=>'student'), '*', MUST_EXIST);
+ $course = $this->getDataGenerator()->create_course();
+ $coursecontext = context_course::instance($course->id);
+ $teacherrename = (object)array('roleid'=>$teacherrole->id, 'name'=>'Učitel', 'contextid'=>$coursecontext->id);
+ $DB->insert_record('role_names', $teacherrename);
+
+ $roleids = explode(',', $CFG->profileroles); // should include teacher and student in new installs
+ $this->assertTrue(in_array($teacherrole->id, $roleids));
+ $this->assertTrue(in_array($studentrole->id, $roleids));
+
+ $user1 = $this->getDataGenerator()->create_user();
+ role_assign($teacherrole->id, $user1->id, $coursecontext->id);
+ role_assign($studentrole->id, $user1->id, $coursecontext->id);
+ $user2 = $this->getDataGenerator()->create_user();
+ role_assign($studentrole->id, $user2->id, $coursecontext->id);
+ $user3 = $this->getDataGenerator()->create_user();
+
+ $roles = get_user_roles_in_course($user1->id, $course->id);
+ $this->assertEquals(1, preg_match_all('/,/', $roles));
+ $this->assertTrue(strpos($roles, role_get_name($teacherrole, $coursecontext)) !== false);
+
+ $roles = get_user_roles_in_course($user2->id, $course->id);
+ $this->assertEquals(0, preg_match_all('/,/', $roles));
+ $this->assertTrue(strpos($roles, role_get_name($studentrole, $coursecontext)) !== false);
+
+ $roles = get_user_roles_in_course($user3->id, $course->id);
+ $this->assertSame('', $roles);
+ }
+
/**
* Test has_capability(), has_any_capability() and has_all_capabilities().
*/
diff --git a/mod/url/locallib.php b/mod/url/locallib.php
index c2db0438f3f..f0f8ebe1e92 100644
--- a/mod/url/locallib.php
+++ b/mod/url/locallib.php
@@ -438,10 +438,10 @@ function url_get_variable_options($config) {
);
if ($config->rolesinparams) {
- $roles = get_all_roles();
+ $roles = role_fix_names(get_all_roles());
$roleoptions = array();
foreach ($roles as $role) {
- $roleoptions['course'.$role->shortname] = get_string('yourwordforx', '', $role->name);
+ $roleoptions['course'.$role->shortname] = get_string('yourwordforx', '', $role->localname);
}
$options[get_string('roles')] = $roleoptions;
}
@@ -509,9 +509,8 @@ function url_get_variable_values($url, $cm, $course, $config) {
//hmm, this is pretty fragile and slow, why do we need it here??
if ($config->rolesinparams) {
- $roles = get_all_roles();
$coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
- $roles = role_fix_names($roles, $coursecontext, ROLENAME_ALIAS);
+ $roles = role_fix_names(get_all_roles($coursecontext), $coursecontext, ROLENAME_ALIAS);
foreach ($roles as $role) {
$values['course'.$role->shortname] = $role->localname;
}
diff --git a/report/participation/index.php b/report/participation/index.php
index 50c5b6e6c1c..cd7fd3f19ab 100644
--- a/report/participation/index.php
+++ b/report/participation/index.php
@@ -137,19 +137,11 @@ if (strtotime('-1 year',$now) >= $minlog) {
$timeoptions[strtotime('-1 year',$now)] = get_string('lastyear');
}
-$roleoptions = array();
// TODO: we need a new list of roles that are visible here
-if ($roles = get_roles_used_in_context($context)) {
- foreach ($roles as $r) {
- $roleoptions[$r->id] = $r->name;
- }
-}
+$roles = get_roles_used_in_context($context);
$guestrole = get_guest_role();
-if (empty($roleoptions[$guestrole->id])) {
- $roleoptions[$guestrole->id] = $guestrole->name;
-}
-
-$roleoptions = role_fix_names($roleoptions, $context);
+$roles[$guestrole->id] = $guestrole;
+$roleoptions = role_fix_names($roles, $context, ROLENAME_ALIAS, true);
// print first controls.
echo '