diff --git a/mod/assignment/index.php b/mod/assignment/index.php
index 6f5d82721b8..cdd1295946d 100644
--- a/mod/assignment/index.php
+++ b/mod/assignment/index.php
@@ -2,6 +2,7 @@
require_once("../../config.php");
require_once("lib.php");
+ require_once($CFG->libdir.'/gradelib.php');
$id = required_param('id', PARAM_INT); // course
@@ -62,12 +63,8 @@
$submitted = $assignmentinstance->submittedlink();
- $grade = '-';
- if ($submission = $assignmentinstance->get_submission($USER->id)) {
- if ($submission->timemarked) {
- $grade = $assignmentinstance->display_grade($submission->grade);
- }
- }
+ $grading_info = grade_get_grades($course->id, 'mod', 'assignment', $assignment->id, $USER->id);
+ $grade = $grading_info->items[0]->grades[$USER->id]->str_grade;
$type = $types[$assignment->assignmenttype];
diff --git a/mod/assignment/lib.php b/mod/assignment/lib.php
index 07b81962c52..740b1438c04 100644
--- a/mod/assignment/lib.php
+++ b/mod/assignment/lib.php
@@ -228,34 +228,58 @@ class assignment_base {
* @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;
}
- /// We need the teacher info
- if (! $teacher = get_record('user', 'id', $submission->teacher)) {
- error('Could not find the teacher');
+ if ($grade->grade === null and empty($feedback)) { /// Nothing to show yet
+ return;
}
+ 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 '
';
echo '';
echo '| ';
- print_user_picture($teacher->id, $this->course->id, $teacher->picture);
+ if ($teacher) {
+ print_user_picture($teacher->id, $this->course->id, $teacher->picture);
+ }
echo ' | ';
echo '';
echo '';
- echo ' '.fullname($teacher).' ';
- echo ' '.userdate($submission->timemarked).' ';
+ if ($teacher) {
+ echo ' '.fullname($teacher).' ';
+ }
+ echo ' '.userdate($graded_date).' ';
echo ' ';
echo ' | ';
echo '
';
@@ -263,15 +287,13 @@ class assignment_base {
echo '';
echo '| | ';
echo '';
- if ($this->assignment->grade) {
- echo ' ';
- echo get_string("grade").': '.$this->display_grade($submission->grade);
- echo ' ';
- echo '';
- }
+ echo '';
+ echo get_string("grade").': '.$grade->str_grade;
+ echo ' ';
+ echo '';
echo '';
echo ' |
';
@@ -684,12 +706,18 @@ class assignment_base {
$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;
}
@@ -775,6 +803,9 @@ class assignment_base {
$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;
@@ -864,13 +895,14 @@ class assignment_base {
echo '';
}
echo ' ';
- 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 '
';
+ echo '';
+ echo ''.get_string('finalgrade', 'grades').': '.$grading_info->items[0]->grades[$userid]->str_grade.'
';
echo '';
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 ' ';
$options = make_grades_menu(-$outcome->scaleid);
@@ -888,15 +920,19 @@ class assignment_base {
$this->preprocess_submission($submission);
- print_textarea($this->usehtmleditor, 14, 58, 0, 0, 'submissioncomment', $submission->submissioncomment, $this->course->id);
+ if ($disabled) {
+ echo '
'.$grading_info->items[0]->grades[$userid]->str_feedback.'
';
- if ($this->usehtmleditor) {
- echo '
';
} else {
- echo '
';
- choose_from_menu(format_text_menu(), "format", $submission->format, "");
- helpbutton("textformat", get_string("helpformatting"));
- echo '
';
+ print_textarea($this->usehtmleditor, 14, 58, 0, 0, 'submissioncomment', $submission->submissioncomment, $this->course->id);
+ if ($this->usehtmleditor) {
+ echo '
';
+ } else {
+ echo '
';
+ choose_from_menu(format_text_menu(), "format", $submission->format, "");
+ helpbutton("textformat", get_string("helpformatting"));
+ echo '
';
+ }
}
///Print Buttons in Single View
@@ -939,7 +975,7 @@ class assignment_base {
echo '
';
- if ($this->usehtmleditor) {
+ if (!$disabled and $this->usehtmleditor) {
use_html_editor();
}
@@ -1032,12 +1068,12 @@ class assignment_base {
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('',
@@ -1046,9 +1082,10 @@ class assignment_base {
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');
@@ -1072,8 +1109,9 @@ class assignment_base {
$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');
@@ -1082,6 +1120,9 @@ class assignment_base {
$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();
@@ -1133,6 +1174,7 @@ class assignment_base {
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);
@@ -1155,7 +1197,9 @@ class assignment_base {
if ($auser->timemarked > 0) {
$teachermodified = ''.userdate($auser->timemarked).'
';
- if ($quickgrade) {
+ if ($final_grade->locked or $final_grade->overridden) {
+ $grade = ''.$final_grade->str_grade.'
';
+ } 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++);
@@ -1166,7 +1210,9 @@ class assignment_base {
} else {
$teachermodified = '
';
- if ($quickgrade) {
+ if ($final_grade->locked or $final_grade->overridden) {
+ $grade = ''.$final_grade->str_grade.'
';
+ } 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++);
@@ -1176,7 +1222,10 @@ class assignment_base {
}
}
///Print Comment
- if ($quickgrade) {
+ if ($final_grade->locked or $final_grade->overridden) {
+ $comment = ''.shorten_text(strip_tags($final_grade->str_feedback),15).'
';
+
+ } else if ($quickgrade) {
$comment = ''
. '
';
@@ -1188,7 +1237,9 @@ class assignment_base {
$teachermodified = '
';
$status = '
';
- if ($quickgrade) { // allow editing
+ if ($final_grade->locked or $final_grade->overridden) {
+ $grade = ''.$final_grade->str_grade.'
';
+ } 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++);
@@ -1197,7 +1248,9 @@ class assignment_base {
$grade = '-
';
}
- if ($quickgrade) {
+ if ($final_grade->locked or $final_grade->overridden) {
+ $comment = ''.$final_grade->str_feedback.'
';
+ } else if ($quickgrade) {
$comment = ''
. '
';
@@ -1222,6 +1275,8 @@ class assignment_base {
$status = ''.$button.'
';
+ $finalgrade = ''.$final_grade->str_grade.'';
+
$outcomes = '';
if ($uses_outcomes) {
@@ -1243,7 +1298,7 @@ class assignment_base {
}
- $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;
}
@@ -1314,8 +1369,8 @@ class assignment_base {
* @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;
@@ -1332,35 +1387,41 @@ class assignment_base {
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 (empty($submission->timemodified)) { // eg for offline assignments
+ // $submission->timemodified = time();
+ }
+
+ if (! update_record('assignment_submissions', $submission)) {
+ return false;
+ }
+
+ // 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);
}
- if (! update_record('assignment_submissions', $submission)) {
- return false;
- }
-
- // 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;
}
@@ -2020,7 +2081,7 @@ 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
+ $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";
diff --git a/mod/assignment/styles.php b/mod/assignment/styles.php
index 3419d539a66..ccdcf3f0fa4 100644
--- a/mod/assignment/styles.php
+++ b/mod/assignment/styles.php
@@ -14,12 +14,15 @@
padding:5px;
}
-.mod-assignment .feedback .grade {
+.mod-assignment .feedback .grade,
+.mod-assignment .feedback .outcome,
+.mod-assignment .feedback .finalgrade {
float: right;
}
-.mod-assignment .feedback .outcome {
- float: right;
+.mod-assignment .feedback .disabledfeedback {
+ width: 500px;
+ height: 250px;
}
.mod-assignment .feedback .from {
@@ -89,7 +92,8 @@
text-align: center;
}
-#mod-assignment-submissions .submissions .outcome {
+#mod-assignment-submissions .submissions .outcome,
+#mod-assignment-submissions .submissions .finalgrade {
text-align: right;
}
diff --git a/mod/assignment/type/offline/assignment.class.php b/mod/assignment/type/offline/assignment.class.php
index 8e86d9133b7..9e3f0564b23 100644
--- a/mod/assignment/type/offline/assignment.class.php
+++ b/mod/assignment/type/offline/assignment.class.php
@@ -37,8 +37,8 @@ class assignment_offline extends assignment_base {
// needed for the timemodified override
function process_feedback() {
-
- global $USER;
+ global $CFG, $USER;
+ require_once($CFG->libdir.'/gradelib.php');
if (!$feedback = data_submitted()) { // No incoming data?
return false;
@@ -55,35 +55,41 @@ class assignment_offline extends assignment_base {
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 (empty($submission->timemodified)) { // eg for offline assignments
+ $submission->timemodified = time();
+ }
+
+ if (! update_record('assignment_submissions', $submission)) {
+ return false;
+ }
+
+ // 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);
}
- if (! update_record('assignment_submissions', $submission)) {
- return false;
- }
-
- // 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;
}