This commit is contained in:
Sara Arjona 2024-08-19 16:45:51 +02:00
commit 78530eca1c
No known key found for this signature in database
2 changed files with 49 additions and 18 deletions

View file

@ -20,10 +20,10 @@ namespace core_badges\reportbuilder\local\systemreports;
use core\context\{course, system}; use core\context\{course, system};
use core_badges\reportbuilder\local\entities\badge; use core_badges\reportbuilder\local\entities\badge;
use core_reportbuilder\local\entities\user;
use core_reportbuilder\local\helpers\database; use core_reportbuilder\local\helpers\database;
use core_reportbuilder\local\report\{action, column}; use core_reportbuilder\local\report\{action, column};
use core_reportbuilder\system_report; use core_reportbuilder\system_report;
use html_writer;
use lang_string; use lang_string;
use moodle_url; use moodle_url;
use pix_icon; use pix_icon;
@ -43,6 +43,9 @@ require_once("{$CFG->libdir}/badgeslib.php");
*/ */
class badges extends system_report { class badges extends system_report {
/** @var int $badgeid The ID of the current badge row */
private int $badgeid;
/** /**
* Initialise report, we need to set the main table, load our entities and set columns/filters * Initialise report, we need to set the main table, load our entities and set columns/filters
*/ */
@ -54,15 +57,6 @@ class badges extends system_report {
$this->set_main_table('badge', $entityalias); $this->set_main_table('badge', $entityalias);
$this->add_entity($badgeentity); $this->add_entity($badgeentity);
// Join user entity.
$userentity = new user();
$useralias = $userentity->get_table_alias('user');
$badgeissuedalias = database::generate_alias();
$this->add_entity($userentity->add_joins([
"LEFT JOIN {badge_issued} {$badgeissuedalias} ON {$badgeissuedalias}.badgeid = {$entityalias}.id",
"LEFT JOIN {user} {$useralias} ON {$useralias}.id = {$badgeissuedalias}.userid AND {$useralias}.deleted = 0",
]));
$paramtype = database::generate_param_name(); $paramtype = database::generate_param_name();
$context = $this->get_context(); $context = $this->get_context();
if ($context instanceof system) { if ($context instanceof system) {
@ -113,19 +107,39 @@ class badges extends system_report {
* unique identifier. If custom columns are needed just for this report, they can be defined here. * unique identifier. If custom columns are needed just for this report, they can be defined here.
*/ */
protected function add_columns(): void { protected function add_columns(): void {
$badgeentity = $this->get_entity('badge');
$this->add_columns_from_entities([ $this->add_columns_from_entities([
'badge:image', 'badge:image',
'badge:namewithlink', 'badge:namewithlink',
'badge:version', 'badge:version',
'badge:status', 'badge:status',
'badge:criteria', 'badge:criteria',
'user:username',
]); ]);
// Issued badges column. // Issued badges column.
$this->get_column('user:username') $tempbadgealias = database::generate_alias();
->set_title(new lang_string('awards', 'core_badges')) $badgeentityalias = $badgeentity->get_table_alias('badge');
->set_aggregation('count'); $this->add_column((new column(
'issued',
new lang_string('awards', 'core_badges'),
$badgeentity->get_entity_name()
))
->add_joins($this->get_joins())
->set_type(column::TYPE_INTEGER)
->add_field("(SELECT COUNT({$tempbadgealias}.userid)
FROM {badge_issued} {$tempbadgealias}
INNER JOIN {user} u
ON {$tempbadgealias}.userid = u.id
WHERE {$tempbadgealias}.badgeid = {$badgeentityalias}.id AND u.deleted = 0)", 'issued')
->set_is_sortable(true)
->set_callback(function(int $count): string {
if (!has_capability('moodle/badges:viewawarded', $this->get_context())) {
return (string) $count;
}
return html_writer::link(new moodle_url('/badges/recipients.php', ['id' => $this->badgeid]), $count);
}));
// Remove title from image column. // Remove title from image column.
$this->get_column('badge:image')->set_title(null); $this->get_column('badge:image')->set_title(null);
@ -282,6 +296,15 @@ class badges extends system_report {
} }
} }
/**
* Store the ID of the badge within each row
*
* @param stdClass $row
*/
public function row_callback(stdClass $row): void {
$this->badgeid = (int) $row->id;
}
/** /**
* CSS classes to add to the row * CSS classes to add to the row
* *

View file

@ -90,7 +90,10 @@ Feature: Manage badges
| Badge #1 | Not available | | Badge #1 | Not available |
Scenario: Award a badge Scenario: Award a badge
Given I log in as "admin" Given the following "users" exist:
| username | firstname | lastname | email |
| user1 | User | One | user1@example.com |
When I log in as "admin"
And I navigate to "Badges > Manage badges" in site administration And I navigate to "Badges > Manage badges" in site administration
And I press "Edit" action in the "Badge #1" report row And I press "Edit" action in the "Badge #1" report row
And I select "Criteria" from the "jump" singleselect And I select "Criteria" from the "jump" singleselect
@ -101,12 +104,17 @@ Feature: Manage badges
And I press "Enable access" action in the "Badge #1" report row And I press "Enable access" action in the "Badge #1" report row
And I click on "Enable" "button" in the "Confirm" "dialogue" And I click on "Enable" "button" in the "Confirm" "dialogue"
And I press "Award badge" action in the "Badge #1" report row And I press "Award badge" action in the "Badge #1" report row
And I set the field "potentialrecipients[]" to "Admin User (moodle@example.com)" And I set the field "potentialrecipients[]" to "Admin User (moodle@example.com),User One (user1@example.com)"
And I press "Award badge" And I press "Award badge"
And I navigate to "Badges > Manage badges" in site administration And I navigate to "Badges > Manage badges" in site administration
Then the following should exist in the "reportbuilder-table" table: Then the following should exist in the "Badges" table:
| Name | Badge status | Recipients | | Name | Badge status | Recipients |
| Badge #1 | Available | 1 | | Badge #1 | Available | 2 |
And I click on "2" "link" in the "Badge #1" "table_row"
And the following should exist in the "Recipients" table:
| -1- |
| Admin User |
| User One |
Scenario: View list of badges with recipients Scenario: View list of badges with recipients
Given the following "users" exist: Given the following "users" exist: