From edc03014ff3acd6d6a15de006a40105b505acaf1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?St=C3=A9phane=20Jacob?= Date: Tue, 31 May 2011 11:31:11 +0200 Subject: [PATCH] Enables addition of secondary educations. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Jacob --- classes/profile.php | 14 +++++ modules/admin.php | 112 +++++++++++++++++++++++++++++++++- templates/admin/add_secondary_edu.tpl | 72 ++++++++++++++++++++++ templates/admin/index.tpl | 4 +- 4 files changed, 200 insertions(+), 2 deletions(-) create mode 100644 templates/admin/add_secondary_edu.tpl diff --git a/classes/profile.php b/classes/profile.php index 988c1c6..d0435f5 100644 --- a/classes/profile.php +++ b/classes/profile.php @@ -273,6 +273,20 @@ class Profile implements PlExportable } } + public static function educationDuration($education) + { + switch ($education) { + case self::DEGREE_X: + return 3; + case self::DEGREE_M: + return 2; + case self::DEGREE_D: + return 3; + default: + return 0; + } + } + /** Number of years between the promotion year until the * graduation year. In standard schools it's 0, but for * Polytechnique the promo year is the entry year. diff --git a/modules/admin.php b/modules/admin.php index 2318b3f..9778979 100644 --- a/modules/admin.php +++ b/modules/admin.php @@ -54,7 +54,8 @@ class AdminModule extends PLModule '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') + 'admin/phd' => $this->make_hook('phd', AUTH_MDP, 'admin'), + 'admin/add_secondary_edu' => $this->make_hook('add_secondary_edu', AUTH_MDP, 'admin') ); } @@ -1885,6 +1886,115 @@ class AdminModule extends PLModule $page->assign('list', $list); $page->assign('promo', $promo); } + + function handler_add_secondary_edu($page) + { + $page->changeTpl('admin/add_secondary_edu.tpl'); + + if (!(Post::has('verify') || Post::has('add'))) { + return; + } elseif (!Post::has('people')) { + $page->trigWarning("Aucune information n'a été fournie."); + return; + } + + require_once 'name.func.inc.php'; + $lines = explode("\n", Post::t('people')); + $separator = Post::t('separator'); + $degree = Post::v('degree'); + $promotion = Post::i('promotion'); + $schoolsList = array_flip(DirEnum::getOptions(DirEnum::EDUSCHOOLS)); + $degreesList = array_flip(DirEnum::getOptions(DirEnum::EDUDEGREES)); + $edu_id = $schoolsList[Profile::EDU_X]; + $degree_id = $degreesList[$degree]; + + $res = array( + 'incomplete' => array(), + 'empty' => array(), + 'multiple' => array(), + 'already' => array(), + 'new' => array() + ); + $old_pids = array(); + $new_pids = array(); + foreach ($lines as $line) { + $line = trim($line); + $line_array = explode($separator, $line); + array_walk($line_array, 'trim'); + if (count($line_array) != 3) { + $page->trigError("La ligne « $line » est incomplète."); + $res['incomplete'][] = $line; + continue; + } + $cond = new PFC_And(new UFC_NameTokens(split_name_for_search($line_array[0]), array(), false, false, Profile::LASTNAME)); + $cond->addChild(new UFC_NameTokens(split_name_for_search($line_array[1]), array(), false, false, Profile::FIRSTNAME)); + $cond->addChild(new UFC_Promo('=', UserFilter::DISPLAY, $line_array[2])); + $uf = new UserFilter($cond); + $pid = $uf->getPIDs(); + $count = count($pid); + if ($count == 0) { + $page->trigError("La ligne « $line » ne correspond à aucun profil existant."); + $res['empty'][] = $line; + continue; + } elseif ($count > 1) { + $page->trigError("La ligne « $line » correspond à plusieurs profils existant."); + $res['multiple'][] = $line; + continue; + } else { + $count = XDB::fetchOneCell('SELECT COUNT(*) AS count + FROM profile_education + WHERE pid = {?} AND eduid = {?} AND degreeid = {?}', + $pid, $edu_id, $degree_id); + if ($count == 1) { + $res['already'][] = $line; + $old_pids[] = $pid[0]; + } else { + $res['new'][] = $line; + $new_pids[] = $pid[0]; + } + } + } + + $display = array(); + foreach ($res as $type => $res_type) { + if (count($res_type) > 0) { + $display = array_merge($display, array('--------------------' . $type . ':'), $res_type); + } + } + $page->assign('people', implode("\n", $display)); + $page->assign('promotion', $promotion); + $page->assign('degree', $degree); + + if (Post::has('add')) { + $entry_year = $promotion - Profile::educationDuration($degree); + + if (Post::b('force_addition')) { + $pids = array_unique(array_merge($old_pids, $new_pids)); + } else { + $pids = array_unique($new_pids); + + // Updates years. + XDB::execute('UPDATE profile_education + SET entry_year = {?}, grad_year = {?}, promo_year = {?} + WHERE pid IN {?} AND eduid = {?} AND degreeid = {?}', + $entry_year, $promotion, $promotion, $old_pids, $edu_id, $degree_id); + } + + // Precomputes values common to all users. + $select = XDB::format('MAX(id) + 1, pid, {?}, {?}, {?}, {?}, {?}, \'secondary\'', + $edu_id, $degree_id, $entry_year, $promotion, $promotion ); + XDB::startTransaction(); + foreach ($pids as $pid) { + XDB::execute('INSERT INTO profile_education (id, pid, eduid, degreeid, entry_year, grad_year, promo_year, flags) + SELECT ' . $select . ' + FROM profile_education + WHERE pid = {?}', + $pid); + } + XDB::commit(); + } + + } } // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: diff --git a/templates/admin/add_secondary_edu.tpl b/templates/admin/add_secondary_edu.tpl new file mode 100644 index 0000000..7616d46 --- /dev/null +++ b/templates/admin/add_secondary_edu.tpl @@ -0,0 +1,72 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2011 Polytechnique.org *} +{* http://opensource.polytechnique.org/ *} +{* *} +{* This program is free software; you can redistribute it and/or modify *} +{* it under the terms of the GNU General Public License as published by *} +{* the Free Software Foundation; either version 2 of the License, or *} +{* (at your option) any later version. *} +{* *} +{* This program is distributed in the hope that it will be useful, *} +{* but WITHOUT ANY WARRANTY; without even the implied warranty of *} +{* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *} +{* GNU General Public License for more details. *} +{* *} +{* You should have received a copy of the GNU General Public License *} +{* along with this program; if not, write to the Free Software *} +{* Foundation, Inc., *} +{* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *} +{* *} +{**************************************************************************} + +

Ajout de formations secondaires

+ +
+ + + + + + + + + + + + + +
+ Promotion : + + +
+ Formation : + + - + +
+ Forcer l'ajout :
(en cas de formation du même niveau préexistante) +
+ +
+ + + + + + + + + + +
NomPrénomPromotion principale
+ +

+ Séparateur : +

+      +

+
+ +{* vim:set et sws=2 sts=2 sw=2 enc=utf-8: *} diff --git a/templates/admin/index.tpl b/templates/admin/index.tpl index 42d066d..7132a26 100644 --- a/templates/admin/index.tpl +++ b/templates/admin/index.tpl @@ -116,9 +116,11 @@ - Promotions + Formations Doctorants +   |   + Ajout de formation -- 2.1.4