mirror of
https://github.com/moodle/moodle.git
synced 2025-04-21 00:12:56 +02:00
MDL-29688 add support for status sync in enrol meta plugin
This commit is contained in:
parent
804796138a
commit
379434e440
@ -56,6 +56,13 @@ $handlers = array (
|
||||
'internal' => 1,
|
||||
),
|
||||
|
||||
'user_enrol_modified' => array (
|
||||
'handlerfile' => '/enrol/meta/locallib.php',
|
||||
'handlerfunction' => array('enrol_meta_handler', 'user_enrol_modified'),
|
||||
'schedule' => 'instant',
|
||||
'internal' => 1,
|
||||
),
|
||||
|
||||
'course_deleted' => array (
|
||||
'handlerfile' => '/enrol/meta/locallib.php',
|
||||
'handlerfunction' => array('enrol_meta_handler', 'course_deleted'),
|
||||
|
@ -139,8 +139,20 @@ class enrol_meta_handler {
|
||||
|
||||
$plugin = enrol_get_plugin('meta');
|
||||
foreach ($enrols as $enrol) {
|
||||
if ($ue->status == ENROL_USER_ACTIVE) {
|
||||
$status = ENROL_USER_ACTIVE;
|
||||
} else {
|
||||
$context = get_context_instance(CONTEXT_COURSE, $enrol->courseid);
|
||||
if (is_enrolled($context, $ue->userid)) {
|
||||
// user already has active enrolment, do not change it
|
||||
$status = ENROL_USER_ACTIVE;
|
||||
} else {
|
||||
$status = $ue->status;
|
||||
}
|
||||
|
||||
}
|
||||
// no problem if already enrolled
|
||||
$plugin->enrol_user($enrol, $ue->userid);
|
||||
$plugin->enrol_user($enrol, $ue->userid, $status);
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -171,6 +183,33 @@ class enrol_meta_handler {
|
||||
return true;
|
||||
}
|
||||
|
||||
public function user_enrol_modified($ue) {
|
||||
global $DB;
|
||||
|
||||
// update enrolment status if necessary
|
||||
|
||||
if (!enrol_is_enabled('meta')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($ue->enrol === 'meta') {
|
||||
// prevent circular dependencies - we can not sync meta enrolments recursively
|
||||
return true;
|
||||
}
|
||||
|
||||
// does anything want to sync with this parent?
|
||||
if (!$enrols = $DB->get_records('enrol', array('customint1'=>$ue->courseid, 'enrol'=>'meta'), 'id ASC')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$plugin = enrol_get_plugin('meta');
|
||||
foreach ($enrols as $enrol) {
|
||||
$plugin->update_user_enrol($enrol, $ue->userid, $ue->status);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function course_deleted($course) {
|
||||
global $DB;
|
||||
|
||||
@ -207,6 +246,8 @@ function enrol_meta_sync($courseid = NULL) {
|
||||
// unfortunately this may take a loooong time
|
||||
@set_time_limit(0); //if this fails during upgrade we can continue from cron, no big deal
|
||||
|
||||
$instances = array(); //cache
|
||||
|
||||
$meta = enrol_get_plugin('meta');
|
||||
|
||||
$onecourse = $courseid ? "AND e.courseid = :courseid" : "";
|
||||
@ -214,10 +255,8 @@ function enrol_meta_sync($courseid = NULL) {
|
||||
// iterate through all not enrolled yet users
|
||||
if (enrol_is_enabled('meta')) {
|
||||
list($enabled, $params) = $DB->get_in_or_equal(explode(',', $CFG->enrol_plugins_enabled), SQL_PARAMS_NAMED, 'e');
|
||||
$onecourse = "";
|
||||
if ($courseid) {
|
||||
$params['courseid'] = $courseid;
|
||||
$onecourse = "AND e.courseid = :courseid";
|
||||
}
|
||||
$sql = "SELECT pue.userid, e.id AS enrolid
|
||||
FROM {user_enrolments} pue
|
||||
@ -229,7 +268,6 @@ function enrol_meta_sync($courseid = NULL) {
|
||||
$params['courseid'] = $courseid;
|
||||
|
||||
$rs = $DB->get_recordset_sql($sql, $params);
|
||||
$instances = array(); //cache
|
||||
foreach($rs as $ue) {
|
||||
if (!isset($instances[$ue->enrolid])) {
|
||||
$instances[$ue->enrolid] = $DB->get_record('enrol', array('id'=>$ue->enrolid));
|
||||
@ -237,7 +275,6 @@ function enrol_meta_sync($courseid = NULL) {
|
||||
$meta->enrol_user($instances[$ue->enrolid], $ue->userid);
|
||||
}
|
||||
$rs->close();
|
||||
unset($instances);
|
||||
}
|
||||
|
||||
// unenrol as necessary - ignore enabled flag, we want to get rid of all
|
||||
@ -251,7 +288,6 @@ function enrol_meta_sync($courseid = NULL) {
|
||||
WHERE pue.courseid IS NULL";
|
||||
//TODO: this may use a bit of SQL optimisation
|
||||
$rs = $DB->get_recordset_sql($sql, array('courseid'=>$courseid));
|
||||
$instances = array(); //cache
|
||||
foreach($rs as $ue) {
|
||||
if (!isset($instances[$ue->enrolid])) {
|
||||
$instances[$ue->enrolid] = $DB->get_record('enrol', array('id'=>$ue->enrolid));
|
||||
@ -259,7 +295,6 @@ function enrol_meta_sync($courseid = NULL) {
|
||||
$meta->unenrol_user($instances[$ue->enrolid], $ue->userid);
|
||||
}
|
||||
$rs->close();
|
||||
unset($instances);
|
||||
|
||||
// now assign all necessary roles
|
||||
if (enrol_is_enabled('meta')) {
|
||||
@ -320,4 +355,61 @@ function enrol_meta_sync($courseid = NULL) {
|
||||
}
|
||||
$rs->close();
|
||||
|
||||
// sync enrolment status
|
||||
if (enrol_is_enabled('meta')) {
|
||||
list($enabled, $params) = $DB->get_in_or_equal(explode(',', $CFG->enrol_plugins_enabled), SQL_PARAMS_NAMED, 'e');
|
||||
if ($courseid) {
|
||||
$params['courseid'] = $courseid;
|
||||
}
|
||||
//note: this will probably take a long time on mysql...
|
||||
$sql = "SELECT ue.userid, e.id AS enrolid
|
||||
FROM {user_enrolments} ue
|
||||
JOIN {enrol} e ON (e.id = ue.enrolid AND e.enrol = 'meta' AND e.status = :statusenabled $onecourse)
|
||||
WHERE ue.status = :activestatus1
|
||||
AND NOT EXISTS (SELECT 'x'
|
||||
FROM {user_enrolments} pue
|
||||
JOIN {enrol} pe ON (pe.courseid = e.customint1 AND pe.enrol <> 'meta' AND pe.enrol $enabled)
|
||||
WHERE pue.enrolid = pe.id AND pue.userid = ue.userid AND pue.status = :activestatus2)";
|
||||
$params['statusenabled'] = ENROL_INSTANCE_ENABLED;
|
||||
$params['activestatus1'] = ENROL_USER_ACTIVE;
|
||||
$params['activestatus2'] = ENROL_USER_ACTIVE;
|
||||
$params['courseid'] = $courseid;
|
||||
|
||||
$rs = $DB->get_recordset_sql($sql, $params);
|
||||
foreach($rs as $ue) {
|
||||
if (!isset($instances[$ue->enrolid])) {
|
||||
$instances[$ue->enrolid] = $DB->get_record('enrol', array('id'=>$ue->enrolid));
|
||||
}
|
||||
$meta->update_user_enrol($instances[$ue->enrolid], $ue->userid, ENROL_USER_SUSPENDED);
|
||||
}
|
||||
$rs->close();
|
||||
|
||||
list($enabled, $params) = $DB->get_in_or_equal(explode(',', $CFG->enrol_plugins_enabled), SQL_PARAMS_NAMED, 'e');
|
||||
if ($courseid) {
|
||||
$params['courseid'] = $courseid;
|
||||
}
|
||||
//note: this will probably take a long time on mysql...
|
||||
$sql = "SELECT ue.userid, e.id AS enrolid
|
||||
FROM {user_enrolments} ue
|
||||
JOIN {enrol} e ON (e.id = ue.enrolid AND e.enrol = 'meta' AND e.status = :statusenabled $onecourse)
|
||||
WHERE ue.status = :suspendedstatus
|
||||
AND EXISTS (SELECT 'x'
|
||||
FROM {user_enrolments} pue
|
||||
JOIN {enrol} pe ON (pe.courseid = e.customint1 AND pe.enrol <> 'meta' AND pe.enrol $enabled)
|
||||
WHERE pue.enrolid = pe.id AND pue.userid = ue.userid AND pue.status = :activestatus)";
|
||||
$params['statusenabled'] = ENROL_INSTANCE_ENABLED;
|
||||
$params['suspendedstatus'] = ENROL_USER_SUSPENDED;
|
||||
$params['activestatus'] = ENROL_USER_ACTIVE;
|
||||
$params['courseid'] = $courseid;
|
||||
$rs = $DB->get_recordset_sql($sql, $params);
|
||||
foreach($rs as $ue) {
|
||||
if (!isset($instances[$ue->enrolid])) {
|
||||
$instances[$ue->enrolid] = $DB->get_record('enrol', array('id'=>$ue->enrolid));
|
||||
}
|
||||
$meta->update_user_enrol($instances[$ue->enrolid], $ue->userid, ENROL_USER_ACTIVE);
|
||||
}
|
||||
$rs->close();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -26,5 +26,5 @@
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$plugin->version = 2010073100;
|
||||
$plugin->version = 2010073101;
|
||||
$plugin->cron = 60;
|
Loading…
x
Reference in New Issue
Block a user