diff --git a/admin/tool/capability/renderer.php b/admin/tool/capability/renderer.php index 427613ef159..7ca6926182f 100644 --- a/admin/tool/capability/renderer.php +++ b/admin/tool/capability/renderer.php @@ -93,6 +93,7 @@ class tool_capability_renderer extends plugin_renderer_base { } $table->data = array(); + $childcontextsids = []; foreach ($capabilities as $capability) { if (empty($capabilitycontexts[$capability])) { $capabilitycontexts[$capability] = tool_capability_calculate_role_data($capability, $roles); @@ -116,6 +117,10 @@ class tool_capability_renderer extends plugin_renderer_base { } $table->data[] = $row; + if (!empty($contexts[$contextid]->children)) { + $childcontextsids = array_merge($childcontextsids, $contexts[$contextid]->children); + $childcontextsids = array_unique($childcontextsids); + } } // Start the list item, and print the context name as a link to the place to make changes. @@ -132,9 +137,9 @@ class tool_capability_renderer extends plugin_renderer_base { $html = $this->output->heading(html_writer::link($url, $context->get_context_name(), ['title' => $title]), 3); $html .= html_writer::table($table); // If there are any child contexts, print them recursively. - if (!empty($contexts[$contextid]->children)) { - foreach ($contexts[$contextid]->children as $childcontextid) { - $html .= $this->capability_comparison_table($capabilities, $childcontextid, $roles, true); + if (!empty($childcontextsids)) { + foreach ($childcontextsids as $childcontextid) { + $html .= $this->capability_comparison_table($capabilities, $childcontextid, $roles); } } return $html; diff --git a/admin/tool/capability/tests/behat/show_contexts.feature b/admin/tool/capability/tests/behat/show_contexts.feature new file mode 100644 index 00000000000..ea0cc294c4f --- /dev/null +++ b/admin/tool/capability/tests/behat/show_contexts.feature @@ -0,0 +1,97 @@ +@tool @tool_capability +Feature: Show capabilities for multiple contexts + In order to check roles capabilities + As an admin + I need to be able to see capability overrides on several contexts + + Background: + And the following "courses" exist: + | fullname | shortname | category | + | Course 1 | C1 | 0 | + | Course 2 | C2 | 0 | + And the following "permission overrides" exist: + | capability | permission | role | contextlevel | reference | + | enrol/category:config | Allow | student | Course | C1 | + | enrol/cohort:unenrol | Allow | student | Course | C2 | + And I log in as "admin" + And I navigate to "Users > Permissions > Capability overview" in site administration + + Scenario: Show capabilities table with one capability with overrides + When I set the following fields to these values: + | Capability: | enrol/category:config | + | Roles: | Student | + And I click on "Get the overview" "button" + Then I should see "System" + And I should see "Category: Miscellaneous" + And I should see "Course: Course 1" + And I should not see "Course: Course 2" + + Scenario: Show capabilities table with one capability without overrides + When I set the following fields to these values: + | Capability: | enrol/cohort:config | + | Roles: | Student | + And I click on "Get the overview" "button" + Then I should see "System" + And I should not see "Category: Miscellaneous" + And I should not see "Course: Course 1" + And I should not see "Course: Course 2" + + Scenario: Show capabilities table with two capabilities, 1st without overrides and 2nd with + When I set the following fields to these values: + | Capability: | enrol/category:synchronised, enrol/category:config | + | Roles: | Student | + And I click on "Get the overview" "button" + Then I should see "System" + And I should see "Category: Miscellaneous" + And I should see "Course: Course 1" + And I should not see "Course: Course 2" + + Scenario: Show capabilities table with two capabilities, 1st with overrides and 2nd without + When I set the following fields to these values: + | Capability: | enrol/category:config, enrol/cohort:config | + | Roles: | Student | + And I click on "Get the overview" "button" + Then I should see "System" + And I should see "Category: Miscellaneous" + And I should see "Course: Course 1" + And I should not see "Course: Course 2" + + Scenario: Show capabilities table with two capabilities, none with overrides + When I set the following fields to these values: + | Capability: | enrol/category:synchronised, enrol/cohort:config | + | Roles: | Student | + And I click on "Get the overview" "button" + Then I should see "System" + And I should not see "Category: Miscellaneous" + And I should not see "Course: Course 1" + And I should not see "Course: Course 2" + + Scenario: Show capabilities table with capability with override and no role selected + When I set the following fields to these values: + | Capability: | enrol/category:config | + | Roles: | | + And I click on "Get the overview" "button" + Then I should see "System" + And I should see "Category: Miscellaneous" + And I should see "Course: Course 1" + And I should not see "Course: Course 2" + + Scenario: Show capabilities table with capability without override and no role selected + When I set the following fields to these values: + | Capability: | enrol/cohort:config | + | Roles: | | + And I click on "Get the overview" "button" + Then I should see "System" + And I should not see "Category: Miscellaneous" + And I should not see "Course: Course 1" + And I should not see "Course: Course 2" + + Scenario: Show capabilities table with capability with two overrides on different contexts + When I set the following fields to these values: + | Capability: | enrol/category:config, enrol/cohort:unenrol | + | Roles: | | + And I click on "Get the overview" "button" + Then I should see "System" + And I should see "Category: Miscellaneous" + And I should see "Course: Course 1" + And I should see "Course: Course 2"