/**
  * @inheritdoc
  */
 public function disableContentContainer(ContentContainerActiveRecord $container)
 {
     parent::disableContentContainer($container);
     foreach (CalendarEntry::find()->contentContainer($container)->all() as $entry) {
         $entry->delete();
     }
 }
 public function run()
 {
     $calendarEntries = CalendarEntry::getUpcomingEntries($this->contentContainer, $this->daysInFuture, $this->maxEvents);
     if (count($calendarEntries) == 0) {
         return;
     }
     return $this->render('nextEvents', array('calendarEntries' => $calendarEntries));
 }
 public function up()
 {
     // Namespace Classes
     $this->renameClass('CalendarEntry', CalendarEntry::className());
     $this->renameClass('CalendarEntryParticipant', CalendarEntryParticipant::className());
     // Merge EntryCreated to ContentCreated Activity
     $this->update('activity', ['class' => 'humhub\\modules\\content\\activities\\ContentCreated'], ['class' => 'EntryCreated']);
     $this->update('activity', ['class' => \humhub\modules\calendar\activities\ResponseAttend::className()], ['class' => 'EntryResponseAttend']);
     $this->update('activity', ['class' => \humhub\modules\calendar\activities\ResponseDeclined::className()], ['class' => 'EntryResponseDeclined']);
     $this->update('activity', ['class' => \humhub\modules\calendar\activities\ResponseMaybe::className()], ['class' => 'EntryResponseMaybe']);
 }
 public function actionLoadAjax()
 {
     Yii::$app->response->format = 'json';
     $output = array();
     $startDate = new DateTime(Yii::$app->request->get('start'));
     $endDate = new DateTime(Yii::$app->request->get('end'));
     $entries = CalendarEntry::getContainerEntriesByRange($startDate, $endDate, $this->contentContainer);
     foreach ($entries as $entry) {
         $output[] = $entry->getFullCalendarArray();
     }
     return $output;
 }
 public function actionLoadAjax()
 {
     Yii::$app->response->format = 'json';
     $output = array();
     $startDate = new \DateTime(Yii::$app->request->get('start'));
     $endDate = new \DateTime(Yii::$app->request->get('end'));
     $selectors = explode(",", Yii::$app->request->get('selectors'));
     $filters = explode(",", Yii::$app->request->get('filters'));
     Yii::$app->user->getIdentity()->setSetting('lastSelectors', Json::encode($selectors), 'calendar');
     Yii::$app->user->getIdentity()->setSetting('lastFilters', Json::encode($filters), 'calendar');
     $entries = CalendarEntry::getEntriesByRange($startDate, $endDate, $selectors, $filters);
     foreach ($entries as $entry) {
         $output[] = $entry->getFullCalendarArray();
     }
     return $output;
 }
 /**
  * Returns a readable calendar entry by given id
  *
  * @param int $id
  * @return CalendarEntry
  */
 protected function getCalendarEntry($id)
 {
     return CalendarEntry::find()->contentContainer($this->contentContainer)->readable()->where(['calendar_entry.id' => $id])->one();
 }
 private function iCalParseTmpFile($path)
 {
     $user = $container = $this->content->container;
     $public = false;
     if ($container instanceof Space) {
         $public = $container->getDefaultContentVisibility();
         $user = User::findOne(['id' => $this->content->user_id]);
     }
     Yii::$app->user->setIdentity($user);
     $config = array("unique_id" => "ical{$this->id}", "filename" => basename($path), "directory" => dirname($path));
     $vcalendar = new vcalendar($config);
     $vcalendar->parse();
     while ($event = $vcalendar->getComponent('vevent')) {
         $dtstart = $event->getProperty("dtstart");
         $dtend = $event->getProperty("dtend");
         $all_day = !isset($dtstart["hour"]);
         if ($all_day) {
             $st = mktime(0, 0, 0, $dtstart['month'], $dtstart['day'], $dtstart['year']);
             $start_date = date("Y-m-d H:i:s", $st);
             $end_date = date("Y-m-d H:i:s", mktime(23, 59, 59, $dtend['month'], $dtend['day'] - 1, $dtend['year']));
         } else {
             $st = gmmktime($dtstart['hour'], $dtstart['min'], $dtstart['sec'], $dtstart['month'], $dtstart['day'], $dtstart['year']);
             $start_date = date('Y-m-d H:i:s', $st);
             $end_date = date('Y-m-d H:i:s', gmmktime($dtend['hour'], $dtend['min'], $dtend['sec'], $dtend['month'], $dtend['day'], $dtend['year']));
         }
         if (time() - $st > 60 * 60 * 24 * 30 * 2) {
             continue;
         }
         // ignore events older than 2 months
         $uid = $event->getProperty("uid");
         $entry = CalendarEntry::findOne(["external_source_id" => $this->id, "external_uid" => $uid]);
         if (!$entry) {
             $entry = new CalendarEntry(['participation_mode' => CalendarEntry::PARTICIPATION_MODE_NONE, 'color' => $this->color, 'external_source_id' => $this->id, 'external_uid' => $uid]);
         }
         $entry->content->container = $container;
         $entry->title = $event->getProperty("summary");
         $entry->description = $event->getProperty("description");
         $entry->start_datetime = $start_date;
         $entry->end_datetime = $end_date;
         $entry->all_day = $all_day;
         $entry->is_public = $public;
         $entry->validate();
         $entry->save();
     }
 }
 public static function getUpcomingEntries(ContentContainerActiveRecord $contentContainer = null, $daysInFuture = 7, $limit = 5)
 {
     $entries = array();
     $start = new DateTime();
     $query = CalendarEntry::find();
     $query->orderBy('start_datetime ASC');
     if ($daysInFuture > 0) {
         $startEnd = new DateTime();
         $startEnd->add(new DateInterval("P" . $daysInFuture . "D"));
         $query->andWhere(['>=', 'start_datetime', $start->format('Y-m-d H:i:s')]);
         $query->andWhere(['<=', 'end_datetime', $startEnd->format('Y-m-d H:i:s')]);
     } else {
         $query->andWhere(['>=', 'start_datetime', $start->format('Y-m-d H:i:s')]);
     }
     if ($contentContainer == null) {
         // When no contentcontainer is specified - limit to events where current user participate
         $query->leftJoin('calendar_entry_participant', 'calendar_entry.id=calendar_entry_participant.calendar_entry_id AND calendar_entry_participant.user_id=:userId', [':userId' => Yii::$app->user->id]);
         $query->andWhere(['IS NOT', 'calendar_entry_participant.id', new \yii\db\Expression('NULL')]);
     }
     if ($limit != 0) {
         $query->limit($limit);
     }
     if ($contentContainer !== null) {
         $query->contentContainer($contentContainer);
     }
     foreach ($query->all() as $entry) {
         if ($entry->content->canRead()) {
             $entries[] = $entry;
         }
     }
     return $entries;
 }
 public function getCalendarEntry()
 {
     return $this->hasOne(CalendarEntry::className(), ['id' => 'calendar_entry_id']);
 }