MDL-37624 calendar: Added location support
[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->location = htmlspecialchars($event->get_location());
83         $data->groupid = $groupid;
84         $data->userid = $userid;
85         $data->categoryid = $categoryid;
86         $data->eventtype = $event->get_type();
87         $data->timestart = $starttimestamp;
88         $data->timeduration = $endtimestamp - $starttimestamp;
89         $data->timesort = $event->get_times()->get_sort_time()->getTimestamp();
90         $data->visible = $event->is_visible() ? 1 : 0;
91         $data->timemodified = $event->get_times()->get_modified_time()->getTimestamp();
93         if ($repeats = $event->get_repeats()) {
94             $data->repeatid = $repeats->get_id();
95             $data->eventcount = $repeats->get_num() + 1;
96         }
98         if ($cm = $event->get_course_module()) {
99             $data->modulename = $cm->get('modname');
100             $data->instance = $cm->get('id');
101         }
103         parent::__construct($data, $related);
104     }
106     /**
107      * Return the list of properties.
108      *
109      * @return array
110      */
111     protected static function define_properties() {
112         return [
113             'id' => ['type' => PARAM_INT],
114             'name' => ['type' => PARAM_TEXT],
115             'description' => [
116                 'type' => PARAM_RAW,
117                 'optional' => true,
118                 'default' => null,
119                 'null' => NULL_ALLOWED
120             ],
121             'descriptionformat' => [
122                 'type' => PARAM_INT,
123                 'optional' => true,
124                 'default' => null,
125                 'null' => NULL_ALLOWED
126             ],
127             'location' => [
128                 'type' => PARAM_RAW_TRIMMED,
129                 'optional' => true,
130                 'default' => null,
131                 'null' => NULL_ALLOWED
132             ],
133             'categoryid' => [
134                 'type' => PARAM_INT,
135                 'optional' => true,
136                 'default' => null,
137                 'null' => NULL_ALLOWED
138             ],
139             'groupid' => [
140                 'type' => PARAM_INT,
141                 'optional' => true,
142                 'default' => null,
143                 'null' => NULL_ALLOWED
144             ],
145             'userid' => [
146                 'type' => PARAM_INT,
147                 'optional' => true,
148                 'default' => null,
149                 'null' => NULL_ALLOWED
150             ],
151             'repeatid' => [
152                 'type' => PARAM_INT,
153                 'optional' => true,
154                 'default' => null,
155                 'null' => NULL_ALLOWED
156             ],
157             'eventcount' => [
158                 'type' => PARAM_INT,
159                 'optional' => true,
160                 'default' => null,
161                 'null' => NULL_ALLOWED
162             ],
163             'modulename' => [
164                 'type' => PARAM_TEXT,
165                 'optional' => true,
166                 'default' => null,
167                 'null' => NULL_ALLOWED
168             ],
169             'instance' => [
170                 'type' => PARAM_INT,
171                 'optional' => true,
172                 'default' => null,
173                 'null' => NULL_ALLOWED
174             ],
175             'eventtype' => ['type' => PARAM_TEXT],
176             'timestart' => ['type' => PARAM_INT],
177             'timeduration' => ['type' => PARAM_INT],
178             'timesort' => ['type' => PARAM_INT],
179             'visible' => ['type' => PARAM_INT],
180             'timemodified' => ['type' => PARAM_INT],
181         ];
182     }
184     /**
185      * Return the list of additional properties.
186      *
187      * @return array
188      */
189     protected static function define_other_properties() {
190         return [
191             'icon' => [
192                 'type' => event_icon_exporter::read_properties_definition(),
193             ],
194             'category' => [
195                 'type' => coursecat_summary_exporter::read_properties_definition(),
196                 'optional' => true,
197             ],
198             'course' => [
199                 'type' => course_summary_exporter::read_properties_definition(),
200                 'optional' => true,
201             ],
202             'subscription' => [
203                 'type' => event_subscription_exporter::read_properties_definition(),
204                 'optional' => true,
205             ],
206             'canedit' => [
207                 'type' => PARAM_BOOL
208             ],
209             'candelete' => [
210                 'type' => PARAM_BOOL
211             ],
212             'deleteurl' => [
213                 'type' => PARAM_URL
214             ],
215             'editurl' => [
216                 'type' => PARAM_URL
217             ],
218             'viewurl' => [
219                 'type' => PARAM_URL
220             ],
221             'formattedtime' => [
222                 'type' => PARAM_RAW,
223             ],
224             'isactionevent' => [
225                 'type' => PARAM_BOOL
226             ],
227             'iscourseevent' => [
228                 'type' => PARAM_BOOL
229             ],
230             'iscategoryevent' => [
231                 'type' => PARAM_BOOL
232             ],
233             'groupname' => [
234                 'type' => PARAM_RAW,
235                 'optional' => true,
236                 'default' => null,
237                 'null' => NULL_ALLOWED
238             ],
239         ];
240     }
242     /**
243      * Get the additional values to inject while exporting.
244      *
245      * @param renderer_base $output The renderer.
246      * @return array Keys are the property names, values are their values.
247      */
248     protected function get_other_values(renderer_base $output) {
249         $values = [];
250         $event = $this->event;
251         $legacyevent = container::get_event_mapper()->from_event_to_legacy_event($event);
252         $context = $this->related['context'];
253         $course = $this->related['course'];
254         $values['isactionevent'] = false;
255         $values['iscourseevent'] = false;
256         $values['iscategoryevent'] = false;
257         if ($moduleproxy = $event->get_course_module()) {
258             $values['isactionevent'] = true;
259         } else if ($event->get_type() == 'course') {
260             $values['iscourseevent'] = true;
261         } else if ($event->get_type() == 'category') {
262             $values['iscategoryevent'] = true;
263         }
264         $timesort = $event->get_times()->get_sort_time()->getTimestamp();
265         $iconexporter = new event_icon_exporter($event, ['context' => $context]);
267         $values['icon'] = $iconexporter->export($output);
269         $subscriptionexporter = new event_subscription_exporter($event);
270         $values['subscription'] = $subscriptionexporter->export($output);
272         $proxy = $this->event->get_category();
273         if ($proxy && $proxy->get('id')) {
274             $category = $proxy->get_proxied_instance();
275             $categorysummaryexporter = new coursecat_summary_exporter($category, ['context' => $context]);
276             $values['category'] = $categorysummaryexporter->export($output);
277         }
279         if ($course) {
280             $coursesummaryexporter = new course_summary_exporter($course, ['context' => $context]);
281             $values['course'] = $coursesummaryexporter->export($output);
282         }
284         $courseid = (!$course) ? SITEID : $course->id;
286         $values['canedit'] = calendar_edit_event_allowed($legacyevent, true);
287         $values['candelete'] = calendar_delete_event_allowed($legacyevent);
289         $deleteurl = new moodle_url('/calendar/delete.php', ['id' => $event->get_id(), 'course' => $courseid]);
290         $values['deleteurl'] = $deleteurl->out(false);
292         $editurl = new moodle_url('/calendar/event.php', ['action' => 'edit', 'id' => $event->get_id(),
293                 'course' => $courseid]);
294         $values['editurl'] = $editurl->out(false);
295         $viewurl = new moodle_url('/calendar/view.php', ['view' => 'day', 'course' => $courseid,
296                 'time' => $timesort]);
297         $viewurl->set_anchor('event_' . $event->get_id());
298         $values['viewurl'] = $viewurl->out(false);
299         $values['formattedtime'] = calendar_format_event_time($legacyevent, time(), null, false,
300                 $timesort);
302         if ($group = $event->get_group()) {
303             $values['groupname'] = format_string($group->get('name'), true,
304                 ['context' => \context_course::instance($event->get_course()->get('id'))]);
305         }
307         return $values;
308     }
310     /**
311      * Returns a list of objects that are related.
312      *
313      * @return array
314      */
315     protected static function define_related() {
316         return [
317             'context' => 'context',
318             'course' => 'stdClass?',
319         ];
320     }