MDL-73693 reportbuilder: report filter by specific user.

This commit is contained in:
Paul Holden 2022-01-19 21:58:41 +00:00
parent 5500d143f4
commit 9ec385a533
2 changed files with 56 additions and 1 deletions

View file

@ -18,6 +18,8 @@ declare(strict_types=1);
namespace core_reportbuilder\local\filters; namespace core_reportbuilder\local\filters;
use context_system;
use core_user;
use lang_string; use lang_string;
use MoodleQuickForm; use MoodleQuickForm;
use core_reportbuilder\local\helpers\database; use core_reportbuilder\local\helpers\database;
@ -39,6 +41,9 @@ class user extends base {
/** @var int Filter for current user */ /** @var int Filter for current user */
public const USER_CURRENT = 1; public const USER_CURRENT = 1;
/** @var int Filter for selected user */
public const USER_SELECT = 2;
/** /**
* Return an array of operators available for this filter * Return an array of operators available for this filter
* *
@ -48,6 +53,7 @@ class user extends base {
$operators = [ $operators = [
self::USER_ANY => new lang_string('userany', 'core_reportbuilder'), self::USER_ANY => new lang_string('userany', 'core_reportbuilder'),
self::USER_CURRENT => new lang_string('usercurrent', 'core_reportbuilder'), self::USER_CURRENT => new lang_string('usercurrent', 'core_reportbuilder'),
self::USER_SELECT => new lang_string('select'),
]; ];
return $this->filter->restrict_limited_operators($operators); return $this->filter->restrict_limited_operators($operators);
@ -65,6 +71,18 @@ class user extends base {
$mform->setType("{$this->name}_operator", PARAM_INT); $mform->setType("{$this->name}_operator", PARAM_INT);
$mform->setDefault("{$this->name}_operator", self::USER_ANY); $mform->setDefault("{$this->name}_operator", self::USER_ANY);
$options = [
'ajax' => 'core_user/form_user_selector',
'multiple' => true,
'valuehtmlcallback' => static function($userid): string {
$user = core_user::get_user($userid);
return fullname($user, has_capability('moodle/site:viewfullnames', context_system::instance()));
}
];
$mform->addElement('autocomplete', "{$this->name}_value", get_string('user'), [], $options)
->setHiddenLabel(true);
$mform->hideIf("{$this->name}_value", "{$this->name}_operator", 'neq', self::USER_SELECT);
} }
/** /**
@ -74,18 +92,26 @@ class user extends base {
* @return array * @return array
*/ */
public function get_sql_filter(array $values): array { public function get_sql_filter(array $values): array {
global $USER; global $DB, $USER;
$fieldsql = $this->filter->get_field_sql(); $fieldsql = $this->filter->get_field_sql();
$params = $this->filter->get_field_params(); $params = $this->filter->get_field_params();
$operator = $values["{$this->name}_operator"] ?? self::USER_ANY; $operator = $values["{$this->name}_operator"] ?? self::USER_ANY;
$userids = $values["{$this->name}_value"] ?? [];
switch ($operator) { switch ($operator) {
case self::USER_CURRENT: case self::USER_CURRENT:
$paramuserid = database::generate_param_name(); $paramuserid = database::generate_param_name();
$sql = "{$fieldsql} = :{$paramuserid}"; $sql = "{$fieldsql} = :{$paramuserid}";
$params[$paramuserid] = $USER->id; $params[$paramuserid] = $USER->id;
break; break;
case self::USER_SELECT:
$paramuserid = database::generate_param_name();
[$useridselect, $useridparams] = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED, "{$paramuserid}_", true, null);
$sql = "{$fieldsql} {$useridselect}";
$params = array_merge($params, $useridparams);
break;
default: default:
// Invalid or inactive filter. // Invalid or inactive filter.
return ['', []]; return ['', []];

View file

@ -79,4 +79,33 @@ class user_test extends advanced_testcase {
$usernames = $DB->get_fieldset_select('user', 'username', $select, $params); $usernames = $DB->get_fieldset_select('user', 'username', $select, $params);
$this->assertEqualsCanonicalizing($expectedusernames, $usernames); $this->assertEqualsCanonicalizing($expectedusernames, $usernames);
} }
/**
* Test getting filter SQL using specific user selection operator/value
*/
public function test_get_sql_filter_select_user(): void {
global $DB;
$this->resetAfterTest();
$user01 = $this->getDataGenerator()->create_user(['username' => 'user01']);
$user02 = $this->getDataGenerator()->create_user(['username' => 'user02']);
$filter = new filter(
user::class,
'test',
new lang_string('yes'),
'testentity',
'id'
);
// Create instance of our filter, passing given operator/value matching second user.
[$select, $params] = user::create($filter)->get_sql_filter([
$filter->get_unique_identifier() . '_operator' => user::USER_SELECT,
$filter->get_unique_identifier() . '_value' => [$user02->id],
]);
$usernames = $DB->get_fieldset_select('user', 'username', $select, $params);
$this->assertEquals([$user02->username], $usernames);
}
} }