diff --git a/grade/report/grader/index.php b/grade/report/grader/index.php index ec0e8a30b2325..3425d7ea60c2d 100644 --- a/grade/report/grader/index.php +++ b/grade/report/grader/index.php @@ -159,7 +159,7 @@ 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 d5614f8ab6b1b..5a3b6c443181e 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -681,9 +681,9 @@ function get_studentshtml() { // 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 2f93b8e46a90b..0f082fefc011a 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 245063861aa90..ea54895f7182f 100644 --- a/grade/report/user/lib.php +++ b/grade/report/user/lib.php @@ -200,16 +200,31 @@ function fill_table() { $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 @@ function fill_table() { } 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 @@ function fill_table() { 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 ef0d94065ec0e..53a8b8eb81cf5 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 d7a43e48bfa39..1d4b66f2d21a4 100644 --- a/lang/en_utf8/grades.php +++ b/lang/en_utf8/grades.php @@ -77,7 +77,7 @@ $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['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['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['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 05a603b838261..b0b9289196384 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -213,6 +213,8 @@ function update($source=null) { $this->force_regrading(); } + $this->timemodified = time(); + return parent::update($source); } @@ -290,6 +292,8 @@ function insert($source=null) { $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 @@ function insert_course_category($courseid) { $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 @@ function generate_grades($userid=null) { /** * 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 20b5b32b35a5a..025d5ee2ee81b 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 @@ function is_overridden() { 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 @@ function get_hiding_affected(&$grade_grades, &$grade_items) { //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 18a4ae6fd889b..45a0fe47a4a24 100644 --- a/lib/grade/grade_item.php +++ b/lib/grade/grade_item.php @@ -265,6 +265,8 @@ function update($source=null) { $this->force_regrading(); } + $this->timemodified = time(); + return parent::update($source); } @@ -384,6 +386,8 @@ function insert($source=null) { $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 @@ function refresh_grades($userid=0) { 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 @@ function update_final_grade($userid, $finalgrade=false, $source=NULL, $feedback= $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 @@ function update_final_grade($userid, $finalgrade=false, $source=NULL, $feedback= } 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 @@ function update_final_grade($userid, $finalgrade=false, $source=NULL, $feedback= * @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 @@ function update_raw_grade($userid, $rawgrade=false, $source=NULL, $feedback=fals $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 @@ function update_raw_grade($userid, $rawgrade=false, $source=NULL, $feedback=fals } 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 @@ function update_raw_grade($userid, $rawgrade=false, $source=NULL, $feedback=fals 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 @@ function validate_formula($formulastr) { } 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 a9c25f85005cc..d31bf6f16ae2c 100644 --- a/lib/grade/grade_object.php +++ b/lib/grade/grade_object.php @@ -199,8 +199,6 @@ function fetch_all_helper($table, $classname, $params) { 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 @@ function insert($source=null) { 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 1eb2422d82a62..141f94d7c92cb 100644 --- a/lib/grade/grade_outcome.php +++ b/lib/grade/grade_outcome.php @@ -105,6 +105,9 @@ function delete($source=null) { * @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 @@ function insert($source=null) { * @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 0e93189881eaa..f2067b16254e9 100644 --- a/lib/grade/grade_scale.php +++ b/lib/grade/grade_scale.php @@ -96,6 +96,28 @@ function fetch_all($params) { 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 @@ function can_delete() { 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 9608f065f5fed..17469caf35808 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 3daa3b325c155..8b5e833993643 100644 --- a/mod/assignment/lib.php +++ b/mod/assignment/lib.php @@ -244,13 +244,8 @@ function view_feedback($submission=NULL) { 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 2d49d5ec125fd..cd93aea610418 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 ba47c02fc582a..e8874f578679d 100644 --- a/theme/custom_corners/user_styles.css +++ b/theme/custom_corners/user_styles.css @@ -1058,20 +1058,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 dc631c47c952f..753fefa97ccb6 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')).'-