'admin/wiki' => $this->make_hook('wiki', AUTH_MDP, 'admin'),
'admin/ipwatch' => $this->make_hook('ipwatch', AUTH_MDP, 'admin'),
'admin/icons' => $this->make_hook('icons', AUTH_MDP, 'admin'),
+ 'admin/geocoding' => $this->make_hook('geocoding', AUTH_MDP, 'admin'),
'admin/accounts' => $this->make_hook('accounts', AUTH_MDP, 'admin'),
'admin/account/watch' => $this->make_hook('account_watch', AUTH_MDP, 'admin'),
'admin/account/types' => $this->make_hook('account_types', AUTH_MDP, 'admin'),
$page->assign_by_ref('mails', $sql);
}
- function handler_postfix_regexpsbounces($page, $new = null) {
- $page->changeTpl('admin/emails_bounces_re.tpl');
- $page->setTitle('Administration - Postfix : Regexps Bounces');
- $page->assign('new', $new);
-
- if (Post::has('submit')) {
- foreach (Env::v('lvl') as $id=>$val) {
- XDB::query(
- "REPLACE INTO emails_bounces_re (id,pos,lvl,re,text) VALUES ({?}, {?}, {?}, {?}, {?})",
- $id, $_POST['pos'][$id], $_POST['lvl'][$id], $_POST['re'][$id], $_POST['text'][$id]
- );
- }
- }
-
- $page->assign('bre', XDB::iterator("SELECT * FROM emails_bounces_re ORDER BY pos"));
- }
-
// {{{ logger view
/** Retrieves the available days for a given year and month.
// }}}
- $page->addJsLink('jquery.ui.core.js');
- $page->addJsLink('jquery.ui.widget.js');
- $page->addJsLink('jquery.ui.tabs.js');
- $page->addJsLink('password.js');
+ $page->addJsLink('jquery.ui.xorg.js');
// Displays last login and last host information.
$res = XDB::query("SELECT start, host
directory_name, short_name, sort_name, promo)
VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})',
$pid, $infos[1], $fullName, $fullName, $directoryName, $fullName, $directoryName, $promo);
- XDB::execute('INSERT INTO profile_education (pid, eduid, degreeid, entry_year, grad_year, flags)
- VALUES ({?}, {?}, {?}, {?}, {?}, {?})',
- $pid, $eduSchools[Profile::EDU_X], $degreeid, $entry_year, $grad_year, 'primary');
+ XDB::execute('INSERT INTO profile_education (id, pid, eduid, degreeid, entry_year, grad_year, flags)
+ VALUES (100, {?}, {?}, {?}, {?}, {?}, \'primary\')',
+ $pid, $eduSchools[Profile::EDU_X], $degreeid, $entry_year, $grad_year);
XDB::execute('INSERT INTO accounts (hruid, type, is_admin, state, full_name, directory_name, display_name, sex)
VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})',
$infos['hrid'], $type, 0, 'pending', $fullName, $directoryName, $infos[1], $sex);
$table_editor->apply($page, $action, $id);
}
+ private static function isCountryIncomplete(array &$item)
+ {
+ $warning = false;
+ foreach (array('worldRegion', 'country', 'capital', 'phonePrefix', 'licensePlate', 'countryPlain') as $field) {
+ if ($item[$field] == '') {
+ $item[$field . '_warning'] = true;
+ $warning = true;
+ }
+ }
+ if (is_null($item['belongsTo'])) {
+ foreach (array('nationality', 'nationalityEn') as $field) {
+ if ($item[$field] == '') {
+ $item[$field . '_warning'] = true;
+ $warning = true;
+ }
+ }
+ }
+ return $warning;
+ }
+
+ private static function updateCountry(array $item)
+ {
+ XDB::execute('UPDATE geoloc_countries
+ SET countryPlain = {?}
+ WHERE iso_3166_1_a2 = {?}',
+ mb_strtoupper(replace_accent($item['country'])), $item['iso_3166_1_a2']);
+ }
+
+ private static function isLanguageIncomplete(array &$item)
+ {
+ if ($item['language'] == '') {
+ $item['language_warning'] = true;
+ return true;
+ }
+ return false;
+ }
+
+ private static function updateLanguage(array $item) {}
+
+ function handler_geocoding(&$page, $category = null, $action = null, $id = null)
+ {
+ // Warning, this handler requires the following packages:
+ // * pkg-isocodes
+ // * isoquery
+
+ static $properties = array(
+ 'country' => array(
+ 'name' => 'pays',
+ 'isocode' => '3166',
+ 'table' => 'geoloc_countries',
+ 'id' => 'iso_3166_1_a2',
+ 'main_fields' => array('iso_3166_1_a3', 'iso_3166_1_num', 'countryEn'),
+ 'other_fields' => array('worldRegion', 'country', 'capital', 'nationality', 'nationalityEn',
+ 'phonePrefix', 'phoneFormat', 'licensePlate', 'belongsTo')
+ ),
+ 'language' => array(
+ 'name' => 'langages',
+ 'isocode' => '639',
+ 'table' => 'profile_langskill_enum',
+ 'id' => 'iso_639_2b',
+ 'main_fields' => array('iso_639_2t', 'iso_639_1', 'language_en'),
+ 'other_fields' => array('language')
+
+ )
+ );
+
+ if (is_null($category) || !array_key_exists($category, $properties)) {
+ pl_redirect('admin');
+ }
+
+ $data = $properties[$category];
+
+ if ($action == 'edit' || $action == 'add') {
+ $main_fields = array_merge(array($data['id']), $data['main_fields']);
+ $all_fields = array_merge($main_fields, $data['other_fields']);
+
+ if (is_null($id)) {
+ if (Post::has('new_id')) {
+ $id = Post::v('new_id');
+ } else {
+ pl_redirect('admin/geocoding/' . $category);
+ }
+ }
+
+ $list = array();
+ exec('isoquery --iso=' . $data['isocode'] . ' ' . $id, $list);
+ if (count($list) == 1) {
+ $array = explode("\t", $list[0]);
+ foreach ($main_fields as $i => $field) {
+ $iso[$field] = $array[$i];
+ }
+ } else {
+ $iso = array();
+ }
+
+ if ($action == 'add') {
+ if (Post::has('new_id')) {
+ S::assert_xsrf_token();
+ }
+
+ if (count($iso)) {
+ $item = $iso;
+ } else {
+ $item = array($data['id'] => $id);
+ }
+ XDB::execute('INSERT INTO ' . $data['table'] . '(' . implode(', ', array_keys($item)) . ')
+ VALUES ' . XDB::formatArray($item));
+ $page->trigSuccess($id . ' a bien été ajouté à la base.');
+ } elseif ($action == 'edit') {
+ if (Post::has('edit')) {
+ S::assert_xsrf_token();
+
+ $item = array();
+ $set = array();
+ foreach ($all_fields as $field) {
+ $item[$field] = Post::t($field);
+ $set[] = $field . XDB::format(' = {?}', ($item[$field] ? $item[$field] : null));
+ }
+ XDB::execute('UPDATE ' . $data['table'] . '
+ SET ' . implode(', ', $set) . '
+ WHERE ' . $data['id'] . ' = {?}',
+ $id);
+ call_user_func_array(array('self', 'update' . ucfirst($category)), array($item));
+ $page->trigSuccess($id . ' a bien été mis à jour.');
+ } elseif (Post::has('del')) {
+ S::assert_xsrf_token();
+
+ XDB::execute('DELETE FROM ' . $data['table'] . '
+ WHERE ' . $data['id'] . ' = {?}',
+ $id);
+ $page->trigSuccessRedirect($id . ' a bien été supprimé.', 'admin/geocoding/' . $category);
+ } else {
+ $item = XDB::fetchOneAssoc('SELECT *
+ FROM ' . $data['table'] . '
+ WHERE ' . $data['id'] . ' = {?}',
+ $id);
+ }
+ }
+
+ $page->changeTpl('admin/geocoding_edit.tpl');
+ $page->setTitle('Administration - ' . ucfirst($data['name']));
+ $page->assign('category', $category);
+ $page->assign('name', $data['name']);
+ $page->assign('all_fields', $all_fields);
+ $page->assign('id', $id);
+ $page->assign('iso', $iso);
+ $page->assign('item', $item);
+ return;
+ }
+
+ $page->changeTpl('admin/geocoding.tpl');
+ $page->setTitle('Administration - ' . ucfirst($data['name']));
+ $page->assign('category', $category);
+ $page->assign('name', $data['name']);
+ $page->assign('id', $data['id']);
+ $page->assign('main_fields', $data['main_fields']);
+ $page->assign('all_fields', array_merge($data['main_fields'], $data['other_fields']));
+
+ // First build the list provided by the iso codes.
+ $list = array();
+ exec('isoquery --iso=' . $data['isocode'], $list);
+
+ foreach ($list as $key => $item) {
+ $array = explode("\t", $item);
+ unset($list[$key]);
+ $list[$array[0]] = array();
+ foreach ($data['main_fields'] as $i => $field) {
+ $list[$array[0]][$field] = $array[$i + 1];
+ }
+ }
+ ksort($list);
+
+ // Retrieve all data from the database.
+ $db_list = XDB::rawFetchAllAssoc('SELECT *
+ FROM ' . $data['table'] . '
+ ORDER BY ' . $data['id'],
+ $data['id']);
+
+ // Sort both iso and database data into 5 categories:
+ // $missing: data from the iso list not in the database,
+ // $non_existing: data from the database not in the iso list,
+ // $erroneous: data that differ on main fields,
+ // $incomplete: data with empty fields in the data base,
+ // $remaining: remaining correct and complete data from the database.
+
+ $missing = $non_existing = $erroneous = $incomplete = $remaining = array();
+ foreach (array_keys($list) as $id) {
+ if (!array_key_exists($id, $db_list)) {
+ $missing[$id] = $list[$id];
+ }
+ }
+
+ foreach ($db_list as $id => $item) {
+ if (!array_key_exists($id, $list)) {
+ $non_existing[$id] = $item;
+ } else {
+ $error = false;
+ foreach ($data['main_fields'] as $field) {
+ if ($item[$field] != $list[$id][$field]) {
+ $item[$field . '_error'] = true;
+ $error = true;
+ }
+ }
+ if ($error == true) {
+ $erroneous[$id] = $item;
+ } elseif (call_user_func_array(array('self', 'is' . ucfirst($category) . 'Incomplete'), array(&$item))) {
+ $incomplete[$id] = $item;
+ } else {
+ $remaining[$id] = $item;
+ }
+ }
+ }
+
+ $page->assign('lists', array(
+ 'manquant' => $missing,
+ 'disparu' => $non_existing,
+ 'erroné' => $erroneous,
+ 'incomplet' => $incomplete,
+ 'restant' => $remaining
+ ));
+ }
+
function handler_accounts(PlPage $page)
{
$page->changeTpl('admin/accounts.tpl');
$page->setTitle('Administration - Comptes');
- $page->addJsLink('password.js');
if (Post::has('create_account')) {
S::assert_xsrf_token();
'%grp/member/new/ajax' => $this->make_hook('admin_member_new_ajax', AUTH_MDP, 'user', NO_AUTH),
'%grp/member/del' => $this->make_hook('admin_member_del', AUTH_MDP, 'groupadmin'),
- '%grp/rss' => $this->make_hook('rss', AUTH_PUBLIC, 'user', NO_HTTPS),
+ '%grp/rss' => $this->make_token_hook('rss', AUTH_PUBLIC),
'%grp/announce/new' => $this->make_hook('edit_announce', AUTH_MDP, 'groupadmin'),
'%grp/announce/edit' => $this->make_hook('edit_announce', AUTH_MDP, 'groupadmin'),
'%grp/announce/photo' => $this->make_hook('photo_announce', AUTH_PUBLIC),
$page->trigError('Ni le nom ni le diminutif du groupe ne peuvent être vide.');
return;
}
+ $axDate = make_datetime(Post::v('axDate'));
+ if (Post::t('axDate') != '') {
+ $axDate = make_datetime(Post::v('axDate'))->format('Y-m-d');
+ } else {
+ $axDate = null;
+ }
XDB::execute(
"UPDATE groups
SET nom={?}, diminutif={?}, cat={?}, dom={?},
descr={?}, site={?}, mail={?}, resp={?},
- forum={?}, mail_domain={?}, ax={?}, pub={?},
+ forum={?}, mail_domain={?}, ax={?}, axDate = {?}, pub={?},
sub_url={?}, inscriptible={?}, unsub_url={?},
- flags={?}
+ flags = {?}, welcome_msg = {?}
WHERE id={?}",
Post::v('nom'), Post::v('diminutif'),
Post::v('cat'), (Post::i('dom') == 0) ? null : Post::i('dom'),
Post::v('descr'), $site,
Post::v('mail'), Post::v('resp'),
Post::v('forum'), Post::v('mail_domain'),
- Post::has('ax'), Post::v('pub'),
+ Post::has('ax'), $axDate, Post::v('pub'),
Post::v('sub_url'), Post::v('inscriptible'),
- Post::v('unsub_url'), $flags, $globals->asso('id'));
+ Post::v('unsub_url'), $flags, Post::t('welcome_msg'),
+ $globals->asso('id'));
if (Post::v('mail_domain')) {
XDB::execute('INSERT IGNORE INTO virtual_domains (domain) VALUES({?})',
Post::v('mail_domain'));
"UPDATE groups
SET descr={?}, site={?}, mail={?}, resp={?},
forum={?}, pub= {?}, sub_url={?},
- unsub_url={?},flags={?}
+ unsub_url = {?}, flags = {?}, welcome_msg = {?}
WHERE id={?}",
Post::v('descr'), $site,
Post::v('mail'), Post::v('resp'),
Post::v('forum'), Post::v('pub'),
Post::v('sub_url'), Post::v('unsub_url'),
- $flags, $globals->asso('id'));
+ $flags, Post::t('welcome_msg'),
+ $globals->asso('id'));
}
. "\n"
. " Suite à ta demande d'adhésion à " . $globals->asso('nom')
. ", j'ai le plaisir de t'annoncer que ton inscription a été validée !\n"
+ . (is_null($globals->asso('welcome_msg')) ? '' : "\n" . $globals->asso('welcome_msg') . "\n")
. "\n"
. "Bien cordialement,\n"
. "-- \n"
$uf = New UserFilter(New UFC_Group($globals->asso('id'), true));
$admins = $uf->iterUsers();
$admin = $admins->next();
- $to = $admin->bestalias;
+ $to = $admin->bestEmail();
while ($admin = $admins->next()) {
- $to .= ', ' . $admin->bestalias;
+ $to .= ', ' . $admin->bestEmail();
}
$append = "\n"
// Update group params for user
$perms = Post::v('group_perms');
$comm = Post::t('comm');
- if ($user->group_perms != $perms || $user->group_comm != $comm) {
+ $position = (Post::t('group_position') == '') ? null : Post::v('group_position');
+ if ($user->group_perms != $perms || $user->group_comm != $comm || $user->group_position != $position) {
XDB::query('UPDATE group_members
- SET perms = {?}, comm = {?}
+ SET perms = {?}, comm = {?}, position = {?}
WHERE uid = {?} AND asso_id = {?}',
- ($perms == 'admin') ? 'admin' : 'membre', $comm,
+ ($perms == 'admin') ? 'admin' : 'membre', $comm, $position,
$user->id(), $globals->asso('id'));
if (XDB::affectedRows()) {
if ($perms != $user->group_perms) {
if ($comm != $user->group_comm) {
$page->trigSuccess('Commentaire mis à jour.');
}
+ if ($position != $user->group_position) {
+ $page->trigSuccess('Poste mis à jour.');
+ }
}
}
}
}
+ $res = XDB::rawFetchAllAssoc('SHOW COLUMNS FROM group_members LIKE \'position\'');
+ $positions = str_replace(array('enum(', ')', '\''), '', $res[0]['Type']);
+
$page->assign('user', $user);
$page->assign('listes', $mmlist->get_lists($user->forlifeEmail()));
$page->assign('alias', $user->emailAliases($globals->asso('mail_domain'), 'user', true));
+ $page->assign('positions', explode(',', $positions));
}
- function handler_rss($page, $user = null, $hash = null)
+ function handler_rss(PlPage $page, PlUser $user)
{
global $globals;
$page->assign('asso', $globals->asso());
$this->load('feed.inc.php');
$feed = new XnetGrpEventFeed();
- return $feed->run($page, $user, $hash, false);
+ return $feed->run($page, $user, false);
}
private function upload_image(PlPage $page, PlUpload $upload)