From a75829829d2a7c15ef606392ac6253a7c4883bff Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Thu, 28 Jul 2022 19:05:02 +0100 Subject: [PATCH] MDL-75333 reportbuilder: report audience type for site admins. --- .../classes/reportbuilder/audience/admins.php | 95 ++++++++++++++++ reportbuilder/tests/behat/audience.feature | 12 +++ .../tests/reportbuilder/audience/admins_test.php | 119 +++++++++++++++++++++ 3 files changed, 226 insertions(+) create mode 100644 reportbuilder/classes/reportbuilder/audience/admins.php create mode 100644 reportbuilder/tests/reportbuilder/audience/admins_test.php diff --git a/reportbuilder/classes/reportbuilder/audience/admins.php b/reportbuilder/classes/reportbuilder/audience/admins.php new file mode 100644 index 00000000000..ac03632fd87 --- /dev/null +++ b/reportbuilder/classes/reportbuilder/audience/admins.php @@ -0,0 +1,95 @@ +. + +declare(strict_types=1); + +namespace core_reportbuilder\reportbuilder\audience; + +use MoodleQuickForm; +use core_reportbuilder\local\audiences\base; +use core_reportbuilder\local\helpers\database; + +/** + * Administrators audience type + * + * @package core_reportbuilder + * @copyright 2022 Paul Holden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class admins extends base { + + /** + * Add audience elements to the current form + * + * @param MoodleQuickForm $mform + */ + public function get_config_form(MoodleQuickForm $mform): void { + $mform->addElement('static', 'admins', get_string('siteadministrators', 'core_role')); + } + + /** + * Return SQL to retrieve users that match this audience + * + * @param string $usertablealias + * @return array [$join, $select, $params] + */ + public function get_sql(string $usertablealias): array { + global $CFG, $DB; + + $siteadmins = array_map('intval', explode(',', $CFG->siteadmins)); + [$select, $params] = $DB->get_in_or_equal($siteadmins, SQL_PARAMS_NAMED, database::generate_param_name() . '_'); + + return ['', "{$usertablealias}.id {$select}", $params]; + } + + /** + * Return name of this audience + * + * @return string + */ + public function get_name(): string { + return get_string('siteadministrators', 'core_role'); + } + + /** + * Return description of this audience. + * + * @return string + */ + public function get_description(): string { + $siteadmins = array_map('fullname', get_admins()); + + return $this->format_description_for_multiselect($siteadmins); + } + + /** + * Whether the current user is able to add this audience + * + * @return bool + */ + public function user_can_add(): bool { + return is_siteadmin(); + } + + /** + * Whether the current user is able to edit this audience + * + * @return bool + */ + public function user_can_edit(): bool { + return $this->user_can_add(); + } +} diff --git a/reportbuilder/tests/behat/audience.feature b/reportbuilder/tests/behat/audience.feature index 62a48310b37..4614c95323b 100644 --- a/reportbuilder/tests/behat/audience.feature +++ b/reportbuilder/tests/behat/audience.feature @@ -46,6 +46,18 @@ Feature: Configure access to reports based on intended audience And I click on "My report" "link" in the "My report" "table_row" And I should see "User 1" in the "reportbuilder-table" "table" + Scenario: Configure report audience with administrator audience type + Given I am on the "My report" "reportbuilder > Editor" page logged in as "admin" + And I click on the "Audience" dynamic tab + When I click on "Add audience 'Site administrators'" "link" + And I press "Save changes" + Then I should see "Audience saved" + And I click on the "Access" dynamic tab + And I should see "Admin User" in the "reportbuilder-table" "table" + And I should not see "User 1" in the "reportbuilder-table" "table" + And I should not see "User 2" in the "reportbuilder-table" "table" + And I should not see "User 3" in the "reportbuilder-table" "table" + Scenario: Configure report audience with has system role audience type Given the following "roles" exist: | shortname | name | archetype | diff --git a/reportbuilder/tests/reportbuilder/audience/admins_test.php b/reportbuilder/tests/reportbuilder/audience/admins_test.php new file mode 100644 index 00000000000..0a381f3ebff --- /dev/null +++ b/reportbuilder/tests/reportbuilder/audience/admins_test.php @@ -0,0 +1,119 @@ +. + +declare(strict_types=1); + +namespace core_reportbuilder\reportbuilder\audience; + +use advanced_testcase; +use core_reportbuilder_generator; +use core_user\reportbuilder\datasource\users; + +/** + * Unit tests for the administrators audience type + * + * @package core_reportbuilder + * @covers \core_reportbuilder\reportbuilder\audience\admins + * @copyright 2022 Paul Holden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class admins_test extends advanced_testcase { + + /** + * Test whether user can add this audience + */ + public function test_user_can_add(): void { + $this->resetAfterTest(); + + /** @var core_reportbuilder_generator $generator */ + $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); + $report = $generator->create_report(['name' => 'My report', 'source' => users::class]); + + $audience = admins::create($report->get('id'), []); + $this->assertFalse($audience->user_can_add()); + + // Switch to privileged user. + $this->setAdminUser(); + $this->assertTrue($audience->user_can_add()); + } + + /** + * Test whether user can edit this audience + */ + public function test_user_can_edit(): void { + $this->resetAfterTest(); + + /** @var core_reportbuilder_generator $generator */ + $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); + $report = $generator->create_report(['name' => 'My report', 'source' => users::class]); + + $audience = admins::create($report->get('id'), []); + $this->assertFalse($audience->user_can_edit()); + + // Switch to privileged user. + $this->setAdminUser(); + $this->assertTrue($audience->user_can_edit()); + } + + /** + * Test retrieving audience SQL for matching users + */ + public function test_get_sql(): void { + global $CFG, $DB; + + $this->resetAfterTest(); + + /** @var core_reportbuilder_generator $generator */ + $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); + $report = $generator->create_report(['name' => 'My report', 'source' => users::class]); + + // Create three users, set only the initial two as admins. + $userone = $this->getDataGenerator()->create_user(); + $usertwo = $this->getDataGenerator()->create_user(); + $userthree = $this->getDataGenerator()->create_user(); + + $CFG->siteadmins = "{$userone->id},{$usertwo->id}"; + + $audience = admins::create($report->get('id'), []); + [$join, $select, $params] = $audience->get_sql('u'); + + $users = $DB->get_fieldset_sql("SELECT u.id FROM {user} u {$join} WHERE {$select}", $params); + $this->assertEqualsCanonicalizing([$userone->id, $usertwo->id], $users); + } + + /** + * Test showing audience description + */ + public function test_get_description(): void { + global $CFG; + + $this->resetAfterTest(); + + /** @var core_reportbuilder_generator $generator */ + $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); + $report = $generator->create_report(['name' => 'My report', 'source' => users::class]); + + // Create three users, set only the initial two as admins. + $userone = $this->getDataGenerator()->create_user(); + $usertwo = $this->getDataGenerator()->create_user(); + $userthree = $this->getDataGenerator()->create_user(); + + $CFG->siteadmins = "{$userone->id},{$usertwo->id}"; + + $audience = admins::create($report->get('id'), []); + $this->assertEquals(fullname($userone) . ', ' . fullname($usertwo), $audience->get_description()); + } +} -- 2.11.4.GIT