Merge remote branch 'origin/xorg/maint' into xorg/master
authorFlorent Bruneau <florent.bruneau@polytechnique.org>
Sun, 20 Feb 2011 18:17:51 +0000 (19:17 +0100)
committerFlorent Bruneau <florent.bruneau@polytechnique.org>
Sun, 20 Feb 2011 18:17:51 +0000 (19:17 +0100)
Conflicts:
configs/mails.conf

Signed-off-by: Florent Bruneau <florent.bruneau@polytechnique.org>
1  2 
configs/mails.conf
modules/admin.php
modules/xnetgrp.php

diff --combined configs/mails.conf
@@@ -71,6 -71,6 +71,9 @@@ replyto=registration+watch@staff.m4x.or
  from="Polytechnique.org" <validation_modification@polytechnique.org>
  cc="Polytechnique.org" <validation_modification@polytechnique.org>
  
 +[xnet_notification]
 +from="Polytechnique.org" <contact@polytechnique.org>
 +
+ [newsletter_schedule_mailing]
+ from="Gestion des NLs" <support@polytechnique.org>
+ to=br@staff.polytechnique.org
diff --combined modules/admin.php
@@@ -47,7 -47,6 +47,7 @@@ class AdminModule extends PLModul
              '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();
diff --combined modules/xnetgrp.php
@@@ -48,7 -48,7 +48,7 @@@ class XnetGrpModule extends PLModul
              '%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)