diff --git a/mod/assign/gradingtable.php b/mod/assign/gradingtable.php index 5a229c3afc9..f85050f1f37 100644 --- a/mod/assign/gradingtable.php +++ b/mod/assign/gradingtable.php @@ -150,15 +150,32 @@ class assign_grading_table extends table_sql implements renderable { $fields .= 'uf.allocatedmarker as allocatedmarker '; $from = '{user} u - LEFT JOIN {assign_submission} s ON - u.id = s.userid AND - s.assignment = :assignmentid1 AND - s.latest = 1 - LEFT JOIN {assign_grades} g ON - u.id = g.userid AND - g.assignment = :assignmentid2 AND - g.attemptnumber = s.attemptnumber - LEFT JOIN {assign_user_flags} uf ON u.id = uf.userid AND uf.assignment = :assignmentid3'; + LEFT JOIN {assign_submission} s + ON u.id = s.userid + AND s.assignment = :assignmentid1 + AND s.latest = 1 + LEFT JOIN {assign_grades} g + ON u.id = g.userid + AND g.assignment = :assignmentid2 '; + + // For group submissions we don't immediately create an entry in the assign_submission table for each user, + // instead the userid is set to 0. In this case we use a different query to retrieve the grade for the user. + if ($this->assignment->get_instance()->teamsubmission) { + $params['assignmentid4'] = (int) $this->assignment->get_instance()->id; + $grademaxattempt = 'SELECT mxg.userid, MAX(mxg.attemptnumber) AS maxattempt + FROM {assign_grades} mxg + WHERE mxg.assignment = :assignmentid4 + GROUP BY mxg.userid'; + $from .= 'LEFT JOIN (' . $grademaxattempt . ') gmx + ON u.id = gmx.userid + AND g.attemptnumber = gmx.maxattempt '; + } else { + $from .= 'AND g.attemptnumber = s.attemptnumber '; + } + + $from .= 'LEFT JOIN {assign_user_flags} uf + ON u.id = uf.userid + AND uf.assignment = :assignmentid3'; $userparams = array(); $userindex = 0; diff --git a/mod/assign/tests/behat/display_grade.feature b/mod/assign/tests/behat/display_grade.feature new file mode 100644 index 00000000000..ffb92d99344 --- /dev/null +++ b/mod/assign/tests/behat/display_grade.feature @@ -0,0 +1,69 @@ +@mod @mod_assign +Feature: Check that the assignment grade can be updated correctly + In order to ensure that the grade is shown correctly in the grading table + As a teacher + I need to grade a student and ensure the grade is shown correctly + + @javascript + Scenario: Update the grade for an assignment + Given the following "courses" exist: + | fullname | shortname | category | groupmode | + | Course 1 | C1 | 0 | 1 | + And the following "users" exist: + | username | firstname | lastname | email | + | teacher1 | Teacher | 1 | teacher1@asd.com | + | student1 | Student | 1 | student10@asd.com | + And the following "course enrolments" exist: + | user | course | role | + | teacher1 | C1 | editingteacher | + | student1 | C1 | student | + And the following "groups" exist: + | name | course | idnumber | + | Group 1 | C1 | G1 | + And I log in as "teacher1" + And I follow "Course 1" + And I turn editing mode on + And I add a "Assignment" to section "1" and I fill the form with: + | Assignment name | Test assignment name | + | Description | Test assignment description | + | Use marking workflow | Yes | + When I follow "Test assignment name" + Then I follow "View/grade all submissions" + And I click on "Grade Student 1" "link" in the "Student 1" "table_row" + And I set the field "Grade out of 100" to "50" + And I press "Save changes" + And I press "Continue" + And "Student 1" row "Grade" column of "generaltable" table should contain "50.00" + + @javascript + Scenario: Update the grade for a team assignment + Given the following "courses" exist: + | fullname | shortname | category | groupmode | + | Course 1 | C1 | 0 | 1 | + And the following "users" exist: + | username | firstname | lastname | email | + | teacher1 | Teacher | 1 | teacher1@asd.com | + | student1 | Student | 1 | student10@asd.com | + And the following "course enrolments" exist: + | user | course | role | + | teacher1 | C1 | editingteacher | + | student1 | C1 | student | + And the following "groups" exist: + | name | course | idnumber | + | Group 1 | C1 | G1 | + And I log in as "teacher1" + And I follow "Course 1" + And I turn editing mode on + And I add a "Assignment" to section "1" and I fill the form with: + | Assignment name | Test assignment name | + | Description | Test assignment description | + | Use marking workflow | Yes | + | Students submit in groups | Yes | + | Group mode | No groups | + When I follow "Test assignment name" + Then I follow "View/grade all submissions" + And I click on "Grade Student 1" "link" in the "Student 1" "table_row" + And I set the field "Grade out of 100" to "50" + And I press "Save changes" + And I press "Continue" + And "Student 1" row "Grade" column of "generaltable" table should contain "50.00"