Skip to content
Snippets Groups Projects
Commit 41b3733f authored by Jan-Hendrik Willms's avatar Jan-Hendrik Willms
Browse files

fixes #3750

Closes #3750

Merge request !2607
parent 3934e77a
No related branches found
No related tags found
No related merge requests found
...@@ -40,31 +40,31 @@ class Events extends \RESTAPI\RouteMap ...@@ -40,31 +40,31 @@ class Events extends \RESTAPI\RouteMap
$this->error(401); $this->error(401);
} }
$start = time(); $start = new \DateTime();
$end = strtotime('+2 weeks', $start); $end = clone $start;
$list = SingleCalendar::getEventList($user_id, $start, $end, null, [], [ $end = $end->add(new \DateInterval('P2W'));
'CourseEvent',
'CourseCancelledEvent', $list = array_merge(
'CourseMarkedEvent', \CalendarCourseDate::getEvents($start, $end, $user_id),
]); \CalendarCourseExDate::getEvents($start, $end, $user_id)
);
$json = []; $json = [];
$events = array_slice($list, $this->offset, $this->limit); ; $events = array_slice($list, $this->offset, $this->limit); ;
foreach ($events as $event) { foreach ($events as $event) {
$singledate = new SingleDate($event->id);
$course_uri = $this->urlf('/course/%s', [htmlReady($event->getSeminarId())]); $course_uri = $this->urlf('/course/%s', [htmlReady($event->course_id)]);
$json[] = [ $json[] = [
'event_id' => $event->id, 'event_id' => $event->id,
'course' => $course_uri, 'course' => $course_uri,
'start' => $event->getStart(), 'start' => $event->date,
'end' => $event->getEnd(), 'end' => $event->end_time,
'title' => $event->getTitle(), 'title' => $event->getTitle(),
'description' => $event->getDescription() ?: '', 'description' => $event->getDescription() ?: '',
'categories' => $event->toStringCategories() ?: '', 'categories' => $event->toStringCategories() ?: '',
'room' => html_entity_decode(strip_tags($singledate->getRoom() ?: $singledate->getFreeRoomText() ?: '')), 'room' => $event->getRoomName(),
'canceled' => $singledate->isHoliday() ?: false, 'canceled' => $event instanceof \CourseExDate || holiday($event->date),
]; ];
} }
......
<?php
namespace Studip\Cli\Commands\Fix;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
class EndTimeWeeklyRecurredEvents extends Command
{
protected static $defaultName = 'fix:end-time-weekly-recurred-events';
protected function configure(): void
{
$this->setDescription('Fix end time weekly recurred events');
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$events = \EventData::findBySQL("rtype = 'WEEKLY' AND IFNULL(count, 0) > 0");
$cal_event = new \CalendarEvent();
$i = 0;
foreach ($events as $event) {
$id = $event->getId();
$cal_event->event = $event;
$rrule = $cal_event->getRecurrence();
$cal_event->setRecurrence($rrule);
$event->expire = $cal_event->event->expire;
$event->setId($id);
$event->store();
$i++;
}
$io->info('Wrong end time of recurrence fixed for ' . $i . ' events.');
return Command::SUCCESS;
}
}
...@@ -36,7 +36,6 @@ $commands = [ ...@@ -36,7 +36,6 @@ $commands = [
Commands\Fix\Biest7789::class, Commands\Fix\Biest7789::class,
Commands\Fix\Biest7866::class, Commands\Fix\Biest7866::class,
Commands\Fix\Biest8136::class, Commands\Fix\Biest8136::class,
Commands\Fix\EndTimeWeeklyRecurredEvents::class,
Commands\Fix\IconDimensions::class, Commands\Fix\IconDimensions::class,
Commands\HelpContent\Migrate::class, Commands\HelpContent\Migrate::class,
Commands\Migrate\MigrateList::class, Commands\Migrate\MigrateList::class,
......
...@@ -18,7 +18,7 @@ class SchemaMap ...@@ -18,7 +18,7 @@ class SchemaMap
\BlubberStatusgruppeThread::class => Schemas\BlubberStatusgruppeThread::class, \BlubberStatusgruppeThread::class => Schemas\BlubberStatusgruppeThread::class,
\BlubberThread::class => Schemas\BlubberThread::class, \BlubberThread::class => Schemas\BlubberThread::class,
\CalendarDateAssignment::class => Schemas\CalendarEvent::class, \CalendarDateAssignment::class => Schemas\CalendarDateAssignment::class,
\ConsultationBlock::class => Schemas\ConsultationBlock::class, \ConsultationBlock::class => Schemas\ConsultationBlock::class,
\ConsultationBooking::class => Schemas\ConsultationBooking::class, \ConsultationBooking::class => Schemas\ConsultationBooking::class,
\ConsultationSlot::class => Schemas\ConsultationSlot::class, \ConsultationSlot::class => Schemas\ConsultationSlot::class,
......
...@@ -5,7 +5,7 @@ namespace JsonApi\Schemas; ...@@ -5,7 +5,7 @@ namespace JsonApi\Schemas;
use Neomerx\JsonApi\Contracts\Schema\ContextInterface; use Neomerx\JsonApi\Contracts\Schema\ContextInterface;
use Neomerx\JsonApi\Schema\Link; use Neomerx\JsonApi\Schema\Link;
class CalendarEvent extends SchemaProvider class CalendarDateAssignment extends SchemaProvider
{ {
const TYPE = 'calendar-events'; const TYPE = 'calendar-events';
const REL_OWNER = 'owner'; const REL_OWNER = 'owner';
......
...@@ -18,69 +18,69 @@ class Privacy ...@@ -18,69 +18,69 @@ class Privacy
*/ */
private static $privacy_classes = [ private static $privacy_classes = [
'core' => [ 'core' => [
'User', User::class,
'DataField', DataField::class,
'DatafieldEntryModel', DatafieldEntryModel::class,
'UserConfig', UserConfig::class,
'HelpTourUser', HelpTourUser::class,
'Grading\Instance', Grading\Instance::class,
'LogEvent', LogEvent::class,
], ],
'date' => [ 'date' => [
'CalendarEvent', CalendarDateAssignment::class,
'CalendarDate', CalendarDate::class,
'CourseDate', CourseDate::class,
'CourseExDate', CourseExDate::class,
], ],
'message' => [ 'message' => [
'BlubberThread', BlubberThread::class,
'BlubberComment', BlubberComment::class,
'StudipNews', StudipNews::class,
'StudipComment', StudipComment::class,
'Message', Message::class,
'MessageUser', MessageUser::class,
], ],
'content' => [ 'content' => [
'FileRef', FileRef::class,
'ForumEntry', ForumEntry::class,
'WikiPage', WikiPage::class,
'Courseware\Unit', Courseware\Unit::class,
'Courseware\StructuralElement', Courseware\StructuralElement::class,
'Courseware\StructuralElementComment', Courseware\StructuralElementComment::class,
'Courseware\StructuralElementFeedback', Courseware\StructuralElementFeedback::class,
'Courseware\TaskGroup', Courseware\TaskGroup::class,
'Courseware\TaskFeedback', Courseware\TaskFeedback::class,
'Courseware\Bookmark', Courseware\Bookmark::class,
'Courseware\Container', Courseware\Container::class,
'Courseware\Block', Courseware\Block::class,
'Courseware\BlockComment', Courseware\BlockComment::class,
'Courseware\BlockFeedback', Courseware\BlockFeedback::class,
'Courseware\UserDataField', Courseware\UserDataField::class,
'Courseware\UserProgress' Courseware\UserProgress::class,
], ],
'quest' => [ 'quest' => [
'Evaluation', Evaluation::class,
'Questionnaire', Questionnaire::class,
'QuestionnaireAnswer', QuestionnaireAnswer::class,
'QuestionnaireAnonymousAnswer', QuestionnaireAnonymousAnswer::class,
'QuestionnaireAssignment', QuestionnaireAssignment::class,
'eTask\Attempt', eTask\Attempt::class,
'eTask\Response', eTask\Response::class,
'eTask\Task', eTask\Task::class,
'eTask\Test', eTask\Test::class,
], ],
'membership' => [ 'membership' => [
'Course', Course::class,
'CourseMember', CourseMember::class,
'AdmissionApplication', AdmissionApplication::class,
'ArchivedCourse', ArchivedCourse::class,
'ArchivedCourseMember', ArchivedCourseMember::class,
'Statusgruppen', Statusgruppen::class,
'StatusgruppeUser', StatusgruppeUser::class,
'InstituteMember', InstituteMember::class,
'UserStudyCourse', UserStudyCourse::class,
'Fach', Fach::class,
'Abschluss', Abschluss::class,
], ],
'plugins' => [ 'plugins' => [
], ],
......
...@@ -1161,7 +1161,25 @@ class UserManagement ...@@ -1161,7 +1161,25 @@ class UserManagement
// delete all private appointments of this user // delete all private appointments of this user
if (Config::get()->CALENDAR_ENABLE) { if (Config::get()->CALENDAR_ENABLE) {
$count = CalendarEvent::deleteBySQL('range_id = ?', [$user_id]); // delete private appointments (omit group appointments)
$count = CalendarDate::deleteBySQL(
'`id` IN (
SELECT `id`
FROM (
SELECT `id`, COUNT(*)
FROM `calendar_dates`
JOIN `calendar_date_assignments`
ON `calendar_dates`.`id` = `calendar_date_assignments`.`calendar_date_id`
WHERE `calendar_dates`.`author_id` = :user_id
GROUP BY `id`
HAVING COUNT(*) = 1
ORDER BY NULL
) AS `cal_date_delete`
)',
[':user_id' => $user_id]
);
// delete assignments to group appointments
$count += CalendarDateAssignment::deleteBySQL('`range_id` = ?', [$user_id]);
if ($count) { if ($count) {
$msg .= 'info§' . sprintf(_('%s Einträge aus den Terminen gelöscht.'), $count) . '§'; $msg .= 'info§' . sprintf(_('%s Einträge aus den Terminen gelöscht.'), $count) . '§';
} }
......
...@@ -360,44 +360,48 @@ class ExternPagePersonDetails extends ExternPage ...@@ -360,44 +360,48 @@ class ExternPagePersonDetails extends ExternPage
return []; return [];
} }
$list_start = new DateTimeImmutable(); $list_start = new DateTime();
$list_end = $list_start->modify('+ 7 days'); $list_end = clone $list_start;
$events = SingleCalendar::getEventList( $list_end = $list_end->add(new DateInterval('P7D'));
$assigned_events = CalendarDateAssignment::getEvents(
$list_start,
$list_end,
$user->id, $user->id,
$list_start->getTimestamp(), ['PUBLIC']
$list_end->getTimestamp(),
null,
['class' => 'PUBLIC'],
['CalendarEvent']
); );
$content['APPOINTMENTS_START'] = $list_start->getTimestamp(); $content['APPOINTMENTS_START'] = $list_start->getTimestamp();
$content['APPOINTMENTS_END'] = $list_end->getTimestamp(); $content['APPOINTMENTS_END'] = $list_end->getTimestamp();
$content_events = []; $content_events = [];
if (!empty($events)) { if (!empty($assigned_events)) {
foreach ($events as $event) { foreach ($assigned_events as $assigned_event) {
if ($event->isDayEvent()) { $event = $assigned_event->calendar_date;
$date = date('d.m.Y', $event->getStart()) . ' (' . _('ganztägig') . ')'; if (!$event) {
continue;
}
if ($event->isWholeDay()) {
$date = date('d.m.Y', $event->begin) . ' (' . _('ganztägig') . ')';
} else { } else {
$date = date('d.m.Y G:H:s', $event->getStart()); $date = date('d.m.Y G:i:s', $event->begin);
if (date('dmY', $event->getStart()) === date('dmY', $event->getEnd())) { if (date('dmY', $event->begin) === date('dmY', $event->end)) {
$date .= date('d.m.Y G:H:s', $event->getEnd()); $date .= date('d.m.Y G:i:s', $event->end);
} else { } else {
$date .= ' - ' . date('d.m.Y G:H:s', $event->getEnd()); $date .= ' - ' . date('d.m.Y G:i:s', $event->end);
} }
} }
$content_events[] = [ $content_events[] = [
'DATE' => $date, 'DATE' => $date,
'TITLE' => $event->getTitle(), 'TITLE' => $event->title,
'DESCRIPTION' => $event->getDescription(), 'DESCRIPTION' => $event->description,
'LOCATION' => $event->getLocation(), 'LOCATION' => $event->location,
'RECURRENCE' => $event->toStringRecurrence(), 'RECURRENCE' => $event->getRepetitionAsString(),
'CATEGORY' => $event->toStringCategories(), 'CATEGORY' => $event->getCategoryAsString(),
'PRIORITY' => $event->toStringPriority(), 'PRIORITY' => _('Keine Angabe'),
'START' => date('d.m.Y G:H:s', $event->getStart()), 'START' => date('d.m.Y G:i:s', $event->begin),
'END' => date('d.m.Y G:H:s', $event->getEnd()), 'END' => date('d.m.Y G:i:s', $event->end),
'TIMESTAMP_START' => $event->getStart(), 'TIMESTAMP_START' => $event->begin,
'TIMESTAMP_END' => $event->getEnd(), 'TIMESTAMP_END' => $event->end,
]; ];
} }
} }
......
...@@ -780,7 +780,7 @@ class User extends AuthUserMd5 implements Range, PrivacyObject, Studip\Calendar\ ...@@ -780,7 +780,7 @@ class User extends AuthUserMd5 implements Range, PrivacyObject, Studip\Calendar\
// Non-private dates. // Non-private dates.
if (Config::get()->CALENDAR_ENABLE) { if (Config::get()->CALENDAR_ENABLE) {
$dates = CalendarEvent::countBySql('range_id = ?', [$this->id]); $dates = CalendarDateAssignment::countBySql('range_id = ?', [$this->id]);
} else { } else {
$dates = []; $dates = [];
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment