From 4ff5d5ef173456fc6336f31f1e6c01d8628a911d Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Wed, 12 Aug 2020 00:57:57 +0100 Subject: [PATCH] MDL-69448 backup: fix capability checks when unable to copy user data. When a given user doesn't have the capability to "Include user data" during course copying, freeze the form element rather than not adding it at all. This caused problems as the element was required before preceding with the course copy. --- backup/util/ui/classes/copy/copy.php | 4 ++-- backup/util/ui/classes/output/copy_form.php | 14 ++++++++------ lang/en/backup.php | 1 + lib/classes/task/asynchronous_copy_task.php | 4 +++- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/backup/util/ui/classes/copy/copy.php b/backup/util/ui/classes/copy/copy.php index 3e2d269fd70..496cf0268b5 100644 --- a/backup/util/ui/classes/copy/copy.php +++ b/backup/util/ui/classes/copy/copy.php @@ -111,8 +111,8 @@ class copy { * Take the validated form data and extract the required information for copy operations. * * @param \stdClass $formdata Data from the validated course copy form. - * @throws \moodle_exception * @return \stdClass $copydata Data required for course copy operations. + * @throws \moodle_exception If one of the required copy fields is missing */ private final function get_copy_data(\stdClass $formdata): \stdClass { $copydata = new \stdClass(); @@ -121,7 +121,7 @@ class copy { if (isset($formdata->{$field})) { $copydata->{$field} = $formdata->{$field}; } else { - throw new \moodle_exception('copy_class_field_not_found'); + throw new \moodle_exception('copyfieldnotfound', 'backup', '', null, $field); } } diff --git a/backup/util/ui/classes/output/copy_form.php b/backup/util/ui/classes/output/copy_form.php index ff7a55dea63..a24413e9729 100644 --- a/backup/util/ui/classes/output/copy_form.php +++ b/backup/util/ui/classes/output/copy_form.php @@ -162,15 +162,17 @@ class copy_form extends \moodleform { } // Keep source course user data. + $mform->addElement('select', 'userdata', get_string('userdata', 'backup'), + [0 => get_string('no'), 1 => get_string('yes')]); + $mform->setDefault('userdata', 0); + $mform->addHelpButton('userdata', 'userdata', 'backup'); + $requiredcapabilities = array( 'moodle/restore:createuser', 'moodle/backup:userinfo', 'moodle/restore:userinfo' ); - if (has_all_capabilities($requiredcapabilities, $coursecontext)) { - $dataarray = array(); - $dataarray[] = $mform->createElement('advcheckbox', 'userdata', - get_string('enable'), '', array('group' => 1), array(0, 1)); - $mform->addGroup($dataarray, 'dataarray', get_string('userdata', 'backup'), ' ', false); - $mform->addHelpButton('dataarray', 'userdata', 'backup'); + if (!has_all_capabilities($requiredcapabilities, $coursecontext)) { + $mform->hardFreeze('userdata'); + $mform->setConstants('userdata', 0); } // Keep manual enrolments. diff --git a/lang/en/backup.php b/lang/en/backup.php index 4ff7fceeabb..fe79d5ac3ea 100644 --- a/lang/en/backup.php +++ b/lang/en/backup.php @@ -169,6 +169,7 @@ $string['copycoursetitle'] = 'Copy course: {$a}'; $string['copydest'] = 'Destination'; $string['copyingcourse'] = 'Course copying in progress'; $string['copyingcourseshortname'] = 'copying'; +$string['copyfieldnotfound'] = 'A required field was not found'; $string['copyformfail'] = 'AJAX submission of course copy form has failed.'; $string['copyop'] = 'Current operation'; $string['copyprogressheading'] = 'Course copies in progress'; diff --git a/lib/classes/task/asynchronous_copy_task.php b/lib/classes/task/asynchronous_copy_task.php index 6504d408cdc..0f7bb41806b 100644 --- a/lib/classes/task/asynchronous_copy_task.php +++ b/lib/classes/task/asynchronous_copy_task.php @@ -72,14 +72,16 @@ class asynchronous_copy_task extends adhoc_task { $keepuserdata = (bool)$copyinfo->userdata; $keptroles = $copyinfo->keptroles; - $backupplan->get_setting('users')->set_value('1'); $bc->set_kept_roles($keptroles); // If we are not keeping user data don't include users or data in the backup. // In this case we'll add the user enrolments at the end. // Also if we have no roles to keep don't backup users. if (empty($keptroles) || !$keepuserdata) { + $backupplan->get_setting('users')->set_status(\backup_setting::NOT_LOCKED); $backupplan->get_setting('users')->set_value('0'); + } else { + $backupplan->get_setting('users')->set_value('1'); } // Do some preflight checks on the backup.