Merge branch 'MDL-68647-master-forumprivacysql' of git://github.com/mudrd8mz/moodle

This commit is contained in:
Adrian Greeve
2020-08-05 14:18:24 +08:00
4 changed files with 51 additions and 27 deletions
+36 -25
View File
@@ -37,6 +37,8 @@ use tool_dataprivacy\context_instance;
defined('MOODLE_INTERNAL') || die();
require_once($CFG->dirroot . '/grade/grading/lib.php');
/**
* Implementation of the privacy subsystem plugin provider for the forum activity module.
*
@@ -690,35 +692,44 @@ class provider implements
protected static function export_all_posts(int $userid, array $mappings) {
global $DB;
// Find all of the posts, and post subscriptions for this forum.
list($foruminsql, $forumparams) = $DB->get_in_or_equal(array_keys($mappings), SQL_PARAMS_NAMED);
$ratingsql = \core_rating\privacy\provider::get_sql_join('rat', 'mod_forum', 'post', 'p.id', $userid);
$sql = "SELECT
p.discussion AS id,
f.id AS forumid,
d.name,
d.groupid
FROM {forum} f
JOIN {forum_discussions} d ON d.forum = f.id
JOIN {forum_posts} p ON p.discussion = d.id
LEFT JOIN {forum_read} fr ON fr.postid = p.id AND fr.userid = :readuserid
{$ratingsql->join}
WHERE f.id ${foruminsql} AND
(
p.userid = :postuserid OR
p.privatereplyto = :privatereplyrecipient OR
fr.id IS NOT NULL OR
{$ratingsql->userwhere}
)
GROUP BY f.id, p.discussion, d.name, d.groupid
";
$commonsql = "SELECT p.discussion AS id, f.id AS forumid, d.name, d.groupid
FROM {forum} f
JOIN {forum_discussions} d ON d.forum = f.id
JOIN {forum_posts} p ON p.discussion = d.id";
// All discussions with posts authored by the user or containing private replies to the user.
list($foruminsql1, $forumparams1) = $DB->get_in_or_equal(array_keys($mappings), SQL_PARAMS_NAMED);
$sql1 = "{$commonsql}
WHERE f.id {$foruminsql1}
AND (p.userid = :postuserid OR p.privatereplyto = :privatereplyrecipient)";
// All discussions with the posts marked as read by the user.
list($foruminsql2, $forumparams2) = $DB->get_in_or_equal(array_keys($mappings), SQL_PARAMS_NAMED);
$sql2 = "{$commonsql}
JOIN {forum_read} fr ON fr.postid = p.id
WHERE f.id {$foruminsql2}
AND fr.userid = :readuserid";
// All discussions with ratings provided by the user.
list($foruminsql3, $forumparams3) = $DB->get_in_or_equal(array_keys($mappings), SQL_PARAMS_NAMED);
$ratingsql = \core_rating\privacy\provider::get_sql_join('rat', 'mod_forum', 'post', 'p.id', $userid, true);
$sql3 = "{$commonsql}
{$ratingsql->join}
WHERE f.id {$foruminsql3}
AND {$ratingsql->userwhere}";
$sql = "SELECT *
FROM ({$sql1} UNION {$sql2} UNION {$sql3}) united
GROUP BY id, forumid, name, groupid";
$params = [
'postuserid' => $userid,
'readuserid' => $userid,
'postuserid' => $userid,
'readuserid' => $userid,
'privatereplyrecipient' => $userid,
];
$params += $forumparams;
$params += $forumparams1;
$params += $forumparams2;
$params += $forumparams3;
$params += $ratingsql->params;
$discussions = $DB->get_records_sql($sql, $params);
+2 -1
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
<XMLDB PATH="mod/forum/db" VERSION="20191001" COMMENT="XMLDB file for Moodle mod/forum"
<XMLDB PATH="mod/forum/db" VERSION="20200508" COMMENT="XMLDB file for Moodle mod/forum"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd"
>
@@ -99,6 +99,7 @@
<INDEX NAME="userid" UNIQUE="false" FIELDS="userid"/>
<INDEX NAME="created" UNIQUE="false" FIELDS="created"/>
<INDEX NAME="mailed" UNIQUE="false" FIELDS="mailed"/>
<INDEX NAME="privatereplyto" UNIQUE="false" FIELDS="privatereplyto" COMMENT="The field is used in certain queries (such as privacy requests) to search for private replies to the user."/>
</INDEXES>
</TABLE>
<TABLE NAME="forum_queue" COMMENT="For keeping track of posts that will be mailed in digest form">
+12
View File
@@ -246,5 +246,17 @@ function xmldb_forum_upgrade($oldversion) {
// Automatically generated Moodle v3.9.0 release upgrade line.
// Put any upgrade step following this.
if ($oldversion < 2020072100) {
// Add index privatereplyto (not unique) to the forum_posts table.
$table = new xmldb_table('forum_posts');
$index = new xmldb_index('privatereplyto', XMLDB_INDEX_NOTUNIQUE, ['privatereplyto']);
if (!$dbman->index_exists($table, $index)) {
$dbman->add_index($table, $index);
}
upgrade_mod_savepoint(true, 2020072100, 'forum');
}
return true;
}
+1 -1
View File
@@ -24,6 +24,6 @@
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2020061500; // The current module version (Date: YYYYMMDDXX)
$plugin->version = 2020072100; // The current module version (Date: YYYYMMDDXX)
$plugin->requires = 2020060900; // Requires this Moodle version
$plugin->component = 'mod_forum'; // Full name of the plugin (used for diagnostics)