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 @@