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>
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
// {{{ 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);
}
}
}
// }}}
-// {{{ 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;
}
$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;
}
}
}
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)
<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}&token={xsrf_token}'>
+ <a href='{$platal->ns}alias/admin/{$platal->argv[1]}?del_member={$m.email|urlencode}&token={xsrf_token}'>
{icon name=delete title='retirer membre'}
</a>
</td>
</tr>
- {/iterate}
+ {/foreach}
{else}
<tr>
<td colspan="3">
</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>
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',
# 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
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,