Uses UserFilters to count NL members.
[platal.git] / include / userset.inc.php
1 <?php
2 /***************************************************************************
3 * Copyright (C) 2003-2011 Polytechnique.org *
4 * http://opensource.polytechnique.org/ *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the Free Software *
18 * Foundation, Inc., *
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
20 ***************************************************************************/
21
22 class UserSet extends PlSet
23 {
24 public function __construct(PlFilterCondition $cond, $orders = null)
25 {
26 parent::__construct($cond, $orders);
27 }
28
29 protected function buildFilter(PlFilterCondition $cond, $orders)
30 {
31 return new UserFilter($cond, $orders);
32 }
33 }
34
35 class ProfileSet extends PlSet
36 {
37 public function __construct(PlFilterCondition $cond, $orders = null)
38 {
39 parent::__construct($cond, $orders);
40 }
41
42 protected function buildFilter(PlFilterCondition $cond, $orders)
43 {
44 return new ProfileFilter($cond, $orders);
45 }
46 }
47
48 require_once "ufbuilder.inc.php";
49
50 class SearchSet extends ProfileSet
51 {
52 protected $score = null;
53 protected $valid = true;
54
55 public function __construct(UserFilterBuilder $ufb, PlFilterCondition $cond = null)
56 {
57 if (is_null($cond)) {
58 $conds = new PFC_And();
59 } else if ($cond instanceof PFC_And) {
60 $conds = $cond;
61 } else {
62 $conds = new PFC_And($cond);
63 }
64
65 if (!$ufb->isValid()) {
66 $this->valid = false;
67 return;
68 }
69
70 $ufc = $ufb->getUFC();
71 $conds->addChild($ufc);
72
73 $orders = $ufb->getOrders();
74
75 parent::__construct($conds, $orders);
76 }
77
78 public function isValid()
79 {
80 return $this->valid;
81 }
82
83 /** Add a "rechercher=Chercher" field to the query to simulate the POST
84 * behaviour.
85 */
86 public function args()
87 {
88 $args = parent::args();
89 if (!isset($args['rechercher'])) {
90 $args['rechercher'] = 'Chercher';
91 }
92 return $args;
93 }
94
95 protected function &getFilterResults(PlFilter $pf, PlLimit $limit)
96 {
97 $profiles = $pf->getProfiles($limit, Profile::FETCH_MINIFICHES);
98 return $profiles;
99 }
100 }
101
102 // Specialized SearchSet for quick search.
103 class QuickSearchSet extends SearchSet
104 {
105 public function __construct(PlFilterCondition $cond = null)
106 {
107 if (!S::logged()) {
108 Env::kill('with_soundex');
109 }
110
111 parent::__construct(new UFB_QuickSearch(), $cond);
112 }
113 }
114
115 // Specialized SearchSet for advanced search.
116 class AdvancedSearchSet extends SearchSet
117 {
118 public function __construct($xorg_admin_fields, $ax_admin_fields,
119 PlFilterCondition $cond = null)
120 {
121 parent::__construct(new UFB_AdvancedSearch($xorg_admin_fields, $ax_admin_fields),
122 $cond);
123 }
124 }
125
126 /** Simple set based on an array of User emails
127 */
128 class UserArraySet extends UserSet
129 {
130 public function __construct(array $emails)
131 {
132 parent::__construct(new UFC_Email($emails));
133 }
134 }
135
136 /** Simple set based on an array of Profile emails
137 */
138 class ProfileArraySet extends ProfileSet
139 {
140 public function __construct(array $emails)
141 {
142 parent::__construct(new UFC_Email($emails));
143 }
144 }
145
146
147 /** A multipage view for profiles or users
148 * Allows the display of bounds when sorting by name or promo.
149 */
150 abstract class MixedView extends MultipageView
151 {
152 protected function getBoundValue($obj)
153 {
154 if ($obj instanceof Profile) {
155 switch ($this->bound_field) {
156 case 'name':
157 $name = $obj->name('%l');
158 return strtoupper($name);
159 case 'promo':
160 return $obj->promo();
161 default:
162 return null;
163 }
164 } elseif ($obj instanceof User) {
165 switch ($this->bound_field) {
166 case 'name':
167 $name = $obj->lastName();
168 return strtoupper($name);
169 case 'promo':
170 if ($obj->hasProfile()) {
171 return $obj->profile()->promo();
172 } else {
173 return 'ext';
174 }
175 default:
176 return null;
177 }
178 }
179 return null;
180 }
181
182 public function bounds()
183 {
184 $order = Env::v('order', $this->defaultkey);
185 $show_bounds = 0;
186 if (($order == "name") || ($order == "-name")) {
187 $this->bound_field = "name";
188 $show_bounds = 1;
189 } elseif (($order == "promo") || ($order == "-promo")) {
190 $this->bound_field = "promo";
191 $show_bounds = -1;
192 }
193 if ($order{0} == '-') {
194 $show_bounds = -$show_bounds;
195 }
196 return $show_bounds;
197 }
198 }
199
200 /** An extended multipage view for profiles, as minifiches.
201 * Allows to sort by:
202 * - score (for a search query)
203 * - name
204 * - promo
205 * - latest modification
206 *
207 * Paramaters for this view are:
208 * - with_score: whether to allow ordering by score (set only for a quick search)
209 * - starts_with: show only names beginning with the given letter
210 */
211 class MinificheView extends MixedView
212 {
213 public function __construct(PlSet $set, array $params)
214 {
215 global $globals;
216 $this->entriesPerPage = $globals->search->per_page;
217 if (@$params['with_score']) {
218 $this->addSort(new PlViewOrder('score', array(
219 new UFO_Score(true),
220 new UFO_ProfileUpdate(true),
221 new UFO_Promo(UserFilter::DISPLAY, true),
222 new UFO_Name(),
223 ), 'pertinence'));
224 }
225 $this->addSort(new PlViewOrder(
226 'name',
227 array(new UFO_Name()),
228 'nom'));
229 $this->addSort(new PlViewOrder('promo', array(
230 new UFO_Promo(UserFilter::DISPLAY, true),
231 new UFO_Name(),
232 ), 'promotion'));
233 $this->addSort(new PlViewOrder('date_mod', array(
234 new UFO_ProfileUpdate(true),
235 new UFO_Promo(UserFilter::DISPLAY, true),
236 new UFO_Name(),
237 ), 'dernière modification'));
238 parent::__construct($set, $params);
239 }
240
241 public function apply(PlPage $page)
242 {
243 if (array_key_exists('starts_with', $this->params)
244 && $this->params['starts_with'] != ""
245 && $this->params['starts_with'] != null) {
246
247 $this->set->addCond(
248 new UFC_NameInitial($this->params['starts_with'])
249 );
250 }
251 return parent::apply($page);
252 }
253
254 public function templateName()
255 {
256 return 'include/plview.minifiche.tpl';
257 }
258 }
259
260 class MentorView extends MixedView
261 {
262 public function __construct(PlSet $set, array $params)
263 {
264 $this->entriesPerPage = 10;
265 $this->addSort(new PlViewOrder('rand', array(new PFO_Random(S::i('uid'))), 'aléatoirement'));
266 $this->addSort(new PlViewOrder('name', array(new UFO_Name()), 'nom'));
267 $this->addSort(new PlViewOrder('promo', array(
268 new UFO_Promo(UserFilter::DISPLAY, true),
269 new UFO_Name(),
270 ), 'promotion'));
271 $this->addSort(new PlViewOrder('date_mod', array(
272 new UFO_ProfileUpdate(true),
273 new UFO_Promo(UserFilter::DISPLAY, true),
274 new UFO_Name(),
275 ), 'dernière modification'));
276 parent::__construct($set, $params);
277 }
278
279 public function templateName()
280 {
281 return 'include/plview.referent.tpl';
282 }
283 }
284
285 class GroupMemberView extends MixedView
286 {
287 public function __construct(PlSet $set, array $params)
288 {
289 $this->entriesPerPage = 20;
290 $this->addSort(new PlViewOrder('name', array(new UFO_Name()), 'nom'));
291 $this->addSort(new PlViewOrder('promo', array(
292 new UFO_Promo(UserFilter::DISPLAY, true),
293 new UFO_Name(),
294 ), 'promotion'));
295 $this->addSort(new PlViewOrder('date_mod', array(
296 new UFO_ProfileUpdate(true),
297 new UFO_Promo(UserFilter::DISPLAY, true),
298 new UFO_Name(),
299 ), 'dernière modification'));
300 parent::__construct($set, $params);
301 }
302
303 public function templateName()
304 {
305 return 'include/plview.groupmember.tpl';
306 }
307 }
308
309 class ListMemberView extends MixedView
310 {
311 public function __construct(PlSet $set, array $params)
312 {
313 $this->entriesPerPage = 100;
314 $this->addSort(new PlViewOrder('name', array(new UFO_Name()), 'nom'));
315 $this->addSort(new PlViewOrder('promo', array(
316 new UFO_Promo(UserFilter::DISPLAY, true),
317 new UFO_Name(),
318 ), 'promotion'));
319 parent::__construct($set, $params);
320 }
321
322 public function templateName()
323 {
324 return 'include/plview.listmember.tpl';
325 }
326 }
327
328 class TrombiView extends MixedView
329 {
330 public function __construct(PlSet $set, array $params)
331 {
332 $this->entriesPerPage = 24;
333 $this->defaultkey = 'name';
334 if (@$params['with_score']) {
335 $this->addSort(new PlViewOrder('score', array(
336 new UFO_Score(true),
337 new UFO_ProfileUpdate(true),
338 new UFO_Promo(UserFilter::DISPLAY, true),
339 new UFO_Name(),
340 ), 'pertinence'));
341 }
342 $set->addCond(new UFC_Photo());
343 $this->addSort(new PlViewOrder('name', array(new UFO_Name()), 'nom'));
344 $this->addSort(new PlViewOrder('promo', array(
345 new UFO_Promo(UserFilter::DISPLAY, true),
346 new UFO_Name(),
347 ), 'promotion'));
348 parent::__construct($set, $params);
349 }
350
351 public function templateName()
352 {
353 return 'include/plview.trombi.tpl';
354 }
355
356 public function apply(PlPage $page)
357 {
358 if (!empty($GLOBALS['IS_XNET_SITE'])) {
359 global $globals;
360 $page->assign('mainsiteurl', 'https://' . $globals->core->secure_domain . '/');
361 }
362 return parent::apply($page);
363 }
364 }
365
366 class MapView implements PlView
367 {
368 private $set;
369
370 public function __construct(PlSet $set, array $params)
371 {
372 $this->set = $set;
373 }
374
375 public function apply(PlPage $page)
376 {
377 Platal::load('geoloc');
378
379 if (Get::b('ajax')) {
380 $pids = $this->set->getIds(new PlLimit());
381 GeolocModule::assign_json_to_map($page, $pids);
382 $page->runJSON();
383 exit;
384 } else {
385 $this->set->getIds(new PlLimit());
386 GeolocModule::prepare_map($page);
387 return 'geoloc/index.tpl';
388 }
389 }
390
391 public function args()
392 {
393 return $this->set->args();
394 }
395 }
396
397 class GadgetView implements PlView
398 {
399 public function __construct(PlSet $set, array $params)
400 {
401 $this->set =& $set;
402 }
403
404 public function apply(PlPage $page)
405 {
406 $page->assign_by_ref('set', $this->set->get(new PlLimit(5, 0)));
407 }
408
409 public function args()
410 {
411 return null;
412 }
413 }
414
415 class AddressesView implements PlView
416 {
417 private $set;
418
419 public function __construct(PlSet $set, array $params)
420 {
421 $this->set =& $set;
422 }
423
424 public function apply(PlPage $page)
425 {
426 $pids = $this->set->getIds(new PlLimit());
427 $visibility = Visibility::defaultForRead(Visibility::VIEW_AX);
428 pl_cached_content_headers('text/x-csv', 'iso-8859-1', 1, 'adresses.csv');
429
430 $csv = fopen('php://output', 'w');
431 fputcsv($csv, array('PROMOTION', 'CIVILITE', 'NOM', 'PRENOM', 'SOCIETE', 'ADRESSE', 'CP', 'EMAIL'), ';');
432 if (!empty($pids)) {
433 $res = XDB::query("SELECT pd.promo, p.title,
434 IF (pn.firstname_ordinary = '', UPPER(pn.firstname_main), UPPER(pn.firstname_ordinary)) AS firstname,
435 IF (pn.lastname_ordinary = '', UPPER(pn.lastname_main), UPPER(pn.lastname_ordinary)) AS lastname,
436 UPPER(pje.name), pa.postalText, pa.postal_code, p.email_directory
437 FROM (SELECT pa.pid, pa.postalText, pace.long_name AS postal_code
438 FROM profile_addresses AS pa
439 LEFT JOIN profile_addresses_components AS pac ON (pa.pid = pac.pid
440 AND pa.jobid = pac.jobid
441 AND pa.groupid = pac.groupid
442 AND pa.type = pac.type)
443 LEFT JOIN profile_addresses_components_enum AS pace ON (pac.component_id = pace.id
444 AND FIND_IN_SET('postal_code', pace.types))
445 WHERE pa.pub IN ('public', 'ax') AND FIND_IN_SET('mail', pa.flags) AND pa.pid IN {?}
446 ORDER BY pa.pid, NOT FIND_IN_SET('current', pa.flags),
447 FIND_IN_SET('secondary', pa.flags), pa.type = 'job', pace.long_name IS NULL) AS pa
448 INNER JOIN profiles AS p ON (pa.pid = p.pid)
449 INNER JOIN profile_display AS pd ON (pd.pid = pa.pid)
450 INNER JOIN profile_public_names AS pn ON (pn.pid = pa.pid)
451 LEFT JOIN profile_job AS pj ON (pj.pid = pa.pid)
452 LEFT JOIN profile_job_enum AS pje ON (pj.jobid = pje.id)
453 GROUP BY pa.pid", $pids);
454 foreach ($res->fetchAllAssoc() as $item) {
455 fputcsv($csv, array_map('utf8_decode', $item), ';');
456 }
457 }
458 fclose($csv);
459 exit();
460 }
461
462 public function args()
463 {
464 return $this->set->args();
465 }
466 }
467
468 class JSonView implements PlView
469 {
470 private $set;
471 private $params;
472
473 public function __construct(PlSet $set, array $params)
474 {
475 $this->set = $set;
476 $this->params = $params;
477 }
478
479 public function apply(PlPage $page)
480 {
481 $export = array();
482 $start = isset($this->params['offset']) ? $this->params['offset'] : 0;
483 $count = isset($this->params['count']) ? $this->params['count'] : 10;
484 $profiles = $this->set->get(new PlLimit($start, $count));
485 foreach ($profiles as $profile) {
486 $export[] = $profile->export();
487 }
488 $page->jsonAssign('profile_count', $this->set->count());
489 $page->jsonAssign('profiles', $export);
490 }
491
492 public function args()
493 {
494 return $this->set->args();
495 }
496 }
497
498 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
499 ?>