Merge branch 'MDL-62560-master'
authorDavid Monllao <davidm@moodle.com>
Mon, 22 Oct 2018 10:52:58 +0000 (12:52 +0200)
committerDavid Monllao <davidm@moodle.com>
Mon, 22 Oct 2018 10:52:58 +0000 (12:52 +0200)
1  2 
mod/forum/classes/privacy/provider.php
mod/forum/tests/privacy_provider_test.php

@@@ -852,39 -943,102 +949,93 @@@ class provider implement
                  'userid' => $userid,
              ]);
  
 -            $uniquediscussions = $DB->get_recordset('forum_discussions', [
 -                    'forum' => $forum->id,
 -                    'userid' => $userid,
 -                ]);
 -
 -            foreach ($uniquediscussions as $discussion) {
 -                // Do not delete discussion or forum posts.
 -                // Instead update them to reflect that the content has been deleted.
 -                $postsql = "userid = :userid AND discussion IN (SELECT id FROM {forum_discussions} WHERE forum = :forum)";
 -                $postidsql = "SELECT fp.id FROM {forum_posts} fp WHERE {$postsql}";
 -                $postparams = [
 -                    'forum' => $forum->id,
 -                    'userid' => $userid,
 -                ];
 -
 -                // Update the subject.
 -                $DB->set_field_select('forum_posts', 'subject', '', $postsql, $postparams);
 +            // Do not delete discussion or forum posts.
 +            // Instead update them to reflect that the content has been deleted.
 +            $postsql = "userid = :userid AND discussion IN (SELECT id FROM {forum_discussions} WHERE forum = :forum)";
 +            $postidsql = "SELECT fp.id FROM {forum_posts} fp WHERE {$postsql}";
 +            $postparams = [
 +                'forum' => $forum->id,
 +                'userid' => $userid,
 +            ];
  
 -                // Update the subject and its format.
 -                $DB->set_field_select('forum_posts', 'message', '', $postsql, $postparams);
 -                $DB->set_field_select('forum_posts', 'messageformat', FORMAT_PLAIN, $postsql, $postparams);
 +            // Update the subject.
 +            $DB->set_field_select('forum_posts', 'subject', '', $postsql, $postparams);
  
 -                // Mark the post as deleted.
 -                $DB->set_field_select('forum_posts', 'deleted', 1, $postsql, $postparams);
 +            // Update the message and its format.
 +            $DB->set_field_select('forum_posts', 'message', '', $postsql, $postparams);
 +            $DB->set_field_select('forum_posts', 'messageformat', FORMAT_PLAIN, $postsql, $postparams);
  
 -                // Note: Do _not_ delete ratings of other users. Only delete ratings on the users own posts.
 -                // Ratings are aggregate fields and deleting the rating of this post will have an effect on the rating
 -                // of any post.
 -                \core_rating\privacy\provider::delete_ratings_select($context, 'mod_forum', 'post',
 -                        "IN ($postidsql)", $postparams);
 +            // Mark the post as deleted.
 +            $DB->set_field_select('forum_posts', 'deleted', 1, $postsql, $postparams);
  
 -                // Delete all Tags.
 -                \core_tag\privacy\provider::delete_item_tags_select($context, 'mod_forum', 'forum_posts',
 -                        "IN ($postidsql)", $postparams);
 +            // Note: Do _not_ delete ratings of other users. Only delete ratings on the users own posts.
 +            // Ratings are aggregate fields and deleting the rating of this post will have an effect on the rating
 +            // of any post.
 +            \core_rating\privacy\provider::delete_ratings_select($context, 'mod_forum', 'post',
 +                    "IN ($postidsql)", $postparams);
  
 -                // Delete all files from the posts.
 -                $fs = get_file_storage();
 -                $fs->delete_area_files_select($context->id, 'mod_forum', 'post', "IN ($postidsql)", $postparams);
 -                $fs->delete_area_files_select($context->id, 'mod_forum', 'attachment', "IN ($postidsql)", $postparams);
 -            }
 +            // Delete all Tags.
 +            \core_tag\privacy\provider::delete_item_tags_select($context, 'mod_forum', 'forum_posts',
 +                    "IN ($postidsql)", $postparams);
  
 -            $uniquediscussions->close();
 +            // Delete all files from the posts.
 +            $fs = get_file_storage();
 +            $fs->delete_area_files_select($context->id, 'mod_forum', 'post', "IN ($postidsql)", $postparams);
 +            $fs->delete_area_files_select($context->id, 'mod_forum', 'attachment', "IN ($postidsql)", $postparams);
          }
      }
+     /**
+      * Delete multiple users within a single context.
+      *
+      * @param   approved_userlist       $userlist The approved context and user information to delete information for.
+      */
+     public static function delete_data_for_users(approved_userlist $userlist) {
+         global $DB;
+         $context = $userlist->get_context();
+         $cm = $DB->get_record('course_modules', ['id' => $context->instanceid]);
+         $forum = $DB->get_record('forum', ['id' => $cm->instance]);
+         list($userinsql, $userinparams) = $DB->get_in_or_equal($userlist->get_userids(), SQL_PARAMS_NAMED);
+         $params = array_merge(['forumid' => $forum->id], $userinparams);
+         $DB->delete_records_select('forum_track_prefs', "forumid = :forumid AND userid {$userinsql}", $params);
+         $DB->delete_records_select('forum_subscriptions', "forum = :forumid AND userid {$userinsql}", $params);
+         $DB->delete_records_select('forum_read', "forumid = :forumid AND userid {$userinsql}", $params);
+         $DB->delete_records_select(
+             'forum_queue',
+             "userid {$userinsql} AND discussionid IN (SELECT id FROM {forum_discussions} WHERE forum = :forumid)",
+             $params
+         );
+         $DB->delete_records_select('forum_discussion_subs', "forum = :forumid AND userid {$userinsql}", $params);
+         // Do not delete discussion or forum posts.
+         // Instead update them to reflect that the content has been deleted.
+         $postsql = "userid {$userinsql} AND discussion IN (SELECT id FROM {forum_discussions} WHERE forum = :forumid)";
+         $postidsql = "SELECT fp.id FROM {forum_posts} fp WHERE {$postsql}";
+         // Update the subject.
+         $DB->set_field_select('forum_posts', 'subject', '', $postsql, $params);
+         // Update the subject and its format.
+         $DB->set_field_select('forum_posts', 'message', '', $postsql, $params);
+         $DB->set_field_select('forum_posts', 'messageformat', FORMAT_PLAIN, $postsql, $params);
+         // Mark the post as deleted.
+         $DB->set_field_select('forum_posts', 'deleted', 1, $postsql, $params);
+         // Note: Do _not_ delete ratings of other users. Only delete ratings on the users own posts.
+         // Ratings are aggregate fields and deleting the rating of this post will have an effect on the rating
+         // of any post.
+         \core_rating\privacy\provider::delete_ratings_select($context, 'mod_forum', 'post', "IN ($postidsql)", $params);
+         // Delete all Tags.
+         \core_tag\privacy\provider::delete_item_tags_select($context, 'mod_forum', 'forum_posts', "IN ($postidsql)", $params);
+         // Delete all files from the posts.
+         $fs = get_file_storage();
+         $fs->delete_area_files_select($context->id, 'mod_forum', 'post', "IN ($postidsql)", $params);
+         $fs->delete_area_files_select($context->id, 'mod_forum', 'attachment', "IN ($postidsql)", $params);
+     }
  }