]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-11966 implemented dategraded and datesubmitted, tweaked altering of grades depend...
authorskodak <skodak>
Thu, 1 Nov 2007 08:25:05 +0000 (08:25 +0000)
committerskodak <skodak>
Thu, 1 Nov 2007 08:25:05 +0000 (08:25 +0000)
MDL-11974 improved gradebook CSS

17 files changed:
grade/report/grader/index.php
grade/report/grader/lib.php
grade/report/grader/styles.php
grade/report/user/lib.php
grade/report/user/styles.php
lang/en_utf8/grades.php
lib/grade/grade_category.php
lib/grade/grade_grade.php
lib/grade/grade_item.php
lib/grade/grade_object.php
lib/grade/grade_outcome.php
lib/grade/grade_scale.php
lib/gradelib.php
mod/assignment/lib.php
mod/quiz/lib.php
theme/custom_corners/user_styles.css
theme/wood/styles_color.css

index ec0e8a30b2325377e4440ed27676941ad9c64502..3425d7ea60c2de34e00075a3f614df0e3ea64f99 100644 (file)
@@ -159,7 +159,7 @@ if (!empty($studentsperpage)) {
     print_paging_bar($numusers, $report->page, $studentsperpage, $report->pbarurl);
 }
 
-$reporthtml = '<table class="gradestable flexible boxaligncenter generaltable">';
+$reporthtml = '<table id="user-grades" class="gradestable flexible boxaligncenter generaltable">';
 $reporthtml .= $report->get_headerhtml();
 $reporthtml .= $report->get_rangehtml();
 $reporthtml .= $report->get_studentshtml();
index d5614f8ab6b1bcc7fdcda9c8c97ff1cb61fd387d..5a3b6c443181e11176d535f42d90864f31092b6b 100644 (file)
@@ -681,9 +681,9 @@ class grade_report_grader extends grade_report {
                 // MDL-11274
                 // Hide grades in the grader report if the current grader doesn't have 'moodle/grade:viewhidden'
                 if (!$this->canviewhidden and $grade->is_hidden()) {
-                    if (!empty($CFG->grade_hiddenasdate) and !is_null($grade->finalgrade) and !$item->is_category_item() and !$item->is_course_item()) {
+                    if (!empty($CFG->grade_hiddenasdate) and $grade_grade->get_datesubmitted() and !$item->is_category_item() and !$item->is_course_item()) {
                         // the problem here is that we do not have the time when grade value was modified, 'timemodified' is general modification date for grade_grades records
-                        $studentshtml .= '<td class="cell c'.$columncount++.'">'.userdate($grade->timecreated,get_string('strftimedatetimeshort')).'</td>';
+                        $studentshtml .= '<td class="cell c'.$columncount++.'"><span class="datesubmitted">'.userdate($grade_grade->get_datesubmitted(),get_string('strftimedatetimeshort')).'</span></td>';
                     } else {
                         $studentshtml .= '<td class="cell c'.$columncount++.'">-</td>';
                     }
index 2f93b8e46a90b6f6f153b8e51c42329b9dd06e2e..0f082fefc011a555df485e9f884c163c641c0b58 100644 (file)
@@ -1,43 +1,43 @@
 
-.grade-report-grader .catlevel1 {
+.grade-report-grader table#user-grades .catlevel1 {
   background-color: #ffffff;
 }
-.grade-report-grader .catlevel2 {
+.grade-report-grader table#user-grades .catlevel2 {
   background-color: #eeeeee;
 }
-.grade-report-grader .catlevel3 {
+.grade-report-grader table#user-grades .catlevel3 {
   background-color: #dddddd;
 }
 
-.grade-report-grader td.overridden {
+.grade-report-grader table#user-grades td.overridden {
   background-color: #dddddd;
 }
 
-.grade-report-grader .gradestable tr.avg td.cell {
+.grade-report-grader table#user-grades tr.avg td.cell {
     background-color: #efefff;
 }
 
-.grade-report-grader .gradestable tr.groupavg td.cell {
+.grade-report-grader table#user-grades tr.groupavg td.cell {
     background-color: #efffef;
 }
 
-.grade-report-grader .gradestable tr.groupavg td.cell {
+.grade-report-grader table#user-grades tr.groupavg td.cell {
   font-weight: bold;
   color: #006400;
 }
 
-.grade-report-grader .gradestable tr.avg td.cell {
+.grade-report-grader table#user-grades tr.avg td.cell {
   font-weight: bold;
   color: #00008B;
 }
 
-.grade-report-grader .gradestable td.cat,
-.grade-report-grader .gradestable td.course {
+.grade-report-grader table#user-grades td.cat,
+.grade-report-grader table#user-grades td.course {
   font-weight: bold;
 }
 
 
-.grade-report-grader table {
+.grade-report-grader table#user-grades {
   border-width:1px;
   border-style:solid;
   margin-top: 20px;
   text-align: center;
 }
 
-.grade-report-grader table td {
+.grade-report-grader table#user-grades td {
   border-width:1px;
   border-style:solid;
 }
 
-.grade-report-grader tr.heading {
+.grade-report-grader table#user-grades tr.heading {
   border-width:0px 0px 0px 0px;
   border-style:solid;
 }
 
-.grade-report-grader .heading td {
+.grade-report-grader table#user-grades .heading td {
   border-width:0px 0px 0px 0px;
   border-style:solid;
 }
 
-.grade-report-grader th.category {
+.grade-report-grader table#user-grades th.category {
   border-width:1px 1px 0px 1px;
   border-style:solid;
 }
 
-.grade-report-grader th.user {
+.grade-report-grader table#user-grades th.user {
   border-width:0px 0px 1px 0px;
   border-style:solid;
 }
 
-.grade-report-grader th.categoryitem,
-.grade-report-grader th.courseitem,
-.grade-report-grader td.topleft {
+.grade-report-grader table#user-grades th.categoryitem,
+.grade-report-grader table#user-grades th.courseitem,
+.grade-report-grader table#user-grades td.topleft {
   border-width:0px 1px 0px 1px;
   border-style:solid;
 }
 
-.grade-report-grader td.fillerfirst {
+.grade-report-grader table#user-grades td.fillerfirst {
   border-width:0px 0px 0px 1px;
   border-style:solid;
 }
 
-.grade-report-grader td.fillerlast {
+.grade-report-grader table#user-grades td.fillerlast {
   border-width:0px 1px 0px 0px;
   border-style:solid;
 }
 
-.grade-report-grader th.item {
+.grade-report-grader table#user-grades th.item {
   border-width:1px 1px 1px 1px;
   border-style:solid;
 }
   margin-left: 20px;
 }
 
-.grade-report-grader table.gradestable {
+.grade-report-grader table#user-grades {
   margin-left:auto;
   margin-right:auto;
 }
 
-.grade-report-grader .gradestable th.user {
+.grade-report-grader table#user-grades  th.user {
   text-align:left;
 }
 
-.grade-report-grader .gradestable td {
+.grade-report-grader table#user-grades  td {
   text-align:right;
 }
 
-.grade-report-grader th.range {
+.grade-report-grader table#user-grades th.range {
   border-width:1px 1px 1px 1px;
   border-style:solid;
 }
 
-.grade-report-grader .userpic {
+.grade-report-grader table#user-grades .userpic {
   display: inline;
   margin-right: 10px;
 }
 
-.grade-report-grader .quickfeedback {
+.grade-report-grader table#user-grades .quickfeedback {
   border: #000000 1px dashed;
 }
 
   text-align: right;
 }
 
-.grade-report-grader .hidden,
-.grade-report-grader .hidden a {
+.grade-report-grader table#user-grades .hidden,
+.grade-report-grader table#user-grades .hidden a {
   color:#aaaaaa;
 }
 
+.grade-report-grader table#user-grades .datesubmitted {
+  font-size: 0.7em;
+}
+
+.grade-report-grader table#user-grades td.cell {
+  padding-left: 5px;
+  padding-right: 5px;
+}
index 245063861aa90e3212f8e2ac650d6daadcefcdee..ea54895f7182fad8e7c15530870fc86b2e033d79 100644 (file)
@@ -200,16 +200,31 @@ class grade_report_user extends grade_report {
 
             $data = array();
 
+            // all users should know which items are still hidden
+            $hidden = '';
+            if ($grade_item->is_hidden()) {
+                $hidden = ' hidden ';
+            }
+
             /// prints grade item name
             if ($grade_item->is_course_item() or $grade_item->is_category_item()) {
-                $data[] = '<span class="'.$class.'">'.$grade_item->get_name().'</span>';
+                $data[] = '<span class="'.$hidden.$class.'">'.$grade_item->get_name().'</span>';
             } else {
-                $data[] = '<span class="'.$class.'">'.$this->get_module_link($grade_item->get_name(), $grade_item->itemmodule, $grade_item->iteminstance).'</span>';
+                $data[] = '<span class="'.$hidden.$class.'">'.$this->get_module_link($grade_item->get_name(), $grade_item->itemmodule, $grade_item->iteminstance).'</span>';
             }
 
             /// prints category
             $cat = $grade_item->get_parent_category();
-            $data[] = '<span class="'.$class.'">'.$cat->get_name().'</span>';
+            $data[] = '<span class="'.$hidden.$class.'">'.$cat->get_name().'</span>';
+
+            $hidden = '';
+            if ($grade_item->is_hidden()) {
+                // can not see grades in hidden items
+                $hidden = ' hidden ';
+            } else if ($canviewhidden and $grade_grade->is_hidden()) {
+                // if user can see hidden grades, indicate which ones are hidden
+                $hidden = ' hidden ';
+            }
 
             /// prints the grade
             if ($grade_grade->is_excluded()) {
@@ -219,34 +234,34 @@ class grade_report_user extends grade_report {
             }
 
             if ($grade_item->needsupdate) {
-                $data[] = '<span class="'.$class.' gradingerror">'.get_string('error').'</span>';
+                $data[] = '<span class="'.$hidden.$class.' gradingerror">'.get_string('error').'</span>';
 
-            } else if (!empty($CFG->grade_hiddenasdate) and !is_null($grade_grade->finalgrade) and !$canviewhidden and $grade_grade->is_hidden()
+            } else if (!empty($CFG->grade_hiddenasdate) and $grade_grade->get_datesubmitted() and !$canviewhidden and $grade_grade->is_hidden()
                    and !$grade_item->is_category_item() and !$grade_item->is_course_item()) {
                 // the problem here is that we do not have the time when grade value was modified, 'timemodified' is general modification date for grade_grades records
-                $data[] = '<span class="'.$class.' gradeddate">'.$excluded.get_string('gradedon', 'grades', userdate($grade_grade->timemodified, get_string('strftimedatetimeshort'))).'</span>';
+                $data[] = '<span class="'.$hidden.$class.' datesubmitted">'.$excluded.get_string('submittedon', 'grades', userdate($grade_grade->get_datesubmitted(), get_string('strftimedatetimeshort'))).'</span>';
 
             } else {
-                $data[] = '<span class="'.$class.'">'.$excluded.grade_format_gradevalue($gradeval, $grade_item, true);
+                $data[] = '<span class="'.$hidden.$class.'">'.$excluded.grade_format_gradevalue($gradeval, $grade_item, true);
             }
 
             /// prints percentage
             if ($grade_item->needsupdate) {
-                $data[] = '<span class="'.$class.'gradingerror">'.get_string('error').'</span>';
+                $data[] = '<span class="'.$hidden.$class.'gradingerror">'.get_string('error').'</span>';
 
             } else {
-                $data[] = '<span class="'.$class.'">'.grade_format_gradevalue($gradeval, $grade_item, true, GRADE_DISPLAY_TYPE_PERCENTAGE).'</span>';
+                $data[] = '<span class="'.$hidden.$class.'">'.grade_format_gradevalue($gradeval, $grade_item, true, GRADE_DISPLAY_TYPE_PERCENTAGE).'</span>';
             }
 
             /// prints rank
             if ($this->showrank) {
                 // TODO: this is broken if hidden grades present!!
                 if ($grade_item->needsupdate) {
-                    $data[] = '<span class="'.$class.'gradingerror">'.get_string('error').'</span>';
+                    $data[] = '<span class="'.$hidden.$class.'gradingerror">'.get_string('error').'</span>';
 
                 } else if (is_null($gradeval)) {
                     // no grade, no rank
-                    $data[] = '<span class="'.$class.'">-</span>';;
+                    $data[] = '<span class="'.$hidden.$class.'">-</span>';;
 
                 } else {
                     /// find the number of users with a higher grade
@@ -256,16 +271,16 @@ class grade_report_user extends grade_report {
                                    AND itemid = {$grade_item->id}";
                     $rank = count_records_sql($sql) + 1;
 
-                    $data[] = '<span class="'.$class.'">'."$rank/$numusers".'</span>';
+                    $data[] = '<span class="'.$hidden.$class.'">'."$rank/$numusers".'</span>';
                 }
             }
 
             /// prints feedback
             if (empty($grade_grade->feedback) or (!$canviewhidden and $grade_grade->is_hidden())) {
-                $data[] = '<div class="feedbacktext">&nbsp;</div>';
+                $data[] = '<div class="'.$hidden.'feedbacktext">&nbsp;</div>';
 
             } else {
-                $data[] = '<div class="feedbacktext">'.format_text($grade_grade->feedback, $grade_grade->feedbackformat).'</div>';
+                $data[] = '<div class="'.$hidden.'feedbacktext">'.format_text($grade_grade->feedback, $grade_grade->feedbackformat).'</div>';
             }
 
             $this->table->add_data($data);
index ef0d94065ec0e463791d48c7353cd0a2d5a5f75c..53a8b8eb81cf5e3c098a1e09fcc251a2239c415f 100644 (file)
@@ -1,10 +1,10 @@
 
-.grade-report-user .gradeddate {
+.grade-report-user table#user-grade .datesubmitted {
   font-size: 0.7em;
 }
 
-.grade-report-user .courseitem,
-.grade-report-user .categoryitem {
+.grade-report-user table#user-grade .courseitem,
+.grade-report-user table#user-grade .categoryitem {
   font-weight: bold;
 }
 
@@ -13,3 +13,8 @@
   padding-right: 5px;
 }
 
+/* this must be last if we want to override other category and course item colors */
+.grade-report-user table#user-grade .hidden,
+.grade-report-user table#user-grade .hidden a {
+  color:#aaaaaa;
+}
index d7a43e48bfa39dee4987d47580d4010a7f46ae17..1d4b66f2d21a4cadf1b6afadb013978657203d36 100644 (file)
@@ -77,7 +77,7 @@ $string['configexportdecimalpoints'] = 'The number of decimal points to display
 $string['configgradeletter'] = 'A letter or other symbol used to represent a range of grades.';
 $string['configgradeletterdefault'] = 'A letter or other symbol used to represent a range of grades. Leave this field empty to use the site default (currently $a).';
 $string['configgradepublishing'] = 'Enable publishing in exports and imports: Exported grades can be accessed by accessing a URL, without having to log on to a Moodle site. Grades can be imported by accessing such a URL (which means that a moodle site can import grades published by another site). By default only administrators may use this feature, please educate users before adding required capabilities to other roles (dangers of bookmark sharing and download accelerators, IP restrictions, etc.).';
-$string['confighiddenasdate'] = 'If user can not see hidden grades show date instead of \'-\'.';
+$string['confighiddenasdate'] = 'If user can not see hidden grades show date of submission instead of \'-\'.';
 $string['configmeanselection'] = 'Select which types of grades will be included in the column averages. Cells with no grade can be ignored, or counted as 0 (default setting).';
 $string['configprofilereport'] = 'Grade report used on user profile page.';
 $string['configquickfeedback'] = 'Quick Feedback adds a text input element in each grade cell on the grader report, allowing you to edit many grades at once. You can then click the Update button to perform all these changes at once, instead of one at a time.';
@@ -172,7 +172,7 @@ $string['gradecategories'] = 'Grade categories';
 $string['gradecategory'] = 'Grade Category';
 $string['gradecategoryhelp'] = 'Grade Category Help';
 $string['gradecategorysettings'] = 'Grade category settings';
-$string['gradedon'] = 'Graded $a';
+$string['gradedon'] = 'Graded: $a';
 $string['gradedisplay'] = 'Grade display';
 $string['gradedisplaytype'] = 'Grade display type';
 $string['gradeexceptions'] = 'Grade Exceptions';
@@ -213,7 +213,7 @@ $string['gradeview'] = 'View Grade';
 $string['gradeweighthelp'] = 'Grade Weight Help';
 $string['groupavg'] = 'Group average';
 $string['hidden'] = 'Hidden';
-$string['hiddenasdate'] = 'Show date for hidden grades';
+$string['hiddenasdate'] = 'Show submitted date for hidden grades';
 $string['hiddenuntil'] = 'Hidden until';
 $string['hiddenuntildate'] = 'Hidden until: $a';
 $string['hideadvanced'] = 'Hide Advanced Features';
@@ -416,6 +416,7 @@ $string['student'] = 'Student';
 $string['studentsperpage'] = 'Students per page';
 $string['subcategory'] = 'Normal Category';
 $string['submissions'] = 'Submissions';
+$string['submittedon'] = 'Submitted: $a';
 $string['synclegacygrades'] = 'Synchronise legacy grades';
 $string['topcategory'] = 'Super Category';
 $string['total'] = 'Total';
index 05a603b8382614ef2201674eb05f4bae28824bc3..b0b928919638410f0005b48fc6f771283c71c249 100644 (file)
@@ -213,6 +213,8 @@ class grade_category extends grade_object {
             $this->force_regrading();
         }
 
+        $this->timemodified = time();
+
         return parent::update($source);
     }
 
@@ -290,6 +292,8 @@ class grade_category extends grade_object {
 
         $this->path = null;
 
+        $this->timecreated = $this->timemodified = time();
+
         if (!parent::insert($source)) {
             debugging("Could not insert this category: " . print_r($this, true));
             return false;
@@ -318,6 +322,8 @@ class grade_category extends grade_object {
 
         $this->apply_forced_settings();
 
+        $this->timecreated = $this->timemodified = time();
+
         if (!parent::insert('system')) {
             debugging("Could not insert this category: " . print_r($this, true));
             return false;
@@ -446,7 +452,7 @@ class grade_category extends grade_object {
 
     /**
      * internal function for category grades aggregation
-     * 
+     *
      * @param int $userid
      * @param array $items
      * @param array $grade_values
index 60fa5d37723367bcb926ed647d9ff49731f7031a..c9c0bb96d31ff2b628a5ba45bb9bf4834ff6e36a 100644 (file)
@@ -137,6 +137,18 @@ class grade_grade extends grade_object {
      */
     var $excluded = 0;
 
+    /**
+     * TODO: HACK: create a new field datesubmitted - the date of submission if any
+     * @var boolean $timecreated
+     */
+    var $timecreated = null;
+
+    /**
+     * TODO: HACK: create a new field dategraded - the date of grading
+     * @var boolean $timemodified
+     */
+    var $timemodified = null;
+
 
     /**
      * Returns array of grades for given grade_item+users.
@@ -240,6 +252,32 @@ class grade_grade extends grade_object {
         return !empty($this->overridden);
     }
 
+    /**
+     * Returns timestamp of submission related to this grade,
+     * might be null if not submitted.
+     * @return int
+     */
+    function get_datesubmitted() {
+        //TODO: HACK - create new fields in 2.0
+        return $this->timecreated;
+    }
+
+    /**
+     * Returns timestamp when last graded,
+     * might be null if no grade present.
+     * @return int
+     */
+    function get_dategraded() {
+        //TODO: HACK - create new fields in 2.0
+        if (is_null($this->finalgrade)) {
+            return null; // no grade == no date
+        } else if ($this->overridden) {
+            return $this->overridden;
+        } else {
+            return $this->timemodified;
+        }
+    }
+
     /**
      * Set the overridden status of grade
      * @param boolean $state requested overridden state
@@ -526,10 +564,7 @@ class grade_grade extends grade_object {
                 //nothing to do, aggregation is ok
             } else if ($grade_grade->is_hidden()) {
                 $hiddenfound = true;
-                // hidden null grade does not affect the aggregation
-                if (!is_null($grade_grade->finalgrade)) {
-                    $altered[$grade_grade->itemid] = null;
-                }
+                $altered[$grade_grade->itemid] = null;
             } else if ($grade_grade->is_locked() or $grade_grade->is_overridden()) {
                 // no need to recalculate locked or overridden grades
             } else {
index 18a4ae6fd889b6d420e6ae0371f1bca98a7c6c6d..45a0fe47a4a24fa00e7f34b74657e1bd5cc45302 100644 (file)
@@ -265,6 +265,8 @@ class grade_item extends grade_object {
             $this->force_regrading();
         }
 
+        $this->timemodified = time();
+
         return parent::update($source);
     }
 
@@ -384,6 +386,8 @@ class grade_item extends grade_object {
             $this->outcomeid = null;
         }
 
+        $this->timecreated = $this->timemodified = time();
+
         if (parent::insert($source)) {
             // force regrading of items if needed
             $this->force_regrading();
@@ -1302,10 +1306,6 @@ class grade_item extends grade_object {
     function update_final_grade($userid, $finalgrade=false, $source=NULL, $feedback=false, $feedbackformat=FORMAT_MOODLE, $usermodified=null) {
         global $USER, $CFG;
 
-        if (empty($usermodified)) {
-            $usermodified = $USER->id;
-        }
-
         $result = true;
 
         // no grading used or locked
@@ -1316,7 +1316,11 @@ class grade_item extends grade_object {
         $grade = new grade_grade(array('itemid'=>$this->id, 'userid'=>$userid));
         $grade->grade_item =& $this; // prevent db fetching of this grade_item
 
-        $grade->usermodified = $usermodified;
+        if (empty($usermodified)) {
+            $grade->usermodified = $USER->id;
+        } else {
+            $grade->usermodified = $usermodified;
+        }
 
         if ($grade->is_locked()) {
             // do not update locked grades at all
@@ -1364,11 +1368,14 @@ class grade_item extends grade_object {
         }
 
         if (empty($grade->id)) {
+            $grade->timecreated  = null;   // no submission yet
+            $grade->timemodified = time(); // overridden flag might take over, but anyway
             $result = (boolean)$grade->insert($source);
 
         } else if ($grade->finalgrade     !== $oldgrade->finalgrade
                 or $grade->feedback       !== $oldgrade->feedback
                 or $grade->feedbackformat !== $oldgrade->feedbackformat) {
+            $grade->timemodified = time(); // overridden flag might take over, but anyway
             $result = $grade->update($source);
         } else {
             // no grade change
@@ -1410,15 +1417,14 @@ class grade_item extends grade_object {
      * @param string $note optional note
      * @param mixed $feedback teachers feedback as string - false means do not change
      * @param int $feedbackformat
+     * @param int $usermodified - user which did the grading
+     * @param int $dategraded
+     * @param int $datesubmitted
      * @return boolean success
      */
-    function update_raw_grade($userid, $rawgrade=false, $source=NULL, $feedback=false, $feedbackformat=FORMAT_MOODLE, $usermodified=null) {
+    function update_raw_grade($userid, $rawgrade=false, $source=NULL, $feedback=false, $feedbackformat=FORMAT_MOODLE, $usermodified=null, $dategraded=null, $datesubmitted=null) {
         global $USER;
 
-        if (empty($usermodified)) {
-            $usermodified = $USER->id;
-        }
-
         $result = true;
 
         // calculated grades can not be updated; course and category can not be updated  because they are aggregated
@@ -1429,7 +1435,21 @@ class grade_item extends grade_object {
         $grade = new grade_grade(array('itemid'=>$this->id, 'userid'=>$userid));
         $grade->grade_item =& $this; // prevent db fetching of this grade_item
 
-        $grade->usermodified = $usermodified;
+        if (empty($usermodified)) {
+            $grade->usermodified = $USER->id;
+        } else {
+            $grade->usermodified = $usermodified;
+        }
+
+        // TODO: hack alert - create new fields for these
+
+        $grade->timecreated  = $datesubmitted;
+
+        if (empty($dategraded)) {
+            $grade->dategraded = time();
+        } else {
+            $grade->dategraded = $dategraded;
+        }
 
         if ($grade->is_locked()) {
             // do not update locked grades at all
@@ -1469,6 +1489,9 @@ class grade_item extends grade_object {
         }
 
         if (empty($grade->id)) {
+            if (is_null($grade->rawgrade)) {
+                $grade->dategraded = null;
+            }
             $result = (boolean)$grade->insert($source);
 
         } else if ($grade->finalgrade     !== $oldgrade->finalgrade
@@ -1478,7 +1501,9 @@ class grade_item extends grade_object {
                 or $grade->rawscaleid     !== $oldgrade->rawscaleid
                 or $grade->feedback       !== $oldgrade->feedback
                 or $grade->feedbackformat !== $oldgrade->feedbackformat) {
-
+            if (is_null($grade->rawgrade)) {
+                $grade->dategraded = null;
+            }
             $result = $grade->update($source);
         }
 
@@ -1678,7 +1703,7 @@ class grade_item extends grade_object {
         } else {
             $useditems = array();
         }
-        
+
         // MDL-11902
         // unset the value if formula is trying to reference to itself
         // but array keys does not match itemid
index a9c25f85005cc98d7debba6bb96d51ae2638aaee..d31bf6f16ae2cb732056338cd6a97efe20896908 100644 (file)
@@ -199,8 +199,6 @@ class grade_object {
     function update($source=null) {
         global $USER;
 
-        $this->timemodified = time();
-
         $data = $this->get_record_data();
 
         if (!update_record($this->table, addslashes_recursive($data))) {
@@ -283,8 +281,6 @@ class grade_object {
             return false;
         }
 
-        $this->timecreated = $this->timemodified = time();
-
         $data = $this->get_record_data();
 
         if (!$this->id = insert_record($this->table, addslashes_recursive($data))) {
index 3de0d1305b6c456be105bde4b42f4fb6302dcfce..ac87126f4ab519df52d9d6b08b0f2403d6b48f2a 100644 (file)
@@ -105,6 +105,9 @@ class grade_outcome extends grade_object {
      * @return int PK ID if successful, false otherwise
      */
     function insert($source=null) {
+
+        $this->timecreated = $this->timemodified = time();
+
         if ($result = parent::insert($source)) {
             if (!empty($this->courseid)) {
                 $goc = new object();
@@ -122,6 +125,8 @@ class grade_outcome extends grade_object {
      * @return boolean success
      */
     function update($source=null) {
+        $this->timemodified = time();
+
         if ($result = parent::update($source)) {
             if (!empty($this->courseid)) {
                 if (!get_records('grade_outcomes_courses', 'courseid', $this->courseid, 'outcomeid', $this->id)) {
index 0e93189881eaa93796dd5c0547744d0f48163a08..f2067b16254e918af45461730e37c54c8b930448 100644 (file)
@@ -96,6 +96,28 @@ class grade_scale extends grade_object {
         return grade_object::fetch_all_helper('scale', 'grade_scale', $params);
     }
 
+    /**
+     * Records this object in the Database, sets its id to the returned value, and returns that value.
+     * If successful this function also fetches the new object data from database and stores it
+     * in object properties.
+     * @param string $source from where was the object inserted (mod/forum, manual, etc.)
+     * @return int PK ID if successful, false otherwise
+     */
+    function insert($source=null) {
+        $this->timemodified = time();
+        return parent::insert($source);
+    }
+
+    /**
+     * In addition to update() it also updates grade_outcomes_courses if needed
+     * @param string $source from where was the object inserted
+     * @return boolean success
+     */
+    function update($source=null) {
+        $this->timemodified = time();
+        return parent::update($source);
+    }
+
     /**
      * Returns the most descriptive field for this object. This is a standard method used
      * when we do not know the exact type of an object.
@@ -210,7 +232,7 @@ class grade_scale extends grade_object {
     function is_used() {
         global $CFG;
 
-        // count grade items excluding the 
+        // count grade items excluding the
         $sql = "SELECT COUNT(id) FROM {$CFG->prefix}grade_items WHERE scaleid = {$this->id} AND outcomeid IS NULL";
         if (count_records_sql($sql)) {
             return true;
index 9608f065f5fedcaff3a814662d48ecebc5bb6d8e..17469caf35808c2e94cf678b889c5cc793be5bea 100644 (file)
@@ -187,6 +187,9 @@ function grade_update($source, $courseid, $itemtype, $itemmodule, $iteminstance,
         $rawgrade       = false;
         $feedback       = false;
         $feedbackformat = FORMAT_MOODLE;
+        $usermodified   = $USER->id;
+        $datesubmitted  = null;
+        $dategraded     = null;
 
         if (array_key_exists('rawgrade', $grade)) {
             $rawgrade = $grade['rawgrade'];
@@ -202,12 +205,18 @@ function grade_update($source, $courseid, $itemtype, $itemmodule, $iteminstance,
 
         if (array_key_exists('usermodified', $grade)) {
             $usermodified = $grade['usermodified'];
-        } else {
-            $usermodified = $USER->id;
+        }
+
+        if (array_key_exists('datesubmitted', $grade)) {
+            $datesubmitted = $grade['datesubmitted'];
+        }
+
+        if (array_key_exists('dategraded', $grade)) {
+            $dategraded = $grade['dategraded'];
         }
 
         // update or insert the grade
-        if (!$grade_item->update_raw_grade($userid, $rawgrade, $source, $feedback, $feedbackformat, $usermodified)) {
+        if (!$grade_item->update_raw_grade($userid, $rawgrade, $source, $feedback, $feedbackformat, $usermodified, $dategraded, $datesubmitted)) {
             $failed = true;
         }
     }
@@ -324,6 +333,8 @@ function grade_get_grades($courseid, $itemtype, $itemmodule, $iteminstance, $use
                         $grade->feedback       = $grade_grades[$userid]->feedback;
                         $grade->feedbackformat = $grade_grades[$userid]->feedbackformat;
                         $grade->usermodified   = $grade_grades[$userid]->usermodified;
+                        $grade->datesubmitted  = $grade_grades[$userid]->get_datesubmitted();
+                        $grade->dategraded     = $grade_grades[$userid]->get_dategraded();
 
                         // create text representation of grade
                         if (in_array($grade_item->id, $needsupdate)) {
index 3daa3b325c1554dfdd6eb4392835bf3cd2952225..8b5e833993643333b8b7edc14096173b18db3b71 100644 (file)
@@ -244,13 +244,8 @@ class assignment_base {
             return;
         }
 
-        if ($grade->overridden) {
-            $graded_date = $grade->overridden;
-            $graded_by   = $grade->usermodified;
-        } else {
-            $graded_date = $submission->timemarked;
-            $graded_by   = $submission->teacher;
-        }
+        $graded_date = $grade->dategraded;
+        $graded_by   = $grade->usermodified;
 
     /// We need the teacher info
         $teacher = get_record('user', 'id', $graded_by);
@@ -2066,7 +2061,8 @@ function assignment_get_user_grades($assignment, $userid=0) {
 
     $user = $userid ? "AND u.id = $userid" : "";
 
-    $sql = "SELECT u.id, u.id AS userid, s.grade AS rawgrade, s.submissioncomment AS feedback, s.format AS feedbackformat, s.teacher AS usermodified
+    $sql = "SELECT u.id, u.id AS userid, s.grade AS rawgrade, s.submissioncomment AS feedback, s.format AS feedbackformat,
+                   s.teacher AS usermodified, s.timemarked AS dategraded, s.timemodified AS datesubmitted
               FROM {$CFG->prefix}user u, {$CFG->prefix}assignment_submissions s
              WHERE u.id = s.userid AND s.assignment = $assignment->id
                    $user";
@@ -2093,8 +2089,7 @@ function assignment_update_grades($assignment=null, $userid=0, $nullifnone=true)
                     $grades[$k]->rawgrade = null;
                 }
             }
-            assignment_grade_item_update($assignment);
-            grade_update('mod/assignment', $assignment->courseid, 'mod', 'assignment', $assignment->id, 0, $grades);
+            assignment_grade_item_update($assignment, $grades);
         }
 
     } else {
@@ -2103,9 +2098,10 @@ function assignment_update_grades($assignment=null, $userid=0, $nullifnone=true)
                  WHERE m.name='assignment' AND m.id=cm.module AND cm.instance=a.id";
         if ($rs = get_recordset_sql($sql)) {
             while ($assignment = rs_fetch_next_record($rs)) {
-                assignment_grade_item_update($assignment);
-                if ($assignment->grade != 0) {
+                if ($assignment->grade == 0) {
                     assignment_update_grades($assignment);
+                } else {
+                    assignment_grade_item_update($assignment);
                 }
             }
             rs_close($rs);
@@ -2117,9 +2113,10 @@ function assignment_update_grades($assignment=null, $userid=0, $nullifnone=true)
  * Create grade item for given assignment
  *
  * @param object $assignment object with extra cmidnumber
+ * @param mixed optional array/object of grade(s)
  * @return int 0 if ok, error code otherwise
  */
-function assignment_grade_item_update($assignment) {
+function assignment_grade_item_update($assignment, $grades=NULL) {
     global $CFG;
     if (!function_exists('grade_update')) { //workaround for buggy PHP versions
         require_once($CFG->libdir.'/gradelib.php');
@@ -2144,7 +2141,7 @@ function assignment_grade_item_update($assignment) {
         $params['gradetype'] = GRADE_TYPE_NONE;
     }
 
-    return grade_update('mod/assignment', $assignment->courseid, 'mod', 'assignment', $assignment->id, 0, NULL, $params);
+    return grade_update('mod/assignment', $assignment->courseid, 'mod', 'assignment', $assignment->id, 0, $grades, $params);
 }
 
 /**
index a5dffeecfcc8754389770e4bdac5d7f8023bc6a5..be430cd6249910777a0f46bd1425d7d2d0df1ae7 100644 (file)
@@ -268,11 +268,13 @@ function quiz_get_user_grades($quiz, $userid=0) {
 
     $user = $userid ? "AND u.id = $userid" : "";
 
-    $sql = "SELECT u.id, u.id AS userid, g.grade AS rawgrade
-              FROM {$CFG->prefix}user u, {$CFG->prefix}quiz_grades g
-             WHERE u.id = g.userid AND g.quiz = $quiz->id
-                   $user";
-
+    $sql = "SELECT u.id, u.id AS userid, g.grade AS rawgrade, g.timemodified AS dategraded, a.timefinish AS datesubmitted 
+              FROM {$CFG->prefix}user u, {$CFG->prefix}quiz_grades g, {$CFG->prefix}quiz_attempts a
+             WHERE u.id = g.userid AND g.quiz = {$quiz->id}
+                   $user
+                   AND a.timefinish = (SELECT MAX(aa.timefinish)
+                                         FROM {$CFG->prefix}quiz_attempts aa
+                                        WHERE aa.quiz = {$quiz->id} AND aa.userid = u.id AND aa.preview = 0)";
     return get_records_sql($sql);
 }
 
@@ -289,15 +291,14 @@ function quiz_update_grades($quiz=null, $userid=0, $nullifnone=true) {
     }
 
     if ($quiz != null) {
-        quiz_grade_item_update($quiz);  // Recreate it if necessary
         if ($grades = quiz_get_user_grades($quiz, $userid)) {
-            grade_update('mod/quiz', $quiz->course, 'mod', 'quiz', $quiz->id, 0, $grades);
+            quiz_grade_item_update($quiz, $grades);
 
         } else if ($userid and $nullifnone) {
             $grade = new object();
             $grade->userid   = $userid;
             $grade->rawgrade = NULL;
-            grade_update('mod/quiz', $quiz->course, 'mod', 'quiz', $quiz->id, 0, $grade);
+            quiz_grade_item_update($quiz, $grade);
         }
 
     } else {
@@ -306,9 +307,10 @@ function quiz_update_grades($quiz=null, $userid=0, $nullifnone=true) {
                  WHERE m.name='quiz' AND m.id=cm.module AND cm.instance=a.id";
         if ($rs = get_recordset_sql($sql)) {
             while ($quiz = rs_fetch_next_record($rs)) {
-                quiz_grade_item_update($quiz);
                 if ($quiz->grade != 0) {
                     quiz_update_grades($quiz, 0, false);
+                } else {
+                    quiz_grade_item_update($quiz);
                 }
             }
             rs_close($rs);
@@ -320,9 +322,10 @@ function quiz_update_grades($quiz=null, $userid=0, $nullifnone=true) {
  * Create grade item for given quiz
  *
  * @param object $quiz object with extra cmidnumber
+ * @param mixed optional array/object of grade(s)
  * @return int 0 if ok, error code otherwise
  */
-function quiz_grade_item_update($quiz) {
+function quiz_grade_item_update($quiz, $grades=NULL) {
     global $CFG;
     if (!function_exists('grade_update')) { //workaround for buggy PHP versions
         require_once($CFG->libdir.'/gradelib.php');
@@ -367,7 +370,7 @@ function quiz_grade_item_update($quiz) {
         $params['hidden'] = 0;
     }
 
-    return grade_update('mod/quiz', $quiz->course, 'mod', 'quiz', $quiz->id, 0, NULL, $params);
+    return grade_update('mod/quiz', $quiz->course, 'mod', 'quiz', $quiz->id, 0, $grades, $params);
 }
 
 /**
index 6636a5defdf56694034bbac97366562c4ba89c5a..26f35a20ddc0e0a4955c7a6b9e13be896ec5c3e8 100644 (file)
@@ -1067,20 +1067,20 @@ body#grade-index .grades th.header {
 body.grade-edit-scale div.scale_options {
   font-size: 0.7em;
 }
-body.grade-report-grader table.gradestable tr.groupavg td.cell {
+body.grade-report-grader table#user-grades tr.groupavg td.cell {
   font-weight: bold;
   color: #006400;
 }
-body.grade-report-grader table.gradestable {
+body.grade-report-grader table#user-grades {
   width: auto;
 }
-body.grade-report-grader table.gradestable tr.avg td.cell {
+body.grade-report-grader table#user-grades tr.avg td.cell {
   font-weight: bold;
   color: #00008B;
 }
-body.grade-report-grader table.gradestable td.cat {
+body.grade-report-grader table#user-grades td.cat {
   font-weight: bold;
 }
-body.grade-report-grader table.gradestable td.course {
+body.grade-report-grader table#user-grades td.course {
   font-weight: bold;
 }
\ No newline at end of file
index dc631c47c952f4ffab4a53fbe2d462eb24660b89..753fefa97ccb6ffd6f2e9e026e8784cb4fa0ef53 100644 (file)
@@ -408,7 +408,7 @@ table .flexible .r1,
 
 /** Changing some standard colors **/
 
-.grade-report-grader .gradestable tr.groupavg td.cell,
-.grade-report-grader .gradestable tr.avg td.cell {
+.grade-report-grader #user-grades tr.groupavg td.cell,
+.grade-report-grader #user-grades tr.avg td.cell {
     color: #330000;
 }