Merge branch 'MDL-37810-master-fix' of https://github.com/snake/moodle
authorJun Pataleta <jun@moodle.com>
Fri, 22 Sep 2017 02:54:40 +0000 (10:54 +0800)
committerJun Pataleta <jun@moodle.com>
Fri, 22 Sep 2017 02:54:40 +0000 (10:54 +0800)
lib/accesslib.php
lib/tests/accesslib_test.php

index 0e15bf9..587a61f 100644 (file)
@@ -2477,18 +2477,21 @@ function get_component_string($component, $contextlevel) {
  * Gets the list of roles assigned to this context and up (parents)
  * from the aggregation of:
  * a) the list of roles that are visible on user profile page and participants page (profileroles setting) and;
- * b) if applicable, those roles the current user can assign in the context.
+ * b) if applicable, those roles that are assigned in the context.
  *
  * @param context $context
  * @return array
  */
 function get_profile_roles(context $context) {
     global $CFG, $DB;
-    // If the current user can assign roles, then they can also see those assignable roles on the profile and participants page,
-    // provided the roles are assigned to at least 1 user in the context.
-    $policyroles = empty($CFG->profileroles) ? [] : array_map('trim', explode(',', $CFG->profileroles));
-    $assignableroles = array_keys(get_assignable_roles($context));
-    $rolesinscope = array_values(array_unique(array_merge($policyroles, $assignableroles)));
+    // If the current user can assign roles, then they can see all roles on the profile and participants page,
+    // provided the roles are assigned to at least 1 user in the context. If not, only the policy-defined roles.
+    if (has_capability('moodle/role:assign', $context)) {
+        $rolesinscope = array_keys(get_all_roles($context));
+    } else {
+        $rolesinscope = empty($CFG->profileroles) ? [] : array_map('trim', explode(',', $CFG->profileroles));
+    }
+
     if (empty($rolesinscope)) {
         return [];
     }
@@ -2557,11 +2560,13 @@ function get_user_roles_in_course($userid, $courseid) {
     } else {
         $context = context_course::instance($courseid);
     }
-    // If the current user can assign roles, then they can also see those assignable roles on the profile and participants page,
-    // provided the roles are assigned to at least 1 user in the context.
-    $policyroles = empty($CFG->profileroles) ? [] : array_map('trim', explode(',', $CFG->profileroles));
-    $assignableroles = array_keys(get_assignable_roles($context));
-    $rolesinscope = array_values(array_unique(array_merge($policyroles, $assignableroles)));
+    // If the current user can assign roles, then they can see all roles on the profile and participants page,
+    // provided the roles are assigned to at least 1 user in the context. If not, only the policy-defined roles.
+    if (has_capability('moodle/role:assign', $context)) {
+        $rolesinscope = array_keys(get_all_roles($context));
+    } else {
+        $rolesinscope = empty($CFG->profileroles) ? [] : array_map('trim', explode(',', $CFG->profileroles));
+    }
     if (empty($rolesinscope)) {
         return '';
     }
index 14375ee..f192822 100644 (file)
@@ -3298,7 +3298,7 @@ class core_accesslib_testcase extends advanced_testcase {
         $this->setUser($user1);
         $this->assertEquals($expectedstudent, get_profile_roles($coursecontext));
 
-        // If we have no roles listed in the site policy, the teacher should only see the student and custom roles.
+        // If we have no roles listed in the site policy, the teacher should be able to see the assigned roles.
         $expectedteacher = [
             $studentrole->id => (object) [
                 'id' => $studentrole->id,
@@ -3313,7 +3313,14 @@ class core_accesslib_testcase extends advanced_testcase {
                 'shortname' => $customrole->shortname,
                 'sortorder' => $customrole->sortorder,
                 'coursealias' => null
-            ]
+            ],
+            $teacherrole->id => (object) [
+                'id' => $teacherrole->id,
+                'name' => '',
+                'shortname' => $teacherrole->shortname,
+                'sortorder' => $teacherrole->sortorder,
+                'coursealias' => null
+            ],
         ];
         set_config('profileroles', "");
         $this->setUser($user2);