diff --git a/mod/assign/classes/output/renderer.php b/mod/assign/classes/output/renderer.php index 6fb3a41af7b..869911fdd07 100644 --- a/mod/assign/classes/output/renderer.php +++ b/mod/assign/classes/output/renderer.php @@ -1345,6 +1345,14 @@ class renderer extends \plugin_renderer_base { $info['cmname']); $due = $info['timedue'] ? userdate($info['timedue']) : '-'; + if ($info['cangrade']) { + $params['action'] = 'grading'; + $gradeinfo = \html_writer::link(new \moodle_url('/mod/assign/view.php', $params), + get_string('numberofsubmissionsneedgradinglabel', 'assign', $info['gradeinfo'])); + } else { + $gradeinfo = $info['gradeinfo']; + } + $printsection = ''; if ($indexsummary->usesections) { if ($info['sectionname'] !== $currentsection) { @@ -1359,9 +1367,9 @@ class renderer extends \plugin_renderer_base { } if ($indexsummary->usesections) { - $row = array($printsection, $link, $due, $info['submissioninfo'], $info['gradeinfo']); + $row = [$printsection, $link, $due, $info['submissioninfo'], $gradeinfo]; } else { - $row = array($link, $due, $info['submissioninfo'], $info['gradeinfo']); + $row = [$link, $due, $info['submissioninfo'], $gradeinfo]; } $table->data[] = $row; } diff --git a/mod/assign/lang/en/assign.php b/mod/assign/lang/en/assign.php index 2c3b3990e55..771c6fc0006 100644 --- a/mod/assign/lang/en/assign.php +++ b/mod/assign/lang/en/assign.php @@ -393,6 +393,7 @@ $string['numberofdraftsubmissions'] = 'Drafts'; $string['numberofparticipants'] = 'Participants'; $string['numberofsubmittedassignments'] = 'Submitted'; $string['numberofsubmissionsneedgrading'] = 'Needs grading'; +$string['numberofsubmissionsneedgradinglabel'] = 'Needs grading: {$a}'; $string['numberofteams'] = 'Groups'; $string['offline'] = 'No online submissions required'; $string['open'] = 'Open'; diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index 86c8f502978..b7e96b05929 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -3132,10 +3132,9 @@ class assign { $assignment->update_effective_access($USER->id); $timedue = $assignment->get_instance()->duedate; - if (has_capability('mod/assign:grade', $context)) { - $submitted = $assignment->count_submissions_with_status(ASSIGN_SUBMISSION_STATUS_SUBMITTED); - - } else if (has_capability('mod/assign:submit', $context)) { + if (has_capability('mod/assign:submit', $context) && + !has_capability('moodle/site:config', $context)) { + $cangrade = false; if ($assignment->get_instance()->teamsubmission) { $usersubmission = $assignment->get_group_submission($USER->id, 0, false); } else { @@ -3147,17 +3146,22 @@ class assign { } else { $submitted = get_string('submissionstatus_', 'assign'); } - } - $gradinginfo = grade_get_grades($course->id, 'mod', 'assign', $cm->instance, $USER->id); - if (isset($gradinginfo->items[0]->grades[$USER->id]) && - !$gradinginfo->items[0]->grades[$USER->id]->hidden ) { - $grade = $gradinginfo->items[0]->grades[$USER->id]->str_grade; - } else { - $grade = '-'; + + $gradinginfo = grade_get_grades($course->id, 'mod', 'assign', $cm->instance, $USER->id); + if (isset($gradinginfo->items[0]->grades[$USER->id]) && + !$gradinginfo->items[0]->grades[$USER->id]->hidden ) { + $grade = $gradinginfo->items[0]->grades[$USER->id]->str_grade; + } else { + $grade = '-'; + } + } else if (has_capability('mod/assign:grade', $context)) { + $submitted = $assignment->count_submissions_with_status(ASSIGN_SUBMISSION_STATUS_SUBMITTED); + $grade = $assignment->count_submissions_need_grading(); + $cangrade = true; } - $courseindexsummary->add_assign_info($cm->id, $cm->get_formatted_name(), $sectionname, $timedue, $submitted, $grade); - + $courseindexsummary->add_assign_info($cm->id, $cm->get_formatted_name(), + $sectionname, $timedue, $submitted, $grade, $cangrade); } $o .= $this->get_renderer()->render($courseindexsummary); diff --git a/mod/assign/renderable.php b/mod/assign/renderable.php index 836686c0fd8..c95eda0369f 100644 --- a/mod/assign/renderable.php +++ b/mod/assign/renderable.php @@ -634,14 +634,16 @@ class assign_course_index_summary implements renderable { * @param string $submissioninfo - A string with either the number of submitted assignments, or the * status of the current users submission depending on capabilities. * @param string $gradeinfo - The current users grade if they have been graded and it is not hidden. + * @param bool cangrade - Does this user have grade capability? */ - public function add_assign_info($cmid, $cmname, $sectionname, $timedue, $submissioninfo, $gradeinfo) { - $this->assignments[] = array('cmid'=>$cmid, - 'cmname'=>$cmname, - 'sectionname'=>$sectionname, - 'timedue'=>$timedue, - 'submissioninfo'=>$submissioninfo, - 'gradeinfo'=>$gradeinfo); + public function add_assign_info($cmid, $cmname, $sectionname, $timedue, $submissioninfo, $gradeinfo, $cangrade = false) { + $this->assignments[] = ['cmid' => $cmid, + 'cmname' => $cmname, + 'sectionname' => $sectionname, + 'timedue' => $timedue, + 'submissioninfo' => $submissioninfo, + 'gradeinfo' => $gradeinfo, + 'cangrade' => $cangrade]; } diff --git a/mod/assign/tests/locallib_test.php b/mod/assign/tests/locallib_test.php index 00fbb337e87..c08ab734671 100644 --- a/mod/assign/tests/locallib_test.php +++ b/mod/assign/tests/locallib_test.php @@ -4367,4 +4367,57 @@ Anchor link 2:Link text $this->assertNotEmpty($event2); $this->assertSame('This one should be re-created', $event2->description); } + + /** + * Test submissions that need grading output after one ungraded submission + */ + public function test_submissions_need_grading() { + global $PAGE; + + $this->resetAfterTest(); + $course = $this->getDataGenerator()->create_course(); + $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher'); + $student = $this->getDataGenerator()->create_and_enrol($course, 'student'); + + // Setup the assignment. + $this->setUser($teacher); + $time = time(); + $assign = $this->create_instance($course, [ + 'assignsubmission_onlinetext_enabled' => 1, + ]); + $PAGE->set_url(new moodle_url('/mod/assign/view.php', [ + 'id' => $assign->get_course_module()->id, + 'action' => 'grading', + ])); + + // Check for 0 submissions. + $summary = $assign->view('viewcourseindex'); + + $this->assertStringContainsString('/mod/assign/view.php?id=' . + $assign->get_course_module()->id . '&action=grading">' . + get_string('numberofsubmissionsneedgradinglabel', 'assign', 0) . '', $summary); + + // Simulate an assignment submission. + $this->setUser($student); + $submission = $assign->get_user_submission($student->id, true); + $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED; + $assign->testable_update_submission($submission, $student->id, true, false); + $data = new stdClass(); + $data->onlinetext_editor = [ + 'itemid' => file_get_unused_draft_itemid(), + 'text' => 'Submission text', + 'format' => FORMAT_MOODLE, + ]; + $plugin = $assign->get_submission_plugin_by_type('onlinetext'); + $plugin->save($submission, $data); + + // Check for 1 ungraded submission. + $this->setUser($teacher); + + $summary = $assign->view('viewcourseindex'); + + $this->assertStringContainsString('/mod/assign/view.php?id=' . + $assign->get_course_module()->id . '&action=grading">' . + get_string('numberofsubmissionsneedgradinglabel', 'assign', 1) . '', $summary); + } }