Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
// This file is part of Moodle - http://moodle.org/
3
//
4
// Moodle is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
8
//
9
// Moodle is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
// GNU General Public License for more details.
13
//
14
// You should have received a copy of the GNU General Public License
15
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16
 
17
/**
18
 * Privacy Subsystem implementation for mnetservice_enrol.
19
 *
20
 * @package    mnetservice_enrol
21
 * @copyright  2018 Carlos Escobedo <carlos@moodle.com>
22
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23
 */
24
 
25
namespace mnetservice_enrol\privacy;
26
 
27
defined('MOODLE_INTERNAL') || die();
28
 
29
use core_privacy\local\metadata\collection;
30
use core_privacy\local\request\approved_contextlist;
31
use core_privacy\local\request\context;
32
use core_privacy\local\request\contextlist;
33
use core_privacy\local\request\transform;
34
use core_privacy\local\request\writer;
35
use core_privacy\local\request\userlist;
36
use core_privacy\local\request\approved_userlist;
37
 
38
/**
39
 * Privacy Subsystem for mnetservice_enrol implementing metadata and plugin providers.
40
 *
41
 * @copyright  2018 Carlos Escobedo <carlos@moodle.com>
42
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
43
 */
44
class provider implements
45
        \core_privacy\local\metadata\provider,
46
        \core_privacy\local\request\core_userlist_provider,
47
        \core_privacy\local\request\plugin\provider {
48
 
49
    /**
50
     * Returns meta data about this system.
51
     *
52
     * @param   collection $collection The initialised collection to add items to.
53
     * @return  collection     A listing of user data stored through this system.
54
     */
55
    public static function get_metadata(collection $collection): collection {
56
        $collection->add_database_table(
57
            'mnetservice_enrol_enrolments',
58
            [
59
                'hostid' => 'privacy:metadata:mnetservice_enrol_enrolments:hostid',
60
                'userid' => 'privacy:metadata:mnetservice_enrol_enrolments:userid',
61
                'remotecourseid' => 'privacy:metadata:mnetservice_enrol_enrolments:remotecourseid',
62
                'rolename' => 'privacy:metadata:mnetservice_enrol_enrolments:rolename',
63
                'enroltime' => 'privacy:metadata:mnetservice_enrol_enrolments:enroltime',
64
                'enroltype' => 'privacy:metadata:mnetservice_enrol_enrolments:enroltype'
65
            ],
66
            'privacy:metadata:mnetservice_enrol_enrolments:tableexplanation'
67
        );
68
 
69
        return $collection;
70
    }
71
 
72
    /**
73
     * Get the list of contexts that contain user information for the specified user.
74
     *
75
     * @param   int $userid The user to search.
76
     * @return  contextlist   $contextlist  The contextlist containing the list of contexts used in this plugin.
77
     */
78
    public static function get_contexts_for_userid(int $userid): contextlist {
79
        $sql = "SELECT c.id
80
                  FROM {context} c
81
                  JOIN {mnetservice_enrol_enrolments} me
82
                    ON me.userid = c.instanceid
83
                   AND c.contextlevel = :contextlevel
84
                 WHERE me.userid = :userid";
85
        $params = [
86
            'contextlevel' => CONTEXT_USER,
87
            'userid'       => $userid
88
        ];
89
        $contextlist = new contextlist();
90
        $contextlist->add_from_sql($sql, $params);
91
        return $contextlist;
92
    }
93
 
94
    /**
95
     * Get the list of users within a specific context.
96
     *
97
     * @param userlist $userlist The userlist containing the list of users who have data in this context/plugin combination.
98
     */
99
    public static function get_users_in_context(userlist $userlist) {
100
        $context = $userlist->get_context();
101
 
102
        if (!$context instanceof \context_user) {
103
            return;
104
        }
105
 
106
        $params = ['userid' => $context->instanceid];
107
 
108
        $sql = "SELECT userid
109
                  FROM {mnetservice_enrol_enrolments}
110
                 WHERE userid = :userid";
111
 
112
        $userlist->add_from_sql('userid', $sql, $params);
113
    }
114
 
115
    /**
116
     * Export all user data for the specified user, in the specified contexts.
117
     *
118
     * @param   approved_contextlist $contextlist The approved contexts to export information for.
119
     */
120
    public static function export_user_data(approved_contextlist $contextlist) {
121
        global $DB;
122
        if (empty($contextlist->count())) {
123
            return;
124
        }
125
        $userid = $contextlist->get_user()->id;
126
        $contextuser = \context_user::instance($userid);
127
        list($insql, $inparams) = $DB->get_in_or_equal($contextlist->get_contextids(), SQL_PARAMS_NAMED);
128
        $params = [
129
            'userid' => $userid,
130
            'contextlevel' => CONTEXT_USER
131
         ];
132
        $params += $inparams;
133
        $sql = "SELECT me.id,
134
                       me.rolename,
135
                       me.enroltime,
136
                       me.enroltype,
137
                       mh.name as hostname,
138
                       mc.fullname
139
                  FROM {mnetservice_enrol_enrolments} me
140
                  JOIN {context} ctx
141
                    ON ctx.instanceid = me.userid
142
                   AND ctx.contextlevel = :contextlevel
143
                  JOIN {mnet_host} mh
144
                    ON mh.id = me.hostid
145
                  JOIN {mnetservice_enrol_courses} mc
146
                    ON mc.remoteid = me.remotecourseid
147
                 WHERE me.userid = :userid
148
                   AND ctx.id {$insql}";
149
        $mnetenrolments = $DB->get_records_sql($sql, $params);
150
        foreach ($mnetenrolments as $mnetenrolment) {
151
            // The core_enrol data export is organised in:
152
            // {User Context}/User enrolments/data.json.
153
            $data[] = (object) [
154
                'host' => $mnetenrolment->hostname,
155
                'remotecourseid' => $mnetenrolment->fullname,
156
                'rolename' => $mnetenrolment->rolename,
157
                'enroltime' => transform::datetime($mnetenrolment->enroltime),
158
                'enroltype' => $mnetenrolment->enroltype
159
            ];
160
        }
161
        writer::with_context($contextuser)->export_data(
162
                [get_string('privacy:metadata:mnetservice_enrol_enrolments', 'mnetservice_enrol')],
163
                (object)$data
164
            );
165
    }
166
 
167
    /**
168
     * Delete all data for all users in the specified context.
169
     *
170
     * @param   context $context The specific context to delete data for.
171
     */
172
    public static function delete_data_for_all_users_in_context(\context $context) {
173
        // Sanity check that context is at the User context level.
174
        if ($context->contextlevel == CONTEXT_USER) {
175
            static::delete_user_data($context->instanceid);
176
        }
177
    }
178
 
179
    /**
180
     * Delete multiple users within a single context.
181
     *
182
     * @param approved_userlist $userlist The approved context and user information to delete information for.
183
     */
184
    public static function delete_data_for_users(approved_userlist $userlist) {
185
        $context = $userlist->get_context();
186
 
187
        if ($context instanceof \context_user) {
188
            static::delete_user_data($context->instanceid);
189
        }
190
    }
191
 
192
    /**
193
     * Delete all user data for the specified user, in the specified contexts.
194
     *
195
     * @param   approved_contextlist $contextlist The approved contexts and user information to delete information for.
196
     */
197
    public static function delete_data_for_user(approved_contextlist $contextlist) {
198
        if (empty($contextlist->count())) {
199
            return;
200
        }
201
        $user = $contextlist->get_user();
202
        foreach ($contextlist->get_contexts() as $context) {
203
            // Verify the context is a user context and that the instanceid matches the userid of the contextlist.
204
            if ($context->contextlevel == CONTEXT_USER && $context->instanceid == $user->id) {
205
                // Get the data and write it.
206
                 static::delete_user_data($user->id);
207
            }
208
        }
209
    }
210
 
211
    /**
212
     * This does the deletion of user data for the mnetservice_enrolments.
213
     *
214
     * @param  int $userid The user ID
215
     */
216
    protected static function delete_user_data(int $userid) {
217
        global $DB;
218
        // Because we only use user contexts the instance ID is the user ID.
219
        $DB->delete_records('mnetservice_enrol_enrolments', ['userid' => $userid]);
220
    }
221
}