MDL-59890 calendar: Exporters support for categories
[moodle.git] / calendar / classes / external / event_exporter_base.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  * Contains event class for displaying a calendar event.
19  *
20  * @package   core_calendar
21  * @copyright 2017 Ryan Wyllie <ryan@moodle.com>
22  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 namespace core_calendar\external;
27 defined('MOODLE_INTERNAL') || die();
29 require_once($CFG->dirroot . "/calendar/lib.php");
30 require_once($CFG->libdir . "/filelib.php");
32 use \core\external\exporter;
33 use \core_calendar\local\event\container;
34 use \core_calendar\local\event\entities\event_interface;
35 use \core_calendar\local\event\entities\action_event_interface;
36 use \core_course\external\course_summary_exporter;
37 use \core\external\coursecat_summary_exporter;
38 use \renderer_base;
39 use moodle_url;
41 /**
42  * Class for displaying a calendar event.
43  *
44  * @package   core_calendar
45  * @copyright 2017 Ryan Wyllie <ryan@moodle.com>
46  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
47  */
48 class event_exporter_base extends exporter {
50     /**
51      * @var event_interface $event
52      */
53     protected $event;
55     /**
56      * Constructor.
57      *
58      * @param event_interface $event
59      * @param array $related The related data.
60      */
61     public function __construct(event_interface $event, $related = []) {
62         $this->event = $event;
64         $starttimestamp = $event->get_times()->get_start_time()->getTimestamp();
65         $endtimestamp = $event->get_times()->get_end_time()->getTimestamp();
66         $groupid = $event->get_group() ? $event->get_group()->get('id') : null;
67         $userid = $event->get_user() ? $event->get_user()->get('id') : null;
68         $categoryid = $event->get_category() ? $event->get_category()->get('id') : null;
70         $data = new \stdClass();
71         $data->id = $event->get_id();
72         $data->name = $event->get_name();
73         $data->description = file_rewrite_pluginfile_urls(
74             $event->get_description()->get_value(),
75             'pluginfile.php',
76             $related['context']->id,
77             'calendar',
78             'event_description',
79             $event->get_id()
80         );
81         $data->descriptionformat = $event->get_description()->get_format();
82         $data->groupid = $groupid;
83         $data->userid = $userid;
84         $data->categoryid = $categoryid;
85         $data->eventtype = $event->get_type();
86         $data->timestart = $starttimestamp;
87         $data->timeduration = $endtimestamp - $starttimestamp;
88         $data->timesort = $event->get_times()->get_sort_time()->getTimestamp();
89         $data->visible = $event->is_visible() ? 1 : 0;
90         $data->timemodified = $event->get_times()->get_modified_time()->getTimestamp();
92         if ($repeats = $event->get_repeats()) {
93             $data->repeatid = $repeats->get_id();
94             $data->eventcount = $repeats->get_num() + 1;
95         }
97         if ($cm = $event->get_course_module()) {
98             $data->modulename = $cm->get('modname');
99             $data->instance = $cm->get('id');
100         }
102         parent::__construct($data, $related);
103     }
105     /**
106      * Return the list of properties.
107      *
108      * @return array
109      */
110     protected static function define_properties() {
111         return [
112             'id' => ['type' => PARAM_INT],
113             'name' => ['type' => PARAM_TEXT],
114             'description' => [
115                 'type' => PARAM_RAW,
116                 'optional' => true,
117                 'default' => null,
118                 'null' => NULL_ALLOWED
119             ],
120             'descriptionformat' => [
121                 'type' => PARAM_INT,
122                 'optional' => true,
123                 'default' => null,
124                 'null' => NULL_ALLOWED
125             ],
126             'categoryid' => [
127                 'type' => PARAM_INT,
128                 'optional' => true,
129                 'default' => null,
130                 'null' => NULL_ALLOWED
131             ],
132             'groupid' => [
133                 'type' => PARAM_INT,
134                 'optional' => true,
135                 'default' => null,
136                 'null' => NULL_ALLOWED
137             ],
138             'userid' => [
139                 'type' => PARAM_INT,
140                 'optional' => true,
141                 'default' => null,
142                 'null' => NULL_ALLOWED
143             ],
144             'repeatid' => [
145                 'type' => PARAM_INT,
146                 'optional' => true,
147                 'default' => null,
148                 'null' => NULL_ALLOWED
149             ],
150             'eventcount' => [
151                 'type' => PARAM_INT,
152                 'optional' => true,
153                 'default' => null,
154                 'null' => NULL_ALLOWED
155             ],
156             'modulename' => [
157                 'type' => PARAM_TEXT,
158                 'optional' => true,
159                 'default' => null,
160                 'null' => NULL_ALLOWED
161             ],
162             'instance' => [
163                 'type' => PARAM_INT,
164                 'optional' => true,
165                 'default' => null,
166                 'null' => NULL_ALLOWED
167             ],
168             'eventtype' => ['type' => PARAM_TEXT],
169             'timestart' => ['type' => PARAM_INT],
170             'timeduration' => ['type' => PARAM_INT],
171             'timesort' => ['type' => PARAM_INT],
172             'visible' => ['type' => PARAM_INT],
173             'timemodified' => ['type' => PARAM_INT],
174         ];
175     }
177     /**
178      * Return the list of additional properties.
179      *
180      * @return array
181      */
182     protected static function define_other_properties() {
183         return [
184             'icon' => [
185                 'type' => event_icon_exporter::read_properties_definition(),
186             ],
187             'category' => [
188                 'type' => coursecat_summary_exporter::read_properties_definition(),
189                 'optional' => true,
190             ],
191             'course' => [
192                 'type' => course_summary_exporter::read_properties_definition(),
193                 'optional' => true,
194             ],
195             'subscription' => [
196                 'type' => event_subscription_exporter::read_properties_definition(),
197                 'optional' => true,
198             ],
199             'canedit' => [
200                 'type' => PARAM_BOOL
201             ],
202             'candelete' => [
203                 'type' => PARAM_BOOL
204             ],
205             'deleteurl' => [
206                 'type' => PARAM_URL
207             ],
208             'editurl' => [
209                 'type' => PARAM_URL
210             ],
211             'formattedtime' => [
212                 'type' => PARAM_RAW,
213             ],
214             'isactionevent' => [
215                 'type' => PARAM_BOOL
216             ],
217             'iscourseevent' => [
218                 'type' => PARAM_BOOL
219             ],
220             'groupname' => [
221                 'type' => PARAM_RAW,
222                 'optional' => true,
223                 'default' => null,
224                 'null' => NULL_ALLOWED
225             ],
226         ];
227     }
229     /**
230      * Get the additional values to inject while exporting.
231      *
232      * @param renderer_base $output The renderer.
233      * @return array Keys are the property names, values are their values.
234      */
235     protected function get_other_values(renderer_base $output) {
236         $values = [];
237         $event = $this->event;
238         $legacyevent = container::get_event_mapper()->from_event_to_legacy_event($event);
239         $context = $this->related['context'];
240         $values['isactionevent'] = false;
241         $values['iscourseevent'] = false;
242         if ($moduleproxy = $event->get_course_module()) {
243             $values['isactionevent'] = true;
244         } else if ($event->get_type() == 'course') {
245             $values['iscourseevent'] = true;
246         }
247         $timesort = $event->get_times()->get_sort_time()->getTimestamp();
248         $iconexporter = new event_icon_exporter($event, ['context' => $context]);
250         $values['icon'] = $iconexporter->export($output);
252         $subscriptionexporter = new event_subscription_exporter($event);
253         $values['subscription'] = $subscriptionexporter->export($output);
255         $proxy = $this->event->get_category();
256         if ($proxy && $proxy->get('id')) {
257             $category = $proxy->get_proxied_instance();
258             $categorysummaryexporter = new coursecat_summary_exporter($category, ['context' => $context]);
259             $values['category'] = $categorysummaryexporter->export($output);
260         }
262         if ($course = $this->related['course']) {
263             $coursesummaryexporter = new course_summary_exporter($course, ['context' => $context]);
264             $values['course'] = $coursesummaryexporter->export($output);
265         }
266         $courseid = (!$course) ? SITEID : $course->id;
268         $values['canedit'] = calendar_edit_event_allowed($legacyevent, true);
269         $values['candelete'] = calendar_delete_event_allowed($legacyevent);
271         $deleteurl = new moodle_url('/calendar/delete.php', ['id' => $event->get_id(), 'course' => $courseid]);
272         $values['deleteurl'] = $deleteurl->out(false);
274         $editurl = new moodle_url('/calendar/event.php', ['action' => 'edit', 'id' => $event->get_id(),
275                 'course' => $courseid]);
276         $values['editurl'] = $editurl->out(false);
277         $values['formattedtime'] = calendar_format_event_time($legacyevent, time(), null, false,
278                 $timesort);
280         if ($course = $this->related['course']) {
281             $coursesummaryexporter = new course_summary_exporter($course, ['context' => $context]);
282             $values['course'] = $coursesummaryexporter->export($output);
283         }
285         if ($group = $event->get_group()) {
286             $values['groupname'] = format_string($group->get('name'), true,
287                 ['context' => \context_course::instance($event->get_course()->get('id'))]);
288         }
289         return $values;
290     }
292     /**
293      * Returns a list of objects that are related.
294      *
295      * @return array
296      */
297     protected static function define_related() {
298         return [
299             'context' => 'context',
300             'course' => 'stdClass?',
301         ];
302     }