mirror of
https://github.com/moodle/moodle.git
synced 2025-08-04 16:36:37 +02:00
average class/group should not take non-graded students into consideration
This commit is contained in:
parent
a8578a933b
commit
66b9da277c
1 changed files with 18 additions and 24 deletions
|
@ -333,23 +333,16 @@ class grade_report_grader extends grade_report {
|
||||||
* Fetches and returns a count of all the users that will be shows on this page.
|
* Fetches and returns a count of all the users that will be shows on this page.
|
||||||
* @return int Count of users
|
* @return int Count of users
|
||||||
*/
|
*/
|
||||||
function get_numusers($group=true) {
|
function get_numusers() {
|
||||||
global $CFG;
|
global $CFG;
|
||||||
|
|
||||||
if ($group) {
|
|
||||||
$groupsql = $this->groupsql;
|
|
||||||
$groupsqlwhere = $this->groupwheresql;
|
|
||||||
} else {
|
|
||||||
$groupsql = '';
|
|
||||||
$groupsqlwhere = '';
|
|
||||||
}
|
|
||||||
$countsql = "SELECT COUNT(DISTINCT u.id)
|
$countsql = "SELECT COUNT(DISTINCT u.id)
|
||||||
FROM {$CFG->prefix}grade_grades g RIGHT OUTER JOIN
|
FROM {$CFG->prefix}grade_grades g RIGHT OUTER JOIN
|
||||||
{$CFG->prefix}user u ON (u.id = g.userid AND g.itemid = $this->sortitemid)
|
{$CFG->prefix}user u ON (u.id = g.userid AND g.itemid = $this->sortitemid)
|
||||||
LEFT JOIN {$CFG->prefix}role_assignments ra ON u.id = ra.userid
|
LEFT JOIN {$CFG->prefix}role_assignments ra ON u.id = ra.userid
|
||||||
$groupsql
|
$this->groupsql
|
||||||
WHERE ra.roleid in ($this->gradebookroles)
|
WHERE ra.roleid in ($this->gradebookroles)
|
||||||
$groupsqlwhere
|
$this->groupwheresql
|
||||||
AND ra.contextid ".get_related_contexts_string($this->context);
|
AND ra.contextid ".get_related_contexts_string($this->context);
|
||||||
return count_records_sql($countsql);
|
return count_records_sql($countsql);
|
||||||
}
|
}
|
||||||
|
@ -735,12 +728,11 @@ class grade_report_grader extends grade_report {
|
||||||
global $CFG;
|
global $CFG;
|
||||||
|
|
||||||
$groupavghtml = '';
|
$groupavghtml = '';
|
||||||
$numusers = $this->get_numusers(true); // find number of users in this group
|
|
||||||
if ($this->currentgroup && $this->get_pref('showgroups')) {
|
if ($this->currentgroup && $this->get_pref('showgroups')) {
|
||||||
|
|
||||||
/** SQL for finding group sum */
|
/** SQL for finding group sum */
|
||||||
// do not sum -1 (no grade), treat as 0 for now
|
// do not sum -1 (no grade), treat as 0 for now
|
||||||
$SQL = "SELECT g.itemid, SUM(g.finalgrade) as sum
|
$SQL = "SELECT g.itemid, SUM(g.finalgrade) as sum, COUNT(DISTINCT(u.id)) as count
|
||||||
FROM {$CFG->prefix}grade_items gi LEFT JOIN
|
FROM {$CFG->prefix}grade_items gi LEFT JOIN
|
||||||
{$CFG->prefix}grade_grades g ON gi.id = g.itemid RIGHT OUTER JOIN
|
{$CFG->prefix}grade_grades g ON gi.id = g.itemid RIGHT OUTER JOIN
|
||||||
{$CFG->prefix}user u ON u.id = g.userid LEFT JOIN
|
{$CFG->prefix}user u ON u.id = g.userid LEFT JOIN
|
||||||
|
@ -754,21 +746,23 @@ class grade_report_grader extends grade_report {
|
||||||
GROUP BY g.itemid";
|
GROUP BY g.itemid";
|
||||||
|
|
||||||
$groupsum = array();
|
$groupsum = array();
|
||||||
|
$groupscount = array();
|
||||||
$sums = get_records_sql($SQL);
|
$sums = get_records_sql($SQL);
|
||||||
foreach ($sums as $itemid => $csum) {
|
foreach ($sums as $itemid => $csum) {
|
||||||
$groupsum[$itemid] = $csum;
|
$groupsum[$itemid] = $csum->sum;
|
||||||
|
$groupscount[$itemid] = $csum->count;
|
||||||
}
|
}
|
||||||
|
|
||||||
$groupavghtml = '<tr><th>'.get_string('groupavg', 'grades').'</th>';
|
$groupavghtml = '<tr><th>'.get_string('groupavg', 'grades').'</th>';
|
||||||
foreach ($this->items as $item) {
|
foreach ($this->items as $item) {
|
||||||
if ($numusers == 0 || !isset($groupsum[$item->id])) {
|
if (empty($groupscount[$itemid]) || !isset($groupsum[$item->id])) {
|
||||||
$groupavghtml .= '<td>-</td>';
|
$groupavghtml .= '<td>-</td>';
|
||||||
} else {
|
} else {
|
||||||
$sum = $groupsum[$item->id];
|
$sum = $groupsum[$item->id];
|
||||||
|
|
||||||
if ($item->scaleid) {
|
if ($item->scaleid) {
|
||||||
$gradeitemsum = $groupsum[$item->id]->sum;
|
$gradeitemsum = $groupsum[$item->id];
|
||||||
$gradeitemavg = $gradeitemsum/$numusers;
|
$gradeitemavg = $gradeitemsum/$groupscount[$item->id];
|
||||||
|
|
||||||
$scaleval = round($this->get_grade_clean($gradeitemavg));
|
$scaleval = round($this->get_grade_clean($gradeitemavg));
|
||||||
|
|
||||||
|
@ -783,7 +777,7 @@ class grade_report_grader extends grade_report {
|
||||||
|
|
||||||
$gradehtml = $scales[$scaleval-1];
|
$gradehtml = $scales[$scaleval-1];
|
||||||
} else {
|
} else {
|
||||||
$gradeval = $this->get_grade_clean($sum->sum/$numusers);
|
$gradeval = $this->get_grade_clean($sum/$groupscount[$item->id]);
|
||||||
$gradehtml = $gradeval;
|
$gradehtml = $gradeval;
|
||||||
}
|
}
|
||||||
$groupavghtml .= '<td>'.$gradehtml.'</td>';
|
$groupavghtml .= '<td>'.$gradehtml.'</td>';
|
||||||
|
@ -802,12 +796,11 @@ class grade_report_grader extends grade_report {
|
||||||
global $CFG;
|
global $CFG;
|
||||||
|
|
||||||
$gradeavghtml = '';
|
$gradeavghtml = '';
|
||||||
$numusers = $this->get_numusers(false); // find total number of users, without group constraint
|
|
||||||
if ($this->get_pref('showaverages')) {
|
if ($this->get_pref('showaverages')) {
|
||||||
|
|
||||||
/** SQL for finding the SUM grades of all visible users ($CFG->gradebookroles) */
|
/** SQL for finding the SUM grades of all visible users ($CFG->gradebookroles) */
|
||||||
// do not sum -1 (no grade), treat as 0 for now
|
// do not sum -1 (no grade), treat as 0 for now
|
||||||
$SQL = "SELECT g.itemid, SUM(g.finalgrade) as sum
|
$SQL = "SELECT g.itemid, SUM(g.finalgrade) as sum, COUNT(DISTINCT(u.id)) as count
|
||||||
FROM {$CFG->prefix}grade_items gi LEFT JOIN
|
FROM {$CFG->prefix}grade_items gi LEFT JOIN
|
||||||
{$CFG->prefix}grade_grades g ON gi.id = g.itemid RIGHT OUTER JOIN
|
{$CFG->prefix}grade_grades g ON gi.id = g.itemid RIGHT OUTER JOIN
|
||||||
{$CFG->prefix}user u ON u.id = g.userid LEFT JOIN
|
{$CFG->prefix}user u ON u.id = g.userid LEFT JOIN
|
||||||
|
@ -821,18 +814,19 @@ class grade_report_grader extends grade_report {
|
||||||
$classsum = array();
|
$classsum = array();
|
||||||
$sums = get_records_sql($SQL);
|
$sums = get_records_sql($SQL);
|
||||||
foreach ($sums as $itemid => $csum) {
|
foreach ($sums as $itemid => $csum) {
|
||||||
$classsum[$itemid] = $csum;
|
$classsum[$itemid] = $csum->sum;
|
||||||
|
$classcount[$itemid] = $csum->count;
|
||||||
}
|
}
|
||||||
|
|
||||||
$gradeavghtml = '<tr><th>'.get_string('average', 'grades').'</th>';
|
$gradeavghtml = '<tr><th>'.get_string('average', 'grades').'</th>';
|
||||||
foreach ($this->items as $item) {
|
foreach ($this->items as $item) {
|
||||||
if ($numusers == 0 || !isset($classsum[$item->id])) {
|
if (empty($classcount[$itemid]) || !isset($classsum[$item->id])) {
|
||||||
$gradeavghtml .= '<td>-</td>';
|
$gradeavghtml .= '<td>-</td>';
|
||||||
} else {
|
} else {
|
||||||
$sum = $classsum[$item->id];
|
$sum = $classsum[$item->id];
|
||||||
|
|
||||||
if ($item->scaleid) {
|
if ($item->scaleid) {
|
||||||
$scaleval = round($this->get_grade_clean($sum->sum/$numusers));
|
$scaleval = round($this->get_grade_clean($sum/$classcount[$itemid]));
|
||||||
$scales_array = get_records_list('scale', 'id', $item->scaleid);
|
$scales_array = get_records_list('scale', 'id', $item->scaleid);
|
||||||
$scale = $scales_array[$item->scaleid];
|
$scale = $scales_array[$item->scaleid];
|
||||||
$scales = explode(",", $scale->scale);
|
$scales = explode(",", $scale->scale);
|
||||||
|
@ -844,7 +838,7 @@ class grade_report_grader extends grade_report {
|
||||||
|
|
||||||
$gradehtml = $scales[$scaleval-1];
|
$gradehtml = $scales[$scaleval-1];
|
||||||
} else {
|
} else {
|
||||||
$gradeval = $this->get_grade_clean($sum->sum/$numusers);
|
$gradeval = $this->get_grade_clean($sum/$classcount[$itemid]);
|
||||||
$gradehtml = $gradeval;
|
$gradehtml = $gradeval;
|
||||||
}
|
}
|
||||||
$gradeavghtml .= '<td>'.$gradehtml.'</td>';
|
$gradeavghtml .= '<td>'.$gradehtml.'</td>';
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue