MDL-11718 aggregated grades which depend on hidden grades are now hidden too; cleanup in user report

This commit is contained in:
skodak 2007-10-17 09:45:14 +00:00
parent a2cf7f1b8a
commit 6391ebe7da
4 changed files with 131 additions and 61 deletions

View File

@ -705,6 +705,11 @@ class grade_seq {
*/
var $items;
/**
* 1D array of elements
*/
var $elements;
/**
* Course context
*/
@ -727,7 +732,11 @@ class grade_seq {
// get course grade tree
$top_element = grade_category::fetch_course_tree($courseid, true);
$this->items = grade_seq::flatten($top_element, $category_grade_last, $nooutcomes);
$this->elements = grade_seq::flatten($top_element, $category_grade_last, $nooutcomes);
foreach ($this->elements as $key=>$unused) {
$this->items[$key] =& $this->elements[$key]['object'];
}
}
/**
@ -758,10 +767,10 @@ class grade_seq {
$result = array();
foreach ($children as $child) {
if ($child['type'] == 'category') {
$result = array_merge($result, grade_seq::flatten($child, $category_grade_last, $nooutcomes));
$result = $result + grade_seq::flatten($child, $category_grade_last, $nooutcomes);
} else {
$child['eid'] = 'i'.$child['object']->id;
$result[] = $child;
$result[$child['object']->id] = $child;
}
}
@ -809,7 +818,7 @@ class grade_seq {
}
// it is a category or item
foreach ($this->items as $element) {
foreach ($this->elements as $element) {
if ($element['eid'] == $eid) {
return $element;
}

View File

@ -124,103 +124,104 @@ class grade_report_user extends grade_report {
function fill_table() {
global $CFG;
$numusers = $this->get_numusers(false); // total course users
$items =& $this->gseq->items;
$grades = array();
foreach ($this->gseq->items as $element) {
$grade_item = $element['object'];
$decimalpoints = $grade_item->get_decimals();
$data = array();
$viewhidden = has_capability('moodle/grade:viewhidden', get_context_instance(CONTEXT_COURSE, $this->courseid));
foreach ($items as $key=>$unused) {
$grade_item =& $items[$key];
$grade_grade = new grade_grade(array('itemid'=>$grade_item->id, 'userid'=>$this->user->id));
$grade_grade->grade_item =& $grade_item;
$grades[$key] = $grade_grade;
$grades[$key]->grade_item =& $grade_item;
}
$hiding_affected = grade_grade::get_hiding_affected($grades, $items);
foreach ($items as $key=>$unused) {
$grade_item =& $items[$key];
$grade_grade =& $grades[$key];
$data = array();
// TODO: indicate items that "needsupdate" - missing final calculation
/// prints grade item name
if ($grade_item->is_course_item() or $grade_item->is_category_item()) {
$data[] = '<b>'.$grade_item->get_name().'</b>';
$data[] = '<div class="catname">'.$grade_item->get_name().'</div>';
} else {
$data[] = $this->get_module_link($grade_item->get_name(), $grade_item->itemmodule, $grade_item->iteminstance);;
$data[] = '<div class="itemname">'.$this->get_module_link($grade_item->get_name(), $grade_item->itemmodule, $grade_item->iteminstance).'</div>';
}
/// prints category
$cat = $grade_item->get_parent_category();
$data[] = $cat->fullname;
$data[] = $cat->get_name();
/// prints the grade
$displaytype = $grade_item->get_displaytype();
if ($grade_grade->is_excluded()) {
$excluded = get_string('excluded', 'grades').' ';
} else {
$excluded = '';
}
if ((int) $grade_grade->finalgrade < 1) {
$data[] = '-';
} elseif ($grade_grade->is_hidden() && !has_capability('moodle/grade:viewhidden', get_context_instance(CONTEXT_COURSE, $grade_item->courseid))) {
$data[] = get_string('gradedon', 'grades', userdate($grade_grade->timemodified));
} elseif ($grade_item->scaleid) {
if ($scale = get_record('scale', 'id', $grade_item->scaleid)) {
$scales = explode(",", $scale->scale);
// reindex because scale is off 1
$data[] = $excluded.$scales[$grade_grade->finalgrade-1];
}
if (is_null($grade_grade->finalgrade)) {
$data[] = $excluded . '-';
} else if (($grade_grade->is_hidden() or in_array($grade_item->id, $hiding_affected)) and !$viewhidden) {
// TODO: optinally do not show anything for hidden grades
// $data[] = '-';
if ($grade_grade->is_hidden()) {
$data[] = $excluded . '<div class="gradeddate">'.get_string('gradedon', 'grades', userdate($grade_grade->timemodified, get_string('strftimedatetimeshort'))).'</div>';
} else {
$data[] = $excluded . grade_format_gradevalue($grade_grade->finalgrade, $grade_item, true, $displaytype, $decimalpoints);
$data[] = $excluded . '-';
}
} else {
$data[] = $excluded . grade_format_gradevalue($grade_grade->finalgrade, $grade_item, true);
}
/// prints percentage
if ($grade_grade->is_hidden() && !has_capability('moodle/grade:viewhidden', get_context_instance(CONTEXT_COURSE, $grade_item->courseid))) {
if ((int) $grade_grade->finalgrade < 1) {
if (is_null($grade_grade->finalgrade)) {
$data[] = '-';
} else {
$data[] = get_string('gradedon', 'grades', userdate($grade_grade->timemodified));
}
} else {
if ($grade_item->gradetype == GRADE_TYPE_VALUE) {
// processing numeric grade
if ($grade_grade->finalgrade) {
$percentage = format_float(($grade_grade->finalgrade / $grade_item->grademax) * 100, $decimalpoints).'%';
} else {
$percentage = '-';
}
} else if ($grade_item->gradetype == GRADE_TYPE_SCALE) {
// processing scale grade
$scale = get_record('scale', 'id', $grade_item->scaleid);
$scalevals = explode(",", $scale->scale);
$percentage = format_float(($grade_grade->finalgrade) / count($scalevals) * 100, $decimalpoints).'%';
} else if (($grade_grade->is_hidden() or in_array($grade_item->id, $hiding_affected)) and !$viewhidden) {
$data[] = '-';
} else {
// text grade
$percentage = '-';
$data[] = grade_format_gradevalue($grade_grade->finalgrade, $grade_item, true, GRADE_DISPLAY_TYPE_PERCENTAGE);
}
$data[] = $percentage;
}
/// prints rank
if ($grade_grade->finalgrade) {
if (is_null($grade_grade->finalgrade)) {
// no grade, no rank
$data[] = '-';
} else if (($grade_grade->is_hidden() or in_array($grade_item->id, $hiding_affected)) and !$viewhidden) {
$data[] = '-';
} else {
/// find the number of users with a higher grade
$sql = "SELECT COUNT(DISTINCT(userid))
FROM {$CFG->prefix}grade_grades
WHERE finalgrade > $grade_grade->finalgrade
AND itemid = $grade_item->id";
WHERE finalgrade > {$grade_grade->finalgrade}
AND itemid = {$grade_item->id}";
$rank = count_records_sql($sql) + 1;
$data[] = "$rank/$numusers";
} else {
// no grade, no rank
$data[] = "-";
}
/// prints notes
if (!empty($grade_grade->feedback)) {
$data[] = format_text($grade_grade->feedback, $grade_grade->feedbackformat);
} else {
if (empty($grade_grade->feedback)) {
$data[] = '&nbsp;';
} else if (($grade_grade->is_hidden() or in_array($grade_item->id, $hiding_affected)) and !$viewhidden) {
$data[] = '&nbsp;';
} else {
$data[] = format_text($grade_grade->feedback, $grade_grade->feedbackformat);
}
$this->table->add_data($data);
}

View File

@ -471,5 +471,57 @@ class grade_grade extends grade_object {
$standardised_value = $factor * $diff + $target_min;
return $standardised_value;
}
/**
* Return array of grade item ids that are either hidden or indirectly depend
* on hidden grades, excluded grades are not returned.
* @static
* @param array $grades all course grades of one user
* @param array $items $grade_items array of grade items, & used for better internal caching
* @return array
*/
function get_hiding_affected($grade_grades, &$grade_items) {
if (count($grade_grades) !== count($grade_items)) {
error("Incorrent size of arrays in params of grade_grade::get_hiding_affected()!");
}
$dependson = array();
foreach($grade_items as $key=>$unused) {
$grade_item =& $grade_items[$key]; // reference for improved caching inside grade_item
$dependson[$grade_item->id] = $grade_item->depends_on();
}
$todo = array();
$hiding = array();
foreach($grade_grades as $grade_grade) {
if ($grade_grade->is_hidden() and !$grade_grade->is_excluded() and !is_null($grade_grade->finalgrade)) {
$hiding[] = $grade_grade->itemid;
} else {
$todo[] = $grade_grade->itemid;
}
}
$max = count($grade_items);
for($i=0; $i<$max; $i++) {
$found = false;
foreach($todo as $key=>$do) {
if (empty($dependson[$do])) {
unset($todo[$key]);
continue;
} else if (array_intersect($dependson[$do], $hiding)) {
// this item depends on hidden grade indirectly
$hiding[] = $do;
unset($todo[$key]);
$found = true;
}
}
if (!$found) {
break;
}
}
return $hiding;
}
}
?>

View File

@ -509,6 +509,14 @@ body#grade-index .grades .header {
font-weight: bold;
}
.grade-report-user .gradeddate {
font-size: 0.7em;
}
.grade-report-user .catname {
font-weight: bold;
}
/***
*** Login
***/