From: skodak Date: Thu, 1 Nov 2007 08:25:05 +0000 (+0000) Subject: MDL-11966 implemented dategraded and datesubmitted, tweaked altering of grades depend... X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=ced5ee59217472a00a9a0e2f12c745d51f5c2f3d;p=moodle.git MDL-11966 implemented dategraded and datesubmitted, tweaked altering of grades depending in hidden grades MDL-11974 improved gradebook CSS --- diff --git a/grade/report/grader/index.php b/grade/report/grader/index.php index ec0e8a30b2..3425d7ea60 100644 --- a/grade/report/grader/index.php +++ b/grade/report/grader/index.php @@ -159,7 +159,7 @@ if (!empty($studentsperpage)) { print_paging_bar($numusers, $report->page, $studentsperpage, $report->pbarurl); } -$reporthtml = ''; +$reporthtml = '
'; $reporthtml .= $report->get_headerhtml(); $reporthtml .= $report->get_rangehtml(); $reporthtml .= $report->get_studentshtml(); diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index d5614f8ab6..5a3b6c4431 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -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 .= ''; + $studentshtml .= ''; } else { $studentshtml .= ''; } diff --git a/grade/report/grader/styles.php b/grade/report/grader/styles.php index 2f93b8e46a..0f082fefc0 100644 --- a/grade/report/grader/styles.php +++ b/grade/report/grader/styles.php @@ -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; @@ -71,49 +71,49 @@ 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; } @@ -123,30 +123,30 @@ 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; } @@ -154,8 +154,16 @@ 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; +} diff --git a/grade/report/user/lib.php b/grade/report/user/lib.php index 245063861a..ea54895f71 100644 --- a/grade/report/user/lib.php +++ b/grade/report/user/lib.php @@ -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[] = ''.$grade_item->get_name().''; + $data[] = ''.$grade_item->get_name().''; } else { - $data[] = ''.$this->get_module_link($grade_item->get_name(), $grade_item->itemmodule, $grade_item->iteminstance).''; + $data[] = ''.$this->get_module_link($grade_item->get_name(), $grade_item->itemmodule, $grade_item->iteminstance).''; } /// prints category $cat = $grade_item->get_parent_category(); - $data[] = ''.$cat->get_name().''; + $data[] = ''.$cat->get_name().''; + + $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[] = ''.get_string('error').''; + $data[] = ''.get_string('error').''; - } 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[] = ''.$excluded.get_string('gradedon', 'grades', userdate($grade_grade->timemodified, get_string('strftimedatetimeshort'))).''; + $data[] = ''.$excluded.get_string('submittedon', 'grades', userdate($grade_grade->get_datesubmitted(), get_string('strftimedatetimeshort'))).''; } else { - $data[] = ''.$excluded.grade_format_gradevalue($gradeval, $grade_item, true); + $data[] = ''.$excluded.grade_format_gradevalue($gradeval, $grade_item, true); } /// prints percentage if ($grade_item->needsupdate) { - $data[] = ''.get_string('error').''; + $data[] = ''.get_string('error').''; } else { - $data[] = ''.grade_format_gradevalue($gradeval, $grade_item, true, GRADE_DISPLAY_TYPE_PERCENTAGE).''; + $data[] = ''.grade_format_gradevalue($gradeval, $grade_item, true, GRADE_DISPLAY_TYPE_PERCENTAGE).''; } /// prints rank if ($this->showrank) { // TODO: this is broken if hidden grades present!! if ($grade_item->needsupdate) { - $data[] = ''.get_string('error').''; + $data[] = ''.get_string('error').''; } else if (is_null($gradeval)) { // no grade, no rank - $data[] = '-';; + $data[] = '-';; } 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[] = ''."$rank/$numusers".''; + $data[] = ''."$rank/$numusers".''; } } /// prints feedback if (empty($grade_grade->feedback) or (!$canviewhidden and $grade_grade->is_hidden())) { - $data[] = '
 
'; + $data[] = '
 
'; } else { - $data[] = '
'.format_text($grade_grade->feedback, $grade_grade->feedbackformat).'
'; + $data[] = '
'.format_text($grade_grade->feedback, $grade_grade->feedbackformat).'
'; } $this->table->add_data($data); diff --git a/grade/report/user/styles.php b/grade/report/user/styles.php index ef0d94065e..53a8b8eb81 100644 --- a/grade/report/user/styles.php +++ b/grade/report/user/styles.php @@ -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; +} diff --git a/lang/en_utf8/grades.php b/lang/en_utf8/grades.php index d7a43e48bf..1d4b66f2d2 100644 --- a/lang/en_utf8/grades.php +++ b/lang/en_utf8/grades.php @@ -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'; diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index 05a603b838..b0b9289196 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -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 diff --git a/lib/grade/grade_grade.php b/lib/grade/grade_grade.php index 60fa5d3772..c9c0bb96d3 100644 --- a/lib/grade/grade_grade.php +++ b/lib/grade/grade_grade.php @@ -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 { diff --git a/lib/grade/grade_item.php b/lib/grade/grade_item.php index 18a4ae6fd8..45a0fe47a4 100644 --- a/lib/grade/grade_item.php +++ b/lib/grade/grade_item.php @@ -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 diff --git a/lib/grade/grade_object.php b/lib/grade/grade_object.php index a9c25f8500..d31bf6f16a 100644 --- a/lib/grade/grade_object.php +++ b/lib/grade/grade_object.php @@ -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))) { diff --git a/lib/grade/grade_outcome.php b/lib/grade/grade_outcome.php index 3de0d1305b..ac87126f4a 100644 --- a/lib/grade/grade_outcome.php +++ b/lib/grade/grade_outcome.php @@ -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)) { diff --git a/lib/grade/grade_scale.php b/lib/grade/grade_scale.php index 0e93189881..f2067b1625 100644 --- a/lib/grade/grade_scale.php +++ b/lib/grade/grade_scale.php @@ -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; diff --git a/lib/gradelib.php b/lib/gradelib.php index 9608f065f5..17469caf35 100644 --- a/lib/gradelib.php +++ b/lib/gradelib.php @@ -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)) { diff --git a/mod/assignment/lib.php b/mod/assignment/lib.php index 3daa3b325c..8b5e833993 100644 --- a/mod/assignment/lib.php +++ b/mod/assignment/lib.php @@ -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); } /** diff --git a/mod/quiz/lib.php b/mod/quiz/lib.php index a5dffeecfc..be430cd624 100644 --- a/mod/quiz/lib.php +++ b/mod/quiz/lib.php @@ -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); } /** diff --git a/theme/custom_corners/user_styles.css b/theme/custom_corners/user_styles.css index 6636a5defd..26f35a20dd 100644 --- a/theme/custom_corners/user_styles.css +++ b/theme/custom_corners/user_styles.css @@ -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 diff --git a/theme/wood/styles_color.css b/theme/wood/styles_color.css index dc631c47c9..753fefa97c 100644 --- a/theme/wood/styles_color.css +++ b/theme/wood/styles_color.css @@ -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; }
'.userdate($grade->timecreated,get_string('strftimedatetimeshort')).''.userdate($grade_grade->get_datesubmitted(),get_string('strftimedatetimeshort')).'-