MDL-73953 core_adminpresets: Marking core presets on DB

This commit is contained in:
Amaia Anabitarte 2022-03-01 17:43:07 +01:00
parent 77ca86bf87
commit c0196fb096
12 changed files with 159 additions and 14 deletions

View file

@ -32,7 +32,7 @@ class helper {
* - name. To define the preset name. * - name. To define the preset name.
* - comments. To change the comments field. * - comments. To change the comments field.
* - author. To update the author 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. * @return int The identifier of the preset created.
*/ */
public static function create_preset(array $data): int { public static function create_preset(array $data): int {
@ -41,7 +41,13 @@ class helper {
$name = array_key_exists('name', $data) ? $data['name'] : ''; $name = array_key_exists('name', $data) ? $data['name'] : '';
$comments = array_key_exists('comments', $data) ? $data['comments'] : ''; $comments = array_key_exists('comments', $data) ? $data['comments'] : '';
$author = array_key_exists('author', $data) ? $data['author'] : fullname($USER); $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 = [ $preset = [
'userid' => $USER->id, 'userid' => $USER->id,
@ -168,7 +174,7 @@ class helper {
$data = [ $data = [
'name' => get_string('starterpreset', 'core_adminpresets'), 'name' => get_string('starterpreset', 'core_adminpresets'),
'comments' => get_string('starterpresetdescription', 'core_adminpresets'), 'comments' => get_string('starterpresetdescription', 'core_adminpresets'),
'iscore' => 1, 'iscore' => manager::STARTER_PRESET,
]; ];
$presetid = static::create_preset($data); $presetid = static::create_preset($data);
@ -279,7 +285,7 @@ class helper {
$data = [ $data = [
'name' => get_string('fullpreset', 'core_adminpresets'), 'name' => get_string('fullpreset', 'core_adminpresets'),
'comments' => get_string('fullpresetdescription', 'core_adminpresets'), 'comments' => get_string('fullpresetdescription', 'core_adminpresets'),
'iscore' => 1, 'iscore' => manager::FULL_PRESET,
]; ];
$presetid = static::create_preset($data); $presetid = static::create_preset($data);

View file

@ -124,6 +124,15 @@ class manager {
'moodlerelease' => 'MOODLE_RELEASE' '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 * Gets the system settings
* *

View file

@ -64,6 +64,14 @@ class core_adminpresets_generator extends \component_generator_base {
if (!isset($data['author'])) { if (!isset($data['author'])) {
$data['author'] = 'Default 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 = [ $preset = [
'userid' => $USER->id, 'userid' => $USER->id,
@ -75,6 +83,7 @@ class core_adminpresets_generator extends \component_generator_base {
'moodlerelease' => $CFG->release, 'moodlerelease' => $CFG->release,
'timecreated' => time(), 'timecreated' => time(),
'timeimported' => 0, 'timeimported' => 0,
'iscore' => $data['iscore'],
]; ];
$presetid = $DB->insert_record('adminpresets', $preset); $presetid = $DB->insert_record('adminpresets', $preset);

View file

@ -37,9 +37,11 @@ class generator_test extends \advanced_testcase {
* @param string|null $comments Preset comments field. * @param string|null $comments Preset comments field.
* @param string|null $author Preset author field. * @param string|null $author Preset author field.
* @param bool $applypreset Whether the preset should be applied or not. * @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, 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; global $CFG, $DB;
$this->resetAfterTest(); $this->resetAfterTest();
@ -66,6 +68,12 @@ class generator_test extends \advanced_testcase {
if ($applypreset) { if ($applypreset) {
$data['applypreset'] = $applypreset; $data['applypreset'] = $applypreset;
} }
if (isset($iscore)) {
$data['iscore'] = $iscore;
}
if (!isset($iscoreresult)) {
$iscoreresult = manager::NONCORE_PRESET;
}
// Create a preset. // Create a preset.
$presetid = $this->getDataGenerator()->get_plugin_generator('core_adminpresets')->create_preset($data); $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($name, $preset->name);
$this->assertEquals($comments, $preset->comments); $this->assertEquals($comments, $preset->comments);
$this->assertEquals($author, $preset->author); $this->assertEquals($author, $preset->author);
$this->assertEquals($iscoreresult, $preset->iscore);
$this->assertEquals($CFG->version, $preset->moodleversion); $this->assertEquals($CFG->version, $preset->moodleversion);
$this->assertEquals($CFG->release, $preset->moodlerelease); $this->assertEquals($CFG->release, $preset->moodlerelease);
$this->assertEquals($CFG->wwwroot, $preset->site); $this->assertEquals($CFG->wwwroot, $preset->site);
@ -197,7 +206,31 @@ class generator_test extends \advanced_testcase {
'comments' => null, 'comments' => null,
'author' => null, 'author' => null,
'applypreset' => true, '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,
],
]; ];
} }
} }

View file

@ -35,8 +35,11 @@ class helper_test extends \advanced_testcase {
* *
* @param string|null $name Preset name field. * @param string|null $name Preset name field.
* @param string|null $comments Preset comments 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; global $CFG, $DB, $USER;
$this->resetAfterTest(); $this->resetAfterTest();
@ -48,6 +51,12 @@ class helper_test extends \advanced_testcase {
if (isset($comments)) { if (isset($comments)) {
$data['comments'] = $comments; $data['comments'] = $comments;
} }
if (isset($iscore)) {
$data['iscore'] = $iscore;
}
if (!isset($iscoreresult)) {
$iscoreresult = manager::NONCORE_PRESET;
}
// Create a preset. // Create a preset.
$presetid = helper::create_preset($data); $presetid = helper::create_preset($data);
@ -58,6 +67,7 @@ class helper_test extends \advanced_testcase {
$this->assertEquals($name, $preset->name); $this->assertEquals($name, $preset->name);
$this->assertEquals($comments, $preset->comments); $this->assertEquals($comments, $preset->comments);
$this->assertEquals(fullname($USER), $preset->author); $this->assertEquals(fullname($USER), $preset->author);
$this->assertEquals($iscoreresult, $preset->iscore);
$this->assertEquals($CFG->version, $preset->moodleversion); $this->assertEquals($CFG->version, $preset->moodleversion);
$this->assertEquals($CFG->release, $preset->moodlerelease); $this->assertEquals($CFG->release, $preset->moodlerelease);
$this->assertEquals($CFG->wwwroot, $preset->site); $this->assertEquals($CFG->wwwroot, $preset->site);
@ -89,6 +99,24 @@ class helper_test extends \advanced_testcase {
'name' => 'Preset with a super-nice name', 'name' => 'Preset with a super-nice name',
'comments' => 'This is a comment different from the previous one', '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,
],
]; ];
} }

View file

@ -293,7 +293,7 @@ class manager_test extends \advanced_testcase {
$this->assertArrayHasKey($presetid, $presets); $this->assertArrayHasKey($presetid, $presets);
$preset = $presets[$presetid]; $preset = $presets[$presetid];
$this->assertEquals($presetname, $preset->name); $this->assertEquals($presetname, $preset->name);
$this->assertEquals(0, $preset->iscore); $this->assertEquals(manager::NONCORE_PRESET, $preset->iscore);
// Check the preset includes settings and plugins. // Check the preset includes settings and plugins.
$this->assertTrue($settingsfound); $this->assertTrue($settingsfound);
@ -448,7 +448,7 @@ class manager_test extends \advanced_testcase {
$this->assertEquals($expectedpresetname, $preset->name); $this->assertEquals($expectedpresetname, $preset->name);
$this->assertEquals('http://demo.moodle', $preset->site); $this->assertEquals('http://demo.moodle', $preset->site);
$this->assertEquals('Ada Lovelace', $preset->author); $this->assertEquals('Ada Lovelace', $preset->author);
$this->assertEquals(0, $preset->iscore); $this->assertEquals(manager::NONCORE_PRESET, $preset->iscore);
if ($expectedsettings) { if ($expectedsettings) {
// Check the items have been created. // Check the items have been created.

View file

@ -23,6 +23,7 @@
*/ */
namespace tool_admin_presets\output; namespace tool_admin_presets\output;
use core_adminpresets\manager;
use renderable; use renderable;
use templatable; use templatable;
use renderer_base; 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. // 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', $deletelink = new \moodle_url('/admin/tool/admin_presets/index.php',
['action' => 'delete', 'id' => $preset->id] ['action' => 'delete', 'id' => $preset->id]
); );

View file

@ -16,6 +16,8 @@
namespace tool_admin_presets\local\action; namespace tool_admin_presets\local\action;
use core_adminpresets\manager;
/** /**
* Tests for the export class. * Tests for the export class.
* *
@ -86,7 +88,7 @@ class export_test extends \advanced_testcase {
$this->assertArrayHasKey($presetid, $presets); $this->assertArrayHasKey($presetid, $presets);
$preset = $presets[$presetid]; $preset = $presets[$presetid];
$this->assertEquals($presetname, $preset->name); $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. // Check the items, advanced attributes and plugins have been created.
$this->assertGreaterThan(0, $DB->count_records('adminpresets_it', ['adminpresetid' => $presetid])); $this->assertGreaterThan(0, $DB->count_records('adminpresets_it', ['adminpresetid' => $presetid]));

View file

@ -16,6 +16,8 @@
namespace tool_admin_presets\local\action; namespace tool_admin_presets\local\action;
use core_adminpresets\manager;
/** /**
* Tests for the import class. * Tests for the import class.
* *
@ -104,7 +106,7 @@ class import_test extends \advanced_testcase {
$this->assertEquals($expectedpresetname, $preset->name); $this->assertEquals($expectedpresetname, $preset->name);
$this->assertEquals('http://demo.moodle', $preset->site); $this->assertEquals('http://demo.moodle', $preset->site);
$this->assertEquals('Ada Lovelace', $preset->author); $this->assertEquals('Ada Lovelace', $preset->author);
$this->assertEquals(0, $preset->iscore); $this->assertEquals(manager::NONCORE_PRESET, $preset->iscore);
if ($expectedsettings) { if ($expectedsettings) {
// Check the items have been created. // Check the items have been created.

View file

@ -4563,7 +4563,7 @@
<FIELD NAME="author" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false"/> <FIELD NAME="author" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false"/>
<FIELD NAME="moodleversion" TYPE="char" LENGTH="20" NOTNULL="true" SEQUENCE="false"/> <FIELD NAME="moodleversion" TYPE="char" LENGTH="20" NOTNULL="true" SEQUENCE="false"/>
<FIELD NAME="moodlerelease" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false"/> <FIELD NAME="moodlerelease" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false"/>
<FIELD NAME="iscore" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="Whether this is a core preset or not"/> <FIELD NAME="iscore" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="Whether this is a core preset or not, and which core preset"/>
<FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/> <FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
<FIELD NAME="timeimported" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/> <FIELD NAME="timeimported" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
</FIELDS> </FIELDS>

View file

@ -4150,5 +4150,60 @@ privatefiles,moodle|/user/files.php';
upgrade_main_savepoint(true, 2022021100.02); upgrade_main_savepoint(true, 2022021100.02);
} }
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);
}
// Main savepoint reached.
upgrade_main_savepoint(true, 2022030100.00);
}
return true; return true;
} }

View file

@ -29,7 +29,7 @@
defined('MOODLE_INTERNAL') || die(); defined('MOODLE_INTERNAL') || die();
$version = 2022022600.00; // 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. // RR = release increments - 00 in DEV branches.
// .XX = incremental changes. // .XX = incremental changes.
$release = '4.0dev+ (Build: 20220226)'; // Human-friendly version name $release = '4.0dev+ (Build: 20220226)'; // Human-friendly version name