diff --git a/classes/domain/autogroup_set.php b/classes/domain/autogroup_set.php index 8f1cafe..87d09ed 100644 --- a/classes/domain/autogroup_set.php +++ b/classes/domain/autogroup_set.php @@ -100,6 +100,7 @@ public function delete(\moodle_database $db, $cleanupgroups = true) //this has to be done first to prevent event handler getting in the way $db->delete_records('local_autogroup_set', array('id'=>$this->id)); $db->delete_records('local_autogroup_roles', array('setid'=>$this->id)); + $db->delete_records('local_autogroup_manual', array('groupid'=>$this->id)); if($cleanupgroups){ foreach($this->groups as $k => $group){ diff --git a/classes/domain/group.php b/classes/domain/group.php index c487398..6e49acb 100644 --- a/classes/domain/group.php +++ b/classes/domain/group.php @@ -90,6 +90,16 @@ public function ensure_user_is_member($userid){ * @param int $userid */ public function ensure_user_is_not_member($userid){ + + // Do not allow autogroup to remove this User if they were manually assigned to group. + $pluginconfig = get_config('local_autogroup'); + if($pluginconfig->preservemanual) { + global $DB; + if($DB->record_exists('local_autogroup_manual', array('userid' => $userid, 'groupid' => $this->id))) { + return; + } + } + foreach($this->members as $member){ if ($member == $userid) { \groups_remove_member($this->as_object(), $userid); diff --git a/classes/event_handler.php b/classes/event_handler.php index 8c8feb5..2cabdc4 100644 --- a/classes/event_handler.php +++ b/classes/event_handler.php @@ -76,13 +76,22 @@ public static function group_member_added(event\group_member_added $event) { return false; } + global $DB; $pluginconfig = get_config('local_autogroup'); + + // Add to manually assigned list (local_autogroup_manual). + $userid = (int) $event->relateduserid; + $groupid = (int) $event->objectid; + + if(!$DB->record_exists('local_autogroup_manual', array('userid' => $userid, 'groupid' => $groupid))) { + $record = (object) array('userid' => $userid, 'groupid' => $groupid); + $DB->insert_record('local_autogroup_manual', $record); + } + if(!$pluginconfig->listenforgroupmembership){ return false; } - global $DB; - $courseid = (int) $event->courseid; $userid = (int) $event->relateduserid; @@ -101,10 +110,16 @@ public static function group_member_removed(event\group_member_removed $event) { return false; } + global $DB, $PAGE; $pluginconfig = get_config('local_autogroup'); + // Remove from manually assigned list (local_autogroup_manual). + $userid = (int) $event->relateduserid; + $groupid = (int) $event->objectid; - global $DB, $PAGE; + if($DB->record_exists('local_autogroup_manual', array('userid' => $userid, 'groupid' => $groupid))) { + $DB->delete_records('local_autogroup_manual', array('userid' => $userid, 'groupid' => $groupid)); + } $groupid = (int) $event->objectid; $courseid = (int) $event->courseid; @@ -174,16 +189,21 @@ public static function group_change(event\base $event) { return false; } - $pluginconfig = get_config('local_autogroup'); - if(!$pluginconfig->listenforgroupchanges){ - return false; - } - global $DB, $PAGE; $courseid = (int) $event->courseid; $groupid = (int) $event->objectid; + // Remove from manually assigned list (local_autogroup_manual). + if ($event->eventname === '\core\event\group_deleted') { + $DB->delete_records('local_autogroup_manual', array('groupid' => $groupid)); + } + + $pluginconfig = get_config('local_autogroup'); + if(!$pluginconfig->listenforgroupchanges){ + return false; + } + if($DB->record_exists('groups', array('id'=>$groupid))) { $verifygroupidnumber = new usecase\verify_group_idnumber($groupid, $DB, $PAGE); $verifygroupidnumber(); diff --git a/db/install.xml b/db/install.xml index ef2a572..8d045a1 100644 --- a/db/install.xml +++ b/db/install.xml @@ -29,5 +29,15 @@ + + + + + + + + + +
\ No newline at end of file diff --git a/db/upgrade.php b/db/upgrade.php index cdb0dee..3107169 100644 --- a/db/upgrade.php +++ b/db/upgrade.php @@ -19,5 +19,27 @@ function xmldb_local_autogroup_upgrade($oldversion) { // savepoint reached. upgrade_plugin_savepoint(true, 2016062201, 'local', 'autogroup'); } + + if ($oldversion < 2018102300) { + // Define table local_autogroup_manual to be created. + $table = new xmldb_table('local_autogroup_manual'); + + // Adding fields to table local_autogroup_manual. + $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null); + $table->add_field('groupid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null); + $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null); + + // Adding keys to table local_autogroup_manual. + $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id')); + + // Conditionally launch create table for local_autogroup_manual. + if (!$dbman->table_exists($table)) { + $dbman->create_table($table); + } + + // Autogroup savepoint reached. + upgrade_plugin_savepoint(true, 2018102300, 'local', 'autogroup'); + } + return true; -} \ No newline at end of file +} diff --git a/lang/en/local_autogroup.php b/lang/en/local_autogroup.php index fb1ca0f..9d3921f 100644 --- a/lang/en/local_autogroup.php +++ b/lang/en/local_autogroup.php @@ -55,6 +55,7 @@ // Admin Settings $string['addtonewcourses'] = 'Add to new courses'; $string['addtorestoredcourses'] = 'Add to restored courses'; +$string['preservemanual'] = 'Manually added Users are not removed when autogroups are updated.'; $string['defaults'] = 'Default Settings'; $string['defaultroles'] = 'Default Eligible Roles'; $string['enabled'] = 'Enabled'; diff --git a/settings.php b/settings.php index aefa138..8060832 100644 --- a/settings.php +++ b/settings.php @@ -75,6 +75,14 @@ false ) ); + $settings->add( + new admin_setting_configcheckbox( + 'local_autogroup/preservemanual', + get_string('preservemanual', 'local_autogroup'), + '', + 1 + ) + ); // default settings $settings->add(