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
44         if (!empty($q['query']['name_starts'])) {
45             $v = $this->escape($q['query']['name_starts']);
46             $this->whereAdd("{$this->tableName()}.name like '{$v}%'");
47         }
48         
49         if(!empty($q['_count_member_by_name'])){
50             
51             $core_group = DB_DataObject::factory('core_group');
52             
53             if($core_group->get('name', $q['_count_member_by_name'])){
54                 $roo->jok($core_group->memberCount());
55             }
56         }
57         
58         if(!empty($q['mem_id'])){
59             $this->selectAdd("
60                 COALESCE(
61                     (SELECT id from core_group_member
62                         WHERE 
63                             user_id = {$q['mem_id']}
64                         AND
65                             group_id = {$this->tableName()}.id
66                         LIMIT 1
67                     ),0) as cgm_id
68                     ");
69         }
70         
71         
72         $cp = DB_DataObject::Factory('core_person')->tableName();
73         $cgm = DB_DataObject::Factory('core_group_member')->tableName();
74         
75         $this->selectAdd("
76            (
77             SELECT COUNT(${cgm}.user_id) 
78                 FROM 
79                     {$cgm}
80                 LEFT JOIN
81                     {$cp}
82                 ON
83                     ${cp}.id = {$cgm}.user_id
84                 WHERE
85                     ${cgm}.group_id = {$this->tableName()}.id
86                 AND
87                     ${cp}.active = 1
88                 ) AS group_member_count            
89         ");
90         
91         /*WHERE 
92             {$this->tableName()}.id = core_group_member.group_id
93             AND
94                 core_group_member.user_id = core_person.id
95             AND
96                 core_person.active = 1    
97         )*/ 
98         
99 //        $this->whereAdd("{$this->tableName()}.id = core_group_member.group_id");
100 //        $this->whereAdd("core_group_member.user_id = core_person.id");
101 //        $this->whereAdd("core_person.active = 1");
102      
103     
104         /*$cgmDBObj->joinAdd($cpObj);
105         $this->joinAdd($cgmDBObj);
106         DB_DataObject::debugLevel();*/
107     }
108
109     function toEventString() {
110         return $this->name;
111     }
112
113     function beforeInsert($q,$roo)
114     {
115         if (isset($q['_action'])) {
116             // add // sub...
117             $g = clone($this);
118             if (!$g->get($q['group_id'])) {
119                 $roo->jerr("missing group id");
120
121             }
122              foreach(explode(',', $q['user_ids']) as $uid) {
123                 switch($q['_action']) {
124                     case 'add':
125                         $g->addMember($uid,$roo);
126                         break;
127                     case 'sub':
128                         $g->removeMember($uid);
129                         break;
130                     default:
131                         $roo->jerr('invalid action');
132                 }
133             }
134             $roo->jok('updated');
135
136         }
137
138     }
139
140
141     function beforeDelete()
142     {
143         $x = DB_DataObject::factory('core_group_right');
144         $x->query("DELETE FROM {$x->tableName()} WHERE group_id = {$this->id}");
145         $x = DB_DataObject::factory('core_group_member');
146         $x->query("DELETE FROM {$x->tableName()} WHERE group_id = {$this->id}");
147     }
148     /**
149      * check who is trying to access this. false == access denied..
150      */
151     function checkPerm($lvl, $au)
152     {
153         return $au->hasPerm("Core.Groups", $lvl);
154     }
155     function onUpdate($old, $req, $roo)
156     {
157         $this->ensureLeaderMembership($roo);
158     }
159     function onInsert($req, $roo)
160     {
161         $this->ensureLeaderMembership($roo);
162     }
163     function ensureLeaderMembership($roo)
164     {
165
166         // groups - make sure the leader is a member...
167         if (!$this->type || !$this->leader)
168         {
169             return true;
170         }
171
172         $pi = DB_DataObject::factory('core_person');
173         $pi->get($this->leader);
174
175         $p = DB_DataObject::factory('core_group_member');
176         $p->group_id = $this->id;
177         $p->user_id = $this->leader;
178         //$p->type = 1; //???????
179         if (!$p->count()) {
180
181             $p->insert();
182             $roo->addEvent("ADD", $p, $this->toEventString(). " Added " . $pi->toEventString());
183         }
184
185     }
186
187
188     function memberCount()
189     {
190         $gm = DB_Dataobject::factory('core_group_member');
191         $gm->group_id = $this->id;
192         $gm->autoJoin();
193         $gm->whereAdd('join_user_id_id.active = 1');
194         //PDO_DAtaObject::DebugLevel(1); 
195         return $gm->count();
196     }
197
198     function memberIds()
199     {
200         $gm = DB_Dataobject::factory('core_group_member');
201         $gm->group_id = $this->id;
202         $gm->autoJoin();
203         $gm->whereAdd('join_user_id_id.active = 1');
204         return $gm->fetchAll('user_id');
205
206     }
207     function isMember($person)
208     {
209         $gm = DB_Dataobject::factory('core_group_member');
210         $gm->group_id = $this->id;
211         $gm->user_id = is_object($person) ? $person->id : $person;
212         return $gm->count();
213     }
214
215     function addMember($person,$roo = false)
216     {
217         if ($this->name == "Empty Group") {
218             $roo->jerr('Cannot add the person into Empty Group');
219         }
220         $gm = DB_Dataobject::factory('core_group_member');
221         $gm->group_id = $this->id;
222         $gm->user_id = is_object($person) ? $person->id : $person;
223         if (!$gm->count()) {
224             $gm->insert();
225         }
226     }
227
228     function removeMember($person)
229     {
230         $gm = DB_Dataobject::factory('core_group_member');
231         $gm->group_id = $this->id;
232         $gm->user_id = is_object($person) ? $person->id : $person;
233
234         if ($gm->find(true)) {
235             $gm->delete();
236         }
237     }
238
239     /**
240      *
241      *  grab a list of members - default is the array of person objects..
242      *  @param $what  = set to 'email' to get a list of email addresses.
243      *
244      *
245      */
246
247     function members($what = false)
248     {
249         $ids = $this->memberIds();
250         if (!$ids) {
251             return array();
252         }
253         //$p = DB_Dataobject::factory(empty($ff->Pman['authTable']) ? 'Person' : $ff->Pman['authTable']);
254         // groups databse is hard coded to person.. so this should not be used for other tables.????
255         $p = DB_Dataobject::factory( 'core_person' );
256
257         $p->whereAdd('id IN ('. implode(',', $ids) .')');
258         $p->active = 1;
259
260         $p->orderBy('name');
261         return $p->fetchAll($what);
262     }
263
264
265
266
267     function lookup($k,$v = false) {
268         if ($v === false) {
269             $v = $k;
270             $k = 'id';
271         }
272         $this->get($k,$v);
273
274         return $this;
275     }
276
277     function lookUpMembers($name, $what=false)
278     {
279         if (!$this->get('name', $name)) {
280             return array();
281         }
282         return $this->members($what);
283
284     }
285
286     function lookupMembersByGroupId($id, $what=false)
287     {
288         if (!$this->get($id)) {
289             return array();
290         }
291
292         return $this->members($what);
293     }
294
295     function postListFilter($ar, $au, $req)
296     {
297         if(empty($req['_add_everyone'])){
298             return $ar;
299         }
300
301         $ret[] = array( 'id' => 0, 'name' => 'EVERYONE');
302         $ret[] = array( 'id' => -1, 'name' => 'NOT_IN_GROUP');
303         return array_merge($ret, $ar);
304
305     }
306
307     function initGroups()
308     {
309         
310         $g = DB_DataObject::factory($this->tableName());
311         $g->type = 0;
312         $g->name = 'Administrators';
313         if ($g->count()) {
314             $g->find(true);;
315         } else {
316             $g->insert();
317             $gr = DB_DataObject::factory('core_group_right');
318             $gr->genDefault();
319         }
320         $m = $g->members();
321         if (empty($m)) {
322             $p = DB_DAtaObject::factory('core_person');
323             $p->orderBy('id ASC');
324             $p->limit(1);
325             if ($p->find(true)) {
326                 $g->addMember($p);
327             }
328
329
330         }
331     }
332
333     function initDatabase($roo, $data)
334     {
335         $this->initGroups();
336
337         foreach($data as $gi) {
338             $g = DB_DataObject::factory($this->tableName());
339             $g->setFrom($gi);
340
341             if(!$g->find(true)){
342                 $g->insert();
343             }
344
345             if(count($g->members()) || empty($gi['members'])){
346                 continue;
347             }
348
349             foreach ($gi['members'] as $m){
350                 $g->addMember($m);
351             }
352
353         }
354
355     }
356
357 }