From 2bac025ea681a812c20a8f08bf49de006643d9e6 Mon Sep 17 00:00:00 2001 From: toyomoyo <toyomoyo> Date: Fri, 6 Jul 2007 08:43:33 +0000 Subject: [PATCH] MDL-10345, adding group sum and class total to grader report. No caching implemented yet but might not be needed. Testing required. --- grade/report/grader/index.php | 136 +++++++++++++++++++++++++++++----- 1 file changed, 119 insertions(+), 17 deletions(-) diff --git a/grade/report/grader/index.php b/grade/report/grader/index.php index 4750037644b..06e23092772 100644 --- a/grade/report/grader/index.php +++ b/grade/report/grader/index.php @@ -55,6 +55,8 @@ $target = optional_param('target', 0, PARAM_ALPHANUM); // Get the user preferences $perpage = get_user_preferences('grade_report_studentsperpage', $CFG->grade_report_studentsperpage); // number of users on a page $decimals = get_user_preferences('grade_report_decimalpoints', $CFG->grade_report_decimalpoints); // decimals in grades +$displaytotals = get_user_preferences('grade_report_showgrandtotals', $CFG->grade_report_showgrandtotals); +$displaygrouptotals = get_user_preferences('grade_report_showgroups', $CFG->grade_report_showgroups); $aggregation_position = get_user_preferences('grade_report_aggregationposition', $CFG->grade_report_aggregationposition); // Override perpage if set in URL @@ -62,6 +64,8 @@ if ($perpageurl = optional_param('perpage', 0, PARAM_INT)) { $perpage = $perpageurl; } +/// setting up groups + // Prepare language strings $strsortasc = get_string('sortasc', 'grades'); $strsortdesc = get_string('sortdesc', 'grades'); @@ -71,6 +75,23 @@ $baseurl = 'report.php?id='.$courseid.'&perpage='.$perpage.'&report=grad // base url for paging $pbarurl = 'report.php?id='.$courseid.'&perpage='.$perpage.'&report=grader&'; +/// find out current groups mode +$course = get_record('course', 'id', $courseid); +$groupmode = $course->groupmode; +$currentgroup = setup_and_print_groups($course, $groupmode, $baseurl); + +// update paging after group +$baseurl .= 'group='.$currentgroup.'&'; +$pbarurl .= 'group='.$currentgroup.'&'; + +if ($currentgroup) { + $groupsql = " LEFT JOIN {$CFG->prefix}groups_members gm ON gm.userid = u.id "; + $groupwheresql = " AND gm.groupid = $currentgroup "; +} else { + $groupsql = ''; + $groupwheresql = ''; +} + // Grab the grade_tree for this course $gtree = new grade_tree($courseid, true, false, $aggregation_position); @@ -183,14 +204,18 @@ if (is_numeric($sortitemid)) { FROM {$CFG->prefix}grade_grades g RIGHT OUTER JOIN {$CFG->prefix}user u ON (u.id = g.userid AND g.itemid = $sortitemid) LEFT JOIN {$CFG->prefix}role_assignments ra ON u.id = ra.userid + $groupsql WHERE ra.roleid in ($gradebookroles) - AND ra.contextid ".get_related_contexts_string($context)." + $groupwheresql + AND ra.contextid ".get_related_contexts_string($context)." ORDER BY g.finalgrade $sortorder"; $users = get_records_sql($sql, $perpage * $page, $perpage); } else { // default sort // get users sorted by lastname - $users = get_role_users(@implode(',', $CFG->gradebookroles), $context, false, 'u.id, u.firstname, u.lastname', 'u.'.$sortitemid .' '. $sortorder, false, $page * $perpage, $perpage); + $users = get_role_users(@implode(',', $CFG->gradebookroles), $context, false, 'u.id, u.firstname, u.lastname', 'u.'.$sortitemid .' '. $sortorder, false, $page * $perpage, $perpage, $currentgroup); + // need to cut users down by groups + } /// count total records for paging @@ -199,8 +224,10 @@ $countsql = "SELECT COUNT(DISTINCT u.id) FROM {$CFG->prefix}grade_grades g RIGHT OUTER JOIN {$CFG->prefix}user u ON (u.id = g.userid AND g.itemid = $sortitemid) LEFT JOIN {$CFG->prefix}role_assignments ra ON u.id = ra.userid + $groupsql WHERE ra.roleid in ($gradebookroles) - AND ra.contextid ".get_related_contexts_string($context); + $groupwheresql + AND ra.contextid ".get_related_contexts_string($context); $numusers = count_records_sql($countsql); // print_object($users); // debug @@ -220,7 +247,7 @@ $sql = "SELECT g.id, g.itemid, g.userid, g.finalgrade, g.hidden, g.locked, g.loc {$CFG->prefix}grade_grades g LEFT JOIN {$CFG->prefix}grade_grades_text gt ON g.id = gt.gradeid WHERE g.itemid = gi.id - AND gi.courseid = $courseid $userselect"; + AND gi.courseid = $courseid $userselect"; ///print_object($grades); //debug @@ -315,7 +342,6 @@ foreach ($gtree->levels as $key=>$row) { if ($type == 'filler' or $type == 'fillerfirst' or $type == 'fillerlast') { $headerhtml .= '<td class="'.$type.$catlevel.'" '.$colspan.'> </td>'; - } else if ($type == 'category') { $headerhtml .= '<td class="category'.$catlevel.'" '.$colspan.'>'.$element['object']->get_name(); @@ -325,7 +351,6 @@ foreach ($gtree->levels as $key=>$row) { } $headerhtml .= '</td>'; - } else { if ($element['object']->id == $sortitemid) { if ($sortorder == 'ASC') { @@ -360,6 +385,7 @@ foreach ($gtree->levels as $key=>$row) { $items[$element['object']->sortorder] =& $element['object']; } + } $headerhtml .= '</tr>'; @@ -379,16 +405,7 @@ foreach ($users as $userid => $user) { if (isset($finalgrades[$userid][$item->id])) { - $gradeval = $finalgrades[$userid][$item->id]->finalgrade; - - // trim trailing "0"s - if (isset($gradeval)) { - if ($gradeval != 0) { - $gradeval = trim($gradeval, ".0"); - } else { - $gradeval = 0; - } - } + $gradeval = get_grade_clean($finalgrades[$userid][$item->id]->finalgrade); $grade = new grade_grades($finalgrades[$userid][$item->id], false); $grade->feedback = $finalgrades[$userid][$item->id]->feedback; @@ -437,7 +454,7 @@ foreach ($users as $userid => $user) { if ((int) $gradeval < 1) { $studentshtml .= '-'; } else { - $studentshtml .= round($scales[$gradeval-1], $decimals); + $studentshtml .= $scales[$gradeval-1]; } } else { // no such scale, throw error? @@ -461,8 +478,81 @@ foreach ($users as $userid => $user) { $studentshtml .= '</tr>'; } +// if user preference to display group sum +if ($currentgroup && ($displaygrouptotals || 1)) { + +/** SQL for finding group sum */ + $SQL = "SELECT g.itemid, SUM(g.finalgrade) as sum + FROM {$CFG->prefix}grade_items gi LEFT 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}role_assignments ra ON u.id = ra.userid + $groupsql + WHERE gi.courseid = $courseid + $groupwheresql + AND ra.roleid in ($gradebookroles) + AND ra.contextid ".get_related_contexts_string($context)." + GROUP BY g.itemid"; + + $groupsum = array(); + $sums = get_records_sql($SQL); + foreach ($sums as $itemid => $csum) { + $groupsum[$itemid] = $csum; + } + + $groupsumhtml = '<tr><th>Group total</th>'; + foreach ($items as $item) { + if (!isset($groupsum[$item->id])) { + $groupsumhtml .= '<td>-</td>'; + } else { + $sum = $groupsum[$item->id]; + $groupsumhtml .= '<td>'.get_grade_clean($sum->sum).'</td>'; + } + } + $groupsumhtml .= '</tr>'; +} else { + $groupsumhtml = ''; +} + +// user preference not implemented yet +if ($displaytotals || 1) { + +/** SQL for finding the SUM grades of all visible users ($CFG->gradebookroles) */ + + $SQL = "SELECT g.itemid, SUM(g.finalgrade) as sum + FROM {$CFG->prefix}grade_items gi LEFT 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}role_assignments ra ON u.id = ra.userid + WHERE gi.courseid = $courseid + AND ra.roleid in ($gradebookroles) + AND ra.contextid ".get_related_contexts_string($context)." + GROUP BY g.itemid"; + + $classsum = array(); + $sums = get_records_sql($SQL); + foreach ($sums as $itemid => $csum) { + $classsum[$itemid] = $csum; + } + + $gradesumhtml = '<tr><th>Total</th>'; + foreach ($items as $item) { + if (!isset($classsum[$item->id])) { + $gradesumhtml .= '<td>-</td>'; + } else { + $sum = $classsum[$item->id]; + $gradesumhtml .= '<td>'.get_grade_clean($sum->sum).'</td>'; + } + } + $gradesumhtml .= '</tr>'; +} else { + $gradesumhtml = ''; +} + $reporthtml = "<table class=\"boxaligncenter\">$headerhtml"; $reporthtml .= $studentshtml; +$reporthtml .= $groupsumhtml; +$reporthtml .= $gradesumhtml; $reporthtml .= "</table>"; // print submit button @@ -481,4 +571,16 @@ if ($USER->gradeediting) { echo '<div style="text-align:center"><input type="submit" value="'.get_string('update').'" /></div>'; echo '</div></form>'; } + +// remove trailing 0s and "."s +function get_grade_clean($gradeval) { + + if ($gradeval != 0) { + $gradeval = trim($gradeval, ".0"); + } else { + $gradeval = 0; + } + + return $gradeval; +} ?>