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         if(!empty($q['_count_member_by_name'])){
49             
50             $core_group = DB_DataObject::factory('core_group');
51             
52             if($core_group->get('name', $q['_count_member_by_name'])){
53                 $roo->jok($core_group->memberCount());
54             }
55         }
56         
57         DB_DataObject::debugLevel(5);
58         
59         $cgmDBObj = DB_DataObject::Factory('core_group_member');
60         $cpObj = DB_DataObject::Factory('core_person');
61         $cgm = DB_DataObject::Factory('core_group_member')->tableName();
62         $cpObj->active = 1; // set the where condition with active = 1
63         /*$this->selectAdd("
64            (
65             SELECT 
66                 count(user_id) 
67             FROM 
68                 {$cgm}
69             WHERE 
70                 {$this->tableName()}.id = {$cgm}.group_id
71             ) 
72             AS group_member_count            
73         ");*/
74         $cgmDBObj->joinAdd($cpObj);
75         $this->joinAdd($cgmDBObj);
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         if(empty($req['_add_everyone'])){
268             return $ar;
269         }
270
271         $ret[] = array( 'id' => 0, 'name' => 'EVERYONE');
272         $ret[] = array( 'id' => -1, 'name' => 'NOT_IN_GROUP');
273         return array_merge($ret, $ar);
274
275     }
276
277     function initGroups()
278     {
279         
280         $g = DB_DataObject::factory($this->tableName());
281         $g->type = 0;
282         $g->name = 'Administrators';
283         if ($g->count()) {
284             $g->find(true);;
285         } else {
286             $g->insert();
287             $gr = DB_DataObject::factory('core_group_right');
288             $gr->genDefault();
289         }
290         $m = $g->members();
291         if (empty($m)) {
292             $p = DB_DAtaObject::factory('core_person');
293             $p->orderBy('id ASC');
294             $p->limit(1);
295             if ($p->find(true)) {
296                 $g->addMember($p);
297             }
298
299
300         }
301     }
302
303     function initDatabase($roo, $data)
304     {
305         $this->initGroups();
306
307         foreach($data as $gi) {
308             $g = DB_DataObject::factory($this->tableName());
309             $g->setFrom($gi);
310
311             if(!$g->find(true)){
312                 $g->insert();
313             }
314
315             if(count($g->members()) || empty($gi['members'])){
316                 continue;
317             }
318
319             foreach ($gi['members'] as $m){
320                 $g->addMember($m);
321             }
322
323         }
324
325     }
326
327 }