Merge branch 'MDL-78066-401' of https://github.com/snake/moodle into MOODLE_401_STABLE

This commit is contained in:
Andrew Nicols 2023-06-15 11:27:02 +08:00
commit e2f07cf2b4
No known key found for this signature in database
GPG Key ID: 6D1E3157C8CFBF14
2 changed files with 38 additions and 23 deletions

View File

@ -96,19 +96,20 @@ class published_resource_repository {
$resource->supportsgrades = false;
$resource->grademax = null;
// Only activities with GRADE_TYPE_VALUE are valid.
// Only activities having a single grade item of GRADE_TYPE_VALUE are eligible for declarative binding.
if (plugin_supports('mod', $mod->modname, FEATURE_GRADE_HAS_GRADE)) {
$gradeitem = \grade_item::fetch([
'courseid' => $resource->courseid,
'itemtype' => 'mod',
'itemmodule' => $mod->modname,
'iteminstance' => $mod->instance
]);
if ($gradeitem && $gradeitem->gradetype == GRADE_TYPE_VALUE) {
$gradinginfo = grade_get_grades($resource->courseid, 'mod', $mod->modname,
$mod->instance);
$resource->supportsgrades = true;
$resource->grademax = (int) $gradinginfo->items[0]->grademax;
$gradinginfo = grade_get_grades($resource->courseid, 'mod', $mod->modname, $mod->instance);
if (count($gradinginfo->items) == 1) {
$gradeitem = \grade_item::fetch([
'courseid' => $resource->courseid,
'itemtype' => 'mod',
'itemmodule' => $mod->modname,
'iteminstance' => $mod->instance
]);
if ($gradeitem && $gradeitem->gradetype == GRADE_TYPE_VALUE) {
$resource->supportsgrades = true;
$resource->grademax = (int)$gradinginfo->items[0]->grademax;
}
}
}
$availableresources[] = $resource;

View File

@ -44,6 +44,7 @@ class published_resource_repository_test extends \advanced_testcase {
$mod = $generator->create_module('assign', ['course' => $course->id]);
$mod2 = $generator->create_module('resource', ['course' => $course2->id]);
$mod3 = $generator->create_module('assign', ['course' => $course->id, 'grade' => 0]);
$mod4 = $generator->create_module('workshop', ['course' => $course->id]); // Had multiple grade items.
$courseresourcedata = (object) [
'courseid' => $course->id,
'membersyncmode' => 0,
@ -71,6 +72,13 @@ class published_resource_repository_test extends \advanced_testcase {
'membersync' => 1,
'ltiversion' => 'LTI-1p3'
];
$module4resourcedata = (object) [
'courseid' => $course->id,
'cmid' => $mod4->cmid,
'membersyncmode' => 1,
'membersync' => 1,
'ltiversion' => 'LTI-1p3'
];
$coursetool = $generator->create_lti_tool($courseresourcedata);
$coursetool = helper::get_lti_tool($coursetool->id);
$modtool = $generator->create_lti_tool($moduleresourcedata);
@ -79,8 +87,10 @@ class published_resource_repository_test extends \advanced_testcase {
$mod2tool = helper::get_lti_tool($mod2tool->id);
$mod3tool = $generator->create_lti_tool($module3resourcedata);
$mod3tool = helper::get_lti_tool($mod3tool->id);
return [$user, $user2, $user3, $course, $course2, $mod, $mod2, $mod3, $coursetool, $modtool, $mod2tool,
$mod3tool];
$mod4tool = $generator->create_lti_tool($module4resourcedata);
$mod4tool = helper::get_lti_tool($mod4tool->id);
return [$user, $user2, $user3, $course, $course2, $mod, $mod2, $mod3, $mod4, $coursetool, $modtool, $mod2tool,
$mod3tool, $mod4tool];
}
/**
@ -90,21 +100,23 @@ class published_resource_repository_test extends \advanced_testcase {
*/
public function test_find_all_for_user() {
$this->resetAfterTest();
[$user, $user2, $user3, $course, $course2, $mod, $mod2, $mod3] = $this->generate_published_resources();
[$user, $user2, $user3, $course, $course2, $mod, $mod2, $mod3, $mod4] = $this->generate_published_resources();
$resourcerepo = new published_resource_repository();
$resources = $resourcerepo->find_all_for_user($user->id);
$this->assertCount(3, $resources);
$this->assertCount(4, $resources);
usort($resources, function($a, $b) {
return strcmp($a->get_contextid(), $b->get_contextid());
});
$this->assertEquals($resources[0]->get_contextid(), \context_course::instance($course->id)->id);
$this->assertEquals($resources[1]->get_contextid(), \context_module::instance($mod->cmid)->id);
$this->assertEquals($resources[2]->get_contextid(), \context_module::instance($mod3->cmid)->id);
$this->assertEquals($resources[3]->get_contextid(), \context_module::instance($mod4->cmid)->id);
$this->assertTrue($resources[0]->supports_grades());
$this->assertTrue($resources[1]->supports_grades());
$this->assertFalse($resources[2]->supports_grades());
$this->assertFalse($resources[3]->supports_grades()); // Multiple grade items isn't supported in content selection.
$resources = $resourcerepo->find_all_for_user($user2->id);
$this->assertCount(1, $resources);
@ -121,27 +133,29 @@ class published_resource_repository_test extends \advanced_testcase {
*/
public function test_find_all_by_ids_for_user() {
$this->resetAfterTest();
[$user, $user2, $user3, $course, $course2, $mod, $mod2, $mod3, $tool, $tool2, $tool3, $tool4] =
[$user, $user2, $user3, $course, $course2, $mod, $mod2, $mod3, $mod4, $coursetool, $tool, $tool2, $tool3, $tool4] =
$this->generate_published_resources();
$resourcerepo = new published_resource_repository();
$resources = $resourcerepo->find_all_by_ids_for_user([$tool2->id, $tool3->id, $tool4->id], $user->id);
$this->assertCount(2, $resources);
$resources = $resourcerepo->find_all_by_ids_for_user([$tool->id, $tool2->id, $tool3->id, $tool4->id], $user->id);
$this->assertCount(3, $resources);
usort($resources, function ($a, $b) {
return strcmp($a->get_contextid(), $b->get_contextid());
});
$this->assertEquals($resources[0]->get_contextid(), \context_module::instance($mod->cmid)->id);
$this->assertEquals($resources[1]->get_contextid(), \context_module::instance($mod3->cmid)->id);
$this->assertEquals($resources[2]->get_contextid(), \context_module::instance($mod4->cmid)->id);
$this->assertTrue($resources[0]->supports_grades());
$this->assertFalse($resources[1]->supports_grades());
$this->assertFalse($resources[2]->supports_grades()); // Multiple grade items isn't supported in content selection.
$resources = $resourcerepo->find_all_by_ids_for_user([$tool2->id, $tool3->id, $tool4->id], $user2->id);
$resources = $resourcerepo->find_all_by_ids_for_user([$tool->id, $tool2->id, $tool3->id], $user2->id);
$this->assertCount(1, $resources);
$this->assertEquals($resources[0]->get_contextid(), \context_module::instance($mod2->cmid)->id);
$this->assertFalse($resources[0]->supports_grades());
$this->assertEmpty($resourcerepo->find_all_by_ids_for_user([$tool2->id], $user2->id));
$this->assertEmpty($resourcerepo->find_all_by_ids_for_user([$tool->id], $user2->id));
$this->assertEmpty($resourcerepo->find_all_by_ids_for_user([], $user2->id));
}
@ -153,7 +167,7 @@ class published_resource_repository_test extends \advanced_testcase {
public function test_find_all_for_user_no_permissions() {
$this->resetAfterTest();
global $DB;
[$user, $user2, $user3, $course, $course2, $mod, $mod2, $mod3, $coursetool, $modtool, $mod2tool]
[$user, $user2, $user3, $course, $course2, $mod, $mod2, $mod3, $mod4, $coursetool, $modtool, $mod2tool]
= $this->generate_published_resources();
// Grant the user permissions as an editing teacher in a specific module within the course,
@ -171,7 +185,7 @@ class published_resource_repository_test extends \advanced_testcase {
// Now, give the user a course role of 'editingteacher' and confirm they can see the published content.
$this->getDataGenerator()->enrol_user($modaccessonlyuser->id, $course->id, 'editingteacher');
$resources = $resourcerepo->find_all_for_user($modaccessonlyuser->id);
$this->assertCount(3, $resources);
$this->assertCount(4, $resources);
// Check other course level roles without the capability, e.g. 'teacher'.
role_unassign($editingteacherrole->id, $modaccessonlyuser->id, \context_course::instance($course->id)->id);