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