Fix UFBF_QuickSearch.
[platal.git] / modules / admin.php
index 7d4923a..f63a6e2 100644 (file)
@@ -24,36 +24,37 @@ class AdminModule extends PLModule
     function handlers()
     {
         return array(
-            'phpinfo'                      => $this->make_hook('phpinfo',                AUTH_MDP, 'admin'),
+            'phpinfo'                      => $this->make_hook('phpinfo',                AUTH_MDP,    'admin'),
             'get_rights'                   => $this->make_hook('get_rights',             AUTH_COOKIE, 'admin'),
             'set_skin'                     => $this->make_hook('set_skin',               AUTH_COOKIE, 'admin'),
-            'admin'                        => $this->make_hook('default',                AUTH_MDP, 'admin'),
-            'admin/dead-but-active'        => $this->make_hook('dead_but_active',        AUTH_MDP, 'admin'),
-            'admin/deaths'                 => $this->make_hook('deaths',                 AUTH_MDP, 'admin'),
-            'admin/downtime'               => $this->make_hook('downtime',               AUTH_MDP, 'admin'),
-            'admin/homonyms'               => $this->make_hook('homonyms',               AUTH_MDP, 'admin'),
-            'admin/logger'                 => $this->make_hook('logger',                 AUTH_MDP, 'admin'),
-            'admin/logger/actions'         => $this->make_hook('logger_actions',         AUTH_MDP, 'admin'),
-            'admin/postfix/blacklist'      => $this->make_hook('postfix_blacklist',      AUTH_MDP, 'admin'),
-            'admin/postfix/delayed'        => $this->make_hook('postfix_delayed',        AUTH_MDP, 'admin'),
-            'admin/postfix/regexp_bounces' => $this->make_hook('postfix_regexpsbounces', AUTH_MDP, 'admin'),
-            'admin/postfix/whitelist'      => $this->make_hook('postfix_whitelist',      AUTH_MDP, 'admin'),
-            'admin/mx/broken'              => $this->make_hook('mx_broken',              AUTH_MDP, 'admin'),
-            'admin/skins'                  => $this->make_hook('skins',                  AUTH_MDP, 'admin'),
-            'admin/user'                   => $this->make_hook('user',                   AUTH_MDP, 'admin'),
-            'admin/add_accounts'           => $this->make_hook('add_accounts',           AUTH_MDP, 'admin'),
-            'admin/validate'               => $this->make_hook('validate',               AUTH_MDP, 'admin,edit_directory'),
-            'admin/validate/answers'       => $this->make_hook('validate_answers',       AUTH_MDP, 'admin'),
-            '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'),
-            'admin/xnet_without_group'     => $this->make_hook('xnet_without_group',     AUTH_MDP, 'admin'),
-            'admin/jobs'                   => $this->make_hook('jobs',                   AUTH_MDP, 'admin,edit_directory'),
-            'admin/profile'                => $this->make_hook('profile',                AUTH_MDP, 'admin,edit_directory')
+            'admin'                        => $this->make_hook('default',                AUTH_MDP,    'admin'),
+            'admin/dead-but-active'        => $this->make_hook('dead_but_active',        AUTH_MDP,    'admin'),
+            'admin/deaths'                 => $this->make_hook('deaths',                 AUTH_MDP,    'admin'),
+            'admin/downtime'               => $this->make_hook('downtime',               AUTH_MDP,    'admin'),
+            'admin/homonyms'               => $this->make_hook('homonyms',               AUTH_MDP,    'admin'),
+            'admin/logger'                 => $this->make_hook('logger',                 AUTH_MDP,    'admin'),
+            'admin/logger/actions'         => $this->make_hook('logger_actions',         AUTH_MDP,    'admin'),
+            'admin/postfix/blacklist'      => $this->make_hook('postfix_blacklist',      AUTH_MDP,    'admin'),
+            'admin/postfix/delayed'        => $this->make_hook('postfix_delayed',        AUTH_MDP,    'admin'),
+            'admin/postfix/regexp_bounces' => $this->make_hook('postfix_regexpsbounces', AUTH_MDP,    'admin'),
+            'admin/postfix/whitelist'      => $this->make_hook('postfix_whitelist',      AUTH_MDP,    'admin'),
+            'admin/mx/broken'              => $this->make_hook('mx_broken',              AUTH_MDP,    'admin'),
+            'admin/skins'                  => $this->make_hook('skins',                  AUTH_MDP,    'admin'),
+            'admin/user'                   => $this->make_hook('user',                   AUTH_MDP,    'admin'),
+            'admin/add_accounts'           => $this->make_hook('add_accounts',           AUTH_MDP,    'admin'),
+            'admin/validate'               => $this->make_hook('validate',               AUTH_MDP,    'admin,edit_directory'),
+            'admin/validate/answers'       => $this->make_hook('validate_answers',       AUTH_MDP,    'admin'),
+            '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'),
+            'admin/xnet_without_group'     => $this->make_hook('xnet_without_group',     AUTH_MDP,    'admin'),
+            'admin/jobs'                   => $this->make_hook('jobs',                   AUTH_MDP,    'admin,edit_directory'),
+            'admin/profile'                => $this->make_hook('profile',                AUTH_MDP,    'admin,edit_directory'),
+            'admin/phd'                    => $this->make_hook('phd',                    AUTH_MDP,    'admin')
         );
     }
 
@@ -831,12 +832,12 @@ class AdminModule extends PLModule
                     $degreeid = $eduDegrees[Profile::DEGREE_D];
                     $grad_year = $promotion;
                     $entry_year = $promotion - 3;
-                    $promo = 'D' . $promotion;
+                    $promo = 'D (en cours)';
                     $hrpromo = $promo;
                     $type = 'phd';
                     break;
                   default:
-                    $page->killError("La formation n'est pas reconnue:" . Env::t('edu_type') . '.');
+                    $page->killError("La formation n'est pas reconnue : " . Env::t('edu_type') . '.');
                 }
 
                 XDB::startTransaction();
@@ -849,8 +850,10 @@ class AdminModule extends PLModule
                             $birthDate = self::formatBirthDate($infos[2]);
                             if ($type == 'x') {
                                 $xorgId = Profile::getXorgId($infos[4]);
-                            } else {
+                            } elseif (isset($infos[4])) {
                                 $xorgId = trim($infos[4]);
+                            } else {
+                                $xorgId = 0;
                             }
                             if (is_null($xorgId)) {
                                 $page->trigError("La ligne $line n'a pas été ajoutée car le matricule École est mal renseigné.");
@@ -859,7 +862,7 @@ class AdminModule extends PLModule
 
                             XDB::execute('INSERT INTO  profiles (hrpid, xorg_id, ax_id, birthdate_ref, sex)
                                                VALUES  ({?}, {?}, {?}, {?}, {?})',
-                                         $infos['hrid'], $xorgId, $infos[5], $birthDate, $sex);
+                                         $infos['hrid'], $xorgId, (isset($infos[5]) ? $infos[5] : null), $birthDate, $sex);
                             $pid = XDB::insertId();
                             XDB::execute('INSERT INTO  profile_name (pid, name, typeid)
                                                VALUES  ({?}, {?}, {?}),
@@ -1265,7 +1268,7 @@ class AdminModule extends PLModule
 
     private static function updateLanguage(array $item) {}
 
-    function handler_geocoding(&$page, $category = null, $action = null, $id = null)
+    function handler_geocoding($page, $category = null, $action = null, $id = null)
     {
         // Warning, this handler requires the following packages:
         //  * pkg-isocodes
@@ -1822,6 +1825,61 @@ class AdminModule extends PLModule
                             ORDER BY  pd.directory_name');
         $page->assign('updates', $res);
     }
+
+    function handler_phd($page, $promo = null, $validate = false)
+    {
+        $page->changeTpl('admin/phd.tpl');
+        $eduDegrees = DirEnum::getOptions(DirEnum::EDUDEGREES);
+        $eduDegrees = array_flip($eduDegrees);
+
+        if (is_null($promo)) {
+            $promo_list = XDB::fetchColumn('SELECT  DISTINCT(grad_year)
+                                              FROM  profile_education
+                                             WHERE  FIND_IN_SET(\'primary\', flags) AND NOT FIND_IN_SET(\'completed\', flags) AND degreeid = {?}
+                                          ORDER BY  grad_year',
+                                           $eduDegrees[Profile::DEGREE_D]);
+            $page->assign('promo_list', $promo_list);
+            $page->assign('nothing', count($promo_list) == 0);
+            return;
+        }
+
+        if ($validate) {
+            S::assert_xsrf_token();
+
+            $list = XDB::iterator('SELECT  pe.pid, pd.directory_name
+                                     FROM  profile_education AS pe
+                               INNER JOIN  profile_display   AS pd ON (pe.pid = pd.pid)
+                                    WHERE  FIND_IN_SET(\'primary\', pe.flags) AND NOT FIND_IN_SET(\'completed\', pe.flags)
+                                           AND pe.degreeid = {?} AND pe.grad_year = {?}',
+                                  $eduDegrees[Profile::DEGREE_D], $promo);
+            while ($res = $list->next()) {
+                $pid = $res['pid'];
+                $name = $res['directory_name'];
+                if (Post::b('completed_' . $pid)) {
+                    $grad_year = Post::t('grad_year_' . $pid);
+                    XDB::execute('UPDATE  profile_education
+                                     SET  flags = \'primary,completed\', grad_year = {?}
+                                   WHERE  FIND_IN_SET(\'primary\', flags) AND pid = {?}',
+                                 $grad_year, $pid);
+                    XDB::execute('UPDATE  profile_display
+                                     SET  promo = {?}
+                                   WHERE  pid = {?}',
+                                 'D' . $grad_year, $pid);
+                    $page->trigSuccess("Promotion de $name validée.");
+                }
+            }
+        }
+
+        $list = XDB::iterator('SELECT  pe.pid, pd.directory_name
+                                 FROM  profile_education AS pe
+                           INNER JOIN  profile_display   AS pd ON (pe.pid = pd.pid)
+                                WHERE  FIND_IN_SET(\'primary\', pe.flags) AND NOT FIND_IN_SET(\'completed\', pe.flags)
+                                       AND pe.degreeid = {?} AND pe.grad_year = {?}
+                             ORDER BY  pd.directory_name',
+                              $eduDegrees[Profile::DEGREE_D], $promo);
+        $page->assign('list', $list);
+        $page->assign('promo', $promo);
+    }
 }
 
 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: