id, $course->id)) { error("Course Module ID was incorrect"); } if (!isteacher($course->id)) { error("Only teachers can look at this page"); } /// Create the assignment class: require ($CFG->dirroot.'/mod/assignment/type/'.$assignment->assignmenttype.'/assignment.class.php'); $assignmentclass = 'assignment_'.$assignment->assignmenttype; $ass_obj = new $assignmentclass($cm->id, $assignment, $cm, $course); $strassignments = get_string("modulenameplural", "assignment"); $strassignment = get_string("modulename", "assignment"); $strsubmissions = get_string("submissions", "assignment"); $strsendreminder = get_string('sendreminder', 'block_marking'); $strnumreminderssent = get_string('numreminderssent', 'block_marking'); $strlastremindersent = get_string('lastremindersent', 'block_marking'); /// Check to see if groups are being used in this assignment if ($groupmode = groupmode($course, $cm)) { // Groups are being used if (empty($currentgroup)) { $currentgroup = setup_and_print_groups($course, $groupmode, "marking.php?id=$id&mid=$mid&sort=$sort&dir=$dir"); } else { setup_and_print_groups($course, $groupmode, "marking.php?id=$id&mid=$mid&sort=$sort&dir=$dir"); } } else { $currentgroup = false; } /// Get all teachers and students $teachers = get_course_teachers($course->id); /// Show any specific group of users requested. if ($currentgroup) { $users = get_group_students($currentgroup); } else { $users = get_course_students($course->id); } if (!$users) { print_heading(get_string("nostudentsyet")); exit; } $submissions = array(); /// Make some easy ways to reference submissions // if ($submissions = $ass_obj->get_submissions($sort, $dir)) { if ($submissions = assignment_get_all_submissions($ass_obj->assignment, $sort, $dir)) { foreach ($submissions as $submission) { $submissionbyuser[$submission->userid] = $submission; } } /// Get all existing submissions and check for missing ones foreach($users as $user) { if (!isset($submissionbyuser[$user->id])) { // Need to create empty entry $newsubmission->assignment = $assignment->id; $newsubmission->userid = $user->id; $newsubmission->timecreated = time(); if (!insert_record("assignment_submissions", $newsubmission)) { error("Could not insert a new empty submission"); } } } if (isset($newsubmission)) { // Get them all out again to be sure // $submissions = $ass_obj->get_submissions($sort, $dir); $submissions = assignment_get_all_submissions($ass_obj->assignment, $sort, $dir); } /// If data is being submitted, then process it if ($data = data_submitted($CFG->wwwroot.'/blocks/marking/marking.php')) { if (isset($data->sendreminders)) { mb_send_all_reminders($data, $users, $course, $cm); $message = get_string('sentreminders', 'block_marking'); redirect('marking.php?id='.$id.'&mid='.$mid, $message, 3); } /// If we're only submitting a single feedback, set the submittal array to just that one. if (isset($data->submitsub)) { $data->sub_id = array(key($data->submitsub)); } foreach ($data->sub_id as $sub_id) { $submission = $submissions[$sub_id]; $reqresubmit = isset($data->reqresubmit[$sub_id]) ? 1 : 0; // Only update entries where feedback has actually changed. if (($data->grade[$sub_id] <> $submission->grade) || ($data->comment[$sub_id] <> addslashes($submission->comment)) || $reqresubmit) { unset($newsubmission); $newsubmission->grade = $data->grade[$sub_id]; $newsubmission->comment = $data->comment[$sub_id]; $newsubmission->teacher = $USER->id; $newsubmission->timemarked = $timenow; $newsubmission->mailed = 0; // Make sure mail goes out (again, even) $newsubmission->id = $sub_id; if ($reqresubmit) { $newsubmission->comment .= "\n\n".'

'. get_string('resubmitmessage', 'block_marking').'

'; } // Make sure that we aren't overwriting any recent feedback from other teachers. (see bug #324) if ($timewas < $submission->timemarked && (!empty($submission->grade)) && (!empty($submission->comment))) { notify(get_string("failedupdatefeedback", "assignment", fullname($users[$submission->userid])) . "
" . get_string("grade") . ": $newsubmission->grade" . "
" . get_string("feedback", "assignment") . ": $newsubmission->comment\n"); } else { //print out old feedback and grade if (empty($submission->timemodified)) { // eg for offline assignments $newsubmission->timemodified = $timenow; } if (! update_record("assignment_submissions", $newsubmission)) { notify(get_string("failedupdatefeedback", "assignment", $submission->userid)); } else { $count++; } } } } $submissions = assignment_get_all_submissions($ass_obj->assignment, $sort, $dir); add_to_log($course->id, "assignment", "update grades", "submissions.php?id=$assignment->id", "$count users", $cm->id); if (isset($data->submitsub)) { $message = get_string('feedbackupdated', 'block_marking', fullname($users[$submission->userid])); } else { $message = get_string('allfeedbackupdated', 'block_marking'); } redirect('marking.php?id='.$id.'&mid='.$mid, $message, 3); } else { add_to_log($course->id, "assignment", "view submission", "submissions.php?id=$assignment->id", "$assignment->id", $cm->id); } $allowedtograde = ($groupmode != VISIBLEGROUPS or isteacheredit($course->id) or ismember($currentgroup)); $grades = make_grades_menu($assignment->grade); /// Rebuild submissions array, ordered by unmarked status. $marked = array(); $unsubmitted = array(); foreach ($submissions as $submission) { if (($submission->timemodified <= 0) && ($assignment->assignmenttype != 'offline')) { $unsubmitted[] = $submission; } else if ($submission->timemarked <= 0) { $unmarked_first[] = $submission; } else if ($submission->timemarked < $submission->timemodified) { $unmarked_resub[] = $submission; } else { $marked[] = $submission; } } $averageturnaround = mb_get_average_turnaround($submissions, $users); unset($submissions); $timedifference = $assignment->timedue - time(); if ($timedifference < 31536000) { // Don't bother showing dates over a year in the future $strdifference = format_time($timedifference); if ($timedifference < 0) { $strdifference = "$strdifference"; } $strduedate = userdate($assignment->timedue)." ($strdifference)"; } if ($assignment->grade < 0) { $scaleid = - ($assignment->grade); if ($scale = get_record("scale", "id", $scaleid)) { $scalegrades = make_menu_from_list($scale->scale); $gradetext = "".get_string("grade").": $scale->name "; } } else if ($assignment->grade > 0) { $gradetext = "".get_string("maximumgrade").": $assignment->grade"; } print_simple_box_start('', '', '', 10, 'generalbox'); echo '

'.get_string("duedate", "assignment").':'.$strduedate. '
'.$gradetext.'
'.get_string('markingcriteria', 'block_marking').': '. format_text($assignment->description, $assignment->format); if ($averageturnaround) { echo '
'.get_string('averageturnaround', 'block_marking', (int)$averageturnaround); } else { echo '
'.get_string('noaverageturnaround', 'block_marking'); } echo '

'; $marking = false; echo '
'; echo ""; if (isset($unmarked_first) && is_array($unmarked_first) && !empty($unmarked_first)) { $marking = true; echo '

'.get_string('unmarkedfirstsubmissions', 'block_marking').':

'; /// Sort submissions by original submission time. uasort($unmarked_first, 'mb_sort_unmarked_first'); foreach ($unmarked_first as $submission) { if (isset($users[$submission->userid])) { $user = $users[$submission->userid]; mb_local_assignment_print_submission($ass_obj, $user, $submission, $teachers, $grades, $id, $mid, $allowedtograde); } } } if (isset($unmarked_resub) && is_array($unmarked_resub) && !empty($unmarked_resub)) { $marking = true; echo '

'.get_string('unmarkedresubmissions', 'block_marking').':

'; foreach ($unmarked_resub as $submission) { if (isset($users[$submission->userid])) { $user = $users[$submission->userid]; mb_local_assignment_print_submission($ass_obj, $user, $submission, $teachers, $grades, $id, $mid, $allowedtograde); } } } if (is_array($marked) && !empty($marked)) { $marking = true; echo '

'.get_string('markedsubmissions', 'block_marking').':

'; foreach ($marked as $submission) { if (isset($users[$submission->userid])) { $user = $users[$submission->userid]; mb_local_assignment_print_submission($ass_obj, $user, $submission, $teachers, $grades, $id, $mid, $allowedtograde); } } } if ($marking) { echo '
'; } echo '
'; if (is_array($unsubmitted) && !empty($unsubmitted)) { echo '

'.get_string('studentsnotsubmitted', 'block_marking').':

'; echo '
'; echo ''; foreach ($unsubmitted as $submission) { if (isset($users[$submission->userid])) { $user = $users[$submission->userid]; echo "\n".''; echo "\n"; echo "\n"; echo "\n"; echo ''."\n"; echo "
"; print_user_picture($user->id, $assignment->course, $user->picture); echo "".fullname($user, true)."'; echo ''; $reminfo = mb_get_reminder_info($USER, $user, $course->id, $cm->id); echo $reminfo->numrems.' '.$strnumreminderssent.'.
'; if ($reminfo->numrems > 0) { echo $strlastremindersent.' '.userdate($reminfo->lastrem).'.
'; } echo ' '.$strsendreminder; echo '
'; echo '
\n"; } } echo '
'; echo '
'; } print_simple_box_end(); function mb_local_assignment_print_submission($ass_obj, $user, $submission, $teachers, $grades, $id, $mid, $allowedtograde=false) { global $THEME, $USER, $CFG; static $strsavefeedback; if (empty($strsavefeedback)) { $strsavefeedback = get_string('savefeedback', 'block_marking'); } echo "\n"; /// Begin Submission Area: echo "\n"; if ($ass_obj->assignment->assignmenttype == 'offline') { echo "\n"; /// mrc - 20041117 - Begin Customization: /// Show submitted time as well as modified time (resubmittal). echo ""; /// mrc - 20041117 - End Customization. if ($ass_obj->assignment->assignmenttype == 'uploadsingle') { echo "\n"; } else if ($ass_obj->assignment->assignmenttype == 'online') { echo "\n"; } /// End Submission Area. /// Begin Marking / Feedback Area: echo "\n"; echo "
"; } else { echo "\n"; } print_user_picture($user->id, $ass_obj->assignment->course, $user->picture); echo ""; echo ''; echo ''; if ($ass_obj->assignment->assignmenttype != 'offline' and $submission->timemodified) { if ($submission->timemarked < $submission->timecreated) { $span_open_css = ''; $span_close_css = ''; } else { $span_open_css = ''; $span_close_css = ''; } echo '"; } echo '
'.fullname($user, true).''.$span_open_css. 'Originally submitted: '.userdate($submission->timecreated).$span_close_css; if ($submission->timemodified != $submission->timecreated) { if ($submission->timemarked < $submission->timemodified) { $span_open_css = ''; $span_close_css = ''; } else { $span_open_css = ''; $span_close_css = ''; } echo '
'.$span_open_css.get_string("lastmodified").': '. userdate($submission->timemodified).$span_close_css; } echo "
'; echo "
"; if ($submission->timemodified) { $ass_obj->print_user_files($user->id); } else { print_string("notsubmittedyet", "assignment"); } echo "
"; if ($submission->timemodified) { $ass_obj->print_user_files($user->id); } else { print_string("notsubmittedyet", "assignment"); } echo "
"; if (!$submission->teacher) { $submission->teacher = $USER->id; } print_user_picture($submission->teacher, $ass_obj->assignment->course, $teachers[$submission->teacher]->picture); echo ""; 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 ($allowedtograde) { echo 'id.'] value="'.$submission->id.'">'; echo '"; echo "
'; echo get_string("feedback", "assignment").":"; choose_from_menu($grades, "grade[{$submission->id}]", $submission->grade, get_string("nograde")); echo '
'.get_string('requestresubmit', 'block_marking').': '. '
'; } else { echo '
'; echo get_string("feedback", "assignment").":"; p($submission->grade); echo '
'.get_string('requestresubmit', 'block_marking').': '. '
'; } if ($submission->timemarked) { echo "
".userdate($submission->timemarked); $markturnaround = (int)(($submission->timemarked - $submission->timemodified) / (60*60)); echo '
'.get_string('markingturnaround', 'block_marking').' '.$markturnaround.' hours.
'; } else { echo '
'; print_string('notmarkedyet', 'block_marking'); echo ''; } echo ''; if ($allowedtograde) echo ' '; echo '
'; if ($allowedtograde) { echo '
"; } else { p($submission->comment); } echo "

\n"; } /// Used by uasort to reorder the unmarked first by creation date in ascending order. function mb_sort_unmarked_first($a, $b) { if ($a->overdue == $b->overdue) { return 0; } else { return ($a->timecreated < $b->timecreated) ? -1: 1; } } ?>