a68b6e9a1e2cbe44dce259b5d41a45d54a73bf21
[moodle.git] / grade / report / overview / lib.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  * Definition of the grade_overview_report class
19  *
20  * @package gradereport_overview
21  * @copyright 2007 Nicolas Connault
22  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 require_once($CFG->dirroot . '/grade/report/lib.php');
26 require_once($CFG->libdir.'/tablelib.php');
28 /**
29  * Class providing an API for the overview report building and displaying.
30  * @uses grade_report
31  * @package gradereport_overview
32  */
33 class grade_report_overview extends grade_report {
35     /**
36      * The user.
37      * @var object $user
38      */
39     public $user;
41     /**
42      * The user's courses
43      * @var array $courses
44      */
45     public $courses;
47     /**
48      * A flexitable to hold the data.
49      * @var object $table
50      */
51     public $table;
53     /**
54      * Show student ranks within each course.
55      * @var array $showrank
56      */
57     public $showrank;
59     /**
60      * show course/category totals if they contain hidden items
61      */
62     var $showtotalsifcontainhidden;
64     /**
65      * Constructor. Sets local copies of user preferences and initialises grade_tree.
66      * @param int $userid
67      * @param object $gpr grade plugin return tracking object
68      * @param string $context
69      */
70     public function __construct($userid, $gpr, $context) {
71         global $CFG, $COURSE, $DB;
72         parent::__construct($COURSE->id, $gpr, $context);
74         // Get the user (for full name).
75         $this->user = $DB->get_record('user', array('id' => $userid));
77         // Load the user's courses.
78         $this->courses = enrol_get_users_courses($this->user->id, false, 'id, shortname, showgrades');
80         $this->showrank = array();
81         $this->showrank['any'] = false;
83         $this->showtotalsifcontainhidden = array();
85         if ($this->courses) {
86             foreach ($this->courses as $course) {
87                 $this->showrank[$course->id] = grade_get_setting($course->id, 'report_overview_showrank', !empty($CFG->grade_report_overview_showrank));
88                 if ($this->showrank[$course->id]) {
89                     $this->showrank['any'] = true;
90                 }
92                 $this->showtotalsifcontainhidden[$course->id] = grade_get_setting($course->id, 'report_overview_showtotalsifcontainhidden', $CFG->grade_report_overview_showtotalsifcontainhidden);
93             }
94         }
97         // base url for sorting by first/last name
98         $this->baseurl = $CFG->wwwroot.'/grade/overview/index.php?id='.$userid;
99         $this->pbarurl = $this->baseurl;
101         $this->setup_table();
102     }
104     /**
105      * Prepares the headers and attributes of the flexitable.
106      */
107     public function setup_table() {
108         /*
109          * Table has 3 columns
110          *| course  | final grade | rank (optional) |
111          */
113         // setting up table headers
114         if ($this->showrank['any']) {
115             $tablecolumns = array('coursename', 'grade', 'rank');
116             $tableheaders = array($this->get_lang_string('coursename', 'grades'),
117                                   $this->get_lang_string('grade'),
118                                   $this->get_lang_string('rank', 'grades'));
119         } else {
120             $tablecolumns = array('coursename', 'grade');
121             $tableheaders = array($this->get_lang_string('coursename', 'grades'),
122                                   $this->get_lang_string('grade'));
123         }
124         $this->table = new flexible_table('grade-report-overview-'.$this->user->id);
126         $this->table->define_columns($tablecolumns);
127         $this->table->define_headers($tableheaders);
128         $this->table->define_baseurl($this->baseurl);
130         $this->table->set_attribute('cellspacing', '0');
131         $this->table->set_attribute('id', 'overview-grade');
132         $this->table->set_attribute('class', 'boxaligncenter generaltable');
134         $this->table->setup();
135     }
137     public function fill_table() {
138         global $CFG, $DB, $OUTPUT, $USER;
140         // Only show user's courses instead of all courses.
141         if ($this->courses) {
142             $numusers = $this->get_numusers(false);
144             foreach ($this->courses as $course) {
145                 if (!$course->showgrades) {
146                     continue;
147                 }
149                 $coursecontext = context_course::instance($course->id);
151                 if (!$course->visible && !has_capability('moodle/course:viewhiddencourses', $coursecontext)) {
152                     // The course is hidden and the user isn't allowed to see it
153                     continue;
154                 }
156                 if ((!has_capability('moodle/grade:view', $coursecontext) || $this->user->id != $USER->id) &&
157                         !has_capability('moodle/grade:viewall', $coursecontext)) {
158                     continue;
159                 }
161                 $courseshortname = format_string(get_course_display_name_for_list($course), true, array('context' => $coursecontext));
162                 $courselink = html_writer::link(new moodle_url('/grade/report/user/index.php', array('id' => $course->id, 'userid' => $this->user->id)), $courseshortname);
163                 $canviewhidden = has_capability('moodle/grade:viewhidden', $coursecontext);
165                 // Get course grade_item
166                 $course_item = grade_item::fetch_course_item($course->id);
168                 // Get the stored grade
169                 $course_grade = new grade_grade(array('itemid'=>$course_item->id, 'userid'=>$this->user->id));
170                 $course_grade->grade_item =& $course_item;
171                 $finalgrade = $course_grade->finalgrade;
173                 if (!$canviewhidden and !is_null($finalgrade)) {
174                     if ($course_grade->is_hidden()) {
175                         $finalgrade = null;
176                     } else {
177                         $adjustedgrade = $this->blank_hidden_total_and_adjust_bounds($course->id,
178                                                                                      $course_item,
179                                                                                      $finalgrade);
181                         // We temporarily adjust the view of this grade item - because the min and
182                         // max are affected by the hidden values in the aggregation.
183                         $finalgrade = $adjustedgrade['grade'];
184                         $course_item->grademax = $adjustedgrade['grademax'];
185                         $course_item->grademin = $adjustedgrade['grademin'];
186                     }
187                 } else {
188                     // We must use the rawgrademin / rawgrademax because it can be different for
189                     // each grade_grade when items are excluded from sum of grades.
190                     if (!is_null($finalgrade)) {
191                         $course_item->grademin = $course_grade->rawgrademin;
192                         $course_item->grademax = $course_grade->rawgrademax;
193                     }
194                 }
196                 $data = array($courselink, grade_format_gradevalue($finalgrade, $course_item, true));
198                 if (!$this->showrank['any']) {
199                     //nothing to do
201                 } else if ($this->showrank[$course->id] && !is_null($finalgrade)) {
202                     /// find the number of users with a higher grade
203                     /// please note this can not work if hidden grades involved :-( to be fixed in 2.0
204                     $params = array($finalgrade, $course_item->id);
205                     $sql = "SELECT COUNT(DISTINCT(userid))
206                               FROM {grade_grades}
207                              WHERE finalgrade IS NOT NULL AND finalgrade > ?
208                                    AND itemid = ?";
209                     $rank = $DB->count_records_sql($sql, $params) + 1;
211                     $data[] = "$rank/$numusers";
213                 } else {
214                     // No grade, no rank.
215                     // Or this course wants rank hidden.
216                     $data[] = '-';
217                 }
219                 $this->table->add_data($data);
220             }
221             return true;
223         } else {
224             echo $OUTPUT->notification(get_string('nocourses', 'grades'));
225             return false;
226         }
227     }
229     /**
230      * Prints or returns the HTML from the flexitable.
231      * @param bool $return Whether or not to return the data instead of printing it directly.
232      * @return string
233      */
234     public function print_table($return=false) {
235         ob_start();
236         $this->table->print_html();
237         $html = ob_get_clean();
238         if ($return) {
239             return $html;
240         } else {
241             echo $html;
242         }
243     }
245     /**
246      * Processes the data sent by the form (grades and feedbacks).
247      * @var array $data
248      * @return bool Success or Failure (array of errors).
249      */
250     function process_data($data) {
251     }
252     function process_action($target, $action) {
253     }
256 function grade_report_overview_settings_definition(&$mform) {
257     global $CFG;
259     //show rank
260     $options = array(-1 => get_string('default', 'grades'),
261                       0 => get_string('hide'),
262                       1 => get_string('show'));
264     if (empty($CFG->grade_report_overview_showrank)) {
265         $options[-1] = get_string('defaultprev', 'grades', $options[0]);
266     } else {
267         $options[-1] = get_string('defaultprev', 'grades', $options[1]);
268     }
270     $mform->addElement('select', 'report_overview_showrank', get_string('showrank', 'grades'), $options);
271     $mform->addHelpButton('report_overview_showrank', 'showrank', 'grades');
273     //showtotalsifcontainhidden
274     $options = array(-1 => get_string('default', 'grades'),
275                       GRADE_REPORT_HIDE_TOTAL_IF_CONTAINS_HIDDEN => get_string('hide'),
276                       GRADE_REPORT_SHOW_TOTAL_IF_CONTAINS_HIDDEN => get_string('hidetotalshowexhiddenitems', 'grades'),
277                       GRADE_REPORT_SHOW_REAL_TOTAL_IF_CONTAINS_HIDDEN => get_string('hidetotalshowinchiddenitems', 'grades') );
279     if (empty($CFG->grade_report_overview_showtotalsifcontainhidden)) {
280         $options[-1] = get_string('defaultprev', 'grades', $options[0]);
281     } else {
282         $options[-1] = get_string('defaultprev', 'grades', $options[1]);
283     }
285     $mform->addElement('select', 'report_overview_showtotalsifcontainhidden', get_string('hidetotalifhiddenitems', 'grades'), $options);
286     $mform->addHelpButton('report_overview_showtotalsifcontainhidden', 'hidetotalifhiddenitems', 'grades');