}
/**
- * pulls out the userids of the users to be display, and sort them
- * the right outer join is needed because potentially, it is possible not
- * to have the corresponding entry in grade_grades table for some users
- * this is check for user roles because there could be some users with grades
- * but not supposed to be displayed
+ * pulls out the userids of the users to be display, and sorts them
*/
public function load_users() {
global $CFG, $DB;
- $params = array();
- list($usql, $gbr_params) = $DB->get_in_or_equal(explode(',', $this->gradebookroles));
+
+ list($usql, $gbr_params) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0');
if (is_numeric($this->sortitemid)) {
- $params = array_merge(array($this->sortitemid), $gbr_params, $this->groupwheresql_params);
- $sort = "g.finalgrade $this->sortorder";
+ $params = array_merge(array('gitemid'=>$this->sortitemid), $gbr_params, $this->groupwheresql_params);
+ // the MAX() magic is required in order to please PG
+ $sort = "MAX(g.finalgrade) $this->sortorder";
$sql = "SELECT u.id, u.firstname, u.lastname, u.imagealt, u.picture, u.idnumber
- FROM {grade_grades} g RIGHT OUTER JOIN
- {user} u ON (u.id = g.userid AND g.itemid = ?)
- LEFT JOIN {role_assignments} ra ON u.id = ra.userid
+ FROM {user} u
+ JOIN {role_assignments} ra ON ra.userid = u.id
$this->groupsql
- WHERE ra.roleid in $usql
+ LEFT JOIN {grade_grades} g ON (g.userid = u.id AND g.itemid = :gitemid)
+ WHERE ra.roleid $usql AND u.deleted = 0
$this->groupwheresql
AND ra.contextid ".get_related_contexts_string($this->context)."
+ GROUP BY u.id, u.firstname, u.lastname, u.imagealt, u.picture, u.idnumber
ORDER BY $sort";
} else {
}
$params = array_merge($gbr_params, $this->groupwheresql_params);
- $sql = "SELECT u.id, u.firstname, u.lastname, u.imagealt, u.picture, u.idnumber
+ $sql = "SELECT DISTINCT u.id, u.firstname, u.lastname, u.imagealt, u.picture, u.idnumber
FROM {user} u
JOIN {role_assignments} ra ON u.id = ra.userid
$this->groupsql
- WHERE ra.roleid $usql
+ WHERE ra.roleid $usql AND u.deleted = 0
$this->groupwheresql
AND ra.contextid ".get_related_contexts_string($this->context)."
ORDER BY $sort";
$this->userselect = '';
$this->users = array();
} else {
- list($usql, $params) = $DB->get_in_or_equal(array_keys($this->users));
+ list($usql, $params) = $DB->get_in_or_equal(array_keys($this->users), SQL_PARAMS_NAMED, 'usid0');
$this->userselect = "AND g.userid $usql";
$this->userselect_params = $params;
}
global $CFG, $DB;
// please note that we must fetch all grade_grades fields if we want to contruct grade_grade object from it!
- $params = array_merge(array($this->courseid), $this->userselect_params);
+ $params = array_merge(array('courseid'=>$this->courseid), $this->userselect_params);
$sql = "SELECT g.*
FROM {grade_items} gi,
{grade_grades} g
- WHERE g.itemid = gi.id AND gi.courseid = ? {$this->userselect}";
+ WHERE g.itemid = gi.id AND gi.courseid = :courseid {$this->userselect}";
$userids = array_keys($this->users);
$totalcount = $this->get_numusers($grouponly);
- list($usql, $roles_params) = $DB->get_in_or_equal(explode(',', $this->gradebookroles));
+ list($usql, $roles_params) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0');
if ($showaverages) {
- $params = array_merge(array($this->courseid), $roles_params, $groupwheresql_params);
+ $params = array_merge(array('courseid'=>$this->courseid), $roles_params, $groupwheresql_params);
// find sums of all grade items in course
$SQL = "SELECT g.itemid, SUM(g.finalgrade) AS sum
JOIN {user} u ON u.id = g.userid
JOIN {role_assignments} ra ON ra.userid = u.id
$groupsql
- WHERE gi.courseid = ?
+ WHERE gi.courseid = :courseid
AND ra.roleid $usql
AND ra.contextid ".get_related_contexts_string($this->context)."
AND g.finalgrade IS NOT NULL
// MDL-10875 Empty grades must be evaluated as grademin, NOT always 0
// This query returns a count of ungraded grades (NULL finalgrade OR no matching record in grade_grades table)
- $params = array_merge(array($this->courseid), $roles_params, $groupwheresql_params);
+ $params = array_merge(array('courseid'=>$this->courseid), $roles_params, $groupwheresql_params);
$SQL = "SELECT gi.id, COUNT(u.id) AS count
FROM {grade_items} gi
CROSS JOIN {user} u
JOIN {role_assignments} ra ON ra.userid = u.id
LEFT OUTER JOIN {grade_grades} g ON (g.itemid = gi.id AND g.userid = u.id AND g.finalgrade IS NOT NULL)
$groupsql
- WHERE gi.courseid = ?
+ WHERE gi.courseid = :courseid
AND ra.roleid $usql
AND ra.contextid ".get_related_contexts_string($this->context)."
AND g.id IS NULL
$groupsql = "";
$groupwheresql = "";
- list($usql, $params) = $DB->get_in_or_equal(explode(',', $this->gradebookroles));
+ list($usql, $params) = $DB->get_in_or_equal(explode(',', $this->gradebookroles), SQL_PARAMS_NAMED, 'grbr0');
if ($groups) {
$groupsql = $this->groupsql;
}
$countsql = "SELECT COUNT(DISTINCT u.id)
- FROM {grade_grades} g RIGHT OUTER JOIN
- {user} u ON u.id = g.userid
- LEFT JOIN {role_assignments} ra ON u.id = ra.userid
- $groupsql
- WHERE ra.roleid $usql
- $groupwheresql
- AND ra.contextid ".get_related_contexts_string($this->context);
+ FROM {user} u
+ JOIN {role_assignments} ra ON u.id = ra.userid
+ $groupsql
+ WHERE ra.roleid $usql AND u.deleted = 0
+ $groupwheresql
+ AND ra.contextid ".get_related_contexts_string($this->context);
return $DB->count_records_sql($countsql, $params);
}
* Sets up this object's group variables, mainly to restrict the selection of users to display.
*/
protected function setup_groups() {
- global $CFG;
-
/// find out current groups mode
$this->group_selector = groups_print_course_menu($this->course, $this->pbarurl, true);
- $this->currentgroup = groups_get_course_group($this->course);
+ $this->currentgroup = groups_get_course_group($this->course);
if ($this->currentgroup) {
- $this->groupsql = " LEFT JOIN {groups_members} gm ON gm.userid = u.id ";
- $this->groupwheresql = " AND gm.groupid = ? ";
- $this->groupwheresql_params = array($this->currentgroup);
+ $this->groupsql = " JOIN {groups_members} gm ON gm.userid = u.id ";
+ $this->groupwheresql = " AND gm.groupid = :gr_grpid ";
+ $this->groupwheresql_params = array('gr_grpid'=>$this->currentgroup);
}
}