AutorÃa | Ultima modificación | Ver Log |
<?php// This file is part of Moodle - https://moodle.org///// Moodle is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// Moodle is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with Moodle. If not, see <https://www.gnu.org/licenses/>./*** Privacy class for requesting user data.** @package mod_stickynotes* @copyright 2021 Olivier VALENTIN* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/namespace mod_stickynotes\privacy;defined('MOODLE_INTERNAL') || die();use core_privacy\local\metadata\collection;use core_privacy\local\request\approved_contextlist;use core_privacy\local\request\approved_userlist;use core_privacy\local\request\contextlist;use core_privacy\local\request\helper;use core_privacy\local\request\userlist;use core_privacy\local\request\writer;use \core_privacy\local\request\transform;defined('MOODLE_INTERNAL') || die();/*** Implementation of the privacy subsystem plugin provider for the Stickynotes activity module.*/class provider implements// This plugin stores personal data.\core_privacy\local\metadata\provider,// This plugin is a core_user_data_provider.\core_privacy\local\request\plugin\provider,// This plugin is capable of determining which users have data within it.\core_privacy\local\request\core_userlist_provider{/*** Return the fields which contain personal data.** @param collection $items a reference to the collection to use to store the metadata.* @return collection the updated collection of metadata items.*/public static function get_metadata(collection $items): collection {// 1. The 'stickynotes_note' table stores information about notes created by user.$items->add_database_table('stickynotes_note',['id' => 'privacy:metadata:stickynotes_note:id','stickyid' => 'privacy:metadata:stickynotes_note:stickyid','stickycolid' => 'privacy:metadata:stickynotes_note:stickycolid','userid' => 'privacy:metadata:stickynotes_note:userid','message' => 'privacy:metadata:stickynotes_note:message','timecreated' => 'privacy:metadata:stickynotes_note:timecreated','timemodified' => 'privacy:metadata:stickynotes_note:timemodified',],'privacy:metadata:stickynotes_note');// 2. The 'stickynotes_vote' table stores information about which notes a user has rated.$items->add_database_table('stickynotes_vote',['id' => 'privacy:metadata:stickynotes_vote:id','stickyid' => 'privacy:metadata:stickynotes_vote:stickyid','stickynoteid' => 'privacy:metadata:stickynotes_vote:stickynoteid','userid' => 'privacy:metadata:stickynotes_vote:userid','vote' => 'privacy:metadata:stickynotes_vote:vote','timecreated' => 'privacy:metadata:stickynotes_vote:timecreated',],'privacy:metadata:stickynotes_vote');return $items;}/*** Get the list of contexts that contain user information for the specified user.** In the case of forum, that is any forum where the user has made any post, rated any content, or has any preferences.** @param int $userid The user to search.* @return contextlist $contextlist The list of contexts used in this plugin.*/public static function get_contexts_for_userid(int $userid) : \core_privacy\local\request\contextlist {$contextlist = new \core_privacy\local\request\contextlist();$params = ['modname' => 'stickynotes','contextlevel' => CONTEXT_MODULE,'userid' => $userid,];// Stickynotes notes.$sql = "SELECT c.idFROM {context} cJOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = :contextlevelJOIN {modules} m ON m.id = cm.module AND m.name = :modnameJOIN {stickynotes} s ON s.id = cm.instanceJOIN {stickynotes_column} sc ON sc.stickyid = s.idJOIN {stickynotes_note} sn ON sn.stickycolid = sc.idWHERE sn.userid = :userid";$contextlist->add_from_sql($sql, $params);// Stickynotes votes.$sql = "SELECT c.idFROM {context} cJOIN {course_modules} cm ON cm.id = c.instanceid AND c.contextlevel = :contextlevelJOIN {modules} m ON m.id = cm.module AND m.name = :modnameJOIN {stickynotes} s ON s.id = cm.instanceJOIN {stickynotes_column} sc ON sc.stickyid = s.idJOIN {stickynotes_note} sn ON sn.stickycolid = sc.idJOIN {stickynotes_vote} sv ON sv.stickynoteid = sn.idWHERE sv.userid = :userid";$contextlist->add_from_sql($sql, $params);return $contextlist;}/*** Get the list of users who have data within a context.** @param userlist $userlist The userlist containing the list of users who have data in this context/plugin combination.*/public static function get_users_in_context(userlist $userlist) {$context = $userlist->get_context();if (!is_a($context, \context_module::class)) {return;}$params = ['instanceid' => $context->instanceid,'modulename' => 'stickynotes',];// Notes authors.$sql = "SELECT sn.useridFROM {course_modules} cmJOIN {modules} m ON m.id = cm.module AND m.name = :modnameJOIN {stickynotes} s ON s.id = cm.instanceJOIN {stickynotes_column} sc ON sc.stickyid = s.idJOIN {stickynotes_note} sn ON sn.stickycolid = sc.idWHERE cm.id = :instanceid";$userlist->add_from_sql('userid', $sql, $params);// Votes.$sql = "SELECT sv.useridFROM {course_modules} cmJOIN {modules} m ON m.id = cm.module AND m.name = :modnameJOIN {stickynotes} s ON s.id = cm.instanceJOIN {stickynotes_column} sc ON sc.stickyid = s.idJOIN {stickynotes_note} sn ON sn.stickycolid = sc.idJOIN {stickynotes_vote} sv ON sv.stickynoteid = sn.idWHERE cm.id = :instanceid";$userlist->add_from_sql('userid', $sql, $params);}/*** Export all user data for the specified user, in the specified contexts, using the supplied exporter instance.** @param approved_contextlist $contextlist The approved contexts to export information for.*/public static function export_user_data(approved_contextlist $contextlist) {global $DB, $CFG;$userid = $contextlist->get_user()->id;if (empty($contextlist)) {return;}list($contextsql, $contextparams) = $DB->get_in_or_equal($contextlist->get_contextids(), SQL_PARAMS_NAMED);$sql = "SELECTc.id AS contextid,s.id,cm.id AS cmidFROM {context} cJOIN {course_modules} cm ON cm.id = c.instanceidJOIN {stickynotes} s ON s.id = cm.instanceWHERE (c.id {$contextsql})";// Keep a mapping of stickyid to contextid.$mappings = [];$params = ['modname' => 'stickynotes', 'contextlevel' => CONTEXT_MODULE, 'userid' => $user->id] + $contextparams;$stickynotesactivities = $DB->get_recordset_sql($sql, $params);foreach ($stickynotesactivities as $stickynotes) {$mappings[$stickynotes->id] = $stickynotes->contextid;$context = \context::instance_by_id($mappings[$stickynotes->id]);$subcontext = [get_string('pluginname', 'mod_stickynotes'),format_string($stickynotes->name),$stickynotes->id];// Get all notes created by the user.$sql1notes = "SELECT id, message, timecreated, timemodifiedfrom {stickynotes_note}where userid = :useridand stickyid = :stickynotesid";$query1notes = $DB->get_records_sql($sql1notes, array('userid' => $userid, 'stickynotesid' => $stickynotes->id));foreach ($query1notes as $query1note) {$key = $query1note->id;$notedata[$key] = (object) ['id' => $query1note->id,'message' => format_string($query1note->message, true),'timecreated' => transform::datetime($query1note->timecreated),'timemodified' => transform::datetime($query1note->timemodified),];}// Get all votes of this user.$sql2notes = "SELECT sv.id as idvote, sv.vote, sv.timecreated, sn.id as idnotefrom {stickynotes_note} snjoin {stickynotes_vote} sv on sv.stickynoteid = sn.idwhere sv.userid = :useridand sv.stickyid = :stickynotesid";$query2notes = $DB->get_records_sql($sql2notes, array('userid' => $userid, 'stickynotesid' => $stickynotes->id));foreach ($query2notes as $query2note) {$key = $query2note->idnote;$votedata[$key] = (object) ['idnote' => $query2note->idnote,'vote' => $query2note->vote,'timecreated' => transform::datetime($query2note->timecreated),];}$stickynotes->notes = $notedata;$stickynotes->votes = $votedata;unset($notedata);unset($votedata);writer::with_context($context)->export_data([], $stickynotes);}$stickynotesactivities->close();}/*** Delete all data for all users in the specified context.** @param \context $context the context to delete in.*/public static function delete_data_for_all_users_in_context(\context $context) {global $DB;if (!$context instanceof \context_module) {return;}if ($cm = get_coursemodule_from_id('stickynotes', $context->instanceid)) {$DB->delete_records('stickynotes_note', ['stickyid' => $cm->instance]);$DB->delete_records('stickynotes_vote', ['stickyid' => $cm->instance]);}}/*** Delete all user data for the specified user, in the specified contexts.** @param approved_contextlist $contextlist a list of contexts approved for deletion.*/public static function delete_data_for_user(approved_contextlist $contextlist) {global $DB;if (empty($contextlist->count())) {return;}$userid = $contextlist->get_user()->id;foreach ($contextlist->get_contexts() as $context) {if (!$context instanceof \context_module) {continue;}$instanceid = $DB->get_field('course_modules', 'instance', ['id' => $context->instanceid]);if (!$instanceid) {continue;}$DB->delete_records('stickynotes_note', ['stickyid' => $instanceid, 'userid' => $userid]);$DB->delete_records('stickynotes_vote', ['stickyid' => $instanceid, 'userid' => $userid]);}}/*** 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();if (!$context instanceof \context_module) {return;}$cm = get_coursemodule_from_id('stickynotes', $context->instanceid);if (!$cm) {// Only stickynotes module will be handled.return;}$userids = $userlist->get_userids();list($usersql, $userparams) = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED);$select = "stickyid = :stickyid AND userid $usersql";$params = ['stickyid' => $cm->instance] + $userparams;$DB->delete_records_select('stickynotes_note', $select, $params);$DB->delete_records_select('stickynotes_note', $select, $params);}}