From e02d9fbb5137c96382a896a6ea93413e79f0733d Mon Sep 17 00:00:00 2001 From: =?utf8?q?St=C3=A9phane=20Jacob?= Date: Fri, 19 Feb 2010 09:40:01 +0100 Subject: [PATCH] Adapts inclusion of promotion and accounts. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Jacob --- classes/profile.php | 5 ++ core | 2 +- modules/admin.php | 187 +++++++++++++++++++++++++++++++-------- templates/admin/add_accounts.tpl | 130 +++++++++++++++++++++++++++ templates/admin/index.tpl | 2 +- templates/admin/promo.tpl | 42 --------- 6 files changed, 286 insertions(+), 82 deletions(-) create mode 100644 templates/admin/add_accounts.tpl delete mode 100644 templates/admin/promo.tpl diff --git a/classes/profile.php b/classes/profile.php index ef87258..8136f0b 100644 --- a/classes/profile.php +++ b/classes/profile.php @@ -49,6 +49,11 @@ class Profile const DN_PUBLIC = 'public_name'; const DN_SHORT = 'short_name'; const DN_SORT = 'sort_name'; + /* education related names */ + const EDU_X = 'École polytechnique'; + const DEGREE_X = 'Ingénieur'; + const DEGREE_M = 'Master'; + const DEGREE_D = 'Doctorat'; static public $name_variants = array( self::LASTNAME => array(self::VN_MARITAL, self::VN_ORDINARY), diff --git a/core b/core index 8d37a36..0be5c71 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 8d37a362f0def3c6cd94f31adab8f2d47a75a28e +Subproject commit 0be5c71cbe61952dd302aa11d5acf1ace292aaf3 diff --git a/modules/admin.php b/modules/admin.php index ab396c0..f5ec942 100644 --- a/modules/admin.php +++ b/modules/admin.php @@ -42,7 +42,7 @@ class AdminModule extends PLModule 'admin/skins' => $this->make_hook('skins', AUTH_MDP, 'admin'), 'admin/synchro_ax' => $this->make_hook('synchro_ax', AUTH_MDP, 'admin'), 'admin/user' => $this->make_hook('user', AUTH_MDP, 'admin'), - 'admin/promo' => $this->make_hook('promo', AUTH_MDP, 'admin'), + 'admin/add_accounts' => $this->make_hook('add_accounts', AUTH_MDP, 'admin'), 'admin/validate' => $this->make_hook('validate', AUTH_MDP, 'admin'), 'admin/validate/answers' => $this->make_hook('validate_answers', AUTH_MDP, 'admin'), 'admin/wiki' => $this->make_hook('wiki', AUTH_MDP, 'admin'), @@ -645,21 +645,16 @@ class AdminModule extends PLModule $page->assign('bans', $bans); } - function getHruid($line, $key, $relation) + private static function getHrid($firstname, $lastname, $promo) { - $prenom = CSVImporter::getValue($line, 'prenom', $relation['prenom']); - $nom = CSVImporter::getValue($line, 'nom', $relation['nom']); - $promo = CSVImporter::getValue($line, 'promo', $relation['promo']); - - if ($prenom != 'NULL' && $nom != 'NULL' && $promo != 'NULL') { - return make_forlife($prenom, $nom, $promo); + if ($firstname != null && $lastname != null && $promo != null) { + return User::makeForlife($firstname, $lastname, $promo); } return null; } - function getMatricule($line, $key, $relation) + private static function getMatricule($mat) { - $mat = $line['matricule']; $year = intval(substr($mat, 0, 3)); $rang = intval(substr($mat, 3, 3)); if ($year > 200) { $year /= 10; }; @@ -670,40 +665,156 @@ class AdminModule extends PLModule } } - function handler_promo(&$page, $action = null, $promo = null) + private static function formatNewUser($infosLine, $separator, $promo, $size) { - if (Env::has('promo')) { - if(Env::i('promo') > 1900 && Env::i('promo') < 2050) { - $action = Env::v('valid_promo') == 'Ajouter des membres' ? 'add' : 'ax'; - pl_redirect('admin/promo/' . $action . '/' . Env::i('promo')); - } else { - $page->trigError('Promotion non valide.'); - } + $infos = explode($separator, $infosLine); + if (sizeof($infos) != $size) { + return false; } - $page->changeTpl('admin/promo.tpl'); - if ($promo > 1900 && $promo < 2050 && ($action == 'add' || $action == 'ax')) { - $page->assign('promo', $promo); - } else { - return; + array_map('trim', $infos); + $hrid = self::getHrid($infos[1], $infos[0], $promo); + $res1 = XDB::query('SELECT COUNT(*) + FROM accounts + WHERE hruid = {?}', $hrid); + $res2 = XDB::query('SELECT COUNT(*) + FROM profiles + WHERE hrpid = {?}', $hrid); + if (is_null($hrid) || $res1->fetchOneCell() > 0 || $res2->fetchOneCell() > 0) { + $page->trigError("La ligne $line n'a pas été ajoutée."); + return false; } + $infos['hrid'] = $hrid; + return $infos; + } - $importer = new CSVImporter('auth_user_md5', 'matricule'); - $importer->registerFunction('matricule', 'matricule Ecole vers X.org', array($this, 'getMatricule')); - switch ($action) { - case 'add': - $fields = array('hruid', 'nom', 'nom_ini', 'prenom', 'naissance_ini', - 'prenom_ini', 'promo', 'promo_sortie', 'flags', - 'matricule', 'matricule_ax', 'perms'); - $importer->forceValue('hruid', array($this, 'getHruid')); - $importer->forceValue('promo', $promo); - $importer->forceValue('promo_sortie', $promo + 3); - break; - case 'ax': - $fields = array('matricule', 'matricule_ax'); - break; + private static function formatSex(&$page, $sex, $line) + { + switch ($sex) { + case 'F': + return PlUser::GENDER_FEMALE; + case 'M': + return PlUser::GENDER_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; + } + } + + private static function formatBirthDate($birthDate) + { + return date("Y-m-d", strtotime($birthDate)); + } + + function handler_add_accounts(&$page, $action = null, $promo = null) + { + $page->changeTpl('admin/add_accounts.tpl'); + + if (Env::has('add_type') && Env::has('people')) { + require_once 'directory.enums.inc.php'; + $lines = explode("\n", Env::t('people')); + $separator = Env::t('separator'); + $promotion = Env::i('promotion'); + $nameTypes = DirEnum::getOptionsArray(DirEnum::NAMETYPES); + $nameTypes = array_flip($nameTypes); + + if (Env::t('add_type') == 'promo') { + $type = 'x'; + $eduSchools = DirEnum::getOptionsArray(DirEnum::EDUSCHOOLS); + $eduSchools = array_flip($eduSchools); + $eduDegrees = DirEnum::getOptionsArray(DirEnum::EDUDEGREES); + $eduDegrees = array_flip($eduDegrees); + var_dump($eduDegrees); + switch (Env::t('edu_type')) { + case 'X': + $degreeid = $eduDegrees[Profile::DEGREE_X]; + $entry_year = $promotion; + $grad_year = $promotion + 3; + $promo = 'X' . $promotion; + break; + case 'M': + $degreeid = $eduDegrees[Profile::DEGREE_M]; + $grad_year = $promotion; + $entry_year = $promotion - 2; + $promo = 'M' . $promotion; + break; + case 'D': + $degreeid = $eduDegrees[Profile::DEGREE_D]; + $grad_year = $promotion; + $entry_year = $promotion - 3; + $promo = 'D' . $promotion; + break; + default: + $page->killError("La formation n'est pas reconnue:" . Env::t('edu_type') . '.'); + } + + foreach ($lines as $line) { + if (($infos = self::formatNewUser($line, $separator, $promotion, 6)) + && ($sex = self::formatSex($page, $infos[3], $line))) { + $name = $infos[1] . ' ' . $infos[0]; + $birthDate = self::formatBirthDate($infos[2]); + $xorgId = self::getMatricule($infos[4]); + + XDB::execute('INSERT INTO profiles (hrpid, xorg_id, ax_id, birthdate_ref, sex) + VALUES ({?}, {?}, {?}, {?})', + $infos['hrid'], $xorgId, $infos[5], $birthDate, $sex); + $pid = XDB::insertId(); + XDB::execute('INSERT INTO profile_name (pid, name, typeid) + VALUES ({?}, {?}, {?})', + $pid, $infos[0], $nameTypes['name_ini']); + XDB::execute('INSERT INTO profile_name (pid, name, typeid) + VALUES ({?}, {?}, {?})', + $pid, $infos[1], $nameTypes['firstname_ini']); + XDB::execute('INSERT INTO profile_display (pid, yourself, public_name, private_name, + directory_name, short_name, sort_name, promo) + VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})', + $pid, $infos[1], $name, $name, $name, $name, $infos[0] . ' ' . $infos[1], $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 accounts (hruid, type, is_admin, state, full_name, display_name, sex) + VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?})', + $infos['hrid'], $type, 0, 'active', $name, $infos[1], $sex); + $uid = XDB::insertId(); + XDB::execute('INSERT INTO account_profiles (uid, pid, perms) + VALUES ({?}, {?}, {?})', + $uid, $pid, 'owner'); + } + } + } else if (Env::t('add_type') == 'account') { + $type = Env::t('type'); + foreach ($lines as $line) { + if (($infos = self::formatNewUser($line, $separator, $type, 4)) + && ($sex = self::formatSex(&$page, $infos[3], $line))) { + XDB::execute('INSERT INTO accounts (hruid, type, is_admin, state, email, full_name, display_name, sex) + VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})', + $infos['hrid'], $type, 0, 'active', $infos[2], $infos[1] . ' ' . $infos[0], $infos[1], $sex); + } + } + } else if (Env::t('add_type') == 'ax_id') { + $type = 'x'; + foreach ($lines as $line) { + if ($infos = self::formatNewUser($line, $separator, $promotion, 3)) { + XDB::execute('UPDATE profiles + SET ax_id = {?} + WHERE hrpid = {?}', + $infos[2], $infos['hrid']); + } + } + } + + if ($page->nb_errs == 0) { + $page->trigSuccess("L'opération a été effectuée avec succès."); + } else { + $page->trigSuccess("L'opération a été effectuée avec succès, sauf pour les " + . $page->nb_errs . 'erreurs signalées ci-dessus.'); + } + } else if (Env::has('add_type')) { + $res = XDB::query('SELECT type + FROM account_types'); + $page->assign('account_types', $res->fetchColumn()); + $page->assign('add_type', Env::s('add_type')); } - $importer->apply($page, "admin/promo/$action/$promo", $fields); } function handler_homonyms(&$page, $op = 'list', $target = null) diff --git a/templates/admin/add_accounts.tpl b/templates/admin/add_accounts.tpl new file mode 100644 index 0000000..44323cf --- /dev/null +++ b/templates/admin/add_accounts.tpl @@ -0,0 +1,130 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2010 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 *} +{* *} +{**************************************************************************} + +

Mise à jour de l'annuaire

+ +{if !$add_type} +
+ + + + + + + + + + +
+ Ajouter : + - +
+
+ Mettre à jour : + +
+
+ +{else} +
+ + + + + +{if $add_type eq 'promo'} + + + +
+ Promotion : + +
+ Formation : + - + - + +
+
+ + + + + + + + + + + + +
NomPrénomDate de naissanceSexe (F/M)Matricule ÉcoleMatricule AX
+ +{elseif $add_type eq 'account'} + + + Type de compte : + + + + +
+ + + + + + + + + + +
NomPrénomAdresse emailSexe (F/M)
+ +{elseif $add_type eq 'ax_id'} + +
+ + + + + + + + + +
NomPrénomMatricule AX
+{/if} + +

+ Séparateur : +

+ +

+
+{/if} + +{* 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 0ac5156..dc213dc 100644 --- a/templates/admin/index.tpl +++ b/templates/admin/index.tpl @@ -94,7 +94,7 @@ Comptes - Ajout promotion + Ajout de comptes   |   Édition   |   diff --git a/templates/admin/promo.tpl b/templates/admin/promo.tpl deleted file mode 100644 index 7a178dc..0000000 --- a/templates/admin/promo.tpl +++ /dev/null @@ -1,42 +0,0 @@ -{**************************************************************************} -{* *} -{* Copyright (C) 2003-2010 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 *} -{* *} -{**************************************************************************} - -

Mise à jour de l'annuaire

- -
- - - -
- Promotion : -
- - -
-
-
- -{if $promo} -{include core=csv-importer.tpl} -{/if} - -{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} -- 2.1.4