5ac228deb1bec46320cf6bfb998b0ad6bf331628
[moodle.git] / admin / tool / dataprivacy / classes / expired_context.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  * Class that represents an expired context.
19  *
20  * @package    tool_dataprivacy
21  * @copyright  2018 David Monllao
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
24 namespace tool_dataprivacy;
25 use dml_exception;
27 defined('MOODLE_INTERNAL') || die();
29 /**
30  * Class that represents an expired context.
31  *
32  * @copyright  2018 David Monllao
33  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
34  */
35 class expired_context extends \core\persistent {
37     /**
38      * Database table.
39      */
40     const TABLE = 'tool_dataprivacy_ctxexpired';
42     /**
43      * Expired contexts with no delete action scheduled.
44      */
45     const STATUS_EXPIRED = 0;
47     /**
48      * Expired contexts approved for deletion.
49      */
50     const STATUS_APPROVED = 1;
52     /**
53      * Already processed expired contexts.
54      */
55     const STATUS_CLEANED = 2;
57     /**
58      * Return the definition of the properties of this model.
59      *
60      * @return array
61      */
62     protected static function define_properties() {
63         return array(
64             'contextid' => array(
65                 'type' => PARAM_INT,
66                 'description' => 'The context id.',
67             ),
68             'status' => array(
69                 'choices' => [
70                     self::STATUS_EXPIRED,
71                     self::STATUS_APPROVED,
72                     self::STATUS_CLEANED,
73                 ],
74                 'type' => PARAM_INT,
75                 'description' => 'The deletion status of the context.',
76             ),
77         );
78     }
80     /**
81      * Returns expired_contexts instances that match the provided level and status.
82      *
83      * @param int $contextlevel The context level filter criterion.
84      * @param bool $status The expired context record's status.
85      * @param string $sort The sort column. Must match the column name in {tool_dataprivacy_ctxexpired} table
86      * @param int $offset The query offset.
87      * @param int $limit The query limit.
88      * @return expired_context[]
89      * @throws dml_exception
90      */
91     public static function get_records_by_contextlevel($contextlevel = null, $status = false, $sort = 'timecreated',
92                                                        $offset = 0, $limit = 0) {
93         global $DB;
95         $sql = "SELECT expiredctx.*
96                   FROM {" . self::TABLE . "} expiredctx
97                   JOIN {context} ctx
98                     ON ctx.id = expiredctx.contextid";
99         $params = [];
100         $conditions = [];
102         if (!empty($contextlevel)) {
103             $conditions[] = "ctx.contextlevel = :contextlevel";
104             $params['contextlevel'] = intval($contextlevel);
105         }
107         if ($status !== false) {
108             $conditions[] = "expiredctx.status = :status";
109             $params['status'] = intval($status);
110         }
112         if (!empty($conditions)) {
113             $sql .= ' WHERE ' . implode(' AND ', $conditions);
114         }
115         $sql .= " ORDER BY expiredctx.{$sort}";
117         $records = $DB->get_records_sql($sql, $params, $offset, $limit);
119         // We return class instances.
120         $instances = array();
121         foreach ($records as $key => $record) {
122             $instances[$key] = new static(0, $record);
123         }
125         return $instances;
126     }
128     /**
129      * Returns the number of expired_contexts instances that match the provided level and status.
130      *
131      * @param int $contextlevel
132      * @param bool $status
133      * @return int
134      * @throws dml_exception
135      */
136     public static function get_record_count_by_contextlevel($contextlevel = null, $status = false) {
137         global $DB;
139         $sql = "SELECT COUNT(1)
140                   FROM {" . self::TABLE . "} expiredctx
141                   JOIN {context} ctx
142                     ON ctx.id = expiredctx.contextid";
144         $conditions = [];
145         $params = [];
147         if (!empty($contextlevel)) {
148             $conditions[] = "ctx.contextlevel = :contextlevel";
149             $params['contextlevel'] = intval($contextlevel);
150         }
152         if ($status !== false) {
153             $sql .= " AND expiredctx.status = :status";
154             $params['status'] = intval($status);
155         }
156         if (!empty($conditions)) {
157             $sql .= ' WHERE ' . implode(' AND ', $conditions);
158         }
160         return $DB->count_records_sql($sql, $params);
161     }
163     /**
164      * Create a new expired_context based on the context, and expiry_info object.
165      *
166      * @param   \context        $context
167      * @param   expiry_info     $info
168      * @return  expired_context
169      */
170     public static function create_from_expiry_info(\context $context, expiry_info $info) : expired_context {
171         $record = (object) [
172             'contextid' => $context->id,
173             'status' => self::STATUS_EXPIRED,
174         ];
176         $expiredcontext = new static(0, $record);
177         $expiredcontext->save();
179         return $expiredcontext;
180     }
182     /**
183      * Update the expired_context from an expiry_info object which relates to this context.
184      *
185      * @param   expiry_info     $info
186      * @return  $this
187      */
188     public function update_from_expiry_info(expiry_info $info) : expired_context {
189         return $this;
190     }
192     /**
193      * Check whether this expired_context record is in a state ready for deletion to actually take place.
194      *
195      * @return  bool
196      */
197     public function can_process_deletion() : bool {
198         return ($this->get('status') == self::STATUS_APPROVED);
199     }
201     /**
202      * Check whether this expired_context record has already been cleaned.
203      *
204      * @return  bool
205      */
206     public function is_complete() : bool {
207         return ($this->get('status') == self::STATUS_CLEANED);
208     }