MDL-17929 groups: function to sync groups with enrolments

This commit is contained in:
Marina Glancy 2015-04-09 12:28:51 +08:00
parent bacb7b1f6e
commit 9c1561ef83
3 changed files with 67 additions and 68 deletions

View File

@ -286,43 +286,13 @@ function enrol_cohort_sync(progress_trace $trace, $courseid = NULL) {
// Finally sync groups.
$onecourse = $courseid ? "AND e.courseid = :courseid" : "";
// Remove invalid.
$sql = "SELECT gm.*, e.courseid, g.name AS groupname
FROM {groups_members} gm
JOIN {groups} g ON (g.id = gm.groupid)
JOIN {enrol} e ON (e.enrol = 'cohort' AND e.courseid = g.courseid $onecourse)
JOIN {user_enrolments} ue ON (ue.userid = gm.userid AND ue.enrolid = e.id)
WHERE gm.component='enrol_cohort' AND gm.itemid = e.id AND g.id <> e.customint2";
$params = array();
$params['courseid'] = $courseid;
$rs = $DB->get_recordset_sql($sql, $params);
foreach($rs as $gm) {
groups_remove_member($gm->groupid, $gm->userid);
$affectedusers = groups_sync_with_enrolment('cohort', $courseid);
foreach ($affectedusers['removed'] as $gm) {
$trace->output("removing user from group: $gm->userid ==> $gm->courseid - $gm->groupname", 1);
}
$rs->close();
// Add missing.
$sql = "SELECT ue.*, g.id AS groupid, e.courseid, g.name AS groupname
FROM {user_enrolments} ue
JOIN {enrol} e ON (e.id = ue.enrolid AND e.enrol = 'cohort' $onecourse)
JOIN {groups} g ON (g.courseid = e.courseid AND g.id = e.customint2)
JOIN {user} u ON (u.id = ue.userid AND u.deleted = 0)
LEFT JOIN {groups_members} gm ON (gm.groupid = g.id AND gm.userid = ue.userid)
WHERE gm.id IS NULL";
$params = array();
$params['courseid'] = $courseid;
$rs = $DB->get_recordset_sql($sql, $params);
foreach($rs as $ue) {
groups_add_member($ue->groupid, $ue->userid, 'enrol_cohort', $ue->enrolid);
foreach ($affectedusers['added'] as $ue) {
$trace->output("adding user to group: $ue->userid ==> $ue->courseid - $ue->groupname", 1);
}
$rs->close();
$trace->output('...user enrolment synchronisation finished.');

View File

@ -552,46 +552,15 @@ function enrol_meta_sync($courseid = NULL, $verbose = false) {
}
// Finally sync groups.
$onecourse = $courseid ? "AND e.courseid = :courseid" : "";
// Remove invalid.
$sql = "SELECT gm.*, e.courseid, g.name AS groupname
FROM {groups_members} gm
JOIN {groups} g ON (g.id = gm.groupid)
JOIN {enrol} e ON (e.enrol = 'meta' AND e.courseid = g.courseid $onecourse)
JOIN {user_enrolments} ue ON (ue.userid = gm.userid AND ue.enrolid = e.id)
WHERE gm.component='enrol_meta' AND gm.itemid = e.id AND g.id <> e.customint2";
$params = array();
$params['courseid'] = $courseid;
$rs = $DB->get_recordset_sql($sql, $params);
foreach ($rs as $gm) {
groups_remove_member($gm->groupid, $gm->userid);
if ($verbose) {
$affectedusers = groups_sync_with_enrolment('meta', $courseid);
if ($verbose) {
foreach ($affectedusers['removed'] as $gm) {
mtrace("removing user from group: $gm->userid ==> $gm->courseid - $gm->groupname", 1);
}
}
$rs->close();
// Add missing.
$sql = "SELECT ue.*, g.id AS groupid, e.courseid, g.name AS groupname
FROM {user_enrolments} ue
JOIN {enrol} e ON (e.id = ue.enrolid AND e.enrol = 'meta' $onecourse)
JOIN {groups} g ON (g.courseid = e.courseid AND g.id = e.customint2)
JOIN {user} u ON (u.id = ue.userid AND u.deleted = 0)
LEFT JOIN {groups_members} gm ON (gm.groupid = g.id AND gm.userid = ue.userid)
WHERE gm.id IS NULL";
$params = array();
$params['courseid'] = $courseid;
$rs = $DB->get_recordset_sql($sql, $params);
foreach ($rs as $ue) {
groups_add_member($ue->groupid, $ue->userid, 'enrol_meta', $ue->enrolid);
if ($verbose) {
foreach ($affectedusers['added'] as $ue) {
mtrace("adding user to group: $ue->userid ==> $ue->courseid - $ue->groupname", 1);
}
}
$rs->close();
if ($verbose) {
mtrace('...user enrolment synchronisation finished.');

View File

@ -1021,3 +1021,63 @@ function groups_calculate_role_people($rs, $context) {
// Return list of roles containing their users
return $roles;
}
/**
* Synchronises enrolments with the group membership
*
* Designed for enrolment methods provide automatic synchronisation between enrolled users
* and group membership, such as enrol_cohort and enrol_meta .
*
* @param string $enrolname name of enrolment method without prefix
* @param int $courseid course id where sync needs to be performed (0 for all courses)
* @param string $gidfield name of the field in 'enrol' table that stores group id
* @return array Returns the list of removed and added users. Each record contains fields:
* userid, enrolid, courseid, groupid, groupname
*/
function groups_sync_with_enrolment($enrolname, $courseid = 0, $gidfield = 'customint2') {
global $DB;
$onecourse = $courseid ? "AND e.courseid = :courseid" : "";
$params = array(
'enrolname' => $enrolname,
'component' => 'enrol_'.$enrolname,
'courseid' => $courseid
);
$affectedusers = array(
'removed' => array(),
'added' => array()
);
// Remove invalid.
$sql = "SELECT ue.userid, ue.enrolid, e.courseid, g.id AS groupid, g.name AS groupname
FROM {groups_members} gm
JOIN {groups} g ON (g.id = gm.groupid)
JOIN {enrol} e ON (e.enrol = :enrolname AND e.courseid = g.courseid $onecourse)
JOIN {user_enrolments} ue ON (ue.userid = gm.userid AND ue.enrolid = e.id)
WHERE gm.component=:component AND gm.itemid = e.id AND g.id <> e.{$gidfield}";
$rs = $DB->get_recordset_sql($sql, $params);
foreach ($rs as $gm) {
groups_remove_member($gm->groupid, $gm->userid);
$affectedusers['removed'][] = $gm;
}
$rs->close();
// Add missing.
$sql = "SELECT ue.userid, ue.enrolid, e.courseid, g.id AS groupid, g.name AS groupname
FROM {user_enrolments} ue
JOIN {enrol} e ON (e.id = ue.enrolid AND e.enrol = :enrolname $onecourse)
JOIN {groups} g ON (g.courseid = e.courseid AND g.id = e.{$gidfield})
JOIN {user} u ON (u.id = ue.userid AND u.deleted = 0)
LEFT JOIN {groups_members} gm ON (gm.groupid = g.id AND gm.userid = ue.userid)
WHERE gm.id IS NULL";
$rs = $DB->get_recordset_sql($sql, $params);
foreach ($rs as $ue) {
groups_add_member($ue->groupid, $ue->userid, 'enrol_'.$enrolname, $ue->enrolid);
$affectedusers['added'][] = $ue;
}
$rs->close();
return $affectedusers;
}