Xnet group's directory rewritten (kill a lot of code).
authorFlorent Bruneau <florent.bruneau@polytechnique.org>
Sun, 1 Feb 2009 15:02:29 +0000 (16:02 +0100)
committerFlorent Bruneau <florent.bruneau@polytechnique.org>
Sun, 1 Feb 2009 15:02:29 +0000 (16:02 +0100)
Signed-off-by: Florent Bruneau <florent.bruneau@polytechnique.org>
classes/user.php
modules/xnetgrp.php
templates/xnetgrp/annuaire.tpl

index bd466b4..0e28f2c 100644 (file)
@@ -139,7 +139,7 @@ class User extends PlUser
         throw new UserNotFoundException($res->fetchColumn(1));
     }
 
-    protected static function loadMainFieldsFromUIDs(array $uids, $sorted = null)
+    protected static function loadMainFieldsFromUIDs(array $uids, $sorted = null, $count = null, $offset = null)
     {
         global $globals;
         $joins = '';
@@ -151,8 +151,10 @@ class User extends PlUser
             $with_pd = false;
             foreach (explode(',', $sorted) as $part) {
                 $desc = ($part[0] == '-');
+                echo $part . '=' . $desc;
                 if ($desc) {
-                    $part = substr($desc, 1);
+                    $part = substr($part, 1);
+                    echo $part;
                 }
                 switch ($part) {
                   case 'promo':
@@ -166,6 +168,11 @@ class User extends PlUser
                   case 'display_name':
                     $part = 'a.display_name';
                     break;
+                  case 'directory_name':
+                    $part = 'pd.directory_name';
+                    $with_pd = true;
+                    $with_ap = true;
+                    break;
                   default:
                     $part = null;
                 }
@@ -196,6 +203,14 @@ class User extends PlUser
         } else {
             $fields = '';
         }
+        $limit = '';
+        if (!is_null($count)) {
+            if (!is_null($offset)) {
+                $limit = ' LIMIT ' . $offset . ', ' . $count;
+            } else {
+                $limit = ' LIMIT ' . $count;
+            }
+        }
         $uids = array_map(array('XDB', 'escape'), $uids);
         return XDB::iterator('SELECT  a.uid, a.hruid, a.registration_date,
                                       CONCAT(af.alias, \'@' . $globals->mail->domain . '\') AS forlife,
@@ -212,7 +227,7 @@ class User extends PlUser
                            LEFT JOIN  aliases AS ab ON (ab.id = a.uid AND FIND_IN_SET(\'bestalias\', ab.flags))
                            ' . $joins . '
                                WHERE  a.uid IN (' . implode(', ', $uids) . ')
-                               ' . $orderby);
+                               ' . $orderby . $limit);
     }
 
     // Implementation of the data loader.
@@ -435,9 +450,9 @@ class User extends PlUser
     }
 
     // Fetch a set of users from a list of UIDs
-    public static function getBuildUsersWithUIDs(array $uids, $sortby = null)
+    public static function getBuildUsersWithUIDs(array $uids, $sortby = null, $count = null, $offset = null)
     {
-        $fields = self::loadMainFieldsFromUIDs($uids, $sortby);
+        $fields = self::loadMainFieldsFromUIDs($uids, $sortby, $count, $offset);
         $users = array();
         while (($list = $fields->next())) {
             $users[] = User::getSilentWithValues(null, $list);
index 53d5c0f..e72013c 100644 (file)
@@ -326,103 +326,24 @@ class XnetGrpModule extends PLModule
         }
         $page->changeTpl('xnetgrp/annuaire.tpl');
 
-        $sort = Env::v('order');
-        switch (Env::v('order')) {
-            case 'promo'    : $group = 'promo';    $tri = 'promo_o DESC, nom, prenom'; break;
-            case 'promo_inv': $group = 'promo';    $tri = 'promo_o, nom, prenom'; break;
-            case 'alpha_inv': $group = 'initiale'; $tri = 'nom DESC, prenom DESC, promo'; break;
-            default         : $group = 'initiale'; $tri = 'nom, prenom, promo'; $sort = 'alpha';
-        }
-        $page->assign('sort', $sort);
-
-        if ($group == 'initiale') {
-            $res = XDB::iterRow(
-                        'SELECT  UPPER(SUBSTRING(
-                                    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)
-                          WHERE  asso_id = {?} and (u.perms != \'pending\' OR m.email IS NOT NULL)
-                       GROUP BY  letter
-                       ORDER BY  letter', $globals->asso('id'));
-        } else {
-            $res = XDB::iterRow(
-                        'SELECT  IF(m.origine="X",u.promo,
-                                    IF(m.origine="ext", "extérieur", "personne morale")) AS promo,
-                                 COUNT(*), IF(m.origine="X",u.promo,"") AS promo_o
-                           FROM  groupex.membres AS m
-                      LEFT JOIN  auth_user_md5   AS u ON ( u.user_id = m.uid )
-                          WHERE  asso_id = {?}
-                       GROUP BY  promo
-                       ORDER BY  promo_o DESC', $globals->asso('id'));
-        }
-        $alphabet = array();
-        $nb_tot = 0;
-        while (list($char, $nb) = $res->next()) {
-            $alphabet[] = $char;
-            $nb_tot += $nb;
-            if (Env::has($group) && $char == strtoupper(Env::v($group))) {
-                $tot = $nb;
-            }
-        }
-        $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);
-
-        $ofs   = Env::i('offset');
-        $tot   = Env::v($group) ? $tot : $nb_tot;
-        $nbp   = intval(($tot-1)/NB_PER_PAGE);
-        $links = array();
-        if ($ofs) {
-            $links['précédent'] = $ofs-1;
-        }
-        for ($i = 0; $i <= $nbp; $i++) {
-            $links[(string)($i+1)] = $i;
-        }
-        if ($ofs < $nbp) {
-            $links['suivant'] = $ofs+1;
-        }
-        if (count($links)>1) {
-            $page->assign('links', $links);
-        }
+        $sort = Env::s('order', 'directory_name');
 
-        $ini = '';
-        if (Env::has('initiale')) {
-            $ini = 'AND IF(m.origine="X",
-                           IF(u.nom_usage<>"", u.nom_usage, u.nom),
-                           m.nom) LIKE "'.addslashes(Env::v('initiale')).'%"';
-        } elseif (Env::has('promo')) {
-            $ini = 'AND IF(m.origine="X", u.promo, IF(m.origine="ext", "extérieur", "personne morale")) = "'
-                 .addslashes(Env::v('promo')).'"';
-        } elseif (Env::has('admin')) {
-            $ini = 'AND m.perms = "admin"';
+        if (Env::b('admin')) {
+            $uids = XDB::fetchColumn('SELECT  uid
+                                        FROM  groupex.membres
+                                       WHERE  asso_id = {?} AND perms = \'admin\'',
+                                     $globals->asso('id'));
+        } else {
+            $uids = XDB::fetchColumn('SELECT  uid
+                                        FROM  groupex.membres
+                                       WHERE  asso_id = {?}', $globals->asso('id'));
         }
-
-        $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, IF(m.origine='ext', 'extérieur', 'personne morale')) AS promo,
-                           IF(m.origine='X',u.promo,'') AS promo_o,
-                           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.comm as comm,
-                           m.uid, IF(e.email IS NULL AND FIND_IN_SET('googleapps', u.mail_storage) = 0, NULL, 1) AS actif
-                     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' )
-                LEFT JOIN  emails          AS e ON ( e.flags = 'active' AND e.uid = m.uid)
-                    WHERE  m.asso_id = {?} $ini
-                           AND (m.origine != 'X' OR u.perms != 'pending' OR m.email IS NOT NULL)
-                 GROUP BY  m.uid
-                 ORDER BY  $tri
-                    LIMIT  {?},{?}", $globals->asso('id'), $ofs*NB_PER_PAGE, NB_PER_PAGE);
-        $page->assign('ann', $ann);
-        $page->jsonAssign('ann', $ann);
+        $users = User::getBuildUsersWithUIDs($uids, $sort,
+                                             NB_PER_PAGE, $ofs * NB_PER_PAGE);
+        $page->assign('pages', (count($uids) + NB_PER_PAGE - 1) / NB_PER_PAGE);
+        $page->assign('order', $sort);
+        $page->assign('users', $users);
+        $page->assign('only_admin', Env::b('admin'));
     }
 
     function handler_trombi(&$page)
index d462aa5..8706e5f 100644 (file)
@@ -61,35 +61,38 @@ Le groupe {$asso.nom} compte {$nb_tot} membres&nbsp;:
 {else}
 
 <p class="center">
-[<a href="{$platal->ns}annuaire?order={$smarty.request.order}" {if !$only_admin}class="erreur"{/if}>tous les membres</a>]
-[<a href="{$platal->ns}annuaire?order={$smarty.request.order}&amp;admin=1" {if $only_admin}class="erreur"{/if}>animateurs</a>]<br/>
+[<a href="{$platal->ns}annuaire?order={$order}" {if !$only_admin}class="erreur"{/if}>tous les membres</a>]
+[<a href="{$platal->ns}annuaire?order={$order}&amp;admin=1" {if $only_admin}class="erreur"{/if}>animateurs</a>]<br/>
+{*
+ XXX: This code has been temporary dropped, waiting for a cleaner way to do that stuff
 {foreach from=$alphabet item=c}
 {if $c}
-[<a href="{$platal->ns}annuaire?{$group}={$c}&amp;order={$smarty.request.order}{if $only_admin}&amp;admin=1{/if}"{if $request_group eq $c} class="erreur"{/if}>{$c}</a>]
+[<a href="{$platal->ns}annuaire?order={$order}&amp;admin={$only_admin}"{if $request_group eq $c} class="erreur"{/if}>{$c}</a>]
 {/if}
 {/foreach}
+*}
 </p>
 
 <table summary="membres du groupe" class="bicol">
   <tr>
     <th>
-      <a href="{$platal->ns}annuaire?order=alpha{if $sort neq "alpha_inv"}_inv{/if}{if $request_group and $group eq 'initiale'}&amp;initiale={$request_group}{/if}{if $only_admin}&amp;admin=1{/if}">
-      {if $sort eq 'alpha'}
+      <a href="{$platal->ns}annuaire?order={if $order eq 'directory_name'}-{/if}directory_name&amp;admin={$only_admin}">
+      {if $order eq 'directory_name'}
         <img src="{$platal->baseurl}images/dn.png" alt="" title="Tri croissant" />
-      {elseif $sort eq 'alpha_inv'}
+      {elseif $order eq '-directory_name'}
         <img src="{$platal->baseurl}images/up.png" alt="" title="Tri décroissant" />
       {/if}
-      Prénom NOM 
+      Prénom NOM
       </a>
     </th>
     <th>
-      <a href="{$platal->ns}annuaire?order=promo{if $sort eq "promo"}_inv{/if}{if $request_group and $group eq 'promo'}&amp;promo={$request_group}{/if}">
-      {if $sort eq 'promo_inv'}
+      <a href="{$platal->ns}annuaire?order={if $order eq 'promo'}-{/if}promo&amp;admin={$only_admin}">
+      {if $order eq '-promo'}
         <img src="{$platal->baseurl}images/dn.png" alt="" title="Tri croissant" />
-      {elseif $sort eq 'promo'}
+      {elseif $order eq 'promo'}
         <img src="{$platal->baseurl}images/up.png" alt="" title="Tri décroissant" />
       {/if}
-        Promo
+      Promo
       </a>
     </th>
     <th colspan="2">Infos</th>
@@ -97,42 +100,30 @@ Le groupe {$asso.nom} compte {$nb_tot} membres&nbsp;:
     <th>Actions</th>
     {/if}
   </tr>
-  {iterate from=$ann item=m}
+  {foreach from=$users item=user}
   <tr>
     <td>
-      {if $m.admin}<strong>{/if}
-      {if $m.inscrit}
-      <a href="https://www.polytechnique.org/profile/{$m.email}" class="popup2">
-      {elseif $m.x}
-      <a href="https://www.polytechnique.org/marketing/public/{$m.uid}">
-      {/if}
-      {if $m.femme}&bull;{/if}{if $m.prenom || $m.nom}{$m.prenom} {$m.nom|strtoupper}{else}{$m.email}{/if}
-      {if $m.x}</a>{/if} 
-      {if $m.admin}</strong>{/if}
-      {if $m.inscrit && !$m.actif}
-      <a href="https://www.polytechnique.org/marketing/broken/{$m.email}">{icon name=error title="Recherche d'email"}</a>
-      {assign var=broken value=true}
-      {/if}</td>
-    <td>{if $m.admin}<strong>{/if}{$m.promo}{if $m.admin}</strong>{/if}</td>
-    {if $m.comm}
-    <td>{$m.comm}</td>
+      {profile user=$user promo=false}
+    <td>
+      {if $user->group_perms eq 'admin'}<strong>{/if}
+      {$user->promo()}
+      {if $user->group_perms eq 'admin'}</strong>{/if}
+    </td>
+    {if $user->group_comm}
+    <td>{$user->group_comm}</td>
     {/if}
-    <td class="right" {if !$m.comm}colspan="2"{/if}>
-      {if $m.inscrit}
+    <td class="right" {if !$m->group_comm}colspan="2"{/if}>
       <a href="https://www.polytechnique.org/vcard/{$m.email}.vcf">{icon name=vcard title="[vcard]"}</a>
       <a href="mailto:{$m.email}@polytechnique.org">{icon name=email title="email"}</a>
-      {else}
-      <a href="mailto:{$m.email}">{icon name=email title="email"}</a>
-      {/if}
     </td>
     {if $is_admin}
     <td class="center">
-      <a href="{$platal->ns}member/{if $m.x}{$m.email}{else}{$m.uid}{/if}">{icon name=user_edit title="Edition du profil"}</a>
-      <a href="{$platal->ns}member/del/{if $m.x}{$m.email}{else}{$m.uid}{/if}">{icon name=delete title="Supprimer de l'annuaire"}</a>
+      <a href="{$platal->ns}member/{$user->login()}">{icon name=user_edit title="Edition du profil"}</a>
+      <a href="{$platal->ns}member/del/{$user->login()}">{icon name=delete title="Supprimer de l'annuaire"}</a>
     </td>
     {/if}
   </tr>
-  {/iterate}
+  {/foreach}
 </table>
 
 <p class="descr" style="text-align: center">