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