some more fixes for assignment grading; merged from MOODLE_15_STABLE

This commit is contained in:
skodak
2005-11-18 10:31:46 +00:00
parent 74b244937f
commit 39e1190567
2 changed files with 77 additions and 68 deletions
+73 -62
View File
@@ -474,72 +474,82 @@ class assignment_base {
case 'fastgrade':
///do the fast grading stuff - this process should work for all 3 subclasses
$grading = false;
$grading = false;
$commenting = false;
$col = false;
if (isset($_POST['comment'])) {
$arr = 'comment';
$col = 'comment';
$commenting = true;
}
if (isset($_POST['menu'])) {
$arr = 'menu';
$col = 'menu';
$grading = true;
}
if (!$grading && !$commenting) {
//both comment and grade hidden..
$this->display_submissions();
if (!$col) {
//both comment and grade columns collapsed..
$this->display_submissions();
break;
}
foreach ($_POST[$arr] as $id => $unusedvalue){
foreach ($_POST[$col] as $id => $unusedvalue){
$id = (int)$id; //clean parameter name
$newsubmission = $this->get_submission($id, true); // Get or make one
unset($newsubmission->data1); // Don't need to update this.
unset($newsubmission->data2); // Don't need to update this.
if (!$submission = $this->get_submission($id)) {
$submission = $this->prepare_new_submission($id);
$newsubmission = true;
} else {
$newsubmission = false;
}
unset($submission->data1); // Don't need to update this.
unset($submission->data2); // Don't need to update this.
//for fast grade, we need to check if any changes take place
$updatedb = false;
if ($grading) {
$grade = $_POST['menu'][$id];
$updatedb = $updatedb || ($newsubmission->grade != $grade);
$newsubmission->grade = $grade;
$updatedb = $updatedb || ($submission->grade != $grade);
$submission->grade = $grade;
} else {
unset($newsubmission->grade); // Don't need to update this.
if (!$newsubmission) {
unset($submission->grade); // Don't need to update this.
}
}
if ($commenting) {
$commentvalue = $_POST['comment'][$id];
$updatedb = $updatedb || ($newsubmission->comment != stripslashes($commentvalue));
$newsubmission->comment = $commentvalue;
$commentvalue = trim($_POST['comment'][$id]);
$updatedb = $updatedb || ($submission->comment != stripslashes($commentvalue));
$submission->comment = $commentvalue;
} else {
unset($newsubmission->comment); // Don't need to update this.
}
$newsubmission->teacher = $USER->id;
$newsubmission->mailed = !$updatedb?$newsubmission->mailed:0;//only change if it's a duplicate
$newsubmission->timemarked = time();
if (empty($newsubmission->timemodified)) { // eg for offline assignments
$newsubmission->timemodified = time();
unset($submission->comment); // Don't need to update this.
}
//if it is a duplicate, we don't change the last modified time etc.
$submission->teacher = $USER->id;
$submission->mailed = $updatedb?0:$submission->mailed;//only change if it's an update
$submission->timemarked = time();
//if it is not an update, we don't change the last modified time etc.
//this will also not write into database if no comment and grade is entered.
if ($updatedb){
if (!update_record('assignment_submissions', $newsubmission)) {
return false;
if ($newsubmission) {
if (!insert_record('assignment_submissions', $submission)) {
return false;
}
} else {
if (!update_record('assignment_submissions', $submission)) {
return false;
}
}
//add to log only if not a duplicate
//add to log only if updating
add_to_log($this->course->id, 'assignment', 'update grades',
'submissions.php?id='.$this->assignment->id.'&user='.$newsubmission->userid,
$newsubmission->userid, $this->cm->id);
'submissions.php?id='.$this->assignment->id.'&user='.$submission->userid,
$submission->userid, $this->cm->id);
}
}
$this->display_submissions();
break;
case 'next':
/// We are currently in pop up, but we want to skip to next one without saving.
/// This turns out to be similar to a single case
@@ -646,7 +656,7 @@ class assignment_base {
if (isset($scalegrades[$this->assignment->id][$grade])) {
return $scalegrades[$this->assignment->id][$grade];
}
return '';
return '-';
}
}
@@ -665,8 +675,8 @@ class assignment_base {
error('No such user!');
}
if (!$submission = $this->get_submission($user->id, true)) { // Get one or make one
error('Could not find submission!');
if (!$submission = $this->get_submission($user->id)) {
$submission = $this->prepare_new_submission($userid);
}
if ($submission->timemodified > $submission->timemarked) {
@@ -752,9 +762,6 @@ class assignment_base {
//new hidden field, initialized to -1.
echo '<input type="hidden" name="saveuserid" value="-1" />';
if (!$submission->grade and !$submission->timemarked) {
$submission->grade = -1; /// Hack to stop zero being selected on the menu below (so it shows 'no grade')
}
if ($submission->timemarked) {
echo '<div class="from">';
echo '<div class="fullname">'.fullname($teacher, true).'</div>';
@@ -968,8 +975,8 @@ class assignment_base {
foreach ($ausers as $auser) {
$picture = print_user_picture($auser->id, $course->id, $auser->picture, false, true);
if (!$auser->grade and !$auser->timemarked and $quickgrade) {
$auser->grade = -1;//Martin's hack to prevent 0 showing up and select no grade instead.
if (empty($auser->submissionid)) {
$auser->grade = -1; //no submission yet
}
if (!empty($auser->submissionid)) {
@@ -1015,7 +1022,7 @@ class assignment_base {
$grade = '<div id="g'.$auser->id.'">'.choose_from_menu(make_grades_menu($this->assignment->grade),
'menu['.$auser->id.']', $auser->grade, get_string('nograde'),'',-1,true,false,$tabindex++).'</div>';
} else {
$grade = '<div id="g'.$auser->id.'">&nbsp;</div>';
$grade = '<div id="g'.$auser->id.'">-</div>';
}
if ($quickgrade){
$comment = '<div id="com'.$auser->id.'"><textarea tabindex="'.$tabindex++.'" name="comment['.$auser->id.']" id="comment['.$auser->id.']">'.($auser->comment).'</textarea></div>';
@@ -1151,12 +1158,7 @@ class assignment_base {
if ($submission || !$createnew) {
return $submission;
}
$newsubmission = new Object;
$newsubmission->assignment = $this->assignment->id;
$newsubmission->userid = $userid;
$newsubmission->timecreated = time();
$newsubmission->grade = -1;
$newsubmission = $this->prepare_new_submission($userid);
if (!insert_record("assignment_submissions", $newsubmission)) {
error("Could not insert a new empty submission");
}
@@ -1164,6 +1166,25 @@ class assignment_base {
return get_record('assignment_submissions', 'assignment', $this->assignment->id, 'userid', $userid);
}
function prepare_new_submission($userid) {
$submission = new Object;
$submission->assignment = $this->assignment->id;
$submission->userid = $userid;
$submission->timecreated = time();
$submission->timemodified = $submission->timecreated;
$submission->numfiles = 0;
$submission->data1 = '';
$submission->data2 = '';
$submission->grade = -1;
$submission->comment = '';
$submission->format = 0;
$submission->teacher = 0;
$submission->timemarked = 0;
$submission->mailed = 0;
return $submission;
}
function get_submissions($sort='', $dir='DESC') {
/// Return all assignment submissions by ENROLLED students (even empty)
@@ -1358,10 +1379,8 @@ class assignment_base {
function user_outline($user) {
if ($submission = $this->get_submission($user->id)) {
if ($submission->grade) {
$result->info = get_string('grade').': '.$this->display_grade($submission->grade);
}
$result->info = get_string('grade').': '.$this->display_grade($submission->grade);
$result->time = $submission->timemodified;
return $result;
}
@@ -1607,7 +1626,7 @@ function assignment_grades($assignmentid) {
$scalegrades = make_menu_from_list($scale->scale);
foreach ($grades as $userid => $grade) {
if (empty($scalegrades[$grade])) {
$grades[$userid] = '';
$grades[$userid] = '-';
} else {
$grades[$userid] = $scalegrades[$grade];
}
@@ -2026,12 +2045,4 @@ function assignment_upgrade_submodules() {
}
}
function assignment_get_view_actions() {
return array('view','view all','view submission');
}
function assignment_get_post_actions() {
return array('upload','update grades');
}
?>
@@ -103,7 +103,8 @@ class assignment_uploadsingle extends assignment_base {
if ($this->isopen() && (!$filecount || $this->assignment->resubmit)) {
if ($submission = $this->get_submission($USER->id)) {
if ($submission->grade and !$this->assignment->resubmit) {
//TODO: change later to ">= 0", to prevent resubmission when graded 0
if (($submission->grade > 0) and !$this->assignment->resubmit) {
notify(get_string('alreadygraded', 'assignment'));
}
}
@@ -129,11 +130,8 @@ class assignment_uploadsingle extends assignment_base {
notify(get_string("uploadfailnoupdate", "assignment"));
}
} else {
$newsubmission->assignment = $this->assignment->id;
$newsubmission->userid = $USER->id;
$newsubmission->timecreated = time();
$newsubmission->timemodified = time();
$newsubmission->numfiles = 1;
$newsubmission = $this->prepare_new_submission($USER->id);
$newsubmission->numfiles = 1;
if (insert_record('assignment_submissions', $newsubmission)) {
add_to_log($this->course->id, 'assignment', 'upload',
'view.php?a='.$this->assignment->id, $this->assignment->id, $this->cm->id);