MDL-85462 reportbuilder: improve user entity last access reporting.

Include filter/condition for "never accessed".
This commit is contained in:
Paul Holden 2025-05-12 09:20:50 +01:00
parent d65e24a62c
commit 6a26479909
No known key found for this signature in database
GPG key ID: A81A96D6045F6164
3 changed files with 30 additions and 2 deletions

View file

@ -178,6 +178,7 @@ $string['movecolumn'] = 'Move column \'{$a}\'';
$string['movecondition'] = 'Move condition \'{$a}\'';
$string['movefilter'] = 'Move filter \'{$a}\'';
$string['movesorting'] = 'Move sorting for column \'{$a}\'';
$string['neveraccessed'] = 'Never accessed';
$string['newreport'] = 'New report';
$string['newschedule'] = 'New schedule';
$string['noaudiences'] = 'There are no audiences for this report';

View file

@ -419,6 +419,7 @@ class user extends base {
'phone1' => new lang_string('phone1'),
'phone2' => new lang_string('phone2'),
'address' => new lang_string('address'),
'firstaccess' => new lang_string('firstaccess'),
'lastaccess' => new lang_string('lastaccess'),
'suspended' => new lang_string('suspended'),
'confirmed' => new lang_string('confirmed', 'admin'),
@ -446,6 +447,7 @@ class user extends base {
case 'suspended':
$fieldtype = column::TYPE_BOOLEAN;
break;
case 'firstaccess':
case 'lastaccess':
case 'timecreated':
case 'timemodified':
@ -521,6 +523,16 @@ class user extends base {
$filters[] = $filter;
}
// Never accessed filter.
$filters[] = (new filter(
boolean_select::class,
'neveraccessed',
new lang_string('neveraccessed', 'core_reportbuilder'),
$this->get_entity_name(),
"CASE WHEN {$tablealias}.firstaccess = {$tablealias}.lastaccess OR {$tablealias}.lastaccess = 0 THEN 1 ELSE 0 END",
))
->add_joins($this->get_joins());
// User select filter.
$filters[] = (new filter(
user_filter::class,

View file

@ -103,6 +103,7 @@ final class users_test extends core_reportbuilder_testcase {
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:phone1']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:phone2']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:address']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:firstaccess']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:lastaccess']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:suspended']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:confirmed']);
@ -162,6 +163,7 @@ final class users_test extends core_reportbuilder_testcase {
$phone1,
$phone2,
$address,
$firstaccess,
$lastaccess,
$suspended,
$confirmed,
@ -196,6 +198,7 @@ final class users_test extends core_reportbuilder_testcase {
$this->assertEquals($user->phone1, $phone1);
$this->assertEquals($user->phone2, $phone2);
$this->assertEquals($user->address, $address);
$this->assertEmpty($firstaccess);
$this->assertEmpty($lastaccess);
$this->assertEquals('No', $suspended);
$this->assertEquals('Yes', $confirmed);
@ -490,6 +493,14 @@ final class users_test extends core_reportbuilder_testcase {
'user:timemodified_operator' => date::DATE_RANGE,
'user:timemodified_to' => 1622502000,
], false],
'Filter firstaccess' => ['user:firstaccess', [
'user:firstaccess_operator' => date::DATE_EMPTY,
], true],
'Filter firstaccess (no match)' => ['user:firstaccess', [
'user:firstaccess_operator' => date::DATE_RANGE,
'user:firstaccess_from' => 1619823600,
'user:firstaccess_to' => 1622502000,
], false],
'Filter lastaccess' => ['user:lastaccess', [
'user:lastaccess_operator' => date::DATE_EMPTY,
], true],
@ -498,6 +509,12 @@ final class users_test extends core_reportbuilder_testcase {
'user:lastaccess_from' => 1619823600,
'user:lastaccess_to' => 1622502000,
], false],
'Filter neveraccessed' => ['user:neveraccessed', [
'user:neveraccessed_operator' => boolean_select::CHECKED,
], true],
'Filter neveraccessed (no match)' => ['user:neveraccessed', [
'user:neveraccessed_operator' => boolean_select::NOT_CHECKED,
], false],
'Filter lastip' => ['user:lastip', [
'user:lastip_operator' => text::IS_EQUAL_TO,
'user:lastip_value' => '0.0.0.0',
@ -581,8 +598,6 @@ final class users_test extends core_reportbuilder_testcase {
$content = $this->get_custom_report_content($report->get('id'), 0, $filtervalues);
if ($expectmatch) {
$this->assertNotEmpty($content);
// Merge report usernames into easily traversable array.
$usernames = array_merge(...array_map('array_values', $content));
$this->assertContains($user->username, $usernames);