From b73bc04bb05253b8391b40778715d48e337f3628 Mon Sep 17 00:00:00 2001 From: Florent Bruneau Date: Fri, 14 Nov 2008 22:36:19 +0100 Subject: [PATCH] Export the members of a list as a CSV file (Closes #927) Signed-off-by: Florent Bruneau --- ChangeLog | 3 ++ modules/lists.php | 20 +++++++++ modules/lists/lists.inc.php | 107 +++++++++++++++++++++++++++++--------------- templates/lists/members.tpl | 12 +++++ 4 files changed, 107 insertions(+), 35 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0e46e88..05b5bb4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -29,6 +29,9 @@ Bug/Wish: - #791: Adds the possibility to do an exact search -JAC - #822: Adds the possibility to search on diplomas -JAC + * Lists: + - #927: Can export the list of members as a CSV file -FRU + * XnetList: - #914: Adds a toggle button in the ML/directory sync. page -JAC diff --git a/modules/lists.php b/modules/lists.php index 78fba96..115c7c4 100644 --- a/modules/lists.php +++ b/modules/lists.php @@ -31,6 +31,7 @@ class ListsModule extends PLModule 'lists/create' => $this->make_hook('create', AUTH_MDP), 'lists/members' => $this->make_hook('members', AUTH_COOKIE), + 'lists/csv' => $this->make_hook('csv', AUTH_COOKIE), 'lists/annu' => $this->make_hook('annu', AUTH_COOKIE), 'lists/archives' => $this->make_hook('archives', AUTH_COOKIE), 'lists/archives/rss' => $this->make_hook('rss', AUTH_PUBLIC, 'user', NO_HTTPS), @@ -337,6 +338,25 @@ class ListsModule extends PLModule } } + function handler_csv(PlPage &$page, $liste = null) + { + if (is_null($liste)) { + return PL_NOT_FOUND; + } + $this->prepare_client($page); + $members = $this->client->get_members($liste); + $list = list_fetch_names(list_extract_members($members[1])); + header('Content-Type: text/x-csv; charset=utf-8;'); + header('Pragma: '); + header('Cache-Control: '); + + echo "email,nom,prenom,promo\n"; + foreach ($list as $member) { + echo @$member['email'] . ',' . @$member['nom'] . ',' . @$member['prenom'] . ',' . @$member['promo'] . "\n"; + } + exit; + } + function handler_annu(&$page, $liste = null, $action = null, $subaction = null) { if (is_null($liste)) { diff --git a/modules/lists/lists.inc.php b/modules/lists/lists.inc.php index 2fcb84e..05119da 100644 --- a/modules/lists/lists.inc.php +++ b/modules/lists/lists.inc.php @@ -27,40 +27,21 @@ function list_sort_owners(&$members, $tri_promo = true) { $membres = Array(); foreach($members as $mem) { - list($m, $dom) = explode('@',$mem); - if ($dom == $globals->mail->domain || $dom == $globals->mail->domain2) { - $res = XDB::query('SELECT prenom, IF(nom_usage="", nom, nom_usage), promo, - (e.uid IS NULL AND FIND_IN_SET("googleapps", u.mail_storage) = 0) - 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); - if(list($prenom, $nom, $promo, $broken) = $res->fetchOneRow()) { - $key = $tri_promo ? $promo : strtoupper($nom{0}); - $membres[$key][$nom.$m] = Array('n' => "$prenom $nom", 'l' => $m, 'p' => (!$tri_promo ? $promo : null), 'b' => $broken); - } else { - $membres[0][] = Array('l' => $mem, 'b' => $broken); - } + list($m, $dom) = explode('@', $mem); + $info = list_fetch_name($mem); + if (is_null($info['uid'])) { + $membres[0][] = array('l' => $mem, 'p' => (!$tri_promo ? 'inconnue' : null)); } else { - $res = XDB::query('SELECT m2.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 - 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'), $mem); - if (list($uid, $prenom, $nom, $promo) = $res->fetchOneRow()) { - $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' => $mem, 'x' => $uid, 'p' => $promo); - } else { - $membres[0][] = Array('l' => $mem, 'p' => (!$tri_promo ? 'non-X' : null)); + $uid = $info['uid']; + $nom = $info['nom']; + $prenom = $info['prenom']; + $promo = $info['promo']; + $broken = $info['lost']; + $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); } } @@ -70,11 +51,67 @@ function list_sort_owners(&$members, $tri_promo = true) { } // }}} +// {{{ list_extract_member + +function _list_extract_member($member) +{ + return $member[1]; +} + +function list_extract_members($members) +{ + return array_map('_list_extract_member', $members); +} + +// }}} // {{{ function list_sort_members -function list_sort_members(&$members, $tri_promo = true) { - $member_list = array_map(create_function('$arr', 'return $arr[1];'), $members); - return list_sort_owners($member_list, $tri_promo); +function list_sort_members(&$members, $tri_promo = true) +{ + return list_sort_owners(list_extract_members($members), $tri_promo); +} + +// }}} +// {{{ 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); + } + return $res; } // }}} diff --git a/templates/lists/members.tpl b/templates/lists/members.tpl index b75548a..fae3deb 100644 --- a/templates/lists/members.tpl +++ b/templates/lists/members.tpl @@ -125,8 +125,20 @@ {/if} + {if $members|@count} + {if $details.own || hasPerms('admin,groupadmin')} + + {/if} + + + {foreach from=$members item=xs key=promo} {foreach from=$xs item=x name=all} -- 2.1.4
+ + {icon name="page_excel" title="Télécharger la liste des membres"} + Télécharger la liste des membres au format Excel + +