MDL-9137 Fixing errors in the overview report
[moodle.git] / grade / edit / tree / grade.php
CommitLineData
20544755 1<?php //$Id$
739196ba 2
78ad5f3f 3require_once '../../../config.php';
3af29899 4require_once $CFG->dirroot.'/grade/lib.php';
6fb39a98 5require_once 'grade_form.php';
20544755 6
7$courseid = required_param('courseid', PARAM_INT);
23207a1a 8$id = optional_param('id', 0, PARAM_INT);
9$itemid = optional_param('itemid', 0, PARAM_INT);
10$userid = optional_param('userid', 0, PARAM_INT);
20544755 11
12if (!$course = get_record('course', 'id', $courseid)) {
13 print_error('nocourseid');
14}
15
20544755 16require_login($course);
17$context = get_context_instance(CONTEXT_COURSE, $course->id);
27b1735b 18if (!has_capability('moodle/grade:manage', $context)) {
19 require_capability('moodle/grade:override', $context);
20}
20544755 21
22// default return url
3af29899 23$gpr = new grade_plugin_return();
24$returnurl = $gpr->get_return_url($CFG->wwwroot.'/grade/report.php?id='.$course->id);
20544755 25
23207a1a 26// security checks!
27if (!empty($id)) {
28 if (!$grade = get_record('grade_grades', 'id', $id)) {
29 error('Incorrect grade id');
30 }
31
32 if (!empty($itemid) and $itemid != $grade->itemid) {
33 error('Incorrect itemid');
34 }
35 $itemid = $grade->itemid;
36
37 if (!empty($userid) and $userid != $grade->userid) {
38 error('Incorrect userid');
39 }
40 $userid = $grade->userid;
79eabc2a 41
23207a1a 42 unset($grade);
9c25957a 43
23207a1a 44} else if (empty($userid) or empty($itemid)) {
45 error('Missing userid and itemid');
46}
47
48if (!$grade_item = grade_item::fetch(array('id'=>$itemid, 'courseid'=>$courseid))) {
49 error('Can not find grade_item');
50}
51
dc3ca94c 52// now verify grading user has access to all groups or is member of the same group when separate groups used in course
53if (groupmode($COURSE) == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)) {
54 if ($groups = user_group($COURSE->id, $userid)) {
55 $ok = false;
56 foreach ($groups as $group) {
57 if (groups_is_member($group->id, $USER->id)) {
58 $ok = true;
59 }
60 }
61 if (!$ok) {
62 error('Can not grade this user');
63 }
64 } else {
65 error('Can not grade this user');
66 }
67}
23207a1a 68
69$mform = new edit_grade_form(null, array('grade_item'=>$grade_item, 'gpr'=>$gpr));
70
15a51159 71if ($grade = get_record('grade_grades', 'itemid', $grade_item->id, 'userid', $userid)) {
23207a1a 72 if ($grade_text = get_record('grade_grades_text', 'gradeid', $grade->id)) {
73 // always clean existing feedback - grading should not have XSS risk
79eabc2a 74 if (can_use_html_editor()) {
75 $options = new object();
23207a1a 76 $options->smiley = false;
77 $options->filter = false;
78 $options->noclean = false;
79 $grade->feedback = format_text($grade_text->feedback, $grade_text->feedbackformat, $options);
80 $grade->feedbackformat = FORMAT_HTML;
81 } else {
82 $grade->feedback = clean_text($grade_text->feedback, $grade_text->feedbackformat);
83 $grade->feedbackformat = $grade_text->feedbackformat;
79eabc2a 84 }
920a0fb2 85 }
86
15a51159 87 $grade->locked = $grade->locked > 0 ? 1:0;
88 $grade->overridden = $grade->overridden > 0 ? 1:0;
89 $grade->excluded = $grade->excluded > 0 ? 1:0;
90
91 if ($grade->hidden > 1) {
92 $grade->hiddenuntil = $grade->hidden;
f60c61b1 93 $grade->hidden = 1;
15a51159 94 } else {
95 $grade->hiddenuntil = 0;
96 }
23207a1a 97
f60c61b1 98 if ($grade_item->is_hidden()) {
99 $grade->hidden = 1;
100 }
101
fb0e3570 102 if ($grade_item->is_locked()) {
103 $grade->locked = 1;
104 }
105
23207a1a 106 $mform->set_data($grade);
9c25957a 107
20544755 108} else {
27b1735b 109 $mform->set_data(array('itemid'=>$itemid, 'userid'=>$userid, 'locked'=>$grade_item->locked, 'locktime'=>$grade_item->locktime));
20544755 110}
111
112if ($mform->is_cancelled()) {
113 redirect($returnurl);
23207a1a 114
20544755 115// form processing
41486d1c 116} else if ($data = $mform->get_data(false)) {
23207a1a 117 $old_grade_grade = new grade_grade(array('userid'=>$data->userid, 'itemid'=>$grade_item->id), true); //might not exist yet
920a0fb2 118
0658afc9 119 // fix no grade for scales
fb0e3570 120 if (!isset($data->finalgrade)) {
121 $data->finalgrade = $old_grade_grade->finalgrade;
122
123 } else if ($grade_item->gradetype == GRADE_TYPE_SCALE and $data->finalgrade < 1) {
0658afc9 124 $data->finalgrade = NULL;
125 }
126
fb0e3570 127 if (!isset($data->feedback)) {
128 $data->feedback = $old_grade_grade->feedback;
129 $data->feedbackformat = $old_grade_grade->feedbackformat;
130 }
23207a1a 131 // update final grade or feedback
132 $grade_item->update_final_grade($data->userid, $data->finalgrade, NULL, 'editgrade', $data->feedback, $data->feedbackformat);
8c4d80f1 133
23207a1a 134 $grade_grade = grade_grade::fetch(array('userid'=>$data->userid, 'itemid'=>$grade_item->id));
fb0e3570 135 $grade_grade->grade_item =& $grade_item; // no db fetching
8c4d80f1 136
27b1735b 137 if (has_capability('moodle/grade:manage', $context) or has_capability('moodle/grade:hide', $context)) {
f60c61b1 138 $hidden = empty($data->hidden) ? 0: $data->hidden;
139 $hiddenuntil = empty($data->hiddenuntil) ? 0: $data->hiddenuntil;
140
141 if ($grade_item->is_hidden()) {
142 if ($old_grade_grade->hidden == 1 and $hiddenuntil == 0) {
143 //nothing to do - grade was originally hidden, we want to keep it that way
27b1735b 144 } else {
f60c61b1 145 $grade_grade->set_hidden($hiddenuntil);
27b1735b 146 }
15a51159 147 } else {
f60c61b1 148 if ($hiddenuntil) {
149 $grade_grade->set_hidden($hiddenuntil);
150 } else {
151 $grade_grade->set_hidden($hidden); // checkbox data might be undefined
152 }
15a51159 153 }
15a51159 154 }
23207a1a 155
fb0e3570 156 if (isset($data->locked) and !$grade_item->is_locked()) {
157 if (($old_grade_grade->locked or $old_grade_grade->locktime)
158 and (!has_capability('moodle/grade:manage', $context) and !has_capability('moodle/grade:unlock', $context))) {
159 //ignore data
160
161 } else if ((!$old_grade_grade->locked and !$old_grade_grade->locktime)
162 and (!has_capability('moodle/grade:manage', $context) and !has_capability('moodle/grade:lock', $context))) {
163 //ignore data
164
165 } else {
166 $grade_grade->set_locktime($data->locktime); //set_lock may reset locktime
167 $grade_grade->set_locked($data->locked, false, true);
23207a1a 168 }
169 }
170
fb0e3570 171 if (isset($data->excluded) and has_capability('moodle/grade:manage', $context)) {
172 $grade_grade->set_excluded($data->excluded);
173 }
174
175 if (isset($data->overridden) and has_capability('moodle/grade:manage', $context) or has_capability('moodle/grade:override', $context)) {
176 // ignore overridden flag when changing final grade
177 if ($old_grade_grade->finalgrade == $grade_grade->finalgrade) {
178 $grade_grade->set_overridden($data->overridden);
27b1735b 179 }
23207a1a 180 }
920a0fb2 181
fb0e3570 182 // detect cases when we need to do full regrading
183 if ($old_grade_grade->excluded != $grade_grade->excluded) {
184 $parent = $grade_item->get_parent_category();
185 $parent->force_regrading();
20544755 186
fb0e3570 187 } else if ($old_grade_grade->overridden != $grade_grade->overridden and empty($grade_grade->overridden)) { // only when unoverriding
188 $grade_item->force_regrading();
27b1735b 189
fb0e3570 190 } else if ($old_grade_grade->locktime != $grade_grade->locktime) {
191 $grade_item->force_regrading();
192 }
27b1735b 193
ffe6eb27 194 redirect($returnurl);
20544755 195}
196
20544755 197$strgrades = get_string('grades');
20544755 198$strgraderreport = get_string('graderreport', 'grades');
23207a1a 199$strgradeedit = get_string('editgrade', 'grades');
200$struser = get_string('user');
20544755 201
826c5f86 202$navigation = grade_build_nav(__FILE__, $strgradeedit, array('courseid' => $courseid));
20544755 203
204/*********** BEGIN OUTPUT *************/
205
23207a1a 206print_header_simple($strgrades . ': ' . $strgraderreport . ': ' . $strgradeedit,
207 ': ' . $strgradeedit , $navigation, '', '', true, '', navmenu($course));
20544755 208
23207a1a 209print_heading($strgradeedit);
20544755 210
211print_simple_box_start("center");
212
20544755 213// Form if in edit or add modes
214$mform->display();
20544755 215
216print_simple_box_end();
217
218print_footer($course);
219die;