Table editor fills the new entry form with the default values of the fields
[platal.git] / modules / carnet.php
index 4710ae4..223b2ab 100644 (file)
@@ -24,27 +24,33 @@ class CarnetModule extends PLModule
     function handlers()
     {
         return array(
     function handlers()
     {
         return array(
-            'carnet'              => $this->make_hook('index',    AUTH_COOKIE),
-            'carnet/panel'        => $this->make_hook('panel',    AUTH_COOKIE),
-            'carnet/notifs'       => $this->make_hook('notifs',   AUTH_COOKIE),
+            'carnet'                => $this->make_hook('index',    AUTH_COOKIE),
+            'carnet/panel'          => $this->make_hook('panel',    AUTH_COOKIE),
+            'carnet/notifs'         => $this->make_hook('notifs',   AUTH_COOKIE),
 
 
-            'carnet/contacts'     => $this->make_hook('contacts', AUTH_COOKIE),
-            'carnet/contacts/pdf' => $this->make_hook('pdf',      AUTH_COOKIE),
+            'carnet/contacts'       => $this->make_hook('contacts', AUTH_COOKIE),
+            'carnet/contacts/pdf'   => $this->make_hook('pdf',      AUTH_COOKIE),
+            'carnet/contacts/ical'  => $this->make_hook('ical',     AUTH_COOKIE),
+            'carnet/contacts/vcard' => $this->make_hook('vcard',    AUTH_COOKIE),
 
 
-            'carnet/rss'          => $this->make_hook('rss',      AUTH_PUBLIC),
-            'carnet/ical'         => $this->make_hook('ical',     AUTH_PUBLIC),
+            'carnet/rss'            => $this->make_hook('rss',      AUTH_PUBLIC),
         );
     }
 
         );
     }
 
+    function on_subscribe($forlife, $uid, $promo, $password)
+    {
+        require_once 'notifs.inc.php';
+        register_watch_op($uid, WATCH_INSCR);
+        inscription_notifs_base($uid);
+    }
+
     function _add_rss_link(&$page)
     {
     function _add_rss_link(&$page)
     {
-        if (!Session::has('core_rss_hash'))
+        if (!S::has('core_rss_hash')) {
             return;
             return;
-        $page->assign('xorg_rss',
-                      array('title' => 'Polytechnique.org :: Carnet',
-                            'href'  => '/carnet/rss/'.Session::get('forlife')
-                                      .'/'.Session::get('core_rss_hash').'/rss.xml')
-                      );
+        }
+        $page->setRssLink('Polytechnique.org :: Carnet',
+                          '/carnet/rss/'.S::v('forlife') .'/'.S::v('core_rss_hash').'/rss.xml');
     }
 
     function handler_index(&$page)
     }
 
     function handler_index(&$page)
@@ -52,8 +58,6 @@ class CarnetModule extends PLModule
         $page->changeTpl('carnet/index.tpl');
         $page->assign('xorg_title','Polytechnique.org - Mon carnet');
         $this->_add_rss_link($page);
         $page->changeTpl('carnet/index.tpl');
         $page->assign('xorg_title','Polytechnique.org - Mon carnet');
         $this->_add_rss_link($page);
-
-        return PL_OK;
     }
 
     function handler_panel(&$page)
     }
 
     function handler_panel(&$page)
@@ -61,22 +65,18 @@ class CarnetModule extends PLModule
         $page->changeTpl('carnet/panel.tpl');
 
         if (Get::has('read')) {
         $page->changeTpl('carnet/panel.tpl');
 
         if (Get::has('read')) {
-            global $globals;
-
-            $_SESSION['watch_last'] = Get::get('read');
-            redirect($globals->baseurl.'/carnet/panel');
+            $_SESSION['watch_last'] = Get::v('read');
+            pl_redirect('carnet/panel');
         }
 
         require_once 'notifs.inc.php';
 
         $page->assign('now',date('YmdHis'));
         }
 
         require_once 'notifs.inc.php';
 
         $page->assign('now',date('YmdHis'));
-        $notifs = new Notifs(Session::getInt('uid'), true);
+        $notifs = new Notifs(S::v('uid'), true);
 
         $page->assign('notifs', $notifs);
         $page->assign('today', date('Y-m-d'));
         $this->_add_rss_link($page);
 
         $page->assign('notifs', $notifs);
         $page->assign('today', date('Y-m-d'));
         $this->_add_rss_link($page);
-
-        return PL_OK;
     }
 
     function _handler_notifs_promos(&$page, &$watch, $action, $arg)
     }
 
     function _handler_notifs_promos(&$page, &$watch, $action, $arg)
@@ -84,7 +84,7 @@ class CarnetModule extends PLModule
         if(preg_match('!^ *(\d{4}) *$!', $arg, $matches)) {
             $p = intval($matches[1]);
             if($p<1900 || $p>2100) {
         if(preg_match('!^ *(\d{4}) *$!', $arg, $matches)) {
             $p = intval($matches[1]);
             if($p<1900 || $p>2100) {
-                $page->trig("la promo entrée est invalide");
+                $page->trig("la promo entrée est invalide");
             } else {
                 if ($action == 'add_promo') {
                     $watch->_promos->add($p);
             } else {
                 if ($action == 'add_promo') {
                     $watch->_promos->add($p);
@@ -96,9 +96,9 @@ class CarnetModule extends PLModule
             $p1 = intval($matches[1]);
             $p2 = intval($matches[2]);
             if($p1<1900 || $p1>2100) {
             $p1 = intval($matches[1]);
             $p2 = intval($matches[2]);
             if($p1<1900 || $p1>2100) {
-                $page->trig('la première promo de la plage entrée est invalide');
+                $page->trig('la première promo de la plage entrée est invalide');
             } elseif($p2<1900 || $p2>2100) {
             } elseif($p2<1900 || $p2>2100) {
-                $page->trig('la seconde promo de la plage entrée est invalide');
+                $page->trig('la seconde promo de la plage entrée est invalide');
             } else {
                 if ($action == 'add_promo') {
                     $watch->_promos->addRange($p1, $p2);
             } else {
                 if ($action == 'add_promo') {
                     $watch->_promos->addRange($p1, $p2);
@@ -107,24 +107,22 @@ class CarnetModule extends PLModule
                 }
             }
         } else {
                 }
             }
         } else {
-            $page->trig("La promo (ou la plage de promo) entrée est dans un format incorrect.");
+            $page->trig("La promo (ou la plage de promo) entrée est dans un format incorrect.");
         }
     }
 
     function handler_notifs(&$page, $action = null, $arg = null)
     {
         }
     }
 
     function handler_notifs(&$page, $action = null, $arg = null)
     {
-        global $globals;
-
         $page->changeTpl('carnet/notifs.tpl');
 
         require_once 'notifs.inc.php';
 
         $page->changeTpl('carnet/notifs.tpl');
 
         require_once 'notifs.inc.php';
 
-        $watch = new Watch(Session::getInt('uid'));
+        $watch = new Watch(S::v('uid'));
 
 
-        $res = $globals->xdb->query("SELECT promo_sortie
+        $res = XDB::query("SELECT promo_sortie
                                        FROM auth_user_md5
                                       WHERE user_id = {?}",
                                        FROM auth_user_md5
                                       WHERE user_id = {?}",
-                                    Session::getInt('uid', -1));
+                                    S::v('uid', -1));
         $promo_sortie = $res->fetchOneCell();
         $page->assign('promo_sortie', $promo_sortie);
 
         $promo_sortie = $res->fetchOneCell();
         $page->assign('promo_sortie', $promo_sortie);
 
@@ -145,26 +143,23 @@ class CarnetModule extends PLModule
 
         if (Env::has('subs'))       $watch->_subs->update('sub');
         if (Env::has('flags_contacts')) {
 
         if (Env::has('subs'))       $watch->_subs->update('sub');
         if (Env::has('flags_contacts')) {
-            $watch->watch_contacts = Env::getBool('contacts');
+            $watch->watch_contacts = Env::b('contacts');
             $watch->saveFlags();
         }
         if (Env::has('flags_mail')) {
             $watch->saveFlags();
         }
         if (Env::has('flags_mail')) {
-            $watch->watch_mail     = Env::getBool('mail');
+            $watch->watch_mail     = Env::b('mail');
             $watch->saveFlags();
         }
 
         $page->assign_by_ref('watch', $watch);
             $watch->saveFlags();
         }
 
         $page->assign_by_ref('watch', $watch);
-
-        return PL_OK;
     }
 
     function _get_list($offset, $limit) {
     }
 
     function _get_list($offset, $limit) {
-        global $globals;
-        $uid   = Session::getInt('uid');
-        $res   = $globals->xdb->query("SELECT COUNT(*) FROM contacts WHERE uid = {?}", $uid);
+        $uid   = S::v('uid');
+        $res   = XDB::query("SELECT COUNT(*) FROM contacts WHERE uid = {?}", $uid);
         $total = $res->fetchOneCell();
 
         $total = $res->fetchOneCell();
 
-        $order = Get::get('order');
+        $order = Get::v('order');
         $orders = Array(
             'nom'     => 'nom DESC, u.prenom, u.promo',
             'promo'   => 'promo DESC, nom, u.prenom',
         $orders = Array(
             'nom'     => 'nom DESC, u.prenom, u.promo',
             'promo'   => 'promo DESC, nom, u.prenom',
@@ -172,10 +167,10 @@ class CarnetModule extends PLModule
         if ($order != 'promo' && $order != 'last')
             $order = 'nom';
         $order = $orders[$order];
         if ($order != 'promo' && $order != 'last')
             $order = 'nom';
         $order = $orders[$order];
-        if (Get::get('inv') == '')
+        if (Get::v('inv') == '')
             $order = str_replace(" DESC,", ",", $order);
 
             $order = str_replace(" DESC,", ",", $order);
 
-        $res   = $globals->xdb->query("
+        $res   = XDB::query("
                 SELECT  u.prenom, IF(u.nom_usage='',u.nom,u.nom_usage) AS nom, a.alias AS forlife, u.promo
                   FROM  contacts       AS c
             INNER JOIN  auth_user_md5  AS u   ON (u.user_id = c.contact)
                 SELECT  u.prenom, IF(u.nom_usage='',u.nom,u.nom_usage) AS nom, a.alias AS forlife, u.promo
                   FROM  contacts       AS c
             INNER JOIN  auth_user_md5  AS u   ON (u.user_id = c.contact)
@@ -190,32 +185,31 @@ class CarnetModule extends PLModule
 
     function handler_contacts(&$page, $action = null)
     {
 
     function handler_contacts(&$page, $action = null)
     {
-        global $globals;
-
         $page->changeTpl('carnet/mescontacts.tpl');
         require_once("applis.func.inc.php");
         $page->assign('xorg_title','Polytechnique.org - Mes contacts');
         $page->changeTpl('carnet/mescontacts.tpl');
         require_once("applis.func.inc.php");
         $page->assign('xorg_title','Polytechnique.org - Mes contacts');
+        $this->_add_rss_link($page);
 
 
-        $uid  = Session::getInt('uid');
-        $user = Env::get('user');
+        $uid  = S::v('uid');
+        $user = Env::v('user');
 
 
-        switch (Env::get('action')) {
+        switch (Env::v('action')) {
             case 'retirer':
                 if (is_numeric($user)) {
             case 'retirer':
                 if (is_numeric($user)) {
-                    if ($globals->xdb->execute('DELETE FROM contacts
+                    if (XDB::execute('DELETE FROM contacts
                                                       WHERE uid = {?} AND contact = {?}',
                                                $uid, $user))
                     {
                                                       WHERE uid = {?} AND contact = {?}',
                                                $uid, $user))
                     {
-                        $page->trig("Contact retiré !");
+                        $page->trig("Contact retiré !");
                     }
                 } else {
                     }
                 } else {
-                    if ($globals->xdb->execute(
+                    if (XDB::execute(
                                 'DELETE FROM  contacts
                                        USING  contacts AS c
                                   INNER JOIN  aliases  AS a ON (c.contact=a.id and a.type!="homonyme")
                                        WHERE  c.uid = {?} AND a.alias={?}', $uid, $user))
                     {
                                 'DELETE FROM  contacts
                                        USING  contacts AS c
                                   INNER JOIN  aliases  AS a ON (c.contact=a.id and a.type!="homonyme")
                                        WHERE  c.uid = {?} AND a.alias={?}', $uid, $user))
                     {
-                        $page->trig("Contact retiré !");
+                        $page->trig("Contact retiré !");
                     }
                 }
                 break;
                     }
                 }
                 break;
@@ -223,35 +217,33 @@ class CarnetModule extends PLModule
             case 'ajouter':
                 require_once('user.func.inc.php');
                 if (($login = get_user_login($user)) !== false) {
             case 'ajouter':
                 require_once('user.func.inc.php');
                 if (($login = get_user_login($user)) !== false) {
-                    if ($globals->xdb->execute(
+                    if (XDB::execute(
                                 'INSERT INTO  contacts (uid, contact)
                                       SELECT  {?}, id
                                         FROM  aliases
                                        WHERE  alias = {?}', $uid, $login))
                     {
                                 'INSERT INTO  contacts (uid, contact)
                                       SELECT  {?}, id
                                         FROM  aliases
                                        WHERE  alias = {?}', $uid, $login))
                     {
-                        $page->trig('Contact ajouté !');
+                        $page->trig('Contact ajouté !');
                     } else {
                     } else {
-                        $page->trig('Contact déjà dans la liste !');
+                        $page->trig('Contact déjà dans la liste !');
                     }
                 }
         }
 
         if ($action == 'trombi') {
                     }
                 }
         }
 
         if ($action == 'trombi') {
-            require_once 'trombi.inc.php';
-
             $trombi = new Trombi(array($this, '_get_list'));
             $trombi->setNbRows(4);
             $page->assign_by_ref('trombi',$trombi);
 
             $trombi = new Trombi(array($this, '_get_list'));
             $trombi->setNbRows(4);
             $page->assign_by_ref('trombi',$trombi);
 
-            $order = Get::get('order');
+            $order = Get::v('order');
             if ($order != 'promo' && $order != 'last')
                 $order = 'nom';
             $page->assign('order', $order);
             if ($order != 'promo' && $order != 'last')
                 $order = 'nom';
             $page->assign('order', $order);
-            $page->assign('inv', Get::get('inv'));
+            $page->assign('inv', Get::v('inv'));
 
         } else {
 
 
         } else {
 
-            $order = Get::get('order');
+            $order = Get::v('order');
             $orders = Array(
                 'nom'     => 'sortkey DESC, a.prenom, a.promo',
                 'promo'   => 'promo DESC, sortkey, a.prenom',
             $orders = Array(
                 'nom'     => 'sortkey DESC, a.prenom, a.promo',
                 'promo'   => 'promo DESC, sortkey, a.prenom',
@@ -259,9 +251,9 @@ class CarnetModule extends PLModule
             if ($order != 'promo' && $order != 'last')
                 $order = 'nom';
             $page->assign('order', $order);
             if ($order != 'promo' && $order != 'last')
                 $order = 'nom';
             $page->assign('order', $order);
-            $page->assign('inv', Get::get('inv'));
+            $page->assign('inv', Get::v('inv'));
             $order = $orders[$order];
             $order = $orders[$order];
-            if (Get::get('inv') == '')
+            if (Get::v('inv') == '')
                 $order = str_replace(" DESC,", ",", $order);
 
             $sql = "SELECT  contact AS id,
                 $order = str_replace(" DESC,", ",", $order);
 
             $sql = "SELECT  contact AS id,
@@ -275,7 +267,8 @@ class CarnetModule extends PLModule
                             ad0.text AS app0text, ad0.url AS app0url, ai0.type AS app0type,
                             ad1.text AS app1text, ad1.url AS app1url, ai1.type AS app1type,
                             adr.city, gp.a2, gp.pays AS countrytxt, gr.name AS region,
                             ad0.text AS app0text, ad0.url AS app0url, ai0.type AS app0type,
                             ad1.text AS app1text, ad1.url AS app1url, ai1.type AS app1type,
                             adr.city, gp.a2, gp.pays AS countrytxt, gr.name AS region,
-                            IF(a.nom_usage<>'',a.nom_usage,a.nom) AS sortkey
+                            IF(a.nom_usage<>'',a.nom_usage,a.nom) AS sortkey,
+                            COUNT(em.email) > 0 AS actif
                       FROM  contacts       AS c
                 INNER JOIN  auth_user_md5  AS a   ON (a.user_id = c.contact)
                 INNER JOIN  aliases        AS l   ON (a.user_id = l.id AND l.type='a_vie')
                       FROM  contacts       AS c
                 INNER JOIN  auth_user_md5  AS a   ON (a.user_id = c.contact)
                 INNER JOIN  aliases        AS l   ON (a.user_id = l.id AND l.type='a_vie')
@@ -291,20 +284,18 @@ class CarnetModule extends PLModule
                                                       AND FIND_IN_SET('active', adr.statut))
                  LEFT JOIN  geoloc_pays    AS gp  ON (adr.country = gp.a2)
                  LEFT JOIN  geoloc_region  AS gr  ON (adr.country = gr.a2 AND adr.region = gr.region)
                                                       AND FIND_IN_SET('active', adr.statut))
                  LEFT JOIN  geoloc_pays    AS gp  ON (adr.country = gp.a2)
                  LEFT JOIN  geoloc_region  AS gr  ON (adr.country = gr.a2 AND adr.region = gr.region)
+                 LEFT JOIN  emails         AS em  ON (em.uid = a.user_id AND em.flags = 'active')
                      WHERE  c.uid = $uid
                      WHERE  c.uid = $uid
+                  GROUP BY  a.user_id
                   ORDER BY  ".$order;
 
                   ORDER BY  ".$order;
 
-            $page->assign_by_ref('citer', $globals->xdb->iterator($sql));
+            $page->assign('citer', XDB::iterator($sql));
         }
         }
-
-        return PL_OK;
     }
 
     function handler_pdf(&$page, $arg0 = null, $arg1 = null)
     {
     }
 
     function handler_pdf(&$page, $arg0 = null, $arg1 = null)
     {
-        global $globals;
-
-        require_once 'contacts.pdf.inc.php';
+        require_once dirname(__FILE__).'/carnet/contacts.pdf.inc.php';
         require_once 'user.func.inc.php';
 
         session_write_close();
         require_once 'user.func.inc.php';
 
         session_write_close();
@@ -320,12 +311,12 @@ class CarnetModule extends PLModule
             $sql .= ' ORDER BY  u.nom, u.prenom, u.promo';
         }
 
             $sql .= ' ORDER BY  u.nom, u.prenom, u.promo';
         }
 
-        $citer = $globals->xdb->iterRow($sql, Session::getInt('uid'));
+        $citer = XDB::iterRow($sql, S::v('uid'));
         $pdf   = new ContactsPDF();
 
         while (list($alias) = $citer->next()) {
             $user = get_user_details($alias);
         $pdf   = new ContactsPDF();
 
         while (list($alias) = $citer->next()) {
             $user = get_user_details($alias);
-            $pdf->addContact($user, $arg0 == 'photos' || $arg1 == 'photos');
+            $pdf = ContactsPDF::addContact($pdf, $user, $arg0 == 'photos' || $arg1 == 'photos');
         }
         $pdf->Output();
 
         }
         $pdf->Output();
 
@@ -340,56 +331,54 @@ class CarnetModule extends PLModule
         $uid    = init_rss('carnet/rss.tpl', $user, $hash);
         $notifs = new Notifs($uid, false);
         $page->assign('notifs', $notifs);
         $uid    = init_rss('carnet/rss.tpl', $user, $hash);
         $notifs = new Notifs($uid, false);
         $page->assign('notifs', $notifs);
-
-        return PL_OK;
     }
 
     }
 
-    function handler_ical(&$page, $user = null, $hash = null, $all = null)
+    function handler_ical(&$page)
     {
     {
-        global $globals;
-
-        new_nonhtml_page('carnet/calendar.tpl', AUTH_PUBLIC);
-
-        if ($alias && $hash) {
-            $res = $globals->xdb->query(
-                'SELECT  a.id
-                   FROM  aliases         AS a
-             INNER JOIN  auth_user_quick AS q ON ( a.id = q.user_id AND q.core_rss_hash = {?} )
-                  WHERE  a.alias = {?} AND a.type != "homonyme"', $hash, $alias);
-            $uid = $res->fetchOneCell();
-        }
-
-        require_once 'notifs.inc.php';
-        $notifs = new Notifs($uid, true);
-
-        $annivcat = false;
-        foreach ($notifs->_cats as $cat) {
-            if (preg_match('/anniv/i', $cat['short']))
-                $annivcat = $cat['id'];
-        }
-
-        if ($annivcat !== false) {
-            $annivs = array();
-            foreach ($notifs->_data[$annivcat] as $promo) {
-                foreach ($promo as $notif) {
-                    if ($all == 'all' || $notif['contact']) {
-                        $annivs[] = array(
-                            'timestamp' => $notif['known'],
-                            'date'      => strtotime($notif['date']),
-                            'tomorrow'  => strtotime("+1 day", strtotime($notif['date'])),
-                            'bestalias' => $notif['bestalias'],
-                            'summary'   => 'Anniversaire de '.$notif['prenom']
-                                           .' '.$notif['nom'].' - x '.$notif['promo'],
-                         );
-                    }
-                }
-            }
-            $page->assign('events', $annivs);
+        require_once 'ical.inc.php';
+        $page->changeTpl('carnet/calendar.tpl', NO_SKIN);
+        $page->register_function('display_ical', 'display_ical');
+
+        $res = XDB::iterRow(
+                'SELECT u.prenom,
+                        IF(u.nom_usage = \'\',u.nom,u.nom_usage) AS nom,
+                        u.promo,
+                        u.naissance,
+                        DATE_ADD(u.naissance, INTERVAL 1 DAY) AS end,
+                        u.date_ins,
+                        a.alias AS forlife
+                   FROM contacts      AS c
+             INNER JOIN auth_user_md5 AS u ON (u.user_id = c.contact)
+             INNER JOIN aliases       AS a ON (u.user_id = a.id AND a.type = \'a_vie\')
+                  WHERE c.uid = {?}', S::v('uid'));
+
+        $annivs = Array();
+        while (list($prenom, $nom, $promo, $naissance, $end, $ts, $forlife) = $res->next()) {
+            $naissance = str_replace('-', '', $naissance);
+            $end       = str_replace('-', '', $end);
+            $annivs[] = array(
+                'timestamp' => strtotime($ts),
+                'date'      => $naissance,
+                'tomorrow'  => $end,
+                'forlife'   => $forlife,
+                'summary'   => 'Anniversaire de '.$prenom
+                                .' '.$nom.' - x '.$promo,
+            );
         }
         }
+        $page->assign('events', $annivs);
 
         header('Content-Type: text/calendar; charset=utf-8');
 
         header('Content-Type: text/calendar; charset=utf-8');
+    }
+
+    function handler_vcard(&$page, $photos = null)
+    {
+        $res = XDB::query('SELECT contact
+                             FROM contacts
+                            WHERE uid = {?}', S::v('uid'));
 
 
-        return PL_OK;
+        require_once('vcard.inc.php');
+        $vcard = new VCard($res->fetchColumn(), $photos == 'photos');
+        $vcard->do_page(&$page);
     }
 }
 
     }
 }