d96dcb6d6add7f2e1410dc06253ff59de14a316f
[platal.git] / modules / carnet.php
1 <?php
2 /***************************************************************************
3 * Copyright (C) 2003-2006 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 CarnetModule extends PLModule
23 {
24 function handlers()
25 {
26 return array(
27 'carnet' => $this->make_hook('index', AUTH_COOKIE),
28 'carnet/panel' => $this->make_hook('panel', AUTH_COOKIE),
29 'carnet/notifs' => $this->make_hook('notifs', AUTH_COOKIE),
30
31 'carnet/contacts' => $this->make_hook('contacts', AUTH_COOKIE),
32 'carnet/contacts/pdf' => $this->make_hook('pdf', AUTH_COOKIE),
33 'carnet/contacts/ical' => $this->make_hook('ical', AUTH_COOKIE),
34 'carnet/contacts/vcard' => $this->make_hook('vcard', AUTH_COOKIE),
35
36 'carnet/rss' => $this->make_hook('rss', AUTH_PUBLIC),
37 );
38 }
39
40 function on_subscribe($forlife, $uid, $promo, $password)
41 {
42 require_once 'notifs.inc.php';
43 register_watch_op($uid, WATCH_INSCR);
44 inscription_notifs_base($uid);
45 }
46
47 function _add_rss_link(&$page)
48 {
49 if (!S::has('core_rss_hash')) {
50 return;
51 }
52 $page->assign('xorg_rss',
53 array('title' => 'Polytechnique.org :: Carnet',
54 'href' => '/carnet/rss/'.S::v('forlife')
55 .'/'.S::v('core_rss_hash').'/rss.xml')
56 );
57 }
58
59 function handler_index(&$page)
60 {
61 $page->changeTpl('carnet/index.tpl');
62 $page->assign('xorg_title','Polytechnique.org - Mon carnet');
63 $this->_add_rss_link($page);
64 }
65
66 function handler_panel(&$page)
67 {
68 $page->changeTpl('carnet/panel.tpl');
69
70 if (Get::has('read')) {
71 $_SESSION['watch_last'] = Get::v('read');
72 pl_redirect('carnet/panel');
73 }
74
75 require_once 'notifs.inc.php';
76
77 $page->assign('now',date('YmdHis'));
78 $notifs = new Notifs(S::v('uid'), true);
79
80 $page->assign('notifs', $notifs);
81 $page->assign('today', date('Y-m-d'));
82 $this->_add_rss_link($page);
83 }
84
85 function _handler_notifs_promos(&$page, &$watch, $action, $arg)
86 {
87 if(preg_match('!^ *(\d{4}) *$!', $arg, $matches)) {
88 $p = intval($matches[1]);
89 if($p<1900 || $p>2100) {
90 $page->trig("la promo entrée est invalide");
91 } else {
92 if ($action == 'add_promo') {
93 $watch->_promos->add($p);
94 } else {
95 $watch->_promos->del($p);
96 }
97 }
98 } elseif (preg_match('!^ *(\d{4}) *- *(\d{4}) *$!', $arg, $matches)) {
99 $p1 = intval($matches[1]);
100 $p2 = intval($matches[2]);
101 if($p1<1900 || $p1>2100) {
102 $page->trig('la première promo de la plage entrée est invalide');
103 } elseif($p2<1900 || $p2>2100) {
104 $page->trig('la seconde promo de la plage entrée est invalide');
105 } else {
106 if ($action == 'add_promo') {
107 $watch->_promos->addRange($p1, $p2);
108 } else {
109 $watch->_promos->delRange($p1, $p2);
110 }
111 }
112 } else {
113 $page->trig("La promo (ou la plage de promo) entrée est dans un format incorrect.");
114 }
115 }
116
117 function handler_notifs(&$page, $action = null, $arg = null)
118 {
119 $page->changeTpl('carnet/notifs.tpl');
120
121 require_once 'notifs.inc.php';
122
123 $watch = new Watch(S::v('uid'));
124
125 $res = XDB::query("SELECT promo_sortie
126 FROM auth_user_md5
127 WHERE user_id = {?}",
128 S::v('uid', -1));
129 $promo_sortie = $res->fetchOneCell();
130 $page->assign('promo_sortie', $promo_sortie);
131
132 switch ($action) {
133 case 'add_promo':
134 case 'del_promo':
135 $this->_handler_notifs_promos($page, $watch, $action, $arg);
136 break;
137
138 case 'del_nonins':
139 $watch->_nonins->del($arg);
140 break;
141
142 case 'add_nonins':
143 $watch->_nonins->add($arg);
144 break;
145 }
146
147 if (Env::has('subs')) $watch->_subs->update('sub');
148 if (Env::has('flags_contacts')) {
149 $watch->watch_contacts = Env::b('contacts');
150 $watch->saveFlags();
151 }
152 if (Env::has('flags_mail')) {
153 $watch->watch_mail = Env::b('mail');
154 $watch->saveFlags();
155 }
156
157 $page->assign_by_ref('watch', $watch);
158 }
159
160 function _get_list($offset, $limit) {
161 $uid = S::v('uid');
162 $res = XDB::query("SELECT COUNT(*) FROM contacts WHERE uid = {?}", $uid);
163 $total = $res->fetchOneCell();
164
165 $order = Get::v('order');
166 $orders = Array(
167 'nom' => 'nom DESC, u.prenom, u.promo',
168 'promo' => 'promo DESC, nom, u.prenom',
169 'last' => 'u.date DESC, nom, u.prenom, promo');
170 if ($order != 'promo' && $order != 'last')
171 $order = 'nom';
172 $order = $orders[$order];
173 if (Get::v('inv') == '')
174 $order = str_replace(" DESC,", ",", $order);
175
176 $res = XDB::query("
177 SELECT u.prenom, IF(u.nom_usage='',u.nom,u.nom_usage) AS nom, a.alias AS forlife, u.promo
178 FROM contacts AS c
179 INNER JOIN auth_user_md5 AS u ON (u.user_id = c.contact)
180 INNER JOIN aliases AS a ON (u.user_id = a.id AND a.type='a_vie')
181 WHERE c.uid = {?}
182 ORDER BY $order
183 LIMIT {?}, {?}", $uid, $offset*$limit, $limit);
184 $list = $res->fetchAllAssoc();
185
186 return Array($total, $list);
187 }
188
189 function handler_contacts(&$page, $action = null)
190 {
191 $page->changeTpl('carnet/mescontacts.tpl');
192 require_once("applis.func.inc.php");
193 $page->assign('xorg_title','Polytechnique.org - Mes contacts');
194
195 $uid = S::v('uid');
196 $user = Env::v('user');
197
198 switch (Env::v('action')) {
199 case 'retirer':
200 if (is_numeric($user)) {
201 if (XDB::execute('DELETE FROM contacts
202 WHERE uid = {?} AND contact = {?}',
203 $uid, $user))
204 {
205 $page->trig("Contact retiré !");
206 }
207 } else {
208 if (XDB::execute(
209 'DELETE FROM contacts
210 USING contacts AS c
211 INNER JOIN aliases AS a ON (c.contact=a.id and a.type!="homonyme")
212 WHERE c.uid = {?} AND a.alias={?}', $uid, $user))
213 {
214 $page->trig("Contact retiré !");
215 }
216 }
217 break;
218
219 case 'ajouter':
220 require_once('user.func.inc.php');
221 if (($login = get_user_login($user)) !== false) {
222 if (XDB::execute(
223 'INSERT INTO contacts (uid, contact)
224 SELECT {?}, id
225 FROM aliases
226 WHERE alias = {?}', $uid, $login))
227 {
228 $page->trig('Contact ajouté !');
229 } else {
230 $page->trig('Contact déjà dans la liste !');
231 }
232 }
233 }
234
235 if ($action == 'trombi') {
236 require_once 'trombi.inc.php';
237
238 $trombi = new Trombi(array($this, '_get_list'));
239 $trombi->setNbRows(4);
240 $page->assign_by_ref('trombi',$trombi);
241
242 $order = Get::v('order');
243 if ($order != 'promo' && $order != 'last')
244 $order = 'nom';
245 $page->assign('order', $order);
246 $page->assign('inv', Get::v('inv'));
247
248 } else {
249
250 $order = Get::v('order');
251 $orders = Array(
252 'nom' => 'sortkey DESC, a.prenom, a.promo',
253 'promo' => 'promo DESC, sortkey, a.prenom',
254 'last' => 'a.date DESC, sortkey, a.prenom, promo');
255 if ($order != 'promo' && $order != 'last')
256 $order = 'nom';
257 $page->assign('order', $order);
258 $page->assign('inv', Get::v('inv'));
259 $order = $orders[$order];
260 if (Get::v('inv') == '')
261 $order = str_replace(" DESC,", ",", $order);
262
263 $sql = "SELECT contact AS id,
264 a.*, l.alias AS forlife,
265 1 AS inscrit,
266 a.perms != 'pending' AS wasinscrit,
267 a.deces != 0 AS dcd, a.deces, a.matricule_ax,
268 FIND_IN_SET('femme', a.flags) AS sexe,
269 e.entreprise, es.label AS secteur, ef.fonction_fr AS fonction,
270 IF(n.nat='',n.pays,n.nat) AS nat, n.a2 AS iso3166,
271 ad0.text AS app0text, ad0.url AS app0url, ai0.type AS app0type,
272 ad1.text AS app1text, ad1.url AS app1url, ai1.type AS app1type,
273 adr.city, gp.a2, gp.pays AS countrytxt, gr.name AS region,
274 IF(a.nom_usage<>'',a.nom_usage,a.nom) AS sortkey,
275 COUNT(em.email) > 0 AS actif
276 FROM contacts AS c
277 INNER JOIN auth_user_md5 AS a ON (a.user_id = c.contact)
278 INNER JOIN aliases AS l ON (a.user_id = l.id AND l.type='a_vie')
279 LEFT JOIN entreprises AS e ON (e.entrid = 0 AND e.uid = a.user_id)
280 LEFT JOIN emploi_secteur AS es ON (e.secteur = es.id)
281 LEFT JOIN fonctions_def AS ef ON (e.fonction = ef.id)
282 LEFT JOIN geoloc_pays AS n ON (a.nationalite = n.a2)
283 LEFT JOIN applis_ins AS ai0 ON (a.user_id = ai0.uid AND ai0.ordre = 0)
284 LEFT JOIN applis_def AS ad0 ON (ad0.id = ai0.aid)
285 LEFT JOIN applis_ins AS ai1 ON (a.user_id = ai1.uid AND ai1.ordre = 1)
286 LEFT JOIN applis_def AS ad1 ON (ad1.id = ai1.aid)
287 LEFT JOIN adresses AS adr ON (a.user_id = adr.uid
288 AND FIND_IN_SET('active', adr.statut))
289 LEFT JOIN geoloc_pays AS gp ON (adr.country = gp.a2)
290 LEFT JOIN geoloc_region AS gr ON (adr.country = gr.a2 AND adr.region = gr.region)
291 LEFT JOIN emails AS em ON (em.uid = a.user_id AND em.flags = 'active')
292 WHERE c.uid = $uid
293 GROUP BY a.user_id
294 ORDER BY ".$order;
295
296 $page->assign('citer', XDB::iterator($sql));
297 }
298 }
299
300 function handler_pdf(&$page, $arg0 = null, $arg1 = null)
301 {
302 require_once dirname(__FILE__).'/carnet/contacts.pdf.inc.php';
303 require_once 'user.func.inc.php';
304
305 session_write_close();
306
307 $sql = "SELECT a.alias
308 FROM aliases AS a
309 INNER JOIN auth_user_md5 AS u ON ( a.id = u.user_id )
310 INNER JOIN contacts AS c ON ( a.id = c.contact )
311 WHERE c.uid = {?} AND a.type='a_vie'";
312 if ($arg0 == 'promo') {
313 $sql .= ' ORDER BY u.promo, u.nom, u.prenom';
314 } else {
315 $sql .= ' ORDER BY u.nom, u.prenom, u.promo';
316 }
317
318 $citer = XDB::iterRow($sql, S::v('uid'));
319 $pdf = new ContactsPDF();
320
321 while (list($alias) = $citer->next()) {
322 $user = get_user_details($alias);
323 $pdf = ContactsPDF::addContact($pdf, $user, $arg0 == 'photos' || $arg1 == 'photos');
324 }
325 $pdf->Output();
326
327 exit;
328 }
329
330 function handler_rss(&$page, $user = null, $hash = null)
331 {
332 require_once 'rss.inc.php';
333 require_once 'notifs.inc.php';
334
335 $uid = init_rss('carnet/rss.tpl', $user, $hash);
336 $notifs = new Notifs($uid, false);
337 $page->assign('notifs', $notifs);
338 }
339
340 function handler_ical(&$page)
341 {
342 require_once dirname(__FILE__).'/carnet/smarty.php';
343 $page->changeTpl('carnet/calendar.tpl', NO_SKIN);
344 $page->register_function('display_ical', 'display_ical');
345
346 $res = XDB::iterRow(
347 'SELECT u.prenom,
348 IF(u.nom_usage = \'\',u.nom,u.nom_usage) AS nom,
349 u.promo,
350 u.naissance,
351 DATE_ADD(u.naissance, INTERVAL 1 DAY) AS end,
352 u.date_ins,
353 a.alias AS forlife
354 FROM contacts AS c
355 INNER JOIN auth_user_md5 AS u ON (u.user_id = c.contact)
356 INNER JOIN aliases AS a ON (u.user_id = a.id AND a.type = \'a_vie\')
357 WHERE c.uid = {?}', S::v('uid'));
358
359 $annivs = Array();
360 while (list($prenom, $nom, $promo, $naissance, $end, $ts, $forlife) = $res->next()) {
361 $naissance = str_replace('-', '', $naissance);
362 $end = str_replace('-', '', $end);
363 $annivs[] = array(
364 'timestamp' => strtotime($ts),
365 'date' => $naissance,
366 'tomorrow' => $end,
367 'forlife' => $forlife,
368 'summary' => 'Anniversaire de '.$prenom
369 .' '.$nom.' - x '.$promo,
370 );
371 }
372 $page->assign('events', $annivs);
373
374 header('Content-Type: text/calendar; charset=utf-8');
375 }
376
377 function handler_vcard(&$page)
378 {
379 $res = XDB::query('SELECT contact
380 FROM contacts
381 WHERE uid = {?}', S::v('uid'));
382 require_once('vcard.inc.php');
383 $vcard = new VCard($res->fetchColumn());
384 $vcard->do_page(&$page);
385 }
386 }
387
388 ?>