Merge branch 'MDL-50472-37' of git://github.com/Chocolate-lightning/moodle into MOODL...
[moodle.git] / mod / assign / override_form.php
blobf7eb984c6bb59092670bdf95160679aae589f3d1
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
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.
8 //
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 /**
18 * Settings form for overrides in the assign module.
20 * @package mod_assign
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');
32 /**
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. */
41 protected $cm;
43 /** @var object the assign settings object. */
44 protected $assign;
46 /** @var context the assign context. */
47 protected $context;
49 /** @var bool editing group override (true) or user override (false). */
50 protected $groupmode;
52 /** @var int groupid, if provided. */
53 protected $groupid;
55 /** @var int userid, if provided. */
56 protected $userid;
58 /** @var int sortorder, if provided. */
59 protected $sortorder;
61 /**
62 * Constructor.
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) {
72 $this->cm = $cm;
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');
84 /**
85 * Define this form - called by the parent constructor
87 protected function definition() {
88 global $DB;
90 $cm = $this->cm;
91 $mform = $this->_form;
93 $mform->addElement('header', 'override', get_string('override', 'assign'));
95 $assigngroupmode = groups_get_activity_groupmode($cm);
96 $accessallgroups = ($assigngroupmode == NOGROUPS) || has_capability('moodle/site:accessallgroups', $this->context);
98 if ($this->groupmode) {
99 // Group override.
100 if ($this->groupid) {
101 // There is already a groupid, so freeze the selector.
102 $groupchoices = array();
103 $groupchoices[$this->groupid] = groups_get_group_name($this->groupid);
104 $mform->addElement('select', 'groupid',
105 get_string('overridegroup', 'assign'), $groupchoices);
106 $mform->freeze('groupid');
107 // Add a sortorder element.
108 $mform->addElement('hidden', 'sortorder', $this->sortorder);
109 $mform->setType('sortorder', PARAM_INT);
110 $mform->freeze('sortorder');
111 } else {
112 // Prepare the list of groups.
113 // Only include the groups the current can access.
114 $groups = $accessallgroups ? groups_get_all_groups($cm->course) : groups_get_activity_allowed_groups($cm);
115 if (empty($groups)) {
116 // Generate an error.
117 $link = new moodle_url('/mod/assign/overrides.php', array('cmid' => $cm->id));
118 print_error('groupsnone', 'assign', $link);
121 $groupchoices = array();
122 foreach ($groups as $group) {
123 $groupchoices[$group->id] = $group->name;
125 unset($groups);
127 if (count($groupchoices) == 0) {
128 $groupchoices[0] = get_string('none');
131 $mform->addElement('select', 'groupid',
132 get_string('overridegroup', 'assign'), $groupchoices);
133 $mform->addRule('groupid', get_string('required'), 'required', null, 'client');
135 } else {
136 // User override.
137 if ($this->userid) {
138 // There is already a userid, so freeze the selector.
139 $user = $DB->get_record('user', array('id' => $this->userid));
140 $userchoices = array();
141 $userchoices[$this->userid] = fullname($user);
142 $mform->addElement('select', 'userid',
143 get_string('overrideuser', 'assign'), $userchoices);
144 $mform->freeze('userid');
145 } else {
146 // Prepare the list of users.
147 $users = [];
148 list($sort) = users_order_by_sql('u');
150 // Get the list of appropriate users, depending on whether and how groups are used.
151 if ($accessallgroups) {
152 $users = get_enrolled_users($this->context, '', 0,
153 'u.id, u.email, ' . get_all_user_name_fields(true, 'u'), $sort);
154 } else if ($groups = groups_get_activity_allowed_groups($cm)) {
155 $enrolledjoin = get_enrolled_join($this->context, 'u.id');
156 $userfields = 'u.id, u.email, ' . get_all_user_name_fields(true, 'u');
157 list($ingroupsql, $ingroupparams) = $DB->get_in_or_equal(array_keys($groups), SQL_PARAMS_NAMED);
158 $params = $enrolledjoin->params + $ingroupparams;
159 $sql = "SELECT $userfields
160 FROM {user} u
161 JOIN {groups_members} gm ON gm.userid = u.id
162 {$enrolledjoin->joins}
163 WHERE gm.groupid $ingroupsql
164 AND {$enrolledjoin->wheres}
165 ORDER BY $sort";
166 $users = $DB->get_records_sql($sql, $params);
169 // Filter users based on any fixed restrictions (groups, profile).
170 $info = new \core_availability\info_module($cm);
171 $users = $info->filter_user_list($users);
173 if (empty($users)) {
174 // Generate an error.
175 $link = new moodle_url('/mod/assign/overrides.php', array('cmid' => $cm->id));
176 print_error('usersnone', 'assign', $link);
179 $userchoices = array();
180 $canviewemail = in_array('email', get_extra_user_fields($this->context));
181 foreach ($users as $id => $user) {
182 if (empty($invalidusers[$id]) || (!empty($override) &&
183 $id == $override->userid)) {
184 if ($canviewemail) {
185 $userchoices[$id] = fullname($user) . ', ' . $user->email;
186 } else {
187 $userchoices[$id] = fullname($user);
191 unset($users);
193 if (count($userchoices) == 0) {
194 $userchoices[0] = get_string('none');
196 $mform->addElement('searchableselector', 'userid',
197 get_string('overrideuser', 'assign'), $userchoices);
198 $mform->addRule('userid', get_string('required'), 'required', null, 'client');
202 $users = $DB->get_fieldset_select('groups_members', 'userid', 'groupid = ?', array($this->groupid));
203 array_push($users, $this->userid);
204 $extensionmax = 0;
205 foreach ($users as $value) {
206 $extension = $DB->get_record('assign_user_flags', array('assignment' => $this->assign->get_instance()->id,
207 'userid' => $value));
208 if ($extension) {
209 if ($extensionmax < $extension->extensionduedate) {
210 $extensionmax = $extension->extensionduedate;
215 if ($extensionmax) {
216 $this->assign->get_instance()->extensionduedate = $extensionmax;
219 // Open and close dates.
220 $mform->addElement('date_time_selector', 'allowsubmissionsfromdate',
221 get_string('allowsubmissionsfromdate', 'assign'), array('optional' => true));
222 $mform->setDefault('allowsubmissionsfromdate', $this->assign->get_instance()->allowsubmissionsfromdate);
224 $mform->addElement('date_time_selector', 'duedate', get_string('duedate', 'assign'), array('optional' => true));
225 $mform->setDefault('duedate', $this->assign->get_instance()->duedate);
227 $mform->addElement('date_time_selector', 'cutoffdate', get_string('cutoffdate', 'assign'), array('optional' => true));
228 $mform->setDefault('cutoffdate', $this->assign->get_instance()->cutoffdate);
230 if (isset($this->assign->get_instance()->extensionduedate)) {
231 $mform->addElement('static', 'extensionduedate', get_string('extensionduedate', 'assign'),
232 userdate($this->assign->get_instance()->extensionduedate));
235 // Submit buttons.
236 $mform->addElement('submit', 'resetbutton',
237 get_string('reverttodefaults', 'assign'));
239 $buttonarray = array();
240 $buttonarray[] = $mform->createElement('submit', 'submitbutton',
241 get_string('save', 'assign'));
242 $buttonarray[] = $mform->createElement('submit', 'againbutton',
243 get_string('saveoverrideandstay', 'assign'));
244 $buttonarray[] = $mform->createElement('cancel');
246 $mform->addGroup($buttonarray, 'buttonbar', '', array(' '), false);
247 $mform->closeHeaderBefore('buttonbar');
252 * Validate the submitted form data.
254 * @param array $data array of ("fieldname"=>value) of submitted data
255 * @param array $files array of uploaded files "element_name"=>tmp_file_path
256 * @return array of "element_name"=>"error_description" if there are errors
258 public function validation($data, $files) {
259 $errors = parent::validation($data, $files);
261 $mform =& $this->_form;
262 $assign = $this->assign;
264 if ($mform->elementExists('userid')) {
265 if (empty($data['userid'])) {
266 $errors['userid'] = get_string('required');
270 if ($mform->elementExists('groupid')) {
271 if (empty($data['groupid'])) {
272 $errors['groupid'] = get_string('required');
276 // Ensure that the dates make sense.
277 if (!empty($data['allowsubmissionsfromdate']) && !empty($data['cutoffdate'])) {
278 if ($data['cutoffdate'] < $data['allowsubmissionsfromdate']) {
279 $errors['cutoffdate'] = get_string('cutoffdatefromdatevalidation', 'assign');
283 if (!empty($data['allowsubmissionsfromdate']) && !empty($data['duedate'])) {
284 if ($data['duedate'] < $data['allowsubmissionsfromdate']) {
285 $errors['duedate'] = get_string('duedatevalidation', 'assign');
289 if (!empty($data['cutoffdate']) && !empty($data['duedate'])) {
290 if ($data['cutoffdate'] < $data['duedate'] ) {
291 $errors['cutoffdate'] = get_string('cutoffdatevalidation', 'assign');
295 // Ensure that override duedate/allowsubmissionsfromdate are before extension date if exist.
296 if (!empty($assign->get_instance()->extensionduedate) && !empty($data['duedate'])) {
297 if ($assign->get_instance()->extensionduedate < $data['duedate']) {
298 $errors['duedate'] = get_string('extensionnotafterduedate', 'assign');
301 if (!empty($assign->get_instance()->extensionduedate) && !empty($data['allowsubmissionsfromdate'])) {
302 if ($assign->get_instance()->extensionduedate < $data['allowsubmissionsfromdate']) {
303 $errors['allowsubmissionsfromdate'] = get_string('extensionnotafterfromdate', 'assign');
307 // Ensure that at least one assign setting was changed.
308 $changed = false;
309 $keys = array('duedate', 'cutoffdate', 'allowsubmissionsfromdate');
310 foreach ($keys as $key) {
311 if ($data[$key] != $assign->get_instance()->{$key}) {
312 $changed = true;
313 break;
317 if (!$changed) {
318 $errors['allowsubmissionsfromdate'] = get_string('nooverridedata', 'assign');
321 return $errors;