From 6500f2807f897941c1f3b058bbd4ef76ebdb8f18 Mon Sep 17 00:00:00 2001 From: nicolasconnault Date: Wed, 20 Jun 2007 11:56:51 +0000 Subject: [PATCH] First draft of the grader report --- grade/report/admin/README.txt | 1 + grade/report/admin/db/access.php | 29 +++++ grade/report/admin/index.php | 182 +++++++++++++++++++++++++++++++ grade/report/grader/category.php | 6 +- grade/report/grader/index.php | 16 ++- lib/grade/grade_tree.php | 75 ++++++++++++- 6 files changed, 299 insertions(+), 10 deletions(-) create mode 100644 grade/report/admin/README.txt create mode 100644 grade/report/admin/db/access.php create mode 100644 grade/report/admin/index.php diff --git a/grade/report/admin/README.txt b/grade/report/admin/README.txt new file mode 100644 index 0000000000..7836ea2e10 --- /dev/null +++ b/grade/report/admin/README.txt @@ -0,0 +1 @@ +The default gradebook interface that teachers will use. diff --git a/grade/report/admin/db/access.php b/grade/report/admin/db/access.php new file mode 100644 index 0000000000..a67c2ab907 --- /dev/null +++ b/grade/report/admin/db/access.php @@ -0,0 +1,29 @@ + array( + 'riskbitmask' => RISK_PERSONAL, + 'captype' => 'read', + 'contextlevel' => CONTEXT_COURSE, + 'legacy' => array( + 'teacher' => CAP_ALLOW, + 'editingteacher' => CAP_ALLOW, + 'admin' => CAP_ALLOW + ) + ), + + 'gradereport/grader:manage' => array( + 'riskbitmask' => RISK_PERSONAL | RISK_CONFIG, + 'captype' => 'write', + 'contextlevel' => CONTEXT_COURSE, + 'legacy' => array( + 'teacher' => CAP_ALLOW, + 'editingteacher' => CAP_ALLOW, + 'admin' => CAP_ALLOW + ) + ) + +); + +?> diff --git a/grade/report/admin/index.php b/grade/report/admin/index.php new file mode 100644 index 0000000000..947514a273 --- /dev/null +++ b/grade/report/admin/index.php @@ -0,0 +1,182 @@ +libdir . '/grade/grade_tree.php'; +require_once $CFG->libdir . '/gradelib.php'; + +$param = new stdClass(); + +$param->courseid = optional_param('courseid', 0 , PARAM_INT); +$param->moveup = optional_param('moveup', 0, PARAM_INT); +$param->movedown = optional_param('movedown', 0, PARAM_INT); +$param->source = optional_param('source', 0, PARAM_INT); +$param->action = optional_param('action', 0, PARAM_ALPHA); +$param->move = optional_param('move', 0, PARAM_INT); +$param->type = optional_param('type', 0, PARAM_ALPHA); +$param->target = optional_param('target', 0, PARAM_INT); +$param->confirm = optional_param('confirm', 0, PARAM_INT); +$param->items = optional_param('items', 0, PARAM_INT); +$param->categories = optional_param('categories', 0, PARAM_INT); +$param->element_type = optional_param('element_type', 0, PARAM_ALPHA); +$param->category_name = optional_param('category_name', 0, PARAM_ALPHA); + +print_object($param); + +$tree = new grade_tree($param->courseid); +$select_source = false; + +if (!empty($param->action) && !empty($param->source) && confirm_sesskey()) { + $element = $tree->locate_element($param->source); + $element_name = $element->element['object']->get_name(); + + $strselectdestination = get_string('selectdestination', 'grades', $element_name); + $strmovingelement = get_string('movingelement', 'grades', $element_name); + $strcancel = get_string('cancel'); + + print_heading($strselectdestination); + + echo $strmovingelement . ' (' . $strcancel . ')' . "\n"; +} elseif (!empty($param->source) && confirm_sesskey()) { + if (!empty($param->moveup)) { + $tree->move_element($param->source, $param->moveup); + } elseif(!empty($param->movedown)) { + $tree->move_element($param->source, $param->movedown, 'after'); + } elseif(!empty($param->move)) { + $tree->move_element($param->source, $param->move, 'after'); + } + + $tree->renumber(); + $tree->update_db(); +} elseif (!empty($param->target) && !empty($param->action) && confirm_sesskey()) { + $element = $tree->locate_element($param->target); + switch ($param->action) { + case 'edit': + break; + case 'delete': + if ($param->confirm == 1) { // Perform the deletion + $tree->remove_element($param->target); + $tree->renumber(); + $tree->update_db(); + // Print result message + + } else { // Print confirmation dialog + $strdeletecheckfull = get_string('deletecheck', '', $element->element['object']->get_name()); + $linkyes = "category.php?target=$param->target&action=delete&confirm=1$tree->commonvars"; + $linkno = "category.php?$tree->commonvars"; + notice_yesno($strdeletecheckfull, $linkyes, $linkno); + } + break; + + case 'hide': + // TODO Implement calendar for selection of a date to hide element until + if (!$element->element['object']->set_hidden(1)) { + debugging("Could not update the element's hidden state!"); + } else { + $tree = new grade_tree($param->courseid); + } + break; + case 'show': + if (!$element->element['object']->set_hidden(0)) { + debugging("Could not update the element's hidden state!"); + } else { + $tree = new grade_tree($param->courseid); + } + break; + case 'lock': + // TODO Implement calendar for selection of a date to lock element after + if (!$element->element['object']->set_locked(1)) { + debugging("Could not update the element's locked state!"); + } else { + $tree = new grade_tree($param->courseid); + } + break; + case 'unlock': + if (!$element->element['object']->set_locked(0)) { + debugging("Could not update the element's locked state!"); + } else { + $tree = new grade_tree($param->courseid); + } + break; + default: + break; + } + unset($param->target); +} elseif (!empty($param->element_type) && !empty($param->action) && $param->action == 'create' && confirm_sesskey()) { + if (empty($param->category_name)) { + notice(get_string('createcategoryerror', 'grades') . ': ' . get_string('nocategoryname', 'grades')); + } elseif ($param->element_type == 'items') { + + if (!empty($param->items)) { + $category = new grade_category(); + $category->fullname = $param->category_name; + $category->courseid = $tree->courseid; + $category->insert(); + + $items = array(); + + foreach ($param->items as $sortorder => $useless_var) { + $element = $tree->locate_element($sortorder); + $items[$element->element['object']->id] = $element->element['object']; + } + + if ($category->set_as_parent($items) && $category->update()) { + $tree = new grade_tree($param->courseid); + } else { // creation of category didn't work, print a message + debugging("Could not create a parent category over the items you selected.."); + } + + } else { // No items selected. Can't create a category over them... + notice(get_string('createcategoryerror', 'grades') . ': ' . get_string('noselecteditems', 'grades')); + } + } elseif ($param->element_type == 'categories') { + if (!empty($param->categories)) { + $category = new grade_category(); + $category->fullname = $param->category_name; + $category->courseid = $tree->courseid; + $category->insert(); + + $categories = array(); + foreach ($param->categories as $sortorder => $useless_var) { + $element = $tree->locate_element($sortorder); + $categories[$element->element['object']->id] = $element->element['object']; + } + + if ($category->set_as_parent($categories) && $category->update()) { + $tree = new grade_tree($param->courseid); + } else { // creation of category didn't work, print a message + debugging("Could not create a parent category over the categories you selected.."); + } + + } else { // No categories selected. Can't create a category over them... + notice(get_string('createcategoryerror', 'grades') . ': ' . get_string('noselectedcategories', 'grades')); + } + + } else { // The element_type wasn't set properly, throw up an error + + } +} +print_heading(get_string('graderreport', 'grades')); +echo $tree->get_edit_tree(1, null, $param->source, $param->action, $param->type); +?> diff --git a/grade/report/grader/category.php b/grade/report/grader/category.php index 69213a2f53..947514a273 100644 --- a/grade/report/grader/category.php +++ b/grade/report/grader/category.php @@ -23,10 +23,8 @@ // // /////////////////////////////////////////////////////////////////////////// set_time_limit(0); -require_once '../../../config.php'; require_once $CFG->libdir . '/grade/grade_tree.php'; require_once $CFG->libdir . '/gradelib.php'; -print_header('Edit categories'); $param = new stdClass(); @@ -179,8 +177,6 @@ if (!empty($param->action) && !empty($param->source) && confirm_sesskey()) { } } - +print_heading(get_string('graderreport', 'grades')); echo $tree->get_edit_tree(1, null, $param->source, $param->action, $param->type); - -print_footer(); ?> diff --git a/grade/report/grader/index.php b/grade/report/grader/index.php index be2d96371d..8eb81fc7f4 100644 --- a/grade/report/grader/index.php +++ b/grade/report/grader/index.php @@ -2,8 +2,22 @@ /// This creates and handles the whole grader report interface, sans header and footer +require_once($CFG->libdir.'/tablelib.php'); +include_once($CFG->libdir.'/gradelib.php'); + +// get the params +$courseid = required_param('id', PARAM_INT); +if (!$userid = optional_param('user', 0, PARAM_INT)) { + // current user + $userid = $USER->id; +} + +$tree = new grade_tree($courseid, true); +echo $tree->display_grades(); + +print_heading('Grader Report'); - print_heading('Grader Report'); ?> + diff --git a/lib/grade/grade_tree.php b/lib/grade/grade_tree.php index 7c79d1803c..9b69fdf54b 100644 --- a/lib/grade/grade_tree.php +++ b/lib/grade/grade_tree.php @@ -84,6 +84,12 @@ class grade_tree { */ var $include_grades; + /** + * An flat array of final grades indexed by userid. + * @var array $grades + */ + var $grades = array(); + /** * A string of GET URL variables, namely courseid and sesskey, used in most URLs built by this class. * @var string $commonvars @@ -632,6 +638,38 @@ class grade_tree { return $objects; } + /** + * Once the tree_array has been built, fills the $grades array by browsing through the tree + * and adding each final grade that is found. + * @return array $grades + */ + function fill_grades($array = null) { + if (empty($array)) { + $array = $this->tree_array; + } + + if (empty($array)) { + return null; + } else { + foreach ($array as $level1order => $level1) { + // If $level1 is a category, enter another recursive layer + if ($this->get_element_type($level1) == 'topcat' || $this->get_element_type($level1) == 'subcat') { + $this->fill_grades($level1['children']); + } else { + if (!empty($level1['finalgrades'])) { + foreach ($level1['finalgrades'] as $final_grade) { + $this->grades[$final_grade->userid][$final_grade->itemid] = $final_grade->gradevalue; + } + } + } + } + + reset($array); + return true; + } + } + + /** * 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. This method is not recursive @@ -814,18 +852,29 @@ class grade_tree { * @return string HTML table */ function display_grades() { + global $CFG; + // 1. Fetch all top-level categories for this course, with all children preloaded, sorted by sortorder $tree = $this->tree_filled; + $this->fill_grades(); if (empty($this->tree_filled)) { debugging("The tree_filled array wasn't initialised, grade_tree could not display the grades correctly."); return false; } + + // Fetch array of students enroled in this course + if (!$context = get_context_instance(CONTEXT_COURSE, $this->courseid)) { + return false; + } + + $users = get_role_users(@implode(',', $CFG->gradebookroles), $context); $topcathtml = ''; $cathtml = ''; $itemhtml = ''; - + $items = array(); + foreach ($tree as $topcat) { $itemcount = 0; @@ -835,7 +884,8 @@ class grade_tree { foreach ($cat['children'] as $item) { $itemcount++; $catitemcount++; - $itemhtml .= '' . $item['object']->itemname . ''; + $itemhtml .= '' . $item['object']->itemname . ''; + $items[] = $item; } if ($cat['object'] == 'filler') { @@ -858,11 +908,28 @@ class grade_tree { } + $studentshtml = ''; + + foreach ($users as $userid => $user) { + $studentshtml .= ''; + foreach ($items as $item) { + if (!empty($this->grades[$userid][$item['object']->id])) { + $studentshtml .= '' . $this->grades[$userid][$item['object']->id] . '' . "\n"; + } else { + $studentshtml .= '0' . "\n"; + } + } + $studentshtml .= ''; + } + $itemhtml .= ''; $cathtml .= ''; $topcathtml .= ''; - - return "$topcathtml$cathtml$itemhtml
"; + + $reporthtml = "$topcathtml$cathtml$itemhtml"; + $reporthtml .= $studentshtml; + $reporthtml .= "
"; + return $reporthtml; } -- 2.39.5