Skip to content

Commit

Permalink
MDL-17929 groups: function to sync groups with enrolments
Browse files Browse the repository at this point in the history
  • Loading branch information
marinaglancy committed Apr 22, 2015
1 parent bacb7b1 commit 9c1561e
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 68 deletions.
36 changes: 3 additions & 33 deletions enrol/cohort/locallib.php
Original file line number Diff line number Diff line change
Expand Up @@ -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.');

Expand Down
39 changes: 4 additions & 35 deletions enrol/meta/locallib.php
Original file line number Diff line number Diff line change
Expand Up @@ -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.');
Expand Down
60 changes: 60 additions & 0 deletions group/lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

0 comments on commit 9c1561e

Please sign in to comment.