X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=modules%2Fadmin.php;h=f63a6e2f557b0bef376fac460fb19165c606928e;hb=5cfb3dd10421468779a740595b3e5e68aba9838e;hp=5dc285995a483e8856062a8aa97c98aab84bbe02;hpb=08d33afc257745d9c98b8eabb39c289e1605b0b0;p=platal.git diff --git a/modules/admin.php b/modules/admin.php index 5dc2859..f63a6e2 100644 --- a/modules/admin.php +++ b/modules/admin.php @@ -24,35 +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/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') ); } @@ -585,9 +587,9 @@ class AdminModule extends PLModule } else if (!Post::blank('del_fwd')) { $redirect->delete_email(Post::t('del_fwd')); } else if (!Post::blank('activate_fwd')) { - $redirect->modify_one_email(Post::t('activate_fwd', true)); + $redirect->modify_one_email(Post::t('activate_fwd'), true); } else if (!Post::blank('deactivate_fwd')) { - $redirect->modify_one_email(Post::t('deactivate_fwd', false)); + $redirect->modify_one_email(Post::t('deactivate_fwd'), false); } else if (Post::has('disable_fwd')) { $redirect->disable(); } else if (Post::has('enable_fwd')) { @@ -604,7 +606,7 @@ class AdminModule extends PLModule if (strpos($alias, '@') !== false) { list($alias, $domain) = explode('@', $alias); } else { - $domain = $globals->mail->domain; + $domain = $user->mainEmailDomain(); } // Checks for alias' user validity. @@ -620,15 +622,15 @@ class AdminModule extends PLModule } else { $page->trigError("Impossible d'ajouter l'alias '$alias@$domain', il est probablement déjà attribué."); } - } elseif ($domain == $globals->mail->domain || $domain == $globals->mail->domain2) { + } elseif ($domain == $user->mainEmailDomain()) { XDB::execute('INSERT INTO email_source_account (email, uid, domain, type, flags) - SELECT {?}, {?}, id, \'alias_aux\', \'\' + SELECT {?}, {?}, id, \'alias\', \'\' FROM email_virtual_domains WHERE name = {?}', - $alias, $user->id(), $globals->mail->alias_dom); + $alias, $user->id(), $domain); $page->trigSuccess("Nouvel alias '$alias' ajouté"); } else { - $page->trigError("Le domaine '$domain' n'est pas valide"); + $page->trigError("Le domaine '$domain' n'est pas valide pour cet utilisateur."); } } else if (!Post::blank('del_alias')) { $delete_alias = Post::t('del_alias'); @@ -637,7 +639,7 @@ class AdminModule extends PLModule FROM email_source_account AS s INNER JOIN email_virtual_domains AS m ON (s.domain = m.id) INNER JOIN email_virtual_domains AS d ON (d.aliasing = m.id) - WHERE s.email = {?} AND s.uid = {?} AND d.name = {?} AND type = \'alias\'', + WHERE s.email = {?} AND s.uid = {?} AND d.name = {?} AND type != \'forlife\'', $email, $user->id(), $domain); XDB::execute('UPDATE email_redirect_account AS r INNER JOIN email_virtual_domains AS m ON (m.name = {?}) @@ -655,10 +657,9 @@ class AdminModule extends PLModule WHERE uid = {?}", $user->id()); // Then gives the bestalias flag to the given email. list($email, $domain) = explode('@', $best_alias); - XDB::execute("UPDATE email_source_account AS s - INNER JOIN email_virtual_domains AS d ON (s.domain = d.id) - SET s.flags = CONCAT_WS(',', IF(s.flags = '', NULL, s.flags), 'bestalias') - WHERE s.uid = {?} AND s.email = {?} AND d.name = {?}", $user->id(), $email, $domain); + XDB::execute("UPDATE email_source_account + SET flags = CONCAT_WS(',', IF(flags = '', NULL, flags), 'bestalias') + WHERE uid = {?} AND email = {?}", $user->id(), $email); // As having a non-null bestalias value is critical in // plat/al's code, we do an a posteriori check on the @@ -778,9 +779,9 @@ class AdminModule extends PLModule { switch ($sex) { case 'F': - return PlUser::GENDER_FEMALE; + return 'female'; case 'M': - return PlUser::GENDER_MALE; + return 'male'; default: $page->trigError("La ligne $line n'a pas été ajoutée car le sexe $sex n'est pas pris en compte."); return null; @@ -806,7 +807,6 @@ class AdminModule extends PLModule $nameTypes = array_flip($nameTypes); if (Env::t('add_type') == 'promo') { - $type = 'x'; $eduSchools = DirEnum::getOptions(DirEnum::EDUSCHOOLS); $eduSchools = array_flip($eduSchools); $eduDegrees = DirEnum::getOptions(DirEnum::EDUDEGREES); @@ -818,6 +818,7 @@ class AdminModule extends PLModule $grad_year = $promotion + 3; $promo = 'X' . $promotion; $hrpromo = $promotion; + $type = 'x'; break; case 'M': $degreeid = $eduDegrees[Profile::DEGREE_M]; @@ -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(); @@ -847,7 +848,13 @@ class AdminModule extends PLModule $fullName = $infos[1] . ' ' . $infos[0]; $directoryName = $infos[0] . ' ' . $infos[1]; $birthDate = self::formatBirthDate($infos[2]); - $xorgId = Profile::getXorgId($infos[4]); + if ($type == 'x') { + $xorgId = Profile::getXorgId($infos[4]); + } 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é."); continue; @@ -855,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 ({?}, {?}, {?}), @@ -938,7 +945,6 @@ class AdminModule extends PLModule function handler_homonyms($page, $op = 'list', $target = null) { - global $globals; $page->changeTpl('admin/homonymes.tpl'); $page->setTitle('Administration - Homonymes'); $this->load("homonyms.inc.php"); @@ -973,19 +979,14 @@ class AdminModule extends PLModule case 'correct': S::assert_xsrf_token(); - XDB::execute('DELETE e - FROM email_source_account AS e - INNER JOIN email_virtual_domains AS d ON (e.domain = d.id) - WHERE e.email = {?} AND d.name = {?}', - $loginbis, $globals->mail->domain); + XDB::execute('DELETE FROM email_source_account + WHERE email = {?} AND type = \'alias\'', + $loginbis); XDB::execute('INSERT INTO email_source_other (hrmid, email, domain, type, expire) - SELECT CONCAT(\'h.\', {?}, \'.\', {?}), {?}, id, \'homonym\', NOW() + SELECT {?}, {?}, id, \'homonym\', NOW() FROM email_virtual_domains WHERE name = {?}', - $loginbis, $globals->mail->domain, $loginbis, $globals->mail->domain); - XDB::execute('INSERT IGNORE INTO homonyms_list (hrmid, uid) - VALUES ({?}, {?})', - 'h.' . $loginbis . '.' . $globals->mail->domain, $target); + User::makeHomonymHrmid($loginbis), $loginbis, $user->mainEmailDomain()); fix_bestalias($user); send_robot_homonyme($user, $loginbis); $op = 'list'; @@ -1000,10 +1001,8 @@ class AdminModule extends PLModule FROM email_source_other AS o INNER JOIN homonyms_list AS h ON (o.hrmid = h.hrmid) INNER JOIN email_source_account AS f ON (h.uid = f.uid AND f.type = \'forlife\') - INNER JOIN email_virtual_domains AS d ON (f.domain = d.id) - WHERE o.expire IS NOT NULL AND d.name = {?} - ORDER BY homonym, forlife', - $globals->mail->domain); + WHERE o.expire IS NOT NULL + ORDER BY homonym, forlife'); $homonyms = array(); while ($item = $res->next()) { $homonyms[$item['homonym']][] = $item; @@ -1016,10 +1015,8 @@ class AdminModule extends PLModule INNER JOIN homonyms_list AS l ON (e.uid = l.uid) INNER JOIN homonyms_list AS h ON (l.hrmid = h.hrmid) INNER JOIN email_source_account AS f ON (h.uid = f.uid AND f.type = \'forlife\') - INNER JOIN email_virtual_domains AS d ON (f.domain = d.id) - WHERE e.expire IS NOT NULL AND d.name = {?} - ORDER BY homonym, forlife', - $globals->mail->domain); + WHERE e.expire IS NOT NULL + ORDER BY homonym, forlife'); $homonyms_to_fix = array(); while ($item = $res->next()) { $homonyms_to_fix[$item['homonym']][] = $item; @@ -1271,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 @@ -1705,6 +1702,16 @@ class AdminModule extends PLModule ORDER BY a.hruid')); } + function handler_xnet_without_group($page) + { + $page->changeTpl('admin/xnet_without_group.tpl'); + $page->assign('accounts', XDB::iterator('SELECT a.hruid, a.state + FROM accounts AS a + LEFT JOIN group_members AS m ON (a.uid = m.uid) + WHERE a.type = \'xnet\' AND m.uid IS NULL + ORDER BY a.state, a.hruid')); + } + function handler_jobs($page, $id = -1) { $page->changeTpl('admin/jobs.tpl'); @@ -1818,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: