MDL-62211 tool_dataprivacy: Request filtering and pagination
[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     /**
51      * Retrieves the human-readable text value of a data request type.
52      *
53      * @param int $requesttype The request type.
54      * @return string
55      * @throws coding_exception
56      * @throws moodle_exception
57      */
58     public static function get_request_type_string($requesttype) {
59         $types = self::get_request_types();
60         if (!isset($types[$requesttype])) {
61             throw new moodle_exception('errorinvalidrequesttype', 'tool_dataprivacy');
62         }
63         return $types[$requesttype];
64     }
66     /**
67      * Retrieves the human-readable shortened text value of a data request type.
68      *
69      * @param int $requesttype The request type.
70      * @return string
71      * @throws coding_exception
72      * @throws moodle_exception
73      */
74     public static function get_shortened_request_type_string($requesttype) {
75         $types = self::get_request_types_short();
76         if (!isset($types[$requesttype])) {
77             throw new moodle_exception('errorinvalidrequesttype', 'tool_dataprivacy');
78         }
79         return $types[$requesttype];
80     }
82     /**
83      * Returns the key value-pairs of request type code and their string value.
84      *
85      * @return array
86      */
87     public static function get_request_types() {
88         return [
89             api::DATAREQUEST_TYPE_EXPORT => get_string('requesttypeexport', 'tool_dataprivacy'),
90             api::DATAREQUEST_TYPE_DELETE => get_string('requesttypedelete', 'tool_dataprivacy'),
91             api::DATAREQUEST_TYPE_OTHERS => get_string('requesttypeothers', 'tool_dataprivacy'),
92         ];
93     }
95     /**
96      * Returns the key value-pairs of request type code and their shortened string value.
97      *
98      * @return array
99      */
100     public static function get_request_types_short() {
101         return [
102             api::DATAREQUEST_TYPE_EXPORT => get_string('requesttypeexportshort', 'tool_dataprivacy'),
103             api::DATAREQUEST_TYPE_DELETE => get_string('requesttypedeleteshort', 'tool_dataprivacy'),
104             api::DATAREQUEST_TYPE_OTHERS => get_string('requesttypeothersshort', 'tool_dataprivacy'),
105         ];
106     }
108     /**
109      * Retrieves the human-readable value of a data request status.
110      *
111      * @param int $status The request status.
112      * @return string
113      * @throws moodle_exception
114      */
115     public static function get_request_status_string($status) {
116         $statuses = self::get_request_statuses();
117         if (!isset($statuses[$status])) {
118             throw new moodle_exception('errorinvalidrequeststatus', 'tool_dataprivacy');
119         }
120         return $statuses[$status];
121     }
123     /**
124      * Returns the key value-pairs of request status code and string value.
125      *
126      * @return array
127      */
128     public static function get_request_statuses() {
129         return [
130             api::DATAREQUEST_STATUS_PENDING => get_string('statuspending', 'tool_dataprivacy'),
131             api::DATAREQUEST_STATUS_PREPROCESSING => get_string('statuspreprocessing', 'tool_dataprivacy'),
132             api::DATAREQUEST_STATUS_AWAITING_APPROVAL => get_string('statusawaitingapproval', 'tool_dataprivacy'),
133             api::DATAREQUEST_STATUS_APPROVED => get_string('statusapproved', 'tool_dataprivacy'),
134             api::DATAREQUEST_STATUS_PROCESSING => get_string('statusprocessing', 'tool_dataprivacy'),
135             api::DATAREQUEST_STATUS_COMPLETE => get_string('statuscomplete', 'tool_dataprivacy'),
136             api::DATAREQUEST_STATUS_CANCELLED => get_string('statuscancelled', 'tool_dataprivacy'),
137             api::DATAREQUEST_STATUS_REJECTED => get_string('statusrejected', 'tool_dataprivacy'),
138         ];
139     }
141     /**
142      * Get the users that a user can make data request for.
143      *
144      * E.g. User having a parent role and has the 'tool/dataprivacy:makedatarequestsforchildren' capability.
145      * @param int $userid The user's ID.
146      * @return array
147      */
148     public static function get_children_of_user($userid) {
149         global $DB;
151         // Get users that the user has role assignments to.
152         $allusernames = get_all_user_name_fields(true, 'u');
153         $sql = "SELECT u.id, $allusernames
154                   FROM {role_assignments} ra, {context} c, {user} u
155                  WHERE ra.userid = :userid
156                        AND ra.contextid = c.id
157                        AND c.instanceid = u.id
158                        AND c.contextlevel = :contextlevel";
159         $params = [
160             'userid' => $userid,
161             'contextlevel' => CONTEXT_USER
162         ];
164         // The final list of users that we will return.
165         $finalresults = [];
167         // Our prospective list of users.
168         if ($candidates = $DB->get_records_sql($sql, $params)) {
169             foreach ($candidates as $key => $child) {
170                 $childcontext = \context_user::instance($child->id);
171                 if (has_capability('tool/dataprivacy:makedatarequestsforchildren', $childcontext, $userid)) {
172                     $finalresults[$key] = $child;
173                 }
174             }
175         }
176         return $finalresults;
177     }
179     /**
180      * Get options for the data requests filter.
181      *
182      * @return array
183      * @throws coding_exception
184      */
185     public static function get_request_filter_options() {
186         $filters = [
187             self::FILTER_TYPE => (object)[
188                 'name' => get_string('requesttype', 'tool_dataprivacy'),
189                 'options' => self::get_request_types_short()
190             ],
191             self::FILTER_STATUS => (object)[
192                 'name' => get_string('requeststatus', 'tool_dataprivacy'),
193                 'options' => self::get_request_statuses()
194             ],
195         ];
196         $options = [];
197         foreach ($filters as $category => $filtercategory) {
198             foreach ($filtercategory->options as $key => $name) {
199                 $option = (object)[
200                     'category' => $filtercategory->name,
201                     'name' => $name
202                 ];
203                 $options["{$category}:{$key}"] = get_string('filteroption', 'tool_dataprivacy', $option);
204             }
205         }
206         return $options;
207     }