Skip to content
Snippets Groups Projects
Commit eb6fcd5c authored by Peter Thienel's avatar Peter Thienel Committed by David Siegfried
Browse files

Resolve "iCal Export liefert abgewählte Veranstaltungstermine mit aus"

Closes #3938

Merge request studip/studip!2940
parent c226b6bb
No related branches found
No related tags found
No related merge requests found
...@@ -76,20 +76,7 @@ class ICalendarExport ...@@ -76,20 +76,7 @@ class ICalendarExport
if ($this->time === 0) { if ($this->time === 0) {
$this->time = time(); $this->time = time();
} }
$dates = CourseDate::findBySql( $dates = CalendarCourseDate::getEvents($start, $end, $user_id);
"LEFT JOIN `seminar_user`
ON `termine`.`range_id` = `seminar_user`.`Seminar_id`
WHERE
`seminar_user`.`user_id` = :user_id
AND `seminar_user`.`bind_calendar` = 1
AND (`termine`.`date` <= :end
AND `termine`.`end_time` >= :begin)",
[
':user_id' => $user_id,
':begin' => $start->getTimestamp(),
':end' => $end->getTimestamp(),
]
);
$ical = ''; $ical = '';
foreach ($dates as $date) { foreach ($dates as $date) {
$ical .= $this->writeICalEvent($this->prepareCourseDate($date)); $ical .= $this->writeICalEvent($this->prepareCourseDate($date));
...@@ -102,20 +89,7 @@ class ICalendarExport ...@@ -102,20 +89,7 @@ class ICalendarExport
if ($this->time === 0) { if ($this->time === 0) {
$this->time = time(); $this->time = time();
} }
$dates = CourseExDate::findBySql( $dates = CalendarCourseExDate::getEvents($start, $end, $user_id);
"LEFT JOIN `seminar_user`
ON `ex_termine`.`range_id` = `seminar_user`.`Seminar_id`
WHERE
`seminar_user`.`user_id` = :user_id
AND `seminar_user`.`bind_calendar` = 1
AND (`ex_termine`.`date` <= :end
AND `ex_termine`.`end_time` >= :begin)",
[
':user_id' => $user_id,
':begin' => $start->getTimestamp(),
':end' => $end->getTimestamp(),
]
);
$ical = ''; $ical = '';
foreach ($dates as $date) { foreach ($dates as $date) {
$ical .= $this->writeICalEvent($this->prepareCourseDate($date)); $ical .= $this->writeICalEvent($this->prepareCourseDate($date));
...@@ -124,10 +98,10 @@ class ICalendarExport ...@@ -124,10 +98,10 @@ class ICalendarExport
} }
/** /**
* @param CalendarDate | CourseExDate $date * @param CalendarDate $date The calendar date to export.
* @return array * @return array Calendar date data prepared for export.
*/ */
public function prepareCalendarDate($date): array public function prepareCalendarDate(CalendarDate $date): array
{ {
return [ return [
'SUMMARY' => $date->title, 'SUMMARY' => $date->title,
...@@ -155,8 +129,8 @@ class ICalendarExport ...@@ -155,8 +129,8 @@ class ICalendarExport
} }
/** /**
* @param CalendarDate | CourseExDate $date * @param CourseDate | CourseExDate $date The course date to export.
* @return array * @return array Course date data prepared for export.
*/ */
public function prepareCourseDate($date): array public function prepareCourseDate($date): array
{ {
...@@ -165,10 +139,13 @@ class ICalendarExport ...@@ -165,10 +139,13 @@ class ICalendarExport
if ($date instanceof CourseExDate) { if ($date instanceof CourseExDate) {
$summary .= ' ' . _('(fällt aus)'); $summary .= ' ' . _('(fällt aus)');
$categories = ''; $categories = '';
$description = $date->content;
} else {
$description = implode("\n", $date->topics->pluck('title'));
} }
return [ return [
'SUMMARY' => $summary, 'SUMMARY' => $summary,
'DESCRIPTION' => '', 'DESCRIPTION' => $description,
'LOCATION' => $date->getRoomName(), 'LOCATION' => $date->getRoomName(),
'CATEGORIES' => $categories, 'CATEGORIES' => $categories,
'LAST-MODIFIED' => $date->chdate, 'LAST-MODIFIED' => $date->chdate,
...@@ -381,8 +358,8 @@ class ICalendarExport ...@@ -381,8 +358,8 @@ class ICalendarExport
public function _exportDateTime($value, $utc = false) public function _exportDateTime($value, $utc = false)
{ {
$date_time = new DateTime(); $date_time = new DateTime();
$date_time->setTimestamp($value); $date_time->setTimestamp(intval($value));
//transform local time in UTC //transform local time to UTC
if ($utc) { if ($utc) {
$tz_utc = new DateTimeZone('UTC'); $tz_utc = new DateTimeZone('UTC');
$date_time->setTimezone($tz_utc); $date_time->setTimezone($tz_utc);
......
...@@ -8,7 +8,13 @@ class CalendarCourseDate extends CourseDate ...@@ -8,7 +8,13 @@ class CalendarCourseDate extends CourseDate
{ {
public static function getEvents(DateTime $begin, DateTime $end, string $range_id): array public static function getEvents(DateTime $begin, DateTime $end, string $range_id): array
{ {
return parent::findBySQL( $events = [];
parent::findEachBySQL(
function ($e) use (&$events, $range_id) {
if (self::checkRelated($e, $range_id)) {
$events[] = $e;
}
},
"JOIN `seminar_user` "JOIN `seminar_user`
ON `seminar_user`.`seminar_id` = `termine`.`range_id` ON `seminar_user`.`seminar_id` = `termine`.`range_id`
WHERE `seminar_user`.`user_id` = :user_id WHERE `seminar_user`.`user_id` = :user_id
...@@ -30,5 +36,45 @@ class CalendarCourseDate extends CourseDate ...@@ -30,5 +36,45 @@ class CalendarCourseDate extends CourseDate
'user_id' => $range_id 'user_id' => $range_id
] ]
); );
return $events;
}
/**
* Checks if given user is the responsible lecturer or is member of a
* related group.
*
* @global object $perm The global perm object.
* @param CalendarCourseDate $event The course event to check against.
* @param string $user_id The id of the user.
* @return boolean
*/
protected static function checkRelated(CalendarCourseDate $event, string $user_id): bool
{
$check_related = false;
$permission = $GLOBALS['perm']->get_studip_perm($event->range_id, $user_id);
switch ($permission) {
case 'dozent' :
$related_persons = $event->dozenten->pluck('user_id');
if (count($related_persons) > 0) {
$check_related = in_array($user_id, $related_persons);
} else {
$check_related = true;
}
break;
case 'tutor' :
$check_related = true;
break;
default :
$group_ids = $event->statusgruppen->pluck('statusgruppe_id');
if (count($group_ids) > 0) {
$member = StatusgruppeUser::findBySQL(
'statusgruppe_id IN(?) AND user_id = ?',
[$group_ids, $user_id]);
$check_related = count($member) > 0;
} else {
$check_related = true;
}
}
return $check_related;
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment