diff --git a/admin/presets/classes/helper.php b/admin/presets/classes/helper.php index 3d165b1eb6a..808ed2b7c86 100644 --- a/admin/presets/classes/helper.php +++ b/admin/presets/classes/helper.php @@ -32,7 +32,7 @@ class helper { * - name. To define the preset name. * - comments. To change the comments field. * - author. To update the author field. - * - iscore. Whether the preset is a core preset or not. + * - iscore. Whether the preset is a core preset or not. Valid values on \core_adminpresets\manager class. * @return int The identifier of the preset created. */ public static function create_preset(array $data): int { @@ -41,7 +41,13 @@ class helper { $name = array_key_exists('name', $data) ? $data['name'] : ''; $comments = array_key_exists('comments', $data) ? $data['comments'] : ''; $author = array_key_exists('author', $data) ? $data['author'] : fullname($USER); - $iscore = array_key_exists('iscore', $data) ? $data['iscore'] : 0; + $iscore = array_key_exists('iscore', $data) ? $data['iscore'] : manager::NONCORE_PRESET; + + // Validate iscore value. + $allowed = [manager::NONCORE_PRESET, manager::STARTER_PRESET, manager::FULL_PRESET]; + if (!in_array($iscore, $allowed)) { + $iscore = manager::NONCORE_PRESET; + } $preset = [ 'userid' => $USER->id, @@ -168,7 +174,7 @@ class helper { $data = [ 'name' => get_string('starterpreset', 'core_adminpresets'), 'comments' => get_string('starterpresetdescription', 'core_adminpresets'), - 'iscore' => 1, + 'iscore' => manager::STARTER_PRESET, ]; $presetid = static::create_preset($data); @@ -279,7 +285,7 @@ class helper { $data = [ 'name' => get_string('fullpreset', 'core_adminpresets'), 'comments' => get_string('fullpresetdescription', 'core_adminpresets'), - 'iscore' => 1, + 'iscore' => manager::FULL_PRESET, ]; $presetid = static::create_preset($data); diff --git a/admin/presets/classes/manager.php b/admin/presets/classes/manager.php index 530aa1fcb88..9d22ef0f5f4 100644 --- a/admin/presets/classes/manager.php +++ b/admin/presets/classes/manager.php @@ -124,6 +124,15 @@ class manager { 'moodlerelease' => 'MOODLE_RELEASE' ]; + /** @var int Non-core preset */ + public const NONCORE_PRESET = 0; + + /** @var int Starter preset */ + public const STARTER_PRESET = 1; + + /** @var int Full preset */ + public const FULL_PRESET = 2; + /** * Gets the system settings * diff --git a/admin/presets/tests/generator/lib.php b/admin/presets/tests/generator/lib.php index 41e514746a1..b5a385c752a 100644 --- a/admin/presets/tests/generator/lib.php +++ b/admin/presets/tests/generator/lib.php @@ -64,6 +64,14 @@ class core_adminpresets_generator extends \component_generator_base { if (!isset($data['author'])) { $data['author'] = 'Default author'; } + if (!isset($data['iscore'])) { + $data['iscore'] = manager::NONCORE_PRESET; + } + // Validate iscore value. + $allowed = [manager::NONCORE_PRESET, manager::STARTER_PRESET, manager::FULL_PRESET]; + if (!in_array($data['iscore'], $allowed)) { + $data['iscore'] = manager::NONCORE_PRESET; + } $preset = [ 'userid' => $USER->id, @@ -75,6 +83,7 @@ class core_adminpresets_generator extends \component_generator_base { 'moodlerelease' => $CFG->release, 'timecreated' => time(), 'timeimported' => 0, + 'iscore' => $data['iscore'], ]; $presetid = $DB->insert_record('adminpresets', $preset); diff --git a/admin/presets/tests/generator_test.php b/admin/presets/tests/generator_test.php index ec8ccb8004e..52ef904e996 100644 --- a/admin/presets/tests/generator_test.php +++ b/admin/presets/tests/generator_test.php @@ -37,9 +37,11 @@ class generator_test extends \advanced_testcase { * @param string|null $comments Preset comments field. * @param string|null $author Preset author field. * @param bool $applypreset Whether the preset should be applied or not. + * @param int|null $iscore Whether the preset is a core preset or not. + * @param int|null $iscoreresult Expected iscore value for the result preset. */ public function test_create_preset(?string $name = null, ?string $comments = null, ?string $author = null, - bool $applypreset = false): void { + bool $applypreset = false, ?int $iscore = null, ?int $iscoreresult = null): void { global $CFG, $DB; $this->resetAfterTest(); @@ -66,6 +68,12 @@ class generator_test extends \advanced_testcase { if ($applypreset) { $data['applypreset'] = $applypreset; } + if (isset($iscore)) { + $data['iscore'] = $iscore; + } + if (!isset($iscoreresult)) { + $iscoreresult = manager::NONCORE_PRESET; + } // Create a preset. $presetid = $this->getDataGenerator()->get_plugin_generator('core_adminpresets')->create_preset($data); @@ -76,6 +84,7 @@ class generator_test extends \advanced_testcase { $this->assertEquals($name, $preset->name); $this->assertEquals($comments, $preset->comments); $this->assertEquals($author, $preset->author); + $this->assertEquals($iscoreresult, $preset->iscore); $this->assertEquals($CFG->version, $preset->moodleversion); $this->assertEquals($CFG->release, $preset->moodlerelease); $this->assertEquals($CFG->wwwroot, $preset->site); @@ -197,7 +206,31 @@ class generator_test extends \advanced_testcase { 'comments' => null, 'author' => null, 'applypreset' => true, - ] + ], + 'Starter preset' => [ + 'name' => 'Starter', + 'comments' => null, + 'author' => null, + 'applypreset' => false, + 'iscore' => manager::STARTER_PRESET, + 'iscoreresult' => manager::STARTER_PRESET, + ], + 'Full preset' => [ + 'name' => 'Full', + 'comments' => null, + 'author' => null, + 'applypreset' => false, + 'iscore' => manager::FULL_PRESET, + 'iscoreresult' => manager::FULL_PRESET, + ], + 'Invalid iscore' => [ + 'name' => 'Invalid iscore value', + 'comments' => null, + 'author' => null, + 'applypreset' => false, + 'iscore' => -1, + 'iscoreresult' => manager::NONCORE_PRESET, + ], ]; } } diff --git a/admin/presets/tests/helper_test.php b/admin/presets/tests/helper_test.php index 81fc4500a9a..0a4c6ed0595 100644 --- a/admin/presets/tests/helper_test.php +++ b/admin/presets/tests/helper_test.php @@ -35,8 +35,11 @@ class helper_test extends \advanced_testcase { * * @param string|null $name Preset name field. * @param string|null $comments Preset comments field. + * @param int|null $iscore Preset iscore field. + * @param int|null $iscoreresult Expected iscore value for the result preset. */ - public function test_create_preset(?string $name = null, ?string $comments = null): void { + public function test_create_preset(?string $name = null, ?string $comments = null, ?int $iscore = null, + ?int $iscoreresult = null): void { global $CFG, $DB, $USER; $this->resetAfterTest(); @@ -48,6 +51,12 @@ class helper_test extends \advanced_testcase { if (isset($comments)) { $data['comments'] = $comments; } + if (isset($iscore)) { + $data['iscore'] = $iscore; + } + if (!isset($iscoreresult)) { + $iscoreresult = manager::NONCORE_PRESET; + } // Create a preset. $presetid = helper::create_preset($data); @@ -58,6 +67,7 @@ class helper_test extends \advanced_testcase { $this->assertEquals($name, $preset->name); $this->assertEquals($comments, $preset->comments); $this->assertEquals(fullname($USER), $preset->author); + $this->assertEquals($iscoreresult, $preset->iscore); $this->assertEquals($CFG->version, $preset->moodleversion); $this->assertEquals($CFG->release, $preset->moodlerelease); $this->assertEquals($CFG->wwwroot, $preset->site); @@ -89,6 +99,24 @@ class helper_test extends \advanced_testcase { 'name' => 'Preset with a super-nice name', 'comments' => 'This is a comment different from the previous one', ], + 'Starter preset' => [ + 'name' => 'Starter', + 'comments' => null, + 'iscore' => manager::STARTER_PRESET, + 'iscoreresult' => manager::STARTER_PRESET, + ], + 'Full preset' => [ + 'name' => 'Full', + 'comments' => null, + 'iscore' => manager::FULL_PRESET, + 'iscoreresult' => manager::FULL_PRESET, + ], + 'Invalid iscore' => [ + 'name' => 'Invalid iscore value', + 'comments' => null, + 'iscore' => -1, + 'iscoreresult' => manager::NONCORE_PRESET, + ], ]; } diff --git a/admin/presets/tests/manager_test.php b/admin/presets/tests/manager_test.php index d5040f76d76..a87da91f4fb 100644 --- a/admin/presets/tests/manager_test.php +++ b/admin/presets/tests/manager_test.php @@ -293,7 +293,7 @@ class manager_test extends \advanced_testcase { $this->assertArrayHasKey($presetid, $presets); $preset = $presets[$presetid]; $this->assertEquals($presetname, $preset->name); - $this->assertEquals(0, $preset->iscore); + $this->assertEquals(manager::NONCORE_PRESET, $preset->iscore); // Check the preset includes settings and plugins. $this->assertTrue($settingsfound); @@ -448,7 +448,7 @@ class manager_test extends \advanced_testcase { $this->assertEquals($expectedpresetname, $preset->name); $this->assertEquals('http://demo.moodle', $preset->site); $this->assertEquals('Ada Lovelace', $preset->author); - $this->assertEquals(0, $preset->iscore); + $this->assertEquals(manager::NONCORE_PRESET, $preset->iscore); if ($expectedsettings) { // Check the items have been created. diff --git a/admin/tool/admin_presets/classes/output/presets_list.php b/admin/tool/admin_presets/classes/output/presets_list.php index c071fac13ab..6a80b2c8f5c 100644 --- a/admin/tool/admin_presets/classes/output/presets_list.php +++ b/admin/tool/admin_presets/classes/output/presets_list.php @@ -23,6 +23,7 @@ */ namespace tool_admin_presets\output; +use core_adminpresets\manager; use renderable; use templatable; use renderer_base; @@ -105,7 +106,7 @@ class presets_list implements renderable, templatable { )); // Delete button won't be displayed for the pre-installed core "Starter" and "Full" presets. - if (!$preset->iscore) { + if ($preset->iscore == manager::NONCORE_PRESET) { $deletelink = new \moodle_url('/admin/tool/admin_presets/index.php', ['action' => 'delete', 'id' => $preset->id] ); diff --git a/admin/tool/admin_presets/tests/local/action/export_test.php b/admin/tool/admin_presets/tests/local/action/export_test.php index b529d2197a7..4e858f400b9 100644 --- a/admin/tool/admin_presets/tests/local/action/export_test.php +++ b/admin/tool/admin_presets/tests/local/action/export_test.php @@ -16,6 +16,8 @@ namespace tool_admin_presets\local\action; +use core_adminpresets\manager; + /** * Tests for the export class. * @@ -86,7 +88,7 @@ class export_test extends \advanced_testcase { $this->assertArrayHasKey($presetid, $presets); $preset = $presets[$presetid]; $this->assertEquals($presetname, $preset->name); - $this->assertEquals(0, $preset->iscore); + $this->assertEquals(manager::NONCORE_PRESET, $preset->iscore); // Check the items, advanced attributes and plugins have been created. $this->assertGreaterThan(0, $DB->count_records('adminpresets_it', ['adminpresetid' => $presetid])); diff --git a/admin/tool/admin_presets/tests/local/action/import_test.php b/admin/tool/admin_presets/tests/local/action/import_test.php index e59c31e5404..db31668f2c9 100644 --- a/admin/tool/admin_presets/tests/local/action/import_test.php +++ b/admin/tool/admin_presets/tests/local/action/import_test.php @@ -16,6 +16,8 @@ namespace tool_admin_presets\local\action; +use core_adminpresets\manager; + /** * Tests for the import class. * @@ -104,7 +106,7 @@ class import_test extends \advanced_testcase { $this->assertEquals($expectedpresetname, $preset->name); $this->assertEquals('http://demo.moodle', $preset->site); $this->assertEquals('Ada Lovelace', $preset->author); - $this->assertEquals(0, $preset->iscore); + $this->assertEquals(manager::NONCORE_PRESET, $preset->iscore); if ($expectedsettings) { // Check the items have been created. diff --git a/lib/db/install.xml b/lib/db/install.xml index 644b824a8b9..8b3368d17c1 100644 --- a/lib/db/install.xml +++ b/lib/db/install.xml @@ -4563,7 +4563,7 @@ - + diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php index 726c201a892..4f629ed0c2c 100644 --- a/lib/db/upgrade.php +++ b/lib/db/upgrade.php @@ -3544,6 +3544,22 @@ privatefiles,moodle|/user/files.php'; $params = ['name' => get_string('fullpreset', 'core_adminpresets'), 'iscore' => 1]; $fullpreset = $DB->get_record('adminpresets', $params); + if (!$fullpreset) { + // Full admin preset might have been created using the English name. + $name = get_string_manager()->get_string('fullpreset', 'core_adminpresets', null, 'en'); + $params['name'] = $name; + $fullpreset = $DB->get_record('adminpresets', $params); + } + if (!$fullpreset) { + // We tried, but we didn't find full by name. Let's find a core preset that sets 'usecomments' setting to 1. + $sql = "SELECT preset.* + FROM {adminpresets} preset + INNER JOIN {adminpresets_it} it ON preset.id = it.adminpresetid + WHERE it.name = :name AND it.value = :value AND preset.iscore = 1"; + $params = ['name' => 'usecomments', 'value' => '1']; + $fullpreset = $DB->get_record_sql($sql, $params); + } + if ($fullpreset) { $blocknames = ['course_summary', 'feedback', 'rss_client', 'selfcompletion']; list($blocksinsql, $blocksinparams) = $DB->get_in_or_equal($blocknames); @@ -3964,12 +3980,39 @@ privatefiles,moodle|/user/files.php'; } if ($oldversion < 2022021100.01) { + $sql = "SELECT preset.* + FROM {adminpresets} preset + INNER JOIN {adminpresets_it} it ON preset.id = it.adminpresetid + WHERE it.name = :name AND it.value = :value AND preset.iscore = 1"; // Some settings and plugins have been added/removed to the Starter and Full preset. Add them to the core presets if // they haven't been included yet. $params = ['name' => get_string('starterpreset', 'core_adminpresets'), 'iscore' => 1]; $starterpreset = $DB->get_record('adminpresets', $params); + if (!$starterpreset) { + // Starter admin preset might have been created using the English name. + $name = get_string_manager()->get_string('starterpreset', 'core_adminpresets', null, 'en'); + $params['name'] = $name; + $starterpreset = $DB->get_record('adminpresets', $params); + } + if (!$starterpreset) { + // We tried, but we didn't find starter by name. Let's find a core preset that sets 'usecomments' setting to 0. + $params = ['name' => 'usecomments', 'value' => '0']; + $starterpreset = $DB->get_record_sql($sql, $params); + } + $params = ['name' => get_string('fullpreset', 'core_adminpresets'), 'iscore' => 1]; $fullpreset = $DB->get_record('adminpresets', $params); + if (!$fullpreset) { + // Full admin preset might have been created using the English name. + $name = get_string_manager()->get_string('fullpreset', 'core_adminpresets', null, 'en'); + $params['name'] = $name; + $fullpreset = $DB->get_record('adminpresets', $params); + } + if (!$fullpreset) { + // We tried, but we didn't find full by name. Let's find a core preset that sets 'usecomments' setting to 1. + $params = ['name' => 'usecomments', 'value' => '1']; + $fullpreset = $DB->get_record_sql($sql, $params); + } $settings = [ // Settings. Hide Guest login button for Starter preset (and back to show for Full). @@ -4130,5 +4173,78 @@ privatefiles,moodle|/user/files.php'; upgrade_main_savepoint(true, 2022022600.01); } + if ($oldversion < 2022030100.00) { + $sql = "SELECT preset.* + FROM {adminpresets} preset + INNER JOIN {adminpresets_it} it ON preset.id = it.adminpresetid + WHERE it.name = :name AND it.value = :value AND preset.iscore = 1"; + + $name = get_string('starterpreset', 'core_adminpresets'); + $params = ['name' => $name, 'iscore' => 1]; + $starterpreset = $DB->get_record('adminpresets', $params); + if (!$starterpreset) { + // Starter admin preset might have been created using the English name. Let's change it to current language. + $englishname = get_string_manager()->get_string('starterpreset', 'core_adminpresets', null, 'en'); + $params['name'] = $englishname; + $starterpreset = $DB->get_record('adminpresets', $params); + } + if (!$starterpreset) { + // We tried, but we didn't find starter by name. Let's find a core preset that sets 'usecomments' setting to 0. + $params = ['name' => 'usecomments', 'value' => '0']; + $starterpreset = $DB->get_record_sql($sql, $params); + } + // The iscore field is already 1 for starterpreset, so we don't need to change it. + // We only need to update the name and comment in case they are different to current language strings. + if ($starterpreset && $starterpreset->name != $name) { + $starterpreset->name = $name; + $starterpreset->comments = get_string('starterpresetdescription', 'core_adminpresets'); + $DB->update_record('adminpresets', $starterpreset); + } + + // Let's mark Full admin presets with current FULL_PRESETS value and change the name to current language. + $name = get_string('fullpreset', 'core_adminpresets'); + $params = ['name' => $name, 'iscore' => 1]; + $fullpreset = $DB->get_record('adminpresets', $params); + if (!$fullpreset) { + // Full admin preset might have been created using the English name. + $englishname = get_string_manager()->get_string('fullpreset', 'core_adminpresets', null, 'en'); + $params['name'] = $englishname; + $fullpreset = $DB->get_record('adminpresets', $params); + } + if (!$fullpreset) { + // We tried, but we didn't find full by name. Let's find a core preset that sets 'usecomments' setting to 1. + $params = ['name' => 'usecomments', 'value' => '1']; + $fullpreset = $DB->get_record_sql($sql, $params); + } + if ($fullpreset) { + // We need to update iscore field value, whether the name is the same or not. + $fullpreset->name = $name; + $fullpreset->comments = get_string('fullpresetdescription', 'core_adminpresets'); + $fullpreset->iscore = 2; + $DB->update_record('adminpresets', $fullpreset); + + // We are applying again changes made on 2022011100.01 upgrading step because of MDL-73953 bug. + $blocknames = ['course_summary', 'feedback', 'rss_client', 'selfcompletion']; + list($blocksinsql, $blocksinparams) = $DB->get_in_or_equal($blocknames); + + // Remove entries from the adminpresets_app_plug table (in case the preset has been applied). + $appliedpresets = $DB->get_records('adminpresets_app', ['adminpresetid' => $fullpreset->id], '', 'id'); + if ($appliedpresets) { + list($appsinsql, $appsinparams) = $DB->get_in_or_equal(array_keys($appliedpresets)); + $sql = "adminpresetapplyid $appsinsql AND plugin='block' AND name $blocksinsql"; + $params = array_merge($appsinparams, $blocksinparams); + $DB->delete_records_select('adminpresets_app_plug', $sql, $params); + } + + // Remove entries for these blocks from the adminpresets_plug table. + $sql = "adminpresetid = ? AND plugin='block' AND name $blocksinsql"; + $params = array_merge([$fullpreset->id], $blocksinparams); + $DB->delete_records_select('adminpresets_plug', $sql, $params); + } + + // Main savepoint reached. + upgrade_main_savepoint(true, 2022030100.00); + } + return true; } diff --git a/version.php b/version.php index acd4236b707..84ba44739be 100644 --- a/version.php +++ b/version.php @@ -29,7 +29,7 @@ defined('MOODLE_INTERNAL') || die(); -$version = 2022022600.01; // YYYYMMDD = weekly release date of this DEV branch. +$version = 2022030100.00; // YYYYMMDD = weekly release date of this DEV branch. // RR = release increments - 00 in DEV branches. // .XX = incremental changes. $release = '4.0dev+ (Build: 20220226)'; // Human-friendly version name