diff --git a/admin/tool/uploadcourse/classes/course.php b/admin/tool/uploadcourse/classes/course.php index fd7569ed85f..4c45b1a0bb6 100644 --- a/admin/tool/uploadcourse/classes/course.php +++ b/admin/tool/uploadcourse/classes/course.php @@ -980,55 +980,48 @@ class tool_uploadcourse_course { unset($method['delete']); unset($method['disable']); - if (!empty($instance) && $todelete) { + if ($todelete) { // Remove the enrolment method. - foreach ($instances as $instance) { - if ($instance->enrol == $enrolmethod) { - $plugin = $enrolmentplugins[$instance->enrol]; + if ($instance) { + $plugin = $enrolmentplugins[$instance->enrol]; - // Ensure user is able to delete the instance. - if ($plugin->can_delete_instance($instance)) { - $plugin->delete_instance($instance); - } else { - $this->error('errorcannotdeleteenrolment', - new lang_string('errorcannotdeleteenrolment', 'tool_uploadcourse', - $plugin->get_instance_name($instance))); - } - - break; - } - } - } else if (!empty($instance) && $todisable) { - // Disable the enrolment. - foreach ($instances as $instance) { - if ($instance->enrol == $enrolmethod) { - $plugin = $enrolmentplugins[$instance->enrol]; - - // Ensure user is able to toggle instance status. - if ($plugin->can_hide_show_instance($instance)) { - $plugin->update_status($instance, ENROL_INSTANCE_DISABLED); - } else { - $this->error('errorcannotdisableenrolment', - new lang_string('errorcannotdisableenrolment', 'tool_uploadcourse', - $plugin->get_instance_name($instance))); - } - - break; + // Ensure user is able to delete the instance. + if ($plugin->can_delete_instance($instance)) { + $plugin->delete_instance($instance); + } else { + $this->error('errorcannotdeleteenrolment', + new lang_string('errorcannotdeleteenrolment', 'tool_uploadcourse', + $plugin->get_instance_name($instance))); } } } else { // Create/update enrolment. $plugin = $enrolmentplugins[$enrolmethod]; - // Ensure user is able to create/update instance. + $status = ($todisable) ? ENROL_INSTANCE_DISABLED : ENROL_INSTANCE_ENABLED; + + // Create a new instance if necessary. if (empty($instance) && $plugin->can_add_instance($course->id)) { - $instance = new stdClass(); - $instance->id = $plugin->add_default_instance($course); + $instanceid = $plugin->add_default_instance($course); + $instance = $DB->get_record('enrol', ['id' => $instanceid]); $instance->roleid = $plugin->get_config('roleid'); - $instance->status = ENROL_INSTANCE_ENABLED; - } else if (!empty($instance) && $plugin->can_edit_instance($instance)) { - $plugin->update_status($instance, ENROL_INSTANCE_ENABLED); - } else { + // On creation the user can decide the status. + $plugin->update_status($instance, $status); + } + + // Check if the we need to update the instance status. + if ($instance && $status != $instance->status) { + if ($plugin->can_hide_show_instance($instance)) { + $plugin->update_status($instance, $status); + } else { + $this->error('errorcannotdisableenrolment', + new lang_string('errorcannotdisableenrolment', 'tool_uploadcourse', + $plugin->get_instance_name($instance))); + break; + } + } + + if (empty($instance) || !$plugin->can_edit_instance($instance)) { $this->error('errorcannotcreateorupdateenrolment', new lang_string('errorcannotcreateorupdateenrolment', 'tool_uploadcourse', $plugin->get_instance_name($instance))); diff --git a/admin/tool/uploadcourse/tests/behat/enrolments.feature b/admin/tool/uploadcourse/tests/behat/enrolments.feature new file mode 100644 index 00000000000..c8ee54d5108 --- /dev/null +++ b/admin/tool/uploadcourse/tests/behat/enrolments.feature @@ -0,0 +1,114 @@ +@tool @tool_uploadcourse @_file_upload +Feature: An admin can update courses enrolments using a CSV file + In order to update courses enrolments using a CSV file + As an admin + I need to be able to upload a CSV file with enrolment methods for the courses + + Background: + Given the following "courses" exist: + | fullname | shortname | category | + | Course 1 | C1 | 0 | + And I log in as "admin" + + @javascript + Scenario: Creating enrolment method by enable it + Given I am on "Course 1" course homepage + And I navigate to "Users > Enrolment methods" in current page administration + And I click on "Delete" "link" in the "Guest access" "table_row" + And I click on "Continue" "button" + And I should not see "Guest access" in the "generaltable" "table" + And I navigate to "Courses > Upload courses" in site administration + And I upload "admin/tool/uploadcourse/tests/fixtures/enrolment_enable.csv" file to "File" filemanager + And I set the field "Upload mode" to "Only update existing courses" + And I set the field "Update mode" to "Update with CSV data only" + And I set the field "Allow deletes" to "Yes" + And I click on "Preview" "button" + When I click on "Upload courses" "button" + Then I should see "Course updated" + And I am on "Course 1" course homepage + And I navigate to "Users > Enrolment methods" in current page administration + And "Disable" "icon" should exist in the "Guest access" "table_row" + + @javascript + Scenario: Creating enrolment method by disabling it + Given I am on "Course 1" course homepage + And I navigate to "Users > Enrolment methods" in current page administration + And I click on "Delete" "link" in the "Guest access" "table_row" + And I click on "Continue" "button" + And I should not see "Guest access" in the "generaltable" "table" + And I navigate to "Courses > Upload courses" in site administration + And I upload "admin/tool/uploadcourse/tests/fixtures/enrolment_disable.csv" file to "File" filemanager + And I set the field "Upload mode" to "Only update existing courses" + And I set the field "Update mode" to "Update with CSV data only" + And I set the field "Allow deletes" to "Yes" + And I click on "Preview" "button" + When I click on "Upload courses" "button" + Then I should see "Course updated" + And I am on "Course 1" course homepage + And I navigate to "Users > Enrolment methods" in current page administration + And "Enable" "icon" should exist in the "Guest access" "table_row" + + @javascript + Scenario: Enabling enrolment method + Given I navigate to "Courses > Upload courses" in site administration + And I upload "admin/tool/uploadcourse/tests/fixtures/enrolment_enable.csv" file to "File" filemanager + And I set the field "Upload mode" to "Only update existing courses" + And I set the field "Update mode" to "Update with CSV data only" + And I set the field "Allow deletes" to "Yes" + And I click on "Preview" "button" + When I click on "Upload courses" "button" + Then I should see "Course updated" + And I am on "Course 1" course homepage + And I navigate to "Users > Enrolment methods" in current page administration + And "Disable" "icon" should exist in the "Guest access" "table_row" + + @javascript + Scenario: Disable an enrolment method + Given I am on "Course 1" course homepage + And I navigate to "Users > Enrolment methods" in current page administration + And I click on "Enable" "link" in the "Guest access" "table_row" + And "Disable" "icon" should exist in the "Guest access" "table_row" + And I navigate to "Courses > Upload courses" in site administration + And I upload "admin/tool/uploadcourse/tests/fixtures/enrolment_disable.csv" file to "File" filemanager + And I set the field "Upload mode" to "Only update existing courses" + And I set the field "Update mode" to "Update with CSV data only" + And I set the field "Allow deletes" to "Yes" + And I click on "Preview" "button" + When I click on "Upload courses" "button" + Then I should see "Course updated" + And I am on "Course 1" course homepage + And I navigate to "Users > Enrolment methods" in current page administration + And "Enable" "icon" should exist in the "Guest access" "table_row" + + @javascript + Scenario: Delete an enrolment method + Given I navigate to "Courses > Upload courses" in site administration + And I upload "admin/tool/uploadcourse/tests/fixtures/enrolment_delete.csv" file to "File" filemanager + And I set the field "Upload mode" to "Only update existing courses" + And I set the field "Update mode" to "Update with CSV data only" + And I set the field "Allow deletes" to "Yes" + And I click on "Preview" "button" + When I click on "Upload courses" "button" + Then I should see "Course updated" + And I am on "Course 1" course homepage + And I navigate to "Users > Enrolment methods" in current page administration + And I should not see "Guest access" in the "generaltable" "table" + + @javascript + Scenario: Delete an unexistent enrolment method (nothing should change) + Given I am on "Course 1" course homepage + And I navigate to "Users > Enrolment methods" in current page administration + And I click on "Delete" "link" in the "Guest access" "table_row" + And I click on "Continue" "button" + And I should not see "Guest access" in the "generaltable" "table" + And I navigate to "Courses > Upload courses" in site administration + And I upload "admin/tool/uploadcourse/tests/fixtures/enrolment_delete.csv" file to "File" filemanager + And I set the field "Upload mode" to "Only update existing courses" + And I set the field "Update mode" to "Update with CSV data only" + And I set the field "Allow deletes" to "Yes" + And I click on "Preview" "button" + When I click on "Upload courses" "button" + Then I should see "Course updated" + And I am on "Course 1" course homepage + And I navigate to "Users > Enrolment methods" in current page administration + And I should not see "Guest access" in the "generaltable" "table" diff --git a/admin/tool/uploadcourse/tests/fixtures/enrolment_delete.csv b/admin/tool/uploadcourse/tests/fixtures/enrolment_delete.csv new file mode 100644 index 00000000000..0f219d19daf --- /dev/null +++ b/admin/tool/uploadcourse/tests/fixtures/enrolment_delete.csv @@ -0,0 +1,2 @@ +shortname,category,enrolment_1,enrolment_1_delete +C1,1,guest,1 \ No newline at end of file diff --git a/admin/tool/uploadcourse/tests/fixtures/enrolment_disable.csv b/admin/tool/uploadcourse/tests/fixtures/enrolment_disable.csv new file mode 100644 index 00000000000..0b3ede83994 --- /dev/null +++ b/admin/tool/uploadcourse/tests/fixtures/enrolment_disable.csv @@ -0,0 +1,2 @@ +shortname,category,enrolment_1,enrolment_1_disable +C1,1,guest,1 \ No newline at end of file diff --git a/admin/tool/uploadcourse/tests/fixtures/enrolment_enable.csv b/admin/tool/uploadcourse/tests/fixtures/enrolment_enable.csv new file mode 100644 index 00000000000..2bae81eb8c0 --- /dev/null +++ b/admin/tool/uploadcourse/tests/fixtures/enrolment_enable.csv @@ -0,0 +1,2 @@ +shortname,category,enrolment_1,enrolment_1_disable +C1,1,guest,0 \ No newline at end of file