mirror of
https://github.com/moodle/moodle.git
synced 2025-08-05 00:46:50 +02:00
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:
parent
c4a12afaf9
commit
8caba22968
3 changed files with 101 additions and 38 deletions
|
@ -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
|
||||
*/
|
||||
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
|
||||
* implementation simply call this function.
|
||||
* @param $groupid int optional If nonzero then count is restricted to this group
|
||||
* @deprecated Since Moodle 2.2 MDL-abc - Please do not use this function any more.
|
||||
* @param cm_info $cm The course module that we wish to perform the count on.
|
||||
* @param int $groupid (optional) If nonzero then count is restricted to this group
|
||||
* @return int The number of submissions
|
||||
*/
|
||||
function assignment_count_real_submissions($cm, $groupid=0) {
|
||||
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
|
||||
if ($users = get_enrolled_users($context, 'mod/assignment:view', $groupid, 'u.id')) {
|
||||
$users = array_keys($users);
|
||||
}
|
||||
|
||||
// if groupmembersonly used, remove users who are not in any group
|
||||
if ($users and !empty($CFG->enablegroupmembersonly) and $cm->groupmembersonly) {
|
||||
if ($groupingusers = groups_get_grouping_members($cm->groupingid, 'u.id', 'u.id')) {
|
||||
$users = array_intersect($users, array_keys($groupingusers));
|
||||
// Create the expected class file path and class name for the returned assignemnt type
|
||||
$filename = "{$CFG->dirroot}/mod/assignment/type/{$assignmenttype}/assignment.class.php";
|
||||
$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 (!class_exists($class)) {
|
||||
$classname = 'assignment_base';
|
||||
}
|
||||
$instance = new $classname;
|
||||
|
||||
if (empty($users)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
$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));
|
||||
// Attach the course module to the assignment type instance and then call the method for counting submissions
|
||||
$instance->cm = $cm;
|
||||
return $instance->count_real_submissions($groupid);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return all assignment submissions by ENROLLED students (even empty)
|
||||
*
|
||||
|
|
|
@ -396,6 +396,34 @@ class assignment_upload extends assignment_base {
|
|||
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) {
|
||||
global $CFG, $USER, $OUTPUT, $PAGE;
|
||||
|
||||
|
@ -422,7 +450,6 @@ class assignment_upload extends assignment_base {
|
|||
echo $output;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Upload files
|
||||
* upload_file function requires moodle form instance and file manager options
|
||||
|
|
|
@ -92,7 +92,6 @@ class assignment_uploadsingle extends assignment_base {
|
|||
$this->view_footer();
|
||||
}
|
||||
|
||||
|
||||
function process_feedback() {
|
||||
if (!$feedback = data_submitted() or !confirm_sesskey()) { // No incoming data?
|
||||
return false;
|
||||
|
@ -103,6 +102,34 @@ class assignment_uploadsingle extends assignment_base {
|
|||
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) {
|
||||
global $CFG, $USER, $OUTPUT, $PAGE;
|
||||
|
||||
|
@ -155,7 +182,6 @@ class assignment_uploadsingle extends assignment_base {
|
|||
echo $OUTPUT->box_end();
|
||||
}
|
||||
|
||||
|
||||
function upload($mform) {
|
||||
$action = required_param('action', PARAM_ALPHA);
|
||||
switch ($action) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue