MDL-9506 Experimental development of numbering and displaying of category and items tree/table. Messy work :-)

This commit is contained in:
nicolasconnault 2007-05-15 09:59:53 +00:00
parent 1531d1efef
commit 5e16f809f8
2 changed files with 510 additions and 1 deletions

View File

@ -646,6 +646,129 @@ class grade_category extends grade_object {
}
return $this->parent_category;
}
/**
* Static method that returns a sorted, nested array of all grade_categories and grade_items for
* a given course, or for the entire site if no courseid is given.
* @param int $courseid
* @param boolean $fullobjects Whether to instantiate full objects based on the data or not
* @return array
*/
function get_tree($courseid=NULL, $fullobjects=true) {
global $CFG;
global $db;
$db->debug = false;
$tree = array();
$fillers = array();
$category_table = $CFG->prefix . 'grade_categories';
$items_table = $CFG->prefix . 'grade_items';
$constraint = '';
$itemconstraint = '';
if (!empty($courseid)) {
$constraint = " AND $category_table.courseid = $courseid ";
$itemconstraint = " AND $items_table.courseid = $courseid ";
}
// Get ordered list of grade_items (not category type)
$query = "SELECT * FROM $items_table WHERE itemtype <> 'category' $itemconstraint ORDER BY sortorder";
$grade_items = get_records_sql($query);
// For every grade_item that doesn't have a parent category, create category fillers
foreach ($grade_items as $itemid => $item) {
if (empty($item->categoryid)) {
if ($fullobjects) {
$item = new grade_item($item);
}
$fillers[$item->sortorder] = $item;
}
}
// Get all top categories first
$query = "SELECT $category_table.*, sortorder FROM $category_table, $items_table
WHERE iteminstance = $category_table.id AND depth = 1 $constraint ORDER BY sortorder";
$topcats = get_records_sql($query);
if (empty($topcats)) {
return null;
}
foreach ($topcats as $topcatid => $topcat) {
// Check the fillers array, see if one must be inserted before this topcat
if (key($fillers) < $topcat->sortorder) {
$sortorder = key($fillers);
$itemtoinsert = current($fillers);
unset($fillers[$sortorder]);
$tree[] = array('object' => 'filler', 'children' =>
array(0 => array('object' => 'filler', 'children' =>
array(0 => array('object' => $itemtoinsert, 'finalgrades' => null)))));
}
$query = "SELECT $category_table.* FROM $category_table, $items_table
WHERE iteminstance = $category_table.id AND parent = $topcatid ORDER BY sortorder";
$subcats = get_records_sql($query);
$subcattree = array();
if (empty($subcats)) {
continue;
}
foreach ($subcats as $subcatid => $subcat) {
$itemtree = array();
$items = get_records('grade_items', 'categoryid', $subcatid, 'sortorder');
if (empty($items)) {
continue;
}
foreach ($items as $itemid => $item) {
$finaltree = array();
if ($fullobjects) {
$final = new grade_grades_final();
$final->itemid = $itemid;
$finals = $final->fetch_all_using_this();
} else {
$finals = get_records('grade_grades_final', 'itemid', $itemid);
}
if ($fullobjects) {
$item = new grade_item($item);
}
$itemtree[] = array('object' => $item, 'finalgrades' => $finals);
}
if ($fullobjects) {
$subcat = new grade_category($subcat, false);
}
$subcattree[] = array('object' => $subcat, 'children' => $itemtree);
}
if ($fullobjects) {
$topcat = new grade_category($topcat, false);
}
$tree[] = array('object' => $topcat, 'children' => $subcattree);
}
// If there are still grade_items, outside of categories, add another filler
if (!empty($fillers)) {
foreach ($fillers as $sortorder => $item) {
$tree[] = array('object' => 'filler', 'children' =>
array(0 => array('object' => 'filler', 'children' =>
array(0 => array('object' => $item, 'finalgrades' => null)))));
}
}
$db->debug = false;
return $tree;
}
}
?>

View File

@ -389,6 +389,7 @@ class gradelib_test extends UnitTestCase {
$grade_category->hidden = 0;
$grade_category->timecreated = mktime();
$grade_category->timemodified = mktime();
$grade_category->depth = 1;
if ($grade_category->id = insert_record('grade_categories', $grade_category)) {
$this->grade_categories[] = $grade_category;
@ -405,6 +406,7 @@ class gradelib_test extends UnitTestCase {
$grade_category->parent = $this->grade_categories[0]->id;
$grade_category->timecreated = mktime();
$grade_category->timemodified = mktime();
$grade_category->depth = 2;
if ($grade_category->id = insert_record('grade_categories', $grade_category)) {
$this->grade_categories[] = $grade_category;
@ -421,6 +423,25 @@ class gradelib_test extends UnitTestCase {
$grade_category->parent = $this->grade_categories[0]->id;
$grade_category->timecreated = mktime();
$grade_category->timemodified = mktime();
$grade_category->depth = 2;
if ($grade_category->id = insert_record('grade_categories', $grade_category)) {
$this->grade_categories[] = $grade_category;
}
// A category with no parent, but grade_items as children
$grade_category = new stdClass();
$grade_category->fullname = 'level1category';
$grade_category->courseid = $this->courseid;
$grade_category->aggregation = GRADE_AGGREGATE_MEAN;
$grade_category->keephigh = 100;
$grade_category->droplow = 10;
$grade_category->hidden = 0;
$grade_category->timecreated = mktime();
$grade_category->timemodified = mktime();
$grade_category->depth = 1;
if ($grade_category->id = insert_record('grade_categories', $grade_category)) {
$this->grade_categories[] = $grade_category;
@ -431,6 +452,7 @@ class gradelib_test extends UnitTestCase {
* Load grade_item data into the database, and adds the corresponding objects to this class' variable.
*/
function load_grade_items() {
// id = 0
$grade_item = new stdClass();
$grade_item->courseid = $this->courseid;
@ -446,11 +468,13 @@ class gradelib_test extends UnitTestCase {
$grade_item->iteminfo = 'Grade item used for unit testing';
$grade_item->timecreated = mktime();
$grade_item->timemodified = mktime();
$grade_item->sortorder = 3;
if ($grade_item->id = insert_record('grade_items', $grade_item)) {
$this->grade_items[] = $grade_item;
}
// id = 1
$grade_item = new stdClass();
$grade_item->courseid = $this->courseid;
@ -467,11 +491,13 @@ class gradelib_test extends UnitTestCase {
$grade_item->locked = mktime() + 240000;
$grade_item->timecreated = mktime();
$grade_item->timemodified = mktime();
$grade_item->sortorder = 4;
if ($grade_item->id = insert_record('grade_items', $grade_item)) {
$this->grade_items[] = $grade_item;
}
// id = 2
$grade_item = new stdClass();
$grade_item->courseid = $this->courseid;
@ -487,12 +513,14 @@ class gradelib_test extends UnitTestCase {
$grade_item->iteminfo = 'Grade item used for unit testing';
$grade_item->timecreated = mktime();
$grade_item->timemodified = mktime();
$grade_item->sortorder = 6;
if ($grade_item->id = insert_record('grade_items', $grade_item)) {
$this->grade_items[] = $grade_item;
}
// Load grade_items associated with the 3 categories
// id = 3
$grade_item = new stdClass();
$grade_item->courseid = $this->courseid;
@ -505,11 +533,13 @@ class gradelib_test extends UnitTestCase {
$grade_item->iteminfo = 'Grade item used for unit testing';
$grade_item->timecreated = mktime();
$grade_item->timemodified = mktime();
$grade_item->sortorder = 1;
if ($grade_item->id = insert_record('grade_items', $grade_item)) {
$this->grade_items[] = $grade_item;
}
// id = 4
$grade_item = new stdClass();
$grade_item->courseid = $this->courseid;
@ -522,11 +552,13 @@ class gradelib_test extends UnitTestCase {
$grade_item->iteminfo = 'Grade item used for unit testing';
$grade_item->timecreated = mktime();
$grade_item->timemodified = mktime();
$grade_item->sortorder = 2;
if ($grade_item->id = insert_record('grade_items', $grade_item)) {
$this->grade_items[] = $grade_item;
}
// id = 5
$grade_item = new stdClass();
$grade_item->courseid = $this->courseid;
@ -539,6 +571,94 @@ class gradelib_test extends UnitTestCase {
$grade_item->iteminfo = 'Grade item used for unit testing';
$grade_item->timecreated = mktime();
$grade_item->timemodified = mktime();
$grade_item->sortorder = 5;
if ($grade_item->id = insert_record('grade_items', $grade_item)) {
$this->grade_items[] = $grade_item;
}
// Orphan grade_item
// id = 6
$grade_item = new stdClass();
$grade_item->courseid = $this->courseid;
$grade_item->itemname = 'unittestorphangradeitem1';
$grade_item->itemtype = 'mod';
$grade_item->itemmodule = 'quiz';
$grade_item->iteminstance = 1;
$grade_item->gradetype = GRADE_TYPE_VALUE;
$grade_item->grademin = 10;
$grade_item->grademax = 120;
$grade_item->iteminfo = 'Orphan Grade item used for unit testing';
$grade_item->timecreated = mktime();
$grade_item->timemodified = mktime();
$grade_item->sortorder = 7;
if ($grade_item->id = insert_record('grade_items', $grade_item)) {
$this->grade_items[] = $grade_item;
}
// 2 grade items under level1category
// id = 7
$grade_item = new stdClass();
$grade_item->courseid = $this->courseid;
$grade_item->categoryid = $this->grade_categories[3]->id;
$grade_item->itemname = 'grade_item with only one parent level';
$grade_item->itemtype = 'mod';
$grade_item->itemmodule = 'forum';
$grade_item->iteminstance = 3;
$grade_item->gradetype = GRADE_TYPE_SCALE;
$grade_item->scaleid = 1;
$grade_item->grademin = 0;
$grade_item->grademax = 7;
$grade_item->iteminfo = 'Grade item used for unit testing';
$grade_item->timecreated = mktime();
$grade_item->timemodified = mktime();
$grade_item->sortorder = 9;
if ($grade_item->id = insert_record('grade_items', $grade_item)) {
$this->grade_items[] = $grade_item;
}
// id = 8
$grade_item = new stdClass();
$grade_item->courseid = $this->courseid;
$grade_item->categoryid = $this->grade_categories[3]->id;
$grade_item->itemname = 'grade_item with only one parent level';
$grade_item->itemtype = 'mod';
$grade_item->itemmodule = 'forum';
$grade_item->iteminstance = 3;
$grade_item->gradetype = GRADE_TYPE_VALUE;
$grade_item->grademin = 0;
$grade_item->grademax = 100;
$grade_item->iteminfo = 'Grade item used for unit testing';
$grade_item->timecreated = mktime();
$grade_item->timemodified = mktime();
$grade_item->sortorder = 10;
if ($grade_item->id = insert_record('grade_items', $grade_item)) {
$this->grade_items[] = $grade_item;
}
// Grade_item for level1category
// id = 9
$grade_item = new stdClass();
$grade_item->courseid = $this->courseid;
$grade_item->itemname = 'grade_item for level1 category';
$grade_item->itemtype = 'category';
$grade_item->itemmodule = 'quiz';
$grade_item->iteminstance = 1;
$grade_item->needsupdate = true;
$grade_item->gradetype = GRADE_TYPE_VALUE;
$grade_item->grademin = 10;
$grade_item->grademax = 120;
$grade_item->iteminfo = 'Orphan Grade item used for unit testing';
$grade_item->timecreated = mktime();
$grade_item->timemodified = mktime();
$grade_item->sortorder = 8;
if ($grade_item->id = insert_record('grade_items', $grade_item)) {
$this->grade_items[] = $grade_item;
@ -763,6 +883,111 @@ class gradelib_test extends UnitTestCase {
if ($grade_raw->id = insert_record('grade_grades_raw', $grade_raw)) {
$this->grade_grades_raw[] = $grade_raw;
}
// Grades for grade_item 7
$grade_raw = new stdClass();
$grade_raw->itemid = $this->grade_items[6]->id;
$grade_raw->userid = 1;
$grade_raw->gradevalue = 97;
$grade_raw->timecreated = mktime();
$grade_raw->timemodified = mktime();
if ($grade_raw->id = insert_record('grade_grades_raw', $grade_raw)) {
$this->grade_grades_raw[] = $grade_raw;
}
$grade_raw = new stdClass();
$grade_raw->itemid = $this->grade_items[6]->id;
$grade_raw->userid = 2;
$grade_raw->gradevalue = 49;
$grade_raw->timecreated = mktime();
$grade_raw->timemodified = mktime();
if ($grade_raw->id = insert_record('grade_grades_raw', $grade_raw)) {
$this->grade_grades_raw[] = $grade_raw;
}
$grade_raw = new stdClass();
$grade_raw->itemid = $this->grade_items[6]->id;
$grade_raw->userid = 3;
$grade_raw->gradevalue = 67;
$grade_raw->timecreated = mktime();
$grade_raw->timemodified = mktime();
if ($grade_raw->id = insert_record('grade_grades_raw', $grade_raw)) {
$this->grade_grades_raw[] = $grade_raw;
}
// Grades for grade_item 8
$grade_raw = new stdClass();
$grade_raw->itemid = $this->grade_items[7]->id;
$grade_raw->userid = 1;
$grade_raw->gradevalue = 97;
$grade_raw->timecreated = mktime();
$grade_raw->timemodified = mktime();
if ($grade_raw->id = insert_record('grade_grades_raw', $grade_raw)) {
$this->grade_grades_raw[] = $grade_raw;
}
$grade_raw = new stdClass();
$grade_raw->itemid = $this->grade_items[7]->id;
$grade_raw->userid = 2;
$grade_raw->gradevalue = 49;
$grade_raw->timecreated = mktime();
$grade_raw->timemodified = mktime();
if ($grade_raw->id = insert_record('grade_grades_raw', $grade_raw)) {
$this->grade_grades_raw[] = $grade_raw;
}
$grade_raw = new stdClass();
$grade_raw->itemid = $this->grade_items[7]->id;
$grade_raw->userid = 3;
$grade_raw->gradevalue = 67;
$grade_raw->timecreated = mktime();
$grade_raw->timemodified = mktime();
if ($grade_raw->id = insert_record('grade_grades_raw', $grade_raw)) {
$this->grade_grades_raw[] = $grade_raw;
}
// Grades for grade_item 9
$grade_raw = new stdClass();
$grade_raw->itemid = $this->grade_items[8]->id;
$grade_raw->userid = 1;
$grade_raw->gradevalue = 49;
$grade_raw->timecreated = mktime();
$grade_raw->timemodified = mktime();
if ($grade_raw->id = insert_record('grade_grades_raw', $grade_raw)) {
$this->grade_grades_raw[] = $grade_raw;
}
$grade_raw = new stdClass();
$grade_raw->itemid = $this->grade_items[8]->id;
$grade_raw->userid = 2;
$grade_raw->gradevalue = 93;
$grade_raw->timecreated = mktime();
$grade_raw->timemodified = mktime();
if ($grade_raw->id = insert_record('grade_grades_raw', $grade_raw)) {
$this->grade_grades_raw[] = $grade_raw;
}
$grade_raw = new stdClass();
$grade_raw->itemid = $this->grade_items[7]->id;
$grade_raw->userid = 3;
$grade_raw->gradevalue = 76;
$grade_raw->timecreated = mktime();
$grade_raw->timemodified = mktime();
if ($grade_raw->id = insert_record('grade_grades_raw', $grade_raw)) {
$this->grade_grades_raw[] = $grade_raw;
}
}
/**
@ -881,6 +1106,120 @@ class gradelib_test extends UnitTestCase {
if ($grade_final->id = insert_record('grade_grades_final', $grade_final)) {
$this->grade_grades_final[] = $grade_final;
}
// Grades for grade_item 7 (orphan item)
$grade_final = new stdClass();
$grade_final->itemid = $this->grade_items[6]->id;
$grade_final->userid = 1;
$grade_final->gradevalue = 69;
$grade_final->timecreated = mktime();
$grade_final->timemodified = mktime();
$grade_final->locked = true;
if ($grade_final->id = insert_record('grade_grades_final', $grade_final)) {
$this->grade_grades_final[] = $grade_final;
}
$grade_final = new stdClass();
$grade_final->itemid = $this->grade_items[6]->id;
$grade_final->userid = 2;
$grade_final->gradevalue = 87;
$grade_final->timecreated = mktime();
$grade_final->timemodified = mktime();
$grade_final->locked = true;
if ($grade_final->id = insert_record('grade_grades_final', $grade_final)) {
$this->grade_grades_final[] = $grade_final;
}
$grade_final = new stdClass();
$grade_final->itemid = $this->grade_items[6]->id;
$grade_final->userid = 3;
$grade_final->gradevalue = 94;
$grade_final->timecreated = mktime();
$grade_final->timemodified = mktime();
$grade_final->locked = false;
if ($grade_final->id = insert_record('grade_grades_final', $grade_final)) {
$this->grade_grades_final[] = $grade_final;
}
// Grades for grade_item 8
$grade_final = new stdClass();
$grade_final->itemid = $this->grade_items[7]->id;
$grade_final->userid = 1;
$grade_final->gradevalue = 69;
$grade_final->timecreated = mktime();
$grade_final->timemodified = mktime();
$grade_final->locked = true;
if ($grade_final->id = insert_record('grade_grades_final', $grade_final)) {
$this->grade_grades_final[] = $grade_final;
}
$grade_final = new stdClass();
$grade_final->itemid = $this->grade_items[7]->id;
$grade_final->userid = 2;
$grade_final->gradevalue = 87;
$grade_final->timecreated = mktime();
$grade_final->timemodified = mktime();
$grade_final->locked = true;
if ($grade_final->id = insert_record('grade_grades_final', $grade_final)) {
$this->grade_grades_final[] = $grade_final;
}
$grade_final = new stdClass();
$grade_final->itemid = $this->grade_items[7]->id;
$grade_final->userid = 3;
$grade_final->gradevalue = 94;
$grade_final->timecreated = mktime();
$grade_final->timemodified = mktime();
$grade_final->locked = false;
if ($grade_final->id = insert_record('grade_grades_final', $grade_final)) {
$this->grade_grades_final[] = $grade_final;
}
// Grades for grade_item 9
$grade_final = new stdClass();
$grade_final->itemid = $this->grade_items[8]->id;
$grade_final->userid = 1;
$grade_final->gradevalue = 69;
$grade_final->timecreated = mktime();
$grade_final->timemodified = mktime();
$grade_final->locked = true;
if ($grade_final->id = insert_record('grade_grades_final', $grade_final)) {
$this->grade_grades_final[] = $grade_final;
}
$grade_final = new stdClass();
$grade_final->itemid = $this->grade_items[8]->id;
$grade_final->userid = 2;
$grade_final->gradevalue = 87;
$grade_final->timecreated = mktime();
$grade_final->timemodified = mktime();
$grade_final->locked = true;
if ($grade_final->id = insert_record('grade_grades_final', $grade_final)) {
$this->grade_grades_final[] = $grade_final;
}
$grade_final = new stdClass();
$grade_final->itemid = $this->grade_items[8]->id;
$grade_final->userid = 3;
$grade_final->gradevalue = 94;
$grade_final->timecreated = mktime();
$grade_final->timemodified = mktime();
$grade_final->locked = false;
if ($grade_final->id = insert_record('grade_grades_final', $grade_final)) {
$this->grade_grades_final[] = $grade_final;
}
}
/**
@ -970,7 +1309,7 @@ class gradelib_test extends UnitTestCase {
$grade_items = grade_get_items($this->courseid);
$this->assertTrue(is_array($grade_items));
$this->assertEqual(count($grade_items), 6);
$this->assertEqual(count($grade_items), 10);
}
}
@ -1032,6 +1371,53 @@ class gradelib_test extends UnitTestCase {
$this->assertEqual(4, round(standardise_score(6, 0, 7, 0, 5)));
$this->assertEqual(40, standardise_score(50, 30, 80, 0, 100));
}
/**
* This is not a real unit test, but an experimental attempt at building a HTML table
* based on the sortorders set for each test grade_item.
*/
function test_grade_build_table() {
// 1. Fetch all top-level categories for this course, with all children preloaded, sorted by sortorder
$tree = grade_category::get_tree($this->courseid);
$topcathtml = '<tr>';
$cathtml = '<tr>';
$itemhtml = '<tr>';
foreach ($tree as $topcat) {
$itemcount = 0;
foreach ($topcat['children'] as $catkey => $cat) {
$catitemcount = 0;
foreach ($cat['children'] as $item) {
$itemcount++;
$catitemcount++;
$itemhtml .= '<td>' . $item['object']->itemname . '</td>';
}
if ($cat['object'] == 'filler') {
$cathtml .= '<td class="subfiller">&nbsp;</td>';
} else {
$cat['object']->load_grade_item();
$cathtml .= '<td colspan="' . $catitemcount . '">' . $cat['object']->fullname . '</td>';
}
}
if ($topcat['object'] == 'filler') {
$topcathtml .= '<td class="topfiller">&nbsp;</td>';
} else {
$topcathtml .= '<th colspan="' . $itemcount . '">' . $topcat['object']->fullname . '</th>';
}
}
$itemhtml .= '</tr>';
$cathtml .= '</tr>';
$topcathtml .= '</tr>';
echo "<table style=\"text-align: center\" border=\"1\">$topcathtml$cathtml$itemhtml</table>";
}
}
?>