Merge branch 'MDL-64568_36' of git://github.com/markn86/moodle into MOODLE_36_STABLE

This commit is contained in:
Adrian Greeve
2019-03-13 15:48:40 +08:00
4 changed files with 145 additions and 1 deletions
+20
View File
@@ -548,12 +548,32 @@ function groups_delete_group($grouporid) {
}
}
$context = context_course::instance($group->courseid);
// delete group calendar events
$DB->delete_records('event', array('groupid'=>$groupid));
//first delete usage in groupings_groups
$DB->delete_records('groupings_groups', array('groupid'=>$groupid));
//delete members
$DB->delete_records('groups_members', array('groupid'=>$groupid));
// Delete any members in a conversation related to this group.
if ($conversation = \core_message\api::get_conversation_by_area('core_group', 'groups', $groupid, $context->id)) {
$DB->delete_records('message_conversations', ['id' => $conversation->id]);
$DB->delete_records('message_conversation_members', ['conversationid' => $conversation->id]);
// Now, go through and delete any messages and related message actions for the conversation.
if ($messages = $DB->get_records('messages', ['conversationid' => $conversation->id])) {
$messageids = array_keys($messages);
list($insql, $inparams) = $DB->get_in_or_equal($messageids);
$DB->delete_records_select('message_user_actions', "messageid $insql", $inparams);
// Delete the messages now.
$DB->delete_records('messages', ['conversationid' => $conversation->id]);
}
}
//group itself last
$DB->delete_records('groups', array('id'=>$groupid));
+88
View File
@@ -321,6 +321,94 @@ class core_group_lib_testcase extends advanced_testcase {
$this->assertEquals($url, $event->get_url());
}
public function test_groups_delete_group_with_conversation() {
global $DB;
$this->resetAfterTest();
$this->setAdminUser();
$course1 = $this->getDataGenerator()->create_course();
$coursecontext1 = context_course::instance($course1->id);
$user1 = $this->getDataGenerator()->create_user();
$user2 = $this->getDataGenerator()->create_user();
$this->getDataGenerator()->enrol_user($user1->id, $course1->id);
$this->getDataGenerator()->enrol_user($user2->id, $course1->id);
$group1 = $this->getDataGenerator()->create_group(array('courseid' => $course1->id, 'enablemessaging' => 1));
$group2 = $this->getDataGenerator()->create_group(array('courseid' => $course1->id, 'enablemessaging' => 1));
// Add users to both groups.
$this->getDataGenerator()->create_group_member(array('groupid' => $group1->id, 'userid' => $user1->id));
$this->getDataGenerator()->create_group_member(array('groupid' => $group1->id, 'userid' => $user2->id));
$this->getDataGenerator()->create_group_member(array('groupid' => $group2->id, 'userid' => $user1->id));
$this->getDataGenerator()->create_group_member(array('groupid' => $group2->id, 'userid' => $user2->id));
$groupconversation1 = \core_message\api::get_conversation_by_area(
'core_group',
'groups',
$group1->id,
$coursecontext1->id
);
$groupconversation2 = \core_message\api::get_conversation_by_area(
'core_group',
'groups',
$group2->id,
$coursecontext1->id
);
// Send a few messages.
$g1m1 = \core_message\tests\helper::send_fake_message_to_conversation($user1, $groupconversation1->id);
$g1m2 = \core_message\tests\helper::send_fake_message_to_conversation($user2, $groupconversation1->id);
$g1m3 = \core_message\tests\helper::send_fake_message_to_conversation($user1, $groupconversation1->id);
$g1m4 = \core_message\tests\helper::send_fake_message_to_conversation($user2, $groupconversation1->id);
$g2m1 = \core_message\tests\helper::send_fake_message_to_conversation($user1, $groupconversation2->id);
$g2m2 = \core_message\tests\helper::send_fake_message_to_conversation($user2, $groupconversation2->id);
$g2m3 = \core_message\tests\helper::send_fake_message_to_conversation($user1, $groupconversation2->id);
$g2m4 = \core_message\tests\helper::send_fake_message_to_conversation($user2, $groupconversation2->id);
// Delete a few messages.
\core_message\api::delete_message($user1->id, $g1m1);
\core_message\api::delete_message($user1->id, $g1m2);
\core_message\api::delete_message($user1->id, $g2m1);
\core_message\api::delete_message($user1->id, $g2m2);
groups_delete_group($group1->id);
// Confirm group conversation was deleted just for the group 1 conversation.
$this->assertEquals(0, $DB->count_records('message_conversations', ['id' => $groupconversation1->id]));
$this->assertEquals(1, $DB->count_records('message_conversations', ['id' => $groupconversation2->id]));
// Confirm conversation members were deleted just for the group 1 conversation.
$this->assertEquals(0, $DB->count_records('message_conversation_members', ['conversationid' => $groupconversation1->id]));
$this->assertEquals(2, $DB->count_records('message_conversation_members', ['conversationid' => $groupconversation2->id]));
// Confirm message user actions were deleted just for the group 1 conversation.
$this->assertEquals(0, $DB->count_records('message_user_actions', ['messageid' => $g1m1]));
$this->assertEquals(0, $DB->count_records('message_user_actions', ['messageid' => $g1m2]));
$this->assertEquals(0, $DB->count_records('message_user_actions', ['messageid' => $g1m3]));
$this->assertEquals(0, $DB->count_records('message_user_actions', ['messageid' => $g1m4]));
$this->assertEquals(1, $DB->count_records('message_user_actions', ['messageid' => $g2m1]));
$this->assertEquals(1, $DB->count_records('message_user_actions', ['messageid' => $g2m2]));
$this->assertEquals(0, $DB->count_records('message_user_actions', ['messageid' => $g2m3]));
$this->assertEquals(0, $DB->count_records('message_user_actions', ['messageid' => $g2m4]));
// Confirm messages were deleted just for the group 1 conversation.
$this->assertEquals(0, $DB->count_records('messages', ['id' => $g1m1]));
$this->assertEquals(0, $DB->count_records('messages', ['id' => $g1m2]));
$this->assertEquals(0, $DB->count_records('messages', ['id' => $g1m3]));
$this->assertEquals(0, $DB->count_records('messages', ['id' => $g1m4]));
$this->assertEquals(1, $DB->count_records('messages', ['id' => $g2m1]));
$this->assertEquals(1, $DB->count_records('messages', ['id' => $g2m2]));
$this->assertEquals(1, $DB->count_records('messages', ['id' => $g2m3]));
$this->assertEquals(1, $DB->count_records('messages', ['id' => $g2m4]));
}
public function test_groups_delete_group_members() {
global $DB;
$this->resetAfterTest();
+36
View File
@@ -2952,5 +2952,41 @@ function xmldb_main_upgrade($oldversion) {
upgrade_main_savepoint(true, 2018120302.04);
}
if ($oldversion < 2018120303.01) {
// Remove any conversations and their members associated with non-existent groups.
$sql = "SELECT mc.id
FROM {message_conversations} mc
LEFT JOIN {groups} g
ON mc.itemid = g.id
WHERE mc.component = :component
AND mc.itemtype = :itemtype
AND g.id is NULL";
$conversations = $DB->get_records_sql($sql, ['component' => 'core_group', 'itemtype' => 'groups']);
if ($conversations) {
$conversationids = array_keys($conversations);
$DB->delete_records_list('message_conversations', 'id', $conversationids);
$DB->delete_records_list('message_conversation_members', 'conversationid', $conversationids);
// Now, go through each conversation and delete any messages and related message actions.
foreach ($conversationids as $conversationid) {
if ($messages = $DB->get_records('messages', ['conversationid' => $conversationid])) {
$messageids = array_keys($messages);
// Delete the actions.
list($insql, $inparams) = $DB->get_in_or_equal($messageids);
$DB->delete_records_select('message_user_actions', "messageid $insql", $inparams);
// Delete the messages.
$DB->delete_records('messages', ['conversationid' => $conversationid]);
}
}
}
// Main savepoint reached.
upgrade_main_savepoint(true, 2018120303.01);
}
return true;
}
+1 -1
View File
@@ -29,7 +29,7 @@
defined('MOODLE_INTERNAL') || die();
$version = 2018120303.00; // 20181203 = branching date YYYYMMDD - do not modify!
$version = 2018120303.01; // 20181203 = branching date YYYYMMDD - do not modify!
// RR = release increments - 00 in DEV branches.
// .XX = incremental changes.