Use the 'groups' perm instead of 'user' on X.net
[platal.git] / modules / xnetlists.php
index a502f02..c0eaa38 100644 (file)
@@ -28,26 +28,26 @@ class XnetListsModule extends ListsModule
     function handlers()
     {
         return array(
-            '%grp/lists'              => $this->make_hook('lists',    AUTH_MDP, 'groupmember'),
-            '%grp/lists/create'       => $this->make_hook('create',   AUTH_MDP, 'groupmember'),
+            '%grp/lists'              => $this->make_hook('lists',    AUTH_MDP,    'groupmember'),
+            '%grp/lists/create'       => $this->make_hook('create',   AUTH_MDP,    'groupmember'),
 
-            '%grp/lists/members'      => $this->make_hook('members',  AUTH_COOKIE),
-            '%grp/lists/csv'          => $this->make_hook('csv',      AUTH_COOKIE),
-            '%grp/lists/annu'         => $this->make_hook('annu',     AUTH_COOKIE),
-            '%grp/lists/archives'     => $this->make_hook('archives', AUTH_COOKIE),
+            '%grp/lists/members'      => $this->make_hook('members',  AUTH_COOKIE, 'groups'),
+            '%grp/lists/csv'          => $this->make_hook('csv',      AUTH_COOKIE, 'groups'),
+            '%grp/lists/annu'         => $this->make_hook('annu',     AUTH_COOKIE, 'groups'),
+            '%grp/lists/archives'     => $this->make_hook('archives', AUTH_COOKIE, 'groups'),
             '%grp/lists/archives/rss' => $this->make_hook('rss',      AUTH_PUBLIC),
 
-            '%grp/lists/moderate'     => $this->make_hook('moderate', AUTH_MDP),
-            '%grp/lists/admin'        => $this->make_hook('admin',    AUTH_MDP),
-            '%grp/lists/options'      => $this->make_hook('options',  AUTH_MDP),
-            '%grp/lists/delete'       => $this->make_hook('delete',   AUTH_MDP),
+            '%grp/lists/moderate'     => $this->make_hook('moderate', AUTH_MDP,    'groups'),
+            '%grp/lists/admin'        => $this->make_hook('admin',    AUTH_MDP,    'groups'),
+            '%grp/lists/options'      => $this->make_hook('options',  AUTH_MDP,    'groups'),
+            '%grp/lists/delete'       => $this->make_hook('delete',   AUTH_MDP,    'groups'),
 
-            '%grp/lists/soptions'     => $this->make_hook('soptions', AUTH_MDP),
-            '%grp/lists/check'        => $this->make_hook('check',    AUTH_MDP),
-            '%grp/lists/sync'         => $this->make_hook('sync',     AUTH_MDP),
+            '%grp/lists/soptions'     => $this->make_hook('soptions', AUTH_MDP,    'groups'),
+            '%grp/lists/check'        => $this->make_hook('check',    AUTH_MDP,    'groups'),
+            '%grp/lists/sync'         => $this->make_hook('sync',     AUTH_MDP,    'groups'),
 
-            '%grp/alias/admin'        => $this->make_hook('aadmin',   AUTH_MDP, 'groupadmin'),
-            '%grp/alias/create'       => $this->make_hook('acreate',  AUTH_MDP, 'groupadmin'),
+            '%grp/alias/admin'        => $this->make_hook('aadmin',   AUTH_MDP,    'groupadmin'),
+            '%grp/alias/create'       => $this->make_hook('acreate',  AUTH_MDP,    'groupadmin'),
 
             /* hack: lists uses that */
             'profile'                 => $this->make_hook('profile',  AUTH_PUBLIC),
@@ -70,7 +70,7 @@ class XnetListsModule extends ListsModule
         return $globals->asso('mail_domain');
     }
 
-    function handler_lists($page)
+    function handler_lists($page, $order_by = null, $order = null)
     {
         global $globals;
         require_once 'emails.inc.php';
@@ -102,9 +102,44 @@ class XnetListsModule extends ListsModule
         }
 
         $listes = $this->client->get_lists();
+        // Default ordering is by ascending names.
+        if (is_null($order_by) || is_null($order)
+            || !in_array($order_by, array('list', 'desc', 'nbsub'))
+            || !in_array($order, array('asc', 'desc'))) {
+            $order_by = 'list';
+            $order = 'asc';
+        }
+
+        $compare = function ($a, $b) use ($order_by, $order)
+        {
+            switch ($order_by) {
+              case 'desc':
+                $a[$order_by] = replace_accent($a[$order_by]);
+                $b[$order_by] = replace_accent($b[$order_by]);
+              case 'list':
+                $res = strcasecmp($a[$order_by], $b[$order_by]);
+                break;
+              case 'nbsub':
+                $res = $a[$order_by] - $b[$order_by];
+                break;
+              default:
+                $res = 0;
+            }
+
+            if ($order == 'asc') {
+                return $res;
+            }
+            return $res * -1;
+        };
+        usort($listes, $compare);
         $page->assign('listes', $listes);
+        $page->assign('order_by', $order_by);
+        $page->assign('order', $order);
         $page->assign('aliases', iterate_list_alias($globals->asso('mail_domain')));
         $page->assign('may_update', may_update());
+        if (S::suid()) {
+            $page->trigWarning("Attention : l'affichage des listes de diffusion ne tient pas compte de l'option « Voir le site comme… ».");
+        }
 
         if (count($listes) > 0 && !$globals->asso('has_ml')) {
             XDB::execute("UPDATE  groups