]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-10544 basic support for outcomes grading in modules - implemented in assignment...
authorskodak <skodak>
Tue, 31 Jul 2007 22:56:29 +0000 (22:56 +0000)
committerskodak <skodak>
Tue, 31 Jul 2007 22:56:29 +0000 (22:56 +0000)
lib/grade/grade_item.php
lib/gradelib.php
mod/assignment/lib.php

index 4a4c19b28a3bcbe0be06747e6263e9af21b92a03..153288ea7e030f4bf7695f9859f79cd766b8043d 100644 (file)
@@ -988,14 +988,14 @@ class grade_item extends grade_object {
      * @param int $userid
      * @return object grade_grade object instance
      */
-    function get_grade($userid) {
+    function get_grade($userid, $create=true) {
         if (empty($this->id)) {
             debugging('Can not use before insert');
             return false;
         }
 
         $grade = new grade_grade(array('userid'=>$userid, 'itemid'=>$this->id));
-        if (empty($grade->id)) {
+        if (empty($grade->id) and $create) {
             $grade->insert();
         }
 
index b5d9ae1dc08b2b66d7e888e8f35a1ab1e4a1eb9b..02e58fbc8857eb6b1ca7a28608247aa245bd1ff7 100644 (file)
@@ -96,7 +96,7 @@ require_once($CFG->libdir . '/grade/grade_grade_text.php');
  *
  * @param string $source source of the grade such as 'mod/assignment', often used to prevent infinite loops when processing grade_updated events
  * @param int $courseid id of course
- * @param string $itemtype type of grade item - mod, block, gradecategory, calculated
+ * @param string $itemtype type of grade item - mod, block
  * @param string $itemmodule more specific then $itemtype - assignment, forum, etc.; maybe NULL for some item types
  * @param int $iteminstance instance it of graded subject
  * @param int $itemnumber most probably 0, modules can use other numbers when having more than one grades for each user
@@ -262,22 +262,21 @@ function grade_update($source, $courseid, $itemtype, $itemmodule, $iteminstance,
 
 
 /**
-* Tells a module whether a grade (or grade_item if $userid is not given) is currently locked or not.
-* This is a combination of the actual settings in the grade tables and a check on moodle/course:editgradeswhenlocked.
-* If it's locked to the current use then the module can print a nice message or prevent editing in the module.
-* If no $userid is given, the method will always return the grade_item's locked state.
-* If a $userid is given, the method will first check the grade_item's locked state (the column). If it is locked,
-* the method will return true no matter the locked state of the specific grade being checked. If unlocked, it will
-* return the locked state of the specific grade.
-*
-* @param int $courseid id of course
-* @param string $itemtype 'mod', 'blocks', 'import', 'calculated' etc
-* @param string $itemmodule 'forum, 'quiz', 'csv' etc
-* @param int $iteminstance id of the item module
-* @param int $itemnumber most probably 0, modules can use other numbers when having more than one grades for each user
-* @param int $userid ID of the graded user
-* @return boolean Whether the grade is locked or not
-*/
+ * Tells a module whether a grade (or grade_item if $userid is not given) is currently locked or not.
+ * If it's locked to the current use then the module can print a nice message or prevent editing in the module.
+ * If no $userid is given, the method will always return the grade_item's locked state.
+ * If a $userid is given, the method will first check the grade_item's locked state (the column). If it is locked,
+ * the method will return true no matter the locked state of the specific grade being checked. If unlocked, it will
+ * return the locked state of the specific grade.
+ *
+ * @param int $courseid id of course
+ * @param string $itemtype 'mod', 'block'
+ * @param string $itemmodule 'forum, 'quiz', etc.
+ * @param int $iteminstance id of the item module
+ * @param int $itemnumber most probably 0, modules can use other numbers when having more than one grades for each user
+ * @param int $userid ID of the graded user
+ * @return boolean Whether the grade is locked or not
+ */
 function grade_is_locked($courseid, $itemtype, $itemmodule, $iteminstance, $itemnumber, $userid=NULL) {
 
     if (!$grade_items = grade_item::fetch_all(compact('courseid', 'itemtype', 'itemmodule', 'iteminstance', 'itemnumber'))) {
@@ -298,6 +297,67 @@ function grade_is_locked($courseid, $itemtype, $itemmodule, $iteminstance, $item
     }
 }
 
+/**
+ * Returns list of outcomes used in course together with current outcomes for this user
+ * @param int $courseid id of course
+ * @param string $itemtype 'mod', 'block'
+ * @param string $itemmodule 'forum, 'quiz', etc.
+ * @param int $iteminstance id of the item module
+ * @param int $userid ID of the graded user
+ * @return array of outcome information objects (scaleid, name, grade and locked status) indexed with itemnumbers
+ */
+function grade_get_outcomes($courseid, $itemtype, $itemmodule, $iteminstance, $userid) {
+    $result = array();
+    if ($items = grade_item::fetch_all(array('itemtype'=>$itemtype, 'itemmodule'=>$itemmodule, 'iteminstance'=>$iteminstance, 'courseid'=>$courseid))) {
+        foreach ($items as $item) {
+            if (empty($item->outcomeid)) {
+                continue;
+            }
+            if (!$outcome = grade_outcome::fetch(array('id'=>$item->outcomeid))) {
+                debugging('Incorect outcomeid found');
+                continue;
+            }
+            // prepare outcome info with user grade
+            $o = new object();
+            $o->scaleid = $outcome->scaleid;
+            $o->name    = $outcome->fullname;
+
+            if ($grade = $item->get_grade($userid,false)) {
+                $o->grade  = $grade->finalgrade;
+                $o->locked = $grade->is_locked();
+            } else {
+                $o->grade = null;
+                $o->locked = $item->is_locked();
+            }
+            $o->grade = intval($o->grade); // 0 means no grade, int for scales
+            
+            $result[$item->itemnumber] = $o;
+        }
+    }
+
+    return $result;
+}
+
+/**
+ * Updates outcomes of user
+ * @param int $courseid id of course
+ * @param string $itemtype 'mod', 'block'
+ * @param string $itemmodule 'forum, 'quiz', etc.
+ * @param int $iteminstance id of the item module
+ * @param int $userid ID of the graded user
+ */
+function grade_update_outcomes($source, $courseid, $itemtype, $itemmodule, $iteminstance, $userid, $data) {
+    if ($items = grade_item::fetch_all(array('itemtype'=>$itemtype, 'itemmodule'=>$itemmodule, 'iteminstance'=>$iteminstance, 'courseid'=>$courseid))) {
+        foreach ($items as $item) {
+            if (!array_key_exists($item->itemnumber, $data)) {
+                continue;
+            }
+            $grade = $data[$item->itemnumber] < 1 ? null : $data[$item->itemnumber];
+            $item->update_final_grade($userid, $grade, $source);
+        }        
+    }
+}
+
 /***** END OF PUBLIC API *****/
 
 function grade_force_full_regrading($courseid) {
index 66d5f55a7d60dbf1fab6c757d2454922ed6d5d2b..d1922157a0f4b294777608b1372e8ed5a7753e6c 100644 (file)
@@ -503,6 +503,7 @@ class assignment_base {
 
         switch ($mode) {
             case 'grade':                         // We are in a popup window grading
+                $this->process_outcomes();
                 if ($submission = $this->process_feedback()) {
                     //IE needs proper header with encoding
                     print_header(get_string('feedback', 'assignment').':'.format_string($this->assignment->name));
@@ -615,6 +616,7 @@ class assignment_base {
             case 'saveandnext':
                 ///We are in pop up. save the current one and go to the next one.
                 //first we save the current changes
+                $this->process_outcomes();
                 if ($submission = $this->process_feedback()) {
                     //print_heading(get_string('changessaved'));
                     $extra_javascript = $this->update_main_listing($submission);
@@ -842,6 +844,23 @@ class assignment_base {
         echo '<div class="grade">'.get_string('grade').':';
         choose_from_menu(make_grades_menu($this->assignment->grade), 'grade', $submission->grade, get_string('nograde'), '', -1);
         echo '</div>';
+
+        require_once($CFG->libdir.'/gradelib.php');
+        if ($outcomes = grade_get_outcomes($this->course->id, 'mod', 'assignment', $this->assignment->id, $userid)) {
+            echo '<div class="outcomes">';
+            foreach($outcomes as $n=>$data) {
+                echo format_string($data->name).':';
+                $options = make_grades_menu(-$data->scaleid);
+                if ($data->locked) {
+                    $options[0] = get_string('nograde');
+                    echo $options[$data->grade];
+                } else {
+                    choose_from_menu($options, 'outcome_'.$n, $data->grade, get_string('nograde'), '', -1);
+                }
+            }
+            echo '</div>';
+        }
+
         echo '<div class="clearer"></div>';
 
         $this->preprocess_submission($submission);
@@ -1195,6 +1214,36 @@ class assignment_base {
         print_footer($this->course);
     }
 
+    /**
+     *  Process teacher outcomes
+     *
+     * This is called by submissions() when a grading even has taken place.
+     * It gets its data from the submitted form.
+     */
+    function process_outcomes() {
+        global $CFG;
+
+        if (!$formdata = data_submitted()) {      // No incoming data?
+            return;
+        }
+
+        $userid = $formdata->userid;
+
+        require_once($CFG->libdir.'/gradelib.php');
+        $data = array();
+        if ($outcomes = grade_get_outcomes($this->course->id, 'mod', 'assignment', $this->assignment->id, $userid)) {
+            foreach($outcomes as $n=>$old) {
+                $name = 'outcome_'.$n;
+                if (array_key_exists($name, $formdata)) {
+                    $data[$n] = $formdata->$name;
+                }
+            }
+        }
+        if (count($data) > 0) {
+            grade_update_outcomes('mod/assignment', $this->course->id, 'mod', 'assignment', $this->assignment->id, $userid, $data);
+        }
+    }
+
     /**
      *  Process teacher feedback submission
      *