mirror of
https://github.com/moodle/moodle.git
synced 2025-03-22 00:20:37 +01:00
Merge branch 'MDL-38128_master' of https://github.com/dmonllao/moodle
This commit is contained in:
commit
dda9997250
@ -139,6 +139,9 @@ class assign {
|
||||
/** @var array cached list of participants for this assignment. The cache key will be group, showactive and the context id */
|
||||
private $participants = array();
|
||||
|
||||
/** @var array cached list of user groups when team submissions are enabled. The cache key will be the user. */
|
||||
private $usersubmissiongroups = array();
|
||||
|
||||
/**
|
||||
* Constructor for the base assign class.
|
||||
*
|
||||
@ -1380,6 +1383,11 @@ class assign {
|
||||
* @return array List of user records
|
||||
*/
|
||||
public function list_participants($currentgroup, $idsonly) {
|
||||
|
||||
if (empty($currentgroup)) {
|
||||
$currentgroup = 0;
|
||||
}
|
||||
|
||||
$key = $this->context->id . '-' . $currentgroup . '-' . $this->show_only_active_users();
|
||||
if (!isset($this->participants[$key])) {
|
||||
$users = get_enrolled_users($this->context, 'mod/assign:submit', $currentgroup, 'u.*', null, null, null,
|
||||
@ -1406,21 +1414,51 @@ class assign {
|
||||
/**
|
||||
* Load a count of valid teams for this assignment.
|
||||
*
|
||||
* @param int $activitygroup Activity active group
|
||||
* @return int number of valid teams
|
||||
*/
|
||||
public function count_teams() {
|
||||
public function count_teams($activitygroup = 0) {
|
||||
|
||||
$groups = groups_get_all_groups($this->get_course()->id,
|
||||
0,
|
||||
$this->get_instance()->teamsubmissiongroupingid,
|
||||
'g.id');
|
||||
$count = count($groups);
|
||||
$count = 0;
|
||||
|
||||
// See if there are any users in the default group.
|
||||
$defaultusers = $this->get_submission_group_members(0, true);
|
||||
if (count($defaultusers) > 0) {
|
||||
$count += 1;
|
||||
$participants = $this->list_participants($activitygroup, true);
|
||||
|
||||
// If a team submission grouping id is provided all good as all returned groups
|
||||
// are the submission teams, but if no team submission grouping was specified
|
||||
// $groups will contain all participants groups.
|
||||
if ($this->get_instance()->teamsubmissiongroupingid) {
|
||||
|
||||
// We restrict the users to the selected group ones.
|
||||
$groups = groups_get_all_groups($this->get_course()->id,
|
||||
array_keys($participants),
|
||||
$this->get_instance()->teamsubmissiongroupingid,
|
||||
'DISTINCT g.id, g.name');
|
||||
|
||||
$count = count($groups);
|
||||
|
||||
// When a specific group is selected we don't count the default group users.
|
||||
if ($activitygroup == 0) {
|
||||
|
||||
// See if there are any users in the default group.
|
||||
$defaultusers = $this->get_submission_group_members(0, true);
|
||||
if (count($defaultusers) > 0) {
|
||||
$count += 1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// It is faster to loop around participants if no grouping was specified.
|
||||
$groups = array();
|
||||
foreach ($participants as $participant) {
|
||||
if ($group = $this->get_submission_group($participant->id)) {
|
||||
$groups[$group->id] = true;
|
||||
} else {
|
||||
$groups[0] = true;
|
||||
}
|
||||
}
|
||||
|
||||
$count = count($groups);
|
||||
}
|
||||
|
||||
return $count;
|
||||
}
|
||||
|
||||
@ -1568,13 +1606,27 @@ class assign {
|
||||
$params['submissionstatus'] = $status;
|
||||
|
||||
if ($this->get_instance()->teamsubmission) {
|
||||
|
||||
$groupsstr = '';
|
||||
if ($currentgroup != 0) {
|
||||
// If there is an active group we should only display the current group users groups.
|
||||
$participants = $this->list_participants($currentgroup, true);
|
||||
$groups = groups_get_all_groups($this->get_course()->id,
|
||||
array_keys($participants),
|
||||
$this->get_instance()->teamsubmissiongroupingid,
|
||||
'DISTINCT g.id, g.name');
|
||||
list($groupssql, $groupsparams) = $DB->get_in_or_equal(array_keys($groups), SQL_PARAMS_NAMED);
|
||||
$groupsstr = 's.groupid ' . $groupssql . ' AND';
|
||||
$params = $params + $groupsparams;
|
||||
}
|
||||
$sql = 'SELECT COUNT(s.groupid)
|
||||
FROM {assign_submission} s
|
||||
WHERE
|
||||
s.latest = 1 AND
|
||||
s.assignment = :assignid AND
|
||||
s.timemodified IS NOT NULL AND
|
||||
s.userid = :groupuserid AND
|
||||
s.userid = :groupuserid AND '
|
||||
. $groupsstr . '
|
||||
s.status = :submissionstatus';
|
||||
$params['groupuserid'] = 0;
|
||||
} else {
|
||||
@ -2006,6 +2058,7 @@ class assign {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $members;
|
||||
}
|
||||
|
||||
@ -2228,12 +2281,23 @@ class assign {
|
||||
* @return mixed The group or false
|
||||
*/
|
||||
public function get_submission_group($userid) {
|
||||
|
||||
if (isset($this->usersubmissiongroups[$userid])) {
|
||||
return $this->usersubmissiongroups[$userid];
|
||||
}
|
||||
|
||||
$grouping = $this->get_instance()->teamsubmissiongroupingid;
|
||||
$groups = groups_get_all_groups($this->get_course()->id, $userid, $grouping);
|
||||
if (count($groups) != 1) {
|
||||
return false;
|
||||
$return = false;
|
||||
} else {
|
||||
$return = array_pop($groups);
|
||||
}
|
||||
return array_pop($groups);
|
||||
|
||||
// Cache the user submission group.
|
||||
$this->usersubmissiongroups[$userid] = $return;
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
|
||||
@ -4139,8 +4203,15 @@ class assign {
|
||||
if ($this->can_view_grades()) {
|
||||
$draft = ASSIGN_SUBMISSION_STATUS_DRAFT;
|
||||
$submitted = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
|
||||
|
||||
// Group selector will only be displayed if necessary.
|
||||
$currenturl = new moodle_url('/mod/assign/view.php', array('id' => $this->get_course_module()->id));
|
||||
$o .= groups_print_activity_menu($this->get_course_module(), $currenturl->out(), true);
|
||||
|
||||
$activitygroup = groups_get_activity_group($this->get_course_module());
|
||||
|
||||
if ($instance->teamsubmission) {
|
||||
$summary = new assign_grading_summary($this->count_teams(),
|
||||
$summary = new assign_grading_summary($this->count_teams($activitygroup),
|
||||
$instance->submissiondrafts,
|
||||
$this->count_submissions_with_status($draft),
|
||||
$this->is_any_submission_plugin_enabled(),
|
||||
@ -4152,7 +4223,9 @@ class assign {
|
||||
$instance->teamsubmission);
|
||||
$o .= $this->get_renderer()->render($summary);
|
||||
} else {
|
||||
$summary = new assign_grading_summary($this->count_participants(0),
|
||||
// The active group has already been updated in groups_print_activity_menu().
|
||||
$countparticipants = $this->count_participants($activitygroup);
|
||||
$summary = new assign_grading_summary($countparticipants,
|
||||
$instance->submissiondrafts,
|
||||
$this->count_submissions_with_status($draft),
|
||||
$this->is_any_submission_plugin_enabled(),
|
||||
|
@ -633,13 +633,23 @@ class mod_assign_locallib_testcase extends mod_assign_base_testcase {
|
||||
public function test_count_teams() {
|
||||
$this->create_extra_users();
|
||||
$this->setUser($this->editingteachers[0]);
|
||||
$assign = $this->create_instance(array('teamsubmission'=>1));
|
||||
$assign1 = $this->create_instance(array('teamsubmission' => 1));
|
||||
$this->assertEquals(self::GROUP_COUNT + 1, $assign1->count_teams());
|
||||
|
||||
$this->assertEquals(self::GROUP_COUNT + 1, $assign->count_teams());
|
||||
$grouping = $this->getDataGenerator()->create_grouping(array('courseid' => $this->course->id));
|
||||
$this->getDataGenerator()->create_grouping_group(array('groupid' => $this->groups[0]->id, 'groupingid' => $grouping->id));
|
||||
$this->getDataGenerator()->create_grouping_group(array('groupid' => $this->groups[1]->id, 'groupingid' => $grouping->id));
|
||||
|
||||
// No active group => 2 groups + the default one.
|
||||
$assign2 = $this->create_instance(array('teamsubmission' => 1, 'teamsubmissiongroupingid' => $grouping->id));
|
||||
$this->assertEquals(3, $assign2->count_teams());
|
||||
|
||||
// An active group => Just the selected one.
|
||||
$this->assertEquals(1, $assign2->count_teams($this->groups[0]->id));
|
||||
}
|
||||
|
||||
public function test_submit_to_default_group() {
|
||||
global $DB;
|
||||
global $DB, $SESSION;
|
||||
|
||||
$this->preventResetByRollback();
|
||||
$sink = $this->redirectMessages();
|
||||
@ -647,7 +657,8 @@ class mod_assign_locallib_testcase extends mod_assign_base_testcase {
|
||||
$this->setUser($this->editingteachers[0]);
|
||||
$params = array('teamsubmission' => 1,
|
||||
'assignsubmission_onlinetext_enabled' => 1,
|
||||
'submissiondrafts'=>0);
|
||||
'submissiondrafts' => 0,
|
||||
'groupmode' => VISIBLEGROUPS);
|
||||
$assign = $this->create_instance($params);
|
||||
|
||||
$newstudent = $this->getDataGenerator()->create_user();
|
||||
@ -667,98 +678,147 @@ class mod_assign_locallib_testcase extends mod_assign_base_testcase {
|
||||
$assign->save_submission($data, $notices);
|
||||
$this->assertEmpty($notices, 'No errors on save submission');
|
||||
|
||||
// Set active groups to all groups.
|
||||
$this->setUser($this->teachers[0]);
|
||||
$SESSION->activegroup[$this->course->id]['aag'][0] = 0;
|
||||
$this->assertEquals(1, $assign->count_submissions_with_status(ASSIGN_SUBMISSION_STATUS_SUBMITTED));
|
||||
|
||||
// Set an active group.
|
||||
$anothergroup = $this->groups[0];
|
||||
$SESSION->activegroup[$this->course->id]['aag'][0] = (int)$anothergroup->id;
|
||||
$this->assertEquals(0, $assign->count_submissions_with_status(ASSIGN_SUBMISSION_STATUS_SUBMITTED));
|
||||
|
||||
$sink->close();
|
||||
}
|
||||
|
||||
public function test_count_submissions() {
|
||||
global $SESSION;
|
||||
|
||||
$this->create_extra_users();
|
||||
$this->setUser($this->editingteachers[0]);
|
||||
$assign = $this->create_instance(array('assignsubmission_onlinetext_enabled'=>1));
|
||||
$assign1 = $this->create_instance(array('assignsubmission_onlinetext_enabled' => 1));
|
||||
|
||||
// Simulate a submission.
|
||||
$this->setUser($this->extrastudents[0]);
|
||||
$submission = $assign->get_user_submission($this->extrastudents[0]->id, true);
|
||||
$submission = $assign1->get_user_submission($this->extrastudents[0]->id, true);
|
||||
$submission->status = ASSIGN_SUBMISSION_STATUS_DRAFT;
|
||||
$assign->testable_update_submission($submission, $this->extrastudents[0]->id, true, false);
|
||||
$assign1->testable_update_submission($submission, $this->extrastudents[0]->id, true, false);
|
||||
// Leave this one as DRAFT.
|
||||
$data = new stdClass();
|
||||
$data->onlinetext_editor = array('itemid'=>file_get_unused_draft_itemid(),
|
||||
'text'=>'Submission text',
|
||||
'format'=>FORMAT_MOODLE);
|
||||
$plugin = $assign->get_submission_plugin_by_type('onlinetext');
|
||||
$plugin = $assign1->get_submission_plugin_by_type('onlinetext');
|
||||
$plugin->save($submission, $data);
|
||||
|
||||
// Simulate adding a grade.
|
||||
$this->setUser($this->teachers[0]);
|
||||
$data = new stdClass();
|
||||
$data->grade = '50.0';
|
||||
$assign->testable_apply_grade_to_user($data, $this->extrastudents[0]->id, 0);
|
||||
$assign1->testable_apply_grade_to_user($data, $this->extrastudents[0]->id, 0);
|
||||
|
||||
// Simulate a submission.
|
||||
$this->setUser($this->extrastudents[1]);
|
||||
$submission = $assign->get_user_submission($this->extrastudents[1]->id, true);
|
||||
$submission = $assign1->get_user_submission($this->extrastudents[1]->id, true);
|
||||
$submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
|
||||
$assign->testable_update_submission($submission, $this->extrastudents[1]->id, true, false);
|
||||
$assign1->testable_update_submission($submission, $this->extrastudents[1]->id, true, false);
|
||||
$data = new stdClass();
|
||||
$data->onlinetext_editor = array('itemid'=>file_get_unused_draft_itemid(),
|
||||
'text'=>'Submission text',
|
||||
'format'=>FORMAT_MOODLE);
|
||||
$plugin = $assign->get_submission_plugin_by_type('onlinetext');
|
||||
$plugin = $assign1->get_submission_plugin_by_type('onlinetext');
|
||||
$plugin->save($submission, $data);
|
||||
|
||||
// Simulate a submission.
|
||||
$this->setUser($this->extrastudents[2]);
|
||||
$submission = $assign->get_user_submission($this->extrastudents[2]->id, true);
|
||||
$submission = $assign1->get_user_submission($this->extrastudents[2]->id, true);
|
||||
$submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
|
||||
$assign->testable_update_submission($submission, $this->extrastudents[2]->id, true, false);
|
||||
$assign1->testable_update_submission($submission, $this->extrastudents[2]->id, true, false);
|
||||
$data = new stdClass();
|
||||
$data->onlinetext_editor = array('itemid'=>file_get_unused_draft_itemid(),
|
||||
'text'=>'Submission text',
|
||||
'format'=>FORMAT_MOODLE);
|
||||
$plugin = $assign->get_submission_plugin_by_type('onlinetext');
|
||||
$plugin = $assign1->get_submission_plugin_by_type('onlinetext');
|
||||
$plugin->save($submission, $data);
|
||||
|
||||
// Simulate a submission.
|
||||
$this->setUser($this->extrastudents[3]);
|
||||
$submission = $assign->get_user_submission($this->extrastudents[3]->id, true);
|
||||
$submission = $assign1->get_user_submission($this->extrastudents[3]->id, true);
|
||||
$submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
|
||||
$assign->testable_update_submission($submission, $this->extrastudents[3]->id, true, false);
|
||||
$assign1->testable_update_submission($submission, $this->extrastudents[3]->id, true, false);
|
||||
$data = new stdClass();
|
||||
$data->onlinetext_editor = array('itemid'=>file_get_unused_draft_itemid(),
|
||||
'text'=>'Submission text',
|
||||
'format'=>FORMAT_MOODLE);
|
||||
$plugin = $assign->get_submission_plugin_by_type('onlinetext');
|
||||
$plugin = $assign1->get_submission_plugin_by_type('onlinetext');
|
||||
$plugin->save($submission, $data);
|
||||
|
||||
// Simulate a submission for suspended user, this will never be counted.
|
||||
$this->setUser($this->extrastudents[3]);
|
||||
$submission = $assign->get_user_submission($this->extrasuspendedstudents[0]->id, true);
|
||||
$submission = $assign1->get_user_submission($this->extrasuspendedstudents[0]->id, true);
|
||||
$submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
|
||||
$assign->testable_update_submission($submission, $this->extrasuspendedstudents[0]->id, true, false);
|
||||
$assign1->testable_update_submission($submission, $this->extrasuspendedstudents[0]->id, true, false);
|
||||
$data = new stdClass();
|
||||
$data->onlinetext_editor = array('itemid'=>file_get_unused_draft_itemid(),
|
||||
'text'=>'Submission text',
|
||||
'format'=>FORMAT_MOODLE);
|
||||
$plugin = $assign->get_submission_plugin_by_type('onlinetext');
|
||||
$plugin = $assign1->get_submission_plugin_by_type('onlinetext');
|
||||
$plugin->save($submission, $data);
|
||||
|
||||
// Simulate adding a grade.
|
||||
$this->setUser($this->teachers[0]);
|
||||
$data = new stdClass();
|
||||
$data->grade = '50.0';
|
||||
$assign->testable_apply_grade_to_user($data, $this->extrastudents[3]->id, 0);
|
||||
$assign->testable_apply_grade_to_user($data, $this->extrasuspendedstudents[0]->id, 0);
|
||||
$assign1->testable_apply_grade_to_user($data, $this->extrastudents[3]->id, 0);
|
||||
$assign1->testable_apply_grade_to_user($data, $this->extrasuspendedstudents[0]->id, 0);
|
||||
|
||||
// Create a new submission with status NEW.
|
||||
$this->setUser($this->extrastudents[4]);
|
||||
$submission = $assign->get_user_submission($this->extrastudents[4]->id, true);
|
||||
$submission = $assign1->get_user_submission($this->extrastudents[4]->id, true);
|
||||
|
||||
$this->assertEquals(2, $assign->count_grades());
|
||||
$this->assertEquals(4, $assign->count_submissions());
|
||||
$this->assertEquals(5, $assign->count_submissions(true));
|
||||
$this->assertEquals(2, $assign->count_submissions_need_grading());
|
||||
$this->assertEquals(3, $assign->count_submissions_with_status(ASSIGN_SUBMISSION_STATUS_SUBMITTED));
|
||||
$this->assertEquals(1, $assign->count_submissions_with_status(ASSIGN_SUBMISSION_STATUS_DRAFT));
|
||||
$this->assertEquals(2, $assign1->count_grades());
|
||||
$this->assertEquals(4, $assign1->count_submissions());
|
||||
$this->assertEquals(5, $assign1->count_submissions(true));
|
||||
$this->assertEquals(2, $assign1->count_submissions_need_grading());
|
||||
$this->assertEquals(3, $assign1->count_submissions_with_status(ASSIGN_SUBMISSION_STATUS_SUBMITTED));
|
||||
$this->assertEquals(1, $assign1->count_submissions_with_status(ASSIGN_SUBMISSION_STATUS_DRAFT));
|
||||
|
||||
// Groups.
|
||||
$assign2 = $this->create_instance(array(
|
||||
'assignsubmission_onlinetext_enabled' => 1,
|
||||
'groupmode' => VISIBLEGROUPS
|
||||
));
|
||||
|
||||
$this->setUser($this->extrastudents[1]);
|
||||
$submission = $assign2->get_user_submission($this->extrastudents[1]->id, true);
|
||||
$submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
|
||||
$assign2->testable_update_submission($submission, $this->extrastudents[1]->id, true, false);
|
||||
$data = new stdClass();
|
||||
$data->onlinetext_editor = array('itemid' => file_get_unused_draft_itemid(),
|
||||
'text' => 'Submission text',
|
||||
'format' => FORMAT_MOODLE);
|
||||
$plugin = $assign2->get_submission_plugin_by_type('onlinetext');
|
||||
$plugin->save($submission, $data);
|
||||
|
||||
$this->assertEquals(1, $assign2->count_submissions_with_status(ASSIGN_SUBMISSION_STATUS_SUBMITTED));
|
||||
|
||||
// Set active groups to all groups.
|
||||
$this->setUser($this->teachers[0]);
|
||||
$SESSION->activegroup[$this->course->id]['aag'][0] = 0;
|
||||
$this->assertEquals(1, $assign2->count_submissions_with_status(ASSIGN_SUBMISSION_STATUS_SUBMITTED));
|
||||
|
||||
// Set the user group.
|
||||
$studentgroups = groups_get_user_groups($this->course->id, $this->extrastudents[1]->id);
|
||||
$this->assertEquals(1, count($studentgroups));
|
||||
$studentgroup = array_pop($studentgroups);
|
||||
$SESSION->activegroup[$this->course->id]['aag'][0] = $studentgroup[0];
|
||||
$this->assertEquals(1, $assign2->count_submissions_with_status(ASSIGN_SUBMISSION_STATUS_SUBMITTED));
|
||||
|
||||
// Set another group.
|
||||
$anothergroup = $this->groups[0];
|
||||
$this->assertNotEquals($anothergroup->id, $studentgroup[0]);
|
||||
$SESSION->activegroup[$this->course->id]['aag'][0] = (int)$anothergroup->id;
|
||||
$this->assertEquals(0, $assign2->count_submissions_with_status(ASSIGN_SUBMISSION_STATUS_SUBMITTED));
|
||||
}
|
||||
|
||||
public function test_count_submissions_for_groups() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user