Merge branch 'MDL-85839-main' of https://github.com/sarjona/moodle

This commit is contained in:
Sara Arjona
2025-07-28 16:08:55 +02:00
4 changed files with 166 additions and 92 deletions
@@ -16,13 +16,13 @@
namespace mod_feedback\courseformat;
use core_calendar\output\humandate;
use core_courseformat\local\overview\overviewitem;
use core\output\action_link;
use core\output\local\properties\button;
use core\output\local\properties\text_align;
use core\url;
use core\output\pix_icon;
use core\output\action_link;
use core_calendar\output\humandate;
use core\output\local\properties\button;
use core\output\local\properties\text_align;
use core_courseformat\local\overview\overviewitem;
/**
* Class overview
@@ -32,45 +32,30 @@ use core\output\pix_icon;
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class overview extends \core_courseformat\activityoverviewbase {
#[\Override]
public function get_extra_overview_items(): array {
return [
'responses' => $this->get_extra_responses_overview(),
'submitted' => $this->get_extra_submitted_overview(),
];
}
#[\Override]
public function get_actions_overview(): ?overviewitem {
global $CFG, $USER;
if (!has_capability('mod/feedback:viewreports', $this->context)) {
return null;
}
require_once($CFG->dirroot . '/mod/feedback/lib.php');
$submissions = feedback_get_completeds_group_count(
$this->cm->get_instance_record()
);
// Normalize the value.
if (!$submissions) {
$submissions = 0;
}
$total = $submissions + feedback_count_incomplete_users($this->cm);
$content = new action_link(
url: new url('/mod/feedback/show_entries.php', ['id' => $this->cm->id]),
text: get_string(
'count_of_total',
'core',
['count' => $submissions, 'total' => $total]
),
text: get_string('view', 'core'),
attributes: ['class' => button::BODY_OUTLINE->classes()],
);
return new overviewitem(
name: get_string('responses', 'mod_feedback'),
value: $submissions,
name: get_string('actions'),
value: get_string('view'),
content: $content,
textalign: text_align::CENTER,
);
@@ -85,18 +70,47 @@ class overview extends \core_courseformat\activityoverviewbase {
if (empty($duedate)) {
return new overviewitem(
name: get_string('feedbackclose', 'mod_feedback'),
name: get_string('duedate', 'mod_feedback'),
value: null,
content: '-',
);
}
return new overviewitem(
name: get_string('feedbackclose', 'mod_feedback'),
name: get_string('duedate', 'mod_feedback'),
value: $duedate,
content: humandate::create_from_timestamp($duedate),
);
}
/**
* Get the responses overview item.
*
* @return overviewitem|null The overview item (or null for students).
*/
private function get_extra_responses_overview(): ?overviewitem {
global $CFG;
if (!has_capability('mod/feedback:viewreports', $this->context)) {
return null;
}
require_once($CFG->dirroot . '/mod/feedback/lib.php');
$submissions = feedback_get_completeds_group_count(
$this->cm->get_instance_record()
);
// Normalize the value.
if (!$submissions) {
$submissions = 0;
}
return new overviewitem(
name: get_string('responses', 'mod_feedback'),
value: $submissions,
textalign: text_align::CENTER,
);
}
/**
* Get the submitted status overview item.
*
+1
View File
@@ -96,6 +96,7 @@ $string['dropdownlist'] = 'Multiple choice - single answer (drop-down menu)';
$string['dropdownrated'] = 'Drop-down menu (rated)';
$string['dropdown_values'] = 'Answers';
$string['drop_feedback'] = 'Remove from this course';
$string['duedate'] = 'Due date';
$string['edit_item'] = 'Edit question';
$string['edit_items'] = 'Edit questions';
$string['email_notification'] = 'Enable notification of submissions';
@@ -57,21 +57,22 @@ Feature: Testing overview integration in mod_feedback
When I am on the "Course 1" "course > activities > feedback" page logged in as "teacher1"
Then I should see "Responses" in the "feedback_overview_collapsible" "region"
And I should not see "Responded" in the "feedback_overview_collapsible" "region"
And I should see "Allow answers until" in the "feedback_overview_collapsible" "region"
And I should see "Due date" in the "feedback_overview_collapsible" "region"
And I should see "1 January 2040" in the "Date feedback" "table_row"
And I should see "4 of 8" in the "Date feedback" "table_row"
And I should see "4" in the "Date feedback" "table_row"
And I should see "Tomorrow" in the "Not responded feedback" "table_row"
And I should see "0 of 8" in the "Not responded feedback" "table_row"
And I should see "0" in the "Not responded feedback" "table_row"
And I should see "-" in the "No date feedback" "table_row"
And I should see "3 of 8" in the "No date feedback" "table_row"
And I click on "4 of 8" "link" in the "Date feedback" "table_row"
And I should see "3" in the "No date feedback" "table_row"
And I click on "View" "link" in the "Date feedback" "table_row"
And I should see "Show responses"
Scenario: Students can see the feedback relevant information in the feedback overview
When I am on the "Course 1" "course > activities > feedback" page logged in as "student1"
Then I should not see "Responses" in the "feedback_overview_collapsible" "region"
And I should not see "Actions" in the "feedback_overview_collapsible" "region"
And I should see "Responded" in the "feedback_overview_collapsible" "region"
And I should see "Allow answers until" in the "feedback_overview_collapsible" "region"
And I should see "Due date" in the "feedback_overview_collapsible" "region"
And I should see "1 January 2040" in the "Date feedback" "table_row"
And "You have already submitted this feedback" "icon" should exist in the "Date feedback" "table_row"
And I should see "Tomorrow" in the "Not responded feedback" "table_row"
@@ -28,6 +28,7 @@ use core_courseformat\local\overview\overviewfactory;
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
final class overview_test extends \advanced_testcase {
#[\Override]
public static function setUpBeforeClass(): void {
global $CFG;
@@ -42,52 +43,34 @@ final class overview_test extends \advanced_testcase {
* @covers ::get_actions_overview
* @dataProvider provider_test_get_actions_overview
*
* @param string $user
* @param bool $expectnull
* @param bool $hasresponses
* @return void
* @param string $role
* @param array|null $expected
*/
public function test_get_actions_overview(string $user, bool $expectnull, bool $hasresponses): void {
public function test_get_actions_overview(
string $role,
?array $expected
): void {
$this->resetAfterTest();
$this->setAdminUser();
$course = $this->getDataGenerator()->create_course();
$teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
$student = $this->getDataGenerator()->create_and_enrol($course, 'student');
$currentuser = $this->getDataGenerator()->create_and_enrol($course, $role);
$activity = $this->getDataGenerator()->create_module( 'feedback', ['course' => $course->id]);
$activity = $this->getDataGenerator()->create_module(
'feedback',
['course' => $course->id],
);
$cm = get_fast_modinfo($course)->get_cm($activity->cmid);
$feedbackgenerator = $this->getDataGenerator()->get_plugin_generator('mod_feedback');
$itemcreated = $feedbackgenerator->create_item_multichoice($activity, ['values' => "y\nn"]);
$expectedresonses = 0;
if ($hasresponses) {
$this->setUser($student);
$feedbackgenerator->create_response([
'userid' => $student->id,
'cmid' => $cm->id,
'anonymous' => false,
$itemcreated->name => 'y',
]);
$expectedresonses = 1;
}
$currentuser = ($user == 'teacher') ? $teacher : $student;
$this->setUser($currentuser);
$cm = get_fast_modinfo($course)->get_cm($activity->cmid);
$item = overviewfactory::create($cm)->get_actions_overview();
// Students should not see item.
if ($expectnull) {
if ($expected === null) {
$this->assertNull($item);
return;
}
// Teachers should see item.
$this->assertEquals(get_string('responses', 'mod_feedback'), $item->get_name());
$this->assertEquals($expectedresonses, $item->get_value());
$this->assertEquals(
$expected,
['name' => $item->get_name(), 'value' => $item->get_value()]
);
}
/**
@@ -97,25 +80,16 @@ final class overview_test extends \advanced_testcase {
*/
public static function provider_test_get_actions_overview(): array {
return [
'Teacher with responses' => [
'user' => 'teacher',
'expectnull' => false,
'hasresponses' => true,
'Student' => [
'role' => 'student',
'expected' => null,
],
'Student with responses' => [
'user' => 'student',
'expectnull' => true,
'hasresponses' => true,
],
'Teacher without responses' => [
'user' => 'teacher',
'expectnull' => false,
'hasresponses' => false,
],
'Student without responses' => [
'user' => 'student',
'expectnull' => true,
'hasresponses' => false,
'Teacher' => [
'role' => 'editingteacher',
'expected' => [
'name' => get_string('actions'),
'value' => get_string('view'),
],
],
];
}
@@ -126,7 +100,6 @@ final class overview_test extends \advanced_testcase {
* @dataProvider provider_test_get_due_date_overview
* @param string $user
* @param bool $hasduedate
* @return void
*/
public function test_get_due_date_overview(string $user, bool $hasduedate): void {
$this->resetAfterTest();
@@ -148,7 +121,7 @@ final class overview_test extends \advanced_testcase {
$item = overviewfactory::create($cm)->get_due_date_overview();
// Teachers should see item.
$this->assertEquals(get_string('feedbackclose', 'mod_feedback'), $item->get_name());
$this->assertEquals(get_string('duedate', 'mod_feedback'), $item->get_name());
$expectedvalue = $hasduedate ? $moddata['timeclose'] : null;
$this->assertEquals($expectedvalue, $item->get_value());
}
@@ -180,18 +153,18 @@ final class overview_test extends \advanced_testcase {
}
/**
* Test get_extra_submitted_overview.
* Test get_extra_responses_overview.
*
* @covers ::get_extra_submitted_overview
* @dataProvider provider_test_get_extra_submitted_overview
* @covers ::get_extra_responses_overview
* @dataProvider provider_get_extra_responses_overview
*
* @param string $user
* @param bool $expectnull
* @param bool $hasresponses
* @return void
*/
public function test_get_extra_submitted_overview(string $user, bool $expectnull, bool $hasresponses): void {
public function test_get_extra_responses_overview(string $user, bool $expectnull, bool $hasresponses): void {
$this->resetAfterTest();
$course = $this->getDataGenerator()->create_course();
$teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
$student = $this->getDataGenerator()->create_and_enrol($course, 'student');
@@ -220,6 +193,91 @@ final class overview_test extends \advanced_testcase {
$currentuser = ($user == 'teacher') ? $teacher : $student;
$this->setUser($currentuser);
$overview = overviewfactory::create($cm);
$reflection = new \ReflectionClass($overview);
$method = $reflection->getMethod('get_extra_responses_overview');
$method->setAccessible(true);
$item = $method->invoke($overview);
// Students should not see item.
if ($expectnull) {
$this->assertNull($item);
return;
}
// Teachers should see item.
$this->assertEquals(get_string('responses', 'mod_feedback'), $item->get_name());
$this->assertEquals($expectedresonses, $item->get_value());
}
/**
* Data provider for get_extra_responses_overview.
*
* @return array
*/
public static function provider_get_extra_responses_overview(): array {
return [
'Teacher with responses' => [
'user' => 'teacher',
'expectnull' => false,
'hasresponses' => true,
],
'Student with responses' => [
'user' => 'student',
'expectnull' => true,
'hasresponses' => true,
],
'Teacher without responses' => [
'user' => 'teacher',
'expectnull' => false,
'hasresponses' => false,
],
'Student without responses' => [
'user' => 'student',
'expectnull' => true,
'hasresponses' => false,
],
];
}
/**
* Test get_extra_submitted_overview.
*
* @covers ::get_extra_submitted_overview
* @dataProvider provider_test_get_extra_submitted_overview
*
* @param string $user
* @param bool $expectnull
* @param bool $hasresponses
*/
public function test_get_extra_submitted_overview(string $user, bool $expectnull, bool $hasresponses): void {
$this->resetAfterTest();
$course = $this->getDataGenerator()->create_course();
$teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
$student = $this->getDataGenerator()->create_and_enrol($course, 'student');
$activity = $this->getDataGenerator()->create_module(
'feedback',
['course' => $course->id],
);
$cm = get_fast_modinfo($course)->get_cm($activity->cmid);
$feedbackgenerator = $this->getDataGenerator()->get_plugin_generator('mod_feedback');
$itemcreated = $feedbackgenerator->create_item_multichoice($activity, ['values' => "y\nn"]);
if ($hasresponses) {
$this->setUser($student);
$feedbackgenerator->create_response([
'userid' => $student->id,
'cmid' => $cm->id,
'anonymous' => false,
$itemcreated->name => 'y',
]);
}
$currentuser = ($user == 'teacher') ? $teacher : $student;
$this->setUser($currentuser);
$overview = overviewfactory::create($cm);
$reflection = new \ReflectionClass($overview);
$method = $reflection->getMethod('get_extra_submitted_overview');