MDL-45894 navigation: My grades update to overview report.
[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     /**
138      * Fill the table for displaying.
139      *
140      * @param bool $activitylink If this report link to the activity report or the user report.
141      */
142     public function fill_table($activitylink = false) {
143         global $CFG, $DB, $OUTPUT, $USER;
145         // Only show user's courses instead of all courses.
146         if ($this->courses) {
147             $numusers = $this->get_numusers(false);
149             foreach ($this->courses as $course) {
150                 if (!$course->showgrades) {
151                     continue;
152                 }
154                 $coursecontext = context_course::instance($course->id);
156                 if (!$course->visible && !has_capability('moodle/course:viewhiddencourses', $coursecontext)) {
157                     // The course is hidden and the user isn't allowed to see it
158                     continue;
159                 }
161                 if (!has_capability('moodle/user:viewuseractivitiesreport', context_user::instance($this->user->id)) &&
162                         ((!has_capability('moodle/grade:view', $coursecontext) || $this->user->id != $USER->id) &&
163                         !has_capability('moodle/grade:viewall', $coursecontext))) {
164                     continue;
165                 }
167                 $coursename = format_string(get_course_display_name_for_list($course), true, array('context' => $coursecontext));
168                 // Link to the activity report version of the user grade report.
169                 if ($activitylink) {
170                     $courselink = html_writer::link(new moodle_url('/course/user.php', array('mode' => 'grade', 'id' => $course->id,
171                         'user' => $this->user->id)), $coursename);
172                 } else {
173                     $courselink = html_writer::link(new moodle_url('/grade/report/user/index.php', array('id' => $course->id,
174                         'userid' => $this->user->id)), $coursename);
175                 }
176                 $canviewhidden = has_capability('moodle/grade:viewhidden', $coursecontext);
178                 // Get course grade_item
179                 $course_item = grade_item::fetch_course_item($course->id);
181                 // Get the stored grade
182                 $course_grade = new grade_grade(array('itemid'=>$course_item->id, 'userid'=>$this->user->id));
183                 $course_grade->grade_item =& $course_item;
184                 $finalgrade = $course_grade->finalgrade;
186                 if (!$canviewhidden and !is_null($finalgrade)) {
187                     if ($course_grade->is_hidden()) {
188                         $finalgrade = null;
189                     } else {
190                         $adjustedgrade = $this->blank_hidden_total_and_adjust_bounds($course->id,
191                                                                                      $course_item,
192                                                                                      $finalgrade);
194                         // We temporarily adjust the view of this grade item - because the min and
195                         // max are affected by the hidden values in the aggregation.
196                         $finalgrade = $adjustedgrade['grade'];
197                         $course_item->grademax = $adjustedgrade['grademax'];
198                         $course_item->grademin = $adjustedgrade['grademin'];
199                     }
200                 } else {
201                     // We must use the rawgrademin / rawgrademax because it can be different for
202                     // each grade_grade when items are excluded from sum of grades.
203                     if (!is_null($finalgrade)) {
204                         $course_item->grademin = $course_grade->rawgrademin;
205                         $course_item->grademax = $course_grade->rawgrademax;
206                     }
207                 }
209                 $data = array($courselink, grade_format_gradevalue($finalgrade, $course_item, true));
211                 if (!$this->showrank['any']) {
212                     //nothing to do
214                 } else if ($this->showrank[$course->id] && !is_null($finalgrade)) {
215                     /// find the number of users with a higher grade
216                     /// please note this can not work if hidden grades involved :-( to be fixed in 2.0
217                     $params = array($finalgrade, $course_item->id);
218                     $sql = "SELECT COUNT(DISTINCT(userid))
219                               FROM {grade_grades}
220                              WHERE finalgrade IS NOT NULL AND finalgrade > ?
221                                    AND itemid = ?";
222                     $rank = $DB->count_records_sql($sql, $params) + 1;
224                     $data[] = "$rank/$numusers";
226                 } else {
227                     // No grade, no rank.
228                     // Or this course wants rank hidden.
229                     $data[] = '-';
230                 }
232                 $this->table->add_data($data);
233             }
234             return true;
236         } else {
237             echo $OUTPUT->notification(get_string('notenrolled', 'grades'), 'notifymessage');
238             return false;
239         }
240     }
242     /**
243      * Prints or returns the HTML from the flexitable.
244      * @param bool $return Whether or not to return the data instead of printing it directly.
245      * @return string
246      */
247     public function print_table($return=false) {
248         ob_start();
249         $this->table->print_html();
250         $html = ob_get_clean();
251         if ($return) {
252             return $html;
253         } else {
254             echo $html;
255         }
256     }
258     /**
259      * Processes the data sent by the form (grades and feedbacks).
260      * @var array $data
261      * @return bool Success or Failure (array of errors).
262      */
263     function process_data($data) {
264     }
265     function process_action($target, $action) {
266     }
268     /**
269      * This report supports being set as the 'my grades' report.
270      */
271     public static function supports_mygrades() {
272         return true;
273     }
276 function grade_report_overview_settings_definition(&$mform) {
277     global $CFG;
279     //show rank
280     $options = array(-1 => get_string('default', 'grades'),
281                       0 => get_string('hide'),
282                       1 => get_string('show'));
284     if (empty($CFG->grade_report_overview_showrank)) {
285         $options[-1] = get_string('defaultprev', 'grades', $options[0]);
286     } else {
287         $options[-1] = get_string('defaultprev', 'grades', $options[1]);
288     }
290     $mform->addElement('select', 'report_overview_showrank', get_string('showrank', 'grades'), $options);
291     $mform->addHelpButton('report_overview_showrank', 'showrank', 'grades');
293     //showtotalsifcontainhidden
294     $options = array(-1 => get_string('default', 'grades'),
295                       GRADE_REPORT_HIDE_TOTAL_IF_CONTAINS_HIDDEN => get_string('hide'),
296                       GRADE_REPORT_SHOW_TOTAL_IF_CONTAINS_HIDDEN => get_string('hidetotalshowexhiddenitems', 'grades'),
297                       GRADE_REPORT_SHOW_REAL_TOTAL_IF_CONTAINS_HIDDEN => get_string('hidetotalshowinchiddenitems', 'grades') );
299     if (empty($CFG->grade_report_overview_showtotalsifcontainhidden)) {
300         $options[-1] = get_string('defaultprev', 'grades', $options[0]);
301     } else {
302         $options[-1] = get_string('defaultprev', 'grades', $options[1]);
303     }
305     $mform->addElement('select', 'report_overview_showtotalsifcontainhidden', get_string('hidetotalifhiddenitems', 'grades'), $options);
306     $mform->addHelpButton('report_overview_showtotalsifcontainhidden', 'hidetotalifhiddenitems', 'grades');