MDL-36331 core_grade: fixed up 2 incorrect default return URLs
[moodle.git] / grade / edit / tree / grade.php
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.
13 //
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  * Edit a user's grade for a particular activity
19  *
20  * @package   core_grades
21  * @copyright 2007 Petr Skoda
22  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 require_once '../../../config.php';
26 require_once $CFG->dirroot.'/grade/lib.php';
27 require_once $CFG->dirroot.'/grade/report/lib.php';
28 require_once 'grade_form.php';
30 $courseid = required_param('courseid', PARAM_INT);
31 $id       = optional_param('id', 0, PARAM_INT);
32 $itemid   = optional_param('itemid', 0, PARAM_INT);
33 $userid   = optional_param('userid', 0, PARAM_INT);
35 $url = new moodle_url('/grade/edit/tree/grade.php', array('courseid'=>$courseid));
36 if ($id !== 0) {
37     $url->param('id', $id);
38 }
39 if ($itemid !== 0) {
40     $url->param('itemid', $itemid);
41 }
42 if ($userid !== 0) {
43     $url->param('userid', $userid);
44 }
45 $PAGE->set_url($url);
47 if (!$course = $DB->get_record('course', array('id' => $courseid))) {
48     print_error('nocourseid');
49 }
51 $PAGE->set_pagelayout('incourse');
52 require_login($course);
53 $context = get_context_instance(CONTEXT_COURSE, $course->id);
54 if (!has_capability('moodle/grade:manage', $context)) {
55     require_capability('moodle/grade:edit', $context);
56 }
58 // default return url
59 $gpr = new grade_plugin_return();
60 $returnurl = $gpr->get_return_url($CFG->wwwroot.'/grade/report/index.php?id='.$course->id);
62 // security checks!
63 if (!empty($id)) {
64     if (!$grade = $DB->get_record('grade_grades', array('id' => $id))) {
65         print_error('invalidgroupid');
66     }
68     if (!empty($itemid) and $itemid != $grade->itemid) {
69         print_error('invaliditemid');
70     }
71     $itemid = $grade->itemid;
73     if (!empty($userid) and $userid != $grade->userid) {
74         print_error('invaliduser');
75     }
76     $userid = $grade->userid;
78     unset($grade);
80 } else if (empty($userid) or empty($itemid)) {
81     print_error('missinguseranditemid');
82 }
84 if (!$grade_item = grade_item::fetch(array('id'=>$itemid, 'courseid'=>$courseid))) {
85     print_error('cannotfindgradeitem');
86 }
88 // now verify grading user has access to all groups or is member of the same group when separate groups used in course
89 if (groups_get_course_groupmode($COURSE) == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)) {
90     if ($groups = groups_get_all_groups($COURSE->id, $userid)) {
91         $ok = false;
92         foreach ($groups as $group) {
93             if (groups_is_member($group->id, $USER->id)) {
94                 $ok = true;
95             }
96         }
97         if (!$ok) {
98             print_error('cannotgradeuser');
99         }
100     } else {
101         print_error('cannotgradeuser');
102     }
105 $mform = new edit_grade_form(null, array('grade_item'=>$grade_item, 'gpr'=>$gpr));
107 if ($grade = $DB->get_record('grade_grades', array('itemid' => $grade_item->id, 'userid' => $userid))) {
109     // always clean existing feedback - grading should not have XSS risk
110     if (can_use_html_editor()) {
111         if (empty($grade->feedback)) {
112             $grade->feedback  = '';
113         } else {
114             $options = new stdClass();
115             $options->smiley  = false;
116             $options->filter  = false;
117             $options->noclean = false;
118             $options->para    = false;
119             $grade->feedback  = format_text($grade->feedback, $grade->feedbackformat, $options);
120         }
121         $grade->feedbackformat = FORMAT_HTML;
122     } else {
123         $grade->feedback       = clean_text($grade->feedback, $grade->feedbackformat);
124     }
126     $grade->locked      = $grade->locked     > 0 ? 1:0;
127     $grade->overridden  = $grade->overridden > 0 ? 1:0;
128     $grade->excluded    = $grade->excluded   > 0 ? 1:0;
130     if ($grade->hidden > 1) {
131         $grade->hiddenuntil = $grade->hidden;
132         $grade->hidden = 1;
133     } else {
134         $grade->hiddenuntil = 0;
135     }
137     if ($grade_item->is_hidden()) {
138         $grade->hidden = 1;
139     }
141     if ($grade_item->is_locked()) {
142         $grade->locked = 1;
143     }
145     // normalize the final grade value
146     if ($grade_item->gradetype == GRADE_TYPE_SCALE) {
147         if (empty($grade->finalgrade)) {
148             $grade->finalgrade = -1;
149         } else {
150             $grade->finalgrade = (int)$grade->finalgrade;
151         }
152     } else if ($grade_item->gradetype == GRADE_TYPE_VALUE) {
153         $grade->finalgrade = format_float($grade->finalgrade, $grade_item->get_decimals());
154     }
156     $grade->oldgrade    = $grade->finalgrade;
157     $grade->oldfeedback = $grade->feedback;
159     $grade->feedback = array('text'=>$grade->feedback, 'format'=>$grade->feedbackformat);
161     $mform->set_data($grade);
162 } else {
163     $grade = new stdClass();
164     $grade->feedback = array('text'=>'', 'format'=>FORMAT_HTML);
165     $mform->set_data(array('itemid'=>$itemid, 'userid'=>$userid, 'locked'=>$grade_item->locked, 'locktime'=>$grade_item->locktime));
168 if ($mform->is_cancelled()) {
169     redirect($returnurl);
171 // form processing
172 } else if ($data = $mform->get_data(false)) {
174     if (isset($data->feedback) && is_array($data->feedback)) {
175         $data->feedbackformat = $data->feedback['format'];
176         $data->feedback = $data->feedback['text'];
177     }
179     $old_grade_grade = new grade_grade(array('userid'=>$data->userid, 'itemid'=>$grade_item->id), true); //might not exist yet
181     // fix no grade for scales
182     if (!isset($data->finalgrade) or $data->finalgrade == $data->oldgrade) {
183         $data->finalgrade = $old_grade_grade->finalgrade;
185     } else if ($grade_item->gradetype == GRADE_TYPE_SCALE) {
186         if ($data->finalgrade < 1) {
187             $data->finalgrade = NULL;
188         }
190     } else if ($grade_item->gradetype == GRADE_TYPE_VALUE) {
191         $data->finalgrade = unformat_float($data->finalgrade);
193     } else {
194         //this should not happen
195         $data->finalgrade = $old_grade_grade->finalgrade;
196     }
198     // the overriding of feedback is tricky - we have to care about external items only
199     if (!property_exists($data, 'feedback') or $data->feedback == $data->oldfeedback) {
200         $data->feedback       = $old_grade_grade->feedback;
201         $data->feedbackformat = $old_grade_grade->feedbackformat;
202     }
203     // update final grade or feedback
204     // when we set override grade the first time, it happens here
205     $grade_item->update_final_grade($data->userid, $data->finalgrade, 'editgrade', $data->feedback, $data->feedbackformat);
207     $grade_grade = new grade_grade(array('userid'=>$data->userid, 'itemid'=>$grade_item->id), true);
208     $grade_grade->grade_item =& $grade_item; // no db fetching
210     if (has_capability('moodle/grade:manage', $context) or has_capability('moodle/grade:edit', $context)) {
211         // change overridden flag
212         if (!isset($data->overridden)) {
213             $data->overridden = 0; // checkbox unticked
214         }
215         $grade_grade->set_overridden($data->overridden);
216     }
218     if (has_capability('moodle/grade:manage', $context) or has_capability('moodle/grade:hide', $context)) {
219         $hidden      = empty($data->hidden) ? 0: $data->hidden;
220         $hiddenuntil = empty($data->hiddenuntil) ? 0: $data->hiddenuntil;
222         if ($grade_item->is_hidden()) {
223             if ($old_grade_grade->hidden == 1 and $hiddenuntil == 0) {
224                 //nothing to do - grade was originally hidden, we want to keep it that way
225             } else {
226                 $grade_grade->set_hidden($hiddenuntil);
227             }
228         } else {
229             if ($hiddenuntil) {
230                 $grade_grade->set_hidden($hiddenuntil);
231             } else {
232                 $grade_grade->set_hidden($hidden); // checkbox data might be undefined
233             }
234         }
235     }
237     if (isset($data->locked) and !$grade_item->is_locked()) {
238         if (($old_grade_grade->locked or $old_grade_grade->locktime)
239           and (!has_capability('moodle/grade:manage', $context) and !has_capability('moodle/grade:unlock', $context))) {
240             //ignore data
242         } else if ((!$old_grade_grade->locked and !$old_grade_grade->locktime)
243           and (!has_capability('moodle/grade:manage', $context) and !has_capability('moodle/grade:lock', $context))) {
244             //ignore data
246         } else {
247             $grade_grade->set_locktime($data->locktime); //set_lock may reset locktime
248             $grade_grade->set_locked($data->locked, false, true);
249             // reload grade in case it was regraded from activity
250             $grade_grade = new grade_grade(array('userid'=>$data->userid, 'itemid'=>$grade_item->id), true);
251             $grade_grade->grade_item =& $grade_item; // no db fetching
252         }
253     }
255     if (isset($data->excluded) and has_capability('moodle/grade:manage', $context)) {
256         $grade_grade->set_excluded($data->excluded);
257     }
259     // detect cases when we need to do full regrading
260     if ($old_grade_grade->excluded != $grade_grade->excluded) {
261         $parent = $grade_item->get_parent_category();
262         $parent->force_regrading();
264     } else if ($old_grade_grade->overridden != $grade_grade->overridden and empty($grade_grade->overridden)) { // only when unoverridding
265         $grade_item->force_regrading();
267     } else if ($old_grade_grade->locktime != $grade_grade->locktime) {
268         $grade_item->force_regrading();
269     }
271     redirect($returnurl);
274 $strgrades       = get_string('grades');
275 $strgraderreport = get_string('graderreport', 'grades');
276 $strgradeedit    = get_string('editgrade', 'grades');
277 $struser         = get_string('user');
279 grade_build_nav(__FILE__, $strgradeedit, array('courseid' => $courseid));
281 /*********** BEGIN OUTPUT *************/
282 $PAGE->set_title($strgrades . ': ' . $strgraderreport . ': ' . $strgradeedit);
283 $PAGE->set_heading($course->fullname);
285 echo $OUTPUT->header();
286 echo $OUTPUT->heading($strgradeedit);
288 echo $OUTPUT->box_start();
290 // Form if in edit or add modes
291 $mform->display();
293 echo $OUTPUT->box_end();
295 echo $OUTPUT->footer();
296 die;