AutorÃa | Ultima modificación | Ver Log |
<?php// This file is part of Moodle - http://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 <http://www.gnu.org/licenses/>./*** Privacy provider implementation for core_contentbank.** @package core_contentbank* @copyright 2020 Amaia Anabitarte <amaia@moodle.com>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/namespace core_contentbank\privacy;use core_privacy\local\metadata\collection;use core_privacy\local\request\approved_contextlist;use core_privacy\local\request\contextlist;use core_privacy\local\request\transform;use core_privacy\local\request\writer;use core_privacy\local\request\userlist;use core_privacy\local\request\approved_userlist;use context_system;use context_coursecat;use context_course;/*** Privacy provider implementation for core_contentbank.** @copyright 2020 Amaia Anabitarte <amaia@moodle.com>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/class provider implements\core_privacy\local\metadata\provider,\core_privacy\local\request\core_userlist_provider,\core_privacy\local\request\plugin\provider,\core_privacy\local\request\user_preference_provider {/*** Returns meta data about this system.** @param collection $collection The initialised collection to add items to.* @return collection A listing of user data stored through this system.*/public static function get_metadata(collection $collection): collection {$collection->add_database_table('contentbank_content', ['name' => 'privacy:metadata:content:name','contenttype' => 'privacy:metadata:content:contenttype','usercreated' => 'privacy:metadata:content:usercreated','usermodified' => 'privacy:metadata:content:usermodified','timecreated' => 'privacy:metadata:content:timecreated','timemodified' => 'privacy:metadata:content:timemodified',], 'privacy:metadata:contentbankcontent');return $collection;}/*** Export all user preferences for the contentbank** @param int $userid The userid of the user whose data is to be exported.*/public static function export_user_preferences(int $userid) {$preference = get_user_preferences('core_contentbank_view_list', null, $userid);if (isset($preference)) {writer::export_user_preference('core_contentbank','core_contentbank_view_list',$preference,get_string('privacy:request:preference:set', 'core_contentbank', (object) ['name' => 'core_contentbank_view_list','value' => $preference,]));}}/*** Get the list of contexts that contain user information for the specified user.** @param int $userid The user to search.* @return contextlist $contextlist The contextlist containing the list of contexts used in this plugin.*/public static function get_contexts_for_userid(int $userid): contextlist {$sql = "SELECT DISTINCT ctx.idFROM {context} ctxJOIN {contentbank_content} cbON cb.contextid = ctx.idWHERE cb.usercreated = :useridAND (ctx.contextlevel = :contextlevel1OR ctx.contextlevel = :contextlevel2OR ctx.contextlevel = :contextlevel3)";$params = ['userid' => $userid,'contextlevel1' => CONTEXT_SYSTEM,'contextlevel2' => CONTEXT_COURSECAT,'contextlevel3' => CONTEXT_COURSE,];$contextlist = new contextlist();$contextlist->add_from_sql($sql, $params);return $contextlist;}/*** Get the list of users within a specific 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();$allowedcontextlevels = [CONTEXT_SYSTEM,CONTEXT_COURSECAT,CONTEXT_COURSE,];if (!in_array($context->contextlevel, $allowedcontextlevels)) {return;}$sql = "SELECT cb.usercreated as useridFROM {contentbank_content} cbWHERE cb.contextid = :contextid";$params = ['contextid' => $context->id];$userlist->add_from_sql('userid', $sql, $params);}/*** Export all user data for the specified user, in the specified contexts.** @param approved_contextlist $contextlist The approved contexts to export information for.*/public static function export_user_data(approved_contextlist $contextlist) {global $DB;// Remove contexts different from SYSTEM, COURSECAT or COURSE.$contextids = array_reduce($contextlist->get_contexts(), function($carry, $context) {if ($context->contextlevel == CONTEXT_SYSTEM || $context->contextlevel == CONTEXT_COURSECAT|| $context->contextlevel == CONTEXT_COURSE) {$carry[] = $context->id;}return $carry;}, []);if (empty($contextids)) {return;}$userid = $contextlist->get_user()->id;list($contextsql, $contextparams) = $DB->get_in_or_equal($contextids, SQL_PARAMS_NAMED);// Retrieve the contentbank_content records created for the user.$sql = "SELECT cb.id,cb.name,cb.contenttype,cb.usercreated,cb.usermodified,cb.timecreated,cb.timemodified,cb.contextidFROM {contentbank_content} cbWHERE cb.usercreated = :useridAND cb.contextid {$contextsql}ORDER BY cb.contextid";$params = ['userid' => $userid] + $contextparams;$contents = $DB->get_recordset_sql($sql, $params);$data = [];$lastcontextid = null;$subcontext = [get_string('name', 'core_contentbank'),];foreach ($contents as $content) {// The core_contentbank data export is organised in:// {Sytem|Course Category|Course Context Level}/Content/data.json.if ($lastcontextid && $lastcontextid != $content->contextid) {$context = \context::instance_by_id($lastcontextid);writer::with_context($context)->export_data($subcontext, (object)$data);$data = [];}$data[] = (object) ['name' => $content->name,'contenttype' => $content->contenttype,'usercreated' => transform::user($content->usercreated),'usermodified' => transform::user($content->usermodified),'timecreated' => transform::datetime($content->timecreated),'timemodified' => transform::datetime($content->timemodified)];$lastcontextid = $content->contextid;// The core_contentbank files export is organised in:// {Sytem|Course Category|Course Context Level}/Content/_files/public/_itemid/filename.$context = \context::instance_by_id($lastcontextid);writer::with_context($context)->export_area_files($subcontext, 'contentbank', 'public', $content->id);}if (!empty($data)) {$context = \context::instance_by_id($lastcontextid);writer::with_context($context)->export_data($subcontext, (object)$data);}$contents->close();}/*** Delete all data for all users in the specified context.** @param context $context The specific context to delete data for.*/public static function delete_data_for_all_users_in_context(\context $context) {global $DB;if (!$context instanceof context_system && !$context instanceof context_coursecat&& !$context instanceof context_course) {return;}static::delete_data($context, []);}/*** 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) {$context = $userlist->get_context();if (!$context instanceof context_system && !$context instanceof context_coursecat&& !$context instanceof context_course) {return;}static::delete_data($context, $userlist->get_userids());}/*** Delete all user data for the specified user, in the specified contexts.** @param approved_contextlist $contextlist The approved contexts and user information to delete information for.*/public static function delete_data_for_user(approved_contextlist $contextlist) {if (empty($contextlist->count())) {return;}$userid = $contextlist->get_user()->id;foreach ($contextlist->get_contexts() as $context) {if (!$context instanceof context_system && !$context instanceof context_coursecat&& !$context instanceof context_course) {continue;}static::delete_data($context, [$userid]);}}/*** Delete data related to a context and users (if defined).** @param context $context A context.* @param array $userids The user IDs.*/protected static function delete_data(\context $context, array $userids) {global $DB;$params = ['contextid' => $context->id];$select = 'contextid = :contextid';// Delete the Content Bank files.if (!empty($userids)) {list($insql, $inparams) = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED);$params += $inparams;$select .= ' AND usercreated '.$insql;}$fs = get_file_storage();$contents = $DB->get_records_select('contentbank_content',$select, $params);foreach ($contents as $content) {$fs->delete_area_files($content->contextid, 'contentbank', 'public', $content->id);}// Delete all the contents.$DB->delete_records_select('contentbank_content', $select, $params);}}