MDL-29688 add support for status sync in enrol meta plugin
authorPetr Skoda <commits@skodak.org>
Sun, 23 Oct 2011 18:52:10 +0000 (20:52 +0200)
committerPetr Skoda <commits@skodak.org>
Sun, 23 Oct 2011 18:52:10 +0000 (20:52 +0200)
enrol/meta/db/events.php
enrol/meta/locallib.php
enrol/meta/version.php

index 16e5d59..6e4152e 100644 (file)
@@ -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'),
index c8676dd..0b1e04f 100644 (file)
@@ -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();
+
+    }
+
 }
index 86366f0..a25f379 100644 (file)
@@ -26,5 +26,5 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version = 2010073100;
+$plugin->version = 2010073101;
 $plugin->cron    = 60;
\ No newline at end of file