From 2f9001cbe95d520662dd05b17c91be189b050847 Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Mon, 4 Mar 2024 22:53:33 +0000 Subject: [PATCH] MDL-81073 badges: implement badge entity version/expiry filtering. Add the same to the manage badges report, plus pre-existing version column. --- .../reportbuilder/local/entities/badge.php | 37 ++++++++++++++++++- .../local/systemreports/badges.php | 3 ++ badges/tests/behat/manage_badges.feature | 36 ++++++++++++++---- .../reportbuilder/datasource/badges_test.php | 17 +++++++++ 4 files changed, 85 insertions(+), 8 deletions(-) diff --git a/badges/classes/reportbuilder/local/entities/badge.php b/badges/classes/reportbuilder/local/entities/badge.php index 820a5c2ffcb..b795d660c74 100644 --- a/badges/classes/reportbuilder/local/entities/badge.php +++ b/badges/classes/reportbuilder/local/entities/badge.php @@ -26,7 +26,8 @@ use lang_string; use moodle_url; use stdClass; use core_reportbuilder\local\entities\base; -use core_reportbuilder\local\filters\{select, text}; +use core_reportbuilder\local\filters\{date, select, text}; +use core_reportbuilder\local\helpers\database; use core_reportbuilder\local\report\{column, filter}; defined('MOODLE_INTERNAL') or die; @@ -295,6 +296,16 @@ class badge extends base { )) ->add_joins($this->get_joins()); + // Version. + $filters[] = (new filter( + text::class, + 'version', + new lang_string('version', 'core_badges'), + $this->get_entity_name(), + "{$badgealias}.version" + )) + ->add_joins($this->get_joins()); + // Status. $filters[] = (new filter( select::class, @@ -312,6 +323,30 @@ class badge extends base { BADGE_STATUS_ARCHIVED => new lang_string('badgestatus_4', 'core_badges'), ]); + // Expiry date/period. + [$parammaxint, $paramtime] = database::generate_param_names(2); + $filters[] = (new filter( + date::class, + 'expiry', + new lang_string('expirydate', 'core_badges'), + $this->get_entity_name(), + "CASE + WHEN {$badgealias}.expiredate IS NULL AND {$badgealias}.expireperiod IS NULL THEN :{$parammaxint} + ELSE COALESCE({$badgealias}.expiredate, {$badgealias}.expireperiod + :{$paramtime}) + END", + [$parammaxint => 2147483647, $paramtime => time()] + )) + ->add_joins($this->get_joins()) + ->set_limited_operators([ + date::DATE_ANY, + date::DATE_RANGE, + date::DATE_LAST, + date::DATE_CURRENT, + date::DATE_NEXT, + date::DATE_PAST, + date::DATE_FUTURE, + ]); + // Type. $filters[] = (new filter( select::class, diff --git a/badges/classes/reportbuilder/local/systemreports/badges.php b/badges/classes/reportbuilder/local/systemreports/badges.php index 29ffda2c249..305cf840da2 100644 --- a/badges/classes/reportbuilder/local/systemreports/badges.php +++ b/badges/classes/reportbuilder/local/systemreports/badges.php @@ -108,6 +108,7 @@ class badges extends system_report { $columns = [ 'badge:image', 'badge:namewithlink', + 'badge:version', 'badge:status', 'badge:criteria', ]; @@ -148,7 +149,9 @@ class badges extends system_report { protected function add_filters(): void { $filters = [ 'badge:name', + 'badge:version', 'badge:status', + 'badge:expiry', ]; $this->add_filters_from_entities($filters); } diff --git a/badges/tests/behat/manage_badges.feature b/badges/tests/behat/manage_badges.feature index c06fabc29ce..5be302b2d7b 100644 --- a/badges/tests/behat/manage_badges.feature +++ b/badges/tests/behat/manage_badges.feature @@ -8,7 +8,7 @@ Feature: Manage badges Given the following "core_badges > Badge" exists: | name | Badge #1 | | status | 0 | - | version | 1 | + | version | 1.0 | | language | en | | description | Test badge description | | image | badges/tests/behat/badge.png | @@ -23,20 +23,22 @@ Feature: Manage badges And I press "Save changes" And I click on "Back" "button" Then the following should exist in the "reportbuilder-table" table: - | Name | Badge status | - | Badge #1 | Not available | - | Copy of Badge #1 | Not available | + | Name | Version | Badge status | + | Badge #1 | 1.0 | Not available | + | Copy of Badge #1 | 1.0 | Not available | Scenario: Edit a badge Given I log in as "admin" And I navigate to "Badges > Manage badges" in site administration And I press "Edit" action in the "Badge #1" report row - And I set the field "Name" to "New Badge #1" + And I set the following fields to these values: + | Name | New Badge #1 | + | Version | 1.1 | And I press "Save changes" And I click on "Back" "button" Then the following should exist in the "reportbuilder-table" table: - | Name | Badge status | - | New Badge #1 | Not available | + | Name | Version | Badge status | + | New Badge #1 | 1.1 | Not available | Scenario: Delete a badge Given I log in as "admin" @@ -45,6 +47,26 @@ Feature: Manage badges And I press "Delete and remove existing issued badges" Then I should see "There are currently no badges available for users to earn" + Scenario Outline: Filter managed badges + Given the following "core_badges > Badges" exist: + | name | status | version | + | Badge #2 | 1 | 2.0 | + And I log in as "admin" + When I navigate to "Badges > Manage badges" in site administration + And I click on "Filters" "button" + And I set the following fields in the "" "core_reportbuilder > Filter" to these values: + | operator | Is equal to | + | value | | + And I click on "Apply" "button" in the "[data-region='report-filters']" "css_element" + Then I should see "Filters applied" + And I should see "Badge #1" in the "Badges" "table" + And I should not see "Badge #2" in the "Badges" "table" + Examples: + | filter | value | + | Name | Badge #1 | + | Version | 1.0 | + | Badge status | Not available | + Scenario: Enable and disable access to a badge Given I log in as "admin" And I navigate to "Badges > Manage badges" in site administration diff --git a/badges/tests/reportbuilder/datasource/badges_test.php b/badges/tests/reportbuilder/datasource/badges_test.php index 64881fdd89f..03f90ff3b3f 100644 --- a/badges/tests/reportbuilder/datasource/badges_test.php +++ b/badges/tests/reportbuilder/datasource/badges_test.php @@ -216,6 +216,14 @@ class badges_test extends core_reportbuilder_testcase { 'badge:name_operator' => text::IS_EQUAL_TO, 'badge:name_value' => 'Other badge', ], false], + 'Filter badge version' => ['badge:version', [ + 'badge:version_operator' => text::IS_EQUAL_TO, + 'badge:version_value' => '2.0', + ], true], + 'Filter badge version (no match)' => ['badge:version', [ + 'badge:version_operator' => text::IS_EQUAL_TO, + 'badge:version_value' => '1.0', + ], false], 'Filter badge status' => ['badge:status', [ 'badge:status_operator' => select::EQUAL_TO, 'badge:status_value' => BADGE_STATUS_ACTIVE_LOCKED, @@ -224,6 +232,14 @@ class badges_test extends core_reportbuilder_testcase { 'badge:status_operator' => select::EQUAL_TO, 'badge:status_value' => BADGE_STATUS_ACTIVE, ], false], + 'Filter badge expiry' => ['badge:expiry', [ + 'badge:expiry_operator' => date::DATE_RANGE, + 'badge:expiry_from' => 1622502000, + ], true], + 'Filter badge expiry (no match)' => ['badge:expiry', [ + 'badge:expiry_operator' => date::DATE_RANGE, + 'badge:expiry_to' => 1622502000, + ], false], 'Filter badge type' => ['badge:type', [ 'badge:type_operator' => select::EQUAL_TO, 'badge:type_value' => BADGE_TYPE_COURSE, @@ -307,6 +323,7 @@ class badges_test extends core_reportbuilder_testcase { $generator = $this->getDataGenerator()->get_plugin_generator('core_badges'); $badge = $generator->create_badge([ 'name' => 'Course badge', + 'version' => '2.0', 'type' => BADGE_TYPE_COURSE, 'courseid' => $course->id, 'expireperiod' => HOURSECS,