Exemple #1
0
 /**
  * get matching preference from result set
  * - order: forced > user > group > default
  * - get options xml from default pref if available
  *
  * @param Tinebase_Record_RecordSet $_preferences
  * @return Tinebase_Model_Preference
  */
 protected function _getMatchingPreference(Tinebase_Record_RecordSet $_preferences)
 {
     //if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . print_r($_preferences->toArray(), TRUE));
     $_preferences->addIndices(array('type', 'account_type'));
     if (count($_preferences) == 1) {
         $result = $_preferences->getFirstRecord();
     } else {
         // check forced
         $forced = $_preferences->filter('type', Tinebase_Model_Preference::TYPE_FORCED);
         if (count($forced) > 0) {
             $_preferences = $forced;
         }
         // check user
         $user = $_preferences->filter('account_type', Tinebase_Acl_Rights::ACCOUNT_TYPE_USER);
         if (count($user) > 0) {
             $result = $user->getFirstRecord();
         } else {
             // check group
             $group = $_preferences->filter('account_type', Tinebase_Acl_Rights::ACCOUNT_TYPE_GROUP);
             if (count($group) > 0) {
                 $result = $group->getFirstRecord();
             } else {
                 // get first record of the remaining result set (defaults/anyone)
                 $result = $_preferences->getFirstRecord();
             }
         }
     }
     // add options and perhaps value from default preference
     if ($result->type !== Tinebase_Model_Preference::TYPE_DEFAULT) {
         $defaultPref = $this->_getDefaultPreference($result->name, $_preferences);
         $result->options = $defaultPref->options;
     }
     return $result;
 }
 /**
  * sort folder record set
  * - begin with INBOX + other standard/system folders, add other folders
  *
  * @param Tinebase_Record_RecordSet $_folders
  * @param string $_parentFolder
  * @return Tinebase_Record_RecordSet
  */
 protected function _sortFolders(Tinebase_Record_RecordSet $_folders, $_parentFolder)
 {
     $sortedFolders = new Tinebase_Record_RecordSet('Felamimail_Model_Folder');
     $_folders->sort('localname', 'ASC', 'natcasesort');
     $_folders->addIndices(array('globalname'));
     Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Sorting subfolders of "' . $_parentFolder . '".');
     if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) {
         Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' ' . print_r($_folders->globalname, TRUE));
     }
     foreach ($this->_systemFolders as $systemFolderName) {
         $folders = $_folders->filter('globalname', '@^' . $systemFolderName . '$@i', TRUE);
         //if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . $systemFolderName . ' => ' . print_r($folders->toArray(), TRUE));
         if (count($folders) > 0) {
             $sortedFolders->addRecord($folders->getFirstRecord());
         }
     }
     foreach ($_folders as $folder) {
         if (!in_array(strtolower($folder->globalname), $this->_systemFolders)) {
             $sortedFolders->addRecord($folder);
         }
     }
     //if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . print_r($sortedFolders->globalname, TRUE));
     return $sortedFolders;
 }
 /**
  * converts raw data from adapter into a set of records
  *
  * @param  array $_rawData of arrays
  * @return Tinebase_Record_RecordSet
  */
 protected function _rawDataToRecordSet(array $_rawData)
 {
     $events = new Tinebase_Record_RecordSet($this->_modelName);
     $events->addIndices(array('rrule', 'recurid'));
     foreach ($_rawData as $rawEvent) {
         $rawEvent['rrule_constraints'] = Tinebase_Helper::is_json($rawEvent['rrule_constraints']) ? json_decode($rawEvent['rrule_constraints'], true) : NULL;
         $events->addRecord(new Calendar_Model_Event($rawEvent, true));
     }
     $this->appendForeignRecordSetToRecordSet($events, 'attendee', 'id', Calendar_Backend_Sql_Attendee::FOREIGNKEY_EVENT, $this->_attendeeBackend);
     return $events;
 }
 /**
  * computes an returns the migration for event exceptions
  * 
  * @param Tinebase_Record_RecordSet $_currentPersistentExceptions
  * @param Tinebase_Record_RecordSet $_newPersistentExceptions
  */
 protected function _getExceptionsMigration($_currentPersistentExceptions, $_newPersistentExceptions)
 {
     $migration = array();
     // add indices and sort to speedup things
     $_currentPersistentExceptions->addIndices(array('dtstart'))->sort('dtstart');
     $_newPersistentExceptions->addIndices(array('dtstart'))->sort('dtstart');
     // get dtstarts
     $currDtStart = $_currentPersistentExceptions->getOriginalDtStart();
     $newDtStart = $_newPersistentExceptions->getOriginalDtStart();
     // compute migration in terms of dtstart
     $toDeleteDtStart = array_diff($currDtStart, $newDtStart);
     $toCreateDtStart = array_diff($newDtStart, $currDtStart);
     $toUpdateDtSTart = array_intersect($currDtStart, $newDtStart);
     $migration['toDelete'] = $this->_filterEventsByDTStarts($_currentPersistentExceptions, $toDeleteDtStart);
     $migration['toCreate'] = $this->_filterEventsByDTStarts($_newPersistentExceptions, $toCreateDtStart);
     $migration['toUpdate'] = $this->_filterEventsByDTStarts($_newPersistentExceptions, $toUpdateDtSTart);
     // get ids for toUpdate
     $idxIdMap = $this->_filterEventsByDTStarts($_currentPersistentExceptions, $toUpdateDtSTart)->getId();
     $migration['toUpdate']->setByIndices('id', $idxIdMap, true);
     // filter exceptions marked as don't touch
     foreach ($migration['toUpdate'] as $toUpdate) {
         if ($toUpdate->seq === -1) {
             $migration['toUpdate']->removeRecord($toUpdate);
         }
     }
     return $migration;
 }
 /**
  * resolves group members and adds/removes them if nesesary
  * 
  * NOTE: If a user is listed as user and as groupmember, we supress the groupmember
  * 
  * NOTE: The role to assign to a new group member is not always clear, as multiple groups
  *       might be the 'source' of the group member. To deal with this, we take the role of
  *       the first group when we add new group members
  *       
  * @param Tinebase_Record_RecordSet $_attendee
  * @return void
  */
 public static function resolveGroupMembers($_attendee)
 {
     if (!$_attendee instanceof Tinebase_Record_RecordSet) {
         return;
     }
     $_attendee->addIndices(array('user_type'));
     // flatten user_ids (not groups for group/list handling bellow)
     foreach ($_attendee as $attendee) {
         if ($attendee->user_type != Calendar_Model_Attender::USERTYPE_GROUP && $attendee->user_id instanceof Tinebase_Record_Abstract) {
             $attendee->user_id = $attendee->user_id->getId();
         }
     }
     $groupAttendee = $_attendee->filter('user_type', Calendar_Model_Attender::USERTYPE_GROUP);
     $allCurrGroupMembers = $_attendee->filter('user_type', Calendar_Model_Attender::USERTYPE_GROUPMEMBER);
     $allCurrGroupMembersContactIds = $allCurrGroupMembers->user_id;
     $allGroupMembersContactIds = array();
     foreach ($groupAttendee as $groupAttender) {
         #$groupAttenderMemberIds = Tinebase_Group::getInstance()->getGroupMembers($groupAttender->user_id);
         #$groupAttenderContactIds = Tinebase_User::getInstance()->getMultiple($groupAttenderMemberIds)->contact_id;
         #$allGroupMembersContactIds = array_merge($allGroupMembersContactIds, $groupAttenderContactIds);
         $listId = null;
         if ($groupAttender->user_id instanceof Addressbook_Model_List) {
             $listId = $groupAttender->user_id->getId();
         } else {
             if ($groupAttender->user_id !== NULL) {
                 $group = Tinebase_Group::getInstance()->getGroupById($groupAttender->user_id);
                 if (!empty($group->list_id)) {
                     $listId = $group->list_id;
                 }
             } else {
                 if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) {
                     Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' Group attender ID missing');
                 }
                 if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
                     Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . print_r($groupAttender->toArray(), TRUE));
                 }
             }
         }
         if ($listId !== null) {
             $groupAttenderContactIds = Addressbook_Controller_List::getInstance()->get($listId)->members;
             $allGroupMembersContactIds = array_merge($allGroupMembersContactIds, $groupAttenderContactIds);
             $toAdd = array_diff($groupAttenderContactIds, $allCurrGroupMembersContactIds);
             foreach ($toAdd as $userId) {
                 $_attendee->addRecord(new Calendar_Model_Attender(array('user_type' => Calendar_Model_Attender::USERTYPE_GROUPMEMBER, 'user_id' => $userId, 'role' => $groupAttender->role)));
             }
         }
     }
     $toDel = array_diff($allCurrGroupMembersContactIds, $allGroupMembersContactIds);
     foreach ($toDel as $idx => $contactId) {
         $attender = $allCurrGroupMembers->find('user_id', $contactId);
         $_attendee->removeRecord($attender);
     }
     // calculate double members (groupmember + user)
     $groupmembers = $_attendee->filter('user_type', Calendar_Model_Attender::USERTYPE_GROUPMEMBER);
     $users = $_attendee->filter('user_type', Calendar_Model_Attender::USERTYPE_USER);
     $doublicates = array_intersect($users->user_id, $groupmembers->user_id);
     foreach ($doublicates as $user_id) {
         $attender = $groupmembers->find('user_id', $user_id);
         $_attendee->removeRecord($attender);
     }
 }
 public function testRegexpFilter()
 {
     $recordSet = new Tinebase_Record_RecordSet('Tinebase_Record_DummyRecord');
     $recordSet->addRecord(new Tinebase_Record_DummyRecord(array('id' => '100', 'string' => 'bommel-1'), true));
     $recordSet->addRecord(new Tinebase_Record_DummyRecord(array('id' => '200', 'string' => 'super-1'), true));
     $recordSet->addRecord(new Tinebase_Record_DummyRecord(array('id' => '300', 'string' => 'bommel-2'), true));
     $filterResultWOIndices = $recordSet->filter('string', '/^bommel.*/', TRUE);
     $this->assertEquals(2, count($filterResultWOIndices));
     $this->assertEquals(array(100, 300), $filterResultWOIndices->getArrayOfIds());
     $recordSet->addIndices(array('string'));
     $filterResultWIndices = $recordSet->filter('string', '/^bommel.*/', TRUE);
     $this->assertEquals(count($filterResultWOIndices), count($filterResultWIndices));
     $this->assertEquals(array(100, 300), $filterResultWIndices->getArrayOfIds());
 }
Exemple #7
0
 /**
  * move messages
  * 
  * @param Tinebase_Record_RecordSet $_messages
  * @param  mixed  $_targetFolder can be one of: Felamimail_Model_Folder or Felamimail_Model_Folder::FOLDER_TRASH (constant)
  * @return Tinebase_Record_RecordSet of Felamimail_Model_Folder
  */
 public function processMoveIteration($_messages, $_targetFolder)
 {
     $_messages->addIndices(array('folder_id'));
     $movedMessages = FALSE;
     foreach (array_unique($_messages->folder_id) as $folderId) {
         $movedMessages = $this->_moveMessagesByFolder($_messages, $folderId, $_targetFolder) || $movedMessages;
     }
     if (!$movedMessages) {
         // no messages have been moved -> return empty record set
         $result = new Tinebase_Record_RecordSet('Felamimail_Model_Folder');
     } else {
         // delete messages in local cache
         $number = $this->_backend->delete($_messages->getArrayOfIds());
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Deleted ' . $number . ' messages from cache');
         }
         $result = $this->_updateCountsAfterMove($_messages);
     }
     return $result;
 }
 /**
  * add multiple modification system nodes
  * 
  * @param Tinebase_Record_RecordSet $_mods
  * @param string $_userId
  * @param string $modelName
  */
 public function addMultipleModificationSystemNotes($_mods, $_userId, $modelName = null)
 {
     $_mods->addIndices(array('record_id'));
     foreach ($_mods->record_id as $recordId) {
         $modsOfRecord = $_mods->filter('record_id', $recordId);
         $this->addSystemNote($recordId, $_userId, Tinebase_Model_Note::SYSTEM_NOTE_NAME_CHANGED, $modsOfRecord, 'Sql', $modelName);
     }
 }
Exemple #9
0
 /**
  * filter recordset and return subset
  *
  * @param string $_field
  * @param string $_value
  * @return Tinebase_Record_RecordSet
  */
 public function filter($_field, $_value, $_valueIsRegExp = FALSE)
 {
     $matchingRecords = $this->_getMatchingRecords($_field, $_value, $_valueIsRegExp);
     $result = new Tinebase_Record_RecordSet($this->_recordClass, $matchingRecords);
     $result->addIndices(array_keys($this->_indices));
     return $result;
 }