From 6a9eadceb69e3c6a157f8b824fdcf2692dddad10 Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Wed, 8 Nov 2023 08:28:37 +0000 Subject: [PATCH] MDL-79998 reportbuilder: user entity method to get identity fields. --- reportbuilder/classes/local/entities/user.php | 27 +++++++++ .../systemreports/report_access_list.php | 27 +++++---- .../tests/local/entities/user_test.php | 59 +++++++++++++++++++ reportbuilder/upgrade.txt | 1 + 4 files changed, 101 insertions(+), 13 deletions(-) diff --git a/reportbuilder/classes/local/entities/user.php b/reportbuilder/classes/local/entities/user.php index 4e26f92d439..5b7c3299a04 100644 --- a/reportbuilder/classes/local/entities/user.php +++ b/reportbuilder/classes/local/entities/user.php @@ -21,6 +21,7 @@ namespace core_reportbuilder\local\entities; use context_helper; use context_system; use context_user; +use core\context; use core_component; use html_writer; use lang_string; @@ -123,6 +124,19 @@ class user extends base { return $this->get_column($identityfield); } + /** + * Returns columns that correspond to the site configured identity fields + * + * @param context $context + * @param string[] $excluding + * @return column[] + */ + public function get_identity_columns(context $context, array $excluding = []): array { + $identityfields = fields::for_identity($context)->excluding(...$excluding)->get_required_fields(); + + return array_map([$this, 'get_identity_column'], $identityfields); + } + /** * Returns filter that corresponds to the given identity field, profile field identifiers will be converted to those * used by the {@see user_profile_fields} helper @@ -138,6 +152,19 @@ class user extends base { return $this->get_filter($identityfield); } + /** + * Returns filters that correspond to the site configured identity fields + * + * @param context $context + * @param string[] $excluding + * @return filter[] + */ + public function get_identity_filters(context $context, array $excluding = []): array { + $identityfields = fields::for_identity($context)->excluding(...$excluding)->get_required_fields(); + + return array_map([$this, 'get_identity_filter'], $identityfields); + } + /** * Return joins necessary for retrieving tags * diff --git a/reportbuilder/classes/local/systemreports/report_access_list.php b/reportbuilder/classes/local/systemreports/report_access_list.php index a8c2cace3b0..a1c869eb103 100644 --- a/reportbuilder/classes/local/systemreports/report_access_list.php +++ b/reportbuilder/classes/local/systemreports/report_access_list.php @@ -24,7 +24,6 @@ use core_reportbuilder\permission; use core_reportbuilder\system_report; use core_reportbuilder\local\entities\user; use core_reportbuilder\local\helpers\audience as audience_helper; -use core_user\fields; /** * Report access list @@ -58,8 +57,8 @@ class report_access_list extends system_report { $this->add_base_condition_sql("($allwheres)", $params); - $this->add_columns(); - $this->add_filters(); + $this->add_columns($userentity); + $this->add_filters($userentity); $this->set_downloadable(false); } @@ -78,15 +77,16 @@ class report_access_list extends system_report { /** * Add columns to report + * + * @param user $userentity */ - protected function add_columns(): void { - $userentity = $this->get_entity('user'); + protected function add_columns(user $userentity): void { $this->add_column($userentity->get_column('fullnamewithpicturelink')); // Include all identity field columns. - $identityfields = fields::for_identity($this->get_context(), true)->get_required_fields(); - foreach ($identityfields as $identityfield) { - $this->add_column($userentity->get_identity_column($identityfield)); + $identitycolumns = $userentity->get_identity_columns($this->get_context()); + foreach ($identitycolumns as $identitycolumn) { + $this->add_column($identitycolumn); } $this->set_initial_sort_column('user:fullnamewithpicturelink', SORT_ASC); @@ -94,15 +94,16 @@ class report_access_list extends system_report { /** * Add filters to report + * + * @param user $userentity */ - protected function add_filters(): void { - $userentity = $this->get_entity('user'); + protected function add_filters(user $userentity): void { $this->add_filter($userentity->get_filter('fullname')); // Include all identity field filters. - $identityfields = fields::for_identity($this->get_context(), true)->get_required_fields(); - foreach ($identityfields as $identityfield) { - $this->add_filter($userentity->get_identity_filter($identityfield)); + $identityfilters = $userentity->get_identity_filters($this->get_context()); + foreach ($identityfilters as $identityfilter) { + $this->add_filter($identityfilter); } } diff --git a/reportbuilder/tests/local/entities/user_test.php b/reportbuilder/tests/local/entities/user_test.php index c6a10beb5e3..b2157f3fafe 100644 --- a/reportbuilder/tests/local/entities/user_test.php +++ b/reportbuilder/tests/local/entities/user_test.php @@ -19,6 +19,7 @@ declare(strict_types=1); namespace core_reportbuilder\local\entities; use advanced_testcase; +use core\context\system; /** * Unit tests for user entity @@ -48,6 +49,35 @@ class user_test extends advanced_testcase { $this->assertEquals('user:profilefield_hi', $columnprofilefield->get_unique_identifier()); } + /** + * Test getting all user identity columns + */ + public function test_get_identity_columns() : void { + $this->resetAfterTest(); + $this->setAdminUser(); + + $this->getDataGenerator()->create_custom_profile_field(['datatype' => 'text', 'name' => 'Hi', 'shortname' => 'hi']); + set_config('showuseridentity', 'username,profilefield_hi'); + $context = system::instance(); + + $user = new user(); + $user->initialise(); + + // All columns. + $this->assertEqualsCanonicalizing([ + 'user:username', + 'user:profilefield_hi', + ], array_map( + fn($column) => $column->get_unique_identifier(), + $user->get_identity_columns($context), + )); + + // Exclude username. + $columns = $user->get_identity_columns($context, ['username']); + $this->assertCount(1, $columns); + $this->assertEquals('user:profilefield_hi', reset($columns)->get_unique_identifier()); + } + /** * Test getting user identity filter */ @@ -66,6 +96,35 @@ class user_test extends advanced_testcase { $this->assertEquals('user:profilefield_hi', $filterprofilefield->get_unique_identifier()); } + /** + * Test getting all user identity filters + */ + public function test_get_identity_filters() : void { + $this->resetAfterTest(); + $this->setAdminUser(); + + $this->getDataGenerator()->create_custom_profile_field(['datatype' => 'text', 'name' => 'Hi', 'shortname' => 'hi']); + set_config('showuseridentity', 'username,profilefield_hi'); + $context = system::instance(); + + $user = new user(); + $user->initialise(); + + // All filters. + $this->assertEqualsCanonicalizing([ + 'user:username', + 'user:profilefield_hi', + ], array_map( + fn($filter) => $filter->get_unique_identifier(), + $user->get_identity_columns($context), + )); + + // Exclude username. + $filters = $user->get_identity_filters($context, ['username']); + $this->assertCount(1, $filters); + $this->assertEquals('user:profilefield_hi', reset($filters)->get_unique_identifier()); + } + /** * Data provider for {@see test_get_name_fields_select} * diff --git a/reportbuilder/upgrade.txt b/reportbuilder/upgrade.txt index 415a027a209..9faab48d53b 100644 --- a/reportbuilder/upgrade.txt +++ b/reportbuilder/upgrade.txt @@ -3,6 +3,7 @@ Information provided here is intended especially for developers. === 4.4 === +* New methods `get_identity_[columns|filters]` in user entity, for retrieving all user identity field report elements * The database helper `generate_alias[es]` and `generate_param_name[s]` methods now accept an optional `$suffix` argument for appending additional string to the generated value