* @param $submission object The submission object or NULL in which case it will be loaded
*/
function view_feedback($submission=NULL) {
- global $USER;
+ global $USER, $CFG;
+ require_once($CFG->libdir.'/gradelib.php');
+
+ if (!has_capability('mod/assignment:submit', $this->context, $USER->id, false)) {
+ // can not submit assignments -> no feedback
+ return;
+ }
if (!$submission) { /// Get submission for this assignment
$submission = $this->get_submission($USER->id);
}
- if (empty($submission->timemarked)) { /// Nothing to show, so print nothing
+ $grading_info = grade_get_grades($this->course->id, 'mod', 'assignment', $this->assignment->id, $USER->id);
+ $item = $grading_info->items[0];
+ $grade = $item->grades[$USER->id];
+
+ if ($grade->hidden or $grade->grade === false) { // hidden or error
+ return;
+ }
+
+ if ($grade->grade === null and empty($feedback)) { /// Nothing to show yet
return;
}
- /// We need the teacher info
- if (! $teacher = get_record('user', 'id', $submission->teacher)) {
- error('Could not find the teacher');
+ if ($grade->overridden) {
+ $graded_date = $grade->overridden;
+ $graded_by = $grade->usermodified;
+ } else {
+ $graded_date = $submission->timemarked;
+ $graded_by = $submission->teacher;
}
+ /// We need the teacher info
+ $teacher = get_record('user', 'id', $graded_by);
+
/// Print the feedback
- print_heading(get_string('feedbackfromteacher', 'assignment', $this->course->teacher));
+ print_heading(get_string('feedbackfromteacher', 'assignment', $this->course->teacher)); // TODO: fix teacher string
echo '<table cellspacing="0" class="feedback">';
echo '<tr>';
echo '<td class="left picture">';
- print_user_picture($teacher->id, $this->course->id, $teacher->picture);
+ if ($teacher) {
+ print_user_picture($teacher->id, $this->course->id, $teacher->picture);
+ }
echo '</td>';
echo '<td class="topic">';
echo '<div class="from">';
- echo '<div class="fullname">'.fullname($teacher).'</div>';
- echo '<div class="time">'.userdate($submission->timemarked).'</div>';
+ if ($teacher) {
+ echo '<div class="fullname">'.fullname($teacher).'</div>';
+ }
+ echo '<div class="time">'.userdate($graded_date).'</div>';
echo '</div>';
echo '</td>';
echo '</tr>';
echo '<tr>';
echo '<td class="left side"> </td>';
echo '<td class="content">';
- if ($this->assignment->grade) {
- echo '<div class="grade">';
- echo get_string("grade").': '.$this->display_grade($submission->grade);
- echo '</div>';
- echo '<div class="clearer"></div>';
- }
+ echo '<div class="grade">';
+ echo get_string("grade").': '.$grade->str_grade;
+ echo '</div>';
+ echo '<div class="clearer"></div>';
echo '<div class="comment">';
- echo format_text($submission->submissioncomment, $submission->format);
+ echo $grade->str_feedback;
echo '</div>';
echo '</tr>';
$output.= 'opener.document.getElementById("up'.$submission->userid.'").innerHTML="'.addslashes_js($button).'";';
}
- if (!empty($CFG->enableoutcomes) and empty($SESSION->flextable['mod-assignment-submissions']->collapse['outcomes'])) {
- $grading_info = grade_get_grades($this->course->id, 'mod', 'assignment', $this->assignment->id, $submission->userid);
+ $grading_info = grade_get_grades($this->course->id, 'mod', 'assignment', $this->assignment->id, $submission->userid);
+
+ if (empty($SESSION->flextable['mod-assignment-submissions']->collapse['finalgrade'])) {
+ $output.= 'opener.document.getElementById("finalgrade_'.$submission->userid.
+ '").innerHTML="'.$grading_info->items[0]->grades[$submission->userid]->str_grade.'";'."\n";
+ }
+
+ if (!empty($CFG->enableoutcomes) and empty($SESSION->flextable['mod-assignment-submissions']->collapse['outcome'])) {
if (!empty($grading_info->outcomes)) {
foreach($grading_info->outcomes as $n=>$outcome) {
- if ($data->locked) {
+ if ($outcome->grades[$submission->userid]->locked) {
continue;
}
$subtype = 'assignmentold';
}
+ $grading_info = grade_get_grades($this->course->id, 'mod', 'assignment', $this->assignment->id, array($user->id));
+ $disabled = $grading_info->items[0]->grades[$userid]->locked || $grading_info->items[0]->grades[$userid]->overridden;
+
/// construct SQL, using current offset to find the data of the next student
$course = $this->course;
$assignment = $this->assignment;
echo '</div>';
}
echo '<div class="grade"><label for="menugrade">'.get_string('grade').'</label> ';
- choose_from_menu(make_grades_menu($this->assignment->grade), 'grade', $submission->grade, get_string('nograde'), '', -1);
+ choose_from_menu(make_grades_menu($this->assignment->grade), 'grade', $submission->grade, get_string('nograde'), '', -1, false, $disabled);
echo '</div>';
+ echo '<div class="clearer"></div>';
+ echo '<div class="finalgrade">'.get_string('finalgrade', 'grades').': '.$grading_info->items[0]->grades[$userid]->str_grade.'</div>';
echo '<div class="clearer"></div>';
if (!empty($CFG->enableoutcomes)) {
- $grading_info = grade_get_grades($this->course->id, 'mod', 'assignment', $this->assignment->id, $submission->userid);
foreach($grading_info->outcomes as $n=>$outcome) {
echo '<div class="outcome"><label for="menuoutcome_'.$n.'">'.$outcome->name.'</label> ';
$options = make_grades_menu(-$outcome->scaleid);
$this->preprocess_submission($submission);
- print_textarea($this->usehtmleditor, 14, 58, 0, 0, 'submissioncomment', $submission->submissioncomment, $this->course->id);
+ if ($disabled) {
+ echo '<div class="disabledfeedback">'.$grading_info->items[0]->grades[$userid]->str_feedback.'</div>';
- if ($this->usehtmleditor) {
- echo '<input type="hidden" name="format" value="'.FORMAT_HTML.'" />';
} else {
- echo '<div class="format">';
- choose_from_menu(format_text_menu(), "format", $submission->format, "");
- helpbutton("textformat", get_string("helpformatting"));
- echo '</div>';
+ print_textarea($this->usehtmleditor, 14, 58, 0, 0, 'submissioncomment', $submission->submissioncomment, $this->course->id);
+ if ($this->usehtmleditor) {
+ echo '<input type="hidden" name="format" value="'.FORMAT_HTML.'" />';
+ } else {
+ echo '<div class="format">';
+ choose_from_menu(format_text_menu(), "format", $submission->format, "");
+ helpbutton("textformat", get_string("helpformatting"));
+ echo '</div>';
+ }
}
///Print Buttons in Single View
echo '</table>';
- if ($this->usehtmleditor) {
+ if (!$disabled and $this->usehtmleditor) {
use_html_editor();
}
if (!empty($CFG->enablegroupings) && !empty($cm->groupingid)) {
$groupingusers = groups_get_grouping_members($cm->groupingid, 'u.id', 'u.id');
$users = array_intersect($users, array_keys($groupingusers));
-
+
}
- $tablecolumns = array('picture', 'fullname', 'grade', 'submissioncomment', 'timemodified', 'timemarked', 'status');
+ $tablecolumns = array('picture', 'fullname', 'grade', 'submissioncomment', 'timemodified', 'timemarked', 'status', 'finalgrade');
if ($uses_outcomes) {
- $tablecolumns[] = ''; // no sorting based on outcomes column
+ $tablecolumns[] = 'outcome'; // no sorting based on outcomes column
}
$tableheaders = array('',
get_string('comment', 'assignment'),
get_string('lastmodified').' ('.$course->student.')',
get_string('lastmodified').' ('.$course->teacher.')',
- get_string('status'));
+ get_string('status'),
+ get_string('finalgrade', 'grades'));
if ($uses_outcomes) {
- $tableheaders[] = get_string('outcomes', 'grades');
+ $tableheaders[] = get_string('outcome', 'grades');
}
require_once($CFG->libdir.'/tablelib.php');
$table->column_class('timemodified', 'timemodified');
$table->column_class('timemarked', 'timemarked');
$table->column_class('status', 'status');
+ $table->column_class('finalgrade', 'finalgrade');
if ($uses_outcomes) {
- $table->column_class('outcomes', 'outcomes');
+ $table->column_class('outcome', 'outcome');
}
$table->set_attribute('cellspacing', '0');
$table->set_attribute('width', '90%');
//$table->set_attribute('align', 'center');
+ $table->no_sorting('finalgrade');
+ $table->no_sorting('outcome');
+
// Start working -- this is necessary as soon as the niceties are over
$table->setup();
if (($ausers = get_records_sql($select.$sql.$sort, $table->get_page_start(), $table->get_page_size())) !== false) {
$grading_info = grade_get_grades($this->course->id, 'mod', 'assignment', $this->assignment->id, array_keys($ausers));
foreach ($ausers as $auser) {
+ $final_grade = $grading_info->items[0]->grades[$auser->id];
/// Calculate user status
$auser->status = ($auser->timemarked > 0) && ($auser->timemarked >= $auser->timemodified);
$picture = print_user_picture($auser->id, $course->id, $auser->picture, false, true);
if ($auser->timemarked > 0) {
$teachermodified = '<div id="tt'.$auser->id.'">'.userdate($auser->timemarked).'</div>';
- if ($quickgrade) {
+ if ($final_grade->locked or $final_grade->overridden) {
+ $grade = '<div id="g'.$auser->id.'">'.$final_grade->str_grade.'</div>';
+ } else if ($quickgrade) {
$menu = choose_from_menu(make_grades_menu($this->assignment->grade),
'menu['.$auser->id.']', $auser->grade,
get_string('nograde'),'',-1,true,false,$tabindex++);
} else {
$teachermodified = '<div id="tt'.$auser->id.'"> </div>';
- if ($quickgrade) {
+ if ($final_grade->locked or $final_grade->overridden) {
+ $grade = '<div id="g'.$auser->id.'">'.$final_grade->str_grade.'</div>';
+ } else if ($quickgrade) {
$menu = choose_from_menu(make_grades_menu($this->assignment->grade),
'menu['.$auser->id.']', $auser->grade,
get_string('nograde'),'',-1,true,false,$tabindex++);
}
}
///Print Comment
- if ($quickgrade) {
+ if ($final_grade->locked or $final_grade->overridden) {
+ $comment = '<div id="com'.$auser->id.'">'.shorten_text(strip_tags($final_grade->str_feedback),15).'</div>';
+
+ } else if ($quickgrade) {
$comment = '<div id="com'.$auser->id.'">'
. '<textarea tabindex="'.$tabindex++.'" name="submissioncomment['.$auser->id.']" id="submissioncomment'
. $auser->id.'" rows="2" cols="20">'.($auser->submissioncomment).'</textarea></div>';
$teachermodified = '<div id="tt'.$auser->id.'"> </div>';
$status = '<div id="st'.$auser->id.'"> </div>';
- if ($quickgrade) { // allow editing
+ if ($final_grade->locked or $final_grade->overridden) {
+ $grade = '<div id="g'.$auser->id.'">'.$final_grade->str_grade.'</div>';
+ } else if ($quickgrade) { // allow editing
$menu = choose_from_menu(make_grades_menu($this->assignment->grade),
'menu['.$auser->id.']', $auser->grade,
get_string('nograde'),'',-1,true,false,$tabindex++);
$grade = '<div id="g'.$auser->id.'">-</div>';
}
- if ($quickgrade) {
+ if ($final_grade->locked or $final_grade->overridden) {
+ $comment = '<div id="com'.$auser->id.'">'.$final_grade->str_feedback.'</div>';
+ } else if ($quickgrade) {
$comment = '<div id="com'.$auser->id.'">'
. '<textarea tabindex="'.$tabindex++.'" name="submissioncomment['.$auser->id.']" id="submissioncomment'
. $auser->id.'" rows="2" cols="20">'.($auser->submissioncomment).'</textarea></div>';
$status = '<div id="up'.$auser->id.'" class="s'.$auser->status.'">'.$button.'</div>';
+ $finalgrade = '<span id="finalgrade_'.$auser->id.'">'.$final_grade->str_grade.'</span>';
+
$outcomes = '';
if ($uses_outcomes) {
}
- $row = array($picture, fullname($auser), $grade, $comment, $studentmodified, $teachermodified, $status);
+ $row = array($picture, fullname($auser), $grade, $comment, $studentmodified, $teachermodified, $status, $finalgrade);
if ($uses_outcomes) {
$row[] = $outcomes;
}
* @return object The updated submission object
*/
function process_feedback() {
-
- global $USER;
+ global $CFG, $USER;
+ require_once($CFG->libdir.'/gradelib.php');
if (!$feedback = data_submitted()) { // No incoming data?
return false;
return false;
}
+ $grading_info = grade_get_grades($this->course->id, 'mod', 'assignment', $this->assignment->id, $feedback->userid);
+
// store outcomes if needed
$this->process_outcomes($feedback->userid);
$submission = $this->get_submission($feedback->userid, true); // Get or make one
- $submission->grade = $feedback->grade;
- $submission->submissioncomment = $feedback->submissioncomment;
- $submission->format = $feedback->format;
- $submission->teacher = $USER->id;
- $submission->mailed = 0; // Make sure mail goes out (again, even)
- $submission->timemarked = time();
+ if (!$grading_info->items[0]->grades[$feedback->userid]->locked and
+ !$grading_info->items[0]->grades[$feedback->userid]->overridden) {
- unset($submission->data1); // Don't need to update this.
- unset($submission->data2); // Don't need to update this.
+ $submission->grade = $feedback->grade;
+ $submission->submissioncomment = $feedback->submissioncomment;
+ $submission->format = $feedback->format;
+ $submission->teacher = $USER->id;
+ $submission->mailed = 0; // Make sure mail goes out (again, even)
+ $submission->timemarked = time();
- if (empty($submission->timemodified)) { // eg for offline assignments
- // $submission->timemodified = time();
- }
+ unset($submission->data1); // Don't need to update this.
+ unset($submission->data2); // Don't need to update this.
- if (! update_record('assignment_submissions', $submission)) {
- return false;
- }
+ if (empty($submission->timemodified)) { // eg for offline assignments
+ // $submission->timemodified = time();
+ }
- // triger grade event
- $this->update_grade($submission);
+ if (! update_record('assignment_submissions', $submission)) {
+ return false;
+ }
- add_to_log($this->course->id, 'assignment', 'update grades',
- 'submissions.php?id='.$this->assignment->id.'&user='.$feedback->userid, $feedback->userid, $this->cm->id);
+ // triger grade event
+ $this->update_grade($submission);
+
+ add_to_log($this->course->id, 'assignment', 'update grades',
+ 'submissions.php?id='.$this->assignment->id.'&user='.$feedback->userid, $feedback->userid, $this->cm->id);
+ }
return $submission;
$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
+ $sql = "SELECT u.id, u.id AS userid, s.grade AS rawgrade, s.submissioncomment AS feedback, s.format AS feedbackformat, s.teacher AS usermodified
FROM {$CFG->prefix}user u, {$CFG->prefix}assignment_submissions s
WHERE u.id = s.userid AND s.assignment = $assignment->id
$user";