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