Proyectos de Subversion Moodle

Rev

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.
 *
 * File         provider.php
 * Encoding     UTF-8
 *
 * @package     tool_usersuspension
 *
 * @copyright   Sebsoft.nl
 * @author      R.J. van Dongen <rogier@sebsoft.nl>
 * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

namespace tool_usersuspension\privacy;

use core_privacy\local\metadata\collection;
use core_privacy\local\request\contextlist;
use core_privacy\local\request\approved_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;

/**
 * Privacy provider.
 *
 * @package     tool_usersuspension
 *
 * @copyright   Sebsoft.nl
 * @author      R.J. van Dongen <rogier@sebsoft.nl>
 * @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\plugin\provider,
        \core_privacy\local\request\core_userlist_provider {

    /**
     * Provides meta data that is stored about a user with tool_usersuspension
     *
     * @param  collection $collection A collection of meta data items to be added to.
     * @return  collection Returns the collection of metadata.
     */
    public static function get_metadata(collection $collection) : collection {
        $collection->add_database_table(
            'tool_usersuspension_excl',
            [
                'type' => 'privacy:metadata:tool_usersuspension:type',
                'refid' => 'privacy:metadata:tool_usersuspension:userid',
                'timecreated' => 'privacy:metadata:tool_usersuspension:timecreated',
            ],
            'privacy:metadata:tool_usersuspension_excl'
        );
        $collection->add_database_table(
            'tool_usersuspension_status',
            [
                'userid' => 'privacy:metadata:tool_usersuspension:userid',
                'status' => 'privacy:metadata:tool_usersuspension:status',
                'mailsent' => 'privacy:metadata:tool_usersuspension:mailsent',
                'mailedto' => 'privacy:metadata:tool_usersuspension:mailedto',
                'timecreated' => 'privacy:metadata:tool_usersuspension:timecreated',
            ],
            'privacy:metadata:tool_usersuspension_status'
        );
        $collection->add_database_table(
            'tool_usersuspension_log',
            [
                'userid' => 'privacy:metadata:tool_usersuspension:userid',
                'status' => 'privacy:metadata:tool_usersuspension:status',
                'mailsent' => 'privacy:metadata:tool_usersuspension:mailsent',
                'mailedto' => 'privacy:metadata:tool_usersuspension:mailedto',
                'timecreated' => 'privacy:metadata:tool_usersuspension:timecreated',
            ],
            'privacy:metadata:tool_usersuspension_log'
        );
        return $collection;
    }

    /**
     * Get the list of contexts that contain user information for the specified user.
     *
     * @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) : contextlist {
        $contextlist = new \core_privacy\local\request\contextlist();
        // Since this system works on a global level (it hooks into the authentication system), the only context is CONTEXT_SYSTEM.
        $contextlist->add_system_context();
        return $contextlist;
    }

    /**
     * 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;
        if (empty($contextlist->count())) {
            return;
        }
        $user = $contextlist->get_user();

        foreach ($contextlist->get_contexts() as $context) {
            if ($context->contextlevel != CONTEXT_SYSTEM) {
                continue;
            }
            $contextid = $context->id;
            // Add suspension status records.
            $sql = "SELECT ss.* FROM {tool_usersuspension_status} ss WHERE ss.userid = :userid";
            $params = ['userid' => $user->id];
            $alldata = [];
            $statuses = $DB->get_recordset_sql($sql, $params);
            foreach ($statuses as $status) {
                $alldata[$contextid][] = (object)[
                        'userid' => $status->userid,
                        'restored' => transform::yesno($status->restored),
                        'mailsent' => transform::yesno($status->mailsent),
                        'mailedto' => $status->mailedto,
                        'timecreated' => transform::datetime($status->timecreated),
                    ];
            }
            $statuses->close();

            // The data is organised in: {? }/hammering.json.
            // where X is the attempt number.
            array_walk($alldata, function($statusdata, $contextid) {
                $context = \context::instance_by_id($contextid);
                writer::with_context($context)->export_related_data(
                    ['tool_usersuspension'],
                    'statuses',
                    (object)['status' => $statusdata]
                );
            });

            // Add suspension log records.
            $sql = "SELECT ul.* FROM {tool_usersuspension_log} ul WHERE ul.userid = :userid";
            $params = ['userid' => $user->id];
            $alldata = [];
            $statuslogs = $DB->get_recordset_sql($sql, $params);
            foreach ($statuslogs as $statuslog) {
                $alldata[$contextid][] = (object)[
                        'userid' => $statuslog->userid,
                        'mailedto' => $statuslog->mailedto,
                        'timecreated' => transform::datetime($statuslog->timecreated),
                    ];
            }
            $statuslogs->close();

            // The data is organised in: {?}/hammerlogs.json.
            // where X is the attempt number.
            array_walk($alldata, function($statuslog, $contextid) {
                $context = \context::instance_by_id($contextid);
                writer::with_context($context)->export_related_data(
                    ['tool_usersuspension'],
                    'statuslogs',
                    (object)['statuslog' => $statuslog]
                );
            });

            // Add suspension exception records.
            $sql = "SELECT ue.* FROM {tool_usersuspension_excl} ue WHERE ue.refid = :userid AND ue.type = :type";
            $params = ['userid' => $user->id, 'type' => 'user'];
            $alldata = [];
            $exclusions = $DB->get_recordset_sql($sql, $params);
            foreach ($exclusions as $exclusion) {
                $alldata[$contextid][] = (object)[
                        'userid' => $exclusion->refid,
                        'type' => $exclusion->type,
                        'timecreated' => transform::datetime($exclusion->timecreated),
                    ];
            }
            $exclusions->close();

            // The data is organised in: {?}/hammerlogs.json.
            // where X is the attempt number.
            array_walk($alldata, function($exclusion, $contextid) {
                $context = \context::instance_by_id($contextid);
                writer::with_context($context)->export_related_data(
                    ['tool_usersuspension'],
                    'exclusions',
                    (object)['exclusion' => $exclusion]
                );
            });
        }
    }

    /**
     * Delete all use data which matches the specified context.
     *
     * @param context $context The module context.
     */
    public static function delete_data_for_all_users_in_context(\context $context) {
        global $DB;
        if ($context->contextlevel != CONTEXT_SYSTEM) {
            return;
        }

        // Delete exclusion records.
        $DB->delete_records('tool_usersuspension_excl');
        // Delete status records.
        $DB->delete_records('tool_usersuspension_status');
        // Delete log records.
        $DB->delete_records('tool_usersuspension_log');
    }

    /**
     * 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) {
        global $DB;

        if (empty($contextlist->count())) {
            return;
        }

        foreach ($contextlist->get_contexts() as $context) {
            if ($context->contextlevel != CONTEXT_SYSTEM) {
                continue;
            }

            $user = $contextlist->get_user();
            // Delete exclusion records.
            $DB->delete_records('tool_usersuspension_excl', ['type' => 'user', 'refid' => $user->id]);
            // Delete status records.
            $DB->delete_records('tool_usersuspension_status', ['userid' => $user->id]);
            // Delete log records.
            $DB->delete_records('tool_usersuspension_log', ['userid' => $user->id]);
        }
    }

    /**
     * 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) {
        global $DB;
        $context = $userlist->get_context();
        if ($context->contextlevel != CONTEXT_SYSTEM) {
            return;
        }
        // I'm unsure if we should also include the course contexts.
        // I'm also unsure if we should include the cohort linked contexts.
        // If we should, we'll implement those too.
        // For now, include "all".
        $userids1 = $DB->get_fieldset_sql('SELECT DISTINCT refid FROM {tool_usersuspension_excl} WHERE type = ?', ['user']);
        $userids2 = $DB->get_fieldset_sql('SELECT DISTINCT userid FROM {tool_usersuspension_status}');
        $userids3 = $DB->get_fieldset_sql('SELECT DISTINCT userid FROM {tool_usersuspension_log}');
        $userids = array_unique(array_merge($userids1, $userids2, $userids3));
        $userlist->add_users($userids);
    }

    /**
     * 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->contextlevel != CONTEXT_SYSTEM) {
            return;
        }

        foreach ($userlist->get_userids() as $userid) {
            $DB->delete_records('tool_usersuspension_excl', ['type' => 'user', 'refid' => $userid]);
            $DB->delete_records('tool_usersuspension_status', ['userid' => $userid]);
            $DB->delete_records('tool_usersuspension_log', ['userid' => $userid]);
        }
    }

}