MDL-36804 Assignment - Make sure webservice only returns the last submission/grade.

This commit is contained in:
Damyon Wiese 2013-03-22 23:32:53 +08:00 committed by Damyon Wiese
parent df211804f1
commit a13fbf5fe8
2 changed files with 48 additions and 4 deletions

View file

@ -95,13 +95,23 @@ class mod_assign_external extends external_api {
if (count ($requestedassignmentids) > 0) {
$placeholders = array();
list($inorequalsql, $placeholders) = $DB->get_in_or_equal($requestedassignmentids, SQL_PARAMS_NAMED);
list($inorequalsql2, $placeholders2) = $DB->get_in_or_equal($requestedassignmentids, SQL_PARAMS_NAMED);
$grademaxattempt = 'SELECT mxg.userid, MAX(mxg.attemptnumber) AS maxattempt
FROM {assign_grades} mxg
WHERE mxg.assignment ' . $inorequalsql2 . ' GROUP BY mxg.userid';
$sql = "SELECT ag.id,ag.assignment,ag.userid,ag.timecreated,ag.timemodified,".
"ag.grader,ag.grade ".
"FROM {assign_grades} ag ".
"WHERE ag.assignment ".$inorequalsql.
"JOIN ( " . $grademaxattempt . " ) gmx ON ag.userid = gmx.userid".
" WHERE ag.assignment ".$inorequalsql.
" AND ag.timemodified >= :since".
" AND ag.attemptnumber = gmx.maxattempt" .
" ORDER BY ag.assignment, ag.id";
$placeholders['since'] = $params['since'];
// Combine the parameters.
$placeholders += $placeholders2;
$rs = $DB->get_recordset_sql($sql, $placeholders);
$currentassignmentid = null;
$assignment = null;
@ -500,11 +510,18 @@ class mod_assign_external extends external_api {
foreach ($assigns as $assign) {
$submissions = array();
$submissionplugins = $assign->get_submission_plugins();
$placeholders = array('assignment' => $assign->get_instance()->id);
$placeholders = array('assignid1' => $assign->get_instance()->id,
'assignid2' => $assign->get_instance()->id);
$submissionmaxattempt = 'SELECT mxs.userid, MAX(mxs.attemptnumber) AS maxattempt
FROM {assign_submission} mxs
WHERE mxs.assignment = :assignid1 GROUP BY mxs.userid';
$sql = "SELECT mas.id, mas.assignment,mas.userid,".
"mas.timecreated,mas.timemodified,mas.status,mas.groupid ".
"FROM {assign_submission} mas ".
"WHERE mas.assignment = :assignment";
"JOIN ( " . $submissionmaxattempt . " ) smx ON mas.userid = smx.userid ".
"WHERE mas.assignment = :assignid2 AND mas.attemptnumber = smx.maxattempt";
if (!empty($params['status'])) {
$placeholders['status'] = $params['status'];