MDL-61308 assign_submission: Privacy code for user rights.
[moodle.git] / mod / assign / submission / file / classes / privacy / provider.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  * Privacy class for requesting user data.
19  *
20  * @package    assignsubmission_file
21  * @copyright  2018 Adrian Greeve <adrian@moodle.com>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 namespace assignsubmission_file\privacy;
27 defined('MOODLE_INTERNAL') || die();
29 require_once($CFG->dirroot . '/mod/assign/locallib.php');
31 use \core_privacy\local\metadata\collection;
32 use \core_privacy\local\metadata\provider as metadataprovider;
33 use \core_privacy\local\request\writer;
34 use \core_privacy\local\request\contextlist;
35 use \mod_assign\privacy\assign_plugin_request_data;
37 /**
38  * Privacy class for requesting user data.
39  *
40  * @package    assignsubmission_file
41  * @copyright  2018 Adrian Greeve <adrian@moodle.com>
42  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
43  */
44 class provider implements metadataprovider, \mod_assign\privacy\assignsubmission_provider {
46     /**
47      * Return meta data about this plugin.
48      *
49      * @param  collection $collection A list of information to add to.
50      * @return collection Return the collection after adding to it.
51      */
52     public static function get_metadata(collection $collection) : collection {
53         $collection->link_subsystem('core_files', 'privacy:metadata:filepurpose');
54         return $collection;
55     }
57     /**
58      * This is covered by mod_assign provider and the query on assign_submissions.
59      *
60      * @param  int $userid The user ID that we are finding contexts for.
61      * @param  contextlist $contextlist A context list to add sql and params to for contexts.
62      */
63     public static function get_context_for_userid_within_submission(int $userid, contextlist $contextlist) {
64         // This is already fetched from mod_assign.
65     }
67     /**
68      * This is also covered by the mod_assign provider and it's queries.
69      *
70      * @param  \mod_assign\privacy\useridlist $useridlist An object for obtaining user IDs of students.
71      */
72     public static function get_student_user_ids(\mod_assign\privacy\useridlist $useridlist) {
73         // No need.
74     }
76     /**
77      * Export all user data for this plugin.
78      *
79      * @param  assign_plugin_request_data $exportdata Data used to determine which context and user to export and other useful
80      * information to help with exporting.
81      */
82     public static function export_submission_user_data(assign_plugin_request_data $exportdata) {
83         // We currently don't show submissions to teachers when exporting their data.
84         $context = $exportdata->get_context();
85         if ($exportdata->get_user() != null) {
86             return null;
87         }
88         $user = new \stdClass();
89         $assign = $exportdata->get_assign();
90         $plugin = $assign->get_plugin_by_type('assignsubmission', 'file');
91         $files = $plugin->get_files($exportdata->get_pluginobject(), $user);
92         foreach ($files as $file) {
93             $userid = $exportdata->get_pluginobject()->userid;
94             writer::with_context($exportdata->get_context())->export_file($exportdata->get_subcontext(), $file);
96             // Plagiarism data.
97             $coursecontext = $context->get_course_context();
98             \core_plagiarism\privacy\provider::export_plagiarism_user_data($userid, $context, $exportdata->get_subcontext(), [
99                 'cmid' => $context->instanceid,
100                 'course' => $coursecontext->instanceid,
101                 'userid' => $userid,
102                 'file' => $file
103             ]);
104         }
105     }
107     /**
108      * Any call to this method should delete all user data for the context defined in the deletion_criteria.
109      *
110      * @param  assign_plugin_request_data $requestdata Information useful for deleting user data.
111      */
112     public static function delete_submission_for_context(assign_plugin_request_data $requestdata) {
113         global $DB;
115         \core_plagiarism\privacy\provider::delete_plagiarism_for_context($requestdata->get_context());
117         $fs = get_file_storage();
118         $fs->delete_area_files($requestdata->get_context()->id, 'assignsubmission_file', ASSIGNSUBMISSION_FILE_FILEAREA);
120         // Delete records from assignsubmission_file table.
121         $DB->delete_records('assignsubmission_file', ['assignment' => $requestdata->get_assign()->get_instance()->id]);
122     }
124     /**
125      * A call to this method should delete user data (where practicle) using the userid and submission.
126      *
127      * @param  assign_plugin_request_data $deletedata Details about the user and context to focus the deletion.
128      */
129     public static function delete_submission_for_userid(assign_plugin_request_data $deletedata) {
130         global $DB;
132         \core_plagiarism\privacy\provider::delete_plagiarism_for_user($deletedata->get_user()->id, $deletedata->get_context());
134         $submissionid = $deletedata->get_pluginobject()->id;
136         $fs = get_file_storage();
137         $fs->delete_area_files($deletedata->get_context()->id, 'assignsubmission_file', ASSIGNSUBMISSION_FILE_FILEAREA,
138                 $submissionid);
140         $DB->delete_records('assignsubmission_file', ['assignment' => $deletedata->get_assign()->get_instance()->id,
141                 'submission' => $submissionid]);
142     }