2 // This file is part of Moodle - http://moodle.org/
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
17 defined('MOODLE_INTERNAL') ||
die();
19 require_once($CFG->libdir
.'/formslib.php');
20 require_once($CFG->dirroot
. '/course/lib.php');
23 * Defines the course reset settings form.
25 * @package core_course
26 * @copyright 2007 Petr Skoda
27 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
29 class course_reset_form
extends moodleform
{
34 public function definition() {
35 global $CFG, $COURSE, $DB;
37 $mform = $this->_form
;
39 $mform->addElement('header', 'generalheader', get_string('general'));
40 $mform->addElement('date_time_selector', 'reset_start_date', get_string('startdate'), ['optional' => true]);
41 $mform->addHelpButton('reset_start_date', 'startdate');
42 $mform->addElement('date_time_selector', 'reset_end_date', get_string('enddate'), ['optional' => true]);
43 $mform->addHelpButton('reset_end_date', 'enddate');
44 $mform->addElement('static', 'generaldelete', get_string('delete'));
45 $mform->addElement('checkbox', 'reset_events', get_string('deleteevents', 'calendar'));
46 $mform->addElement('checkbox', 'reset_notes', get_string('deletenotes', 'notes'));
47 $mform->addElement('checkbox', 'reset_comments', get_string('deleteallcomments', 'moodle'));
48 $mform->addElement('checkbox', 'reset_completion', get_string('deletecompletiondata', 'completion'));
49 $mform->addElement('checkbox', 'delete_blog_associations', get_string('deleteblogassociations', 'blog'));
50 $mform->addHelpButton('delete_blog_associations', 'deleteblogassociations', 'blog');
51 $mform->addElement('checkbox', 'reset_competency_ratings', get_string('deletecompetencyratings', 'core_competency'));
53 $mform->addElement('header', 'rolesheader', get_string('roles'));
54 $roles = get_assignable_roles(context_course
::instance($COURSE->id
));
55 $roles[0] = get_string('noroles', 'role');
56 $roles = array_reverse($roles, true);
59 'size' => min(count($roles), 10),
61 $mform->addElement('select', 'unenrol_users', get_string('unenrolroleusers', 'enrol'), $roles, $attributes);
62 $mform->addElement('static', 'rolesdelete', get_string('delete'));
63 $mform->addElement('checkbox', 'reset_roles_local', get_string('deletelocalroles', 'role'));
64 $mform->addElement('checkbox', 'reset_roles_overrides', get_string('deletecourseoverrides', 'role'));
66 $mform->addElement('header', 'gradebookheader', get_string('gradebook', 'grades'));
67 $mform->addElement('static', 'gradebookdelete', get_string('delete'));
68 $mform->addElement('checkbox', 'reset_gradebook_items', get_string('removeallcourseitems', 'grades'));
69 $mform->addHelpButton('reset_gradebook_items', 'removeallcourseitems', 'grades');
70 $mform->addElement('checkbox', 'reset_gradebook_grades', get_string('removeallcoursegrades', 'grades'));
71 $mform->addHelpButton('reset_gradebook_grades', 'removeallcoursegrades', 'grades');
72 $mform->disabledIf('reset_gradebook_grades', 'reset_gradebook_items', 'checked');
74 $mform->addElement('header', 'groupheader', get_string('groups'));
75 $mform->addElement('static', 'groupdelete', get_string('delete'));
76 $mform->addElement('checkbox', 'reset_groups_remove', get_string('deleteallgroups', 'group'));
77 $mform->addElement('checkbox', 'reset_groups_members', get_string('removegroupsmembers', 'group'));
78 $mform->disabledIf('reset_groups_members', 'reset_groups_remove', 'checked');
79 $mform->addElement('checkbox', 'reset_groupings_remove', get_string('deleteallgroupings', 'group'));
80 $mform->addElement('checkbox', 'reset_groupings_members', get_string('removegroupingsmembers', 'group'));
81 $mform->disabledIf('reset_groupings_members', 'reset_groupings_remove', 'checked');
83 $unsupportedmods = [];
84 if ($allmods = $DB->get_records('modules') ) {
85 foreach ($allmods as $mod) {
86 $modname = $mod->name
;
87 $modfile = $CFG->dirroot
."/mod/$modname/lib.php";
88 $modresetcourseformdefinition = $modname.'_reset_course_form_definition';
89 $modresetuserdata = $modname.'_reset_userdata';
90 if (file_exists($modfile)) {
91 if (!$DB->count_records($modname, ['course' => $COURSE->id
])) {
92 continue; // Skip mods with no instances.
94 include_once($modfile);
95 if (function_exists($modresetcourseformdefinition)) {
96 $modresetcourseformdefinition($mform);
97 } else if (!function_exists($modresetuserdata)) {
98 $unsupportedmods[] = $mod;
101 debugging('Missing lib.php in '.$modname.' module');
105 // Mention unsupported mods.
106 if (!empty($unsupportedmods)) {
107 $mform->addElement('header', 'unsupportedheader', get_string('resetnotimplemented'));
108 $mform->addElement('static', 'unsupportedinfo', get_string('resetnotimplementedinfo'));
109 foreach ($unsupportedmods as $mod) {
110 $mform->addElement('static', 'unsup'.$mod->name
, get_string('modulenameplural', $mod->name
));
114 $elements = $mform->_elements
;
115 foreach ($elements as $element) {
116 if (is_a($element, 'HTML_QuickForm_header')) {
117 $mform->setExpanded($element->getName());
121 $mform->addElement('hidden', 'id', $COURSE->id
);
122 $mform->setType('id', PARAM_INT
);
125 $buttonarray[] = $mform->createElement(
128 get_string('selectdefault'),
131 ['customclassoverride' => 'btn-secondary'],
133 $buttonarray[] = $mform->createElement(
136 get_string('deselectall'),
139 ['customclassoverride' => 'btn-secondary'],
141 $mform->addGroup($buttonarray, 'buttonar', '', [' '], false);
146 get_string('resetcourse'),
148 'data-action' => 'resetcourse',
149 'data-courseid' => $COURSE->id
,
150 'data-coursename' => $COURSE->fullname
,
153 ['customclassoverride' => 'btn-danger'],
155 $mform->set_sticky_footer('submitbutton');
157 $mform->closeHeaderBefore('buttonar');
161 * Method to load default values for the reset course form.
163 public function load_defaults() {
164 global $CFG, $COURSE, $DB;
166 $mform = $this->_form
;
170 'reset_roles_local' => 1,
171 'reset_gradebook_grades' => 1,
175 // Set student as default in unenrol user list, if role with student archetype exist.
176 if ($studentrole = get_archetype_roles('student')) {
177 $defaults['unenrol_users'] = array_keys($studentrole);
180 if ($allmods = $DB->get_records('modules') ) {
181 foreach ($allmods as $mod) {
182 $modname = $mod->name
;
183 $modfile = $CFG->dirroot
."/mod/$modname/lib.php";
184 $modresetcourseformdefaults = $modname.'_reset_course_form_defaults';
185 if (file_exists($modfile)) {
186 @include_once
($modfile);
187 if (function_exists($modresetcourseformdefaults)) {
188 if ($moddefs = $modresetcourseformdefaults($COURSE)) {
189 $defaults = $defaults +
$moddefs;
196 foreach ($defaults as $element => $default) {
197 $mform->setDefault($element, $default);
205 * @param array $files
206 * @return array the errors that were found
208 public function validation($data, $files) {
209 $course = get_course($data['id']);
211 $errors = parent
::validation($data, $files);
213 // We check the values that would be used as start and end.
214 if ($data['reset_start_date'] != 0) {
215 $coursedata['startdate'] = $data['reset_start_date'];
217 $coursedata['startdate'] = $course->startdate
;
220 if ($data['reset_end_date'] != 0) {
221 // End date set by the user has preference.
222 $coursedata['enddate'] = $data['reset_end_date'];
223 } else if ($data['reset_start_date'] > 0 && $course->enddate
!= 0) {
224 // Otherwise, if the current course enddate is set, reset_course_userdata will add the start date time shift to it.
225 $timeshift = $data['reset_start_date'] - usergetmidnight($course->startdate
);
226 $coursedata['enddate'] = $course->enddate +
$timeshift;
228 $coursedata['enddate'] = $course->enddate
;
231 if ($errorcode = course_validate_dates($coursedata)) {
232 $errors['reset_end_date'] = get_string($errorcode, 'error');