/** * update to 8.1 * - move ack & snooze time from attendee to alarm */ public function update_0() { // find all events with ack or snooze times set $eventIds = $this->_db->query("SELECT DISTINCT " . $this->_db->quoteIdentifier('cal_event_id') . " FROM " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "cal_attendee") . " WHERE " . $this->_db->quoteIdentifier("alarm_ack_time") . " IS NOT NULL OR " . $this->_db->quoteIdentifier("alarm_snooze_time") . " IS NOT NULL")->fetchAll(Zend_Db::FETCH_ASSOC); $attendeeBE = new Calendar_Backend_Sql_Attendee(); $alarmBE = Tinebase_Alarm::getInstance(); foreach ($eventIds as $eventId) { $eventId = $eventId['cal_event_id']; $attendeeFilter = new Tinebase_Model_Filter_FilterGroup(); $attendeeFilter->addFilter(new Tinebase_Model_Filter_Text('cal_event_id', 'equals', $eventId)); $attendees = $attendeeBE->search($attendeeFilter); $alarms = $alarmBE->search(new Tinebase_Model_AlarmFilter(array(array('field' => 'model', 'operator' => 'equals', 'value' => 'Calendar_Model_Event'), array('field' => 'record_id', 'operator' => 'equals', 'value' => $eventId)))); foreach ($alarms as $alarm) { foreach ($attendees as $attendee) { if ($attendee->alarm_ack_time instanceof Tinebase_DateTime) { $alarm->setOption("acknowledged-{$attendee->user_id}", $attendee->alarm_ack_time->format(Tinebase_Record_Abstract::ISO8601LONG)); } if ($attendee->alarm_snooze_time instanceof Tinebase_DateTime) { $alarm->setOption("snoozed-{$attendee->user_id}", $attendee->alarm_snooze_time->format(Tinebase_Record_Abstract::ISO8601LONG)); } } $alarmBE->update($alarm); } } // delte ack & snooze from attendee $this->_backend->dropCol('cal_attendee', 'alarm_ack_time'); $this->_backend->dropCol('cal_attendee', 'alarm_snooze_time'); $this->setTableVersion('cal_attendee', 5); $this->setApplicationVersion('Calendar', '8.1'); }
public function testDeleteEvent() { $event = $this->_getEvent(); $persistentEvent = $this->_backend->create($event); $this->_backend->delete($persistentEvent->getId()); $attendeeBackend = new Calendar_Backend_Sql_Attendee($this->_backend->getAdapter()); $this->assertEquals(0, count($attendeeBackend->getMultipleByProperty($persistentEvent->getId(), 'cal_event_id'))); $this->setExpectedException('Tinebase_Exception_NotFound'); $loadedEvent = $this->_backend->get($persistentEvent->getId()); }
/** * set container owner as attendee for events from active sync */ public function update_2() { try { Tinebase_Application::getInstance()->getApplicationByName('ActiveSync'); $tablePrefix = SQL_TABLE_PREFIX; // get all envets which came vom active sync without creator as attender $stmt = $this->_db->query("\n SELECT `cal_events`.`id`, `cal_events`.`created_by`, `contact`.`id` AS `contact_id`, `cal_events`.`container_id`, \n MAX(\n `attendee`.`user_type` = 'user' \n AND `attendee`.`user_id` != `cal_events`.`created_by`\n ) AS `creatorIsAttender` \n FROM `{$tablePrefix}cal_events` AS `cal_events`\n INNER JOIN `{$tablePrefix}acsync_content` AS `acsync_content` ON \n `acsync_content`.`class` = 'Calendar' \n AND `acsync_content`.`contentid` = `cal_events`.`id`\n AND TIMESTAMP(`acsync_content`.`creation_time`) - TIMESTAMP(`cal_events`.`creation_time`) <= 0\n LEFT JOIN `{$tablePrefix}cal_attendee` AS `attendee` ON `attendee`.`cal_event_id` = `cal_events`.`id`\n LEFT JOIN `{$tablePrefix}addressbook` AS `contact` ON `contact`.`account_id` = `cal_events`.`created_by`\n GROUP BY `cal_events`.`id`\n HAVING `creatorIsAttender` = 0 OR `creatorIsAttender` IS NULL\n "); $eventDatas = $stmt->fetchAll(Zend_Db::FETCH_ASSOC); $attendeeBE = new Calendar_Backend_Sql_Attendee(); foreach ($eventDatas as $eventData) { try { $attender = new Calendar_Model_Attender(array('cal_event_id' => $eventData['id'], 'user_id' => $eventData['contact_id'], 'user_type' => 'user', 'role' => 'REQ', 'quantity' => 1, 'status' => 'ACCEPTED', 'status_authkey' => Tinebase_Record_Abstract::generateUID(), 'displaycontainer_id' => $eventData['container_id'])); // add attender $attendeeBE->create($attender); // set modification time $this->_db->update($tablePrefix . 'cal_events', array('last_modified_time' => Tinebase_DateTime::now()->get(Tinebase_Record_Abstract::ISO8601LONG), 'last_modified_by' => $eventData['created_by'], 'seq' => new Zend_Db_Expr("seq+1")), "`id` = '{$eventData['id']}'"); } catch (Exception $e) { // ignore... } } } catch (Exception $nfe) { // active sync is not installed } $this->setApplicationVersion('Calendar', '3.3'); }
/** * repair dangling attendee records (no displaycontainer_id) * * @see https://forge.tine20.org/mantisbt/view.php?id=8172 */ public function repairDanglingDisplaycontainerEvents() { $filter = new Tinebase_Model_Filter_FilterGroup(); $filter->addFilter(new Tinebase_Model_Filter_Text(array('field' => 'user_type', 'operator' => 'in', 'value' => array(Calendar_Model_Attender::USERTYPE_USER, Calendar_Model_Attender::USERTYPE_GROUPMEMBER, Calendar_Model_Attender::USERTYPE_RESOURCE)))); $filter->addFilter(new Tinebase_Model_Filter_Text(array('field' => 'displaycontainer_id', 'operator' => 'isnull', 'value' => null))); $danglingAttendee = $this->_attendeeBackend->search($filter); $danglingContactAttendee = $danglingAttendee->filter('user_type', '/' . Calendar_Model_Attender::USERTYPE_USER . '|' . Calendar_Model_Attender::USERTYPE_GROUPMEMBER . '/', TRUE); $danglingContactIds = array_unique($danglingContactAttendee->user_id); $danglingContacts = Addressbook_Controller_Contact::getInstance()->getMultiple($danglingContactIds, TRUE); $danglingResourceAttendee = $danglingAttendee->filter('user_type', Calendar_Model_Attender::USERTYPE_RESOURCE); $danglingResourceIds = array_unique($danglingResourceAttendee->user_id); Calendar_Controller_Resource::getInstance()->doContainerACLChecks(false); $danglingResources = Calendar_Controller_Resource::getInstance()->getMultiple($danglingResourceIds, TRUE); if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Processing ' . count($danglingContactIds) . ' dangling contact ids...'); } foreach ($danglingContactIds as $danglingContactId) { $danglingContact = $danglingContacts->getById($danglingContactId); if ($danglingContact && $danglingContact->account_id) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Get default display container for account ' . $danglingContact->account_id); } if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' ' . print_r($danglingContact->toArray(), true)); } $displayCalId = Calendar_Controller_Event::getDefaultDisplayContainerId($danglingContact->account_id); if ($displayCalId) { // finaly repair attendee records $attendeeRecords = $danglingContactAttendee->filter('user_id', $danglingContactId); $this->_attendeeBackend->updateMultiple($attendeeRecords->getId(), array('displaycontainer_id' => $displayCalId)); Tinebase_Core::getLogger()->NOTICE(__METHOD__ . '::' . __LINE__ . " repaired the following contact attendee " . print_r($attendeeRecords->toArray(), TRUE)); } } } if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Processing ' . count($danglingResourceIds) . ' dangling resource ids...'); } foreach ($danglingResourceIds as $danglingResourceId) { $resource = $danglingResources->getById($danglingResourceId); if ($resource && $resource->container_id) { $displayCalId = $resource->container_id; $attendeeRecords = $danglingResourceAttendee->filter('user_id', $danglingResourceId); $this->_attendeeBackend->updateMultiple($attendeeRecords->getId(), array('displaycontainer_id' => $displayCalId)); Tinebase_Core::getLogger()->NOTICE(__METHOD__ . '::' . __LINE__ . " repaired the following resource attendee " . print_r($attendeeRecords->toArray(), TRUE)); } } }
/** * @param string $oldContactId * @param string $newContactId */ public function replaceContactId($oldContactId, $newContactId) { $this->_db->update($this->_tablePrefix . $this->_tableName, array('organizer' => $newContactId), $this->_db->quoteInto($this->_db->quoteIdentifier('organizer') . ' = ?', $oldContactId)); $attendeeBackend = new Calendar_Backend_Sql_Attendee(); $attendeeBackend->replaceContactId($oldContactId, $newContactId); }
/** * deletes given attender in database * * @param Calendar_Model_Attender $_attendee * @return void */ public function deleteAttendee(array $_ids) { return $this->_attendeeBackend->delete($_ids); }
/** * testConcurrentAttendeeChangeUpdate * * @see 0008078: concurrent attendee change should be merged */ public function testConcurrentAttendeeChangeUpdate() { $eventData = $this->testCreateEvent(); $currentAttendee = $eventData['attendee']; $adminIndex = $eventData['attendee'][0]['user_id']['n_fn'] === 'Susan Clever' ? 1 : 0; $eventData['attendee'][$adminIndex]['status'] = Calendar_Model_Attender::STATUS_TENTATIVE; $event = $this->_uit->saveEvent($eventData); $loggedMods = Tinebase_Timemachine_ModificationLog::getInstance()->getModificationsBySeq(Tinebase_Application::getInstance()->getApplicationByName('Calendar')->getId(), new Calendar_Model_Attender($eventData['attendee'][$adminIndex]), 2); $this->assertEquals(1, count($loggedMods), 'attender modification has not been logged'); $eventData['attendee'] = $currentAttendee; $scleverIndex = $adminIndex === 1 ? 0 : 1; $attendeeBackend = new Calendar_Backend_Sql_Attendee(); $eventData['attendee'][$scleverIndex]['status_authkey'] = $attendeeBackend->get($eventData['attendee'][$scleverIndex]['id'])->status_authkey; $eventData['attendee'][$scleverIndex]['status'] = Calendar_Model_Attender::STATUS_TENTATIVE; $event = $this->_uit->saveEvent($eventData); foreach ($event['attendee'] as $attender) { $this->assertEquals(Calendar_Model_Attender::STATUS_TENTATIVE, $attender['status'], 'both attendee status should be TENTATIVE: ' . print_r($attender, TRUE)); } }
/** * testSetAttenderStatus */ public function testSetAttenderStatus() { $eventData = $this->testCreateEvent(); $numAttendee = count($eventData['attendee']); $eventData['attendee'][$numAttendee] = array('user_id' => $this->_personasContacts['pwulf']->getId()); $updatedEventData = $this->_uit->saveEvent($eventData); $pwulf = $this->_findAttender($updatedEventData['attendee'], 'pwulf'); // he he, we don't have his authkey, cause json class sorts it out due to rights restrictions. $attendeeBackend = new Calendar_Backend_Sql_Attendee(); $pwulf['status_authkey'] = $attendeeBackend->get($pwulf['id'])->status_authkey; $updatedEventData['container_id'] = $updatedEventData['container_id']['id']; $pwulf['status'] = Calendar_Model_Attender::STATUS_ACCEPTED; $this->_uit->setAttenderStatus($updatedEventData, $pwulf, $pwulf['status_authkey']); $loadedEventData = $this->_uit->getEvent($eventData['id']); $loadedPwulf = $this->_findAttender($loadedEventData['attendee'], 'pwulf'); $this->assertEquals(Calendar_Model_Attender::STATUS_ACCEPTED, $loadedPwulf['status']); }