2 /***************************************************************************
3 * Copyright (C) 2003-2006 Polytechnique.org *
4 * http://opensource.polytechnique.org/ *
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. *
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. *
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 *
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
20 ***************************************************************************/
22 class CarnetModule
extends PLModule
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
),
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
),
36 'carnet/rss' => $this->make_hook('rss', AUTH_PUBLIC
),
40 function on_subscribe($forlife, $uid, $promo, $password)
42 require_once 'notifs.inc.php';
43 register_watch_op($uid, WATCH_INSCR
);
44 inscription_notifs_base($uid);
47 function _add_rss_link(&$page)
49 if (!S
::has('core_rss_hash')) {
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')
59 function handler_index(&$page)
61 $page->changeTpl('carnet/index.tpl');
62 $page->assign('xorg_title','Polytechnique.org - Mon carnet');
63 $this->_add_rss_link($page);
66 function handler_panel(&$page)
68 $page->changeTpl('carnet/panel.tpl');
70 if (Get
::has('read')) {
71 $_SESSION['watch_last'] = Get
::v('read');
72 pl_redirect('carnet/panel');
75 require_once 'notifs.inc.php';
77 $page->assign('now',date('YmdHis'));
78 $notifs = new Notifs(S
::v('uid'), true
);
80 $page->assign('notifs', $notifs);
81 $page->assign('today', date('Y-m-d'));
82 $this->_add_rss_link($page);
85 function _handler_notifs_promos(&$page, &$watch, $action, $arg)
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");
92 if ($action == 'add_promo') {
93 $watch->_promos
->add($p);
95 $watch->_promos
->del($p);
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');
106 if ($action == 'add_promo') {
107 $watch->_promos
->addRange($p1, $p2);
109 $watch->_promos
->delRange($p1, $p2);
113 $page->trig("La promo (ou la plage de promo) entrée est dans un format incorrect.");
117 function handler_notifs(&$page, $action = null
, $arg = null
)
119 $page->changeTpl('carnet/notifs.tpl');
121 require_once 'notifs.inc.php';
123 $watch = new Watch(S
::v('uid'));
125 $res = XDB
::query("SELECT promo_sortie
127 WHERE user_id = {?}",
129 $promo_sortie = $res->fetchOneCell();
130 $page->assign('promo_sortie', $promo_sortie);
135 $this->_handler_notifs_promos($page, $watch, $action, $arg);
139 $watch->_nonins
->del($arg);
143 $watch->_nonins
->add($arg);
147 if (Env
::has('subs')) $watch->_subs
->update('sub');
148 if (Env
::has('flags_contacts')) {
149 $watch->watch_contacts
= Env
::b('contacts');
152 if (Env
::has('flags_mail')) {
153 $watch->watch_mail
= Env
::b('mail');
157 $page->assign_by_ref('watch', $watch);
160 function _get_list($offset, $limit) {
162 $res = XDB
::query("SELECT COUNT(*) FROM contacts WHERE uid = {?}", $uid);
163 $total = $res->fetchOneCell();
165 $order = Get
::v('order');
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')
172 $order = $orders[$order];
173 if (Get
::v('inv') == '')
174 $order = str_replace(" DESC,", ",", $order);
177 SELECT u.prenom, IF(u.nom_usage='',u.nom,u.nom_usage) AS nom, a.alias AS forlife, u.promo
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')
183 LIMIT {?}, {?}", $uid, $offset*$limit, $limit);
184 $list = $res->fetchAllAssoc();
186 return Array($total, $list);
189 function handler_contacts(&$page, $action = null
)
191 $page->changeTpl('carnet/mescontacts.tpl');
192 require_once("applis.func.inc.php");
193 $page->assign('xorg_title','Polytechnique.org - Mes contacts');
196 $user = Env
::v('user');
198 switch (Env
::v('action')) {
200 if (is_numeric($user)) {
201 if (XDB
::execute('DELETE FROM contacts
202 WHERE uid = {?} AND contact = {?}',
205 $page->trig("Contact retiré !");
209 'DELETE FROM contacts
211 INNER JOIN aliases AS a ON (c.contact=a.id and a.type!="homonyme")
212 WHERE c.uid = {?} AND a.alias={?}', $uid, $user))
214 $page->trig("Contact retiré !");
220 require_once('user.func.inc.php');
221 if (($login = get_user_login($user)) !== false
) {
223 'INSERT INTO contacts (uid, contact)
226 WHERE alias = {?}', $uid, $login))
228 $page->trig('Contact ajouté !');
230 $page->trig('Contact déjà dans la liste !');
235 if ($action == 'trombi') {
236 $trombi = new Trombi(array($this, '_get_list'));
237 $trombi->setNbRows(4);
238 $page->assign_by_ref('trombi',$trombi);
240 $order = Get
::v('order');
241 if ($order != 'promo' && $order != 'last')
243 $page->assign('order', $order);
244 $page->assign('inv', Get
::v('inv'));
248 $order = Get
::v('order');
250 'nom' => 'sortkey DESC, a.prenom, a.promo',
251 'promo' => 'promo DESC, sortkey, a.prenom',
252 'last' => 'a.date DESC, sortkey, a.prenom, promo');
253 if ($order != 'promo' && $order != 'last')
255 $page->assign('order', $order);
256 $page->assign('inv', Get
::v('inv'));
257 $order = $orders[$order];
258 if (Get
::v('inv') == '')
259 $order = str_replace(" DESC,", ",", $order);
261 $sql = "SELECT contact AS id,
262 a.*, l.alias AS forlife,
264 a.perms != 'pending' AS wasinscrit,
265 a.deces != 0 AS dcd, a.deces, a.matricule_ax,
266 FIND_IN_SET('femme', a.flags) AS sexe,
267 e.entreprise, es.label AS secteur, ef.fonction_fr AS fonction,
268 IF(n.nat='',n.pays,n.nat) AS nat, n.a2 AS iso3166,
269 ad0.text AS app0text, ad0.url AS app0url, ai0.type AS app0type,
270 ad1.text AS app1text, ad1.url AS app1url, ai1.type AS app1type,
271 adr.city, gp.a2, gp.pays AS countrytxt, gr.name AS region,
272 IF(a.nom_usage<>'',a.nom_usage,a.nom) AS sortkey,
273 COUNT(em.email) > 0 AS actif
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 LEFT JOIN emails AS em ON (em.uid = a.user_id AND em.flags = 'active')
294 $page->assign('citer', XDB
::iterator($sql));
298 function handler_pdf(&$page, $arg0 = null
, $arg1 = null
)
300 require_once dirname(__FILE__
).'/carnet/contacts.pdf.inc.php';
301 require_once 'user.func.inc.php';
303 session_write_close();
305 $sql = "SELECT a.alias
307 INNER JOIN auth_user_md5 AS u ON ( a.id = u.user_id )
308 INNER JOIN contacts AS c ON ( a.id = c.contact )
309 WHERE c.uid = {?} AND a.type='a_vie'";
310 if ($arg0 == 'promo') {
311 $sql .= ' ORDER BY u.promo, u.nom, u.prenom';
313 $sql .= ' ORDER BY u.nom, u.prenom, u.promo';
316 $citer = XDB
::iterRow($sql, S
::v('uid'));
317 $pdf = new ContactsPDF();
319 while (list($alias) = $citer->next()) {
320 $user = get_user_details($alias);
321 $pdf = ContactsPDF
::addContact($pdf, $user, $arg0 == 'photos' ||
$arg1 == 'photos');
328 function handler_rss(&$page, $user = null
, $hash = null
)
330 require_once 'rss.inc.php';
331 require_once 'notifs.inc.php';
333 $uid = init_rss('carnet/rss.tpl', $user, $hash);
334 $notifs = new Notifs($uid, false
);
335 $page->assign('notifs', $notifs);
338 function handler_ical(&$page)
340 require_once dirname(__FILE__
).'/carnet/smarty.php';
341 $page->changeTpl('carnet/calendar.tpl', NO_SKIN
);
342 $page->register_function('display_ical', 'display_ical');
346 IF(u.nom_usage = \'\',u.nom,u.nom_usage) AS nom,
349 DATE_ADD(u.naissance, INTERVAL 1 DAY) AS end,
353 INNER JOIN auth_user_md5 AS u ON (u.user_id = c.contact)
354 INNER JOIN aliases AS a ON (u.user_id = a.id AND a.type = \'a_vie\')
355 WHERE c.uid = {?}', S
::v('uid'));
358 while (list($prenom, $nom, $promo, $naissance, $end, $ts, $forlife) = $res->next()) {
359 $naissance = str_replace('-', '', $naissance);
360 $end = str_replace('-', '', $end);
362 'timestamp' => strtotime($ts),
363 'date' => $naissance,
365 'forlife' => $forlife,
366 'summary' => 'Anniversaire de '.$prenom
367 .' '.$nom.' - x '.$promo,
370 $page->assign('events', $annivs);
372 header('Content-Type: text/calendar; charset=utf-8');
375 function handler_vcard(&$page, $photos = null
)
377 $res = XDB
::query('SELECT contact
379 WHERE uid = {?}', S
::v('uid'));
381 require_once('vcard.inc.php');
382 $vcard = new VCard($res->fetchColumn(), $photos == 'photos');
383 $vcard->do_page(&$page);