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
namespace tool_courserating\privacy;
18
 
19
use core_privacy\local\metadata\collection;
20
use core_privacy\local\request\approved_contextlist;
21
use core_privacy\local\request\approved_userlist;
22
use core_privacy\local\request\contextlist;
23
use core_privacy\local\request\transform;
24
use core_privacy\local\request\userlist;
25
use core_privacy\local\request\writer;
26
use tool_courserating\api;
27
use tool_courserating\local\models\rating;
28
use tool_courserating\task\reindex;
29
 
30
/**
31
 * Privacy provider
32
 *
33
 * @package     tool_courserating
34
 * @copyright   2022 Marina Glancy <marina.glancy@gmail.com>
35
 * @license     https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36
 */
37
class provider implements
38
    \core_privacy\local\metadata\provider,
39
    \core_privacy\local\request\core_userlist_provider,
40
    \core_privacy\local\request\plugin\provider {
41
 
42
    /**
43
     * get_metadata
44
     *
45
     * @param collection $collection
46
     * @return collection
47
     */
48
    public static function get_metadata(collection $collection): collection {
49
        $collection->add_database_table(
50
            'tool_courserating_rating',
51
            [
52
                'id' => 'privacy:metadata:tool_courserating_rating:id',
53
                'courseid' => 'privacy:metadata:tool_courserating_rating:cohortid',
54
                'userid' => 'privacy:metadata:tool_courserating_rating:userid',
55
                'rating' => 'privacy:metadata:tool_courserating_rating:rating',
56
                'review' => 'privacy:metadata:tool_courserating_rating:review',
57
                'hasreview' => 'privacy:metadata:tool_courserating_rating:hasreview',
58
                'timecreated' => 'privacy:metadata:tool_courserating_rating:timecreated',
59
                'timemodified' => 'privacy:metadata:tool_courserating_rating:timemodified',
60
            ],
61
            'privacy:metadata:tool_courserating_rating'
62
        );
63
 
64
        $collection->add_database_table(
65
            'tool_courserating_flag',
66
            [
67
                'id' => 'privacy:metadata:tool_courserating_flag:id',
68
                'ratingid' => 'privacy:metadata:tool_courserating_flag:ratingid',
69
                'userid' => 'privacy:metadata:tool_courserating_flag:userid',
70
                'reasoncode' => 'privacy:metadata:tool_courserating:reasoncode',
71
                'reason' => 'privacy:metadata:tool_courserating:reason',
72
                'timecreated' => 'privacy:metadata:tool_courserating:timecreated',
73
                'timemodified' => 'privacy:metadata:tool_courserating:timemodified',
74
            ],
75
            'privacy:metadata:tool_courserating_flag'
76
        );
77
 
78
        return $collection;
79
    }
80
 
81
    /**
82
     * get_contexts_for_userid
83
     *
84
     * @param int $userid
85
     * @return contextlist
86
     */
87
    public static function get_contexts_for_userid(int $userid): contextlist {
88
        $contextlist = new contextlist();
89
 
90
        // Own ratings.
91
        $sql = "SELECT DISTINCT ctx.id
92
                  FROM {tool_courserating_rating} r
93
                   JOIN {context} ctx
94
                       ON ctx.instanceid = r.courseid AND ctx.contextlevel = :coursecontext
95
                 WHERE r.userid = :userid";
96
 
97
        $params = [
98
            'userid'        => $userid,
99
            'coursecontext' => CONTEXT_COURSE,
100
        ];
101
 
102
        $contextlist->add_from_sql($sql, $params);
103
 
104
        // Flags for other ratings.
105
        $sql = "SELECT DISTINCT ctx.id
106
                  FROM {tool_courserating_rating} r
107
                  JOIN {tool_courserating_flag} f ON f.ratingid = r.id
108
                   JOIN {context} ctx
109
                       ON ctx.instanceid = r.courseid AND ctx.contextlevel = :coursecontext
110
                 WHERE f.userid = :userid";
111
 
112
        $params = [
113
            'userid'        => $userid,
114
            'coursecontext' => CONTEXT_COURSE,
115
        ];
116
 
117
        $contextlist->add_from_sql($sql, $params);
118
 
119
        return $contextlist;
120
    }
121
 
122
    /**
123
     * export_user_data
124
     *
125
     * @param approved_contextlist $contextlist
126
     */
127
    public static function export_user_data(approved_contextlist $contextlist) {
128
        global $DB;
129
 
130
        $courseids = [];
131
        foreach ($contextlist->get_contexts() as $context) {
132
            $courseids[] = $context->instanceid;
133
        }
134
 
135
        if (empty($courseids)) {
136
            return;
137
        }
138
 
139
        $userid = $contextlist->get_user()->id;
140
 
141
        list($coursesql, $courseparams) = $DB->get_in_or_equal($courseids, SQL_PARAMS_NAMED);
142
 
143
        // Retrieve the tool_courserating_rating records created for the user.
144
        $sql = "SELECT r.id, r.userid, r.courseid, r.rating, r.review, r.hasreview, r.timecreated, r.timemodified,
145
                       c.shortname,
146
                       c.fullname
147
                  FROM {tool_courserating_rating} r
148
                  JOIN {course} c ON c.id = r.courseid
149
                 WHERE r.userid = :userid
150
                       AND c.id {$coursesql}";
151
 
152
        $params = ['userid' => $userid] + $courseparams;
153
 
154
        $ratings = $DB->get_records_sql($sql, $params);
155
 
156
        foreach ($ratings as $rating) {
157
            $subcontext = [
158
                get_string('pluginname', 'tool_courserating'),
159
                $rating->shortname,
160
            ];
161
 
162
            $data = (object) [
163
                'shortname' => $rating->shortname,
164
                'fullname' => $rating->fullname,
165
                'rating' => $rating->rating,
166
                'review' => $rating->review,
167
                'hasreview' => $rating->hasreview,
168
                'userid' => transform::user($rating->userid),
169
                'timecreated' => transform::datetime($rating->timecreated),
170
                'timemodified' => transform::datetime($rating->timemodified),
171
            ];
172
 
173
            $context = \context_course::instance($rating->courseid);
174
            writer::with_context($context)->export_data($subcontext, $data);
175
        }
176
 
177
        // TODO export flags.
178
    }
179
 
180
    /**
181
     * delete_data_for_all_users_in_context
182
     *
183
     * @param \context $context
184
     * @return void
185
     */
186
    public static function delete_data_for_all_users_in_context(\context $context) {
187
        if ($context->contextlevel == CONTEXT_COURSE) {
188
            api::delete_all_data_for_course($context->instanceid);
189
        }
190
    }
191
 
192
    /**
193
     * delete_data_for_user
194
     *
195
     * @param approved_contextlist $contextlist
196
     * @return void
197
     */
198
    public static function delete_data_for_user(approved_contextlist $contextlist) {
199
        $courseids = [];
200
        foreach ($contextlist->get_contexts() as $context) {
201
            $courseids[] = $context->instanceid;
202
        }
203
        $userid = $contextlist->get_user()->id;
204
        self::delete_data_for_user_in_courses($userid, $courseids);
205
    }
206
 
207
    /**
208
     * delete_data_for_user_in_courses
209
     *
210
     * @param int $userid
211
     * @param array $courseids
212
     */
213
    protected static function delete_data_for_user_in_courses(int $userid, array $courseids) {
214
        global $DB;
215
        if (!$userid || empty($courseids)) {
216
            return;
217
        }
218
        [$sql, $params] = $DB->get_in_or_equal($courseids, SQL_PARAMS_NAMED);
219
        $sqlrating = 'SELECT courseid FROM {tool_courserating_rating} WHERE courseid '.$sql.' AND userid = :userid';
220
        $params['userid'] = $userid;
221
        $sqlflags = 'SELECT f.id FROM {tool_courserating_flag} f JOIN {tool_courserating_rating} r ON f.ratingid = r.id
222
            WHERE r.courseid '.$sql.' AND f.userid = :userid';
223
        $flags = $DB->get_fieldset_sql($sqlflags, $params);
224
        if ($flags) {
225
            [$sqlf, $pf] = $DB->get_in_or_equal($flags);
226
            $DB->execute('DELETE FROM {tool_courserating_flag} WHERE id '.$sqlf, $pf);
227
        }
228
        $affectedcourses = $DB->get_fieldset_sql($sqlrating, $params);
229
        foreach ($affectedcourses as $cid) {
230
            $DB->delete_records(rating::TABLE, ['userid' => $userid, 'courseid' => $cid]);
231
            reindex::schedule_course($cid);
232
        }
233
    }
234
 
235
    /**
236
     * get_users_in_context
237
     *
238
     * @param userlist $userlist
239
     * @return void
240
     */
241
    public static function get_users_in_context(userlist $userlist) {
242
        $context = $userlist->get_context();
243
 
244
        if ($context->contextlevel != CONTEXT_COURSE) {
245
            return;
246
        }
247
 
248
        $sql = "SELECT DISTINCT r.userid
249
                  FROM {tool_courserating_rating} r
250
                 WHERE r.courseid = :courseid";
251
        $params = ['courseid' => $context->instanceid];
252
 
253
        $userlist->add_from_sql('userid', $sql, $params);
254
 
255
        $sql = "SELECT DISTINCT f.userid
256
                  FROM {tool_courserating_rating} r
257
                  JOIN {tool_courserating_flag} f ON f.ratingid = r.id
258
                 WHERE r.courseid = :courseid";
259
        $params = ['courseid' => $context->instanceid];
260
 
261
        $userlist->add_from_sql('userid', $sql, $params);
262
    }
263
 
264
    /**
265
     * delete_data_for_users
266
     *
267
     * @param approved_userlist $userlist
268
     * @return void
269
     */
270
    public static function delete_data_for_users(approved_userlist $userlist) {
271
        if ($userlist->get_context()->contextlevel != CONTEXT_COURSE) {
272
            return;
273
        }
274
        $courseid = $userlist->get_context()->instanceid;
275
        foreach ($userlist->get_userids() as $userid) {
276
            self::delete_data_for_user_in_courses($userid, [$courseid]);
277
        }
278
    }
279
}