diff options
Diffstat (limited to 'lib/models/CourseEvent.class.php')
| -rw-r--r-- | lib/models/CourseEvent.class.php | 596 |
1 files changed, 0 insertions, 596 deletions
diff --git a/lib/models/CourseEvent.class.php b/lib/models/CourseEvent.class.php deleted file mode 100644 index fa68b13..0000000 --- a/lib/models/CourseEvent.class.php +++ /dev/null @@ -1,596 +0,0 @@ -<?php -/** - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * @author Peter Thienel <thienel@data-quest.de> - * @copyright 2014 Stud.IP Core-Group - * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 - * @category Stud.IP - * - * @property string $id alias for pk - * @property string $termin_id database column - * @property string $event_id alias column for termin_id - * @property string $range_id database column - * @property string $sem_id alias column for range_id - * @property string $autor_id database column - * @property string $author_id alias column for autor_id - * @property string $content database column - * @property int $date database column - * @property int $start alias column for date - * @property int $end_time database column - * @property int $end alias column for end_time - * @property int $mkdate database column - * @property int $chdate database column - * @property int $date_typ database column - * @property int $category_intern alias column for date_typ - * @property string|null $raum database column - * @property string|null $metadate_id database column - * @property SimpleORMapCollection|Folder[] $folders has_many Folder - * @property SimpleORMapCollection|RoomRequest[] $room_requests has_many RoomRequest - * @property SimpleORMapCollection|ResourceRequestAppointment[] $resource_request_appointments has_many ResourceRequestAppointment - * @property User $author belongs_to User - * @property Course $course belongs_to Course - * @property SeminarCycleDate|null $cycle belongs_to SeminarCycleDate - * @property ResourceBooking $room_booking has_one ResourceBooking - * @property SimpleORMapCollection|CourseTopic[] $topics has_and_belongs_to_many CourseTopic - * @property SimpleORMapCollection|Statusgruppen[] $statusgruppen has_and_belongs_to_many Statusgruppen - * @property SimpleORMapCollection|User[] $dozenten has_and_belongs_to_many User - * @property-read mixed $location additional field - * @property mixed $type additional field - * @property-read mixed $name additional field - * @property-read mixed $title additional field - * @property-read mixed $editor_id additional field - * @property-read mixed $uid additional field - * @property-read mixed $summary additional field - * @property-read mixed $description additional field - */ - -class CourseEvent extends CourseDate implements Event -{ - protected static function configure($config = []) - { - $config['alias_fields']['event_id'] = 'termin_id'; - $config['alias_fields']['start'] = 'date'; - $config['alias_fields']['end'] = 'end_time'; - $config['alias_fields']['category_intern'] = 'date_typ'; - $config['alias_fields']['author_id'] = 'autor_id'; - $config['alias_fields']['sem_id'] = 'range_id'; - - $config['additional_fields']['location']['get'] = 'getRoomName'; - $config['additional_fields']['type'] = true; - $config['additional_fields']['name']['get'] = function ($event) { - return $event->course->getFullname(); - }; - $config['additional_fields']['title']['get'] = 'getTitle'; - $config['additional_fields']['editor_id']['get'] = function ($date) { - return null; - }; - $config['additional_fields']['uid']['get'] = function ($date) { - $host = $_SERVER['SERVER_NAME'] ?? parse_url($GLOBALS['ABSOLUTE_URI_STUDIP'], PHP_URL_HOST); - return 'Stud.IP-SEM-' . $date->getId() . '@' . $host; - }; - $config['additional_fields']['summary']['get'] = function ($date) { - return $date->course->name; - }; - $config['additional_fields']['description']['get'] = function ($date) { - return ''; - }; - parent::configure($config); - } - - private $properties = null; - private $permission_user_id = null; - - public function __construct($id = null) - { - $this->permission_user_id = $GLOBALS['user']->id; - parent::__construct($id); - } - - /** - * Returns all CourseEvents in the given time range for the given range_id. - * - * @param string $user_id Id of Stud.IP object from type user, course, inst - * @param DateTime $start The start date time. - * @param DateTime $end The end date time. - * @return SimpleORMapCollection Collection of found CourseEvents. - */ - public static function getEventsByInterval($user_id, DateTime $start, dateTime $end) - { - $stmt = DBManager::get()->prepare('SELECT termine.* FROM seminar_user ' - . 'INNER JOIN termine ON seminar_id = range_id ' - . 'WHERE user_id = :user_id ' - . 'AND bind_calendar = 1 ' - . 'AND date BETWEEN :start AND :end ' - . "AND (IFNULL(metadate_id, '') = '' " - . 'OR metadate_id NOT IN ( ' - . 'SELECT metadate_id FROM schedule_seminare ' - . 'WHERE user_id = :user_id AND visible = 0) ) ' - . 'ORDER BY date ASC'); - $stmt->execute([ - ':user_id' => $user_id, - ':start' => $start->getTimestamp(), - ':end' => $end->getTimestamp() - ]); - $event_collection = []; - foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) { - $event = new CourseEvent(); - $event->setData($row); - $event->setNew(false); - // related persons (dozenten) or groups - if (self::checkRelated($event, $user_id)) { - $event_collection[] = $event; - } - } - $event_collection = SimpleORMapCollection::createFromArray($event_collection, false); - $event_collection->setClassName('Event'); - return $event_collection; - } - - /** - * Checks if given user is the responsible lecturer or is member of a - * related group - * - * @global object $perm The globa perm object. - * @param CourseEvent $event The course event to check against. - * @param string $user_id The id of the user. - * @return boolean - */ - protected static function checkRelated(CourseEvent $event, $user_id) - { - global $perm; - - $check_related = false; - $permission = $perm->get_studip_perm($event->range_id, $user_id); - switch ($permission) { - case 'dozent' : - $related_persons = $event->dozenten->pluck('user_id'); - if (sizeof($related_persons)) { - if (in_array($user_id, $related_persons)) { - $check_related = true; - } - } else { - $check_related = true; - } - break; - case 'tutor' : - $check_related = true; - break; - default : - $group_ids = $event->statusgruppen->pluck('statusgruppe_id'); - if (sizeof($group_ids)) { - $member = StatusgruppeUser::findBySQL( - 'statusgruppe_id IN(?) AND user_id = ?', - [$group_ids, $user_id]); - $check_related = sizeof($member) > 0; - } else { - $check_related = true; - } - } - return $check_related; - } - - /** - * Returns the name of the category. - * - * @return array|string the name of the category - */ - public function toStringCategories($as_array = false) - { - $category = ''; - if ( - $this->havePermission(Event::PERMISSION_READABLE) - && !empty($GLOBALS['TERMIN_TYP'][$this->getCategory()]) - ) { - $category = $GLOBALS['TERMIN_TYP'][$this->getCategory()]['name']; - } - return $as_array ? [$category] : $category; - } - - /** - * Returns the id of the related course - * - * @return string The id of the related course. - */ - public function getSeminarId() - { - if ($this->havePermission(Event::PERMISSION_READABLE)) { - return $this->sem_id; - } - return null; - } - - /** - * Returns an array that represents the recurrence rule for this event. - * If an index is given, returns only this field of the rule. - * - * @return array|string The array with th recurrence rule or only one field. - */ - public function getRecurrence($index = null) - { - $rep = ['ts' => 0, 'linterval' => 0, 'sinterval' => 0, 'wdays' => '', - 'month' => 0, 'day' => 0, 'rtype' => 'SINGLE', 'duration' => 1]; - return $index ? $rep[$index] : $rep; - } - - /** - * Returns the name of the related course. - * - * @return string The name of the related course. - */ - public function getSemName() - { - if ($this->havePermission(Event::PERMISSION_READABLE)) { - return $this->course->name; - } - return ''; - } - - /** - * TODO Wird das noch benötigt? - */ - public function getType() - { - return 1; - } - - /** - * Returns the title of this event. - * The title of a course event is the name of the course or if a topic is - * assigned, the title of this topic. If the user has not the permission - * Event::PERMISSION_READABLE, the title is "Keine Berechtigung.". - * - * @return string - */ - public function getTitle() - { - $title = _('Keine Berechtigung.'); - if ($this->havePermission(Event::PERMISSION_READABLE)) { - $description = $this->cycle ? trim($this->cycle->description) : ''; - if (sizeof($this->topics)) { - $title = $this->course->name.": ".implode(', ', $this->topics->pluck('title')); - } else { - $title = $this->course->name; - } - $title = ($description ? $description . ', ' : '') . $title; - } - return $title; - } - - /** - * Returns the starttime as unix timestamp of this event. - * - * @return int The starttime of this event as a unix timestamp. - */ - public function getStart() - { - return $this->date; - } - - /** - * Sets the start date time with given unix timestamp. - * - * @param string $timestamp Unix timestamp. - */ - public function setStart($timestamp) - { - $this->date = $timestamp; - } - - /** - * Returns the endtime of this event. - * - * @return int The endtime of this event as a unix timestamp. - */ - public function getEnd() - { - return $this->end_time; - } - - /** - * Sets the end date time by given unix timestamp. - * - * @param string $timestamp Unix timestamp. - */ - public function setEnd($timestamp) - { - $this->end_time = $timestamp; - } - - /** - * Returns the duration of this event in seconds. - * - * @return int the duration of this event in seconds - */ - function getDuration() - { - return $this->end - $this->start; - } - - /** - * Returns the location. - * Without permission or the location is not set an empty string is returned. - * - * @see ClendarDate::getRoomName() - * @return string The location - */ - function getLocation() - { - $location = ''; - if ($this->havePermission(Event::PERMISSION_READABLE)) { - $location = $this->getRoomName(); - } - return $location; - } - - /** - * Returns the global unique id of this event. - * - * @return string The global unique id. - */ - public function getUid() - { - return $this->uid; - } - - /** - * Returns the description of the topic. - * If the user has no permission or the event has no topic - * or the topics have no descritopn an empty string is returned. - * - * @return String the description - */ - function getDescription() - { - $description = ''; - if ($this->havePermission(Event::PERMISSION_READABLE)) { - $descriptions = $this->topics->map(function ($topic) { - $desc = $topic->title . "\n"; - $desc .= $topic->description; - }); - $description = implode("\n\n", $descriptions); - } - return $description; - } - - /** - * Returns the Stud.IP build in category as integer value. - * If the user has no permission, 255 is returned. - * - * @See config.inc.php $PERS_TERMIN - * @return int the categories - */ - public function getStudipCategory() - { - if ($this->havePermission(Event::PERMISSION_READABLE)) { - return $this->date_typ; - } - return 255; - } - - /** - * Returns the index of the category. - * If the user has no permission, 255 is returned. - * - * TODO remove? use getStudipCategory instead? - * - * @see config/config.inc.php $TERMIN_TYP - * @return int The index of the category - */ - public function getCategory() - { - if ($this->havePermission(Event::PERMISSION_READABLE)) { - return $this->date_typ; - } - return 255; - } - - /** - * Returns the user id of the last editor. - * Since course events have no editor null is returned. - * - * @return null|int Returns always null. - */ - public function getEditorId() - { - return null; - } - - /** - * Returns whether the event is a all day event. - * - * @return - */ - public function isDayEvent() - { - return (($this->end - $this->start) / 60 / 60) > 23; - } - - /** - * Returns the accessibility of this event. The value is not influenced by - * the permission of the actual user. - * - * According to RFC5545 the accessibility (property CLASS) is represented - * by the 3 state PUBLIC, PRIVATE and CONFIDENTIAL - * - * TODO check this statement: - * An course event is always CONFIDENTIAL - * - * @return string The accessibility as string. - */ - public function getAccessibility() - { - return 'CONFIDENTIAL'; - } - - /** - * Returns the unix timestamp of the last change. - * - * @access public - */ - public function getChangeDate() - { - return $this->chdate; - } - - /** - * Returns the date time the event was imported. - * Since course events are not imported normaly, returns the date time - * of creation. - * - * @return int Date time of import as unix timestamp: - */ - public function getImportDate() - { - return $this->mkdate; - } - - /** - * Returns all related groups. - * - * TODO remove, use direct access to field CourseDate::statusgruppen. - * - * @return SimpleORMapCollection The collection of statusgruppen. - */ - public function getRelatedGroups() - { - return $this->statusgruppen; - } - - public function getProperties() - { - if ($this->properties === null) { - $this->properties = [ - 'DTSTART' => $this->getStart(), - 'DTEND' => $this->getEnd(), - 'SUMMARY' => $this->getTitle(), - 'DESCRIPTION' => $this->getDescription(), - 'LOCATION' => $this->getLocation(), - 'CATEGORIES' => $this->toStringCategories(), - 'STUDIP_CATEGORY' => $this->getStudipCategory(), - 'CREATED' => $this->mkdate, - 'LAST-MODIFIED' => $this->chdate, - 'STUDIP_ID' => $this->termin_id, - 'SEM_ID' => $this->range_id, - 'SEMNAME' => $this->course->name, - 'CLASS' => 'CONFIDENTIAL', - 'UID' => CourseEvent::getUid(), - 'RRULE' => CourseEvent::getRecurrence(), - 'EXDATE' => '', - 'EVENT_TYPE' => 'sem', - 'STATUS' => 'CONFIRMED', - 'DTSTAMP' => time()]; - } - return $this->properties; - } - - /** - * Returns the value of property with given name. - * - * @param type $name See CalendarEvent::getProperties() for accepted values. - * @return mixed The value of the property. - * @throws InvalidArgumentException - */ - public function getProperty($name) - { - if ($this->properties === null) { - $this->getProperties(); - } - - if (isset($this->properties[$name])) { - return $this->properties[$name]; - } - throw new InvalidArgumentException(get_class($this) - . ': Property ' . $name . ' does not exist.'); - } - - public function setPermissionUser($user_id) - { - $this->permission_user_id = $user_id; - } - - public function havePermission($permission, $user_id = null) - { - $perm = $this->getPermission($user_id); - return $perm >= $permission; - } - - public function getPermission($user_id = null) - { - global $perm; - - $user_id = $user_id ?: $this->permission_user_id; - $course_perm = $perm->get_studip_perm($this->range_id, $user_id); - $permission = Event::PERMISSION_FORBIDDEN; - switch ($course_perm) { - case 'tutor': - case 'dozent': - $permission = Event::PERMISSION_WRITABLE; - break; - case 'user': - case 'autor': - $permission = Event::PERMISSION_READABLE; - break; - default: - $permission = Event::PERMISSION_FORBIDDEN; - } - - return $permission; - } - - /** - * Course events have no priority so returns always an empty string. - * - * @return string The priority as a string. - */ - public function toStringPriority() - { - return ''; - } - - /** - * Course events have no accessibility settings so returns always the - * an empty string. - * - * @return string The accessibility as string. - */ - public function toStringAccessibility() - { - return ''; - } - - /** - * Returns a string representation of the recurrence rule. - * Since course events have no recurence defined it returns an empty string. - * - * @param bool $only_type If true returns only the type of recurrence. - * @return string The recurrence rule - human readable - */ - public function toStringRecurrence($only_type = false) - { - return ''; - } - - /** - * Returns the author of this event as user object. - * - * @return User|null User object. - */ - public function getAuthor() - { - return $this->author; - } - - /** - * Course events have no editor so always null is returned. - * - * @return null - */ - public function getEditor() - { - return null; - } -} |
