From 379434e4407d3467ea36ebc7fd307f4d9f5ad9b9 Mon Sep 17 00:00:00 2001 From: Petr Skoda Date: Sun, 23 Oct 2011 20:52:10 +0200 Subject: [PATCH] MDL-29688 add support for status sync in enrol meta plugin --- enrol/meta/db/events.php | 7 +++ enrol/meta/locallib.php | 106 ++++++++++++++++++++++++++++++++++++--- enrol/meta/version.php | 2 +- 3 files changed, 107 insertions(+), 8 deletions(-) diff --git a/enrol/meta/db/events.php b/enrol/meta/db/events.php index 16e5d59219e..6e4152e27e4 100644 --- a/enrol/meta/db/events.php +++ b/enrol/meta/db/events.php @@ -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'), diff --git a/enrol/meta/locallib.php b/enrol/meta/locallib.php index c8676ddc087..0b1e04ff542 100644 --- a/enrol/meta/locallib.php +++ b/enrol/meta/locallib.php @@ -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(); + + } + } diff --git a/enrol/meta/version.php b/enrol/meta/version.php index 86366f0eb7b..a25f379ea0a 100644 --- a/enrol/meta/version.php +++ b/enrol/meta/version.php @@ -26,5 +26,5 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2010073100; +$plugin->version = 2010073101; $plugin->cron = 60; \ No newline at end of file