#570: Fix geoloc skin on xnet && fix access right
[platal.git] / modules / xnetgrp.php
index 4c624b7..580716b 100644 (file)
@@ -34,12 +34,19 @@ function get_infos($email)
     }
 
     $res = XDB::query(
-            "SELECT  uid, nom, prenom, email, email AS email2, perms='admin', origine
+            "SELECT  uid, nom, prenom, email, email AS email2, perms='admin', origine, sexe
                FROM  groupex.membres
               WHERE  $field = {?} AND asso_id = {?}", $email, $globals->asso('id'));
 
     if ($res->numRows()) {
-        return $res->fetchOneAssoc();
+        $user = $res->fetchOneAssoc();
+        if ($user['origine'] == 'X') {
+            $res = XDB::query("SELECT nom, prenom, promo, FIND_IN_SET(flags, 'femme') AS sexe
+                                 FROM auth_user_md5
+                                WHERE user_id = {?}", $user['uid']);
+            $user = array_merge($user, $res->fetchOneAssoc());
+        }
+        return $user;                        
     } elseif ($dom == 'polytechnique.org' || $dom == 'm4x.org') {
         $res = XDB::query(
                 "SELECT  user_id AS uid, u.promo,
@@ -47,7 +54,8 @@ function get_infos($email)
                          u.prenom, b.alias,
                          CONCAT(b.alias, '@m4x.org') AS email,
                          CONCAT(b.alias, '@polytechnique.org') AS email2,
-                         m.perms='admin' AS perms, m.origine
+                         m.perms='admin' AS perms, m.origine,
+                         FIND_IN_SET(u.flags, 'femme') AS sexe
                    FROM  auth_user_md5   AS u
              INNER JOIN  aliases         AS a ON ( u.user_id = a.id AND a.type != 'homonyme' )
              INNER JOIN  aliases         AS b ON ( u.user_id = b.id AND b.type = 'a_vie' )
@@ -72,6 +80,7 @@ class XnetGrpModule extends PLModule
             '%grp/mail'           => $this->make_hook('mail',      AUTH_MDP),
             '%grp/annuaire'       => $this->make_hook('annuaire',  AUTH_MDP),
             '%grp/annuaire/vcard' => $this->make_hook('vcard',     AUTH_MDP),
+            '%grp/trombi'         => $this->make_hook('trombi',    AUTH_MDP),
             '%grp/subscribe'      => $this->make_hook('subscribe', AUTH_MDP),
             '%grp/paiement'       => $this->make_hook('paiement',  AUTH_MDP),
 
@@ -82,6 +91,8 @@ class XnetGrpModule extends PLModule
                  => $this->make_hook('admin_member', AUTH_MDP),
             '%grp/member/new'
                  => $this->make_hook('admin_member_new', AUTH_MDP),
+            '%grp/member/new/ajax'
+                 => $this->make_hook('admin_member_new_ajax', AUTH_MDP, '', NO_AUTH),         
             '%grp/member/del'
                  => $this->make_hook('admin_member_del', AUTH_MDP),
 
@@ -148,7 +159,7 @@ class XnetGrpModule extends PLModule
                                      FROM groupex.announces AS a
                                INNER JOIN auth_user_md5 AS u USING(user_id)
                                     WHERE asso_id = {?} AND peremption >= CURRENT_DATE()
-                                          AND FIND_IN_SET(u.flags, 'public')",
+                                          AND FIND_IN_SET(a.flags, 'public')",
                                   $globals->asso('id'));
         }
 
@@ -286,8 +297,6 @@ class XnetGrpModule extends PLModule
     {
         global $globals;
 
-        define('NB_PER_PAGE', 25);
-
         if ($globals->asso('pub') == 'public') {
             new_group_page('xnet/groupe/annuaire.tpl');
         } else {
@@ -308,7 +317,7 @@ class XnetGrpModule extends PLModule
         if ($group == 'initiale')
             $res = XDB::iterRow(
                         'SELECT  UPPER(SUBSTRING(
-                                     IF(m.origine="X", IF(u.nom_usage<>"", u.nom_usage, u.nom),m.nom),
+                                    IF(m.origine="X", IF(u.nom_usage<>"", u.nom_usage, u.nom),m.nom),
                                      1, 1)) as letter, COUNT(*)
                            FROM  groupex.membres AS m
                       LEFT JOIN  auth_user_md5   AS u ON ( u.user_id = m.uid )
@@ -336,6 +345,7 @@ class XnetGrpModule extends PLModule
         }
         $page->assign('group', $group);
         $page->assign('request_group', Env::v($group));
+        $page->assign('only_admin', Env::has('admin'));
         $page->assign('alphabet', $alphabet);
         $page->assign('nb_tot',   $nb_tot);
 
@@ -364,6 +374,8 @@ class XnetGrpModule extends PLModule
         } elseif (Env::has('promo')) {
             $ini = 'AND IF(m.origine="X", u.promo, "extérieur") = "'
                  .addslashes(Env::v('promo')).'"';
+        } elseif (Env::has('admin')) {
+            $ini = 'AND m.perms = "admin"';
         }
 
         $ann = XDB::iterator(
@@ -371,22 +383,66 @@ class XnetGrpModule extends PLModule
                            IF(m.origine='X',u.prenom,m.prenom) AS prenom,
                            IF(m.origine='X',u.promo,'extérieur') AS promo,
                            IF(m.origine='X',u.promo,'') AS promo_o,
-                           IF(m.origine='X',a.alias,m.email) AS email,
+                           IF(m.origine='X' AND u.perms != 'pending',a.alias,m.email) AS email,
                            IF(m.origine='X',FIND_IN_SET('femme', u.flags), m.sexe) AS femme,
                            m.perms='admin' AS admin,
                            m.origine='X' AS x,
+                           u.perms!='pending' AS inscrit,
                            m.uid
                      FROM  groupex.membres AS m
                 LEFT JOIN  auth_user_md5   AS u ON ( u.user_id = m.uid )
                 LEFT JOIN  aliases         AS a ON ( a.id = m.uid AND a.type='a_vie' )
                     WHERE  m.asso_id = {?} $ini
-                           AND (m.origine = 'ext' OR u.perms != 'pending')
+                           AND (m.origine = 'ext' OR u.perms != 'pending' OR m.email IS NOT NULL)
                  ORDER BY  $tri
                     LIMIT  {?},{?}", $globals->asso('id'), $ofs*NB_PER_PAGE, NB_PER_PAGE);
-
         $page->assign('ann', $ann);
     }
 
+    function handler_trombi(&$page, $num = 1)
+    {
+        global $globals;
+        if ($globals->asso('cat') == 'Promotions') {
+            new_group_open_page('xnet/groupe/trombi.tpl');
+        } elseif ($globals->asso('pub') == 'public') {
+            new_group_page('xnet/groupe/trombi.tpl');
+        } else {
+            new_groupadmin_page('xnet/groupe/trombi.tpl');
+        }
+        $page->assign('admin', may_update());
+        
+        $page->assign('urlmainsite', "https://www.polytechnique.org/");
+        $trombi = new Trombi(array($this, '_trombi_getlist'));
+        $trombi->hidePromo();
+        $trombi->setAdmin();
+        $page->assign_by_ref('trombi', $trombi);
+    }
+
+    function _trombi_getlist($offset, $limit)
+    {
+        global $globals;
+        $where  = "WHERE m.asso_id= '".addslashes($globals->asso('id'))."'";
+
+        $res = XDB::query(
+                "SELECT  COUNT(*)
+                   FROM  auth_user_md5 AS u
+             RIGHT JOIN  photo         AS p ON u.user_id=p.uid
+             INNER JOIN  groupex.membres AS m ON (m.uid = u.user_id)
+             $where");
+        $pnb = $res->fetchOneCell();
+        
+        $res = XDB::query("SELECT  promo, user_id, a.alias AS forlife,
+                         IF (nom_usage='', u.nom, nom_usage) AS nom, u.prenom
+                   FROM  photo         AS p
+             INNER JOIN  auth_user_md5 AS u ON u.user_id=p.uid
+             INNER JOIN  aliases       AS a ON ( u.user_id=a.id AND a.type='a_vie' )
+             INNER JOIN  groupex.membres AS m ON (m.uid = u.user_id)
+                  $where
+               ORDER BY  promo, u.nom, u.prenom LIMIT {?}, {?}", $offset*$limit, $limit);
+        
+        return array($pnb, $res->fetchAllAssoc());
+    }
+    
     function handler_vcard(&$page, $photos = null)
     {
         global $globals;
@@ -652,6 +708,7 @@ class XnetGrpModule extends PLModule
         global $globals;
 
         new_groupadmin_page('xnet/groupe/membres-add.tpl');
+        $page->addJsLink('ajax.js');
 
         if (is_null($email)) {
             return;
@@ -677,18 +734,70 @@ class XnetGrpModule extends PLModule
             }
         } else {
             if (isvalid_email($email)) {
-                $res = XDB::query('SELECT MAX(uid)+1 FROM groupex.membres');
-                $uid = max(intval($res->fetchOneCell()), 50001);
-                XDB::execute('INSERT INTO  groupex.membres (uid,asso_id,origine,email)
-                                        VALUES({?},{?},"ext",{?})', $uid,
-                                        $globals->asso('id'), $email);
-                pl_redirect("member/$email");
+                if (Env::v('x') && Env::has('userid') && Env::i('userid')) {
+                    $uid = Env::i('userid');
+                    $res = XDB::query("SELECT *
+                                         FROM auth_user_md5
+                                         WHERE user_id = {?} AND perms = 'pending'", $uid);
+                    if ($res->numRows() == 1) {
+                        XDB::execute('INSERT INTO groupex.membres (uid, asso_id, origine, email)
+                                           VALUES ({?}, {?}, "X", {?})',
+                                               $uid, $globals->asso('id'), $email);
+                        if (Env::v('market')) {
+                            $res   = XDB::query('SELECT COUNT(*)
+                                                   FROM register_marketing
+                                                  WHERE uid={?} AND email={?}', $uid, $email);
+                            if (!$res->fetchOneCell()) {
+                                XDB::execute("INSERT INTO  register_marketing (uid,sender,email,date,last,nb,type,hash)
+                                                   VALUES  ({?}, {?}, {?}, NOW(), 0, 0, {?}, '')",
+                                             $uid, S::v('uid'), $email, Env::v('market_from')); 
+                                require_once('validations.inc.php');
+                                $req = new MarkReq(S::v('uid'), $uid, $email, Env::v('market_from') == 'user');
+                                $req->submit();
+                            }            
+                        }
+                        pl_redirect("member/$email");
+                    }
+                    $page->trig("Utilisateur invalide");
+                } else {
+                    $res = XDB::query('SELECT MAX(uid)+1 FROM groupex.membres');
+                    $uid = max(intval($res->fetchOneCell()), 50001);
+                    XDB::execute('INSERT INTO  groupex.membres (uid,asso_id,origine,email)
+                                            VALUES({?},{?},"ext",{?})', $uid,
+                                            $globals->asso('id'), $email);
+                    pl_redirect("member/$email");
+                }
             } else {
                 $page->trig("« <strong>$email</strong> » n'est pas une adresse mail valide");
             }
         }
     }
 
+    function handler_admin_member_new_ajax(&$page)
+    {
+        header('Content-Type: text/html; charset="iso-8859-15"');
+        $page->changeTpl('xnet/groupe/membres-new-search.tpl', NO_SKIN);
+        list($nom, $prenom) = str_replace(array('-', ' ', "'"), '%', array(Env::v('nom'), Env::v('prenom')));
+        $where = "perms = 'pending'";
+        if (!empty($nom)) {
+            $where .= " AND nom LIKE '%$nom%'";
+        }
+        if (!empty($prenom)) {
+            $where .= " AND prenom LIKE '%$prenom%'";
+        }
+        if (preg_match('/^[0-9]{4}$/', Env::v('promo'))) {
+            $where .= " AND promo = " . Env::i('promo');
+        } elseif (Env::has('promo')) {
+            return;
+        }
+        $res = XDB::iterator("SELECT user_id, nom, prenom, promo
+                                FROM auth_user_md5
+                               WHERE $where");
+        if ($res->total() < 30) {
+            $page->assign("choix", $res);
+        }
+    }
+
     function handler_admin_member_del(&$page, $user = null)
     {
         global $globals;
@@ -756,7 +865,7 @@ class XnetGrpModule extends PLModule
                              $globals->asso('mail_domain'));
 
         if (Post::has('change')) {
-            $email_changed = ($user['origine'] != 'X' && $user['email'] != Post::v('email'));
+            $email_changed = ($user['origine'] != 'X' && strtolower($user['email']) != strtolower(Post::v('email')));
             $from_email = $user['email'];
             if ($user['origine'] != 'X') {
                 XDB::query('UPDATE groupex.membres
@@ -813,15 +922,15 @@ class XnetGrpModule extends PLModule
                 if($state == $ask) continue;
                 if($ask) {
                     XDB::query("INSERT INTO  virtual_redirect (vid,redirect)
-                                               SELECT  vid,{?} FROM virtual WHERE alias={?}",
-                                         $user['email'], $ml);
+                                     SELECT  vid,{?} FROM virtual WHERE alias={?}",
+                               $user['email'], $ml);
                     $page->trig("{$user['prenom']} {$user['nom']} a été abonné à $ml");
                 } else {
                     XDB::query("DELETE FROM  virtual_redirect
-                                                USING  virtual_redirect
-                                           INNER JOIN  virtual USING(vid)
-                                                WHERE  redirect={?} AND alias={?}",
-                                         $user['email'], $ml);
+                                      USING  virtual_redirect
+                                 INNER JOIN  virtual USING(vid)
+                                      WHERE  redirect={?} AND alias={?}",
+                               $user['email'], $ml);
                     $page->trig("{$user['prenom']} {$user['nom']} a été désabonné de $ml");
                 }
             }
@@ -894,32 +1003,44 @@ class XnetGrpModule extends PLModule
             $art['event']      = Post::v('event');
 
             $art['contact_html'] = $art['contacts'];
-            if (@$art['event']) {
-                 $art['contact_html'] .= "\n{$globals->baseurl}/{$platal->ns}events/sub/{$art['event']}";
+            if ($art['event']) {
+                $art['contact_html'] .= "\n{$globals->baseurl}/{$platal->ns}events/sub/{$art['event']}";
+            }
+
+            if (!$art['public'] &&
+                ($art['promo_min'] > $art['promo_max'] ||
+                 ($art['promo_min'] != 0 && ($art['promo_min'] <= 1900 || $art['promo_min'] >= 2020)) ||
+                 ($art['promo_max'] != 0 && ($art['promo_max'] <= 1900 || $art['promo_max'] >= 2020))))
+            {
+                $page->trig("L'intervalle de promotions est invalide");
+                Post::kill('valid');
             }
         }
 
         if (Post::v('valid') == 'Enregistrer') {
+            $promo_min = ($art['public'] ? 0 : $art['promo_min']);
+            $promo_max = ($art['public'] ? 0 : $art['promo_max']);
             if (is_null($aid)) {
                 XDB::query("INSERT INTO groupex.announces
                                  (user_id, asso_id, create_date, titre, texte, contacts,
                                    peremption, promo_min, promo_max, flags)
                             VALUES ({?}, {?}, NOW(), {?}, {?}, {?}, {?}, {?}, {?}, {?})",
                            S::i('uid'), $globals->asso('id'), $art['titre'], $art['texte'], $art['contact_html'],
-                           $art['peremption'], $art['promo_min'], $art['promo_max'], $art['public'] ? 'public' : '');
-                $aid = mysql_insert_id();
+                           $art['peremption'], $promo_min, $promo_max, $art['public'] ? 'public' : '');
+                $aid = XDB::insertId();
                 if ($art['xorg']) {
                     require_once('validations.inc.php');
                     require_once('url_catcher.inc.php');
-                    $article = new EvtReq($art['titre'],
-                                    url_catcher($art['texte'] . (!empty($art['contacts']) ? "\n\nContacts :\n" . $art['contacts'] : "")),
+                    $article = new EvtReq("[{$globals->asso('nom')}] " . $art['titre'],
+                                    url_catcher($art['texte'] . (!empty($art['contact_html']) ? "\n\nContacts :\n" . $art['contact_html'] : "")),
                                     $art['promo_min'], $art['promo_max'], $art['peremption'], "", S::v('uid'));
                     $article->submit();
                     $page->trig("L'affichage sur la page d'accueil de Polytechnique.org est en attente de validation");
                 }
                 if ($art['nl']) {
                     require_once('validations.inc.php');
-                    $article = new NLReq(S::v('uid'), $art['titre'], $art['texte'], $art['contact_html']);
+                    $article = new NLReq(S::v('uid'), $globals->asso('nom') . " : " .$art['titre'],
+                                         $art['texte'], $art['contact_html']);
                     $article->submit();
                     $page->trig("La parution dans la Lettre Mensuelle est en attente de validation");
                 }
@@ -929,9 +1050,11 @@ class XnetGrpModule extends PLModule
                                    promo_min={?}, promo_max={?}, flags={?}
                              WHERE id={?} AND asso_id={?}",
                            $art['titre'], $art['texte'], $art['contacts'], $art['peremption'],
-                           $art['promo_min'], $art['promo_max'],  $art['public'] ? 'public' : '',
+                           $promo_min, $promo_max,  $art['public'] ? 'public' : '',
                            $art['id'], $globals->asso('id'));
             }
+        }
+        if (Post::v('valid') == 'Enregistrer' || Post::v('valid') == 'Annuler') {
             pl_redirect("");
         }