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->setRssLink('Polytechnique.org :: Carnet',
53 '/carnet/rss/'.S
::v('forlife') .'/'.S
::v('core_rss_hash').'/rss.xml');
56 function handler_index(&$page)
58 $page->changeTpl('carnet/index.tpl');
59 $page->assign('xorg_title','Polytechnique.org - Mon carnet');
60 $this->_add_rss_link($page);
63 function handler_panel(&$page)
65 $page->changeTpl('carnet/panel.tpl');
67 if (Get
::has('read')) {
68 $_SESSION['watch_last'] = Get
::v('read');
69 pl_redirect('carnet/panel');
72 require_once 'notifs.inc.php';
74 $page->assign('now',date('YmdHis'));
75 $notifs = new Notifs(S
::v('uid'), true
);
77 $page->assign('notifs', $notifs);
78 $page->assign('today', date('Y-m-d'));
79 $this->_add_rss_link($page);
82 function _handler_notifs_promos(&$page, &$watch, $action, $arg)
84 if(preg_match('!^ *(\d{4}) *$!', $arg, $matches)) {
85 $p = intval($matches[1]);
86 if($p<1900 ||
$p>2100) {
87 $page->trig("la promo entrée est invalide");
89 if ($action == 'add_promo') {
90 $watch->_promos
->add($p);
92 $watch->_promos
->del($p);
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) {
99 $page->trig('la première promo de la plage entrée est invalide');
100 } elseif($p2<1900 ||
$p2>2100) {
101 $page->trig('la seconde promo de la plage entrée est invalide');
103 if ($action == 'add_promo') {
104 $watch->_promos
->addRange($p1, $p2);
106 $watch->_promos
->delRange($p1, $p2);
110 $page->trig("La promo (ou la plage de promo) entrée est dans un format incorrect.");
114 function handler_notifs(&$page, $action = null
, $arg = null
)
116 $page->changeTpl('carnet/notifs.tpl');
118 require_once 'notifs.inc.php';
120 $watch = new Watch(S
::v('uid'));
122 $res = XDB
::query("SELECT promo_sortie
124 WHERE user_id = {?}",
126 $promo_sortie = $res->fetchOneCell();
127 $page->assign('promo_sortie', $promo_sortie);
132 $this->_handler_notifs_promos($page, $watch, $action, $arg);
136 $watch->_nonins
->del($arg);
140 $watch->_nonins
->add($arg);
144 if (Env
::has('subs')) $watch->_subs
->update('sub');
145 if (Env
::has('flags_contacts')) {
146 $watch->watch_contacts
= Env
::b('contacts');
149 if (Env
::has('flags_mail')) {
150 $watch->watch_mail
= Env
::b('mail');
154 $page->assign_by_ref('watch', $watch);
157 function _get_list($offset, $limit) {
159 $res = XDB
::query("SELECT COUNT(*) FROM contacts WHERE uid = {?}", $uid);
160 $total = $res->fetchOneCell();
162 $order = Get
::v('order');
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')
169 $order = $orders[$order];
170 if (Get
::v('inv') == '')
171 $order = str_replace(" DESC,", ",", $order);
174 SELECT u.prenom, IF(u.nom_usage='',u.nom,u.nom_usage) AS nom, a.alias AS forlife, u.promo
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')
180 LIMIT {?}, {?}", $uid, $offset*$limit, $limit);
181 $list = $res->fetchAllAssoc();
183 return Array($total, $list);
186 function handler_contacts(&$page, $action = null
)
188 $page->changeTpl('carnet/mescontacts.tpl');
189 require_once("applis.func.inc.php");
190 $page->assign('xorg_title','Polytechnique.org - Mes contacts');
193 $user = Env
::v('user');
195 switch (Env
::v('action')) {
197 if (is_numeric($user)) {
198 if (XDB
::execute('DELETE FROM contacts
199 WHERE uid = {?} AND contact = {?}',
202 $page->trig("Contact retiré !");
206 'DELETE FROM contacts
208 INNER JOIN aliases AS a ON (c.contact=a.id and a.type!="homonyme")
209 WHERE c.uid = {?} AND a.alias={?}', $uid, $user))
211 $page->trig("Contact retiré !");
217 require_once('user.func.inc.php');
218 if (($login = get_user_login($user)) !== false
) {
220 'INSERT INTO contacts (uid, contact)
223 WHERE alias = {?}', $uid, $login))
225 $page->trig('Contact ajouté !');
227 $page->trig('Contact déjà dans la liste !');
232 if ($action == 'trombi') {
233 $trombi = new Trombi(array($this, '_get_list'));
234 $trombi->setNbRows(4);
235 $page->assign_by_ref('trombi',$trombi);
237 $order = Get
::v('order');
238 if ($order != 'promo' && $order != 'last')
240 $page->assign('order', $order);
241 $page->assign('inv', Get
::v('inv'));
245 $order = Get
::v('order');
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')
252 $page->assign('order', $order);
253 $page->assign('inv', Get
::v('inv'));
254 $order = $orders[$order];
255 if (Get
::v('inv') == '')
256 $order = str_replace(" DESC,", ",", $order);
258 $sql = "SELECT contact AS id,
259 a.*, l.alias AS forlife,
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,
269 IF(a.nom_usage<>'',a.nom_usage,a.nom) AS sortkey,
270 COUNT(em.email) > 0 AS actif
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)
286 LEFT JOIN emails AS em ON (em.uid = a.user_id AND em.flags = 'active')
291 $page->assign('citer', XDB
::iterator($sql));
295 function handler_pdf(&$page, $arg0 = null
, $arg1 = null
)
297 require_once dirname(__FILE__
).'/carnet/contacts.pdf.inc.php';
298 require_once 'user.func.inc.php';
300 session_write_close();
302 $sql = "SELECT a.alias
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';
310 $sql .= ' ORDER BY u.nom, u.prenom, u.promo';
313 $citer = XDB
::iterRow($sql, S
::v('uid'));
314 $pdf = new ContactsPDF();
316 while (list($alias) = $citer->next()) {
317 $user = get_user_details($alias);
318 $pdf = ContactsPDF
::addContact($pdf, $user, $arg0 == 'photos' ||
$arg1 == 'photos');
325 function handler_rss(&$page, $user = null
, $hash = null
)
327 require_once 'rss.inc.php';
328 require_once 'notifs.inc.php';
330 $uid = init_rss('carnet/rss.tpl', $user, $hash);
331 $notifs = new Notifs($uid, false
);
332 $page->assign('notifs', $notifs);
335 function handler_ical(&$page)
337 require_once 'ical.inc.php';
338 $page->changeTpl('carnet/calendar.tpl', NO_SKIN
);
339 $page->register_function('display_ical', 'display_ical');
343 IF(u.nom_usage = \'\',u.nom,u.nom_usage) AS nom,
346 DATE_ADD(u.naissance, INTERVAL 1 DAY) AS end,
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'));
355 while (list($prenom, $nom, $promo, $naissance, $end, $ts, $forlife) = $res->next()) {
356 $naissance = str_replace('-', '', $naissance);
357 $end = str_replace('-', '', $end);
359 'timestamp' => strtotime($ts),
360 'date' => $naissance,
362 'forlife' => $forlife,
363 'summary' => 'Anniversaire de '.$prenom
364 .' '.$nom.' - x '.$promo,
367 $page->assign('events', $annivs);
369 header('Content-Type: text/calendar; charset=utf-8');
372 function handler_vcard(&$page, $photos = null
)
374 $res = XDB
::query('SELECT contact
376 WHERE uid = {?}', S
::v('uid'));
378 require_once('vcard.inc.php');
379 $vcard = new VCard($res->fetchColumn(), $photos == 'photos');
380 $vcard->do_page(&$page);