- #844: Uses INT in MySQL to store user ids -VZA
* Lists:
+ - #756: Can build the list of members from a file -FRU
- #761: Fix user comment in moderation mail sent by mailman -FRU
- #810: Fix encoding of admin pages -FRU
- #813: Fix display of the sample mail refusal message -JAC
- #817: Automation of the management of associations' ML -JAC
- #839: Fix warning when adding an external address -FRU
+ - #849: Don't list registrated user in unregistrated list -FRU
- Larger click target to toggle emails in the validation interface -ALK
* Profile:
- #806: Unsubscribe from MLs when leaving the group -FRU
- #807: Notify groupes managers of unsubscriptions -FRU
- #814: Group managers can change the visibility of the group -FRU
+ - #823: Store the subscription requests -FRU
- #824: Fix redirection when changing status of the user -FRU
- #846: Don't export users without a forlife in the vcard -FRU
- #847: Can export the directory as .csv file -FRU
}
if (S::has_perms()) {
$sub['gérer les groupes'] = array('href' => 'admin', 'style' => 'color: gray;');
- $sub['clear cache'] = array('href' => 'purge_cache', 'style' => 'color: gray;');
+ $sub['clear cache'] = array('href' => 'purge_cache?token=' . S::v('xsrf_token'), 'style' => 'color: gray;');
}
$menu['Administrer'] = $sub;
} elseif (S::has_perms()) {
$sub = array();
$sub['gérer les groupes'] = 'admin';
- $sub['clear cache'] = 'purge_cache';
+ $sub['clear cache'] = 'purge_cache?token=' . S::v('xsrf_token');
$menu['Administrer'] = $sub;
}
if (strlen(trim($members)) == 0) {
return null;
}
- $members = explode(' ', $members);
+ $members = split("[; ,\r\n\|]+", $members);
}
if ($members) {
$list = array();
foreach ($members as $i => $alias) {
+ $alias = trim($alias);
+ if (empty($alias)) {
+ continue;
+ }
if (($login = get_user_forlife($alias, $callback)) !== false) {
$list[$i] = $login;
- } else if(!$strict) {
+ } else if (!$strict) {
$list[$i] = $alias;
+ } else {
+ global $globals;
+ if (strpos($alias, '@') !== false) {
+ list($user, $dom) = explode('@', $alias);
+ if ($dom != $globals->mail->domain && $dom != $globals->mail->domain2) {
+ $list[$i] = $alias;
+ }
+ }
}
}
return $list;
}
$sql = "SELECT user_id, nom, prenom, promo
FROM auth_user_md5
- WHERE $where
+ WHERE $where AND perms = 'pending'
ORDER BY promo, nom, prenom";
if ($iterator) {
return XDB::iterator($sql, $nom, $prenom, $promo);
}
// click on validate button 'add_member_sub'
+ require_once('user.func.inc.php');
if (Post::has('add_member_sub') && Post::has('add_member')) {
- require_once('user.func.inc.php');
$forlifes = get_users_forlife_list(Post::v('add_member'), true);
if (!is_null($forlifes)) {
$members = array_merge($members, $forlifes);
}
}
+ if (Post::has('add_member_sub') && isset($_FILES['add_member_file']) && $_FILES['add_member_file']['tmp_name']) {
+ $upload =& PlUpload::get($_FILES['add_member_file'], S::v('forlife'), 'list.addmember', true);
+ if (!$upload) {
+ $page->trigError('Une erreur s\'est produite lors du téléchargement du fichier');
+ } else {
+ $forlifes = get_users_forlife_list($upload->getContents(), true);
+ if (!is_null($forlifes)) {
+ $members = array_merge($members, $forlifes);
+ }
+ }
+ }
ksort($owners);
$owners = array_unique($owners);
ksort($members);
$members = array_unique($members);
- $page->assign('owners', join(' ', $owners));
- $page->assign('members', join(' ', $members));
+ $page->assign('owners', join("\n", $owners));
+ $page->assign('members', join("\n", $members));
if (!Post::has('submit')) {
return;
}
}
+ if (isset($_FILES['add_member_file']) && $_FILES['add_member_file']['tmp_name']) {
+ $upload =& PlUpload::get($_FILES['add_member_file'], S::v('forlife'), 'list.addmember', true);
+ if (!$upload) {
+ $page->trigError('Une erreur s\'est produite lors du téléchargement du fichier');
+ } else {
+ $members = get_users_forlife_list($upload->getContents(),
+ false,
+ array('ListsModule', 'no_login_callback'));
+ $arr = $this->client->mass_subscribe($liste, $members);
+ if (is_array($arr)) {
+ foreach($arr as $addr) {
+ $page->trigSuccess("{$addr[0]} inscrit.");
+ }
+ }
+ }
+ }
+
if (Env::has('del_member')) {
if (strpos(Env::v('del_member'), '@') === false) {
$this->client->mass_unsubscribe(
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});
+ $key = $tri_promo ? ($promo != 'non-X' ? $promo : 0) : strtoupper(@$nom{0});
if ($tri_promo) {
$promo = null;
}
.'/'.S::v('forlife').'.jpg';
if (Env::has('upload')) {
+ S::assert_xsrf_token();
+
$upload = new PlUpload(S::v('forlife'), 'photo');
if (!$upload->upload($_FILES['userfile']) && !$upload->download(Env::v('photo'))) {
$page->trigError('Une erreur est survenue lors du téléchargement du fichier');
}
}
} elseif (Env::has('trombi')) {
+ S::assert_xsrf_token();
+
$upload = new PlUpload(S::v('forlife'), 'photo');
if ($upload->copyFrom($trombi_x)) {
$myphoto = new PhotoReq(S::v('uid'), $upload);
}
}
} elseif (Env::v('suppr')) {
+ S::assert_xsrf_token();
+
XDB::execute('DELETE FROM photo
WHERE uid = {?}',
S::v('uid'));
S::v('uid'));
$globals->updateNbValid();
} elseif (Env::v('cancel')) {
+ S::assert_xsrf_token();
+
$sql = XDB::query('DELETE FROM requests
WHERE user_id={?} AND type="photo"',
S::v('uid'));
if (!Env::has('promo_sortie')) {
return;
+ } else {
+ S::assert_xsrf_token();
}
$promo_sortie = Env::i('promo_sortie');
$page->assign('usage_req', $nom_usage);
if (Env::has('submit') && ($nom_usage != $usage_old)) {
+ S::assert_xsrf_token();
+
// on vient de recevoir une requete, differente de l'ancien nom d'usage
if ($nom_usage == $nom) {
$page->assign('same', true);
list($forlife, $promo) = $q->fetchOneRow();
switch ($action) {
-
case "original":
header("Content-type: image/jpeg");
readfile("/home/web/trombino/photos".$promo."/".$forlife.".jpg");
break;
case "new":
+ S::assert_xsrf_token();
+
$data = file_get_contents($_FILES['userfile']['tmp_name']);
list($x, $y) = getimagesize($_FILES['userfile']['tmp_name']);
$mimetype = substr($_FILES['userfile']['type'], 6);
break;
case "delete":
+ S::assert_xsrf_token();
+
XDB::execute('DELETE FROM photo WHERE uid = {?}', $uid);
break;
}
'%grp/trombi' => $this->make_hook('trombi', AUTH_MDP, 'groupannu'),
'%grp/geoloc' => $this->make_hook('geoloc', AUTH_MDP, 'groupannu'),
'%grp/subscribe' => $this->make_hook('subscribe', AUTH_MDP),
+ '%grp/subscribe/valid' => $this->make_hook('subscribe_valid', AUTH_MDP, 'groupadmin'),
'%grp/unsubscribe' => $this->make_hook('unsubscribe', AUTH_MDP, 'groupmember'),
'%grp/change_rights' => $this->make_hook('change_rights', AUTH_MDP),
AND FIND_IN_SET('public', u.flags)",
$globals->asso('id'));
}
+ if (may_update()) {
+ $subs_valid = XDB::query("SELECT uid
+ FROM groupex.membres_sub_requests
+ WHERE asso_id = {?}",
+ $globals->asso('id'));
+ $page->assign('requests', $subs_valid->numRows());
+ }
if (!S::has('core_rss_hash')) {
$page->setRssLink("Polytechnique.net :: {$globals->asso("nom")} :: News publiques",
$page->addJsLink('ajax.js');
if (Post::has('send')) {
+ S::assert_xsrf_token();
$from = Post::v('from');
$sujet = Post::v('sujet');
$body = Post::v('body');
$page->assign('ann', $ann);
}
+ private function removeSubscriptionRequest($uid)
+ {
+ global $globals;
+ XDB::execute("DELETE FROM groupex.membres_sub_requests
+ WHERE asso_id = {?} AND uid = {?}",
+ $globals->asso('id'), $uid);
+ }
+
+ private function validSubscription($nom, $prenom, $sexe, $uid, $forlife)
+ {
+ global $globals;
+ $this->removeSubscriptionRequest($uid);
+ XDB::execute("INSERT INTO groupex.membres (asso_id, uid)
+ VALUES ({?}, {?})",
+ $globals->asso('id'), $uid);
+ $mailer = new PlMailer();
+ $mailer->addTo("$forlife@polytechnique.org");
+ $mailer->setFrom('"' . S::v('prenom') . ' ' . S::v('nom')
+ . '" <' . S::v('forlife') . '@polytechnique.org>');
+ $mailer->setSubject('[' . $globals->asso('nom') . '] Demande d\'inscription');
+ $message = ($sexe ? 'Chère' : 'Cher') . " Camarade,\n"
+ . "\n"
+ . " Suite à ta demande d'adhésion à " . $globals->asso('nom') . ",\n"
+ . "j'ai le plaisir de t'annoncer que ton inscription a été validée !\n"
+ . "\n"
+ . "Bien cordialement,\n"
+ . "-- \n"
+ . S::s('prenom') . ' ' . S::s('nom') . '.';
+ $mailer->setTxtBody($message);
+ $mailer->send();
+ }
+
function handler_subscribe(&$page, $u = null)
{
global $globals;
if (!is_null($u) && may_update()) {
$page->assign('u', $u);
- $res = XDB::query("SELECT u.nom, u.prenom, u.promo, u.user_id, FIND_IN_SET('femme', u.flags)
+ $res = XDB::query("SELECT u.nom, u.prenom, u.promo, u.user_id, FIND_IN_SET('femme', u.flags), s.reason
FROM auth_user_md5 AS u
INNER JOIN aliases AS al ON (al.id = u.user_id AND al.type != 'liste')
- WHERE al.alias = {?}", $u);
+ LEFT JOIN groupex.membres_sub_requests AS s ON (u.user_id = s.uid AND s.asso_id = {?})
+ WHERE al.alias = {?}", $globals->asso('id'), $u);
- if (list($nom, $prenom, $promo, $uid, $sexe) = $res->fetchOneRow()) {
+ if (list($nom, $prenom, $promo, $uid, $sexe, $reason) = $res->fetchOneRow()) {
$res = XDB::query("SELECT COUNT(*)
FROM groupex.membres AS m
INNER JOIN aliases AS a ON (m.uid = a.id AND a.type != 'homonyme')
$u, $globals->asso('id'));
$n = $res->fetchOneCell();
if ($n) {
+ $this->removeSubscriptionRequest($uid);
$page->kill("$prenom $nom est déjà membre du groupe !");
return;
- }
- elseif (Env::has('accept'))
- {
- XDB::execute("INSERT INTO groupex.membres (asso_id, uid)
- VALUES ({?}, {?})",
- $globals->asso('id'), $uid);
- $mailer = new PlMailer();
- $mailer->addTo("$u@polytechnique.org");
- $mailer->setFrom('"'.S::v('prenom').' '.S::v('nom')
- .'" <'.S::v('forlife').'@polytechnique.org>');
- $mailer->setSubject('['.$globals->asso('nom').'] Demande d\'inscription');
- $message = ($sexe ? 'Chère' : 'Cher') . " Camarade,\n"
- . "\n"
- . " Suite à ta demande d'adhésion à ".$globals->asso('nom').",\n"
- . "j'ai le plaisir de t'annoncer que ton inscription a été validée !\n"
- . "\n"
- . "Bien cordialement,\n"
- . "-- \n"
- . "{$_SESSION["prenom"]} {$_SESSION["nom"]}.";
- $mailer->setTxtBody($message);
- $mailer->send();
+ } elseif (Env::has('accept')) {
+ S::assert_xsrf_token();
+
+ $this->validSubscription($nom, $prenom, $sexe, $uid, $u);
pl_redirect("member/$u");
- }
- elseif (Env::has('refuse'))
- {
+ } elseif (Env::has('refuse')) {
+ S::assert_xsrf_token();
+
+ $this->removeSubscriptionRequest($uid);
$mailer = new PlMailer();
$mailer->addTo("$u@polytechnique.org");
$mailer->setFrom('"'.S::v('prenom').' '.S::v('nom')
$page->assign('nom', $nom);
$page->assign('promo', $promo);
$page->assign('uid', $uid);
+ $page->assign('reason', $reason);
}
return;
}
return;
}
+ $res = XDB::query("SELECT uid
+ FROM groupex.membres_sub_requests
+ WHERE uid = {?} AND asso_id = {?}",
+ S::i('uid'), $globals->asso('id'));
+ if ($res->numRows() != 0) {
+ $page->kill("Tu as déjà demandé ton inscription à ce groupe. Cette demande est actuellement en attente de validation.");
+ return;
+ }
+
if (Post::has('inscrire')) {
+ S::assert_xsrf_token();
+
+ XDB::execute("INSERT INTO groupex.membres_sub_requests (asso_id, uid, ts, reason)
+ VALUES ({?}, {?}, NOW(), {?})",
+ $globals->asso('id'), S::i('uid'), Post::v('message'));
$res = XDB::query('SELECT IF(m.email IS NULL,
- CONCAT(al.alias,"@polytechnique.org"),
- m.email)
- FROM groupex.membres AS m
- INNER JOIN aliases AS al ON (al.type = "a_vie"
- AND al.id = m.uid)
- WHERE perms="admin" AND m.asso_id = {?}',
- $globals->asso('id'));
+ CONCAT(al.alias,"@polytechnique.org"),
+ m.email)
+ FROM groupex.membres AS m
+ INNER JOIN aliases AS al ON (al.type = "a_vie"
+ AND al.id = m.uid)
+ WHERE perms="admin" AND m.asso_id = {?}',
+ $globals->asso('id'));
$emails = $res->fetchColumn();
$to = implode(',', $emails);
}
}
+ function handler_subscribe_valid(&$page)
+ {
+ global $globals;
+
+ if (Post::has('valid')) {
+ S::assert_xsrf_token();
+ $subs = Post::v('subs');
+ if (is_array($subs)) {
+ $users = array();
+ foreach ($subs as $forlife => $val) {
+ if ($val == '1') {
+ $res = XDB::query("SELECT IF(u.nom_usage != '', u.nom_usage, u.nom) AS u,
+ u.prenom, FIND_IN_SET('femme', u.flags) AS sexe,
+ u.user_id
+ FROM auth_user_md5 AS u
+ INNER JOIN aliases AS a ON (a.id = u.user_id)
+ WHERE a.alias = {?}", $forlife);
+ if ($res->numRows() == 1) {
+ list($nom, $prenom, $sexe, $uid) = $res->fetchOneRow();
+ $this->validSubscription($nom, $prenom, $sexe, $uid, $forlife);
+ }
+ }
+ }
+ }
+ }
+
+ $it = XDB::iterator("SELECT IF(u.nom_usage != '', u.nom_usage, u.nom) AS nom,
+ u.prenom, u.promo, a.alias AS forlife, s.ts AS date
+ FROM groupex.membres_sub_requests AS s
+ INNER JOIN auth_user_md5 AS u ON (s.uid = u.user_id)
+ INNER JOIN aliases AS a ON (a.id = s.uid AND a.type = 'a_vie')
+ WHERE asso_id = {?}
+ ORDER BY nom, prenom",
+ $globals->asso('id'));
+
+ $page->changeTpl('xnetgrp/subscribe-valid.tpl');
+ $page->assign('valid', $it);
+ }
+
function handler_change_rights(&$page)
{
if (Env::has('right') && (may_update() || S::has('suid'))) {
if (is_null($email)) {
return;
+ } else {
+ S::assert_xsrf_token();
}
if (strpos($email, '@') === false) {
XDB::execute('INSERT INTO groupex.membres (uid, asso_id, origine, email)
VALUES ({?}, {?}, "X", {?})',
$uid, $globals->asso('id'), $email);
+ $this->removeSubscriptionRequest($uid);
pl_redirect("member/$email");
}
$page->trigError("Utilisateur invalide");
if (!Post::has('confirm')) {
return;
+ } else {
+ S::assert_xsrf_token();
}
if ($this->unsubscribe($user)) {
if (!Post::has('confirm')) {
return;
+ } else {
+ S::assert_xsrf_token();
}
if ($this->unsubscribe($user)) {
$globals->asso('mail_domain'));
if (Post::has('change')) {
+ S::assert_xsrf_token();
+
// Convert user status to X
if ($user['origine'] == 'ext' && trim(Post::v('login_X'))) {
$forlife = $this->changeLogin($page, $user, $mmlist, trim(Post::v('login_X')));
if (Post::v('valid') == 'Visualiser' || Post::v('valid') == 'Enregistrer'
|| Post::v('valid') == 'Supprimer l\'image' || Post::v('valid') == 'Pas d\'image') {
+ S::assert_xsrf_token();
+
if (!is_null($aid)) {
$art['id'] = $aid;
}
$page->changeTpl('xnetgrp/announce-admin.tpl');
if (Env::has('del')) {
+ S::assert_xsrf_token();
XDB::execute("DELETE FROM groupex.announces
WHERE id = {?} AND asso_id = {?}",
Env::i('del'), $globals->asso('id'));
{if $promo && strpos($x.l, '@') === false}
<a href="profile/{$x.l}" class="popup2">{$x.n}</a>
{elseif $x.x}
- <a href="{$platal->ns}member/{$x.x}">{$x.n}</a>
+ <a href="{$platal->ns}member/{$x.x}">{if $x.n|trim}{$x.n}{else}{$x.l}{/if}</a>
{elseif $x.n}
{$x.n}
{else}
</td>
</tr>
{/foreach}
- <tr>
- <td class='titre'>Ajouter ... </td>
+ <tr class="pair">
+ <td class='titre'>Ajouter</td>
<td>
<input type='text' size='30' name='add_owner' />
-
<input type='submit' value='ajouter' />
</td>
</tr>
{$np_m|default:"0"} membre{if $np_m > 1}s{/if} dans la liste
</h1>
-<form method='post' action='{$smarty.server.REQUEST_URI}'>
+<form method='post' action='{$smarty.server.REQUEST_URI}' enctype="multipart/form-data">
<table class='bicol' cellpadding='0' cellspacing='0'>
{foreach from=$members item=xs key=promo}
<tr>
{if $promo && strpos($x.l, '@') === false}
<a href="profile/{$x.l}" class="popup2">{$x.n}</a>
{elseif $x.x}
- <a href="{$platal->ns}member/{$x.x}">{$x.n}</a>
+ <a href="{$platal->ns}member/{$x.x}">{if $x.n|trim}{$x.n}{else}{$x.l}{/if}</a>
{elseif $x.n}
{$x.n}
{else}
</tr>
{/foreach}
<tr>
- <td class='titre'>Ajouter ...</td>
+ <th colspan="2">Ajouter</th>
+ </tr>
+ <tr class="pair">
+ <td class="titre">Liste</td>
<td>
<input type='text' size='40' name='add_member' />
-
+ </td>
+ </tr>
+ <tr class="pair">
+ <td class="titre">ou fichier(*)</td>
+ <td>
+ <input type="file" name="add_member_file" />*
+ </td>
+ </tr>
+ <tr class="pair">
+ <td colspan="2" class="center">
<input type='submit' value='ajouter' />
</td>
</tr>
</table>
</form>
+<div class="smaller">
+ * Le fichier doit contenir une adresse e-mail par ligne. Les X doivent être identifiés par une adresse
+ @polytechnique.org, @m4x.org ou @melix.net/org.
+</div>
+
{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
liste :
</p>
-<form action='lists/create' method='post'>
+<form action='lists/create' method='post' enctype="multipart/form-data">
<table class='bicol' cellspacing='0' cellpadding='2'>
<tr>
<th colspan='5'>Caractéristiques de la liste</th>
<input type='hidden' name='members' value='{$members}' />
{$members|nl2br|default:"<span class='erreur'>pas de membres</span>"}
<br />
- <input type='text' name='add_member' />
+ <input type='text' name='add_member' /><br />
+ <input type="file" name="add_member_file" /><br />
<input type='submit' name='add_member_sub' value='Ajouter' />
</td>
</tr>
<tr>
<td colspan='5'>
- <small>Tu peux entrer une liste de membres en entrant plusieurs adresses séparées par des espaces.</small>
+ <small>
+ Tu peux entrer une liste de membres en entrant plusieurs adresses séparées par des espaces, des virgules ou des point-virgules.
+ Tu peux aussi fournir un fichier avec une adresse email par ligne.
+ </small>
</td>
</tr>
</table>
{if $x.b}<a href="https://www.polytechnique.org/marketing/broken/{$x.l}">{icon name=error}</a>{/if}
<a href="profile/{$x.l}" class="popup2">{$x.n}</a>
{elseif $x.x}
- <a href="{$platal->ns}member/{$x.x}">{$x.n}</a>
+ <a href="{$platal->ns}member/{$x.x}">{if $x.n|trim}{$x.n}{else}{$x.l}{/if}</a>
{elseif $x.n}
{$x.n}
{else}
<br />
<p>
-<a href="admin/trombino/{$uid}/delete">Supprimer cette photo</a>
+<a href="admin/trombino/{$uid}/delete?token={xsrf_token}">Supprimer cette photo</a>
</p>
<p>
</p>
<form action="admin/trombino/{$uid}/new" method="post" enctype="multipart/form-data">
+ {xsrf_token_field}
<div>
<input name="userfile" type="file" size="20" maxlength="150" />
<input type="submit" value="Envoyer" />
{**************************************************************************}
<form action="{$wiz_baseurl}/{$lookup[$current]}" method="post" id="prof_annu">
+ {xsrf_token_field}
<div>
{icon name=information title="Voir ma fiche"} Tu peux consulter ta fiche telle que la
voient <a class="popup2" href="profile/{$smarty.session.forlife}?view=public">n'importe quel internaute</a>,
return false;
">
{/literal}
+ {xsrf_token_field}
<table class="bicol" cellpadding="4" summary="Nom d'usage">
<tr>
<th>Nom d'usage</th>
<br />
<form action="profile/orange" method="post">
+ {xsrf_token_field}
<table class="bicol" cellpadding="4" summary="Année de sortie">
<tr>
<th>Année de sortie</th>
<h1>Trombinoscope</h1>
<form enctype="multipart/form-data" action="photo/change" method="post">
+ {xsrf_token_field}
{if ($session.promo ge 1995) || ($session.promo le 2002)}
<p>
Si tu n'as pas encore fourni de photo, c'est celle du trombinoscope de l'X qui est
{/if}
</tr>
{/foreach}
- {if $is_admin && $evt.money}
+ {if $is_admin && $evt.money && $tout}
<tr>
{assign var=cols value=$moments|@count}
<td colspan="{$cols+3}" class="right"><strong>Total</strong></td>
{if $is_admin}
<p class="descr">
-[<a href="{$platal->ns}events/csv/{$evt.eid}/{$platal->argv[2]}/{$evt.intitule}{if $evt.titre}.{$evt.titre}{/if}.csv">Télécharger le fichier Excel</a>]
+ <a href="{$platal->ns}events/csv/{$evt.eid}/{$platal->argv[2]}/{$evt.intitule}{if $evt.titre}.{$evt.titre}{/if}.csv">
+ {icon name=page_excel title="Télécharger au format Excel"} Télécharger le fichier Excel
+ </a>
</p>
<hr />
<tr class="{if $art.perime}im{/if}pair">
<td><a href="{$platal->ns}announce/edit/{$art.id}">{$art.titre}</a></td>
<td>{$art.peremption|date_format}</td>
- <td class="right"><a href="{$platal->ns}admin/announces?del={$art.id}">
+ <td class="right"><a href="{$platal->ns}admin/announces?del={$art.id}&token={xsrf_token}">
Supprimer l'annonce {icon name=cross}
</a>
</td>
{/if}
<form method="post" action="{$platal->ns}announce/{if $new}new{else}edit/{$art.id}{/if}" enctype="multipart/form-data">
+{xsrf_token_field}
<div>
<table class="bicol">
<tr>
{if $m.comm}
<td>{$m.comm}</td>
{/if}
- <td class="center" {if !$m.comm}colspan="2"{/if}>
+ <td class="right" {if !$m.comm}colspan="2"{/if}>
{if $m.inscrit}
<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="mail"}</a>
</td>
</tr>
{/if}
+
+ {if $is_admin && $requests}
+ <tr>
+ <td class="titre center" colspan="2">
+ <a href="{$platal->ns}subscribe/valid">{$requests} demande{if $requests gt 1}s{/if} d'inscription en attente</a>
+ </td>
+ </tr>
+ {/if}
</table>
<br />
{if $u && $is_admin && $show_form}
<h2>
- Demande de la part de : {$prenom} {$nom} (X{$promo})
- <a href="https://www.polytechnique.org/profile/{$u}">Voir sa fiche</a>
+ Demande de la part de : <a href="profile/{$u}" class="popup2">{$prenom} {$nom} (X{$promo})</a>
</h2>
+
+{if $reason}
+<fieldset>
+ <legend>Motif de la demande</legend>
+ {$reason|nl2br}
+</fieldset>
+{/if}
+
<form action="{$platal->ns}subscribe/{$u}" method="post">
- <input type="submit" value="Accepter" name="accept" />
- <br />
- ou bien
- <br />
- <input type="submit" value="Refuser avec le motif ci-dessous" name="refuse" />
- <textarea cols="70" rows="8" name="motif"></textarea>
- <br />
+ {xsrf_token_field}
+ <table class="bicol">
+ <tr>
+ <td>Raison (en cas de refus) :</td>
+ </tr>
+ <tr>
+ <td>
+ <textarea cols="70" rows="8" name="motif"></textarea>
+ </td>
+ </tr>
+ <tr>
+ <td class="center">
+ <input type="submit" value="Accepter" name="accept" />
+ <input type="submit" value="Refuser" name="refuse" />
+ </td>
+ </tr>
+ </table>
</form>
+<div><a href="{$platal->ns}/subscribe/valid">Revenir à la liste des validations en attente</a></div>
+
{elseif $smarty.post.inscrire}
<p class="descr">
[ M'inscrire ! ].
</p>
<form action="{$platal->ns}subscribe" method="post">
+ {xsrf_token_field}
<p class="descr">
<strong>OUI, je souhaite être inscrit au groupe {$asso.nom}.</strong>
</p>
//]]></script>
<form action="{$platal->ns}mail" method="post" enctype="multipart/form-data">
+ {xsrf_token_field}
<table class='bicol'>
<tr>
<th colspan="2">Écrire un mail :</th>
<h1>{$asso.nom} : Ajout d'un membre</h1>
<form method="post" action="{$platal->ns}member/new/">
+ {xsrf_token_field}
<ul class='descr'>
<li>
Pour ajouter un X dans ton groupe, il suffit d'entrer ici une de ses
<form method="post" action="{$platal->pl_self()}">
+ {xsrf_token_field}
<div class="center">
<p class="descr">
{if $self}
</p>
<h2>
- Édition du profil de {$user.prenom} {$user.nom}
+ Édition du profil de {if "`$user.prenom` `$user.nom`"|trim}{$user.prenom} {$user.nom}{else}{$user.email}{/if}
{if $user.origine eq 'X'}
(X{$user.promo})
<a href="https://www.polytechnique.org/profile/{$user.alias}">{icon name=user_suit title="fiche"}</a>
</h2>
<form method="post" action="{$platal->ns}member/{$platal->argv[1]}">
+ {xsrf_token_field}
<table cellpadding="0" cellspacing="0" class='tinybicol'>
<tr class="pair">
<td class="titre">
--- /dev/null
+{**************************************************************************}
+{* *}
+{* Copyright (C) 2003-2008 Polytechnique.org *}
+{* http://opensource.polytechnique.org/ *}
+{* *}
+{* This program is free software; you can redistribute it and/or modify *}
+{* it under the terms of the GNU General Public License as published by *}
+{* the Free Software Foundation; either version 2 of the License, or *}
+{* (at your option) any later version. *}
+{* *}
+{* This program is distributed in the hope that it will be useful, *}
+{* but WITHOUT ANY WARRANTY; without even the implied warranty of *}
+{* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *}
+{* GNU General Public License for more details. *}
+{* *}
+{* You should have received a copy of the GNU General Public License *}
+{* along with this program; if not, write to the Free Software *}
+{* Foundation, Inc., *}
+{* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *}
+{* *}
+{**************************************************************************}
+
+<h1>{$asso.nom} : Validation des inscriptions</h1>
+
+<script type="text/javascript">//<![CDATA[
+{literal}
+ var toggleState = false;
+ function toggleSelection()
+ {
+ toggleState = !toggleState;
+ var boxes = $(':checkbox.select_sub');
+ if (toggleState) {
+ boxes.attr("checked", "checked");
+ } else {
+ boxes.removeAttr("checked");
+ }
+ return true;
+ }
+{/literal}
+//]]></script>
+
+<form action="{$platal->ns}subscribe/valid" method="post">
+ <table class="tinybicol">
+ <tr>
+ <th><a href="javascript:toggleSelection()">{icon name="arrow_refresh" title="Inverser la sélection"}</a></th>
+ <th>Prénom Nom</th>
+ <th>Date de demande</th>
+ <th></th>
+ </tr>
+ {iterate from=$valid item=user}
+ <tr>
+ <td><input type="checkbox" name="subs[{$user.forlife}]" value="1" class="select_sub" /></td>
+ <td><a href="profile/{$user.forlife}" class="popup2">{$user.prenom} {$user.nom} (X{$user.promo})</a></td>
+ <td>{$user.date|date_format}</td>
+ <td><a href="{$platal->ns}subscribe/{$user.forlife}">{icon name=magnifier title="Détails"}</a></td>
+ </tr>
+ {/iterate}
+ </table>
+
+ <div class="center">
+ {xsrf_token_field}
+ <input type="submit" name="valid" value="Accepter" />
+ </div>
+
+ <div>
+ Pour voir le détail sur une demande, clique sur le lien {icon name=magnifier title="Détails"}.<br />
+ Pour refuser une demande, tu dois aller consulter les détails et remplir la raison du refus.
+ </div>
+</form>
+{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
alter table asso change column flags flags set('wiki_desc', 'notif_unsub') not null;
+create table membres_sub_requests (
+ asso_id smallint(5) unsigned not null,
+ uid int(11) not null,
+ ts timestamp not null default NOW(),
+ reason text default null,
+
+ primary key sub (asso_id, uid)
+) charset=utf8;
+
use x4dat;
# vim:set syntax=mysql: