DataObjects/Core_group.php
[Pman.Core] / DataObjects / Core_group.php
1 <?php
2 /**
3  * Table Definition for Groups
4  *
5  * group types
6  *
7  * 0 = permission group..
8  * 1 = team
9  * 2 = contact group
10  *
11  *
12  *  NOTE - used to be called Groups ....
13  * 
14  */
15 class_exists('DB_DataObject') ? '' : require_once 'DB/DataObject.php';
16
17 class Pman_Core_DataObjects_Core_group extends DB_DataObject 
18 {
19     ###START_AUTOCODE
20     /* the code below is auto generated do not remove the above tag */
21
22     public $__table = 'core_group';                          // table name
23     public $id;                              // int(11)  not_null primary_key auto_increment
24     public $name;                            // string(64)  not_null
25     public $type;                            // int(11)  
26     public $leader;                          // int(11)  not_null
27     public $is_system;                       // used by timesheets?
28     
29     /* the code above is auto generated do not remove the tag below */
30     ###END_AUTOCODE
31     
32       
33     function personTable()
34     {
35         $ff = HTML_FlexyFramework::get();
36         return empty($ff->Pman['authTable']) ? 'core_person' : $ff->Pman['authTable'];
37     }
38     
39     
40     // group types??
41     function applyFilters($q, $au, $roo)
42     {
43         if (!empty($q['query']['name_starts'])) {
44             $v = $this->escape($q['query']['name_starts']);
45             $this->whereAdd("{$this->tableName()}.name like '{$v}%'");
46         }
47     }
48     
49     function toEventString() {
50         return $this->name;
51     }
52     
53     function beforeInsert($q,$roo)
54     {
55         print_R($q);exit;
56         if (isset($q['_action'])) {
57             // add // sub...
58             $g = clone($this);
59             if (!$g->get($q['group_id'])) {
60                 $roo->jerr("missing group id");
61
62             }
63              foreach(explode(',', $q['user_ids']) as $uid) {
64                 switch($q['_action']) {
65                     case 'add':
66                         $g->addMember($uid);
67                         break;
68                     case 'sub':
69                         $g->removeMember($uid);
70                         break;
71                     default:
72                         $roo->jerr('invalid action');
73                 }
74             }
75             $roo->jok('updated');
76             
77         }
78         
79     }
80     
81     
82     function beforeDelete()
83     {
84         $x = DB_DataObject::factory('core_group_right');
85         $x->query("DELETE FROM {$x->tableName()} WHERE group_id = {$this->id}");
86         $x = DB_DataObject::factory('core_group_member');
87         $x->query("DELETE FROM {$x->tableName()} WHERE group_id = {$this->id}");
88     }
89     /**
90      * check who is trying to access this. false == access denied..
91      */
92     function checkPerm($lvl, $au) 
93     {
94         return $au->hasPerm("Core.Groups", $lvl);    
95     } 
96     function onUpdate($old, $req, $roo)
97     {
98         $this->ensureLeaderMembership($roo);
99     }
100     function onInsert($req, $roo)
101     {
102         $this->ensureLeaderMembership($roo);
103     }
104     function ensureLeaderMembership($roo)
105     {
106         
107         // groups - make sure the leader is a member...
108         if (!$this->type || !$this->leader)
109         {
110             return true;
111         }
112         
113         $pi = DB_DataObject::factory('core_person');
114         $pi->get($this->leader);
115             
116         $p = DB_DataObject::factory('core_group_member');
117         $p->group_id = $this->id;
118         $p->user_id = $this->leader;
119         //$p->type = 1; //???????
120         if (!$p->count()) {
121             
122             $p->insert();
123             $roo->addEvent("ADD", $p, $this->toEventString(). " Added " . $pi->toEventString());
124         }
125              
126     }
127     
128     
129     function memberCount()
130     {
131         $gm = DB_Dataobject::factory('core_group_member');
132         $gm->group_id = $this->id;
133         return $gm->count();
134     }
135     
136     function memberIds()
137     {
138         $gm = DB_Dataobject::factory('core_group_member');
139         $gm->group_id = $this->id;
140         return $gm->fetchAll('user_id');
141         
142     }
143     function isMember($person)
144     {
145         $gm = DB_Dataobject::factory('core_group_member');
146         $gm->group_id = $this->id;
147         $gm->user_id = is_object($person) ? $person->id : $person;
148         return $gm->count();
149     }
150     
151     function addMember($person)
152     {
153         $gm = DB_Dataobject::factory('core_group_member');
154         $gm->group_id = $this->id;
155         $gm->user_id = is_object($person) ? $person->id : $person;
156         if (!$gm->count()) {
157             $gm->insert();
158         }
159     }
160     
161     function removeMember($person)
162     {
163         $gm = DB_Dataobject::factory('core_group_member');
164         $gm->group_id = $this->id;
165         $gm->user_id = is_object($person) ? $person->id : $person;
166         if ($gm->count()) {
167             $gm->delete();
168         }
169     }
170     
171     /**
172      *
173      *  grab a list of members - default is the array of person objects..
174      *  @param $what  = set to 'email' to get a list of email addresses.
175      *
176      *
177      */
178     
179     function members($what = false)
180     {
181         $ids = $this->memberIds();
182         if (!$ids) {
183             return array();
184         }
185         //$p = DB_Dataobject::factory(empty($ff->Pman['authTable']) ? 'Person' : $ff->Pman['authTable']);
186         // groups databse is hard coded to person.. so this should not be used for other tables.????
187         $p = DB_Dataobject::factory( 'core_person' );
188         
189         
190         
191         $p->whereAdd('id IN ('. implode(',', $ids) .')');
192         $p->active = 1;
193         return $p->fetchAll($what);
194     }
195     
196     
197     
198     
199     function lookup($k,$v = false) {
200         if ($v === false) {
201             $v = $k;
202             $k = 'id';
203         }
204         $this->get($k,$v);
205
206         return $this;
207     } 
208     
209     function lookUpMembers($name, $what=false)
210     {
211         if (!$this->get('name', $name)) {
212             return array();
213         }
214         return $this->members($what);
215         
216     }
217     
218     function lookupMembersByGroupId($id, $what=false)
219     {
220         if (!$this->get($id)) {
221             return array();
222         }
223         
224         return $this->members($what);
225     }
226     
227     function postListFilter($ar, $au, $req)
228     {      
229         if(empty($req['_add_everyone'])){
230             return $ar;
231         }
232         
233         $ret[] = array( 'id' => 0, 'name' => 'EVERYONE');
234         $ret[] = array( 'id' => -1, 'name' => 'NOT_IN_GROUP');
235         return array_merge($ret, $ar);
236
237     }
238     
239     function initGroups()
240     {
241         
242         $g = DB_DataObject::factory($this->tableName());
243         $g->type = 0;
244         $g->name = 'Administrators';
245         if ($g->count()) {
246             $g->find(true);;
247         } else {
248             $g->insert();
249             $gr = DB_DataObject::factory('core_group_right');
250             $gr->genDefault();
251         }
252         $m = $g->members();
253         if (empty($m)) {
254             $p = DB_DAtaObject::factory('core_person');
255             $p->orderBy('id ASC');
256             $p->limit(1);
257             if ($p->find(true)) {
258                 $g->addMember($p);
259             }
260             
261             
262         }
263     }
264     
265     function initDatabase($roo, $data)
266     {
267         $this->initGroups();
268         
269         foreach($data as $gi) {
270             $g = DB_DataObject::factory($this->tableName());
271             $g->setFrom($gi);
272             
273             if(!$g->find(true)){
274                 $g->insert();
275             }
276             
277             if(count($g->members()) || empty($gi['members'])){
278                 continue;
279             }
280             
281             foreach ($gi['members'] as $m){
282                 $g->addMember($m);
283             }
284             
285         }
286      
287     }
288     
289 }