This commit is contained in:
Ilya Tregubov
2023-11-30 09:30:57 +08:00
4 changed files with 101 additions and 13 deletions
@@ -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
*
@@ -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);
}
}
@@ -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}
*
+1
View File
@@ -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