Automation of the management of associations' mailing lists (Closes #817), Updates...
[platal.git] / include / userset.inc.php
CommitLineData
8c4a0c30 1<?php
2/***************************************************************************
179afa7f 3 * Copyright (C) 2003-2008 Polytechnique.org *
8c4a0c30 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
8c4a0c30 22require_once('xorg.misc.inc.php');
23require_once('user.func.inc.php');
24
25global $globals;
26
35fa92e8 27@$globals->search->result_where_statement = '
8c4a0c30 28 LEFT JOIN applis_ins AS ai0 ON (u.user_id = ai0.uid AND ai0.ordre = 0)
29 LEFT JOIN applis_def AS ad0 ON (ad0.id = ai0.aid)
30 LEFT JOIN applis_ins AS ai1 ON (u.user_id = ai1.uid AND ai1.ordre = 1)
31 LEFT JOIN applis_def AS ad1 ON (ad1.id = ai1.aid)
32 LEFT JOIN entreprises AS e ON (e.entrid = 0 AND e.uid = u.user_id)
33 LEFT JOIN emploi_secteur AS es ON (e.secteur = es.id)
34 LEFT JOIN fonctions_def AS ef ON (e.fonction = ef.id)
35 LEFT JOIN geoloc_pays AS n ON (u.nationalite = n.a2)
36 LEFT JOIN adresses AS adr ON (u.user_id = adr.uid AND FIND_IN_SET(\'active\',adr.statut))
37 LEFT JOIN geoloc_pays AS gp ON (adr.country = gp.a2)
38 LEFT JOIN geoloc_region AS gr ON (adr.country = gr.a2 AND adr.region = gr.region)
39 LEFT JOIN emails AS em ON (em.uid = u.user_id AND em.flags = \'active\')';
40
41class UserSet extends PlSet
42{
43 public function __construct($joins = '', $where = '')
44 {
45 global $globals;
46 parent::__construct('auth_user_md5 AS u',
eaf30d86
PH
47 (!empty($GLOBALS['IS_XNET_SITE']) ?
48 'INNER JOIN groupex.membres AS gxm ON (u.user_id = gxm.uid
8c4a0c30 49 AND gxm.asso_id = ' . $globals->asso('id') . ') ' : '')
eaf30d86 50 . 'LEFT JOIN auth_user_quick AS q USING (user_id)
9d66aa4a 51 LEFT JOIN aliases AS a ON (a.id = u.user_id AND a.type = \'a_vie\')
8c4a0c30 52 ' . $joins,
53 $where,
54 'u.user_id');
55 }
56}
57
58class SearchSet extends UserSet
59{
86b5c8f0 60 public $advanced = false;
35fa92e8 61 private $score = null;
8c4a0c30 62 private $order = null;
63 private $quick = false;
64
a2aa8436 65 public function __construct($quick = false, $no_search = false, $join = '', $where = '')
8c4a0c30 66 {
67 require_once dirname(__FILE__).'/../modules/search/search.inc.php';
68
69 if ($no_search) {
70 return;
71 }
72
73 $this->quick = $quick;
74 if ($quick) {
a2aa8436 75 $this->getQuick($join, $where);
8c4a0c30 76 } else {
a2aa8436 77 $this->getAdvanced($join, $where);
8c4a0c30 78 }
79 }
80
a2aa8436 81 private function getQuick($join, $where)
8c4a0c30 82 {
83 require_once dirname(__FILE__).'/../modules/search/search.inc.php';
84 global $globals;
85 if (!S::logged()) {
86 Env::kill('with_soundex');
87 }
88 $qSearch = new QuickSearch('quick');
89 $fields = new SFieldGroup(true, array($qSearch));
90 if ($qSearch->isEmpty()) {
8d118e58 91 new ThrowError('Aucun critère de recherche n\'est spécifié.');
8c4a0c30 92 }
35fa92e8 93 $this->score = $qSearch->get_score_statement();
3b2f9d11 94 $pwhere = $fields->get_where_statement();
95 if (trim($pwhere)) {
96 if (trim($where)) {
97 $where .= ' AND ';
98 }
99 $where .= $pwhere;
100 }
101 if (S::logged() && Env::has('nonins')) {
102 if (trim($where)) {
103 $where .= ' AND ';
104 }
105 $where .= 'u.perms="pending" AND u.deces=0';
106 }
107 parent::__construct($join . ' ' . $fields->get_select_statement(), $where);
8c4a0c30 108
109 $this->order = implode(',',array_filter(array($fields->get_order_statement(),
110 'u.promo DESC, NomSortKey, prenom')));
111 }
112
63fac48e 113 private function getAdvanced($join, $where)
8c4a0c30 114 {
115 global $globals;
86b5c8f0 116 $this->advanced = true;
8c4a0c30 117 $fields = new SFieldGroup(true, advancedSearchFromInput());
118 if ($fields->too_large()) {
119 new ThrowError('Recherche trop générale.');
120 }
137e819f
FB
121 parent::__construct(@$join . ' ' . $fields->get_select_statement(),
122 @$where . ' ' . $fields->get_where_statement());
8c4a0c30 123 $this->order = implode(',',array_filter(array($fields->get_order_statement(),
124 'promo DESC, NomSortKey, prenom')));
125 }
35fa92e8 126
127 public function &get($fields, $joins, $where, $groupby, $order, $limitcount = null, $limitfrom = null)
128 {
129 if ($this->score) {
130 $fields .= ', ' . $this->score;
131 }
132 return parent::get($fields, $joins, $where, $groupby, $order, $limitcount, $limitfrom);
133 }
8c4a0c30 134}
135
1cc0afe7 136class ArraySet extends UserSet
137{
138 public function __construct(array $users)
139 {
140 $where = $this->getUids($users);
141 if ($where) {
142 $where = "a.alias IN ($where)";
143 } else {
144 $where = " 0 ";
145 }
146 parent::__construct('', $where);
147 }
148
149 private function getUids(array $users)
150 {
151 $users = get_users_forlife_list($users, true, '_silent_user_callback');
152 if (is_null($users)) {
153 return '';
154 }
155 return '\'' . implode('\', \'', $users) . '\'';
156 }
157}
158
8c4a0c30 159class MinificheView extends MultipageView
160{
161 public function __construct(PlSet &$set, $data, array $params)
162 {
163 require_once 'applis.func.inc.php';
164 global $globals;
165 $this->entriesPerPage = $globals->search->per_page;
35fa92e8 166 if (@$params['with_score']) {
acbd9804 167 $this->addSortKey('score', array('-score', '-date', '-promo', 'nom', 'prenom'), 'pertinence');
35fa92e8 168 }
169 $this->addSortKey('name', array('nom', 'prenom'), 'nom');
170 $this->addSortKey('promo', array('-promo', 'nom', 'prenom'), 'promotion');
acbd9804 171 $this->addSortKey('date_mod', array('-date', '-promo', 'nom', 'prenom'), 'dernière modification');
8c4a0c30 172 parent::__construct($set, $data, $params);
173 }
174
175 public function fields()
176 {
177 return "u.user_id AS id,
178 u.*, a.alias AS forlife,
179 u.perms != 'pending' AS inscrit,
180 u.perms != 'pending' AS wasinscrit,
181 u.deces != 0 AS dcd, u.deces, u.matricule_ax,
182 FIND_IN_SET('femme', u.flags) AS sexe,
183 e.entreprise, es.label AS secteur, ef.fonction_fr AS fonction,
184 IF(n.nat='',n.pays,n.nat) AS nat, n.a2 AS iso3166,
185 ad0.text AS app0text, ad0.url AS app0url, ai0.type AS app0type,
186 ad1.text AS app1text, ad1.url AS app1url, ai1.type AS app1type,
187 adr.city, gp.a2, gp.pays AS countrytxt, gr.name AS region,
188 IF(u.nom_usage<>'',u.nom_usage,u.nom) AS sortkey,
0e5ec860
VZ
189 (COUNT(em.email) > 0 OR FIND_IN_SET('googleapps', u.mail_storage) > 0) AS actif" .
190 (S::logged() ? ", c.contact AS contact" : '');
8c4a0c30 191 }
192
193 public function joins()
194 {
f3af95c0 195 return "LEFT JOIN entreprises AS e ON (e.entrid = 0 AND e.uid = u.user_id".(S::logged() ? "" : " AND e.pub = 'public'").")
8c4a0c30 196 LEFT JOIN emploi_secteur AS es ON (e.secteur = es.id)
197 LEFT JOIN fonctions_def AS ef ON (e.fonction = ef.id)
198 LEFT JOIN geoloc_pays AS n ON (u.nationalite = n.a2)
199 LEFT JOIN applis_ins AS ai0 ON (u.user_id = ai0.uid AND ai0.ordre = 0)
200 LEFT JOIN applis_def AS ad0 ON (ad0.id = ai0.aid)
201 LEFT JOIN applis_ins AS ai1 ON (u.user_id = ai1.uid AND ai1.ordre = 1)
202 LEFT JOIN applis_def AS ad1 ON (ad1.id = ai1.aid)
203 LEFT JOIN adresses AS adr ON (u.user_id = adr.uid
f3af95c0 204 AND FIND_IN_SET('active', adr.statut)".(S::logged() ? "" : " AND adr.pub = 'public'").")
8c4a0c30 205 LEFT JOIN geoloc_pays AS gp ON (adr.country = gp.a2)
206 LEFT JOIN geoloc_region AS gr ON (adr.country = gr.a2 AND adr.region = gr.region)
86b5c8f0 207 LEFT JOIN emails AS em ON (em.uid = u.user_id AND em.flags = 'active')" .
eaf30d86 208 (S::logged() ?
86b5c8f0 209 "LEFT JOIN contacts AS c On (c.contact = u.user_id AND c.uid = " . S::v('uid') . ")"
210 : "");
8c4a0c30 211 }
212
213 public function templateName()
214 {
215 return 'include/plview.minifiche.tpl';
216 }
217}
218
ff3eb9b7 219class MentorView extends MultipageView
220{
221 public function __construct(PlSet &$set, $data, array $params)
222 {
eaf30d86 223 $this->entriesPerPage = 10;
ff3eb9b7 224 $this->addSortKey('rand', array('RAND(' . S::i('uid') . ')'), 'aléatoirement');
eaf30d86
PH
225 $this->addSortKey('name', array('nom', 'prenom'), 'nom');
226 $this->addSortKey('promo', array('-promo', 'nom', 'prenom'), 'promotion');
227 $this->addSortKey('date_mod', array('-date', '-promo', 'nom', 'prenom'), 'dernière modification');
228 parent::__construct($set, $data, $params);
ff3eb9b7 229 }
230
231 public function fields()
232 {
233 return "m.uid, u.prenom, u.nom, u.promo,
e1ce18d2 234 a.alias AS forlife, m.expertise, mp.pid,
ff3eb9b7 235 ms.secteur, ms.ss_secteur";
236 }
237
238 public function templateName()
239 {
240 return 'include/plview.referent.tpl';
241 }
242}
243
8c4a0c30 244class TrombiView extends MultipageView
245{
246 public function __construct(PlSet &$set, $data, array $params)
247 {
248 $this->entriesPerPage = 24;
249 $this->order = explode(',', Env::v('order', 'nom,prenom,promo'));
35fa92e8 250 if (@$params['with_score']) {
251 $this->addSortKey('score', array('-score', '-watch_last', '-promo', 'nom', 'prenom'), 'pertinence');
252 }
253 $this->addSortKey('name', array('nom', 'prenom'), 'nom');
254 $this->addSortKey('promo', array('-promo', 'nom', 'prenom'), 'promotion');
8c4a0c30 255 parent::__construct($set, $data, $params);
256 }
257
258 public function fields()
259 {
260 return "u.user_id, IF(u.nom_usage != '', u.nom_usage, u.nom) AS nom, u.prenom, u.promo, a.alias AS forlife ";
261 }
262
263 public function joins()
264 {
265 return "INNER JOIN photo AS p ON (p.uid = u.user_id) ";
266 }
267
268 public function templateName()
269 {
270 return 'include/plview.trombi.tpl';
271 }
272
273 public function apply(PlatalPage &$page)
274 {
275 if (!empty($GLOBALS['IS_XNET_SITE'])) {
276 global $globals;
277 $page->assign('mainsiteurl', 'https://' . $globals->core->secure_domain . '/');
278 }
279 return parent::apply($page);
280 }
281}
282
283class GeolocView implements PlView
284{
285 private $set;
286 private $type;
287 private $params;
288
289 public function __construct(PlSet &$set, $data, array $params)
290 {
291 $this->params = $params;
292 $this->set =& $set;
293 $this->type = $data;
294 }
295
296 private function use_map()
297 {
298 return is_file(dirname(__FILE__) . '/../modules/geoloc/dynamap.swf') &&
299 is_file(dirname(__FILE__) . '/../modules/geoloc/icon.swf');
300 }
301
35fa92e8 302 public function args()
8c4a0c30 303 {
35fa92e8 304 $args = $this->set->args();
305 unset($args['initfile']);
306 unset($args['mapid']);
307 return $args;
8c4a0c30 308 }
309
310 public function apply(PlatalPage &$page)
311 {
312 require_once 'geoloc.inc.php';
313 require_once '../modules/search/search.inc.php';
314
315 switch ($this->type) {
316 case 'icon.swf':
317 header("Content-type: application/x-shockwave-flash");
318 header("Pragma:");
319 readfile(dirname(__FILE__).'/../modules/geoloc/icon.swf');
320 exit;
321
322 case 'dynamap.swf':
323 header("Content-type: application/x-shockwave-flash");
324 header("Pragma:");
325 readfile(dirname(__FILE__).'/../modules/geoloc/dynamap.swf');
326 exit;
327
328 case 'init':
329 $page->changeTpl('geoloc/init.tpl', NO_SKIN);
330 header('Content-Type: text/xml');
331 header('Pragma:');
332 if (!empty($GLOBALS['IS_XNET_SITE'])) {
333 $page->assign('background', 0xF2E9D0);
334 }
8c4a0c30 335 break;
336
337 case 'city':
338 $page->changeTpl('geoloc/city.tpl', NO_SKIN);
339 header('Content-Type: text/xml');
340 header('Pragma:');
a2aa8436 341 $only_current = Env::v('only_current', false)? ' AND FIND_IN_SET(\'active\', adrf.statut)' : '';
8c4a0c30 342 $it =& $this->set->get('u.user_id AS id, u.prenom, u.nom, u.promo, al.alias',
a2aa8436 343 "INNER JOIN adresses AS adrf ON (adrf.uid = u.user_id $only_current)
8c4a0c30 344 LEFT JOIN aliases AS al ON (u.user_id = al.id
010268b2 345 AND FIND_IN_SET('bestalias', al.flags))
97eff0ff 346 INNER JOIN adresses AS avg ON (" . getadr_join('avg') . ")",
8c4a0c30 347 'adrf.cityid = ' . Env::i('cityid'), null, null, 11);
348 $page->assign('users', $it);
349 break;
350
351 case 'country':
352 if (Env::has('debug')) {
353 $page->changeTpl('geoloc/country.tpl', SIMPLE);
354 } else {
355 $page->changeTpl('geoloc/country.tpl', NO_SKIN);
356 header('Content-Type: text/xml');
357 header('Pragma:');
358 }
8c4a0c30 359 $mapid = Env::has('mapid') ? Env::i('mapid', -2) : false;
360 list($countries, $cities) = geoloc_getData_subcountries($mapid, $this->set, 10);
361 $page->assign('countries', $countries);
362 $page->assign('cities', $cities);
363 break;
364
365 default:
366 global $globals;
367 if (!$this->use_map()) {
368 $page->assign('request_geodesix', true);
369 }
a2aa8436 370 $page->assign('annu', @$this->params['with_annu']);
8c4a0c30 371 $page->assign('protocole', @$_SERVER['HTTPS'] ? 'https' : 'http');
372 $this->set->get('u.user_id', null, "u.perms != 'pending' AND u.deces = 0", "u.user_id", null);
8c4a0c30 373 return 'include/plview.geoloc.tpl';
374 }
375 }
376}
377
92e80560
VZ
378class GadgetView implements PlView
379{
380 public function __construct(PlSet &$set, $data, array $params)
381 {
382 $this->set =& $set;
383 }
384
385 public function fields()
386 {
387 return "u.user_id AS id,
388 u.*, a.alias AS forlife," .
389 (S::logged() ? "q.profile_mobile AS mobile, " : "IF(q.profile_mobile_pub = 'public', q.profile_mobile, NULL) as mobile, ") .
390 "u.perms != 'pending' AS inscrit,
391 u.perms != 'pending' AS wasinscrit,
392 u.deces != 0 AS dcd, u.deces,
393 FIND_IN_SET('femme', u.flags) AS sexe,
394 adr.city, gp.a2, gp.pays AS countrytxt, gr.name AS region" .
395 (S::logged() ? ", c.contact AS contact" : '');
396 }
397
398 public function joins()
399 {
400 return "LEFT JOIN adresses AS adr ON (u.user_id = adr.uid AND FIND_IN_SET('active', adr.statut)".(S::logged() ? "" : " AND adr.pub = 'public'").")
401 LEFT JOIN geoloc_pays AS gp ON (adr.country = gp.a2)
402 LEFT JOIN geoloc_region AS gr ON (adr.country = gr.a2 AND adr.region = gr.region)" .
403 (S::logged() ?
404 "LEFT JOIN contacts AS c On (c.contact = u.user_id AND c.uid = " . S::v('uid') . ")"
405 : "");
406 }
407
408 public function apply(PlatalPage &$page)
409 {
410 $page->assign_by_ref('set',
411 $this->set->get($this->fields(), $this->joins(), null, null, null, 5, 0));
412 }
413
414 public function args()
415 {
416 return null;
417 }
418}
419
8c4a0c30 420// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
421?>