No more auth_user_ in lists and xnetlists.
authorFlorent Bruneau <florent.bruneau@polytechnique.org>
Thu, 8 Jan 2009 22:57:59 +0000 (23:57 +0100)
committerFlorent Bruneau <florent.bruneau@polytechnique.org>
Thu, 8 Jan 2009 22:57:59 +0000 (23:57 +0100)
Add email in account table.

TODO: have function to build a fetch data for a batch of users
   eg: User::getUsersFromEmails(array $emails, $prefill = true, $sortby = null),
       User::getUsersFromUIDs(array $uids, $prefill = true, $sortby = null)
Would be very cool to reduce the number of SQL queries.

Signed-off-by: Florent Bruneau <florent.bruneau@polytechnique.org>
classes/user.php
modules/lists/lists.inc.php
modules/xnetlists.php
templates/xnetlists/alias-admin.tpl
templates/xnetlists/sync.tpl
upgrade/account/00_account.sql
upgrade/account/99_insertion.sql

index 7461573..616b11e 100644 (file)
@@ -115,6 +115,14 @@ class User extends PlUser
             throw new UserNotFoundException();
         }
 
+        // Looks for an account with the given email.
+        $res = XDB::query('SELECT  a.uid
+                             FROM  accounts AS a
+                            WHERE  a.email = {?}', $login);
+        if ($res->numRows() == 1) {
+            return $res->fetchOneCell();
+        }
+
         // Otherwise, we do suppose $login is an email redirection.
         $res = XDB::query("SELECT  a.uid
                              FROM  accounts AS a
index 2e60c61..30e1994 100644 (file)
 
 // {{{ function list_sort_owners
 
-function list_sort_owners(&$members, $tri_promo = true) {
+function list_sort_owners(&$members, $tri_promo = true)
+{
     global $globals;
 
     $membres = Array();
 
     foreach($members as $mem) {
-        list($m, $dom) = explode('@', $mem);
-        $info = list_fetch_name($mem);
-        if (!isset($info['uid']) || is_null($info['uid'])) {
+        $user = User::getSilent($mem);
+        if (!$user) {
             $membres[0][] = array('l' => $mem, 'p' => (!$tri_promo ? 'inconnue' : null));
         } else {
-            $uid = $info['uid'];
-            $nom = $info['nom'];
-            $prenom = $info['prenom'];
-            $promo = $info['promo'];
-            $broken = $info['lost'];
+            $uid = $user->id();
+            $nom = $user->fullName(); # XXX: Get a notion of 'last name' here, I want to sort user by lastnames
+            $promo = $user->promo();
+            if (!$promo) {
+                $promo = 'non-X';
+            }
+            $broken = false; # XXX: fill it with the good value if the user has no valid email
             $key = $tri_promo ? ($promo != 'non-X' ? $promo : 0) : strtoupper(@$nom{0});
             if ($tri_promo) {
                 $promo = null;
             }
-            $membres[$key][$nom.$m] = Array('n' => "$prenom $nom", 'l' => $m, 'p' => $promo, 'x' => $uid, 'b' => $broken);
+            $membres[$key][$nom.$m] = Array('n' => $nom, 'l' => $m, 'p' => $promo, 'x' => $uid, 'b' => $broken);
         }
     }
 
@@ -73,44 +75,17 @@ function list_sort_members($members, $tri_promo = true)
 }
 
 // }}}
-// {{{ function list_fetch_names
-
-function list_fetch_name($member)
-{
-    global $globals;
-    list($m, $dom) = explode('@', $member);
-    if ($dom == $globals->mail->domain || $dom == $globals->mail->domain2) {
-        $res = XDB::query('SELECT  u.user_id AS uid, prenom AS prenom, IF(nom_usage="", nom, nom_usage) AS nom,
-                                   promo AS promo,
-                                   (e.uid IS NULL AND FIND_IN_SET("googleapps", u.mail_storage) = 0) AS lost
-                             FROM  auth_user_md5 AS u
-                       INNER JOIN  aliases AS a ON u.user_id = a.id
-                        LEFT JOIN  emails AS e ON (e.flags = "active" AND e.uid = u.user_id)
-                            WHERE  a.alias = {?}
-                         GROUP BY  u.user_id', $m);
-    } else {
-        $res = XDB::query('SELECT m2.uid AS uid,
-                                  IF(m2.origine="X", u.prenom, m1.prenom) AS prenom,
-                                  IF(m2.origine="X", u.nom, m1.nom) AS nom,
-                                  IF(m2.origine="X", u.promo, "non-X") AS promo,
-                                  0 AS lost
-                             FROM groupex.membres AS m1
-                        LEFT JOIN groupex.membres AS m2 ON(m1.email=m2.email AND m2.asso_id={?})
-                        LEFT JOIN auth_user_md5   AS u  ON(m2.origine = "X" AND m2.uid = u.user_id)
-                            WHERE m1.email={?}', $globals->asso('id'), $member);
-    }
-    if ($res->numRows() == 0) {
-        return array('email' => $member);
-    } else {
-        return array_merge(array('email' => $member), $res->fetchOneAssoc());
-    }
-}
 
 function list_fetch_names($members)
 {
     $res = array();
     foreach ($members as $member) {
-        $res[] = list_fetch_name($member);
+        $user = User::getSilent($member);
+        if (!$user) {
+            $res[] = $member;
+        } else {
+            $res[] = $user->fullName();
+        }
     }
     return $res;
 }
index 4f6dcb2..45c0b35 100644 (file)
@@ -207,25 +207,15 @@ class XnetListsModule extends ListsModule
         $not_in_group_x = array();
         $not_in_group_ext = array();
 
-        $ann = XDB::iterator(
-                  "SELECT  if (m.origine='X',if (u.nom_usage<>'', u.nom_usage, u.nom) ,m.nom) AS nom,
-                           if (m.origine='X',u.prenom,m.prenom) AS prenom,
-                           if (m.origine='X',u.promo,'extérieur') AS promo,
-                           if (m.origine='X',CONCAT(a.alias, '@{$globals->mail->domain}'),m.email) AS email,
-                           if (m.origine='X',FIND_IN_SET('femme', u.flags),0) AS femme,
-                           m.perms='admin' AS admin,
-                           m.origine='X' AS x
-                     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 = {?}
-                 ORDER BY  promo, nom, prenom", $globals->asso('id'));
+        $ann = XDB::iterator('SELECT  uid
+                                FROM  groupex.membres
+                               WHERE  asso_id = {?}', $globals->asso('id'));
 
         $not_in_list = array();
-
         while ($tmp = $ann->next()) {
-            if (!in_array(strtolower($tmp['email']), $subscribers)) {
-                $not_in_list[] = $tmp;
+            $user = User::getWithUID($tmp['uid']);
+            if (!in_array(strtolower($user->forlifeEmail()), $subscribers)) {
+                $not_in_list[] = $user;
             }
         }
 
@@ -289,23 +279,21 @@ class XnetListsModule extends ListsModule
         }
 
         global $globals;
-        $res = XDB::iterator("SELECT  IF(r.login IS NULL, m.nom, IF(u.nom_usage != '', u.nom_usage, u.nom)) AS nom,
-                                      IF(r.login IS NULL, m.prenom, u.prenom) AS prenom,
-                                      IF(r.login IS NULL, 'extérieur', u.promo) AS promo,
-                                      m.perms = 'admin' AS admin, r.redirect, r.login AS alias
-                                FROM  (SELECT  redirect AS redirect,
-                                               IF(SUBSTRING_INDEX(redirect, '@', -1) IN ({?}, {?}),
-                                                  SUBSTRING_INDEX(redirect, '@', 1), NULL) AS login
-                                         FROM  x4dat.virtual_redirect AS vr
-                                   INNER JOIN  x4dat.virtual          AS v  USING(vid)
-                                        WHERE  v.alias = {?}
-                                     ORDER BY  redirect) AS r
-                           LEFT JOIN  aliases AS a ON (r.login IS NOT NULL AND r.login = a.alias)
-                           LEFT JOIN  auth_user_md5 AS u ON (u.user_id = a.id)
-                           LEFT JOIN groupex.membres AS m ON (m.asso_id = {?} AND IF(r.login IS NULL, m.email = r.redirect, m.uid = u.user_id))",
-                $globals->mail->domain, $globals->mail->domain2,
-                $lfull, $globals->asso('id'));
-        $page->assign('mem', $res);
+        $emails = XDB::fetchColumn('SELECT  redirect
+                                      FROM  virtual_redirect AS vr
+                                INNER JOIN  virtual          AS v  USING(vid)
+                                     WHERE  v.alias = {?}
+                                  ORDER BY  redirect', $lfull);
+        $mem = array();
+        foreach ($emails as $email) {
+            $user = User::getSilent($email);
+            if ($user) {
+                $mem[] = array('user' => $user, 'email' => $email);
+            } else {
+                $mem[] = array('email' => $email);
+            }
+        }
+        $page->assign('mem', $mem);
     }
 
     function handler_acreate(&$page)
index 91ddf3e..1c8f7b2 100644 (file)
 <h1>Membres de {$platal->argv[1]}</h1>
       
 <table class='tinybicol'>
-  {if $mem->total()}
-  {iterate from=$mem item=m}
+  {if $mem|@count}
+  {foreach from=$mem item=m}
   <tr>
     <td>
-      {if $m.nom}
+      {if $m.user}
       {if $m.admin}<strong>{/if}
-      {if $m.alias}<a href="https://www.polytechnique.org/profile/{$m.alias}" class="popup2">{/if}
-      {$m.prenom} {$m.nom}
-      {if $m.alias}</a>{/if}
+      <a href="https://www.polytechnique.org/profile/{$m.user->login()}" class="popup2">{$m.user->fullName()}</a>
       {if $m.admin}</strong>{/if}
       {else}
-      {$m.redirect}
+      {$m.email}
       {/if}
     </td>
     <td class="right">
+      {if $m.user}
       {if $m.admin}<strong>{/if}
-      {$m.promo}
+      {$m.user->promo()}
       {if $m.admin}</strong>{/if}
+      {/if}
     </td>
     <td class="center">
-      <a href='{$platal->ns}alias/admin/{$platal->argv[1]}?del_member={$m.redirect|urlencode}&amp;token={xsrf_token}'>
+      <a href='{$platal->ns}alias/admin/{$platal->argv[1]}?del_member={$m.email|urlencode}&amp;token={xsrf_token}'>
       {icon name=delete title='retirer membre'}
       </a>
     </td>
   </tr>
-  {/iterate}
+  {/foreach}
   {else}
   <tr>
     <td colspan="3">
index 5916750..3ba7b99 100644 (file)
@@ -34,9 +34,9 @@
     </tr>
     {foreach from=$not_in_list item=u}
     <tr>
-      <td class='checkboxToggle'>{$u.nom|strtoupper} {$u.prenom}</td>
-      <td class='checkboxToggle'>{$u.promo}</td>
-      <td class='checkboxToggle'><input type="checkbox" class="moderate_email" name="add[{$u.email}]" id="add{$u.email}"/></td>
+      <td class='checkboxToggle'>{$u->fullName()}</td>
+      <td class='checkboxToggle'>{$u->promo()}</td>
+      <td class='checkboxToggle'><input type="checkbox" class="moderate_email" name="add[{$u->forlifeEmail()}]" id="add{$u->forlifeEmail()}"/></td>
     </tr>
     {/foreach}
     <tr>
index cc19b83..e8523d3 100644 (file)
@@ -19,6 +19,7 @@ CREATE TABLE accounts (
   comment varchar(255) default null,
 
   # User settings
+  email varchar(255) default null,
   full_name varchar(255) default null,
   display_name varchar(255) default null,
   sex enum('female', 'male') not null default 'male',
index bb9961e..73e0216 100644 (file)
@@ -1,6 +1,8 @@
 # Create a type 'X' with all permissions
 insert into account_types
-     values ('x', 'mail,groups,forums,list,search,portal');
+     values ('x', 'mail,groups,forums,list,search,portal'),
+            ('xnet', 'groups');
+
 
 # Insert all existing accounts
 insert into accounts
@@ -13,6 +15,7 @@ insert into accounts
             date_ins AS registration_date,
             IF(FIND_IN_SET('watch', flags), 'watch', '') AS flags,
             IF(LENGTH(comment) > 0, comment, NULL) AS comment,
+            NULL as email,
             CONCAT(prenom, ' ', IF (nom_usage != '' and nom_usage IS NOT NULL, nom_usage, nom)) AS full_name,
             prenom AS display_name,
             IF(FIND_IN_SET('femme', flags), 'female', 'male') AS sex,