From cb8a8977a6af58cd7d1ee4bf0c94dbc857e1c96e Mon Sep 17 00:00:00 2001 From: Florent Bruneau Date: Thu, 8 Jan 2009 23:57:59 +0100 Subject: [PATCH] No more auth_user_ in lists and xnetlists. 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 --- classes/user.php | 8 +++++ modules/lists/lists.inc.php | 61 +++++++++++-------------------------- modules/xnetlists.php | 54 +++++++++++++------------------- templates/xnetlists/alias-admin.tpl | 20 ++++++------ templates/xnetlists/sync.tpl | 6 ++-- upgrade/account/00_account.sql | 1 + upgrade/account/99_insertion.sql | 5 ++- 7 files changed, 65 insertions(+), 90 deletions(-) diff --git a/classes/user.php b/classes/user.php index 7461573..616b11e 100644 --- a/classes/user.php +++ b/classes/user.php @@ -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 diff --git a/modules/lists/lists.inc.php b/modules/lists/lists.inc.php index 2e60c61..30e1994 100644 --- a/modules/lists/lists.inc.php +++ b/modules/lists/lists.inc.php @@ -21,27 +21,29 @@ // {{{ 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; } diff --git a/modules/xnetlists.php b/modules/xnetlists.php index 4f6dcb2..45c0b35 100644 --- a/modules/xnetlists.php +++ b/modules/xnetlists.php @@ -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) diff --git a/templates/xnetlists/alias-admin.tpl b/templates/xnetlists/alias-admin.tpl index 91ddf3e..1c8f7b2 100644 --- a/templates/xnetlists/alias-admin.tpl +++ b/templates/xnetlists/alias-admin.tpl @@ -25,32 +25,32 @@

Membres de {$platal->argv[1]}

- {if $mem->total()} - {iterate from=$mem item=m} + {if $mem|@count} + {foreach from=$mem item=m} - {/iterate} + {/foreach} {else} {foreach from=$not_in_list item=u} - - - + + + {/foreach} diff --git a/upgrade/account/00_account.sql b/upgrade/account/00_account.sql index cc19b83..e8523d3 100644 --- a/upgrade/account/00_account.sql +++ b/upgrade/account/00_account.sql @@ -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', diff --git a/upgrade/account/99_insertion.sql b/upgrade/account/99_insertion.sql index bb9961e..73e0216 100644 --- a/upgrade/account/99_insertion.sql +++ b/upgrade/account/99_insertion.sql @@ -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, -- 2.1.4
- {if $m.nom} + {if $m.user} {if $m.admin}{/if} - {if $m.alias}{/if} - {$m.prenom} {$m.nom} - {if $m.alias}{/if} + {$m.user->fullName()} {if $m.admin}{/if} {else} - {$m.redirect} + {$m.email} {/if} + {if $m.user} {if $m.admin}{/if} - {$m.promo} + {$m.user->promo()} {if $m.admin}{/if} + {/if} - + {icon name=delete title='retirer membre'}
diff --git a/templates/xnetlists/sync.tpl b/templates/xnetlists/sync.tpl index 5916750..3ba7b99 100644 --- a/templates/xnetlists/sync.tpl +++ b/templates/xnetlists/sync.tpl @@ -34,9 +34,9 @@
{$u.nom|strtoupper} {$u.prenom}{$u.promo}{$u->fullName()}{$u->promo()}