/** * get export object for given filter and format * * @param Tinebase_Model_Filter_FilterGroup $_filter * @param string|array $_options format (as string) or export definition id (array) * @param Tinebase_Controller_Record_Interface $_controller (optional) * @param array $_additionalOptions (optional) * @return Tinebase_Export_Abstract * @throws Tinebase_Exception_NotFound */ public static function factory($_filter, $_options, $_controller = NULL, $_additionalOptions = array()) { if (!is_array($_options)) { $_options = array('format' => $_options); } if (array_key_exists('definitionId', $_options)) { $definition = Tinebase_ImportExportDefinition::getInstance()->get($_options['definitionId']); $exportClass = $definition->plugin; // export plugin needs the definition id $_additionalOptions = array_merge($_additionalOptions, $_options); } else { if (array_key_exists('format', $_options) && !empty($_options['format'])) { $appName = $_filter->getApplicationName(); $model = $_filter->getModelName(); $exportClass = $appName . '_Export_' . ucfirst(strtolower($_options['format'])); if (!@class_exists($exportClass)) { // check for model specific export class list($a, $b, $modelPart) = explode('_', $model); $exportClass = $exportClass . '_' . $modelPart; if (!@class_exists($exportClass)) { throw new Tinebase_Exception_NotFound('No ' . $_options['format'] . ' export class found for ' . $appName . ' / ' . $model); } } } else { throw new Tinebase_Exception_InvalidArgument('Export definition ID or format required in options'); } } if (preg_match('/pdf/i', $exportClass)) { // legacy $result = new $exportClass($_additionalOptions); } else { $result = new $exportClass($_filter, $_controller, $_additionalOptions); } return $result; }
/** * 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'); }
/** * append relation filter * * @param Tinebase_Model_Filter_FilterGroup $filter */ protected function _advancedSearch(Tinebase_Model_Filter_FilterGroup $filter) { $relationFilter = $this->_getAdvancedSearchFilter('Crm_Model_Lead', array('Addressbook_Model_Contact', 'Sales_Model_Product', 'Tasks_Model_Task')); if ($relationFilter) { $filter->addFilter($relationFilter); } }
/** * Removes accounts where current user has no access to * * @param Tinebase_Model_Filter_FilterGroup $_filter * @param string $_action get|update * * @todo move logic to Felamimail_Model_MessageFilter */ public function checkFilterACL(Tinebase_Model_Filter_FilterGroup $_filter, $_action = 'get') { $accountFilter = $_filter->getFilter('account_id'); // force a $accountFilter filter (ACL) / all accounts of user if ($accountFilter === NULL || $accountFilter['operator'] !== 'equals' || !empty($accountFilter['value'])) { $_filter->createFilter('account_id', 'equals', array()); } }
/** * the constructor * * @param Tinebase_Model_Filter_FilterGroup $_filter * @param Tinebase_Controller_Record_Interface $_controller (optional) * @param array $_additionalOptions (optional) additional options */ public function __construct(Tinebase_Model_Filter_FilterGroup $_filter, Tinebase_Controller_Record_Interface $_controller = NULL, $_additionalOptions = array()) { $periodFilter = $_filter->getFilter('period'); if ($periodFilter) { $this->_from = $periodFilter->getFrom(); $this->_until = $periodFilter->getUntil(); } parent::__construct($_filter, $_controller, $_additionalOptions); }
/** * append record paths (if path filter is set) * * @param Tinebase_Record_RecordSet $_records * @param Tinebase_Model_Filter_FilterGroup $_filter * * TODO move to generic json converter */ protected function _appendRecordPaths($_records, $_filter) { if ($_filter && $_filter->getFilter('path', false, true) !== null) { $recordPaths = Tinebase_Record_Path::getInstance()->getPathsForRecords($_records); foreach ($_records as $record) { $record->paths = $recordPaths->filter('record_id', $record->getId()); } } }
/** * the constructor * * @param Tinebase_Model_Filter_FilterGroup $_filter * @param Tinebase_Controller_Record_Interface $_controller (optional) * @param array $_additionalOptions (optional) additional options */ public function init(Tinebase_Model_Filter_FilterGroup $_filter, Tinebase_Controller_Record_Interface $_controller = NULL, $_additionalOptions = array()) { $this->_applicationName = 'Calendar'; $this->_modelName = 'Event'; $periodFilter = $_filter->getFilter('period', false, true); if ($periodFilter) { $this->_from = $periodFilter->getFrom(); $this->_until = $periodFilter->getUntil(); } parent::__construct($_filter, $_controller, $_additionalOptions); }
/** * get export object for given filter and format * * @param Tinebase_Model_Filter_FilterGroup $_filter * @param string|array $_options format (as string) or export definition id (array) * @param Tinebase_Controller_Record_Interface $_controller (optional) * @param array $_additionalOptions (optional) * @return Tinebase_Export_Abstract * @throws Tinebase_Exception_NotFound */ public static function factory($_filter, $_options, $_controller = NULL, $_additionalOptions = array()) { if (!is_array($_options)) { $_options = array('format' => $_options); } // always merge options? this needs to be refactored! $_additionalOptions = array_merge($_additionalOptions, $_options); if (isset($_options['definitionId']) || array_key_exists('definitionId', $_options)) { $definition = Tinebase_ImportExportDefinition::getInstance()->get($_options['definitionId']); $exportClass = $definition->plugin; } else { if ((isset($_options['format']) || array_key_exists('format', $_options)) && !empty($_options['format'])) { $appName = $_filter->getApplicationName(); $model = $_filter->getModelName(); $exportClass = $appName . '_Export_' . ucfirst(strtolower($_options['format'])); // start output buffering to catch errors, append them to log and exception ob_start(); if (!class_exists($exportClass)) { $ob = ob_get_length() > 0 ? ob_get_clean() : ''; // check for model specific export class list($a, $b, $modelPart) = explode('_', $model); $exportClass2 = $exportClass . '_' . $modelPart; if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) { Tinebase_Core::getLogger()->log(__METHOD__ . '::' . __LINE__ . ' Could not find class ' . $exportClass . ' trying ' . $exportClass2 . '. Output Buffer: ' . PHP_EOL . $ob, Zend_Log::NOTICE); } if (!class_exists($exportClass2)) { $ob = ob_get_length() > 0 ? ob_get_clean() : NULL; ob_end_flush(); throw new Tinebase_Exception_NotFound('No ' . $_options['format'] . ' export class found for ' . $appName . ' / ' . $model . '. ClassName: ' . $exportClass2 . ($ob ? 'Output: ' . $ob : '')); } else { $exportClass = $exportClass2; } } ob_end_flush(); } else { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Export options: ' . print_r($_options, TRUE)); } throw new Tinebase_Exception_InvalidArgument('Export definition ID or format required in options'); } } if (preg_match('/pdf/i', $exportClass)) { // legacy $result = new $exportClass($_additionalOptions); } else { $result = new $exportClass($_filter, $_controller, $_additionalOptions); } return $result; }
/** * Search for records matching given filter * * @param Tinebase_Model_Filter_FilterGroup $_filter * @param Tinebase_Model_Pagination $_pagination * @param array|string|boolean $_cols columns to get, * per default / use self::IDCOL or TRUE to get only ids * @return Tinebase_Record_RecordSet|array */ public function search(Tinebase_Model_Filter_FilterGroup $_filter = NULL, Tinebase_Model_Pagination $_pagination = NULL, $_cols = '*') { $filters = $_filter->getFilterObjects(); // TODO: implement this folder filter // $folderFilter = new Felamimail_Model_FolderFilter(array( // array('field' => 'account_id', 'operator' => 'in', 'value' => $accounts->getArrayOfIds()), // array('field' => 'localname', 'operator' => 'equals', 'value' => 'INBOX') // )); foreach ($filters as $filter) { switch ($filter->getField()) { case 'account_id': $accountId = $filter->getValue(); break; case 'parent': $globalName = $filter->getValue(); $parent = true; break; case 'id': $felamimailAccount = Felamimail_Controller_Account::getInstance()->search()->toArray(); $accountId = $felamimailAccount[0]['id']; $globalName = $filter->getValue(); $parent = true; break; case 'globalname': $globalName = $filter->getValue(); if ($filter->getOperator() == 'startswith') { $parent = true; $globalName = substr($globalName, 0, -1); } break; } } $resultArray = array(); $accountId = (array) $accountId; foreach ($accountId as $id) { $account = Felamimail_Controller_Account::getInstance()->get($id); if ($parent === true) { $folders = $this->_getFoldersFromIMAP($account, $globalName); foreach ($folders as $folder) { $resultArray[] = $this->get(self::encodeFolderUid($folder['globalName'], $id)); } } else { $resultArray[] = $this->get(self::encodeFolderUid(Felamimail_Model_Folder::encodeFolderName($globalName), $id)); } } $result = new Tinebase_Record_RecordSet('Felamimail_Model_Folder', $resultArray, true); return $result; }
/** * get records and resolve fields * * @return Tinebase_Record_RecordSet */ protected function _getRecords() { $pagination = !empty($this->_options['sortInfo']) ? new Tinebase_Model_Pagination($this->_options['sortInfo']) : new Tinebase_Model_Pagination(); if ($this->_recordIds === NULL) { // need to fetch record ids first because filtered fields can change during iteration step if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' Getting record ids using filter: ' . print_r($this->_filter->toArray(), TRUE) . ' and pagination: ' . print_r($pagination->toArray(), true)); } $this->_recordIds = $this->_controller->search($this->_filter, $pagination, FALSE, TRUE, $this->_options['searchAction']); $this->_totalCount = count($this->_recordIds); if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Found ' . $this->_totalCount . ' total records to process.'); } if (empty($this->_recordIds)) { return new Tinebase_Record_RecordSet($this->_filter->getModelName()); } } // get records by filter (ensure acl) $filterClassname = get_class($this->_filter); $recordIdsForIteration = array_splice($this->_recordIds, 0, $this->_options['limit']); $idFilter = new $filterClassname(array(array('field' => isset($this->_options['idProperty']) || array_key_exists('idProperty', $this->_options) ? $this->_options['idProperty'] : 'id', 'operator' => 'in', 'value' => $recordIdsForIteration))); $records = $this->_controller->search($idFilter, $pagination, $this->_options['getRelations']); if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Got ' . count($records) . ' for next iteration.'); } return $records; }
/** * export records */ protected function _exportRecords() { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Starting export of ' . $this->_modelName . ' with filter: ' . print_r($this->_filter->toArray(), true) . ' and sort info: ' . print_r($this->_sortInfo, true)); } $iterator = new Tinebase_Record_Iterator(array('iteratable' => $this, 'controller' => $this->_controller, 'filter' => $this->_filter, 'options' => array('searchAction' => 'export', 'sortInfo' => $this->_sortInfo, 'getRelations' => $this->_getRelations))); $result = $iterator->iterate(); $this->_onAfterExportRecords($result); if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Exported ' . $result['totalcount'] . ' records.'); } }
/** * get list of records * * @param Tinebase_Model_Filter_FilterGroup|optional $_filter * @param Tinebase_Model_Pagination|optional $_pagination * @param boolean|array $_getRelations * @param boolean $_onlyIds * @param string $_action for right/acl check * @return Tinebase_Record_RecordSet|array */ public function search(Tinebase_Model_Filter_FilterGroup $_filter = NULL, Tinebase_Record_Interface $_pagination = NULL, $_getRelations = FALSE, $_onlyIds = FALSE, $_action = 'get') { //@TODO support more appfilter combinations when needed $appFilter = $_filter->getFilter('application_id'); $app = Tinebase_Application::getInstance()->getApplicationById($appFilter->getValue()); $appname = $app->name; if (!Tinebase_Core::getUser()->hasRight($appname, 'admin')) { throw new Tinebase_Exception_AccessDenied("You do not have admin rights for {$appname}"); } $configRecords = new Tinebase_Record_RecordSet('Tinebase_Model_Config'); $appConfigObject = Tinebase_Config::getAppConfig($appname); $appConfigDefinitions = $appConfigObject->getProperties(); $appDBConfig = $this->_configBackend->search($_filter); foreach ($appConfigDefinitions as $name => $definition) { if (array_key_exists('setByAdminModule', $definition) && $definition['setByAdminModule']) { $configFromFile = $appConfigObject->getConfigFileSection($name); $configFromDb = $appDBConfig->filter('name', $name)->getFirstRecord(); if ($configFromDb && !$configFromFile) { $configRecord = $this->_mergeDefinition($configFromDb, $definition); $configRecord->source = Tinebase_Model_Config::SOURCE_DB; } else { $definition['id'] = 'virtual-' . $name; $definition['application_id'] = $app->getId(); $definition['name'] = $name; $definition['value'] = json_encode($configFromFile); $definition['source'] = is_null($configFromFile) ? Tinebase_Model_Config::SOURCE_DEFAULT : Tinebase_Model_Config::SOURCE_FILE; $configRecord = new Tinebase_Model_Config($definition); } // exclude config's which the admin can't set if ($configRecord->source != Tinebase_Model_Config::SOURCE_FILE) { $configRecords->addRecord($configRecord); } } } return $configRecords; }
public function toArray($_valueToJson = false) { $result = parent::toArray($_valueToJson); /* foreach ($result as &$filterData) { if ($filterData['field'] == 'id' && $_valueToJson == true && ! empty($filterData['value'])) { //if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' value:' . print_r($filterData['value'], true)); try { $filterData['value'] = Donator_Controller_Project::getInstance()->get($filterData['value'])->toArray(); } catch (Tinebase_Exception_NotFound $nfe) { if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) Tinebase_Core::getLogger()->INFO(__METHOD__ . '::' . __LINE__ . " could not find and resolve timeaccount {$filterData['value']}"); } } }*/ return $result; }
/** * (non-PHPdoc) * @see ActiveSync_Frontend_Abstract::_addContainerFilter() */ protected function _addContainerFilter(Tinebase_Model_Filter_FilterGroup $_filter, $_containerId) { // custom filter gets added when created $_filter->createFilter('account_id', 'equals', Tinebase_Core::getPreference('Expressomail')->{Expressomail_Preference::DEFAULTACCOUNT}); $_filter->addFilter($_filter->createFilter('folder_id', 'equals', $_containerId)); }
/** * Removes containers where current user has no access to * * @param Timetracker_Model_TimeaccountFilter $_filter * @param string $_action */ public function checkFilterACL(Tinebase_Model_Filter_FilterGroup $_filter, $_action = 'get') { switch ($_action) { case 'get': $_filter->setRequiredGrants(array(Timetracker_Model_TimeaccountGrants::BOOK_OWN, Timetracker_Model_TimeaccountGrants::BOOK_ALL, Timetracker_Model_TimeaccountGrants::VIEW_ALL, Tinebase_Model_Grants::GRANT_ADMIN)); break; case 'update': $_filter->setRequiredGrants(array(Tinebase_Model_Grants::GRANT_ADMIN)); break; case 'export': $_filter->setRequiredGrants(array(Tinebase_Model_Grants::GRANT_EXPORT, Tinebase_Model_Grants::GRANT_ADMIN)); break; default: throw new Timetracker_Exception_UnexpectedValue('Unknown action: ' . $_action); } }
/** * search tree nodes * * @param Tinebase_Model_Filter_FilterGroup|optional $_filter * @param Tinebase_Model_Pagination|optional $_pagination * @param bool $_getRelations * @param bool $_onlyIds * @param string|optional $_action * @return Tinebase_Record_RecordSet of Tinebase_Model_Tree_Node */ public function search(Tinebase_Model_Filter_FilterGroup $_filter = NULL, Tinebase_Record_Interface $_pagination = NULL, $_getRelations = FALSE, $_onlyIds = FALSE, $_action = 'get') { // perform recursive search on recursive filter set if ($_filter->getFilter('recursive')) { return $this->_searchNodesRecursive($_filter, $_pagination); } else { $path = $this->_checkFilterACL($_filter, $_action); } if ($path->containerType === Tinebase_Model_Tree_Node_Path::TYPE_ROOT) { $result = $this->_getRootNodes(); } else { if ($path->containerType === Tinebase_Model_Container::TYPE_PERSONAL && !$path->containerOwner) { if (!file_exists($path->statpath)) { $this->_backend->mkdir($path->statpath); } $result = $this->_getOtherUserNodes(); } else { try { $result = $this->_backend->searchNodes($_filter, $_pagination); } catch (Tinebase_Exception_NotFound $tenf) { // create basic nodes like personal|shared|user root if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . $path->statpath); } if ($path->name === Tinebase_Model_Container::TYPE_SHARED || $path->statpath === $this->_backend->getApplicationBasePath(Tinebase_Application::getInstance()->getApplicationByName($this->_applicationName), Tinebase_Model_Container::TYPE_PERSONAL) . '/' . Tinebase_Core::getUser()->getId()) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Creating new path ' . $path->statpath); } $this->_backend->mkdir($path->statpath); $result = $this->_backend->searchNodes($_filter, $_pagination); } else { throw $tenf; } } $this->resolveContainerAndAddPath($result, $path); $this->_sortContainerNodes($result, $path, $_pagination); } } return $result; }
/** * add default preferences to and remove undefined preferences from record set * * @param Tinebase_Record_RecordSet $_prefs * @param Tinebase_Model_Filter_FilterGroup $_filter */ protected function _addDefaultAndRemoveUndefinedPrefs(Tinebase_Record_RecordSet $_prefs, Tinebase_Model_Filter_FilterGroup $_filter) { $allAppPrefs = $this->getAllApplicationPreferences(); // add default prefs if not already in array (only if no name or type filters are set) if (!$_filter->isFilterSet('name') && !$_filter->isFilterSet('type')) { $missingDefaultPrefs = array_diff($allAppPrefs, $_prefs->name); foreach ($missingDefaultPrefs as $prefName) { $_prefs->addRecord($this->getApplicationPreferenceDefaults($prefName)); } } // remove all prefs that are not defined $undefinedPrefs = array_diff($_prefs->name, $allAppPrefs); if (count($undefinedPrefs) > 0) { $_prefs->addIndices(array('name')); foreach ($undefinedPrefs as $undefinedPrefName) { $record = $_prefs->find('name', $undefinedPrefName); $_prefs->removeRecord($record); if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) { Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Removed undefined preference from result: ' . $undefinedPrefName); } } } }
/** * get the filter group object * * @param $filterModel * @return Tinebase_Model_Filter_FilterGroup */ protected function _getFilterObject($filterModel) { if (!class_exists($filterModel)) { $configuredModel = preg_replace('/Filter$/', '', $filterModel); // TODO check if model class exists? //if (class_exists($configuredModel)) // use generic filter model $filter = new Tinebase_Model_Filter_FilterGroup(); $filter->setConfiguredModel($configuredModel); } else { $filter = new $filterModel(); } return $filter; }
/** * add columns from filter * * @param array $_colsToFetch * @param Tinebase_Model_Filter_FilterGroup $_filter * @return array */ protected function _addFilterColumns($_colsToFetch, Tinebase_Model_Filter_FilterGroup $_filter) { // need to ask filter if it needs additional columns $filterCols = $_filter->getRequiredColumnsForSelect(); foreach ($filterCols as $key => $filterCol) { if (!(isset($_colsToFetch[$key]) || array_key_exists($key, $_colsToFetch))) { $_colsToFetch[$key] = $filterCol; } } return $_colsToFetch; }
/** * 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)); } } }
/** * returns the active contract for the given employee and date or now, when no date is given * * @param string $_employeeId * @param Tinebase_DateTime $_firstDayDate * @throws Tinebase_Exception_InvalidArgument * @throws HumanResources_Exception_NoCurrentContract * @throws Tinebase_Exception_Duplicate * @return HumanResources_Model_Contract */ public function getValidContract($_employeeId, $_firstDayDate = NULL) { if (!$_employeeId) { throw new Tinebase_Exception_InvalidArgument('You have to set an account id at least'); } $_firstDayDate = $_firstDayDate ? new Tinebase_DateTime($_firstDayDate) : new Tinebase_DateTime(); $filter = new HumanResources_Model_ContractFilter(array(), 'AND'); $filter->addFilter(new Tinebase_Model_Filter_Date(array('field' => 'start_date', 'operator' => 'before', 'value' => $_firstDayDate))); $filter->addFilter(new Tinebase_Model_Filter_Text(array('field' => 'employee_id', 'operator' => 'equals', 'value' => $_employeeId))); $endDate = new Tinebase_Model_Filter_FilterGroup(array(), 'OR'); $endDate->addFilter(new Tinebase_Model_Filter_Date(array('field' => 'end_date', 'operator' => 'after', 'value' => $_firstDayDate))); $filter->addFilterGroup($endDate); $contracts = $this->search($filter); if ($contracts->count() < 1) { $filter = new HumanResources_Model_ContractFilter(array(), 'AND'); $filter->addFilter(new Tinebase_Model_Filter_Text(array('field' => 'employee_id', 'operator' => 'equals', 'value' => $_employeeId))); $contracts = $this->search($filter); if ($contracts->count() > 0) { $e = new HumanResources_Exception_NoCurrentContract(); $e->addRecord($contracts->getFirstRecord()); throw $e; } else { throw new HumanResources_Exception_NoContract(); } } else { if ($contracts->count() > 1) { throw new Tinebase_Exception_Duplicate('There are more than one valid contracts for this employee!'); } } return $contracts->getFirstRecord(); }
public function printReceiptsByFilter($preview = false, $outputType, $filters, $userOptions, $types, $sort, $additionalOptions) { $additionalOptions = Zend_Json::decode($additionalOptions); if ($additionalOptions['addressLabels'] == true) { $this->printAddressLabelsByFilter($outputType, $filters, $userOptions, $types, $sort); return; } $sortField = 'creation_time'; $sortDir = 'ASC'; $sort = Zend_Json::decode($sort); $this->setUseSorting(true); if (is_array($sort) && array_key_exists('field', $sort) && array_key_exists('order', $sort)) { if (in_array($sort['field'], array('creation_time', 'order_nr'))) { $sortField = $sort['field']; } if (in_array($sort['order'], array('ASC', 'DESC'))) { $sortDir = $sort['order']; } } $this->setTypes(Zend_Json::decode($types)); $this->setOutputType($outputType); $this->setPreview($preview); $this->setFilters($filters); $this->setUserOptions($userOptions); if ($additionalOptions['preview'] == true) { $this->setPreview(true); } if ($additionalOptions['copy'] == true) { $this->setCopy(true); } $filters = $this->createFilters(); $firstGroup = new Tinebase_Model_Filter_FilterGroup(array(), 'AND'); $firstGroup->addFilterGroup($filters); if (!$this->preview && !$this->copy) { // only print receipts with empty print date! $firstGroup->addFilter(new Tinebase_Model_Filter_Date('print_date', 'isnull')); } $typesGroup = new Tinebase_Model_Filter_FilterGroup(array(), 'OR'); $inoviceFilter = null; $shippingFilter = null; if ($this->types['invoice'] == true) { $invoiceFilter = new Tinebase_Model_Filter_Text('type', 'equals', Billing_Model_Receipt::TYPE_INVOICE); } if ($this->types['credit'] == true) { $invoiceFilter = new Tinebase_Model_Filter_Text('type', 'equals', Billing_Model_Receipt::TYPE_CREDIT); } if ($this->types['shipping'] == true) { $shippingFilter = new Tinebase_Model_Filter_Text('type', 'equals', Billing_Model_Receipt::TYPE_SHIPPING); } if (!$invoiceFilter && !$shippingFilter) { $invoiceFilter = new Tinebase_Model_Filter_Text('type', 'equals', Billing_Model_Receipt::TYPE_INVOICE); } if ($invoiceFilter) { $typesGroup->addFilter($invoiceFilter); } if ($shippingFilter) { $typesGroup->addFilter($shippingFilter); } $firstGroup->addFilterGroup($typesGroup); $paging = new Tinebase_Model_Pagination(array('sort' => $sortField, 'dir' => $sortDir)); // -> get ids only $this->receiptIds = $this->_receiptController->search($firstGroup, $paging, false, TRUE); $this->runTransaction(self::PROCESS_RECEIPTS); }
/** * you can define default filters here * * @param Tinebase_Model_Filter_FilterGroup $_filter */ protected function _addDefaultFilter(Tinebase_Model_Filter_FilterGroup $_filter = NULL) { if (!$_filter->isFilterSet('showHidden')) { $hiddenFilter = $_filter->createFilter('showHidden', 'equals', FALSE); $hiddenFilter->setIsImplicit(TRUE); $_filter->addFilter($hiddenFilter); } }
/** * add container acl filter to filter group * * @param Tinebase_Model_Filter_FilterGroup $_filter * @param string $_containerId */ protected function _addContainerFilter(Tinebase_Model_Filter_FilterGroup $_filter, $_containerId) { $syncableContainers = $this->_getSyncableFolders(); $containerIds = array(); if ($_containerId == $this->_specialFolderName) { $containerIds = $syncableContainers->getArrayOfIds(); } elseif (in_array($_containerId, $syncableContainers->id)) { $containerIds = array($_containerId); } $_filter->addFilter($_filter->createFilter('container_id', 'in', $containerIds)); }
/** * Removes containers where current user has no access to * * @param Tinebase_Model_Filter_FilterGroup $_filter * @param string $_action get|update */ public function checkFilterACL(Tinebase_Model_Filter_FilterGroup $_filter, $_action = 'get') { if (!$this->_doContainerACLChecks) { if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' Container ACL disabled for ' . $_filter->getModelName() . '.'); } return TRUE; } $aclFilters = $_filter->getAclFilters(); if (!$aclFilters) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Force a standard containerFilter (specialNode = all) as ACL filter.'); } $containerFilter = $_filter->createFilter('container_id', 'specialNode', 'all', array('applicationName' => $_filter->getApplicationName())); $_filter->addFilter($containerFilter); } if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' Setting filter grants for action ' . $_action); } switch ($_action) { case 'get': $_filter->setRequiredGrants(array(Tinebase_Model_Grants::GRANT_READ, Tinebase_Model_Grants::GRANT_ADMIN)); break; case 'update': $_filter->setRequiredGrants(array(Tinebase_Model_Grants::GRANT_EDIT, Tinebase_Model_Grants::GRANT_ADMIN)); break; case 'export': $_filter->setRequiredGrants(array(Tinebase_Model_Grants::GRANT_EXPORT, Tinebase_Model_Grants::GRANT_ADMIN)); break; case 'sync': $_filter->setRequiredGrants(array(Tinebase_Model_Grants::GRANT_SYNC, Tinebase_Model_Grants::GRANT_ADMIN)); break; default: throw new Tinebase_Exception_UnexpectedValue('Unknown action: ' . $_action); } }
/** * get list of records * * @param Tinebase_Model_Filter_FilterGroup $_filter * @param Tinebase_Model_Pagination $_pagination * @param boolean $_getRelations * @param boolean $_onlyIds * @param string $_action for right/acl check * @return Tinebase_Record_RecordSet|array */ public function search(Tinebase_Model_Filter_FilterGroup $_filter = NULL, Tinebase_Model_Pagination $_pagination = NULL, $_getRelations = FALSE, $_onlyIds = FALSE, $_action = 'get') { $_filter->setId('OuterFilter'); return parent::search($_filter, $_pagination, $_getRelations, $_onlyIds, $_action); }
/** * Search for records matching given filter * * @param Tinebase_Model_Filter_FilterGroup $_filter * @param Tinebase_Model_Pagination $_pagination * @param array|string|boolean $_cols columns to get, * per default / use self::IDCOL or TRUE to get only ids * @return Tinebase_Record_RecordSet|array * * @todo implement optimizations on flags and security sorting * @todo implement messageuid,account_id search */ public function search(Tinebase_Model_Filter_FilterGroup $_filter = NULL, Tinebase_Model_Pagination $_pagination = NULL, $_cols = '*') { /* Tinebase_Core::getLogger()->alert(__METHOD__ . '#####::#####' . __LINE__ . ' Message Search = $_filter ' . print_r($_filter,true)); Tinebase_Core::getLogger()->alert(__METHOD__ . '#####::#####' . __LINE__ . ' Message Search = $_pagination' . print_r($_filter,true)); Tinebase_Core::getLogger()->alert(__METHOD__ . '#####::#####' . __LINE__ . ' Message Search = $_cols' . print_r($_cols,true)); */ $return = null; $messages = array(); $filterObjects = $_filter->getFilterObjects(); $imapFilters = $this->_parseFilterGroup($_filter, $_pagination); $pagination = !$_pagination ? new Tinebase_Model_Pagination(NULL, TRUE) : $_pagination; if (empty($imapFilters['paths'])) { $paths = $this->_getAllFolders(); $imapFilters['paths'] = $this->_getFoldersInfo($paths); } // TODO: do pagination on $ids and return after getMultiple if ($imapFilters['filters'] == 'Id') { $ids = $filterObjects[0]->getValue(); $ids = $this->_doPagination((array) $ids, $pagination); if ($_cols === TRUE) { return empty($ids) ? array() : $ids; } else { return empty($ids) ? $this->_rawDataToRecordSet(array()) : $this->getMultiple($ids); } } else { $ids = $this->_getIds($imapFilters, $_pagination); // get Summarys and merge results foreach ($ids as $folderId => $idsInFolder) { $folder = Felamimail_Controller_Folder::getInstance()->get($folderId); $imap = Felamimail_Backend_ImapFactory::factory($folder->account_id); $imap->selectFolder(Felamimail_Model_Folder::encodeFolderName($folder->globalname)); $idsInFolder = count($ids) === 1 ? $this->_doPagination($idsInFolder, $_pagination) : $idsInFolder; // do pagination early $messagesInFolder = $imap->getSummary($idsInFolder, null, null, $folderId); if (count($ids) === 1) { $tmp = array(); // We cannot trust the order we get from getSummary(), so we'll have to // put it the right order, defined by $idsInFolder // TODO: Put it into Felamilail_Backend_Imap->getSummary()???? foreach ($idsInFolder as $id) { $tmp[$id] = $messagesInFolder[$id]; } $messagesInFolder = $tmp; unset($tmp); } $messages = array_merge($messages, $messagesInFolder); if (count($ids) !== 1 && count($messages) > 1000) { throw new Felamimail_Exception_IMAPCacheTooMuchResults(); } } if (count($ids) === 1 && !in_array($pagination->sort, $this->_imapSortParams) || count($ids) > 1) { $callback = new Felamimail_Backend_Cache_Imap_MessageComparator($pagination); uasort($messages, array($callback, 'compare')); } } if (empty($messages)) { return $this->_rawDataToRecordSet(array()); } // Apply Pagination and get the resulting summary $page = count($ids) === 1 ? $messages : $this->_doPagination($messages, $_pagination); // $limit = empty($pagination->limit) ? count($messages) : $pagination->limit; // $chunked = array_chunk($messages, $limit, true); // $chunkIndex = empty($pagination->start) ? 0 : $pagination->start/$limit; // Put headers into model // if($imapFilters['filters'] == 'Id'){ // $return = empty($chunked[$chunkIndex])?new Tinebase_Record_RecordSet('Felamimail_Model_Message', array(), true): new Tinebase_Record_RecordSet('Felamimail_Model_Message', $chunked[$chunkIndex], true); // }else $return = empty($page) ? $this->_rawDataToRecordSet(array()) : $this->_rawDataToRecordSet($this->_createModelMessageArray($page)); Tinebase_Core::getLogger()->alert(__METHOD__ . '#####::#####' . __LINE__ . ' Imap Sort = $sorted ' . print_r($messages, true)); return $return; // // Tinebase_Core::getLogger()->alert(__METHOD__ . '#####::#####' . __LINE__ . ' Could\'nt use Imap directly' . print_r($return,true)); // $aux = new Felamimail_Backend_Cache_Sql_Message(); // $return = $aux->search($_filter,$_pagination, $_cols); //Tinebase_Core::getLogger()->alert(__METHOD__ . '#####::#####' . __LINE__ . ' Message Search = $retorno' . print_r($retorno,true)); }
/** * Calendar optimized search function * * @param Tinebase_Model_Filter_FilterGroup $_filter * @param Tinebase_Model_Pagination $_pagination * @param boolean $_onlyIds * @param bool $_getDeleted * @return Tinebase_Record_RecordSet|array */ public function search(Tinebase_Model_Filter_FilterGroup $_filter = NULL, Tinebase_Model_Pagination $_pagination = NULL, $_onlyIds = FALSE, $_getDeleted = FALSE) { if ($_pagination === NULL) { $_pagination = new Tinebase_Model_Pagination(); } // we use a an extra select to reduce data amount where grants etc. have to be computed for. // the exdate is already appended here, to reduce virtual row numbers later $subselect = $this->_getSelectSimple('id', $_getDeleted); $subselect->joinLeft(array('exdate' => $this->_tablePrefix . 'cal_exdate'), $this->_db->quoteIdentifier('exdate.cal_event_id') . ' = ' . $this->_db->quoteIdentifier($this->_tableName . '.id'), array('exdate' => Tinebase_Backend_Sql_Command::getAggregateFunction($this->_db, $this->_db->quoteIdentifier('exdate.exdate')))); // this attendee join has nothing to do with grants but is here for attendee/status/... filters $subselect->joinLeft(array('attendee' => $this->_tablePrefix . 'cal_attendee'), $this->_db->quoteIdentifier('attendee.cal_event_id') . ' = ' . $this->_db->quoteIdentifier('cal_events.id'), array()); if (!$_getDeleted) { $subselect->joinLeft(array('dispcontainer' => $this->_tablePrefix . 'container'), $this->_db->quoteIdentifier('dispcontainer.id') . ' = ' . $this->_db->quoteIdentifier('attendee.displaycontainer_id'), array()); $subselect->where($this->_db->quoteIdentifier('dispcontainer.is_deleted') . ' = 0 OR ' . $this->_db->quoteIdentifier('dispcontainer.is_deleted') . 'IS NULL'); } // remove grantsfilter here as we need it in the main select $grantsFilter = $_filter->getFilter('grants'); if ($grantsFilter) { $_filter->removeFilter('grants'); } $this->_addFilter($subselect, $_filter); $_pagination->appendPaginationSql($subselect); $subselect->group($this->_tableName . '.' . 'id'); $stmt = $this->_db->query($subselect); $rows = (array) $stmt->fetchAll(Zend_Db::FETCH_ASSOC); $ids = array(); $exdates = array(); foreach ($rows as $row) { $ids[] = $row['id']; $exdates[$row['id']] = $row['exdate']; } $select = $this->_getSelectSimple('*', $_getDeleted); $select->where($this->_db->quoteInto("{$this->_db->quoteIdentifier('cal_events.id')} IN (?)", !empty($ids) ? $ids : ' ')); $_pagination->appendPaginationSql($select); // append grants filters : only take limited set of attendee into account for grants computation $attenderFilter = $_filter->getFilter('attender'); if (!$attenderFilter) { // if a container filter is set, take owners of personal containers (solve secretary scenario) $containerFilter = $_filter->getFilter('container_id'); if ($containerFilter && $containerFilter instanceof Calendar_Model_CalendarFilter) { $attenderFilter = $containerFilter->getRelatedAttendeeFilter(); } else { $attenderFilter = new Calendar_Model_AttenderFilter('attender', 'equals', array('user_type' => Calendar_Model_Attender::USERTYPE_USER, 'user_id' => Tinebase_Core::getUser()->contact_id)); } } $this->_appendEffectiveGrantCalculationSql($select, $attenderFilter); if ($grantsFilter) { $grantsFilter->appendFilterSql($select, $this); } $select->group($this->_tableName . '.' . 'id'); $this->_traitGroup($select); $stmt = null; // solve PHP bug @see {http://bugs.php.net/bug.php?id=35793} $stmt = $this->_db->query($select); $rows = (array) $stmt->fetchAll(Zend_Db::FETCH_ASSOC); if ($_onlyIds) { $identifier = is_bool($_onlyIds) ? $this->_getRecordIdentifier() : $_onlyIds; $result = array(); foreach ($rows as $row) { $result[] = $row[$identifier]; } } else { foreach ($rows as &$row) { $row['exdate'] = $exdates[$row[$this->_getRecordIdentifier()]]; } $result = $this->_rawDataToRecordSet($rows); } return $result; }
/** * returns multiple records prepared for json transport * * @param Tinebase_Record_RecordSet $_records Tinebase_Record_Abstract * @param Tinebase_Model_Filter_FilterGroup $_filter * @return array data */ protected function _multipleRecordsToJson(Tinebase_Record_RecordSet $_records, $_filter = NULL) { if (count($_records) == 0) { return array(); } switch ($_records->getRecordClassName()) { case 'Tinebase_Model_Preference': $accountFilterArray = $_filter->getFilter('account')->toArray(); $adminMode = $accountFilterArray['value']['accountId'] == 0 && $accountFilterArray['value']['accountType'] == Tinebase_Acl_Rights::ACCOUNT_TYPE_ANYONE; foreach ($_records as $record) { if (!isset($app) || $record->application_id != $app->getId()) { $app = Tinebase_Application::getInstance()->getApplicationById($record->application_id); } $preference = Tinebase_Core::getPreference($app->name, TRUE); $preference->resolveOptions($record); if ($record->type == Tinebase_Model_Preference::TYPE_DEFAULT || !$adminMode && $record->type == Tinebase_Model_Preference::TYPE_ADMIN) { $record->value = Tinebase_Model_Preference::DEFAULT_VALUE; } } break; } $result = parent::_multipleRecordsToJson($_records, $_filter); return $result; }
/** * Removes accounts where current user has no access to * * @param Tinebase_Model_Filter_FilterGroup $_filter * @param string $_action get|update */ public function checkFilterACL(Tinebase_Model_Filter_FilterGroup $_filter, $_action = 'get') { $userFilter = $_filter->getFilter('user_id'); // force a $userFilter filter (ACL) if ($userFilter === NULL || $userFilter->getOperator() !== 'equals' || $userFilter->getValue() !== $this->_currentAccount->getId()) { $userFilter = $_filter->createFilter('user_id', 'equals', $this->_currentAccount->getId()); $_filter->addFilter($userFilter); } }