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();
// 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>';
}
-.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;
+}
$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()) {
}
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
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"> </div>';
+ $data[] = '<div class="'.$hidden.'feedbacktext"> </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);
-.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;
}
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;
+}
$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.';
$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';
$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';
$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';
$this->force_regrading();
}
+ $this->timemodified = time();
+
return parent::update($source);
}
$this->path = null;
+ $this->timecreated = $this->timemodified = time();
+
if (!parent::insert($source)) {
debugging("Could not insert this category: " . print_r($this, true));
return false;
$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;
/**
* internal function for category grades aggregation
- *
+ *
* @param int $userid
* @param array $items
* @param array $grade_values
*/
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.
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
//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 {
$this->force_regrading();
}
+ $this->timemodified = time();
+
return parent::update($source);
}
$this->outcomeid = null;
}
+ $this->timecreated = $this->timemodified = time();
+
if (parent::insert($source)) {
// force regrading of items if needed
$this->force_regrading();
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
$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
}
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
* @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
$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
}
if (empty($grade->id)) {
+ if (is_null($grade->rawgrade)) {
+ $grade->dategraded = null;
+ }
$result = (boolean)$grade->insert($source);
} else if ($grade->finalgrade !== $oldgrade->finalgrade
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);
}
} else {
$useditems = array();
}
-
+
// MDL-11902
// unset the value if formula is trying to reference to itself
// but array keys does not match itemid
function update($source=null) {
global $USER;
- $this->timemodified = time();
-
$data = $this->get_record_data();
if (!update_record($this->table, addslashes_recursive($data))) {
return false;
}
- $this->timecreated = $this->timemodified = time();
-
$data = $this->get_record_data();
if (!$this->id = insert_record($this->table, addslashes_recursive($data))) {
* @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();
* @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)) {
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.
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;
$rawgrade = false;
$feedback = false;
$feedbackformat = FORMAT_MOODLE;
+ $usermodified = $USER->id;
+ $datesubmitted = null;
+ $dategraded = null;
if (array_key_exists('rawgrade', $grade)) {
$rawgrade = $grade['rawgrade'];
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;
}
}
$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)) {
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);
$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";
$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 {
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);
* 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');
$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);
}
/**
$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);
}
}
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 {
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);
* 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');
$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);
}
/**
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
/** 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;
}