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