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['movecondition'] = 'Move condition \'{$a}\'';
$string['movefilter'] = 'Move filter \'{$a}\''; $string['movefilter'] = 'Move filter \'{$a}\'';
$string['movesorting'] = 'Move sorting for column \'{$a}\''; $string['movesorting'] = 'Move sorting for column \'{$a}\'';
$string['neveraccessed'] = 'Never accessed';
$string['newreport'] = 'New report'; $string['newreport'] = 'New report';
$string['newschedule'] = 'New schedule'; $string['newschedule'] = 'New schedule';
$string['noaudiences'] = 'There are no audiences for this report'; $string['noaudiences'] = 'There are no audiences for this report';

View file

@ -419,6 +419,7 @@ class user extends base {
'phone1' => new lang_string('phone1'), 'phone1' => new lang_string('phone1'),
'phone2' => new lang_string('phone2'), 'phone2' => new lang_string('phone2'),
'address' => new lang_string('address'), 'address' => new lang_string('address'),
'firstaccess' => new lang_string('firstaccess'),
'lastaccess' => new lang_string('lastaccess'), 'lastaccess' => new lang_string('lastaccess'),
'suspended' => new lang_string('suspended'), 'suspended' => new lang_string('suspended'),
'confirmed' => new lang_string('confirmed', 'admin'), 'confirmed' => new lang_string('confirmed', 'admin'),
@ -446,6 +447,7 @@ class user extends base {
case 'suspended': case 'suspended':
$fieldtype = column::TYPE_BOOLEAN; $fieldtype = column::TYPE_BOOLEAN;
break; break;
case 'firstaccess':
case 'lastaccess': case 'lastaccess':
case 'timecreated': case 'timecreated':
case 'timemodified': case 'timemodified':
@ -521,6 +523,16 @@ class user extends base {
$filters[] = $filter; $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. // User select filter.
$filters[] = (new filter( $filters[] = (new filter(
user_filter::class, 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:phone1']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:phone2']); $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: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:lastaccess']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:suspended']); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:suspended']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:confirmed']); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:confirmed']);
@ -162,6 +163,7 @@ final class users_test extends core_reportbuilder_testcase {
$phone1, $phone1,
$phone2, $phone2,
$address, $address,
$firstaccess,
$lastaccess, $lastaccess,
$suspended, $suspended,
$confirmed, $confirmed,
@ -196,6 +198,7 @@ final class users_test extends core_reportbuilder_testcase {
$this->assertEquals($user->phone1, $phone1); $this->assertEquals($user->phone1, $phone1);
$this->assertEquals($user->phone2, $phone2); $this->assertEquals($user->phone2, $phone2);
$this->assertEquals($user->address, $address); $this->assertEquals($user->address, $address);
$this->assertEmpty($firstaccess);
$this->assertEmpty($lastaccess); $this->assertEmpty($lastaccess);
$this->assertEquals('No', $suspended); $this->assertEquals('No', $suspended);
$this->assertEquals('Yes', $confirmed); $this->assertEquals('Yes', $confirmed);
@ -490,6 +493,14 @@ final class users_test extends core_reportbuilder_testcase {
'user:timemodified_operator' => date::DATE_RANGE, 'user:timemodified_operator' => date::DATE_RANGE,
'user:timemodified_to' => 1622502000, 'user:timemodified_to' => 1622502000,
], false], ], 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', [ 'Filter lastaccess' => ['user:lastaccess', [
'user:lastaccess_operator' => date::DATE_EMPTY, 'user:lastaccess_operator' => date::DATE_EMPTY,
], true], ], true],
@ -498,6 +509,12 @@ final class users_test extends core_reportbuilder_testcase {
'user:lastaccess_from' => 1619823600, 'user:lastaccess_from' => 1619823600,
'user:lastaccess_to' => 1622502000, 'user:lastaccess_to' => 1622502000,
], false], ], 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', [ 'Filter lastip' => ['user:lastip', [
'user:lastip_operator' => text::IS_EQUAL_TO, 'user:lastip_operator' => text::IS_EQUAL_TO,
'user:lastip_value' => '0.0.0.0', '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); $content = $this->get_custom_report_content($report->get('id'), 0, $filtervalues);
if ($expectmatch) { if ($expectmatch) {
$this->assertNotEmpty($content);
// Merge report usernames into easily traversable array. // Merge report usernames into easily traversable array.
$usernames = array_merge(...array_map('array_values', $content)); $usernames = array_merge(...array_map('array_values', $content));
$this->assertContains($user->username, $usernames); $this->assertContains($user->username, $usernames);