Merge branch 'MDL-63903-master' of https://github.com/snake/moodle
[moodle.git] / admin / tool / dataprivacy / classes / local / helper.php
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/>.
17 /**
18  * Collection of helper functions for the data privacy tool.
19  *
20  * @package    tool_dataprivacy
21  * @copyright  2018 Jun Pataleta
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
24 namespace tool_dataprivacy\local;
25 defined('MOODLE_INTERNAL') || die();
27 use coding_exception;
28 use moodle_exception;
29 use tool_dataprivacy\api;
31 /**
32  * Class containing helper functions for the data privacy tool.
33  *
34  * @copyright  2018 Jun Pataleta
35  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36  */
37 class helper {
38     /** The default number of results to be shown per page. */
39     const DEFAULT_PAGE_SIZE = 20;
41     /** Filter constant associated with the request type filter. */
42     const FILTER_TYPE = 1;
44     /** Filter constant associated with the request status filter. */
45     const FILTER_STATUS = 2;
47     /** The request filters preference key. */
48     const PREF_REQUEST_FILTERS = 'tool_dataprivacy_request-filters';
50     /** The number of data request records per page preference key. */
51     const PREF_REQUEST_PERPAGE = 'tool_dataprivacy_request-perpage';
53     /**
54      * Retrieves the human-readable text value of a data request type.
55      *
56      * @param int $requesttype The request type.
57      * @return string
58      * @throws coding_exception
59      * @throws moodle_exception
60      */
61     public static function get_request_type_string($requesttype) {
62         $types = self::get_request_types();
63         if (!isset($types[$requesttype])) {
64             throw new moodle_exception('errorinvalidrequesttype', 'tool_dataprivacy');
65         }
66         return $types[$requesttype];
67     }
69     /**
70      * Retrieves the human-readable shortened text value of a data request type.
71      *
72      * @param int $requesttype The request type.
73      * @return string
74      * @throws coding_exception
75      * @throws moodle_exception
76      */
77     public static function get_shortened_request_type_string($requesttype) {
78         $types = self::get_request_types_short();
79         if (!isset($types[$requesttype])) {
80             throw new moodle_exception('errorinvalidrequesttype', 'tool_dataprivacy');
81         }
82         return $types[$requesttype];
83     }
85     /**
86      * Returns the key value-pairs of request type code and their string value.
87      *
88      * @return array
89      */
90     public static function get_request_types() {
91         return [
92             api::DATAREQUEST_TYPE_EXPORT => get_string('requesttypeexport', 'tool_dataprivacy'),
93             api::DATAREQUEST_TYPE_DELETE => get_string('requesttypedelete', 'tool_dataprivacy'),
94             api::DATAREQUEST_TYPE_OTHERS => get_string('requesttypeothers', 'tool_dataprivacy'),
95         ];
96     }
98     /**
99      * Returns the key value-pairs of request type code and their shortened string value.
100      *
101      * @return array
102      */
103     public static function get_request_types_short() {
104         return [
105             api::DATAREQUEST_TYPE_EXPORT => get_string('requesttypeexportshort', 'tool_dataprivacy'),
106             api::DATAREQUEST_TYPE_DELETE => get_string('requesttypedeleteshort', 'tool_dataprivacy'),
107             api::DATAREQUEST_TYPE_OTHERS => get_string('requesttypeothersshort', 'tool_dataprivacy'),
108         ];
109     }
111     /**
112      * Retrieves the human-readable value of a data request status.
113      *
114      * @param int $status The request status.
115      * @return string
116      * @throws moodle_exception
117      */
118     public static function get_request_status_string($status) {
119         $statuses = self::get_request_statuses();
120         if (!isset($statuses[$status])) {
121             throw new moodle_exception('errorinvalidrequeststatus', 'tool_dataprivacy');
122         }
124         return $statuses[$status];
125     }
127     /**
128      * Returns the key value-pairs of request status code and string value.
129      *
130      * @return array
131      */
132     public static function get_request_statuses() {
133         return [
134             api::DATAREQUEST_STATUS_PENDING => get_string('statuspending', 'tool_dataprivacy'),
135             api::DATAREQUEST_STATUS_PREPROCESSING => get_string('statuspreprocessing', 'tool_dataprivacy'),
136             api::DATAREQUEST_STATUS_AWAITING_APPROVAL => get_string('statusawaitingapproval', 'tool_dataprivacy'),
137             api::DATAREQUEST_STATUS_APPROVED => get_string('statusapproved', 'tool_dataprivacy'),
138             api::DATAREQUEST_STATUS_PROCESSING => get_string('statusprocessing', 'tool_dataprivacy'),
139             api::DATAREQUEST_STATUS_COMPLETE => get_string('statuscomplete', 'tool_dataprivacy'),
140             api::DATAREQUEST_STATUS_DOWNLOAD_READY => get_string('statusready', 'tool_dataprivacy'),
141             api::DATAREQUEST_STATUS_EXPIRED => get_string('statusexpired', 'tool_dataprivacy'),
142             api::DATAREQUEST_STATUS_CANCELLED => get_string('statuscancelled', 'tool_dataprivacy'),
143             api::DATAREQUEST_STATUS_REJECTED => get_string('statusrejected', 'tool_dataprivacy'),
144             api::DATAREQUEST_STATUS_DELETED => get_string('statusdeleted', 'tool_dataprivacy'),
145         ];
146     }
148     /**
149      * Get the users that a user can make data request for.
150      *
151      * E.g. User having a parent role and has the 'tool/dataprivacy:makedatarequestsforchildren' capability.
152      * @param int $userid The user's ID.
153      * @return array
154      */
155     public static function get_children_of_user($userid) {
156         global $DB;
158         // Get users that the user has role assignments to.
159         $allusernames = get_all_user_name_fields(true, 'u');
160         $sql = "SELECT u.id, $allusernames
161                   FROM {role_assignments} ra, {context} c, {user} u
162                  WHERE ra.userid = :userid
163                        AND ra.contextid = c.id
164                        AND c.instanceid = u.id
165                        AND c.contextlevel = :contextlevel";
166         $params = [
167             'userid' => $userid,
168             'contextlevel' => CONTEXT_USER
169         ];
171         // The final list of users that we will return.
172         $finalresults = [];
174         // Our prospective list of users.
175         if ($candidates = $DB->get_records_sql($sql, $params)) {
176             foreach ($candidates as $key => $child) {
177                 $childcontext = \context_user::instance($child->id);
178                 if (has_capability('tool/dataprivacy:makedatarequestsforchildren', $childcontext, $userid)) {
179                     $finalresults[$key] = $child;
180                 }
181             }
182         }
183         return $finalresults;
184     }
186     /**
187      * Get options for the data requests filter.
188      *
189      * @return array
190      * @throws coding_exception
191      */
192     public static function get_request_filter_options() {
193         $filters = [
194             self::FILTER_TYPE => (object)[
195                 'name' => get_string('requesttype', 'tool_dataprivacy'),
196                 'options' => self::get_request_types_short()
197             ],
198             self::FILTER_STATUS => (object)[
199                 'name' => get_string('requeststatus', 'tool_dataprivacy'),
200                 'options' => self::get_request_statuses()
201             ],
202         ];
203         $options = [];
204         foreach ($filters as $category => $filtercategory) {
205             foreach ($filtercategory->options as $key => $name) {
206                 $option = (object)[
207                     'category' => $filtercategory->name,
208                     'name' => $name
209                 ];
210                 $options["{$category}:{$key}"] = get_string('filteroption', 'tool_dataprivacy', $option);
211             }
212         }
213         return $options;
214     }