/** * testXMozAckExdate * * @see 0009396: alarm_ack_time and alarm_snooze_time are not updated */ public function testXMozAckExdate() { $vcalendarStream = Calendar_Frontend_WebDAV_EventTest::getVCalendar(dirname(__FILE__) . '/../../../Import/files/lightning_repeating_exdate_mozlastack.ics'); $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_THUNDERBIRD); $event = $converter->toTine20Model($vcalendarStream); $this->assertEquals(1, count($event->alarms)); $alarmOptions = Zend_Json::decode($event->alarms->getFirstRecord()->options); $alarmAckIndex = 'acknowledged-' . Tinebase_Core::getUser()->contact_id; $this->assertTrue(array_key_exists($alarmAckIndex, $alarmOptions), 'did not find index ' . $alarmAckIndex . ' in ' . print_r($alarmOptions, true)); $this->assertEquals('2014-01-08 15:01:54', $alarmOptions[$alarmAckIndex]); }
/** * test converting vcard from sogo connector to Calendar_Model_Event */ public function testConvertToTine20Model() { $vcalendarStream = fopen(dirname(__FILE__) . '/../../../Import/files/lightning.ics', 'r'); $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC); $event = $converter->toTine20Model($vcalendarStream); $organizer = Addressbook_Controller_Contact::getInstance()->get($event->organizer); $this->assertEquals(Calendar_Model_Event::CLASS_PRIVATE, $event->class); $this->assertEquals('Hamburg', $event->location); $this->assertEquals('*****@*****.**', $organizer->email); $this->assertGreaterThan(0, count($event->attendee->filter('user_id', $event->organizer)), 'Organizer must be attendee too'); }
/** * test converting vcard from EM Client to Calendar_Model_Event */ public function testConvertToTine20Model() { $vcalendarStream = fopen(dirname(__FILE__) . '/../../../Import/files/emclient.ics', 'r'); $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC); $event = $converter->toTine20Model($vcalendarStream); $this->assertEquals('eM Patch Upload', $event->summary); $this->assertEquals('2013-05-27 06:00:00', $event->dtstart->toString()); $this->assertEquals('UTC', $event->dtstart->getTimeZone()->getName()); $this->assertEquals('Europe/Berlin', $event->originator_tz); $this->assertCount(1, $event->alarms, 'there should be one alarm'); $this->assertEquals(15, $event->alarms->getFirstRecord()->minutes_before, 'alarm should be 15 minutes before'); }
/** * exports calendars as ICS * * @param Zend_Console_Getopt $_opts */ public function exportICS($_opts) { Tinebase_Core::set('HOSTNAME', 'localhost'); $opts = $_opts->getRemainingArgs(); $container_id = $opts[0]; $filter = new Calendar_Model_EventFilter(array(array('field' => 'container_id', 'operator' => 'equals', 'value' => $container_id))); $result = Calendar_Controller_MSEventFacade::getInstance()->search($filter, null, false, false, 'get'); if ($result->count() == 0) { throw new Tinebase_Exception('this calendar does not contain any records.'); } $converter = Calendar_Convert_Event_VCalendar_Factory::factory("generic"); $result = $converter->fromTine20RecordSet($result); print $result->serialize(); }
/** * this function creates a Calendar_Model_Event and stores it in the database * * @todo the header handling does not belong here. It should be moved to the DAV_Server class when supported * * @param Tinebase_Model_Container $container * @param stream|string $vobjectData */ public static function create(Tinebase_Model_Container $container, $name, $vobjectData) { if (is_resource($vobjectData)) { $vobjectData = stream_get_contents($vobjectData); } // Converting to UTF-8, if needed $vobjectData = Sabre_DAV_StringUtil::ensureUTF8($vobjectData); Sabre_CalDAV_ICalendarUtil::validateICalendarObject($vobjectData, array('VEVENT', 'VFREEBUSY')); list($backend, $version) = Calendar_Convert_Event_VCalendar_Factory::parseUserAgent($_SERVER['HTTP_USER_AGENT']); $event = Calendar_Convert_Event_VCalendar_Factory::factory($backend, $version)->toTine20Model($vobjectData); $event->container_id = $container->getId(); $id = ($pos = strpos($name, '.')) === false ? $name : substr($name, 0, $pos); $event->setId($id); self::enforceEventParameters($event); if ($event->exdate instanceof Tinebase_Record_RecordSet) { foreach ($event->exdate as $exdate) { if ($exdate->is_deleted == false && $exdate->organizer != $event->organizer) { throw new Sabre_DAV_Exception_PreconditionFailed('Organizer for exdate must be the same like base event'); } } } // check if there is already an existing event with this ID // this can happen when the invitation email is faster then the caldav update or // or when an event gets moved to another container $filter = new Calendar_Model_EventFilter(array(array('field' => 'containerType', 'operator' => 'equals', 'value' => 'all'), array('field' => 'dtstart', 'operator' => 'equals', 'value' => $event->dtstart), array('field' => 'dtend', 'operator' => 'equals', 'value' => $event->dtend), array('condition' => 'OR', 'filters' => array(array('field' => 'id', 'operator' => 'equals', 'value' => $id), array('field' => 'uid', 'operator' => 'equals', 'value' => $id))))); $existingEvent = Calendar_Controller_MSEventFacade::getInstance()->search($filter, null, false, false, 'sync')->getFirstRecord(); if ($existingEvent === null) { $event = Calendar_Controller_MSEventFacade::getInstance()->create($event); $vevent = new self($container, $event); } else { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' update existing event'); } $vevent = new self($container, $existingEvent); $vevent->put($vobjectData); } return $vevent; }
/** * test converting vcard from sogo connector to Calendar_Model_Event */ public function testConvertToTine20Model() { $vcalendarStream = fopen(dirname(__FILE__) . '/../../../Import/files/lightning.ics', 'r'); $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC); $event = $converter->toTine20Model($vcalendarStream); }
/** * @see 0011130: handle bad originator timzone in VCALENDAR converter */ public function testBrokenTimezoneInTineEvent() { $event = $this->testConvertRepeatingAllDayDailyEventToTine20Model(); $event->originator_tz = 'AWST'; // Australian Western Standard Time $this->_converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC); try { $vevent = $this->_converter->fromTine20Model($event)->serialize(); $this->fail('should throw Tinebase_Exception_Record_Validation because of bad TZ'); } catch (Tinebase_Exception_Record_Validation $terv) { $this->assertEquals('Bad Timezone: AWST', $terv->getMessage()); } }
/** * get ics converter * * @return Calendar_Convert_Event_VCalendar_Abstract */ protected function _getConverter() { if (!$this->_converter) { list($backend, $version) = Calendar_Convert_Event_VCalendar_Factory::parseUserAgent($this->userAgent); $this->_converter = Calendar_Convert_Event_VCalendar_Factory::factory($backend, $version); } return $this->_converter; }
/** * get iMIP record from internal event * * @param string $_method * @param boolean $_addEventToiMIP * @return Calendar_Model_iMIP */ protected function _getiMIP($_method, $_addEventToiMIP = FALSE, $_testEmptyMethod = FALSE) { $email = $this->_getEmailAddress(); $event = $this->_getEvent(); $event = Calendar_Controller_Event::getInstance()->create($event); $this->_eventIdsToDelete[] = $event->getId(); if ($_method == 'REPLY') { $personas = Zend_Registry::get('personas'); $sclever = $personas['sclever']; $scleverAttendee = $event->attendee->filter('status', Calendar_Model_Attender::STATUS_NEEDSACTION)->getFirstRecord(); $scleverAttendee->status = Calendar_Model_Attender::STATUS_ACCEPTED; Calendar_Controller_Event::getInstance()->attenderStatusUpdate($event, $scleverAttendee, $scleverAttendee->status_authkey); $event = Calendar_Controller_Event::getInstance()->get($event->getId()); $email = $sclever->accountEmailAddress; } // get iMIP invitation for event $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC); $vevent = $converter->fromTine20Model($event); $vevent->METHOD = $_method; $ics = $vevent->serialize(); $iMIP = new Calendar_Model_iMIP(array('id' => Tinebase_Record_Abstract::generateUID(), 'ics' => $ics, 'method' => $_testEmptyMethod ? NULL : $_method, 'originator' => $email)); if ($_addEventToiMIP) { $iMIP->event = $event; } return $iMIP; }
/** * send notification to a single attender * * @param Calendar_Model_Attender $_attender * @param Calendar_Model_Event $_event * @param Tinebase_Model_FullAccount $_updater * @param Sting $_action * @param String $_notificationLevel * @param array $_updates * @param array $attachs * @return void */ public function sendNotificationToAttender($_attender, $_event, $_updater, $_action, $_notificationLevel, $_updates = NULL, $attachs = FALSE) { try { // find organizer account if ($_event->organizer && $_event->resolveOrganizer()->account_id) { $organizer = Tinebase_User::getInstance()->getFullUserById($_event->resolveOrganizer()->account_id); } else { // use creator as organizer $organizer = Tinebase_User::getInstance()->getFullUserById($_event->created_by); } // get prefered language, timezone and notification level $prefUser = $_attender->getUserAccountId(); $locale = Tinebase_Translation::getLocale(Tinebase_Core::getPreference()->getValueForUser(Tinebase_Preference::LOCALE, $prefUser ? $prefUser : $organizer->getId())); $timezone = Tinebase_Core::getPreference()->getValueForUser(Tinebase_Preference::TIMEZONE, $prefUser ? $prefUser : $organizer->getId()); $translate = Tinebase_Translation::getTranslation('Calendar', $locale); // check if user wants this notification $sendLevel = $prefUser ? Tinebase_Core::getPreference('Calendar')->getValueForUser(Calendar_Preference::NOTIFICATION_LEVEL, $prefUser) : 100; $sendOnOwnActions = $prefUser ? Tinebase_Core::getPreference('Calendar')->getValueForUser(Calendar_Preference::SEND_NOTIFICATION_OF_OWN_ACTIONS, $prefUser) : 0; // NOTE: organizer gets mails unless she set notificationlevel to NONE if ($prefUser == $_updater->getId() && !$sendOnOwnActions || $sendLevel < $_notificationLevel && ($prefUser != $organizer->getId() || $sendLevel == self::NOTIFICATION_LEVEL_NONE)) { return; } // get date strings $startDateString = Tinebase_Translation::dateToStringInTzAndLocaleFormat($_event->dtstart, $timezone, $locale); $endDateString = Tinebase_Translation::dateToStringInTzAndLocaleFormat($_event->dtend, $timezone, $locale); switch ($_action) { case 'alarm': $messageSubject = sprintf($translate->_('Alarm for event "%1$s" at %2$s'), $_event->summary, $startDateString); break; case 'created': $messageSubject = sprintf($translate->_('Event invitation "%1$s" at %2$s'), $_event->summary, $startDateString); $method = Calendar_Model_iMIP::METHOD_REQUEST; break; case 'deleted': $messageSubject = sprintf($translate->_('Event "%1$s" at %2$s has been canceled'), $_event->summary, $startDateString); $method = Calendar_Model_iMIP::METHOD_CANCEL; break; case 'changed': switch ($_notificationLevel) { case self::NOTIFICATION_LEVEL_EVENT_RESCHEDULE: $messageSubject = sprintf($translate->_('Event "%1$s" at %2$s has been rescheduled'), $_event->summary, $startDateString); $method = Calendar_Model_iMIP::METHOD_REQUEST; break; case self::NOTIFICATION_LEVEL_EVENT_UPDATE: $messageSubject = sprintf($translate->_('Event "%1$s" at %2$s has been updated'), $_event->summary, $startDateString); $method = Calendar_Model_iMIP::METHOD_REQUEST; break; case self::NOTIFICATION_LEVEL_ATTENDEE_STATUS_UPDATE: if (!empty($_updates['attendee']) && !empty($_updates['attendee']['toUpdate']) && count($_updates['attendee']['toUpdate']) == 1) { // single attendee status update $attender = $_updates['attendee']['toUpdate'][0]; switch ($attender->status) { case Calendar_Model_Attender::STATUS_ACCEPTED: $messageSubject = sprintf($translate->_('%1$s accepted event "%2$s" at %3$s'), $attender->getName(), $_event->summary, $startDateString); break; case Calendar_Model_Attender::STATUS_DECLINED: $messageSubject = sprintf($translate->_('%1$s declined event "%2$s" at %3$s'), $attender->getName(), $_event->summary, $startDateString); break; case Calendar_Model_Attender::STATUS_TENTATIVE: $messageSubject = sprintf($translate->_('Tentative response from %1$s for event "%2$s" at %3$s'), $attender->getName(), $_event->summary, $startDateString); break; case Calendar_Model_Attender::STATUS_NEEDSACTION: $messageSubject = sprintf($translate->_('No response from %1$s for event "%2$s" at %3$s'), $attender->getName(), $_event->summary, $startDateString); break; } } else { $messageSubject = sprintf($translate->_('Attendee changes for event "%1$s" at %2$s'), $_event->summary, $startDateString); } // we don't send iMIP parts to organizers with an account cause event is already up to date if ($_event->organizer && !$_event->resolveOrganizer()->account_id) { $method = Calendar_Model_iMIP::METHOD_REPLY; } break; } break; default: if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " unknown action '{$_action}'"); } break; } $view = new Zend_View(); $view->setScriptPath(dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'views'); $view->translate = $translate; $view->timezone = $timezone; $view->event = $_event; $view->updater = $_updater; $view->updates = $_updates; $messageBody = $view->render('eventNotification.php'); if (isset($method) && version_compare(PHP_VERSION, '5.3.0', '>=')) { $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC); $converter->setMethod($method); $vcalendar = $converter->fromTine20Model($_event); // in Tine 2.0 non organizers might be given the grant to update events // @see rfc6047 section 2.2.1 & rfc5545 section 3.2.18 if ($method != Calendar_Model_iMIP::METHOD_REPLY && $_event->organizer !== $_updater->contact_id) { foreach ($vcalendar->children() as $component) { if ($component->name == 'VEVENT') { if (isset($component->{'ORGANIZER'})) { $component->{'ORGANIZER'}->add(new Sabre_VObject_Parameter('SEND-BY', 'mailto:' . $_updater->accountEmailAddress)); } } } } /* not yet supported // in Tine 2.0 status updater might not be updater if ($method == Calendar_Model_iMIP::METHOD_REPLY) { } */ $calendarPart = new Zend_Mime_Part($vcalendar->serialize()); $calendarPart->charset = 'UTF-8'; $calendarPart->type = 'text/calendar; method=' . $method; $calendarPart->encoding = Zend_Mime::ENCODING_QUOTEDPRINTABLE; $attachment = new Zend_Mime_Part($vcalendar->serialize()); $attachment->type = 'application/ics'; $attachment->encoding = Zend_Mime::ENCODING_QUOTEDPRINTABLE; $attachment->disposition = Zend_Mime::DISPOSITION_ATTACHMENT; $attachment->filename = 'event.ics'; $attachments = array($attachment); if ($attachs) { foreach ($attachs as $file) { $stream = fopen($file['tempFile']['path'], 'r'); $part = new Zend_Mime_Part($stream); $part->type = $file['tempFile']['type']; $part->encoding = Zend_Mime::ENCODING_BASE64; $part->disposition = Zend_Mime::DISPOSITION_ATTACHMENT; $part->filename = $file['tempFile']['name']; $attachments[] = $part; } } } else { $calendarPart = null; $attachments = null; } if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " receiver: '{$_attender->getEmail()}'"); } if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " subject: '{$messageSubject}'"); } if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " body: {$messageBody}"); } // NOTE: this is a contact as we only support users and groupmembers $contact = $_attender->getResolvedUser(); $sender = $_action == 'alarm' ? $organizer : $_updater; Tinebase_Notification::getInstance()->send($sender, array($contact), $messageSubject, $messageBody, $calendarPart, $attachments); } catch (Exception $e) { Tinebase_Core::getLogger()->WARN(__METHOD__ . '::' . __LINE__ . " could not send notification :" . $e); return; } }
/** * create iMIP VCALENDAR * * @param Calendar_Model_Event $event * @param string $method * @param Tinebase_Model_FullAccount $updater * @return Sabre\VObject\Component */ protected function _createVCalendar($event, $method, $updater) { $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC); $converter->setMethod($method); $vcalendar = $converter->fromTine20Model($event); foreach ($vcalendar->children() as $component) { if ($component->name == 'VEVENT') { if ($method != Calendar_Model_iMIP::METHOD_REPLY && $event->organizer !== $updater->contact_id) { if (isset($component->{'ORGANIZER'})) { // in Tine 2.0 non organizers might be given the grant to update events // @see rfc6047 section 2.2.1 & rfc5545 section 3.2.18 $component->{'ORGANIZER'}->add('SENT-BY', 'mailto:' . $updater->accountEmailAddress); } } else { if ($method == Calendar_Model_iMIP::METHOD_REPLY) { // TODO in Tine 2.0 status updater might not be updater $component->{'REQUEST-STATUS'} = '2.0;Success'; } } } } return $vcalendar; }
/** * import the data * * @param stream $_resource * @param array $_clientRecordData * @return array : * 'results' => Tinebase_Record_RecordSet, // for dryrun only * 'totalcount' => int, * 'failcount' => int, * 'duplicatecount' => int, * * @throws Calendar_Exception_IcalParser * * @see 0008334: use vcalendar converter for ics import */ public function import($_resource = NULL, $_clientRecordData = array()) { $this->_initImportResult(); if (!$this->_options['container_id']) { throw new Tinebase_Exception_InvalidArgument('you need to define a container_id'); } $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC); if (isset($this->_options['onlyBasicData'])) { $converter->setOptions(array('onlyBasicData' => $this->_options['onlyBasicData'])); } try { $events = $converter->toTine20RecordSet($_resource); } catch (Exception $e) { Tinebase_Exception::log($e); $isce = new Calendar_Exception_IcalParser('Can not parse ics file: ' . $e->getMessage()); $isce->setParseError($e); throw $isce; } try { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . ' ' . __LINE__ . ' ' . ' Trying to find container with ID ' . print_r($this->_options['container_id'], true)); } $container = Tinebase_Container::getInstance()->getContainerById($this->_options['container_id']); } catch (Tinebase_Exception_InvalidArgument $e) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . ' ' . __LINE__ . ' ' . ' Could not found container with Id ' . print_r($this->_options['container_id'], true) . ' assuming this is a container name.'); } $container = new Tinebase_Model_Container(array('name' => $this->_options['container_id'], 'type' => Tinebase_Model_Container::TYPE_PERSONAL, 'backend' => Tinebase_User::SQL, 'color' => '#ffffff', 'application_id' => Tinebase_Application::getInstance()->getApplicationByName('Calendar')->getId(), 'owner_id' => Tinebase_Core::getUser()->getId(), 'model' => 'Calendar_Model_Event')); $container = Tinebase_Container::getInstance()->addContainer($container); } try { $this->_options['container_id'] = $container->getId(); } catch (Exception $ex) { throw new Tinebase_Exception_NotFound('Could not find container by ID: ' . $this->_options['container_id']); } if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . ' ' . __LINE__ . ' ' . ' Import into calendar: ' . print_r($this->_options['container_id'], true)); } $cc = Calendar_Controller_MSEventFacade::getInstance(); $sendNotifications = Calendar_Controller_Event::getInstance()->sendNotifications(FALSE); // search uid's and remove already existing -> only in import cal? $existingEventsFilter = new Calendar_Model_EventFilter(array(array('field' => 'container_id', 'operator' => 'equals', 'value' => $this->_options['container_id']), array('field' => 'uid', 'operator' => 'in', 'value' => array_unique($events->uid)))); $existingEvents = $cc->search($existingEventsFilter); if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . ' ' . __LINE__ . ' ' . ' Found ' . count($existingEvents) . ' existing events'); } if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . ' ' . __LINE__ . ' ' . ' Filter: ' . print_r($existingEventsFilter->toArray(), true)); } // insert one by one in a single transaction $existingEvents->addIndices(array('uid')); foreach ($events as $event) { $existingEvent = $existingEvents->find('uid', $event->uid); try { if (!$existingEvent) { $event->container_id = $this->_options['container_id']; $event = $cc->create($event, FALSE); $this->_importResult['totalcount'] += 1; $this->_importResult['results']->addRecord($event); } else { if ($this->_options['forceUpdateExisting'] || $this->_options['updateExisting'] && $event->seq > $existingEvent->seq) { $event->id = $existingEvent->getId(); $event->last_modified_time = $existingEvent->last_modified_time instanceof Tinebase_DateTime ? clone $existingEvent->last_modified_time : NULL; $cc->update($event, FALSE); $this->_importResult['results']->addRecord($event); $this->_importResult['totalcount'] += 1; } else { $this->_importResult['duplicatecount'] += 1; } } } catch (Exception $e) { if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) { Tinebase_Core::getLogger()->notice(__METHOD__ . ' ' . __LINE__ . ' Import failed for Event ' . $event->summary); } if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . ' ' . __LINE__ . ' ' . print_r($event->toArray(), TRUE)); } if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . ' ' . __LINE__ . ' ' . $e); } $this->_importResult['failcount'] += 1; } } Calendar_Controller_Event::getInstance()->sendNotifications($sendNotifications); if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . ' ' . __LINE__ . ' ' . ' totalcount: ' . $this->_importResult['totalcount'] . ' / duplicates: ' . $this->_importResult['duplicatecount'] . ' / fails: ' . $this->_importResult['failcount']); } return $this->_importResult; }
/** * create instance of Calendar_Convert_Event_VCalendar_* * * @return Calendar_Convert_Event_VCalendar_Abstract */ public function _getConverter() { list($backend, $version) = Calendar_Convert_Event_VCalendar_Factory::parseUserAgent($_SERVER['HTTP_USER_AGENT']); if (!$this->_converter) { $this->_converter = Calendar_Convert_Event_VCalendar_Factory::factory($backend, $version); } return $this->_converter; }
public function testConvertToTine20ModelYosemiteRecurringAllDayWithUntil() { $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_MACOSX, '10.10.5'); $vcalendarStream = fopen(dirname(__FILE__) . '/../../../Import/files/apple_calendar_10.10_birthday02-PUT-quit-old.ics', 'r'); $event = $converter->toTine20Model($vcalendarStream); $this->assertEquals('FREQ=YEARLY;INTERVAL=1;UNTIL=2016-09-17 22:00:00', $event->rrule); }
/** * get iMIP record from internal event * * @param string $_method * @param boolean $_addEventToiMIP * @return Calendar_Model_iMIP */ protected function _getiMIP($_method, $_addEventToiMIP = FALSE, $_testEmptyMethod = FALSE) { $event = $this->_getEvent(); $event = Calendar_Controller_Event::getInstance()->create($event); $this->_eventIdsToDelete[] = $event->getId(); // get iMIP invitation for event $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC); $vevent = $converter->fromTine20Model($event); $vevent->METHOD = $_method; $ics = $vevent->serialize(); $testConfig = Zend_Registry::get('testConfig'); $email = $testConfig->email ? $testConfig->email : '*****@*****.**'; $iMIP = new Calendar_Model_iMIP(array('id' => Tinebase_Record_Abstract::generateUID(), 'ics' => $ics, 'method' => $_testEmptyMethod ? NULL : $_method, 'originator' => $email)); if ($_addEventToiMIP) { $iMIP->event = $event; } return $iMIP; }
public function testConvertToTine20ModelWithCustomAlarm() { $vcalendar = $this->_getVCalendar(dirname(__FILE__) . '/../../../Import/files/event_with_custom_alarm.ics'); $converter = Calendar_Convert_Event_VCalendar_Factory::factory(Calendar_Convert_Event_VCalendar_Factory::CLIENT_GENERIC); $event = $converter->toTine20Model($vcalendar); $this->assertTrue($event->alarms instanceof Tinebase_Record_RecordSet); $this->assertEquals(1, count($event->alarms)); $alarm = $event->alarms->getFirstRecord(); $this->assertEquals(Tinebase_Model_Alarm::OPTION_CUSTOM, $alarm->minutes_before); $this->assertEquals('2012-02-14 17:00:00', $alarm->alarm_time->toString()); }