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/>.
18 * Settings form for overrides in the assign module.
21 * @copyright 2016 Ilya Tregubov
22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
26 defined('MOODLE_INTERNAL') ||
die();
28 require_once($CFG->libdir
. '/formslib.php');
29 require_once($CFG->dirroot
. '/mod/assign/mod_form.php');
33 * Form for editing settings overrides.
35 * @copyright 2016 Ilya Tregubov
36 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38 class assign_override_form
extends moodleform
{
40 /** @var object course module object. */
43 /** @var object the assign settings object. */
46 /** @var context the assign context. */
49 /** @var bool editing group override (true) or user override (false). */
52 /** @var int groupid, if provided. */
55 /** @var int userid, if provided. */
58 /** @var int sortorder, if provided. */
63 * @param moodle_url $submiturl the form action URL.
64 * @param object $cm course module object.
65 * @param object $assign the assign settings object.
66 * @param object $context the assign context.
67 * @param bool $groupmode editing group override (true) or user override (false).
68 * @param object $override the override being edited, if it already exists.
70 public function __construct($submiturl, $cm, $assign, $context, $groupmode, $override) {
73 $this->assign
= $assign;
74 $this->context
= $context;
75 $this->groupmode
= $groupmode;
76 $this->groupid
= empty($override->groupid
) ?
0 : $override->groupid
;
77 $this->userid
= empty($override->userid
) ?
0 : $override->userid
;
78 $this->sortorder
= empty($override->sortorder
) ?
null : $override->sortorder
;
80 parent
::__construct($submiturl, null, 'post');
85 * Define this form - called by the parent constructor
87 protected function definition() {
91 $mform = $this->_form
;
93 $mform->addElement('header', 'override', get_string('override', 'assign'));
95 if ($this->groupmode
) {
98 // There is already a groupid, so freeze the selector.
99 $groupchoices = array();
100 $groupchoices[$this->groupid
] = groups_get_group_name($this->groupid
);
101 $mform->addElement('select', 'groupid',
102 get_string('overridegroup', 'assign'), $groupchoices);
103 $mform->freeze('groupid');
104 // Add a sortorder element.
105 $mform->addElement('hidden', 'sortorder', $this->sortorder
);
106 $mform->setType('sortorder', PARAM_INT
);
107 $mform->freeze('sortorder');
109 // Prepare the list of groups.
110 $groups = groups_get_all_groups($cm->course
);
111 if (empty($groups)) {
112 // Generate an error.
113 $link = new moodle_url('/mod/assign/overrides.php', array('cmid' => $cm->id
));
114 print_error('groupsnone', 'assign', $link);
117 $groupchoices = array();
118 foreach ($groups as $group) {
119 $groupchoices[$group->id
] = $group->name
;
123 if (count($groupchoices) == 0) {
124 $groupchoices[0] = get_string('none');
127 $mform->addElement('select', 'groupid',
128 get_string('overridegroup', 'assign'), $groupchoices);
129 $mform->addRule('groupid', get_string('required'), 'required', null, 'client');
134 // There is already a userid, so freeze the selector.
135 $user = $DB->get_record('user', array('id' => $this->userid
));
136 $userchoices = array();
137 $userchoices[$this->userid
] = fullname($user);
138 $mform->addElement('select', 'userid',
139 get_string('overrideuser', 'assign'), $userchoices);
140 $mform->freeze('userid');
142 // Prepare the list of users.
143 $users = get_enrolled_users($this->context
, '', 0,
144 'u.id, u.email, ' . get_all_user_name_fields(true, 'u'));
146 // Filter users based on any fixed restrictions (groups, profile).
147 $info = new \core_availability\
info_module($cm);
148 $users = $info->filter_user_list($users);
151 // Generate an error.
152 $link = new moodle_url('/mod/assign/overrides.php', array('cmid' => $cm->id
));
153 print_error('usersnone', 'assign', $link);
156 $userchoices = array();
157 $canviewemail = in_array('email', get_extra_user_fields($this->context
));
158 foreach ($users as $id => $user) {
159 if (empty($invalidusers[$id]) ||
(!empty($override) &&
160 $id == $override->userid
)) {
162 $userchoices[$id] = fullname($user) . ', ' . $user->email
;
164 $userchoices[$id] = fullname($user);
170 if (count($userchoices) == 0) {
171 $userchoices[0] = get_string('none');
173 $mform->addElement('searchableselector', 'userid',
174 get_string('overrideuser', 'assign'), $userchoices);
175 $mform->addRule('userid', get_string('required'), 'required', null, 'client');
179 $users = $DB->get_fieldset_select('groups_members', 'userid', 'groupid = ?', array($this->groupid
));
180 array_push($users, $this->userid
);
182 foreach ($users as $value) {
183 $extension = $DB->get_record('assign_user_flags', array('assignment' => $this->assign
->get_instance()->id
,
184 'userid' => $value));
186 if ($extensionmax < $extension->extensionduedate
) {
187 $extensionmax = $extension->extensionduedate
;
193 $this->assign
->get_instance()->extensionduedate
= $extensionmax;
196 // Open and close dates.
197 $mform->addElement('date_time_selector', 'allowsubmissionsfromdate',
198 get_string('allowsubmissionsfromdate', 'assign'), array('optional' => true));
199 $mform->setDefault('allowsubmissionsfromdate', $this->assign
->get_instance()->allowsubmissionsfromdate
);
201 $mform->addElement('date_time_selector', 'duedate', get_string('duedate', 'assign'), array('optional' => true));
202 $mform->setDefault('duedate', $this->assign
->get_instance()->duedate
);
204 $mform->addElement('date_time_selector', 'cutoffdate', get_string('cutoffdate', 'assign'), array('optional' => true));
205 $mform->setDefault('cutoffdate', $this->assign
->get_instance()->cutoffdate
);
207 if (isset($this->assign
->get_instance()->extensionduedate
)) {
208 $mform->addElement('static', 'extensionduedate', get_string('extensionduedate', 'assign'),
209 userdate($this->assign
->get_instance()->extensionduedate
));
213 $mform->addElement('submit', 'resetbutton',
214 get_string('reverttodefaults', 'assign'));
216 $buttonarray = array();
217 $buttonarray[] = $mform->createElement('submit', 'submitbutton',
218 get_string('save', 'assign'));
219 $buttonarray[] = $mform->createElement('submit', 'againbutton',
220 get_string('saveoverrideandstay', 'assign'));
221 $buttonarray[] = $mform->createElement('cancel');
223 $mform->addGroup($buttonarray, 'buttonbar', '', array(' '), false);
224 $mform->closeHeaderBefore('buttonbar');
229 * Validate the submitted form data.
231 * @param array $data array of ("fieldname"=>value) of submitted data
232 * @param array $files array of uploaded files "element_name"=>tmp_file_path
233 * @return array of "element_name"=>"error_description" if there are errors
235 public function validation($data, $files) {
237 $errors = parent
::validation($data, $files);
239 $mform =& $this->_form
;
240 $assign = $this->assign
;
242 if ($mform->elementExists('userid')) {
243 if (empty($data['userid'])) {
244 $errors['userid'] = get_string('required');
248 if ($mform->elementExists('groupid')) {
249 if (empty($data['groupid'])) {
250 $errors['groupid'] = get_string('required');
254 // Ensure that the dates make sense.
255 if (!empty($data['allowsubmissionsfromdate']) && !empty($data['cutoffdate'])) {
256 if ($data['cutoffdate'] < $data['allowsubmissionsfromdate']) {
257 $errors['cutoffdate'] = get_string('cutoffdatefromdatevalidation', 'assign');
261 if (!empty($data['allowsubmissionsfromdate']) && !empty($data['duedate'])) {
262 if ($data['duedate'] < $data['allowsubmissionsfromdate']) {
263 $errors['duedate'] = get_string('duedatevalidation', 'assign');
267 if (!empty($data['cutoffdate']) && !empty($data['duedate'])) {
268 if ($data['cutoffdate'] < $data['duedate'] ) {
269 $errors['cutoffdate'] = get_string('cutoffdatevalidation', 'assign');
273 // Ensure that override duedate/allowsubmissionsfromdate are before extension date if exist.
274 if (!empty($assign->get_instance()->extensionduedate
) && !empty($data['duedate'])) {
275 if ($assign->get_instance()->extensionduedate
< $data['duedate']) {
276 $errors['duedate'] = get_string('extensionnotafterduedate', 'assign');
279 if (!empty($assign->get_instance()->extensionduedate
) && !empty($data['allowsubmissionsfromdate'])) {
280 if ($assign->get_instance()->extensionduedate
< $data['allowsubmissionsfromdate']) {
281 $errors['allowsubmissionsfromdate'] = get_string('extensionnotafterfromdate', 'assign');
285 // Ensure that at least one assign setting was changed.
287 $keys = array('duedate', 'cutoffdate', 'allowsubmissionsfromdate');
288 foreach ($keys as $key) {
289 if ($data[$key] != $assign->get_instance()->{$key}) {
296 $errors['allowsubmissionsfromdate'] = get_string('nooverridedata', 'assign');