0011370: repair function for persistent filters (favorites) without grants
[tine20] / tine20 / Tinebase / Backend / Sql / Grants.php
1 <?php
2 /**
3  * Tine 2.0
4  *
5  * @package     Tinebase
6  * @subpackage  Backend
7  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
8  * @author      Philipp Schüle <p.schuele@metaways.de>
9  * @copyright   Copyright (c) 2014 Metaways Infosystems GmbH (http://www.metaways.de)
10  */
11
12 /**
13  * backend for records with grants
14  *
15  * @package     Tinebase
16  * @subpackage  Backend
17  */
18 class Tinebase_Backend_Sql_Grants extends Tinebase_Backend_Sql
19 {
20     /**
21      * get grants for records
22      * 
23      * @param Tinebase_Record_RecordSet $records
24      */
25     public function getGrantsForRecords(Tinebase_Record_RecordSet $records)
26     {
27         $recordIds = $records->getArrayOfIds();
28         if (empty($recordIds)) {
29             return;
30         }
31         
32         $select = $this->_getAclSelectByRecordIds($recordIds)
33             ->group(array('record_id', 'account_type', 'account_id'));
34         
35         Tinebase_Backend_Sql_Abstract::traitGroup($select);
36         
37         if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ 
38             . ' ' . $select);
39         
40         $stmt = $this->_db->query($select);
41
42         $grantsData = $stmt->fetchAll(Zend_Db::FETCH_ASSOC);
43         
44         if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ 
45             . ' grantsData: ' . print_r($grantsData, true));
46
47         foreach ($grantsData as $grantData) {
48             $givenGrants = explode(',', $grantData['account_grants']);
49             foreach ($givenGrants as $grant) {
50                 $grantData[$grant] = TRUE;
51             }
52             
53             $recordGrant = new $this->_modelName($grantData, true);
54             unset($recordGrant->account_grant);
55             
56             $record = $records->getById($recordGrant->record_id);
57             $records->removeRecord($record);
58             if (! $record->grants instanceof Tinebase_Record_RecordSet) {
59                 $record->grants = new Tinebase_Record_RecordSet($this->_modelName);
60             }
61             $record->grants->addRecord($recordGrant);
62
63             // NOTICE: this is strange - we have to remove the record and add it
64             //   again to make sure that grants are updated ...
65             //   maybe we should add a "replace" method?
66             $records->addRecord($record);
67         }
68         
69         if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ 
70             . ' Records with grants: ' . print_r($records->toArray(), true));
71     }
72     
73     /**
74      * get select with acl (grants) by record
75      * 
76      * @param string|array $recordId
77      * @return Zend_Db_Select
78      */
79     protected function _getAclSelectByRecordIds($recordIds)
80     {
81          $select = $this->_db->select()
82             ->from(
83                 array($this->getTableName() => SQL_TABLE_PREFIX . $this->getTableName()),
84                 array('*', 'account_grants' => $this->_dbCommand->getAggregate('account_grant'))
85             )
86             ->where("{$this->_db->quoteIdentifier('record_id')} IN (?)", (array)$recordIds);
87          return $select;
88     }
89 }