/**
  * 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');
 }
Exemplo n.º 2
0
 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());
 }
Exemplo n.º 3
0
 /**
  * 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);
 }
Exemplo n.º 6
0
 /**
  * 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));
     }
 }
Exemplo n.º 8
0
 /**
  * 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']);
 }