Commit 686bd268 authored by Sujith Haridasan's avatar Sujith Haridasan
Browse files

MDL-70753 report: Provide a separate page for course report



Provide page for the reports in the course administration.
The page has a drop down to navigate to different reports.
The navigation is remembered just like the grade reports in
the course.

Signed-off-by: Sujith Haridasan's avatarSujith Haridasan <sujith@moodle.com>
parent a5f0b354
......@@ -22,6 +22,8 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
use core\report_helper;
require_once(__DIR__ . '/../../../config.php');
require_once($CFG->libdir.'/adminlib.php');
......@@ -111,6 +113,12 @@ if (!empty($action) && $ruleid) {
echo $OUTPUT->header();
}
report_helper::save_selected_report($courseid, $manageurl);
// Print the selected dropdown.
$managerules = get_string('managerules', 'tool_monitor');
report_helper::print_report_selector($managerules);
echo $OUTPUT->heading(get_string('managerules', 'tool_monitor'));
$status = get_config('tool_monitor', 'enablemonitor');
$help = new help_icon('enablehelp', 'tool_monitor');
......
@tool @tool_monitor
Feature: In a course administration page, navigate through report page, test for course event monitor page
In order to navigate through report page
As an admin
Go to course administration -> reports -> Event monitoring rules
Background:
Given the following "courses" exist:
| fullname | shortname | category | groupmode | enablecompletion |
| Course 1 | C1 | 0 | 1 | 1 |
And the following "users" exist:
| username | firstname | lastname | email |
| student1 | Student | 1 | student1@example.com |
And the following "course enrolments" exist:
| user | course | role |
| admin | C1 | editingteacher |
| student1 | C1 | student |
@javascript
Scenario: Selector should be available in the course event monitoring page
Given I log in as "admin"
And I navigate to "Reports > Event monitoring rules" in site administration
And I click on "Enable" "link"
And I am on "Course 1" course homepage
When I navigate to "Reports > Event monitoring rules" in current page administration
Then "Report" "field" should exist
And the "Report" select box should contain "Event monitoring rules"
And the field "Report" matches value "Event monitoring rules"
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Report plugins helper class
*
* @package core
* @subpackage report
* @copyright 2021 Sujith Haridasan
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core;
use moodle_url;
use url_select;
/**
* A helper class with static methods to help report plugins
*
* @package core
* @copyright 2021 Sujith Haridasan
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class report_helper {
/**
* Print the selector dropdown
*
* @param string $pluginname The report plugin where the header is modified
* @return void
*/
public static function print_report_selector(string $pluginname):void {
global $OUTPUT, $PAGE;
if ($reportnode = $PAGE->settingsnav->find('coursereports', \navigation_node::TYPE_CONTAINER)) {
if ($children = $reportnode->children) {
// Menu to select report pages to navigate.
$activeurl = '';
foreach ($children as $key => $node) {
$name = $node->text;
$url = $node->action()->out(false);
$menu[$url] = $name;
if ($name === $pluginname) {
$activeurl = $url;
}
}
}
if (!empty($menu)) {
$select = new url_select($menu, $activeurl, null, 'choosecoursereport');
$select->set_label(get_string('report'), ['class' => 'accesshide']);
$select->attributes['style'] = "margin-bottom: 1.5rem";
$select->class .= " mb-4";
echo $OUTPUT->render($select);
}
}
}
/**
* Save the last selected report in the session
*
* @param int $id The course id
* @param moodle_url $url The moodle url
* @return void
*/
public static function save_selected_report(int $id, moodle_url $url):void {
global $USER;
// Last selected report.
if (!isset($USER->course_last_report)) {
$USER->course_last_report = [];
}
$USER->course_last_report[$id] = $url;
}
}
......@@ -4491,8 +4491,9 @@ class settings_navigation extends navigation_node {
// View course reports.
if ($adminoptions->reports) {
$reportnav = $coursenode->add(get_string('reports'), null, self::TYPE_CONTAINER, null, 'coursereports',
new pix_icon('i/stats', ''));
$reportnav = $coursenode->add(get_string('reports'),
new moodle_url('/report/view.php', ['courseid' => $coursecontext->instanceid]),
self::TYPE_CONTAINER, null, 'coursereports', new pix_icon('i/stats', ''));
$coursereports = core_component::get_plugin_list('coursereport');
foreach ($coursereports as $report => $dir) {
$libfile = $CFG->dirroot.'/course/report/'.$report.'/lib.php';
......
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Tests for report_helper.
*
* @package core
* @category test
* @copyright 2021 Sujith Haridasan
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core;
use moodle_url;
use core\report_helper;
/**
* Tests the functions for report_helper class.
*/
class report_helper_test extends \advanced_testcase {
/**
* Data provider for testing selected report for same and different courses
*
* @return array
*/
public function data_selected_report():array {
return [
['course_url_id' => [
['url' => '/test', 'id' => 1],
['url' => '/foo', 'id' => 1]]
],
['course_url_id' => [
['url' => '/test', 'id' => 1],
['url' => '/foo/bar', 'id' => 2]]
]
];
}
/**
* Testing selected report saved in $USER session.
*
* @dataProvider data_selected_report
* @param array $courseurlid The array has both course url and course id
*/
public function test_save_selected_report(array $courseurlid):void {
global $USER;
$url1 = new moodle_url($courseurlid[0]['url']);
$courseid1 = $courseurlid[0]['id'];
report_helper::save_selected_report($courseid1, $url1);
$this->assertEquals($USER->course_last_report[$courseid1], $url1);
$url2 = new moodle_url($courseurlid[1]['url']);
$courseid2 = $courseurlid[1]['id'];
report_helper::save_selected_report($courseid2, $url2);
$this->assertEquals($USER->course_last_report[$courseid2], $url2);
}
/**
* Testing the report selector dropdown shown.
*
* Verify that the dropdowns have the pages to be displayed.
*
* @return void
*/
public function test_print_report_selector():void {
global $PAGE;
$this->resetAfterTest();
$user = $this->getDataGenerator()->create_user();
$PAGE->set_url('/');
$course = $this->getDataGenerator()->create_course();
$PAGE->set_course($course);
$this->getDataGenerator()->enrol_user($user->id, $course->id, 'teacher');
$this->setUser($user);
ob_start();
report_helper::print_report_selector('Logs');
$output = $this->getActualOutput();
ob_end_clean();
$log = '<option value="/report/log/index.php?id=' . $course->id .'" selected>Logs</option>';
$competency = '<option value="/report/competency/index.php?id=' . $course->id . '" >Competency breakdown</option>';
$loglive = '<option value="/report/loglive/index.php?id=' . $course->id . '" >Live logs</option>';
$participation = '<option value="/report/participation/index.php?id=' . $course->id . '" >Course participation</option>';
$this->assertStringContainsString($log, $output);
$this->assertStringContainsString($competency, $output);
$this->assertStringContainsString($loglive, $output);
$this->assertStringContainsString($participation, $output);
}
}
......@@ -22,6 +22,8 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
use core\report_helper;
require_once(__DIR__ . '/../../config.php');
$id = required_param('id', PARAM_INT);
......@@ -71,9 +73,14 @@ $PAGE->set_title($title);
$PAGE->set_heading($coursename);
$PAGE->set_pagelayout('incourse');
report_helper::save_selected_report($id, $navurl);
$output = $PAGE->get_renderer('report_competency');
echo $output->header();
$pluginname = get_string('pluginname', 'report_competency');
report_helper::print_report_selector($pluginname);
$baseurl = new moodle_url('/report/competency/index.php');
$nav = new \report_competency\output\user_course_navigation($currentuser, $course->id, $baseurl, $currentmodule);
$top = $output->render($nav);
......
@report @report_competency
Feature: In a course administration page, navigate through report page, test for course competency page
In order to navigate through report page
As an admin
Go to course administration -> reports -> competency breackdown
Background:
Given the following "courses" exist:
| fullname | shortname | category | groupmode |
| Course 1 | C1 | 0 | 1 |
And the following "users" exist:
| username | firstname | lastname | email |
| student1 | Student | 1 | student1@example.com |
And the following "course enrolments" exist:
| user | course | role |
| admin | C1 | editingteacher |
| student1 | C1 | student |
@javascript
Scenario: Selector should be available in the course competency page
Given I log in as "admin"
And I am on "Course 1" course homepage
When I navigate to "Reports > Competency breakdown" in current page administration
Then "Report" "field" should exist
And the "Report" select box should contain "Competency breakdown"
And the field "Report" matches value "Competency breakdown"
......@@ -24,6 +24,8 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
use core\report_helper;
require_once(__DIR__.'/../../config.php');
require_once("{$CFG->libdir}/completionlib.php");
......@@ -113,6 +115,8 @@ foreach ($completion->get_criteria() as $criterion) {
}
}
report_helper::save_selected_report($courseid, $url);
// Can logged in user mark users as complete?
// (if the logged in user has a role defined in the role criteria)
$allow_marking = false;
......@@ -156,6 +160,9 @@ if ($csv) {
$PAGE->set_heading($course->fullname);
echo $OUTPUT->header();
// Print the selected dropdown.
$pluginname = get_string('pluginname', 'report_completion');
report_helper::print_report_selector($pluginname);
// Handle groups (if enabled)
groups_print_course_menu($course, $CFG->wwwroot.'/report/completion/index.php?course='.$course->id);
......
@report @report_completion
Feature: In a course administration page, navigate through report page, test for course completion page
In order to navigate through report page
As an admin
Go to course administration -> reports -> course completion
Background:
Given the following "courses" exist:
| fullname | shortname | category | groupmode | enablecompletion |
| Course 1 | C1 | 0 | 1 | 1 |
And the following "users" exist:
| username | firstname | lastname | email |
| student1 | Student | 1 | student1@example.com |
And the following "course enrolments" exist:
| user | course | role |
| admin | C1 | editingteacher |
| student1 | C1 | student |
@javascript
Scenario: Selector should be available in the course completion page
Given I log in as "admin"
And I am on "Course 1" course homepage with editing mode on
And I navigate to "Course completion" in current page administration
And I expand all fieldsets
And I set the following fields to these values:
| id_criteria_self | 1 |
And I press "Save changes"
And I am on "Course 1" course homepage
When I navigate to "Reports > Course completion" in current page administration
Then "Report" "field" should exist
And the "Report" select box should contain "Course completion"
And the field "Report" matches value "Course completion"
......@@ -22,6 +22,8 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
use core\report_helper;
require_once(__DIR__ . '/../../config.php');
require_once($CFG->libdir . '/adminlib.php');
......@@ -152,8 +154,16 @@ if ($model->get_analyser()::one_sample_per_analysable()) {
redirect($redirecturl);
}
}
echo $OUTPUT->header();
if ($course) {
report_helper::save_selected_report($course->id, $url);
// Print selected drop down.
$pluginname = get_string('pluginname', 'report_insights');
report_helper::print_report_selector($pluginname);
}
$renderable = new \report_insights\output\insights_list($model, $context, $othermodels, $page, $perpage);
echo $renderer->render($renderable);
......
......@@ -22,6 +22,8 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
use core\report_helper;
require('../../config.php');
require_once($CFG->dirroot.'/course/lib.php');
require_once($CFG->dirroot.'/report/log/locallib.php');
......@@ -103,6 +105,8 @@ $url = new moodle_url("/report/log/index.php", $params);
$PAGE->set_url('/report/log/index.php', array('id' => $id));
$PAGE->set_pagelayout('report');
report_helper::save_selected_report($id, $url);
// Get course details.
$course = null;
if ($id) {
......@@ -163,6 +167,9 @@ if (empty($readers)) {
if (empty($logformat)) {
echo $output->header();
// Print selector dropdown.
$pluginname = get_string('pluginname', 'report_log');
report_helper::print_report_selector($pluginname);
$userinfo = get_string('allparticipants');
$dateinfo = get_string('alldays');
......@@ -184,6 +191,9 @@ if (empty($readers)) {
}
} else {
echo $output->header();
// Print selector dropdown.
$pluginname = get_string('pluginname', 'report_log');
report_helper::print_report_selector($pluginname);
echo $output->heading(get_string('chooselogs') .':');
echo $output->render($reportlog);
}
......
@report @report_log
Feature: In a course administration page, navigate through report page, test for report log page
In order to navigate through report page
As an admin
Go to course administration -> reports
The reports page by default points to logs page
Background:
Given the following "courses" exist:
| fullname | shortname | category | groupmode |
| Course 1 | C1 | 0 | 1 |
| Course 2 | C2 | 0 | 1 |
| Course 3 | C3 | 0 | 1 |
And the following "users" exist:
| username | firstname | lastname | email |
| student1 | Student | 1 | student1@example.com |
And the following "course enrolments" exist:
| user | course | role |
| admin | C1 | editingteacher |
| student1 | C1 | student |
| admin | C2 | editingteacher |
| student1 | C2 | student |
| admin | C3 | editingteacher |
| student1 | C3 | student |
@javascript
Scenario: Default page accessed for Report is log page
Given I log in as "admin"
And I am on "Course 1" course homepage
When I navigate to "Reports" in current page administration
Then "Report" "field" should exist
And the "Report" select box should contain "Logs"
And the field "Report" matches value "Logs"
@javascript
Scenario: Verify the session setting is saved for different courses
Given I log in as "admin"
And I am on "Course 1" course homepage
And I navigate to "Reports" in current page administration
And "Report" "field" should exist
And the "Report" select box should contain "Logs"
And the field "Report" matches value "Logs"
# Now select the Live logs for Course 2
And I am on "Course 2" course homepage
And I navigate to "Reports > Live logs" in current page administration
# now come back to course 1 and see if the default is logs page or not
And I am on "Course 1" course homepage
And I navigate to "Reports" in current page administration
And the "Report" select box should contain "Logs"
# Now come back again to Course 2
And I am on "Course 2" course homepage
When I navigate to "Reports" in current page administration
Then the field "Report" matches value "Live logs"
......@@ -24,6 +24,8 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
use core\report_helper;
require('../../config.php');
require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->dirroot.'/course/lib.php');
......@@ -59,6 +61,8 @@ $url = new moodle_url("/report/loglive/index.php", $params);
$PAGE->set_url($url);
$PAGE->set_pagelayout('report');
report_helper::save_selected_report($id, $url);
$renderable = new report_loglive_renderable($logreader, $id, $url, 0, $page);
$refresh = $renderable->get_refresh_rate();
$logreader = $renderable->selectedlogreader;
......@@ -83,6 +87,10 @@ $PAGE->set_heading("$coursename: $strlivelogs ($strupdatesevery)");
$output = $PAGE->get_renderer('report_loglive');
echo $output->header();
// Print selector dropdown.
$pluginname = get_string('pluginname', 'report_loglive');
report_helper::print_report_selector($pluginname);
echo $output->reader_selector($renderable);
echo $output->toggle_liveupdate_button($renderable);
echo $output->render($renderable);
......@@ -91,4 +99,4 @@ echo $output->render($renderable);
$event = \report_loglive\event\report_viewed::create(array('context' => $context));
$event->trigger();
echo $output->footer();
\ No newline at end of file
echo $output->footer();
@report @report_loglive
Feature: In a course administration page, navigate through report page, test for report live log page
In order to navigate through report page
As an admin
Go to the course administration -> reports -> live logs
Background:
Given the following "courses" exist:
| fullname | shortname | category | groupmode |
| Course 1 | C1 | 0 | 1 |
And the following "users" exist:
| username | firstname | lastname | email |
| student1 | Student | 1 | student1@example.com |
And the following "course enrolments" exist:
| user | course | role |
| admin | C1 | editingteacher |
| student1 | C1 | student |
@javascript
Scenario: Selector should be available in live logs page
Given I log in as "admin"
And I am on "Course 1" course homepage
When I navigate to "Reports > Live logs" in current page administration
Then "Report" "field" should exist
And the "Report" select box should contain "Live logs"
And the field "Report" matches value "Live logs"
......@@ -23,6 +23,8 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
use core\report_helper;
require('../../config.php');
require_once($CFG->dirroot.'/report/outline/locallib.php');
......@@ -47,6 +49,9 @@ require_login($course);
$context = context_course::instance($course->id);
require_capability('report/outline:view', $context);
$url = new moodle_url('/report/outline/index.php', ['id' => $id]);
report_helper::save_selected_report($id, $url);
// Handle form to filter access logs by date.
$filterform = new \report_outline\filter_form();
$filterform->set_data(['id' => $course->id, 'filterstartdate' => $startdate, 'filterenddate' => $enddate]);
......@@ -87,6 +92,10 @@ $strrelatedblogentries = get_string('relatedblogentries', 'blog');
$PAGE->set_title($course->shortname .': '. $stractivityreport);
$PAGE->set_heading($course->fullname);
echo $OUTPUT->header();
// Print selector drop down.
$pluginname = get_string('pluginname', 'report_outline');
report_helper::print_report_selector($pluginname);
echo $OUTPUT->heading(format_string($course->fullname));
list($uselegacyreader, $useinternalreader, $minloginternalreader, $logtable) = report_outline_get_common_log_variables();
......
@report @report_outline
Feature: In a course administration page, navigate through report page, test for activity report page
In order to navigate through report page
As an admin
Go to course administration -> Reports -> Activity report
Background:
Given the following "courses" exist:
| fullname | shortname | category | groupmode |
| Course 1 | C1 | 0 | 1 |
And the following "users" exist:
| username | firstname | lastname | email |
| student1 | Student | 1 | student1@example.com |
And the following "course enrolments" exist:
| user | course | role |
| admin | C1 | editingteacher |
| student1 | C1 | student |
@javascript
Scenario: Selector should be available in course activiy report page
Given I log in as "admin"
And I am on "Course 1" course homepage
When I navigate to "Reports > Activity report" in current page administration