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