MDL-30724 Limit assignment_count_real_submissions() to only select real

submissions

I've also refactored some code so that it is more structured and allows
for easier overriding of function associated with counting submissions
and updated associated doc blocks.
This commit is contained in:
Gerard (Gerry) Caulfield 2011-12-14 09:05:52 +08:00
parent c4a12afaf9
commit 8caba22968
3 changed files with 101 additions and 38 deletions

View file

@ -1882,13 +1882,29 @@ class assignment_base {
} }
/** /**
* Counts all real assignment submissions by ENROLLED students (not empty ones) * Counts all complete (real) assignment submissions by enrolled students
* *
* @param int $groupid optional If nonzero then count is restricted to this group * @param int $groupid (optional) If nonzero then count is restricted to this group
* @return int The number of submissions * @return int The number of submissions
*/ */
function count_real_submissions($groupid=0) { function count_real_submissions($groupid=0) {
return assignment_count_real_submissions($this->cm, $groupid); global $CFG;
global $DB;
// Grab the context assocated with our course module
$context = get_context_instance(CONTEXT_MODULE, $this->cm->id);
// Get ids of users enrolled in the given course.
list($enroledsql, $params) = get_enrolled_sql($context, 'mod/assignment:view', $groupid);
$params['assignmentid'] = $this->cm->instance;
// Get ids of users enrolled in the given course.
return $DB->count_records_sql("SELECT COUNT('x')
FROM {assignment_submissions} s
LEFT JOIN {assignment} a ON a.id = s.assignment
INNER JOIN ($enroledsql) u ON u.id = s.userid
WHERE s.assignment = :assignmentid AND
s.timemodified > 0", $params);
} }
/** /**
@ -3472,44 +3488,38 @@ function assignment_get_unmailed_submissions($starttime, $endtime) {
} }
/** /**
* Counts all real assignment submissions by ENROLLED students (not empty ones) * Counts all complete (real) assignment submissions by enrolled students for the given course modeule.
* *
* There are also assignment type methods count_real_submissions() which in the default * @deprecated Since Moodle 2.2 MDL-abc - Please do not use this function any more.
* implementation simply call this function. * @param cm_info $cm The course module that we wish to perform the count on.
* @param $groupid int optional If nonzero then count is restricted to this group * @param int $groupid (optional) If nonzero then count is restricted to this group
* @return int The number of submissions * @return int The number of submissions
*/ */
function assignment_count_real_submissions($cm, $groupid=0) { function assignment_count_real_submissions($cm, $groupid=0) {
global $CFG, $DB; global $CFG, $DB;
$context = get_context_instance(CONTEXT_MODULE, $cm->id); // Grab the assignment type for the given course module
$assignmenttype = $DB->get_field($cm->modname, 'assignmenttype', array('id' => $cm->instance));
// this is all the users with this capability set, in this context or higher // Create the expected class file path and class name for the returned assignemnt type
if ($users = get_enrolled_users($context, 'mod/assignment:view', $groupid, 'u.id')) { $filename = "{$CFG->dirroot}/mod/assignment/type/{$assignmenttype}/assignment.class.php";
$users = array_keys($users); $classname = "assignment_{$assignmenttype}";
// If the file exists and the class is not already loaded we require the class file
if (file_exists($file) && !class_exists($class)) {
require_once($file);
} }
// If the required class is still not loaded then we revert to assignment base
// if groupmembersonly used, remove users who are not in any group if (!class_exists($class)) {
if ($users and !empty($CFG->enablegroupmembersonly) and $cm->groupmembersonly) { $classname = 'assignment_base';
if ($groupingusers = groups_get_grouping_members($cm->groupingid, 'u.id', 'u.id')) {
$users = array_intersect($users, array_keys($groupingusers));
}
} }
$instance = new $classname;
if (empty($users)) { // Attach the course module to the assignment type instance and then call the method for counting submissions
return 0; $instance->cm = $cm;
} return $instance->count_real_submissions($groupid);
$userlists = implode(',', $users);
return $DB->count_records_sql("SELECT COUNT('x')
FROM {assignment_submissions}
WHERE assignment = ? AND
timemodified > 0 AND
userid IN ($userlists)", array($cm->instance));
} }
/** /**
* Return all assignment submissions by ENROLLED students (even empty) * Return all assignment submissions by ENROLLED students (even empty)
* *

View file

@ -396,6 +396,34 @@ class assignment_upload extends assignment_base {
parent::process_feedback($mform); parent::process_feedback($mform);
} }
/**
* Counts all complete (real) assignment submissions by enrolled students. This overrides assignment_base::count_real_submissions().
* This is necessary for advanced file uploads where we need to check that the data2 field is equal to "submitted" to determine
* if a submission is complete.
*
* @param int $groupid (optional) If nonzero then count is restricted to this group
* @return int The number of submissions
*/
function count_real_submissions($groupid=0) {
global $CFG;
global $DB;
// Grab the context assocated with our course module
$context = get_context_instance(CONTEXT_MODULE, $this->cm->id);
// Get ids of users enrolled in the given course.
list($enroledsql, $params) = get_enrolled_sql($context, 'mod/assignment:view', $groupid);
$params['assignmentid'] = $this->cm->instance;
// Get ids of users enrolled in the given course.
return $DB->count_records_sql("SELECT COUNT('x')
FROM {assignment_submissions} s
LEFT JOIN {assignment} a ON a.id = s.assignment
INNER JOIN ($enroledsql) u ON u.id = s.userid
WHERE s.assignment = :assignmentid AND
s.data2 = 'submitted'", $params);
}
function print_responsefiles($userid, $return=false) { function print_responsefiles($userid, $return=false) {
global $CFG, $USER, $OUTPUT, $PAGE; global $CFG, $USER, $OUTPUT, $PAGE;
@ -422,7 +450,6 @@ class assignment_upload extends assignment_base {
echo $output; echo $output;
} }
/** /**
* Upload files * Upload files
* upload_file function requires moodle form instance and file manager options * upload_file function requires moodle form instance and file manager options

View file

@ -92,7 +92,6 @@ class assignment_uploadsingle extends assignment_base {
$this->view_footer(); $this->view_footer();
} }
function process_feedback() { function process_feedback() {
if (!$feedback = data_submitted() or !confirm_sesskey()) { // No incoming data? if (!$feedback = data_submitted() or !confirm_sesskey()) { // No incoming data?
return false; return false;
@ -101,7 +100,35 @@ class assignment_uploadsingle extends assignment_base {
$offset = required_param('offset', PARAM_INT); $offset = required_param('offset', PARAM_INT);
$mform = $this->display_submission($offset, $userid, false); $mform = $this->display_submission($offset, $userid, false);
parent::process_feedback($mform); parent::process_feedback($mform);
} }
/**
* Counts all complete (real) assignment submissions by enrolled students. This overrides assignment_base::count_real_submissions().
* This is necessary for simple file uploads where we need to check that the numfiles field is greater than zero to determine if a
* submission is complete.
*
* @param int $groupid (optional) If nonzero then count is restricted to this group
* @return int The number of submissions
*/
function count_real_submissions($groupid=0) {
global $CFG;
global $DB;
// Grab the context assocated with our course module
$context = get_context_instance(CONTEXT_MODULE, $this->cm->id);
// Get ids of users enrolled in the given course.
list($enroledsql, $params) = get_enrolled_sql($context, 'mod/assignment:view', $groupid);
$params['assignmentid'] = $this->cm->instance;
// Get ids of users enrolled in the given course.
return $DB->count_records_sql("SELECT COUNT('x')
FROM {assignment_submissions} s
LEFT JOIN {assignment} a ON a.id = s.assignment
INNER JOIN ($enroledsql) u ON u.id = s.userid
WHERE s.assignment = :assignmentid AND
s.numfiles > 0", $params);
}
function print_responsefiles($userid, $return=false) { function print_responsefiles($userid, $return=false) {
global $CFG, $USER, $OUTPUT, $PAGE; global $CFG, $USER, $OUTPUT, $PAGE;
@ -155,7 +182,6 @@ class assignment_uploadsingle extends assignment_base {
echo $OUTPUT->box_end(); echo $OUTPUT->box_end();
} }
function upload($mform) { function upload($mform) {
$action = required_param('action', PARAM_ALPHA); $action = required_param('action', PARAM_ALPHA);
switch ($action) { switch ($action) {