'%grp/edit' => $this->make_hook('edit', AUTH_MDP, 'groupadmin'),
'%grp/mail' => $this->make_hook('mail', AUTH_MDP, 'groupadmin'),
'%grp/forum' => $this->make_hook('forum', AUTH_MDP, 'groupmember'),
+ '%grp/former_users' => $this->make_hook('former_users', AUTH_MDP, 'admin'),
'%grp/annuaire' => $this->make_hook('annuaire', AUTH_MDP, 'groupannu'),
'%grp/annuaire/vcard' => $this->make_hook('vcard', AUTH_MDP, 'groupmember:groupannu'),
'%grp/annuaire/csv' => $this->make_hook('csv', AUTH_MDP, 'groupmember:groupannu'),
+ '%grp/directory/sync' => $this->make_hook('directory_sync', AUTH_MDP, 'groupadmin'),
+ '%grp/directory/unact' => $this->make_hook('non_active', AUTH_MDP, 'groupadmin'),
'%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),
{
global $globals;
- if ($action == 'trombi') {
- __autoload('userset');
- if ($action == 'trombi') {
- $view = new ProfileSet(new UFC_Group($globals->asso('id')));
- } else {
- $view = new UserSet(new UFC_Group($globals->asso('id')));
- }
- $view->addMod('trombi', 'Trombinoscope');
- $view->apply('annuaire', $page, $action, $subaction);
- $page->changeTpl('xnetgrp/annuaire.tpl');
- $count = XDB::fetchOneCell('SELECT COUNT(*)
- FROM group_members
- WHERE asso_id = {?}',
- $globals->asso('id'));
- $page->assign('nb_tot', $count);
- return;
+ __autoload('userset');
+ $admins = false;
+ if ($action == 'admins') {
+ $admins = true;
+ $action = $subaction;
}
-
+ $view = new UserSet(new UFC_Group($globals->asso('id'), $admins));
+ $view->addMod('groupmember', 'Annuaire');
+ $view->addMod('trombi', 'Trombinoscope');
+ $view->apply('annuaire', $page, $action);
+ $page->assign('only_admin', $admins);
$page->changeTpl('xnetgrp/annuaire.tpl');
- $sort = Env::s('order', 'directory_name');
- $ofs = Env::i('offset');
- if ($ofs < 0) {
- $ofs = 0;
- }
-
- $sdesc = $sort{0} == '-';
- $sf = $sdesc ? substr($sort, 1) : $sort;
- if ($sf == 'promo') {
- $se = new UFO_Promo(null, $sdesc);
- } else {
- $se = new UFO_Name($sf, null, null, $sdesc);
- }
+ }
- if (Env::b('admin')) {
- $uf = $globals->asso()->getAdminsFilter(null, $se);
- } else {
- $uf = $globals->asso()->getMembersFilter(null, $se);
- }
- $users = $uf->getUsers(new PlLimit(NB_PER_PAGE, $ofs * NB_PER_PAGE));
- $count = $uf->getTotalCount();
+ function handler_former_users($page)
+ {
+ global $globals;
+ require_once 'userset.inc.php';
- $page->assign('nb_tot', $count);
- $page->assign('pages', floor(($count + NB_PER_PAGE - 1) / NB_PER_PAGE));
- $page->assign('current', $ofs);
- $page->assign('order', $sort);
- $page->assign('users', $users);
- $page->assign('only_admin', Env::b('admin'));
+ $view = new UserSet(new UFC_GroupFormerMember($globals->asso('id')));
+ $view->addMod('groupmember', 'Anciens membres', true, array('noadmin' => true));
+ $view->apply('former_users', $page);
+ $page->changeTpl('xnetgrp/former_users.tpl');
}
function handler_trombi($page)
$page->assign('users', $users);
}
+ function handler_directory_sync($page)
+ {
+ global $globals;
+ require_once 'emails.inc.php';
+
+ $page->changeTpl('xnetgrp/sync.tpl');
+ Platal::load('lists', 'lists.inc.php');
+
+ if (Env::has('add_users')) {
+ S::assert_xsrf_token();
+
+ $users = array_keys(Env::v('add_users'));
+ $former_users = XDB::fetchColumn('SELECT uid
+ FROM group_former_members
+ WHERE remember = TRUE AND uid IN {?}',
+ $users);
+ $new_users = array_diff($users, $former_users);
+
+ foreach ($former_users as $uid) {
+ $user = User::getSilentWithUID($uid);
+ $page->trigWarning($user->fullName() . ' est un ancien membre du groupe qui ne souhaite pas y revenir.');
+ }
+ if (count($former_users) > 1) {
+ $page->trigWarning('S\'ils souhaitent revenir dans le groupe, il faut qu\'ils en fassent la demande sur la page d\'accueil du groupe.');
+ } elseif (count($former_users)) {
+ $page->trigWarning('S\'il souhaite revenir dans le groupe, il faut qu\'il en fasse la demande sur la page d\'accueil du groupe.');
+ }
+
+ $data = array();
+ foreach ($new_users as $uid) {
+ $data[] = XDB::format('({?}, {?})', $globals->asso('id'), $uid);
+ }
+ XDB::rawExecute('INSERT INTO group_members (asso_id, uid)
+ VALUES ' . implode(',', $data));
+ }
+
+ if (Env::has('add_nonusers')) {
+ S::assert_xsrf_token();
+
+ $nonusers = array_keys(Env::v('add_nonusers'));
+ foreach ($nonusers as $email) {
+ if ($user = User::getSilent($email) || !isvalid_email($email)) {
+ continue;
+ }
+
+ list($local_part, $domain) = explode('@', strtolower($email));
+ $hruid = User::makeHrid($local_part, $domain, 'ext');
+ if ($user = User::getSilent($hruid)) {
+ continue;
+ }
+
+ $parts = explode('.', $local_part);
+ if (count($parts) == 1) {
+ $lastname = $display_name = $full_name = $directory_name = ucfirst($local_part);
+ $firstname = '';
+ } else {
+ $firstname = ucfirst($parts[0]);
+ $lastname = ucwords(implode(' ', array_slice($parts, 1)));
+ $display_name = $firstname;
+ $full_name = $firstname . ' ' . $lastname;
+ $directory_name = strtoupper($lastname) . ' ' . $firstname;
+ }
+ XDB::execute('INSERT INTO accounts (hruid, display_name, full_name, directory_name, firstname, lastname, email, type, state)
+ VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, \'xnet\', \'disabled\')',
+ $hruid, $display_name, $full_name, $directory_name, $firstname, $lastname, $email);
+ $uid = XDB::insertId();
+ XDB::execute('INSERT INTO group_members (asso_id, uid)
+ VALUES ({?}, {?})',
+ $globals->asso('id'), $uid);
+ }
+ }
+
+ if (Env::has('add_users') || Env::has('add_nonusers')) {
+ $page->trigSuccess('Ajouts réalisés avec succès.');
+ }
+
+ $user = S::user();
+ $client = new MMList($user, $globals->asso('mail_domain'));
+ $lists = $client->get_lists();
+ $members = array();
+ foreach ($lists as $list) {
+ $details = $client->get_members($list['list']);
+ $members = array_merge($members, list_extract_members($details[1]));
+ }
+ $members = array_unique($members);
+ $uids = array();
+ $users = array();
+ $nonusers = array();
+ foreach ($members as $email) {
+ if ($user = User::getSilent($email)) {
+ $uids[] = $user->id();
+ } else {
+ $nonusers[] = $email;
+ }
+ }
+
+ $aliases = iterate_list_alias($globals->asso('mail_domain'));
+ foreach ($aliases as $alias) {
+ list($local_part, $domain) = explode('@', $alias);
+ $aliases_members = list_alias_members($local_part, $domain);
+ $users = array_merge($users, $aliases_members['users']);
+ $nonusers = array_merge($nonusers, $aliases_members['nonusers']);
+ }
+ foreach ($users as $user) {
+ $uids[] = $user->id();
+ }
+ $nonusers = array_unique($nonusers);
+ $uids = array_unique($uids);
+ if (count($uids)) {
+ $uids = XDB::fetchColumn('SELECT a.uid
+ FROM accounts AS a
+ WHERE a.uid IN {?} AND NOT EXISTS (SELECT *
+ FROM group_members AS g
+ WHERE a.uid = g.uid AND g.asso_id = {?})',
+ $uids, $globals->asso('id'));
+
+ $users = User::getBulkUsersWithUIDs($uids);
+ usort($users, 'User::compareDirectoryName');
+ } else {
+ $users = array();
+ }
+ sort($nonusers);
+
+ $page->assign('users', $users);
+ $page->assign('nonusers', $nonusers);
+ }
+
+ function handler_non_active($page)
+ {
+ global $globals;
+ $page->changeTpl('xnetgrp/non_active.tpl');
+
+ $uids = XDB::fetchColumn('SELECT g.uid
+ FROM group_members AS g
+ INNER JOIN accounts AS a ON (a.uid = g.uid)
+ LEFT JOIN register_pending_xnet AS p ON (p.uid = g.uid)
+ WHERE a.uid = g.uid AND g.asso_id = {?} AND a.type = \'xnet\' AND a.state = \'disabled\' AND p.uid IS NULL',
+ $globals->asso('id'));
+ foreach ($uids as $key => $uid) {
+ if (AccountReq::isPending($uid) || BulkAccountsReq::isPending($uid)) {
+ unset($uids[$key]);
+ }
+ }
+
+ if (Post::has('enable_accounts')) {
+ S::assert_xsrf_token();
+
+ $uids_to_enable = array_intersect(array_keys(Post::v('enable_accounts')), $uids);
+
+ $user = S::user();
+ $group = Platal::globals()->asso('nom');
+ $request = new BulkAccountsReq($user, $uids_to_enable, $group);
+ $request->submit();
+ $page->trigSuccess('Un email va bientôt être envoyé aux personnes sélectionnées pour l\'activation de leur compte.');
+
+ foreach ($uids as $key => $uid) {
+ if (in_array($uid, $uids_to_enable)) {
+ unset($uids[$key]);
+ }
+ }
+ }
+
+ $users = User::getBulkUsersWithUIDs($uids);
+ $page->assign('users', $users);
+ }
+
private function removeSubscriptionRequest($uid)
{
global $globals;
{
global $globals;
$this->removeSubscriptionRequest($user->id());
- XDB::execute("INSERT IGNORE INTO group_members (asso_id, uid)
- VALUES ({?}, {?})",
- $globals->asso('id'), $user->id());
+ Group::subscribe($globals->asso('id'), $user->id());
+
if (XDB::affectedRows() == 1) {
$mailer = new PlMailer();
$mailer->addTo($user->forlifeEmail());
XDB::execute("INSERT INTO group_member_sub_requests (asso_id, uid, ts, reason)
VALUES ({?}, {?}, NOW(), {?})",
$globals->asso('id'), S::i('uid'), Post::v('message'));
+ XDB::execute('DELETE FROM group_former_members
+ WHERE uid = {?} AND asso_id = {?}',
+ S::i('uid'), $globals->asso('id'));
$uf = New UserFilter(New UFC_Group($globals->asso('id'), true));
$admins = $uf->iterUsers();
$admin = $admins->next();
// Finds or creates account: first cases are for users with an account.
if (!User::isForeignEmailAddress($email)) {
// Standard account
- $user = User::get($email);
+ $user = User::getSilent($email);
} else if (!isvalid_email($email)) {
// email might not be a regular email but an alias or a hruid
- $user = User::get($email);
+ $user = User::getSilent($email);
if (!$user) {
// need a valid email address
$page->trigError('« <strong>' . $email . '</strong> » n\'est pas une adresse email valide.');
return;
}
} else if (Env::v('x') && Env::i('userid')) {
- $user = User::getWithUID(Env::i('userid'));
+ $user = User::getSilentWithUID(Env::i('userid'));
if (!$user) {
$page->trigError('Utilisateur invalide.');
return;
list($mbox, $domain) = explode('@', strtolower($email));
$hruid = User::makeHrid($mbox, $domain, 'ext');
// User might already have an account (in another group for example).
- $user = User::get($hruid);
+ $user = User::getSilent($hruid);
// If the user has no account yet, creates new account: build names from email address.
if (empty($user)) {
$parts = explode('.', $mbox);
if (count($parts) == 1) {
- $display_name = $full_name = $directory_name = ucfirst($mbox);
+ $lastname = $display_name = $full_name = $directory_name = ucfirst($mbox);
+ $firstname = '';
} else {
$firstname = ucfirst($parts[0]);
$lastname = ucwords(implode(' ', array_slice($parts, 1)));
$full_name = "$firstname $lastname";
$directory_name = strtoupper($lastname) . " " . $firstname;
}
- XDB::execute('INSERT INTO accounts (hruid, display_name, full_name, directory_name,
- email, type)
- VALUES ({?}, {?}, {?}, {?}, {?}, \'xnet\')',
- $hruid, $display_name, $full_name, $directory_name, $email);
- $user = User::get($hruid);
+ XDB::execute('INSERT INTO accounts (hruid, display_name, full_name, directory_name, firstname, lastname, email, type, state)
+ VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, \'xnet\', \'disabled\')',
+ $hruid, $display_name, $full_name, $directory_name, $firstname, $lastname, $email);
+ $user = User::getSilent($hruid);
}
$suggest_account_activation = $this->suggest($user);
}
if ($user) {
- XDB::execute('INSERT IGNORE INTO group_members (uid, asso_id)
- VALUES ({?}, {?})',
- $user->id(), $globals->asso('id'));
+ // First check if the user used to be in this group.
+ XDB::rawExecute('DELETE FROM group_former_members
+ WHERE remember AND DATE_SUB(NOW(), INTERVAL 1 YEAR) > unsubsciption_date');
+ $former_member = XDB::fetchOneCell('SELECT remember
+ FROM group_former_members
+ WHERE uid = {?} AND asso_id = {?}',
+ $user->id(), $globals->asso('id'));
+ if ($former_member === 1) {
+ $page->trigError($user->fullName() . ' est un ancien membre du groupe qui ne souhaite pas y revenir. S\'il souhaite revenir dans le groupe, il faut qu\'il en fasse la demande sur la page d\'accueil du groupe.');
+ return;
+ } elseif (!is_null($former_member) && Post::i('force_continue') == 0) {
+ $page->trigWarning($user->fullName() . ' est un ancien membre du groupe qui s\'est récemment désinscrit. Malgré cela, si tu penses qu\'il souhaite revenir, cliquer sur « Ajouter » l\'ajoutera bien au groupe cette fois.');
+ $page->assign('force_continue', 1);
+ return;
+ }
+
+ Group::subscribe($globals->asso('id'), $user->id());
$this->removeSubscriptionRequest($user->id());
if ($suggest_account_activation) {
pl_redirect('member/suggest/' . $user->login() . '/' . $email . '/' . $globals->asso('nom'));
FROM register_pending_xnet
WHERE uid = {?}',
$user->id());
- $requested = AccountReq::isPending($user->id());
+ $requested = AccountReq::isPending($user->id()) || BulkAccountsReq::isPending($user->id());
if ($active || $pending || $requested) {
return false;
$page->assign('users', $users);
}
- function unsubscribe(PlUser $user)
+ function unsubscribe(PlUser $user, $remember = false)
{
global $globals;
- XDB::execute("DELETE FROM group_members
- WHERE uid = {?} AND asso_id = {?}",
- $user->id(), $globals->asso('id'));
+ Group::unsubscribe($globals->asso('id'), $user->id(), $remember);
if ($globals->asso('notif_unsub')) {
$mailer = new PlMailer('xnetgrp/unsubscription-notif.mail.tpl');
$hasSingleGroup = ($user->groupCount() == 1);
- if ($this->unsubscribe($user)) {
+ if ($this->unsubscribe($user, Post::b('remember'))) {
$page->trigSuccess('Tu as été désinscrit du groupe avec succès.');
} else {
$page->trigWarning('Tu as été désinscrit du groupe, mais des erreurs se sont produites lors des désinscriptions des alias et des listes de diffusion.');
$mmlist = new MMList(S::user(), $globals->asso('mail_domain'));
if (Post::has('change')) {
+ require_once 'emails.inc.php';
S::assert_xsrf_token();
// Convert user status to X
$email_changed = (!$user->profile() && strtolower($user->forlifeEmail()) != strtolower(Post::v('email')));
$from_email = $user->forlifeEmail();
if ($user->type == 'virtual' || ($user->type == 'xnet' && !$user->perms)) {
+ $lastname = Post::s('lastname');
+ if (Post::s('type') != 'virtual') {
+ $firstname = Post::s('firstname');
+ $full_name = $firstname . ' ' . $lastname;
+ $directory_name = mb_strtoupper($lastname) . ' ' . $firstname;
+ } else {
+ $firstname = '';
+ $full_name = $lastname;
+ $directory_name = mb_strtoupper($lastname);
+ }
XDB::query('UPDATE accounts
SET full_name = {?}, directory_name = {?}, display_name = {?},
- sex = {?}, email = {?}, type = {?}
+ firstname = {?}, lastname = {?}, sex = {?}, email = {?}, type = {?}
WHERE uid = {?}',
- Post::t('full_name'), Post::t('directory_name'), Post::t('display_name'),
+ $full_name, $directory_name, Post::t('display_name'), $firstname, $lastname,
(Post::t('sex') == 'male') ? 'male' : 'female', Post::t('email'),
(Post::t('type') == 'xnet') ? 'xnet' : 'virtual', $user->id());
} else if (!$user->perms) {
WHERE uid = {?}',
Post::t('email'), $user->id());
}
+ if (require_email_update($user, Post::t('email'))) {
+ $listClient = new MMList(S::user());
+ $listClient->change_user_email($user->forlifeEmail(), Post::t('email'));
+ update_alias_user($user->forlifeEmail(), Post::t('email'));
+ }
if (XDB::affectedRows()) {
$page->trigSuccess('Données de l\'utilisateur mises à jour.');
}
foreach (Env::v('ml3', array()) as $ml => $state) {
require_once 'emails.inc.php';
$ask = !empty($_REQUEST['ml4'][$ml]);
+ list($local_part, ) = explode('@', $ml);
if($state == $ask) {
if ($state && $email_changed) {
- update_list_alias($user, $from_email, $ml, $globals->asso('mail_domain'));
+ update_list_alias($user->id(), $from_email, $local_part, $globals->asso('mail_domain'));
$page->trigSuccess("L'abonnement de {$user->fullName()} à $ml a été mis à jour.");
}
} else if($ask) {
- add_to_list_alias($user, $ml, $globals->asso('mail_domain'));
+ add_to_list_alias($user->id(), $local_part, $globals->asso('mail_domain'));
$page->trigSuccess("{$user->fullName()} a été abonné à $ml.");
} else {
- delete_from_list_alias($user, $ml, $globals->asso('mail_domain'));
+ delete_from_list_alias($user->id(), $local_part, $globals->asso('mail_domain'));
$page->trigSuccess("{$user->fullName()} a été désabonné de $ml.");
}
}
+
+ if ($globals->asso('has_nl')) {
+ // Updates group's newsletter subscription.
+ if (Post::i('newsletter') == 1) {
+ XDB::execute('INSERT IGNORE INTO newsletter_ins (uid, nlid)
+ SELECT {?}, id
+ FROM newsletters
+ WHERE group_id = {?}',
+ $user->id(), $globals->asso('id'));
+ } else {
+ XDB::execute('DELETE ni
+ FROM newsletter_ins AS ni
+ INNER JOIN newsletters AS n ON (n.id = ni.nlid)
+ WHERE ni.uid = {?} AND n.group_id = {?}',
+ $user->id(), $globals->asso('id'));
+ }
+ }
}
$res = XDB::rawFetchAllAssoc('SHOW COLUMNS FROM group_members LIKE \'position\'');
$positions = str_replace(array('enum(', ')', '\''), '', $res[0]['Type']);
+ $nl_registered = XDB::fetchOneCell('SELECT COUNT(ni.uid)
+ FROM newsletter_ins AS ni
+ INNER JOIN newsletters AS n ON (n.id = ni.nlid)
+ WHERE ni.uid = {?} AND n.group_id = {?}',
+ $user->id(), $globals->asso('id'));
$page->assign('user', $user);
$page->assign('suggest', $this->suggest($user));
$page->assign('listes', $mmlist->get_lists($user->forlifeEmail()));
$page->assign('alias', $user->emailGroupAliases($globals->asso('mail_domain')));
$page->assign('positions', explode(',', $positions));
+ $page->assign('nl_registered', $nl_registered);
}
function handler_rss(PlPage $page, PlUser $user)
$page->trigError('Le fichier n\'est pas une image valide au format JPEG, GIF ou PNG.');
$upload->rm();
return false;
- } elseif (!$upload->resizeImage(200, 300, 100, 100, 32284)) {
+ } elseif (!$upload->resizeImage(80, 100, 100, 100, 32284)) {
$page->trigError('Impossible de retraiter l\'image');
return false;
}
if (!empty($art['contact_html'])) {
$fulltext .= "\n\n'''Contacts :'''\\\\\n" . $art['contact_html'];
}
- $post = null;/*
+ $post = null;
if ($globals->asso('forum')) {
require_once 'banana/forum.inc.php';
$banana = new ForumsBanana(S::user());
$post = $banana->post($globals->asso('forum'), null,
$art['titre'], MiniWiki::wikiToText($fulltext, false, 0, 80));
- }*/
+ }
XDB::query('INSERT INTO group_announces (uid, asso_id, create_date, titre, texte, contacts,
expiration, promo_min, promo_max, flags, post_id)
VALUES ({?}, {?}, NOW(), {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})',