================================================================================
+VERSION 0.f.0 XX XX XXXX
+
+New:
+ * Core:
+ - Centralises email management through an email combobox -JAC
+
+Bug/Wish:
+ * Profile:
+ - #188: Adds informations about the Corps d'État -JAC
+ - #209: Thoroughly changes education's implementation -JAC
+ - #386: Adds the possibility to fill in multiple nationalities -JAC
+
+================================================================================
VERSION 0.9.18 XX XX XXXX
Bug/Wish:
* CAT: Florian El Ahdab (LeChat) <florian.el-ahdab@m4x.org>
* FAL: Raphaël Marichez (Falco) <raphael.marichez@m4x.org>
* FRU: Florent Bruneau (Fruneau) <florent.bruneau@m4x.org>
+ * GUI: Guillaume Bandet (GUI) <guillaume.bandet@m4x.org>
* JAC: Stéphane Jacob (jacou) <stephane.jacob@m4x.org>
+ * JM : Jean-Marc Bécu <jean-marc.becu@m4x.org>
* JS : Jean Sébastien Bedo <jean-sebastien.bedo@m4x.org>
* MC : Pierre Habouzit (MadCoder) <pierre.habouzit@m4x.org>
* mYk: Aymeric Augustin (mYk) <aymeric.augustin@m4x.org>
/* Validite des flags de transmission */
check("SELECT u.user_id, nom, prenom, promo,
- profile_mobile_pub, emails_alias_pub, profile_web_pub, profile_freetext_pub, profile_medals_pub
+ emails_alias_pub, profile_freetext_pub, profile_medals_pub
FROM auth_user_md5 AS u
INNER JOIN auth_user_quick AS q USING(user_id)
- WHERE (profile_mobile_pub != 'private' AND profile_mobile_pub != 'ax' AND profile_mobile_pub != 'public')
- OR (emails_alias_pub != 'private' AND emails_alias_pub != 'public')
- OR (profile_web_pub != 'private' AND profile_web_pub != 'public')
+ WHERE (emails_alias_pub != 'private' AND emails_alias_pub != 'public')
OR (profile_freetext_pub != 'private' AND profile_freetext_pub != 'public')
OR (profile_medals_pub != 'private' AND profile_medals_pub != 'public')",
"Utilisateur n'ayant pas de flag de publicite pour leurs donnees de profil");
check("select uid from adresses where pub != 'private' and pub !='ax' and pub != 'public'", "Utiliseur n'ayant pas de flag de publicite pour une adresse");
-check("select uid from tels where tel_pub != 'private' and tel_pub !='ax' and tel_pub != 'public'", "Utiliseur n'ayant pas de flag de publicite pour un numero de telephone");
+check("select uid from profile_phones where pub != 'private' and pub != 'ax' and pub != 'public'", "Utiliseur n'ayant pas de flag de publicite pour un numero de téléphone");
+check("select uid from profile_networking where pub != 'private' and pub != 'public'", "Utiliseur n'ayant pas de flag de publicité pour une adresse de networking");
/* validite de aliases */
check("SELECT a.*
LEFT JOIN auth_user_md5 AS u ON u.user_id=a.id
WHERE (a.type='alias' OR a.type='a_vie') AND u.prenom is null");
-/* validite de applis_ins */
-check("select a.* from applis_ins as a left join auth_user_md5 as u on u.user_id=a.uid where u.prenom is null");
-check("select a.* from applis_ins as a left join applis_def as ad on ad.id=a.aid where ad.text is null");
+/* validite de profile_education */
+check("select a.* from profile_education as a left join auth_user_md5 as u on u.user_id=a.uid where u.prenom is null");
+check("select a.* from profile_education as a left join profile_education_enum as ad on ad.id=a.eduid where ad.name is null");
/* validite de binet_users */
check("select b.* from binets_ins as b left join auth_user_md5 as u on u.user_id=b.user_id where u.prenom is null");
/* validite de photo */
check("select p.* from photo as p left join auth_user_md5 as u on u.user_id=p.uid where u.prenom is null");
+/* validite des formats téléphoniques */
+check("SELECT DISTINCT g.phoneprf from geoloc_pays AS g
+ WHERE EXISTS (SELECT h.phoneprf
+ FROM geoloc_pays AS h
+ WHERE h.phoneprf = g.phoneprf AND h.phoneformat != (SELECT i.phoneformat
+ FROM geoloc_pays AS i
+ WHERE i.phoneprf = g.phoneprf
+ LIMIT 1))",
+ "Préfixes téléphoniques qui ont des formats de numéros de téléphones différents selon les pays");
+
/* validite des champ pays et region */
check("SELECT a.uid, a.country FROM adresses AS a LEFT JOIN geoloc_pays AS gp ON a.country = gp.a2 WHERE gp.pays IS NULL","donne la liste des pays dans les profils qui n'ont pas d'entree correspondante dans geoloc_pays");
/* les régions ne sont valides que dans les adresses pros */
WHERE matricule_ax != '0'
GROUP BY matricule_ax
having c > 1", "à chaque personne de l'annuaire de l'AX (identification_ax) doit correspondre AU PLUS UNE personne de notre annuaire (auth_user_md5) -> si ce n'est pas le cas il faut regarder en manuel ce qui ne va pas !");
-
+
+/* each alumni has one and only one display name by default and one and only one name when we talk to him directly */
+check("SELECT u.`user_id`, u.`nom`, u.`prenom`, COUNT(n.`display`) AS c
+ FROM `auth_user_md5` AS u
+ LEFT JOIN `profile_names_display` AS n ON(u.`user_id` = n.`user_id` AND FIND_IN_SET(n.`reason`, 'default'))
+ GROUP BY u.`user_id`
+ HAVING c != 1", "chaque personne doit avoir un et un seul nom par défaut");
+check("SELECT u.`user_id`, u.`nom`, u.`prenom`, COUNT(n.`display`) AS c
+ FROM `auth_user_md5` AS u
+ LEFT JOIN `profile_names_display` AS n ON(u.`user_id` = n.`user_id` AND FIND_IN_SET(n.`reason`, 'yourself'))
+ GROUP BY u.`user_id`
+ HAVING c != 1", "chaque personne doit avoir un et un seul nom quand on lui parle");
+
+/* no alumni is allowed to have empty names */
+check("SELECT u.`user_id`, u.`nom`, u.`prenom`
+ FROM `auth_user_md5` AS u
+ INNER JOIN `profile_names_search` AS n USING(`user_id`)
+ WHERE n.`search_name` = ''", "liste des personnes qui ont un de leur nom de recherche vide");
+
/* verifie qu'il n'y a pas d'utilisateurs ayant un compte Google Apps désactivé et une redirection encore active vers Google Apps */
check("SELECT a.alias, g.g_status, u.mail_storage
FROM auth_user_md5 AS u
query("DELETE FROM register_pending WHERE hash = 'INSCRIT'");
// quelques tables sont triées pour que la lecture triée soit plus facile
-query("ALTER TABLE applis_def ORDER BY text");
+query("ALTER TABLE profile_education_enum ORDER BY name");
query("ALTER TABLE binets_def ORDER BY text");
query("ALTER TABLE groupesx_def ORDER BY text");
query("ALTER TABLE secteur ORDER BY text");
--- /dev/null
+#!/usr/bin/php5
+<?php
+
+require('./connect.db.inc.php');
+require_once('profil.func.inc.php');
+
+$globals->debug = 0; //do not store backtraces
+
+
+function do_update_by_block($values)
+{
+ // Update display_tel by block
+ // Because there is no mysql update syntax for multiple updates in one query
+ // we use a multiple insert syntax which will fail because the key already exist
+ // and then update the display_tel
+ XDB::execute("INSERT INTO profile_phones (uid, link_type, link_id, tel_id ,tel_type,
+ search_tel, display_tel, pub, comment)
+ VALUES " . $values . "
+ ON DUPLICATE KEY UPDATE display_tel = VALUES(display_tel)");
+}
+
+$res = XDB::query("SELECT DISTINCT g.phoneprf FROM geoloc_pays AS g WHERE g.phoneprf IS NOT NULL");
+$prefixes = $res->fetchColumn();
+foreach ($prefixes as $i => $prefix) {
+ $res = XDB::query("SELECT g.phoneformat FROM geoloc_pays AS g
+ WHERE g.phoneprf = {?} AND g.phoneformat != '' LIMIT 1",
+ $prefix);
+ if ($res->numRows() > 0) {
+ $format = $res->fetchOneCell();
+ //Build regexp for mysql query
+ $len = strlen($format);
+ $regexp = "^";
+ $nbPar = 0;
+ for ($i = 0; $i < $len; $i++) {
+ $char = $format[$i];
+ switch ($char) {
+ case 'p':
+ $regexp .= $prefix;
+ break;
+ case '#':
+ if ($nbPar == 0) {
+ $regexp .= '(';
+ $nbPar++;
+ }
+ $regexp .= '[0-9](';
+ $nbPar++;
+ break;
+ default:
+ //Appends the char after escaping it if necessary
+ $escape = array('[', ']', '{', '}', '(', ')', '*', '+', '?', '.', '^', '$', '|', '\\');
+ if (in_array($char, $escape)) {
+ $regexp .= '[' . $char . ']';
+ } else {
+ $regexp .= $char;
+ }
+ }
+ }
+ //allows additionnal spaces and numbers
+ $regexp .= '[0-9 ]*';
+ //closes parenthesis
+ for ($i = 0; $i < $nbPar; $i++) {
+ $regexp .= ')?';
+ }
+ $regexp .= '$';
+ $res = XDB::iterator("SELECT uid, link_type, link_id, tel_id, tel_type, search_tel,
+ display_tel, pub, comment
+ FROM profile_phones
+ WHERE search_tel LIKE {?} AND display_tel NOT REGEXP {?}",
+ $prefix . '%', $regexp);
+ if ($res->numRows() > 0)
+ {
+ //To speed up the update of phone numbers, theses updates are grouped by block of 1000
+ $values = '';
+ $i = 0;
+ while ($phone = $res->next()) {
+ $disp = format_display_number($phone['search_tel'], $error, array('format' => $format, 'phoneprf' => $prefix));
+ if ($values != '') {
+ $values .= ",\n";
+ }
+ $values .= "('" . addslashes($phone['uid']) . "', '" . addslashes($phone['link_type'])
+ . "', '" . addslashes($phone['link_id'])
+ . "', '" . addslashes($phone['tel_id']) . "', '" . addslashes($phone['tel_type'])
+ . "', '" . addslashes($phone['search_tel']) . "', '" . addslashes($disp)
+ . "', '" . addslashes($phone['pub']) . "', '" . addslashes($phone['comment']) . "')";
+ $i++;
+ if ($i == 1000) {
+ do_update_by_block($values);
+ $values = '';
+ $i = 0;
+ }
+ }
+ if ($values != '') {
+ do_update_by_block($values);
+ }
+ }
+ }
+}
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+?>
platal.conf
platal.cron
+ax_xorg_rsa.pem
*.pem
0 21 * * 1-6 web cd $WD; ./checkdb.php | mail -e -s "verifications sur la BDD de plat/al @VERSION@" br@staff.m4x.org
0 21 * * 0 web cd $WD; ./checkdb.php -v | mail -e -s "verifications verbose sur la BDD de plat/al @VERSION@" br@staff.m4x.org
0 20 * * * web cd $WD; ./emails.check.php | mail -e -s "qualite de l'annuaire" br@staff.m4x.org
+0 22 * * * web cd $WD; ./phones.check.php > /dev/null
# inscription report
0 6 * * 1 web cd $WD; ./rapports_inscription.php
background: inherit;
}
+.hinted {
+ border-bottom: 1px dashed black;
+}
+
input.error, textarea.error {
background-color: #faa;
}
font-size: 100%;
}
-div.contact div.appli {
+div.contact div.edu {
}
div.contact div.bits {
{
switch (id) {
case 'general':
- fillType(document.forms.prof_annu['appli1[type]'], document.forms.prof_annu['appli1[id]'].selectedIndex-1);
- selectType(document.forms.prof_annu['appli1[type]'], document.forms.prof_annu['appli1_tmp'].value);
- fillType(document.forms.prof_annu['appli2[type]'], document.forms.prof_annu['appli2[id]'].selectedIndex-1);
- selectType(document.forms.prof_annu['appli2[type]'], document.forms.prof_annu['appli2_tmp'].value);
+ var i = 0;
+ var prefix = 'edu_';
+ while ($('.' + prefix + i).length != 0) {
+ i++;
+ }
+ for (var j = 0; j < i; j++) {
+ prepareType(j);
+ }
break;
case 'poly':
updateGroupSubLink(document.forms.prof_annu.groupesx_sub);
}
}
-var applisType;
-var applisTypeAll;
+var educationDegree;
+var educationDegreeAll;
+var educationDegreeName;
// General
var subgrades;
var names;
-function fillType(selectCtrl, appli, fill)
+function fillType(selectCtrl, edu, fill)
{
var i;
- var i0=0;
+ var i0 = 0;
- for (i = selectCtrl.options.length; i >=0; i--) {
+ for (i = selectCtrl.options.length; i >= 0; i--) {
selectCtrl.options[i] = null;
}
- if (fill || appli <0) {
+ if (fill || edu < 0) {
selectCtrl.options[0] = new Option(' ');
- i0=1;
+ i0 = 1;
+ }
+ if (edu >= 0) {
+ for (i = 0; i < educationDegree[edu].length; i++) {
+ selectCtrl.options[i0 + i] = new Option(educationDegreeName[educationDegree[edu][i] - 1], educationDegree[edu][i]);
+ }
+ } else if (fill) {
+ for (i = 0; i < educationDegreeAll.length; i++) {
+ selectCtrl.options[i0 + i] = new Option(educationDegreeName[educationDegreeAll[i] - 1], educationDegreeAll[i]);
+ }
}
- if (appli>=0)
- for (i=0; i < applisType[appli].length; i++)
- selectCtrl.options[i0+i] = new Option(applisType[appli][i]);
- else if (fill)
- for (i=0; i < applisTypeAll.length; i++)
- selectCtrl.options[i0+i] = new Option(applisTypeAll[i]);
}
function selectType(selectCtrl, type)
{
for (i = 0; i < selectCtrl.options.length; i++) {
- if (selectCtrl.options[i].text == type)
- selectCtrl.selectedIndex=i;
+ if (selectCtrl.options[i].value == type) {
+ selectCtrl.selectedIndex = i;
+ }
}
}
+function prepareType(i)
+{
+ fillType(document.forms.prof_annu["edus[" + i + "][degreeid]"], document.forms.prof_annu["edus[" + i + "][eduid]"].selectedIndex - 1);
+ selectType(document.forms.prof_annu["edus[" + i + "][degreeid]"], document.forms.prof_annu["edu_" + i + "_tmp"].value);
+}
+
+function addSearchName()
+{
+ var i = 0;
+ while (document.getElementById('search_name_' + i) != null) {
+ i++;
+ }
+ $('#add_search_name').before('<div id="search_name_' + i + '" style="padding:2px" class="center"></div>');
+ Ajax.update_html('search_name_' + i, 'profile/ajax/searchname/' + i,function(){
+ $('#search_name_'+i+' input')[1].focus();
+ });
+}
+function removeSearchName(i)
+{
+ if (document.getElementById('search_name_'+i+'_new') != null) {
+ $('#search_name_'+i).remove();
+ } else {
+ removeObject('search_name_'+i, 'search_name['+i+']');
+ }
+}
+
+function delNationality(i)
+{
+ $('#nationalite' + i).hide().find('select').val('');
+}
+
+function addNationality()
+{
+ var i = 0;
+ if ($('#nationalite2').find('select').val() == "") {
+ i = 2;
+ } else if ($('#nationalite3').find('select').val() == "") {
+ i = 3;
+ }
+ if ((i == 2) || (i == 3)) {
+ $('#nationalite' + i).show();
+ }
+}
+
+function addNetworking()
+{
+ var i = 0;
+ var nws = 'networking_';
+ while (document.getElementById(nws + i) != null) {
+ i++;
+ }
+ var namefirst = '';
+ var html = '<tr id="networking_' + i + '">'
+ + ' <td colspan="2">'
+ + ' <div style="float: left; width: 200px;">'
+ + ' <span class="flags">'
+ + ' <input type="checkbox" name="networking[' + i + '][pub]"/>'
+ + ' <img src="images/icons/flag_green.gif" alt="site public" title="site public">'
+ + ' </span> '
+ + ' <select id="networking_type_' + i + '" name="networking[' + i + '][type]" onchange="javascript:updateNetworking(' + i + ');">';
+ for (nw in nw_list) {
+ if (namefirst == '') {
+ namefirst = nw;
+ }
+ html += ' <option value="' + nw_list[nw] + '">' + nw + '</option>';
+ }
+ html += '</select>'
+ + ' <input type="hidden" id="networking_name_' + i + '" name="networking[' + i + '][name]" value="' + namefirst + '"/>'
+ + ' </div>'
+ + ' <div style="float: left">'
+ + ' <input type="text" name="networking[' + i + '][address]" value="" size="30"/>'
+ + ' <a href="javascript:removeNetworking(' + i + ')">'
+ + ' <img src="images/icons/cross.gif" alt="cross" title="Supprimer cet élément"/>'
+ + ' </a>'
+ + ' </div>'
+ + ' </td>'
+ + '</tr>';
+
+ $('#networking').before(html);
+}
+
+function removeNetworking(id)
+{
+ $('#networking_' + id).remove();
+}
+
+function updateNetworking(i)
+{
+ var name = document.getElementById('networking_name_' + i);
+ var type = document.getElementById('networking_type_' + i);
+ if (type != null && name != null) {
+ name.value = type.options[type.selectedIndex].text;
+ }
+
+}
// Addresses
Ajax.update_html('addresses_' + i + '_cont', 'profile/ajax/address/' + i, checkCurrentAddress);
}
-function addTel(id)
+function addEdu()
+{
+ var i = 0;
+ var j = 0;
+ var prefix = 'edu_';
+ var class_parity;
+
+ while (!$('#edu_add').hasClass(prefix + i)) {
+ if ($('.' + prefix + i).length != 0) {
+ j++;
+ }
+ i++;
+ }
+ if (j % 2) {
+ class_parity = 'pair';
+ } else {
+ class_parity = 'impair';
+ }
+ $('#edu_add').removeClass(prefix + i);
+ i++;
+ $('#edu_add').addClass(prefix + i);
+ i--;
+ $.get(platal_baseurl + 'profile/ajax/edu/' + i + '/' + class_parity,
+ function(data) {
+ $('#edu_add').before(data);
+ prepareType(i);
+ });
+}
+
+function removeEdu(i)
+{
+ var prefix = 'edu_';
+ $('.' + prefix + i).remove();
+ while (!$('#edu_add').hasClass(prefix + i)) {
+ $('.' + prefix + i).toggleClass('pair');
+ $('.' + prefix + i).toggleClass('impair');
+ i++;
+ }
+}
+
+function addTel(prefid, prefname)
{
var i = 0;
- var adid = 'addresses_' + id;
- var tel = adid + '_tel_';
- while (document.getElementById(tel + i) != null) {
+ var prefix = prefid + '_';
+ while (document.getElementById(prefix + i) != null) {
i++;
}
- $('#' + adid + '_add_tel').before('<div id="' + tel + i + '" style="clear: both"></div>');
- Ajax.update_html(tel + i, 'profile/ajax/tel/' + id + '/' + i);
+ $('#' + prefix + 'add').before('<div id="' + prefix + i + '" style="clear: both; padding-top: 4px; padding-bottom: 4px"></div>');
+ Ajax.update_html(prefix + i, 'profile/ajax/tel/' + prefid + '/' + prefname + '/' + i);
}
+function removeTel(id)
+{
+ $('#' + id).remove();
+}
+
+function addPhoneComment(id, pref)
+{
+ document.getElementById(id+'_comment').style.display = '';
+ document.getElementById(id+'_addComment').style.display = 'none';
+}
+
+function removePhoneComment(id, pref)
+{
+ document.getElementById(id+'_comment').style.display = 'none';
+ document.forms.prof_annu[pref+ '[comment]'].value = '';
+ document.getElementById(id+'_addComment').style.display = '';
+}
// Geoloc
'geoloc', 'lists', 'marketing', 'payment', 'platal',
'profile', 'register', 'search', 'stats', 'admin',
'newsletter', 'axletter', 'bandeau', 'survey',
- 'gadgets', 'googleapps');
+ 'fusionax', 'gadgets', 'googleapps');
if (!($path = Env::v('n')) || ($path{0} < 'A' || $path{0} > 'Z')) {
$platal->run();
+++ /dev/null
-<?php
-/***************************************************************************
- * Copyright (C) 2003-2008 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 *
- ***************************************************************************/
-
-function applis_options($current=0) {
- $html = '<option value="-1"></option>';
- $res = XDB::iterator("select * from applis_def order by text");
- while ($arr_appli = $res->next()) {
- $html .= '<option value="'.$arr_appli["id"].'"';
- if ($arr_appli["id"]==$current) $html .= " selected='selected'";
- $html .= '>'.htmlspecialchars($arr_appli["text"])."</option>\n";
- }
- return $html;
-}
-/** pour appeller applis_options depuis smarty
- */
-function _applis_options_smarty($params){
- if(!isset($params['selected']))
- $params['selected'] = 0;
- return applis_options($params['selected']);
-}
-Platal::page()->register_function('applis_options','_applis_options_smarty');
-
-
-/** affiche un Array javascript contenant les types de chaque appli
- */
-function applis_type(){
- $html = "";
- $res=XDB::iterRow("select type from applis_def order by text");
- if (list($appli_type) = $res->next()) {
- $html .= "new Array('".str_replace(",","','",$appli_type)."')";
- }
- while (list($appli_type) = $res->next()) {
- $html .= ",\nnew Array('".str_replace(",","','",$appli_type)."')";
- }
- return $html;
-}
-Platal::page()->register_function('applis_type','applis_type');
-
-/** affiche tous les types possibles d'applis
- */
-function applis_type_all(){
- $res = XDB::query("show columns from applis_def like 'type'");
- $arr_appli = $res->fetchOneAssoc();
- return str_replace(")","",str_replace("set(","",$arr_appli["Type"]));
-}
-Platal::page()->register_function('applis_type_all','applis_type_all');
-
-/** formatte une ecole d'appli pour l'affichage
- */
-function applis_fmt($type, $text, $url) {
- $txt="";
- if (($type != "Ingénieur") && ($type != "Diplôme"))
- $txt .= $type;
- if ($text != "Université") {
- if ($txt) $txt .= ' ';
- if ($url)
- $txt .= "<a href=\"$url\" onclick=\"return popup(this)\">$text</a>";
- else
- $txt .= $text;
- }
- if (!$txt) {
- $txt .= $text;
- }
- return $txt;
-}
-function _applis_fmt($params, &$smarty) {
- extract($params);
- return applis_fmt($type, $text, $url);
-}
-Platal::page()->register_function('applis_fmt','_applis_fmt');
-
-// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
-?>
--- /dev/null
+<?php
+/***************************************************************************
+ * Copyright (C) 2003-2008 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 *
+ ***************************************************************************/
+
+function education_options($current = 0)
+{
+ $html = '<option value="-1"></option>';
+ $res = XDB::iterator("SELECT e.id AS id, e.name AS name, g.pays AS country
+ FROM profile_education_enum AS e
+ INNER JOIN geoloc_pays AS g ON (e.country = g.a2)
+ ORDER BY g.pays, e.name");
+ $country = "";
+ while ($arr_edu = $res->next()) {
+ if ($arr_edu["country"] != $country) {
+ $country = $arr_edu["country"];
+ $html .= "<optgroup label=" . $country . ">";
+ }
+ $html .= '<option value="' . $arr_edu["id"] . '"';
+ if ($arr_edu["id"] == $current) {
+ $html .= " selected='selected'";
+ }
+ $html .= '>' . htmlspecialchars($arr_edu["name"]) . "</option>\n";
+ }
+ return $html;
+}
+
+/** pour appeller education_options depuis smarty
+ */
+function _education_options_smarty($params)
+{
+ if(!isset($params['selected'])) {
+ $params['selected'] = 0;
+ }
+ return education_options($params['selected']);
+}
+Platal::page()->register_function('education_options', '_education_options_smarty');
+
+/** affiche un Array javascript contenant les diplômes de chaque formation
+ */
+function education_degree()
+{
+ $html = "";
+ $res = XDB::iterRow("SELECT eduid, degreeid
+ FROM profile_education_degree AS d
+ INNER JOIN profile_education_enum AS e ON (e.id = d.eduid)
+ INNER JOIN geoloc_pays AS g ON (e.country = g.a2)
+ ORDER BY g.pays, e.name");
+ if ($edu_degree = $res->next()) {
+ $eduid = $edu_degree['0'];
+ $html .= "[";
+ $html .= $edu_degree['1'];
+ $edu_degree = $res->next();
+ while ($edu_degree['0'] == $eduid) {
+ $html .= "," . $edu_degree['1'];
+ $edu_degree = $res->next();
+ }
+ $html .= "]";
+ }
+ while ($edu_degree) {
+ $eduid = $edu_degree['0'];
+ $html .= ",\n[";
+ $html .= $edu_degree['1'];
+ $edu_degree = $res->next();
+ while ($edu_degree['0'] == $eduid) {
+ $html .= "," . $edu_degree['1'];
+ $edu_degree = $res->next();
+ }
+ $html .= "]";
+ }
+ return $html;
+}
+Platal::page()->register_function('education_degree', 'education_degree');
+
+/** affiche tous les types possibles de diplômes
+ */
+function education_degree_all()
+{
+ $html = "";
+ $res = XDB::query("SELECT id
+ FROM profile_education_degree_enum
+ ORDER BY id");
+ return implode(',', $res->fetchColumn());
+}
+Platal::page()->register_function('education_degree_all', 'education_degree_all');
+
+/** affiche les noms de tous les diplômes possibles
+ */
+function education_degree_name()
+{
+ $html = "";
+ $res = XDB::query("SELECT degree
+ FROM profile_education_degree_enum
+ ORDER BY id");
+ return '\'' . implode('\',\'', $res->fetchColumn()) . '\'';
+}
+Platal::page()->register_function('education_degree_name', 'education_degree_name');
+
+/** formatte une formation pour l'affichage
+ */
+function education_fmt($name, $url, $degree, $grad_year, $field, $program, $sexe, $long)
+{
+ $field = strtolower($field);
+ $txt = "";
+
+ if ($grad_year || $field || $program) {
+ $txt .= "<span title=\"(";
+ if ($program) {
+ $txt .= $program;
+ if ($grad_year || $field) {
+ $txt .= ", ";
+ }
+ }
+ if ($grad_year) {
+ if ($sexe) {
+ $txt .= "diplômée en $grad_year";
+ } else {
+ $txt .= "diplômé en $grad_year";
+ }
+ if ($field) {
+ $txt .= ", ";
+ }
+ }
+ if ($field) {
+ $txt .= "domaine : $field)\">";
+ }
+ }
+
+ if (($degree != "Licence") || ($long)) {
+ if (($degree != "Ingénieur") && ($degree != "Diplôme")) {
+ $txt .= $degree;
+ }
+ if ($name != "Université") {
+ if ($name) {
+ $txt .= ' ';
+ }
+ if ($url != ' ') {
+ $txt .= "<a href=\"$url\" onclick=\"return popup(this)\">$name</a>";
+ } else {
+ $txt .= $name;
+ }
+ }
+ }
+ $txt .= "</span>";
+
+ return $txt;
+}
+
+function _education_fmt($params, &$smarty)
+{
+ extract($params);
+ return education_fmt($name, $url, $degree, $grad_year, $field, $program, $sexe, $long);
+}
+Platal::page()->register_function('education_fmt', '_education_fmt');
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+?>
--- /dev/null
+<?php
+/***************************************************************************
+ * Copyright (C) 2003-2008 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 *
+ ***************************************************************************/
+
+function fill_email_combobox(PlPage& $page)
+{
+ global $globals;
+
+ $uid = S::v('uid');
+ $forlife = S::v('forlife');
+ $email_type = "directory";
+
+ $res = XDB::query(
+ "SELECT email_directory
+ FROM profile_directory
+ WHERE uid={?}", $uid);
+ $email_directory = $res->fetchOneCell();
+ if ($email_directory) {
+ $page->assign('email_directory', $email_directory);
+ list($alias, $domain) = explode('@', $email_directory);
+ } else {
+ $page->assign('email_directory', '');
+ $email_type = NULL;
+ $alias = $domain = '';
+ }
+
+ $res = XDB::query(
+ "SELECT alias
+ FROM virtual
+ INNER JOIN virtual_redirect USING(vid)
+ WHERE (redirect={?} OR redirect={?})
+ AND alias LIKE '%@{$globals->mail->alias_dom}'",
+ $forlife . '@' . $globals->mail->domain, $forlife . '@' . $globals->mail->domain2);
+ $melix = $res->fetchOneCell();
+ if ($melix) {
+ list($melix) = explode('@', $melix);
+ $page->assign('melix', $melix);
+ if (($domain == $globals->mail->alias_dom) || ($domain == $globals->mail->alias_dom2)) {
+ $email_type = "melix";
+ }
+ }
+
+ $res = XDB::query(
+ "SELECT alias
+ FROM aliases
+ WHERE id={?} AND (type='a_vie' OR type='alias')", $uid);
+ $res = $res->fetchAllAssoc();
+ $page->assign('list_email_X', $res);
+ if (($domain == $globals->mail->domain) || ($domain == $globals->mail->domain2)) {
+ foreach ($res as $res_it) {
+ if ($alias == $res_it['alias']) {
+ $email_type = "X";
+ }
+ }
+ }
+
+ require_once 'emails.inc.php';
+ $redirect = new Redirect($uid);
+ $redir = array();
+ foreach ($redirect->emails as $redirect_it) {
+ if ($redirect_it instanceof EmailRedirection) {
+ $redir[] = $redirect_it->email;
+ if ($email_directory == $redirect_it->email) {
+ $email_type = "redir";
+ }
+ }
+ }
+ $page->assign('list_email_redir', $redir);
+
+ $res = XDB::query(
+ "SELECT email
+ FROM entreprises
+ WHERE uid={?}", $uid);
+ $res = $res->fetchAllAssoc();
+ $pro = array();
+ foreach ($res as $res_it) {
+ if ($res_it['email'] != '') {
+ $pro[] = $res_it['email'];
+ if ($email_directory == $res_it['email']) {
+ $email_type = "pro";
+ }
+ }
+ }
+ $page->assign('list_email_pro', $pro);
+
+ $page->assign('email_type', $email_type);
+}
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+?>
'freetext' => 'Le texte libre',
'mobile' => 'Son numéro de téléphone portable',
'nationalite' => 'Sa nationalité',
+ 'nationalite2' => 'Sa seconde nationalité',
+ 'nationalite3' => 'Sa troisième nationalité',
'nick' => 'Son surnom',
- 'web' => 'L\'adresse de son site web',
- 'appli1' => 'Son école d\'application',
- 'appli2' => 'Son école de post-application',
+ 'networking' => 'La liste de ses adresses de networking',
+ 'edus' => 'Ses formations',
'addresses' => 'Ses adresses',
'section' => 'Sa section sportive',
'binets' => 'La liste de ses binets',
'medals' => 'Ses décorations',
'cv' => 'Son Curriculum Vitae',
+ 'corps' => 'Son Corps d\'État',
'jobs' => 'Ses informations professionnelles',
'photo' => 'Sa photographie');
***************************************************************************/
-require_once('applis.func.inc.php');
function replace_ifset(&$var,$req) {
if (Env::has($req)){
switch ($val) {
case 'adr' : if (!($c['adr'] = diff_user_addresses($a[$val], $bvar, $view))) unset($c['adr']); break;
case 'adr_pro' : if (!($c['adr_pro'] = diff_user_pros($a[$val], $bvar, $view))) unset($c['adr_pro']); break;
- case 'mobile' : if (same_tel($a[$val], $bvar)) unset($c['mobile']); break;
+ case 'tels' : if (!($c['tels'] = diff_user_tels($a[$val], $bvar, $view))) unset($c['tels']); break;
}
}
}
}
- // don't modify mobile if you don't have the right
- if (isset($b['mobile_pub']) && !has_user_right($b['mobile_pub'], $view) && isset($c['mobile']))
- unset($c['mobile']);
- if (isset($b['web_pub']) && !has_user_right($b['web_pub'], $view) && isset($c['web']))
- unset($c['web']);
+ // don't modify freetext if you don't have the right
if (isset($b['freetext_pub']) && !has_user_right($b['freetext_pub'], $view) && isset($c['freetext']))
unset($c['freetext']);
if (!count($c))
}
function same_tel(&$a, &$b) {
- $numbera = preg_replace('/[^0-9]/', '', (string) $a);
- $numberb = preg_replace('/[^0-9]/', '', (string) $b);
+ $numbera = format_phone_number((string) $a);
+ $numberb = format_phone_number((string) $b);
return $numbera === $numberb;
}
function same_address(&$a, &$b) {
return
(same_field($a['adr1'],$b['adr1'])) &&
- (same_field($a['adr1'],$b['adr1'])) &&
- (same_field($a['adr1'],$b['adr1'])) &&
+ (same_field($a['adr2'],$b['adr2'])) &&
+ (same_field($a['adr3'],$b['adr3'])) &&
(same_field($a['postcode'],$b['postcode'])) &&
(same_field($a['city'],$b['city'])) &&
(same_field($a['countrytxt'],$b['countrytxt'])) &&
return $c;
}
-function diff_user_address($a, $b) {
- if (isset($b['pub']) && isset($a['pub']) && has_user_right($b['pub'], $a['pub']))
- $a['pub'] = $b['pub'];
- if (isset($b['tels'])) {
- $bvar = $b['tels'];
-
- $telids_b = array();
- foreach ($bvar as $i => $telb) $telids_b[$telb['telid']] = $i;
+function diff_user_tels(&$a, &$b)
+{
+ $c = $a;
+ $telids_b = array();
+ foreach ($b as $i => $telb) $telids_b[$telb['telid']] = $i;
- if (isset($a['tels']))
- $avar = $a['tels'];
- else
- $avar = array();
- $ctels = $avar;
- foreach ($avar as $j => $tela) {
- if (isset($tela['telid'])) {
- // if b has a tel with the same telid, compute diff
- if (isset($telids_b[$tela['telid']])) {
- if (!($ctels[$j] = diff_user_tel($tela, $varb[$telids_b[$tela['adrid']]])))
- unset($ctels[$j]);
- unset($telids_b[$tela['telid']]);
+ foreach ($a as $j => $tela) {
+ if (isset($tela['telid'])) {
+ // if b has a tel with the same telid, compute diff
+ if (isset($telids_b[$tela['telid']])) {
+ if (!($c[$j] = diff_user_tel($tela, $b[$telids_b[$tela['adrid']]]))) {
+ unset($c[$j]);
}
- } else {
- // try to find a match in b
- foreach ($bvar as $i => $telb) {
- if (same_tel($tela['tel'], $telb['tel'])) {
- $tela['telid'] = $telb['telid'];
- if (!($ctels[$j] = diff_user_tel($tela, $telb)))
- unset($ctels[$j]);
- unset($telids_b[$tela['telid']]);
- break;
+ unset($telids_b[$tela['telid']]);
+ }
+ } else {
+ // try to find a match in b
+ foreach ($b as $i => $telb) {
+ if (same_tel($tela['tel'], $telb['tel'])) {
+ $tela['telid'] = $telb['telid'];
+ if (!($c[$j] = diff_user_tel($tela, $telb))) {
+ unset($c[$j]);
}
+ unset($telids_b[$tela['telid']]);
+ break;
}
}
}
+ }
- foreach ($telids_b as $telidb => $i)
- $ctels[] = array('telid' => $telidb, 'remove' => 1);
+ foreach ($telids_b as $telidb => $i)
+ $c[] = array('telid' => $telidb, 'remove' => 1);
+ return $c;
+}
+
+function diff_user_address($a, $b) {
+ if (isset($b['pub']) && isset($a['pub']) && has_user_right($b['pub'], $a['pub']))
+ $a['pub'] = $b['pub'];
+ if (isset($b['tels'])) {
+ if (isset($a['tels'])) {
+ $avar = $a['tels'];
+ } else {
+ $avar = array();
+ }
+ $ctels = diff_user_tels($avar, $b['tels']);
if (!count($ctels)) {
$b['tels'] = $avar;
- } else
+ } else {
$a['tels'] = $ctels;
+ }
}
foreach ($a as $val => $avar) {
}
if (isset($b['adr_pub']) && isset($a['adr_pub']) && has_user_right($b['adr_pub'], $a['adr_pub']))
$a['adr_pub'] = $b['adr_pub'];
- if (isset($b['tel_pub']) && !has_user_right($b['tel_pub'], $view)) {
- unset($a['tel']);
- unset($a['fax']);
- unset($a['mobile']);
+ if (isset($b['tels'])) {
+ if (isset($a['tels']))
+ $avar = $a['tels'];
+ else
+ $avar = array();
+ $ctels = diff_user_tels($avar, $b['tels']);
+
+ if (!count($ctels)) {
+ $b['tels'] = $avar;
+ } else
+ $a['tels'] = $ctels;
}
- if (isset($b['tel_pub']) && isset($a['tel_pub']) && has_user_right($b['tel_pub'], $a['tel_pub']))
- $a['tel_pub'] = $b['tel_pub'];
if (isset($b['email_pub']) && !has_user_right($b['email_pub'], $view))
unset($a['email']);
if (isset($b['email_pub']) && isset($a['email_pub']) && has_user_right($b['email_pub'], $a['email_pub']))
return $c;
}
+function format_phone_number($tel)
+{
+ $tel = trim($tel);
+ if (substr($tel, 0, 3) === '(0)') {
+ $tel = '33' . $tel;
+ }
+ $tel = preg_replace('/\(0\)/', '', $tel);
+ $tel = preg_replace('/[^0-9]/', '', $tel);
+ if (substr($tel, 0, 2) === '00') {
+ $tel = substr($tel, 2);
+ } else if(substr($tel, 0, 1) === '0') {
+ $tel = '33' . substr($tel, 1);
+ }
+ return $tel;
+}
+
+function format_display_number($tel, &$error, $format = array('format'=>'','phoneprf'=>''))
+{
+ $error = false;
+ $ret = '';
+ $tel_length = strlen($tel);
+ if((!isset($format['phoneprf'])) || ($format['phoneprf'] == '')) {
+ $res = XDB::query("SELECT phoneprf, phoneformat AS format
+ FROM geoloc_pays
+ WHERE phoneprf = {?} OR phoneprf = {?} OR phoneprf = {?}
+ LIMIT 1",
+ substr($tel, 0, 1), substr($tel, 0, 2), substr($tel, 0, 3));
+ if ($res->numRows() == 0) {
+ $error = true;
+ return '+' . $tel;
+ }
+ $format = $res->fetchOneAssoc();
+ }
+ if ($format['format'] == '') {
+ $format['format'] = '+p';
+ }
+ $j = 0;
+ $i = strlen($format['phoneprf']);
+ $length_format = strlen($format['format']);
+ while (($i < $tel_length) && ($j < $length_format)){
+ if ($format['format'][$j] == '#'){
+ $ret .= $tel[$i];
+ $i++;
+ } else if ($format['format'][$j] == 'p') {
+ $ret .= $format['phoneprf'];
+ } else {
+ $ret .= $format['format'][$j];
+ }
+ $j++;
+ }
+ for (; $i < $tel_length - 1; $i += 2) {
+ $ret .= ' ' . substr($tel, $i, 2);
+ }
+ //appends last alone number to the last block
+ if ($i < $tel_length) {
+ $ret .= substr($tel, $i);
+ }
+ return $ret;
+}
+
// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
?>
*/
function user_clear_all_subs($user_id, $really_del=true)
{
- // keep datas in : aliases, adresses, tels, applis_ins, binets_ins, contacts, groupesx_ins, homonymes, identification_ax, photo
+ // keep datas in : aliases, adresses, tels, profile_education, binets_ins, contacts, groupesx_ins, homonymes, identification_ax, photo
// delete in : auth_user_md5, auth_user_quick, competences_ins, emails, entreprises, langues_ins, mentor,
// mentor_pays, mentor_secteurs, newsletter_ins, perte_pass, requests, user_changes, virtual_redirect, watch_sub
// + delete maillists
'user_id' => array('requests', 'user_changes'));
if ($really_del) {
- array_push($tables_to_clear['uid'], 'emails', 'groupex.membres', 'contacts', 'adresses', 'tels',
+ array_push($tables_to_clear['uid'], 'emails', 'groupex.membres', 'contacts', 'adresses', 'profile_phones',
'photo', 'perte_pass', 'langues_ins', 'forums.abos', 'forums.profils');
array_push($tables_to_clear['user_id'], 'newsletter_ins', 'auth_user_quick', 'binets_ins');
$tables_to_clear['id'] = array('aliases');
$tables_to_clear['contact'] = array('contacts');
XDB::execute("UPDATE auth_user_md5
SET date_ins = 0, promo_sortie = 0, nom_usage = '', password = '', perms = 'pending',
- nationalite = '', cv = '', section = 0, date = 0, smtppass = '', mail_storage = ''
+ nationalite = '', nationalite2 = '', nationalite3 = '', cv = '', section = 0,
+ date = 0, smtppass = '', mail_storage = ''
WHERE user_id = {?}", $uid);
XDB::execute("DELETE virtual.* FROM virtual INNER JOIN virtual_redirect AS r USING(vid) WHERE redirect = {?}",
$alias.'@'.$globals->mail->domain);
{
$sql = "SELECT e.entreprise, s.label as secteur , ss.label as sous_secteur , f.fonction_fr as fonction,
e.poste, e.adr1, e.adr2, e.adr3, e.postcode, e.city, e.entrid,
- gp.pays AS countrytxt, gr.name AS region, e.tel, e.fax, e.mobile, e.entrid,
- e.pub, e.adr_pub, e.tel_pub, e.email, e.email_pub, e.web
+ gp.pays AS countrytxt, gr.name AS region, e.entrid,
+ e.pub, e.adr_pub, e.email, e.email_pub, e.web
FROM entreprises AS e
LEFT JOIN emploi_secteur AS s ON(e.secteur = s.id)
LEFT JOIN emploi_ss_secteur AS ss ON(e.ss_secteur = ss.id AND e.secteur = ss.secteur)
$all_pro[$i]['region'] = '';
}
}
- if (!has_user_right($pro['tel_pub'], $view)) {
- // if no tel was defined, then the viewer will be able to write it
- if ($pro['tel'] == '' &&
- $pro['fax'] == '' &&
- $pro['mobile'] == '') {
- $all_pro[$i]['tel_pub'] = $view;
- } else {
- $all_pro[$i]['tel'] = '';
- $all_pro[$i]['fax'] = '';
- $all_pro[$i]['mobile'] = '';
+ $sql = "SELECT pub AS tel_pub, tel_type, display_tel AS tel, comment
+ FROM profile_phones AS t
+ WHERE uid = {?} AND link_type = 'pro' AND link_id = {?}
+ ORDER BY link_id, tel_type DESC, tel_id";
+ $restel = XDB::iterator($sql, $uid, $pro['entrid']);
+ while ($nexttel = $restel->next()) {
+ if (has_user_right($nexttel['tel_pub'], $view)) {
+ if (!isset($all_pro[$i]['tels'])) {
+ $all_pro[$i]['tels'] = array($nexttel);
+ } else {
+ $all_pro[$i]['tels'][] = $nexttel;
+ }
}
}
if (!has_user_right($pro['email_pub'], $view)) {
$all_pro[$i]['fonction'] == '' &&
$all_pro[$i]['secteur'] == '' &&
$all_pro[$i]['poste'] == '' &&
- $all_pro[$i]['tel'] == '' &&
- $all_pro[$i]['fax'] == '' &&
- $all_pro[$i]['mobile'] == '' &&
+ (!isset($all_pro[$i]['tels'])) &&
$all_pro[$i]['email'] == '')
unset($all_pro[$i]);
}
FIND_IN_SET('active', a.statut) AS active, a.adrid,
FIND_IN_SET('res-secondaire', a.statut) AS secondaire,
FIND_IN_SET('courrier', a.statut) AS courier,
- a.pub, gp.display
+ a.pub, gp.display, a.comment
FROM adresses AS a
LEFT JOIN geoloc_pays AS gp ON (gp.a2=a.country)
WHERE uid= {?} AND NOT FIND_IN_SET('pro',a.statut)
$adrid_index[$adr['adrid']] = $i;
}
- $sql = "SELECT t.adrid, t.tel_pub, t.tel_type, t.tel, t.telid
- FROM tels AS t
- INNER JOIN adresses AS a ON (a.uid = t.uid) AND (a.adrid = t.adrid)
- WHERE t.uid = {?} AND NOT FIND_IN_SET('pro',a.statut)
- ORDER BY t.adrid, t.tel_type DESC, t.telid";
+ $sql = "SELECT link_id AS adrid, pub AS tel_pub, tel_type, display_tel AS tel, tel_id AS telid, comment
+ FROM profile_phones AS t
+ WHERE uid = {?} AND link_type = 'address'
+ ORDER BY link_id, tel_type DESC, tel_id";
$restel = XDB::iterator($sql, $uid);
while ($nexttel = $restel->next()) {
if (has_user_right($nexttel['tel_pub'], $view)) {
{
$reqsql = "SELECT u.user_id, u.promo, u.promo_sortie, u.prenom, u.nom, u.nom_usage, u.date, u.cv,
u.perms IN ('admin','user','disabled') AS inscrit, FIND_IN_SET('femme', u.flags) AS sexe, u.deces != 0 AS dcd, u.deces,
- q.profile_nick AS nickname, q.profile_from_ax, q.profile_mobile AS mobile, q.profile_web AS web, q.profile_freetext AS freetext,
- q.profile_mobile_pub AS mobile_pub, q.profile_web_pub AS web_pub, q.profile_freetext_pub AS freetext_pub,
- q.profile_medals_pub AS medals_pub,
- IF(gp.nat='',gp.pays,gp.nat) AS nationalite, gp.a2 AS iso3166,
+ q.profile_nick AS nickname, q.profile_from_ax, q.profile_freetext AS freetext,
+ q.profile_freetext_pub AS freetext_pub,
+ q.profile_medals_pub AS medals_pub, co.corps_pub AS corps_pub,
+ IF(gp1.nat='',gp1.pays,gp1.nat) AS nationalite, gp1.a2 AS iso3166_1,
+ IF(gp2.nat='',gp2.pays,gp2.nat) AS nationalite2, gp2.a2 AS iso3166_2,
+ IF(gp3.nat='',gp3.pays,gp3.nat) AS nationalite3, gp3.a2 AS iso3166_3,
a.alias AS forlife, a2.alias AS bestalias,
c.uid IS NOT NULL AS is_contact,
s.text AS section, p.x, p.y, p.pub AS photo_pub,
u.matricule_ax,
m.expertise != '' AS is_referent,
- (COUNT(e.email) > 0 OR FIND_IN_SET('googleapps', u.mail_storage) > 0) AS actif
+ (COUNT(e.email) > 0 OR FIND_IN_SET('googleapps', u.mail_storage) > 0) AS actif,
+ nd.display AS name_display, nd.tooltip AS name_tooltip
FROM auth_user_md5 AS u
- INNER JOIN auth_user_quick AS q USING(user_id)
- INNER JOIN aliases AS a ON (u.user_id=a.id AND a.type='a_vie')
- INNER JOIN aliases AS a2 ON (u.user_id=a2.id AND FIND_IN_SET('bestalias',a2.flags))
- LEFT JOIN contacts AS c ON (c.uid = {?} and c.contact = u.user_id)
- LEFT JOIN geoloc_pays AS gp ON (gp.a2 = u.nationalite)
- INNER JOIN sections AS s ON (s.id = u.section)
- LEFT JOIN photo AS p ON (p.uid = u.user_id)
- LEFT JOIN mentor AS m ON (m.uid = u.user_id)
- LEFT JOIN emails AS e ON (e.uid = u.user_id AND e.flags='active')
+ INNER JOIN auth_user_quick AS q USING(user_id)
+ INNER JOIN aliases AS a ON (u.user_id = a.id AND a.type = 'a_vie')
+ INNER JOIN aliases AS a2 ON (u.user_id = a2.id AND FIND_IN_SET('bestalias', a2.flags))
+ LEFT JOIN contacts AS c ON (c.uid = {?} and c.contact = u.user_id)
+ LEFT JOIN profile_corps AS co ON (co.uid = u.user_id)
+ LEFT JOIN geoloc_pays AS gp1 ON (gp1.a2 = u.nationalite)
+ LEFT JOIN geoloc_pays AS gp2 ON (gp2.a2 = u.nationalite2)
+ LEFT JOIN geoloc_pays AS gp3 ON (gp3.a2 = u.nationalite3)
+ INNER JOIN sections AS s ON (s.id = u.section)
+ LEFT JOIN photo AS p ON (p.uid = u.user_id)
+ LEFT JOIN mentor AS m ON (m.uid = u.user_id)
+ LEFT JOIN emails AS e ON (e.uid = u.user_id AND e.flags='active')
+ INNER JOIN profile_names_display AS nd ON (nd.user_id = u.user_id)
WHERE a.alias = {?}
GROUP BY u.user_id";
$res = XDB::query($reqsql, $from_uid, $login);
$user['nickname'] = '';
$user['section'] = '';
}
- // hide mobile
- if (!has_user_right($user['mobile_pub'], $view)) {
- if ($user['mobile'] == '')
- $user['mobile_pub'] = $view;
- else
- $user['mobile'] = '';
- }
- // hide web
- if (!has_user_right($user['web_pub'], $view)) {
- if ($user['web'] == '')
- $user['web_pub'] = $view;
- else
- $user['web'] = '';
- }
+
// hide freetext
if (!has_user_right($user['freetext_pub'], $view)) {
if ($user['freetext'] == '')
$user['freetext'] = '';
}
+ $sql = "SELECT pub AS tel_pub, tel_type, display_tel AS tel, comment
+ FROM profile_phones AS t
+ WHERE uid = {?} AND link_type = 'user'
+ ORDER BY tel_type DESC, tel_id";
+ $restel = XDB::iterator($sql, $uid);
+ while ($nexttel = $restel->next()) {
+ if (has_user_right($nexttel['tel_pub'], $view)) {
+ if (!isset($user['tels'])) {
+ $user['tels'] = array($nexttel);
+ } else {
+ $user['tels'][] = $nexttel;
+ }
+ }
+ }
+
$user['adr_pro'] = get_user_details_pro($uid, $view);
$user['adr'] = get_user_details_adr($uid, $view);
$user['gpxs_join'] = join(', ', $user['gpxs']);
}
- $res = XDB::iterRow("SELECT applis_def.text, applis_def.url, applis_ins.type
- FROM applis_ins
- INNER JOIN applis_def ON applis_def.id = applis_ins.aid
+ $res = XDB::iterRow("SELECT en.name AS name, en.url AS url, d.degree AS degree,
+ ed.grad_year AS grad_year, f.field AS field, ed.program AS program
+ FROM profile_education AS ed
+ INNER JOIN profile_education_enum AS en ON (en.id = ed.eduid)
+ INNER JOIN profile_education_degree_enum AS d ON (d.id = ed.degreeid)
+ INNER JOIN profile_education_field_enum AS f ON (f.id = ed.fieldid)
WHERE uid={?}
- ORDER BY ordre", $uid);
-
- $user['applis_fmt'] = Array();
- $user['formation'] = Array();
- while (list($txt, $url, $type) = $res->next()) {
- $user['formation'][] = $txt." ".$type;
- require_once('applis.func.inc.php');
- $user['applis_fmt'][] = applis_fmt($type, $txt, $url);
+ ORDER BY ed.grad_year", $uid);
+
+ $user['education'] = "";
+ require_once('education.func.inc.php');
+ if (list($name, $url, $degree, $grad_year, $field, $program) = $res->next()) {
+ $user['education'] .= education_fmt($name, $url, $degree, $grad_year, $field, $program, $user['sexe'], true);
+ }
+ while (list($name, $url, $degree, $grad_year, $field, $program) = $res->next()) {
+ $user['education'] .= ", " . education_fmt($name, $url, $degree, $grad_year, $field, $program, $user['sexe'], true);
+ }
+
+ if (has_user_right($user['corps_pub'], $view)) {
+ $res = XDB::query("SELECT e1.name AS original, e2.name AS current, r.name AS rank
+ FROM profile_corps AS c
+ LEFT JOIN profile_corps_enum AS e1 ON (c.original_corpsid = e1.id)
+ LEFT JOIN profile_corps_enum AS e2 ON (c.current_corpsid = e2.id)
+ LEFT JOIN profile_corps_rank_enum AS r ON (c.rankid = r.id)
+ WHERE c.uid = {?} AND c.original_corpsid != 1", $uid);
+ if ($res = $res->fetchOneRow()) {
+ list($original, $current, $rank) = $res;
+ $user['corps'] = "Corps d'origine : " . $original . ", corps actuel : " . $current . ", grade : " . $rank;
+ }
}
- $user['applis_join'] = join(', ', $user['applis_fmt']);
if (has_user_right($user['medals_pub'], $view)) {
$res = XDB::iterator("SELECT m.id, m.text AS medal, m.type, s.gid, g.text AS grade
}
}
+ $user['networking'] = Array();
+ $res = XDB::iterator("SELECT n.address, n.pub, m.network_type AS type, m.name, m.filter, m.link
+ FROM profile_networking AS n
+ INNER JOIN profile_networking_enum AS m ON (n.network_type = m.network_type)
+ WHERE n.uid = {?}", $uid);
+ while($network = $res->next())
+ {
+ if (has_user_right($network['pub'], $view)) {
+ $network['link'] = str_replace('%s', $network['address'], $network['link']);
+ $user['networking'][] = $network;
+ }
+ }
+
return $user;
}
// }}}
if (isset($adr['tels']) && is_array($adr['tels'])) {
$telid = 0;
foreach ($adr['tels'] as $tel) if ($tel['tel']) {
- add_user_tel($uid, $adrid, $telid, $tel);
+ add_user_tel($uid, 'address', $adrid, $telid, $tel);
$telid ++;
}
}
$adr['adr1'], $adr['adr2'], $adr['adr3'],
$adr['postcode'], $adr['city'], $adr['pub'], $adrid, $uid);
if (isset($adr['tels']) && is_array($adr['tels'])) {
- $res = XDB::query("SELECT telid FROM tels WHERE uid = {?} AND adrid = {?} ORDER BY telid", $uid, $adrid);
+ $res = XDB::query("SELECT tel_id FROM profile_phones WHERE uid = {?} AND link_type = 'address' AND link_id = {?} ORDER BY tel_id", $uid, $adrid);
$telids = $res->fetchColumn();
foreach ($adr['tels'] as $tel) {
if (isset($tel['telid']) && isset($tel['remove']) && $tel['remove']) {
- remove_user_tel($uid, $adrid, $tel['telid']);
+ remove_user_tel($uid, 'address', $adrid, $tel['telid']);
if (isset($telids[$tel['telid']])) unset($telids[$tel['telid']]);
} else if (isset($tel['telid'])) {
- update_user_tel($uid, $adrid, $tel['telid'], $tel);
+ update_user_tel($uid, 'address', $adrid, $tel['telid'], $tel);
} else {
for ($telid = 0; isset($telids[$telid]) && ($telids[$telid] == $telid); $telid++);
- add_user_tel($uid, $adrid, $telid, $tel);
+ add_user_tel($uid, 'address', $adrid, $telid, $tel);
}
}
}
// {{{ function remove_user_address()
function remove_user_address($uid, $adrid) {
XDB::execute("DELETE FROM adresses WHERE adrid = {?} AND uid = {?}", $adrid, $uid);
- XDB::execute("DELETE FROM tels WHERE adrid = {?} AND uid = {?}", $adrid, $uid);
+ XDB::execute("DELETE FROM profile_phones WHERE link_id = {?} AND uid = {?} AND link_type = 'address'", $adrid, $uid);
}
// }}}
// {{{ function add_user_tel()
-function add_user_tel($uid, $adrid, $telid, $tel) {
- XDB::execute(
- "INSERT INTO tels SET uid = {?}, adrid = {?}, telid = {?}, tel = {?}, tel_type = {?}, tel_pub = {?}",
- $uid, $adrid, $telid, $tel['tel'], $tel['tel_type'], $tel['tel_pub']);
+function add_user_tel($uid, $link_type, $link_id, $telid, $tel) {
+ require('profil.func.inc.php');
+ $fmt_phone = format_phone_number($tel['tel']);
+ $disp_phone = format_display_number($fmt_phone, $error);
+ XDB::execute("INSERT INTO profile_phones (uid, link_type, link_id, tel_id, tel_type, search_tel, display_tel, pub)
+ VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
+ $uid, $link_type, $link_id, $telid, $tel['tel_type'], $fmt_phone, $disp_phone, $tel['tel_pub']);
}
// }}}
// {{{ function update_user_tel()
-function update_user_tel($uid, $adrid, $telid, $tel) {
- XDB::execute(
- "UPDATE tels SET tel = {?}, tel_type = {?}, tel_pub = {?}
- WHERE telid = {?} AND adrid = {?} AND uid = {?}",
- $tel['tel'], $tel['tel_type'], $tel['tel_pub'],
- $telid, $adrid, $uid);
+function update_user_tel($uid, $link_type, $link_id, $telid, $tel) {
+ require('profil.func.inc.php');
+ $fmt_phone = format_phone_number($tel['tel']);
+ $disp_phone = format_display_number($fmt_phone, $error);
+ XDB::execute("UPDATE profile_phones SET search_tel = {?}, display_tel = {?}, tel_type = {?}, pub = {?}
+ WHERE link_type = {?} AND tel_id = {?} AND link_id = {?} AND uid = {?}",
+ $fmt_phone, $disp_phone, $tel['tel_type'], $tel['tel_pub'],
+ $link_type, $telid, $link_id, $uid);
}
// }}}
// {{{ function remove_user_tel()
-function remove_user_tel($uid, $adrid, $telid) {
- XDB::execute("DELETE FROM tels WHERE telid = {?} AND adrid = {?} AND uid = {?}",
- $telid, $adrid, $uid);
+function remove_user_tel($uid, $link_type, $link_id, $telid) {
+ XDB::execute("DELETE FROM profile_phones WHERE tel_id = {?} AND link_id = {?} AND uid = {?} AND link_type = {?}",
+ $telid, $link_id, $uid, $link_type);
}
// }}}
// {{{ function add_user_pro()
function add_user_pro($uid, $entrid, $pro) {
XDB::execute(
"INSERT INTO entreprises (`uid`, `entrid`, `entreprise`, `poste`, `secteur`, `ss_secteur`, `fonction`,
- `adr1`, `adr2`, `adr3`, `postcode`, `city`, `country`, `region`, `tel`, `fax`, `mobile`, `email`, `web`, `pub`, `adr_pub`, `tel_pub`, `email_pub`)
+ `adr1`, `adr2`, `adr3`, `postcode`, `city`, `country`, `region`, `email`, `web`, `pub`, `adr_pub`, `email_pub`)
SELECT u.user_id, {?}, {?}, {?}, s.id, ss.id, f.id,
{?}, {?}, {?}, {?}, {?}, gp.a2, gr.region, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}
FROM auth_user_md5 AS u
WHERE u.user_id = {?}
LIMIT 1",
$entrid, $pro['entreprise'], $pro['poste'],
- $pro['adr1'], $pro['adr2'], $pro['adr3'], $pro['postcode'], $pro['city'], $pro['tel'], $pro['fax'], $pro['mobile'], $pro['email'], $pro['web'], $pro['pub'], $pro['adr_pub'], $pro['tel_pub'], $pro['email_pub'],
+ $pro['adr1'], $pro['adr2'], $pro['adr3'], $pro['postcode'], $pro['city'], $pro['email'], $pro['web'], $pro['pub'], $pro['adr_pub'], $pro['email_pub'],
$pro['secteur'], $pro['sous_secteur'], $pro['fonction'], $pro['fonction'],
$pro['countrytxt'], $pro['countrytxt'], $pro['region'],
$uid);
+ if (isset($pro['tels']) && is_array($pro['tels'])) {
+ $telid = 0;
+ foreach ($pro['tels'] as $tel) {
+ if ($pro['tel']) {
+ add_user_tel($uid, 'pro', $entrid, $telid, $tel);
+ $telid ++;
+ }
+ }
+ }
}
// }}}
// {{{ function update_user_pro()
$args_set[] = $pro['adr_pub'];
}
- if (isset($pro['tel'])) {
- $set .= ", e.`tel` = {?}, e.`fax` = {?}, e.`mobile` = {?}, e.tel_pub = {?}";
- $args_set[] = $pro['tel'];
- $args_set[] = $pro['fax'];
- $args_set[] = $pro['mobile'];
- $args_set[] = $pro['tel_pub'];
- }
if (isset($pro['email'])) {
$set .= ", e.`email` = {?}, e.`email_pub` = {?}";
$args_set[] = $pro['email'];
$args_where = array($uid, $entrid);
$args = array_merge(array($query), $args_join, $args_set, $args_where);
call_user_func_array(array('XDB', 'execute'), $args);
+
+
+ if (isset($pro['tels']) && is_array($pro['tels'])) {
+ $res = XDB::query("SELECT tel_id FROM profile_phones WHERE uid = {?} AND link_type = 'pro' AND link_id = {?} ORDER BY tel_id", $uid, $entrid);
+ $telids = $res->fetchColumn();
+ foreach ($pro['tels'] as $tel) {
+ if (isset($tel['telid']) && isset($tel['remove']) && $tel['remove']) {
+ remove_user_tel($uid, 'pro', $entrid, $tel['telid']);
+ if (isset($telids[$tel['telid']])) unset($telids[$tel['telid']]);
+ } else if (isset($tel['telid'])) {
+ update_user_tel($uid, 'pro', $entrid, $tel['telid'], $tel);
+ } else {
+ for ($telid = 0; isset($telids[$telid]) && ($telids[$telid] == $telid); $telid++);
+ add_user_tel($uid, 'pro', $entrid, $telid, $tel);
+ }
+ }
+ }
}
// }}}
// {{{ function remove_user_pro()
function remove_user_pro($uid, $entrid) {
XDB::execute("DELETE FROM entreprises WHERE entrid = {?} AND uid = {?}", $entrid, $uid);
+ XDB::execute("DELETE FROM profile_phones WHERE link_id = {?} AND uid = {?} AND link_type = 'pro'", $entrid, $uid);
}
// }}}
-// {{{ function set_user_details()
+// {{{ function set_user_details_addresses()
function set_user_details_addresses($uid, $adrs) {
$res = XDB::query("SELECT adrid FROM adresses WHERE uid = {?} AND adrid >= 1 ORDER BY adrid", $uid);
$adrids = $res->fetchColumn();
if (isset($details['nom_usage'])) {
XDB::execute("UPDATE auth_user_md5 SET nom_usage = {?} WHERE user_id = {?}", strtoupper($details['nom_usage']), $uid);
}
- if (isset($details['mobile'])) {
- XDB::execute("UPDATE auth_user_quick SET profile_mobile = {?} WHERE user_id = {?}", $details['mobile'], $uid);
- }
if (isset($details['nationalite'])) {
XDB::execute(
"UPDATE auth_user_md5 AS u
$uid, $groupex);
}
}
- // applis
+ if (isset($details['tels']) && is_array($details['tels'])) {
+ $res = XDB::query("SELECT tel_id FROM profile_phones WHERE uid = {?} AND link_type = 'user' ORDER BY tel_id", $uid);
+ $telids = $res->fetchColumn();
+ foreach ($details['tels'] as $tel) {
+ if (isset($tel['telid']) && isset($tel['remove']) && $tel['remove']) {
+ remove_user_tel($uid, 'user', 0, $tel['telid']);
+ if (isset($telids[$tel['telid']])) unset($telids[$tel['telid']]);
+ } else if (isset($tel['telid'])) {
+ update_user_tel($uid, 'user', 0, $tel['telid'], $tel);
+ } else {
+ for ($telid = 0; isset($telids[$telid]) && ($telids[$telid] == $telid); $telid++);
+ add_user_tel($uid, 'user', 0, $telid, $tel);
+ }
+ }
+ }
+
+ // education
// medals
}
// }}}
global $globals;
@$globals->search->result_where_statement = '
- LEFT JOIN applis_ins AS ai0 ON (u.user_id = ai0.uid AND ai0.ordre = 0)
- LEFT JOIN applis_def AS ad0 ON (ad0.id = ai0.aid)
- LEFT JOIN applis_ins AS ai1 ON (u.user_id = ai1.uid AND ai1.ordre = 1)
- LEFT JOIN applis_def AS ad1 ON (ad1.id = ai1.aid)
- LEFT JOIN entreprises AS e ON (e.entrid = 0 AND e.uid = u.user_id)
- LEFT JOIN emploi_secteur AS es ON (e.secteur = es.id)
- LEFT JOIN fonctions_def AS ef ON (e.fonction = ef.id)
- LEFT JOIN geoloc_pays AS n ON (u.nationalite = n.a2)
- LEFT JOIN adresses AS adr ON (u.user_id = adr.uid AND FIND_IN_SET(\'active\',adr.statut))
- LEFT JOIN geoloc_pays AS gp ON (adr.country = gp.a2)
- LEFT JOIN geoloc_region AS gr ON (adr.country = gr.a2 AND adr.region = gr.region)
- LEFT JOIN emails AS em ON (em.uid = u.user_id AND em.flags = \'active\')';
+ LEFT JOIN profile_education AS edu ON (u.user_id = edu.uid)
+ LEFT JOIN profile_education_enum AS ede ON (ede.id = edu.eduid)
+ LEFT JOIN entreprises AS e ON (e.entrid = 0 AND e.uid = u.user_id)
+ LEFT JOIN emploi_secteur AS es ON (e.secteur = es.id)
+ LEFT JOIN fonctions_def AS ef ON (e.fonction = ef.id)
+ LEFT JOIN geoloc_pays AS n1 ON (u.nationalite = n1.a2)
+ LEFT JOIN geoloc_pays AS n2 ON (u.nationalite2 = n2.a2)
+ LEFT JOIN geoloc_pays AS n3 ON (u.nationalite2 = n3.a2)
+ LEFT JOIN adresses AS adr ON (u.user_id = adr.uid AND FIND_IN_SET(\'active\',adr.statut))
+ LEFT JOIN geoloc_pays AS gp ON (adr.country = gp.a2)
+ LEFT JOIN geoloc_region AS gr ON (adr.country = gr.a2 AND adr.region = gr.region)
+ LEFT JOIN emails AS em ON (em.uid = u.user_id AND em.flags = \'active\')';
class UserSet extends PlSet
{
{
public function __construct(PlSet &$set, $data, array $params)
{
- require_once 'applis.func.inc.php';
+ require_once 'education.func.inc.php';
global $globals;
$this->entriesPerPage = $globals->search->per_page;
if (@$params['with_score']) {
- $this->addSortKey('score', array('-score', '-date', '-promo', 'nom', 'prenom'), 'pertinence');
+ $this->addSortKey('score', array('-score', '-date', '-promo', 'name_sort'), 'pertinence');
}
- $this->addSortKey('name', array('nom', 'prenom'), 'nom');
- $this->addSortKey('promo', array('-promo', 'nom', 'prenom'), 'promotion');
- $this->addSortKey('date_mod', array('-date', '-promo', 'nom', 'prenom'), 'dernière modification');
+ $this->addSortKey('name', array('name_sort'), 'nom');
+ $this->addSortKey('promo', array('-promo', 'name_sort'), 'promotion');
+ $this->addSortKey('date_mod', array('-date', '-promo', 'name_sort'), 'dernière modification');
parent::__construct($set, $data, $params);
}
u.deces != 0 AS dcd, u.deces, u.matricule_ax,
FIND_IN_SET('femme', u.flags) AS sexe,
e.entreprise, e.web AS job_web, es.label AS secteur, ef.fonction_fr AS fonction,
- IF(n.nat='',n.pays,n.nat) AS nat, n.a2 AS iso3166,
- ad0.text AS app0text, ad0.url AS app0url, ai0.type AS app0type,
- ad1.text AS app1text, ad1.url AS app1url, ai1.type AS app1type,
+ IF(n1.nat='',n1.pays,n1.nat) AS nat1, n1.a2 AS iso3166_1,
+ IF(n2.nat='',n2.pays,n2.nat) AS nat2, n2.a2 AS iso3166_2,
+ IF(n3.nat='',n3.pays,n3.nat) AS nat3, n3.a2 AS iso3166_3,
+ ede0.name AS eduname0, ede0.url AS eduurl0, edd0.degree AS edudegree0,
+ edu0.grad_year AS edugrad_year0, f0.field AS edufield0, edu0.program AS eduprogram0,
+ ede1.name AS eduname1, ede1.url AS eduurl1, edd1.degree AS edudegree1,
+ edu1.grad_year AS edugrad_year1, f1.field AS edufield1, edu1.program AS eduprogram1,
+ ede2.name AS eduname2, ede2.url AS eduurl2, edd2.degree AS edudegree2,
+ edu2.grad_year AS edugrad_year2, f2.field AS edufield2, edu2.program AS eduprogram2,
+ ede3.name AS eduname3, ede3.url AS eduurl3, edd3.degree AS edudegree3,
+ edu3.grad_year AS edugrad_year3, f3.field AS edufield3, edu3.program AS eduprogram3,
adr.city, gp.a2, gp.pays AS countrytxt, gr.name AS region,
- IF(u.nom_usage<>'',u.nom_usage,u.nom) AS sortkey,
- (COUNT(em.email) > 0 OR FIND_IN_SET('googleapps', u.mail_storage) > 0) AS actif" .
+ (COUNT(em.email) > 0 OR FIND_IN_SET('googleapps', u.mail_storage) > 0) AS actif,
+ nd.display AS name_display, nd.tooltip AS name_tooltip, nd.sort AS name_sort" .
(S::logged() ? ", c.contact AS contact" : '');
}
public function joins()
{
- return "LEFT JOIN entreprises AS e ON (e.entrid = 0 AND e.uid = u.user_id".(S::logged() ? "" : " AND e.pub = 'public'").")
- LEFT JOIN emploi_secteur AS es ON (e.secteur = es.id)
- LEFT JOIN fonctions_def AS ef ON (e.fonction = ef.id)
- LEFT JOIN geoloc_pays AS n ON (u.nationalite = n.a2)
- LEFT JOIN applis_ins AS ai0 ON (u.user_id = ai0.uid AND ai0.ordre = 0)
- LEFT JOIN applis_def AS ad0 ON (ad0.id = ai0.aid)
- LEFT JOIN applis_ins AS ai1 ON (u.user_id = ai1.uid AND ai1.ordre = 1)
- LEFT JOIN applis_def AS ad1 ON (ad1.id = ai1.aid)
- LEFT JOIN adresses AS adr ON (u.user_id = adr.uid
- AND FIND_IN_SET('active', adr.statut)".(S::logged() ? "" : " AND adr.pub = 'public'").")
- LEFT JOIN geoloc_pays AS gp ON (adr.country = gp.a2)
- LEFT JOIN geoloc_region AS gr ON (adr.country = gr.a2 AND adr.region = gr.region)
- LEFT JOIN emails AS em ON (em.uid = u.user_id AND em.flags = 'active')" .
+ return "LEFT JOIN entreprises AS e ON (e.entrid = 0 AND e.uid = u.user_id".(S::logged() ? "" : " AND e.pub = 'public'").")
+ LEFT JOIN emploi_secteur AS es ON (e.secteur = es.id)
+ LEFT JOIN fonctions_def AS ef ON (e.fonction = ef.id)
+ LEFT JOIN geoloc_pays AS n1 ON (u.nationalite = n1.a2)
+ LEFT JOIN geoloc_pays AS n2 ON (u.nationalite2 = n2.a2)
+ LEFT JOIN geoloc_pays AS n3 ON (u.nationalite3 = n3.a2)
+ LEFT JOIN profile_education AS edu0 ON (u.user_id = edu0.uid AND edu0.id = 0)
+ LEFT JOIN profile_education_enum AS ede0 ON (ede0.id = edu0.eduid)
+ LEFT JOIN profile_education_degree_enum AS edd0 ON (edd0.id = edu0.degreeid)
+ LEFT JOIN profile_education_field_enum AS f0 ON (f0.id = edu0.fieldid)
+ LEFT JOIN profile_education AS edu1 ON (u.user_id = edu1.uid AND edu1.id = 1)
+ LEFT JOIN profile_education_enum AS ede1 ON (ede1.id = edu1.eduid)
+ LEFT JOIN profile_education_degree_enum AS edd1 ON (edd1.id = edu1.degreeid)
+ LEFT JOIN profile_education_field_enum AS f1 ON (f1.id = edu1.fieldid)
+ LEFT JOIN profile_education AS edu2 ON (u.user_id = edu2.uid AND edu2.id = 2)
+ LEFT JOIN profile_education_enum AS ede2 ON (ede2.id = edu2.eduid)
+ LEFT JOIN profile_education_degree_enum AS edd2 ON (edd2.id = edu2.degreeid)
+ LEFT JOIN profile_education_field_enum AS f2 ON (f2.id = edu2.fieldid)
+ LEFT JOIN profile_education AS edu3 ON (u.user_id = edu3.uid AND edu3.id = 3)
+ LEFT JOIN profile_education_enum AS ede3 ON (ede3.id = edu3.eduid)
+ LEFT JOIN profile_education_degree_enum AS edd3 ON (edd3.id = edu3.degreeid)
+ LEFT JOIN profile_education_field_enum AS f3 ON (f3.id = edu3.fieldid)
+ LEFT JOIN adresses AS adr ON (u.user_id = adr.uid
+ AND FIND_IN_SET('active', adr.statut)".(S::logged() ? "" : "
+ AND adr.pub = 'public'").")
+ LEFT JOIN geoloc_pays AS gp ON (adr.country = gp.a2)
+ LEFT JOIN geoloc_region AS gr ON (adr.country = gr.a2 AND adr.region = gr.region)
+ LEFT JOIN emails AS em ON (em.uid = u.user_id AND em.flags = 'active')
+ INNER JOIN profile_names_display AS nd ON (nd.user_id = u.user_id)" .
(S::logged() ?
- "LEFT JOIN contacts AS c On (c.contact = u.user_id AND c.uid = " . S::v('uid') . ")"
+ "LEFT JOIN contacts AS c ON (c.contact = u.user_id AND c.uid = " . S::v('uid') . ")"
: "");
}
{
$this->entriesPerPage = 10;
$this->addSortKey('rand', array('RAND(' . S::i('uid') . ')'), 'aléatoirement');
- $this->addSortKey('name', array('nom', 'prenom'), 'nom');
- $this->addSortKey('promo', array('-promo', 'nom', 'prenom'), 'promotion');
- $this->addSortKey('date_mod', array('-date', '-promo', 'nom', 'prenom'), 'dernière modification');
+ $this->addSortKey('name', array('name_sort'), 'nom');
+ $this->addSortKey('promo', array('-promo', 'name_sort'), 'promotion');
+ $this->addSortKey('date_mod', array('-date', '-promo', 'name_sort'), 'dernière modification');
parent::__construct($set, $data, $params);
}
public function fields()
{
- return "m.uid, u.prenom, u.nom, u.promo,
- a.alias AS forlife, m.expertise, mp.pid,
- ms.secteur, ms.ss_secteur";
+ return "m.uid, u.promo,
+ a.alias AS bestalias, m.expertise, mp.pid,
+ ms.secteur, ms.ss_secteur,
+ nd.display AS name_display, nd.tooltip AS name_tooltip, nd.sort AS name_sort";
+ }
+
+ public function joins()
+ {
+ return "INNER JOIN profile_names_display AS nd ON (nd.user_id = u.user_id)";
}
public function bounds()
public function __construct(PlSet &$set, $data, array $params)
{
$this->entriesPerPage = 24;
- $this->order = explode(',', Env::v('order', 'nom,prenom,promo'));
+ $this->order = explode(',', Env::v('order', 'name_sort'));
if (@$params['with_score']) {
- $this->addSortKey('score', array('-score', '-watch_last', '-promo', 'nom', 'prenom'), 'pertinence');
+ $this->addSortKey('score', array('-score', '-watch_last', '-promo', 'name_sort'), 'pertinence');
}
- $this->addSortKey('name', array('nom', 'prenom'), 'nom');
- $this->addSortKey('promo', array('-promo', 'nom', 'prenom'), 'promotion');
+ $this->addSortKey('name', array('name_sort'), 'nom');
+ $this->addSortKey('promo', array('-promo', 'name_sort'), 'promotion');
parent::__construct($set, $data, $params);
}
public function fields()
{
- return "u.user_id, IF(u.nom_usage != '', u.nom_usage, u.nom) AS nom, u.prenom, u.promo, a.alias AS forlife ";
+ return "u.user_id, nd.display AS name_display, nd.tooltip AS name_tooltip, nd.sort AS name_sort, u.promo, a.alias AS forlife ";
}
public function joins()
{
- return "INNER JOIN photo AS p ON (p.uid = u.user_id) ";
+ return "INNER JOIN photo AS p ON (p.uid = u.user_id)
+ INNER JOIN profile_names_display AS nd ON (nd.user_id = u.user_id)";
}
public function bounds()
{
return "u.user_id AS id,
u.*, a.alias AS forlife," .
- (S::logged() ? "q.profile_mobile AS mobile, " : "IF(q.profile_mobile_pub = 'public', q.profile_mobile, NULL) as mobile, ") .
"u.perms != 'pending' AS inscrit,
u.perms != 'pending' AS wasinscrit,
u.deces != 0 AS dcd, u.deces,
public function joins()
{
- return "LEFT JOIN adresses AS adr ON (u.user_id = adr.uid AND FIND_IN_SET('active', adr.statut)".(S::logged() ? "" : " AND adr.pub = 'public'").")
- LEFT JOIN geoloc_pays AS gp ON (adr.country = gp.a2)
- LEFT JOIN geoloc_region AS gr ON (adr.country = gr.a2 AND adr.region = gr.region)" .
+ return "LEFT JOIN adresses AS adr ON (u.user_id = adr.uid AND FIND_IN_SET('active', adr.statut)".(S::logged() ? "" : "
+ AND adr.pub = 'public'").")
+ LEFT JOIN geoloc_pays AS gp ON (adr.country = gp.a2)
+ LEFT JOIN geoloc_region AS gr ON (adr.country = gr.a2 AND adr.region = gr.region)" .
(S::logged() ?
- "LEFT JOIN contacts AS c On (c.contact = u.user_id AND c.uid = " . S::v('uid') . ")"
+ "LEFT JOIN contacts AS c ON (c.contact = u.user_id AND c.uid = " . S::v('uid') . ")"
: "");
}
//on ne recupere pas les adresses inutilement
if(!isset($params[2])){
$res = XDB::iterRow(
- "SELECT q.profile_mobile AS cell, a.naissance AS age
- FROM auth_user_md5 AS a
- INNER JOIN auth_user_quick AS q USING (user_id)
- WHERE a.matricule = {?}", $params[1]);
+ "SELECT ph.display_tel AS cell, a.naissance AS age
+ FROM auth_user_md5 AS a
+ INNER JOIN auth_user_quick AS q USING (user_id)
+ LEFT JOIN profile_phones AS ph ON (ph.uid = a.user_id AND link_type='user' AND tel_type = 'mobile')
+ WHERE a.matricule = {?} LIMIT 1", $params[1]);
$array = $res->next();
}
else{
$res = XDB::iterRow(
- "SELECT q.profile_mobile AS cell, a.naissance AS age,
+ "SELECT a.naissance AS age,
adr.adr1, adr.adr2, adr.adr3,
adr.postcode, adr.city, adr.country,
adr.uid, adr.adrid
FIND_IN_SET('res-secondaire', adr.statut),
NOT FIND_IN_SET('courrier', adr.statut)", $params[1]);
//traitement des adresses si necessaire
- if(list($cell, $age, $adr['adr1'], $adr['adr2'], $adr['adr3'], $adr['cp'], $adr['ville'],
+ if(list($age, $adr['adr1'], $adr['adr2'], $adr['adr3'], $adr['cp'], $adr['ville'],
$adr['pays'], $uid, $adr['adrid']) = $res->next())
{
- $array['cell'] = $cell;
+ $sql = XDB::query("SELECT display_tel
+ FROM profile_phones
+ WHERE uid ={?} AND link_type = 'user' AND tel_type = 'mobile'
+ LIMIT 1", $uid);
+ if ($sql->numRows()>0) {
+ $array['cell'] = $sql->fetchOneCell();
+ } else {
+ $array['cell'] ='';
+ }
$array['age'] = $age;
$array['adresse'][] = $adr;
if ($adresse != 1) { //on ne veut pas la premiere adresse
$i = 2;
- while(list($cell, $age, $adr['adr1'], $adr['adr2'], $adr['adr3'], $adr['cp'], $adr['ville'],
+ while(list($age, $adr['adr1'], $adr['adr2'], $adr['adr3'], $adr['cp'], $adr['ville'],
$adr['pays'], , $adr['adrid']) = $res->next())
{
if($adresse == $i){//si on veut cette adresse en particulier
foreach ($array['adresse'] as $i => $a) $adrid_index[$a['adrid']] = $i;
// on rajoute les numéros de tels
$restel = XDB::iterator(
- "SELECT t.tel, t.tel_type, t.adrid
- FROM tels AS t
- INNER JOIN adresses AS a ON (t.adrid = a.adrid AND t.uid = a.uid)
- WHERE t.uid = {?} AND NOT FIND_IN_SET('pro', a.statut)", $uid);
+ "SELECT t.display_tel AS tel, t.tel_type, t.link_id as adrid
+ FROM profile_phones AS t
+ INNER JOIN adresses AS a ON (t.link_id = a.adrid AND t.uid = a.uid)
+ WHERE t.uid = {?} AND t.link_type = 'address' AND NOT FIND_IN_SET('pro', a.statut)", $uid);
while ($tel = $restel->next()) $array['adresse'][$adrid_index[$tel['adrid']]]['tels'][] = $tel;
foreach ($array['adresse'] as $i => $adr) {
unset($lasttel);
--- /dev/null
+<?php
+/***************************************************************************
+ * Copyright (C) 2003-2008 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 *
+ ***************************************************************************/
+
+require_once 'xorg.misc.inc.php';
+
+class XorgSession
+{
+ // {{{ public static function init
+
+ public static function init()
+ {
+ S::init();
+ if (!S::has('uid')) {
+ try_cookie();
+ }
+ if ((check_ip('dangerous') && S::has('uid')) || check_account()) {
+ $_SESSION['log']->log("view_page", $_SERVER['REQUEST_URI']);
+ }
+ }
+
+ // }}}
+ // {{{ public static function destroy()
+
+ public static function destroy()
+ {
+ S::destroy();
+ XorgSession::init();
+ }
+
+ // }}}
+ // {{{ public static function doAuth()
+
+ public static function doAuth($new_name = false)
+ {
+ global $globals;
+ if (S::identified()) { // ok, c'est bon, on n'a rien à faire
+ return true;
+ }
+
+ if (!Env::has('username') || !Env::has('response')
+ || !S::has('challenge'))
+ {
+ return false;
+ }
+
+ // si on vient de recevoir une identification par passwordpromptscreen.tpl
+ // ou passwordpromptscreenlogged.tpl
+ if (S::has('suid')) {
+ $suid = S::v('suid');
+ $login = $uname = $suid['forlife'];
+ $redirect = false;
+ } else {
+ $uname = Env::v('username');
+
+ if (Env::v('domain') == "alias") {
+ $res = XDB::query(
+ "SELECT redirect
+ FROM virtual
+ INNER JOIN virtual_redirect USING(vid)
+ WHERE alias LIKE {?}", $uname."@".$globals->mail->alias_dom);
+ $redirect = $res->fetchOneCell();
+ if ($redirect) {
+ $login = substr($redirect, 0, strpos($redirect, '@'));
+ } else {
+ $login = "";
+ }
+ } else {
+ $login = $uname;
+ $redirect = false;
+ }
+ }
+
+ $field = (!$redirect && preg_match('/^\d*$/', $uname)) ? 'id' : 'alias';
+ $res = XDB::query(
+ "SELECT u.user_id, u.password
+ FROM auth_user_md5 AS u
+ INNER JOIN aliases AS a ON ( a.id=u.user_id AND type!='homonyme' )
+ WHERE a.$field = {?} AND u.perms IN('admin','user')", $login);
+
+ $logger = S::v('log');
+ if (list($uid, $password) = $res->fetchOneRow()) {
+ require_once('secure_hash.inc.php');
+ $expected_response = hash_encrypt("$uname:$password:".S::v('challenge'));
+ // le password de la base est peut-être encore encodé en md5
+ if (Env::v('response') != $expected_response) {
+ $new_password = hash_xor(Env::v('xorpass'), $password);
+ $expected_response = hash_encrypt("$uname:$new_password:".S::v('challenge'));
+ if (Env::v('response') == $expected_response) {
+ XDB::execute("UPDATE auth_user_md5 SET password = {?} WHERE user_id = {?}",
+ $new_password, $uid);
+ }
+ }
+ if (Env::v('response') == $expected_response) {
+ if (Env::has('domain')) {
+ if (($domain = Env::v('domain', 'login')) == 'alias') {
+ setcookie('ORGdomain', "alias", (time()+25920000), '/', '', 0);
+ } else {
+ setcookie('ORGdomain', '', (time()-3600), '/', '', 0);
+ }
+ // pour que la modification soit effective dans le reste de la page
+ $_COOKIE['ORGdomain'] = $domain;
+ }
+
+ S::kill('challenge');
+ if ($logger) {
+ $logger->log('auth_ok');
+ }
+ if (!start_connexion($uid, true)) {
+ return false;
+ }
+ if (Env::v('remember', 'false') == 'true') {
+ $cookie = hash_encrypt(S::v('password'));
+ setcookie('ORGaccess',$cookie,(time()+25920000),'/','',0);
+ if ($logger) {
+ $logger->log("cookie_on");
+ }
+ } else {
+ setcookie('ORGaccess', '', time() - 3600, '/', '', 0);
+
+ if ($logger) {
+ $logger->log("cookie_off");
+ }
+ }
+ return true;
+ } elseif ($logger) {
+ $logger->log('auth_fail','bad password');
+ }
+ } elseif ($logger) {
+ $logger->log('auth_fail','bad login');
+ }
+
+ return false;
+ }
+
+ // }}}
+ // {{{ public static function doAuthCookie()
+
+ /** Try to do a cookie-based authentication.
+ *
+ * @param page the calling page (by reference)
+ */
+ public static function doAuthCookie()
+
+ {
+ if (S::logged()) {
+ return true;
+ }
+
+ if (Env::has('username') and Env::has('response')) {
+ return XorgSession::doAuth();
+ }
+
+ if ($r = try_cookie()) {
+ return XorgSession::doAuth(($r > 0));
+ }
+
+ return false;
+ }
+
+ // }}}
+ // {{{ public static function make_perms()
+
+ public static function &make_perms($perm)
+ {
+ $flags = new FlagSet();
+ if ($perm == 'disabled' || $perm == 'ext') {
+ return $flags;
+ }
+ $flags->addFlag(PERMS_USER);
+ if ($perm == 'admin') {
+ $flags->addFlag(PERMS_ADMIN);
+ }
+ return $flags;
+ }
+
+ // }}}
+}
+
+// {{{ function try_cookie()
+
+/** réalise la récupération de $_SESSION pour qqn avec cookie
+ * @return int 0 if all OK, -1 if no cookie, 1 if cookie with bad hash,
+ * -2 should not happen
+ */
+function try_cookie()
+{
+ if (Cookie::v('ORGaccess') == '' or !Cookie::has('ORGuid')) {
+ return -1;
+ }
+
+ $res = @XDB::query(
+ "SELECT user_id,password FROM auth_user_md5
+ WHERE user_id = {?} AND perms IN('admin','user')",
+ Cookie::i('ORGuid'));
+
+ if ($res->numRows() != 0) {
+ list($uid, $password) = $res->fetchOneRow();
+ require_once('secure_hash.inc.php');
+ $expected_value = hash_encrypt($password);
+ if ($expected_value == Cookie::v('ORGaccess')) {
+ if (!start_connexion($uid, false)) {
+ return -3;
+ }
+ return 0;
+ } else {
+ return 1;
+ }
+ }
+
+ return -2;
+}
+
+// }}}
+// {{{ function start_connexion()
+
+/** place les variables de session dépendants de auth_user_md5
+ * et met à jour les dates de dernière connexion si nécessaire
+ * @return void
+ * @see controlpermanent.inc.php controlauthentication.inc.php
+ */
+function start_connexion ($uid, $identified)
+{
+ $res = XDB::query("
+ SELECT u.user_id AS uid, nom_usage, perms, promo, promo_sortie,
+ matricule, password, FIND_IN_SET('femme', u.flags) AS femme,
+ a.alias AS forlife, a2.alias AS bestalias,
+ q.core_mail_fmt AS mail_fmt, UNIX_TIMESTAMP(q.banana_last) AS banana_last, q.watch_last, q.core_rss_hash,
+ FIND_IN_SET('watch', u.flags) AS watch_account, q.last_version,
+ nd.display AS display_name, nd.yourself AS yourself_name,
+ nd.firstname AS prenom, nd.lastname AS nom
+ FROM auth_user_md5 AS u
+ INNER JOIN auth_user_quick AS q USING(user_id)
+ INNER JOIN aliases AS a ON (u.user_id = a.id AND a.type='a_vie')
+ INNER JOIN aliases AS a2 ON (u.user_id = a2.id AND FIND_IN_SET('bestalias',a2.flags))
+ INNER JOIN profile_names_display AS nd ON (u.user_id = nd.user_id)
+ WHERE u.user_id = {?} AND u.perms IN('admin','user')", $uid);
+ $sess = $res->fetchOneAssoc();
+ $res = XDB::query("SELECT UNIX_TIMESTAMP(s.start) AS lastlogin, s.host
+ FROM logger.sessions AS s
+ WHERE s.uid = {?} AND s.suid = 0
+ ORDER BY s.start DESC
+ LIMIT 1", $uid);
+ if ($res->numRows()) {
+ $sess = array_merge($sess, $res->fetchOneAssoc());
+ }
+ $suid = S::v('suid');
+
+ if ($suid) {
+ $logger = new CoreLogger($uid, $suid['uid']);
+ $logger->log("suid_start", S::v('forlife')." by {$suid['uid']}");
+ $sess['suid'] = $suid;
+ } else {
+ $logger = S::v('log', new CoreLogger($uid));
+ $logger->log("connexion", Env::v('n'));
+ setcookie('ORGuid', $uid, (time()+25920000), '/', '', 0);
+ }
+
+ $_SESSION = array_merge($_SESSION, $sess);
+ $_SESSION['log'] = $logger;
+ $_SESSION['auth'] = ($identified ? AUTH_MDP : AUTH_COOKIE);
+ $_SESSION['perms'] =& XorgSession::make_perms($_SESSION['perms']);
+ $mail_subject = null;
+ if (check_account()) {
+ $mail_subject = "Connexion d'un utilisateur surveillé";
+ }
+ if (check_ip('unsafe')) {
+ if ($mail_subject) {
+ $mail_subject .= ' - ';
+ }
+ $mail_subject .= "Une IP surveillee a tente de se connecter";
+ if (check_ip('ban')) {
+ send_warning_mail($mail_subject);
+ $_SESSION = array();
+ $_SESSION['perms'] = new FlagSet();
+ $newpage = false;
+ if (!Platal::page()) {
+ require_once 'xorg.inc.php';
+ new_skinned_page('platal/index.tpl');
+ $newpage = true;
+ }
+ Platal::page()->trigError("Une erreur est survenue lors de la procédure d'authentification. "
+ ."Merci de contacter au plus vite "
+ ."<a href='mailto:support@polytechnique.org'>support@polytechnique.org</a>");
+ if ($newpage) {
+ Platal::page()->run();
+ }
+ return false;
+ }
+ }
+ if ($mail_subject) {
+ send_warning_mail($mail_subject);
+ }
+ set_skin();
+ update_NbNotifs();
+ check_redirect();
+ return true;
+}
+
+// }}}
+
+function set_skin()
+{
+ global $globals;
+ if (S::logged() && (!S::has('skin') || S::has('suid'))) {
+ $uid = S::v('uid');
+ $res = XDB::query("SELECT skin_tpl
+ FROM auth_user_quick AS a
+ INNER JOIN skins AS s ON a.skin = s.id
+ WHERE user_id = {?} AND skin_tpl != ''", $uid);
+ if ($_SESSION['skin'] = $res->fetchOneCell()) {
+ return;
+ }
+ }
+}
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+?>
$actifs = Env::v('emails_actifs', Array());
print_r(Env::v('emails_rewrite'));
if (Env::v('emailop') == "ajouter" && Env::has('email')) {
- $retour = $redirect->add_email(Env::v('email'));
+ $new_email = Env::v('email');
+ if ($new_email == "new@example.org") {
+ $new_email = Env::v('email_new');
+ }
+ $retour = $redirect->add_email($new_email);
+ if ($retour == ERROR_INVALID_EMAIL) {
+ $page->assign('email', $new_email);
+ }
+ $page->assign('retour', $retour);
} elseif (empty($actifs)) {
$retour = ERROR_INACTIVE_REDIRECTION;
} elseif (is_array($actifs)) {
require_once 'googleapps.inc.php';
$page->assign('googleapps', GoogleAppsAccount::account_status($uid));
+
+ require_once 'emails.combobox.inc.php';
+ fill_email_combobox($page);
}
function handler_antispam(&$page, $statut_filtre = null)
--- /dev/null
+<?php
+/***************************************************************************
+ * Copyright (C) 2003-2007 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 *
+ ***************************************************************************/
+
+/**
+ * @brief Module to merge data from AX database
+ *
+ * Module to import data from another database of alumni that had
+ * different schemas. The organization that used this db is called AX
+ * hence the name of this module.
+ *
+ * Datas are stored in an external server and you need a private key
+ * to connect to their server.
+ */
+class FusionAxModule extends PLModule
+{
+ function __construct()
+ {
+ }
+
+ function handlers()
+ {
+ return array(
+ 'fusionax' => $this->make_hook('index', AUTH_MDP, 'admin'),
+ 'fusionax/import' => $this->make_hook('import', AUTH_MDP, 'admin'),
+ 'fusionax/view' => $this->make_hook('view', AUTH_MDP, 'admin'),
+ 'fusionax/ids' => $this->make_hook('ids', AUTH_MDP, 'admin'),
+ 'fusionax/deceased' => $this->make_hook('deceased', AUTH_MDP, 'admin'),
+ );
+ }
+
+
+ function handler_index(&$page)
+ {
+ $globals = Platal::globals();
+
+ $page->changeTpl('fusionax/index.tpl');
+ $page->assign('xorg_title', 'Polytechnique.org - Fusion des annuaires');
+ if (isset($globals->fusionax) && isset($globals->fusionax->LastUpdate)) {
+ $page->assign('lastimport', date("d-m-Y", $globals->fusionax->LastUpdate));
+ }
+ }
+
+ /** Import de l'annuaire de l'AX depuis l'export situé dans le home de jacou */
+ function handler_import(&$page, $action = 'index', $fileSQL = '')
+ {
+ $globals = Platal::globals();
+
+ if ($action == 'index') {
+ $page->changeTpl('fusionax/import.tpl');
+ $page->addJsLink('jquery.js');
+ if (isset($globals->fusionax) && isset($globals->fusionax->LastUpdate)) {
+ $page->assign(
+ 'lastimport',
+ "le " . date("d/m/Y à H:i", $globals->fusionax->LastUpdate));
+ }
+ return;
+ }
+
+ // toutes les actions sont faites en ajax en utilisant jquery
+ header("Content-type: text/javascript; charset=utf-8");
+
+ // log des actions
+ $report = array();
+
+ // création d'un fichier temporaire si nécessaire
+ if (Env::has('tmpdir')) {
+ $tmpdir = Env::v('tmpdir');
+ } else {
+ $tmpdir = tempnam('/tmp', 'fusionax');
+ unlink($tmpdir);
+ mkdir($tmpdir);
+ chmod($tmpdir, 0700);
+ }
+
+ $modulepath = realpath(dirname(__FILE__) . '/fusionax/') . '/';
+ $olddir = getcwd();
+ chdir($tmpdir);
+
+ if ($action == 'launch') {
+ // séparation de l'archive en fichiers par tables
+ exec($modulepath . 'import-ax.sh', $report);
+ $report[] = 'Fichier parsé.';
+ $report[] = 'Import dans la base en cours...';
+ $next = 'integrateSQL';
+ } elseif ($action == 'integrateSQL') {
+ // intégration des données dans la base MySQL
+ // liste des fichiers sql à exécuter
+ $filesSQL = array(
+ 'Activites.sql',
+ 'Adresses.sql',
+ 'Anciens.sql',
+ 'Formations.sql',
+ 'Entreprises.sql');
+ if ($fileSQL != '') {
+ // récupère le contenu du fichier sql
+ $queries = explode(';', file_get_contents($modulepath . $fileSQL));
+ foreach ($queries as $q) {
+ if (trim($q)) {
+ // coupe le fichier en requêtes individuelles
+ if (substr($q, 0, 2) == '--') {
+ // affiche les commentaires dans le report
+ $lines = explode("\n", $q);
+ $l = $lines[0];
+ $report[] = addslashes($l);
+ }
+ // exécute la requête
+ XDB::execute($q);
+ }
+ }
+ // trouve le prochain fichier à exécuter
+ $trans = array_flip($filesSQL);
+ $nextfile = $trans[$fileSQL] + 1;
+ } else {
+ $nextfile = 0;
+ }
+ if (!isset($filesSQL[$nextfile])) {
+ // tous les fichiers ont été exécutés, on passe à l'étape
+ // suivante
+ $next = 'clean';
+ } else {
+ // on passe au fichier suivant
+ $next = 'integrateSQL/' . $filesSQL[$nextfile];
+ }
+ } elseif ($action == 'clean') {
+ // nettoyage du fichier temporaire
+ chdir($olddir);
+ exec("rm -Rf $tmpdir", $report);
+ $report[] = "Fin de l\'import";
+ // met à jour la date de dernier import
+ //$globals->change_dynamic_config(array('LastUpdate' => time()), 'FusionAx');
+ }
+ foreach($report as $t) {
+ // affiche les lignes de report
+ echo "$('#fusionax_import').append('" . $t . "<br/>');\n";
+ }
+ if (isset($next)) {
+ $tmpdir = getcwd();
+ chdir($olddir);
+ // lance le prochain script s'il y en a un
+ echo "$.getScript('fusionax/import/" . $next . "?tmpdir=" . urlencode($tmpdir) . "');";
+ }
+ // exit pour ne pas afficher la page template par défaut
+ exit;
+ }
+
+ /** Import de l'annuaire de l'AX depuis l'export situé dans le home de jacou */
+ function handler_view(&$page, $action = '')
+ {
+ $globals = Platal::globals();
+
+ $page->changeTpl('fusionax/view.tpl');
+ if ($action == 'create') {
+ XDB::execute('DROP VIEW IF EXISTS fusionax_deceased');
+ XDB::execute('CREATE VIEW fusionax_deceased AS
+ SELECT u.user_id, a.id_ancien, u.nom, u.prenom, u.promo, u.deces AS deces_xorg, a.Date_deces AS deces_ax
+ FROM auth_user_md5 i AS u
+ INNER JOIN fusionax_anciens AS a ON (a.id_ancien = u.matricule_ax)
+ WHERE u.deces != a.Date_deces');
+ XDB::execute('DROP VIEW IF EXISTS fusionax_promo');
+ XDB::execute('CREATE VIEW fusionax_promo AS
+ SELECT u.user_id, u.matricule_ax, u.nom, u.prenom, u.promo AS promo_etude_xorg,
+ f.promotion_etude AS promo_etude_ax, u.promo_sortie AS promo_sortie_xorg
+ FROM auth_user_md5 AS u
+ INNER JOIN fusionax_anciens AS f ON (u.matricule_ax = f.id_ancien)
+ WHERE u.promo != f.promotion_etude AND !(f.promotion_etude = u.promo + 1 AND u.promo_sortie = u.promo + 4)');
+ }
+ }
+
+ /* Mets à NULL le matricule_ax de ces camarades pour marquer le fait qu'ils ne figurent pas dans l'annuaire de l'AX */
+ private static function clear_wrong_in_xorg($user_id)
+ {
+ $res = XDB::execute("UPDATE fusionax_xorg_anciens
+ SET matricule_ax = NULL
+ WHERE user_id = {?}", $user_id);
+ if (!$res) {
+ return 0;
+ }
+ return XDB::affectedRows() / 2;
+ }
+
+ /* Cherche les les anciens présents dans Xorg avec un matricule_ax ne correspondant à rien dans la base de l'AX
+ * (mises à part les promo 1921 et 1923 qui ne figurent pas dans les données de l'AX)*/
+ private static function find_wrong_in_xorg($limit = 10)
+ {
+ return XDB::iterator("SELECT u.promo, u.user_id, u.display_name
+ FROM fusionax_xorg_anciens AS u
+ WHERE NOT EXISTS (SELECT *
+ FROM fusionax_anciens AS f
+ WHERE f.id_ancien = u.matricule_ax)
+ AND u.matricule_ax IS NOT NULL AND promo != 1921 AND promo != 1923");
+ }
+
+ /** Lier les identifiants d'un ancien dans les deux annuaires
+ * @param user_id identifiant dans l'annuaire X.org
+ * @param matricule_ax identifiant dans l'annuaire de l'AX
+ * @return 0 si la liaison a échoué, 1 sinon
+ */
+ private static function link_by_ids($user_id, $matricule_ax)
+ {
+ $res = XDB::execute("UPDATE fusionax_import AS i
+ INNER JOIN fusionax_xorg_anciens AS u
+ SET u.matricule_ax = i.id_ancien,
+ i.user_id = u.user_id,
+ i.date_match_id = NOW()
+ WHERE i.id_ancien = {?} AND u.user_id = {?}
+ AND (u.matricule_ax != {?} OR u.matricule_ax IS NULL
+ OR i.user_id != {?} OR i.user_id IS NULL)",
+ $matricule_ax, $user_id, $matricule_ax, $user_id);
+ if (!$res) {
+ return 0;
+ }
+ return XDB::affectedRows() / 2;
+ }
+
+ /** Recherche automatique d'anciens à lier entre les deux annuaires
+ * @param limit nombre d'anciens à trouver au max
+ * @param sure si true, ne trouve que des anciens qui sont quasi sûrs
+ * @return un XOrgDBIterator sur les entrées avec display_name, promo,
+ * user_id, id_ancien et display_name_ax
+ */
+ private static function find_easy_to_link($limit = 10, $sure = false)
+ {
+ $easy_to_link = XDB::iterator("
+ SELECT u.display_name, u.promo, u.user_id, ax.id_ancien,
+ CONCAT(ax.prenom, ' ', ax.nom_complet, ' (X ', ax.promotion_etude, ')') AS display_name_ax,
+ COUNT(*) AS nbMatches
+ FROM fusionax_anciens AS ax
+ INNER JOIN fusionax_import AS i ON (i.id_ancien = ax.id_ancien AND i.user_id IS NULL)
+ LEFT JOIN fusionax_xorg_anciens AS u ON (u.matricule_ax IS NULL
+ AND ax.Nom_patronymique = u.nom
+ AND ax.prenom = u.prenom
+ AND u.promo = ax.promotion_etude)
+ GROUP BY u.user_id
+ HAVING u.user_id IS NOT NULL AND nbMatches = 1 " . ($limit ? ('LIMIT ' . $limit) : ''));
+ if ($easy_to_link->total() > 0 || $sure) {
+ return $easy_to_link;
+ }
+ return XDB::iterator("
+ SELECT u.display_name, u.promo, u.user_id, ax.id_ancien,
+ CONCAT(ax.prenom, ' ', ax.nom_complet, ' (X ', ax.promotion_etude, ')') AS display_name_ax,
+ COUNT(*) AS nbMatches
+ FROM fusionax_anciens AS ax
+ INNER JOIN fusionax_import AS i ON (i.id_ancien = ax.id_ancien AND i.user_id IS NULL)
+ LEFT JOIN fusionax_xorg_anciens AS u ON (u.matricule_ax IS NULL
+ AND (ax.Nom_patronymique = u.nom
+ OR ax.Nom_patronymique LIKE CONCAT(u.nom, ' %')
+ OR ax.Nom_patronymique LIKE CONCAT(u.nom, '-%')
+ OR ax.Nom_usuel = u.nom
+ OR u.nom LIKE CONCAT('% ', ax.Nom_patronymique))
+ AND u.promo < ax.promotion_etude + 2
+ AND u.promo > ax.promotion_etude - 2)
+ GROUP BY u.user_id
+ HAVING u.user_id IS NOT NULL AND nbMatches = 1 " . ($limit ? ('LIMIT ' . $limit) : ''));
+ }
+
+ /** Module de mise en correspondance les ids */
+ function handler_ids(&$page, $part = 'main', $user_id = null, $matricule_ax = null)
+ {
+ $globals = Platal::globals();
+ $nbToLink = 100;
+
+ $page->addJsLink('jquery.js');
+ $page->assign('xorg_title', 'Polytechnique.org - Fusion - Mise en correspondance simple');
+ if ($part == 'missingInAX') {
+ // locate all persons from this database that are not in AX's
+ $page->changeTpl('fusionax/idsMissingInAx.tpl');
+ $missingInAX = XDB::iterator("SELECT promo, user_id, display_name
+ FROM fusionax_xorg_anciens
+ WHERE matricule_ax IS NULL");
+ $page->assign('missingInAX', $missingInAX);
+ return;
+ }
+ if ($part == 'missingInXorg') {
+ // locate all persons from AX's database that are not here
+ $page->changeTpl('fusionax/idsMissingInXorg.tpl');
+ $missingInXorg = XDB::iterator("SELECT a.promotion_etude AS promo,
+ CONCAT(a.prenom, ' ', a.Nom_usuel) AS display_name,
+ a.id_ancien
+ FROM fusionax_import
+ INNER JOIN fusionax_anciens AS a USING (id_ancien)
+ WHERE fusionax_import.user_id IS NULL");
+ $page->assign('missingInXorg', $missingInXorg);
+ return;
+ }
+ if ($part == 'wrongInXorg') {
+ // locate all persons from Xorg database that have a bad AX id
+ $page->changeTpl('fusionax/idswrongInXorg.tpl');
+ $wrongInXorg = FusionAxModule::find_wrong_in_xorg($nbToLink);
+ $page->assign('wrongInXorg', $wrongInXorg);
+ return;
+ }
+ if ($part == 'cleanwronginxorg') {
+ $linksToDo = FusionAxModule::find_wrong_in_xorg($nbToLink);
+ while ($l = $linksToDo->next()) {
+ FusionAxModule::clear_wrong_in_xorg($l['user_id']);
+ }
+ pl_redirect('fusionax/ids/wrongInXorg');
+ }
+ if ($part == 'lier') {
+ if (Post::has('user_id') && Post::has('matricule_ax')) {
+ FusionAxModule::link_by_ids(Post::i('user_id'), Post::v('matricule_ax'));
+ }
+ }
+ if ($part == 'link') {
+ FusionAxModule::link_by_ids($user_id, $matricule_ax);
+ exit;
+ }
+ if ($part == 'linknext') {
+ $linksToDo = FusionAxModule::find_easy_to_link($nbToLink);
+ while ($l = $linksToDo->next()) {
+ FusionAxModule::link_by_ids($l['user_id'], $l['id_ancien']);
+ }
+ pl_redirect('fusionax/ids#autolink');
+ }
+ if ($part == 'linkall') {
+ $linksToDo = FusionAxModule::find_easy_to_link(0);
+ while ($l = $linksToDo->next()) {
+ FusionAxModule::link_by_ids($l['user_id'], $l['id_ancien']);
+ }
+ }
+ {
+ $page->changeTpl('fusionax/ids.tpl');
+ $missingInAX = XDB::query('SELECT COUNT(*)
+ FROM fusionax_xorg_anciens AS u
+ WHERE u.matricule_ax IS NULL');
+ if ($missingInAX) {
+ $page->assign('nbMissingInAX', $missingInAX->fetchOneCell());
+ }
+ $missingInXorg = XDB::query('SELECT COUNT(*)
+ FROM fusionax_import AS i
+ WHERE i.user_id IS NULL');
+ if ($missingInXorg) {
+ $page->assign('nbMissingInXorg', $missingInXorg->fetchOneCell());
+ }
+ $wrongInXorg = FusionAxModule::find_wrong_in_xorg($nbToLink);
+ if ($wrongInXorg->total() > 0) {
+ $page->assign('wrongInXorg', $wrongInXorg->total());
+ }
+ $easyToLink = FusionAxModule::find_easy_to_link($nbToLink);
+ if ($easyToLink->total() > 0) {
+ $page->assign('nbMatch', $easyToLink->total());
+ $page->assign('easyToLink', $easyToLink);
+ }
+ }
+ }
+
+ function handler_deceased(&$page, $action = '')
+ {
+ if ($action == 'updateXorg') {
+ XDB::execute('UPDATE fusionax_deceased
+ SET deces_xorg = deces_ax
+ WHERE deces_xorg = "0000-00-00"');
+ }
+ if ($action == 'updateAX') {
+ XDB::execute('UPDATE fusionax_deceased
+ SET deces_ax = deces_xorg
+ WHERE deces_ax = "0000-00-00"');
+ }
+ if ($action == 'update') {
+ if (Post::has('user_id') && Post::has('date')) {
+ XDB::execute('UPDATE fusionax_deceased
+ SET deces_ax = {?}, deces_xorg = {?}
+ WHERE user_id = {?}',
+ Post::v('date'), Post::v('date'), Post::i('user_id'));
+ }
+ }
+ $page->changeTpl('fusionax/deceased.tpl');
+ // deceased
+ $deceasedErrorsSql = XDB::query('SELECT COUNT(*) FROM fusionax_deceased');
+ $page->assign('deceasedErrors', $deceasedErrorsSql->fetchOneCell());
+ $res = XDB::iterator('SELECT d.user_id, d.id_ancien, d.nom, d.prenom, d.promo, d.deces_ax,
+ CONCAT(d.prenom, " ", d.nom) AS display_name
+ FROM fusionax_deceased AS d
+ WHERE d.deces_xorg = "0000-00-00"
+ LIMIT 10');
+ $page->assign('nbDeceasedMissingInXorg', $res->total());
+ $page->assign('deceasedMissingInXorg', $res);
+ $res = XDB::iterator('SELECT d.user_id, d.id_ancien, d.nom, d.prenom, d.promo, d.deces_xorg,
+ CONCAT(d.prenom, " ", d.nom) AS display_name
+ FROM fusionax_deceased AS d
+ WHERE d.deces_ax = "0000-00-00"
+ LIMIT 10');
+ $page->assign('nbDeceasedMissingInAX', $res->total());
+ $page->assign('deceasedMissingInAX', $res);
+ $res = XDB::iterator('SELECT d.user_id, d.id_ancien, d.nom, d.prenom, d.promo,
+ d.deces_ax, d.deces_xorg,
+ CONCAT(d.prenom, " ", d.nom, " ", d.user_id) AS display_name
+ FROM fusionax_deceased AS d
+ WHERE d.deces_xorg != "0000-00-00" AND d.deces_ax != "0000-00-00"');
+ $page->assign('nbDeceasedDifferent', $res->total());
+ $page->assign('deceasedDifferent', $res);
+ }
+}
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:?>
--- /dev/null
+-- Import complet des activités professionnelles
+
+DROP TABLE IF EXISTS `fusionax_activites`;
+
+CREATE TABLE IF NOT EXISTS `fusionax_activites` (
+ `AC` CHAR(2) NOT NULL COMMENT 'Vaut toujours AC pour cette table',
+ `id_ancien` VARCHAR(8) NOT NULL COMMENT 'Id unique de l''ancien',
+ `hash_activite` BINARY(5) NOT NULL COMMENT 'Hash de cette ligne pour la lier à l''adresse',
+ `Code_etab` BIGINT(10) NOT NULL COMMENT 'Code de l''établissement',
+ `Raison_sociale` VARCHAR(255) collate utf8_general_ci NOT NULL COMMENT 'Raison sociale de l''établissement',
+ `Libelle_fonctio` VARCHAR(255) collate utf8_general_ci NOT NULL COMMENT 'Libéllé de la fonction',
+ `Annuaire` BOOLEAN NOT NULL COMMENT 'publiable dans l''annuaire papier',
+ `Date_maj` DATE NOT NULL COMMENT 'Date de mise à jour de ces informations',
+ PRIMARY KEY( `id_ancien` , `hash_activite` )
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
+
+LOAD DATA LOCAL INFILE 'Activites.txt' INTO TABLE `fusionax_activites` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'
+(AC, id_ancien, Code_etab, Raison_sociale, Libelle_fonctio, Annuaire,
+@Ligne1, @Ligne2, @Ligne3, @code_postal, @ville, @zip_cedex, @etat_distr, @pays, @tel, @fax, @StringDate_maj)
+SET
+`hash_activite` = SUBSTRING( MD5( CONCAT(Code_etab, Libelle_fonctio) ), 1, 5),
+`Date_maj` = CONCAT(SUBSTRING(@StringDate_maj,7),'-',SUBSTRING(@StringDate_maj,4,2),'-',SUBSTRING(@StringDate_maj,1,2));
--- /dev/null
+-- Import complet des adresses
+
+DROP TABLE IF EXISTS fusionax_adresses;
+
+CREATE TABLE IF NOT EXISTS fusionax_adresses (
+ provenance CHAR(2) NOT NULL COMMENT 'Vaut AC, AD ou AN selon la provenance de l''info',
+ id_ancien VARCHAR(8) NOT NULL COMMENT 'Id unique de l''ancien',
+ Type_adr ENUM('E', 'P') character set binary NOT NULL DEFAULT 'P' COMMENT 'Type d''adresse : E pour Entreprise, P pour Personnelle',
+ hash_adresse BINARY(5) NOT NULL COMMENT 'Hash pour différencier les diverses adresses',
+ Ligne1 VARCHAR(90) character set utf8 NOT NULL,
+ Ligne2 VARCHAR(90) character set utf8 NOT NULL,
+ Ligne3 VARCHAR(90) character set utf8 NOT NULL,
+ code_postal VARCHAR(20) character set utf8 NOT NULL,
+ ville VARCHAR(80) character set utf8 NOT NULL,
+ zip_cedex VARCHAR(20) character set utf8 NOT NULL,
+ etat_distr VARCHAR(20) character set utf8 NOT NULL,
+ pays VARCHAR(50) character set utf8 NOT NULL,
+ tel VARCHAR(30) NOT NULL,
+ fax VARCHAR(30) NOT NULL,
+ Date_maj DATE NOT NULL,
+ PRIMARY KEY (id_ancien, hash_adresse)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
+
+LOAD DATA LOCAL INFILE 'Adresses.txt' INTO TABLE `fusionax_adresses` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'
+(provenance, id_ancien, @Type_adr, Ligne1, Ligne2, Ligne3, code_postal, ville, zip_cedex, etat_distr, pays, tel, fax, @StringDate_maj)
+SET
+`Type_adr` = IF(@Type_adr = 'E', 'E', IF(@Type_adr = '', '', 'P')),
+`hash_adresse` = SUBSTRING( MD5( @Type_adr ), 1, 5),
+`Date_maj` = CONCAT(SUBSTRING(@StringDate_maj,7),'-',SUBSTRING(@StringDate_maj,4,2),'-',SUBSTRING(@StringDate_maj,1,2));
+
+LOAD DATA LOCAL INFILE 'Anciens.txt' INTO TABLE `fusionax_adresses` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'
+(provenance, id_ancien, @Login, @Password, @promotion_etude, @Groupe_promo, @Nom_patronymique, @partic_patro, @prenom, @Nom_usuel, @partic_nom,
+ @Nom_complet, @Civilite, @Code_nationalite, @Type_membre, @corps_sortie, @StringDate_deces, @grade, @Mel_usage, @Mel_publiable,
+ @tel_mobile, @annee_dernCot, @Representant, @Type_adr, Ligne1, Ligne2, Ligne3, code_postal, ville,
+ zip_cedex, etat_distr, pays, tel, fax, @StringDate_maj)
+SET
+`Type_adr` = IF(@Type_adr = 'E', 'E', IF(@Type_adr = '', '', 'P')),
+`hash_adresse` = SUBSTRING( MD5( @Type_adr ), 1, 5),
+`Date_maj` = CONCAT(SUBSTRING(@StringDate_maj,7),'-',SUBSTRING(@StringDate_maj,4,2),'-',SUBSTRING(@StringDate_maj,1,2));
+
+LOAD DATA LOCAL INFILE 'Activites.txt' INTO TABLE `fusionax_adresses` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'
+(provenance, id_ancien, @Code_etab, @Raison_sociale, @Libelle_fonctio, @Annuaire,
+Ligne1, Ligne2, Ligne3, code_postal, ville, zip_cedex, etat_distr, pays, tel, fax, @StringDate_maj)
+SET
+`Type_adr` = 'E',
+`hash_adresse` = SUBSTRING( MD5( CONCAT(@Code_etab, @Libelle_fonctio) ), 1, 5),
+`Date_maj` = CONCAT(SUBSTRING(@StringDate_maj,7),'-',SUBSTRING(@StringDate_maj,4,2),'-',SUBSTRING(@StringDate_maj,1,2));
--- /dev/null
+-- Import complet des anciens
+
+DROP TABLE IF EXISTS fusionax_anciens;
+
+CREATE TABLE IF NOT EXISTS fusionax_anciens (
+ AN CHAR(2) NOT NULL COMMENT 'Vaut toujours AN pour cette table',
+ id_ancien VARCHAR(8) NOT NULL COMMENT 'Id unique de l''ancien',
+ Login VARCHAR(15) NOT NULL COMMENT 'Login sur le site de l''AX',
+ Password INT(11) NOT NULL COMMENT 'Mot de passe sur le site AX',
+ promotion_etude SMALLINT(4) NOT NULL COMMENT 'Promotion avec laquelle il/elle a fait ses études',
+ Groupe_promo ENUM('', 'A', 'B', 'C', 'N', 'S') character set binary NOT NULL COMMENT 'Groupe de promotion (code compris seulement par AX)',
+ Nom_patronymique VARCHAR(255) character set utf8 NOT NULL COMMENT 'Nom patronymique (nom de jeune fille) sans la particule',
+ partic_patro VARCHAR(5) character set utf8 NOT NULL COMMENT 'Particule du nom patronymique',
+ prenom VARCHAR(30) character set utf8 NOT NULL COMMENT 'Prénom',
+ Nom_usuel VARCHAR(255) character set utf8 NOT NULL COMMENT 'Nom usuel (nom marital par exemple) sans la particule',
+ partic_nom VARCHAR(5) character set utf8 NOT NULL COMMENT 'Particule du nom usuel',
+ Nom_complet VARCHAR(255) character set utf8 NOT NULL COMMENT 'Nom patronymique complet (avec la particule)',
+ Civilite ENUM('', '.', 'M', 'MME', 'MLLE') character set utf8 NOT NULL COMMENT 'Civilité',
+ Code_nationalite CHAR(4) NOT NULL COMMENT 'Nationalité (code)',
+ Type_membre ENUM('', '*', 'F', 'FB', 'P', 'PB', 'T', 'TB', 'TA') character set binary NOT NULL COMMENT 'Type de membre (code compris seulement par AX)',
+ corps_sortie VARCHAR(50) character set utf8 NOT NULL COMMENT 'Corps de sortie (ou D si aucun)',
+ Date_deces DATE COMMENT 'Date de décès',
+ grade VARCHAR(50) NOT NULL COMMENT 'Grade actuel dans son corps',
+ Mel_usage VARCHAR(255) NOT NULL COMMENT 'Adresse e-mail d''usage',
+ Mel_publiable TINYINT(4) NOT NULL COMMENT 'Autorisation d''utiliser le mail',
+ tel_mobile VARCHAR(30) NOT NULL COMMENT 'Numéro de téléphone mobile',
+ annee_dernCot INT(11) NOT NULL COMMENT 'Année de dernière cotisation AX',
+ Representant ENUM('', 'K', 'DE') character set binary NOT NULL COMMENT 'Représentant de promotion',
+ hash_adr_defaut BINARY(5) NOT NULL COMMENT 'Hash de l''adresse par défaut',
+ Date_maj DATE NOT NULL,
+ PRIMARY KEY (id_ancien)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
+
+LOAD DATA LOCAL INFILE 'Anciens.txt' INTO TABLE `fusionax_anciens` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'
+(`AN`, `id_ancien`, `Login`, `Password`, `promotion_etude`, `Groupe_promo`, `Nom_patronymique`, `partic_patro`, `prenom`, Nom_usuel, partic_nom,
+ Nom_complet, Civilite, Code_nationalite, Type_membre, corps_sortie, @StringDate_deces, grade, Mel_usage, Mel_publiable,
+ tel_mobile, annee_dernCot, Representant, @Type_adr_defaut, @AdrC_Ligne1, @AdrC_Ligne2, @AdrC_Ligne3, @AdrC_code_postal, @AdrC_ville,
+ @AdrC_zip_cedex, @AdrC_etat_distr, @AdrC_pays, @tel, @fax, @StringDate_maj)
+SET
+ `hash_adr_defaut` = SUBSTRING( MD5( @Type_adr_defaut ), 1, 5),
+ `Date_maj` = CONCAT(SUBSTRING(@StringDate_maj,7),'-',SUBSTRING(@StringDate_maj,4,2),'-',SUBSTRING(@StringDate_maj,1,2)),
+ `Date_deces` = CONCAT(SUBSTRING(@StringDate_deces,7),'-',SUBSTRING(@StringDate_deces,4,2),'-',SUBSTRING(@StringDate_deces,1,2));
+
+ALTER TABLE fusionax_anciens ADD INDEX (id_ancien);
+
+-- Correspondances entre fiches X.org et fiches AX
+DROP TABLE IF EXISTS `fusionax_import`;
+
+CREATE TABLE IF NOT EXISTS `fusionax_import` (
+ `id_ancien` VARCHAR(8) NOT NULL COMMENT 'identifiant AX de l''ancien',
+ `user_id` INT(11) DEFAULT NULL COMMENT 'identifiant x.org de l''ancien si on l''a trouvé',
+ `date_match_id` TIMESTAMP NULL DEFAULT NULL COMMENT 'date de mise en correspondance des identifiants',
+ PRIMARY KEY (`id_ancien`),
+ KEY `user_id` (`user_id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
+
+INSERT INTO `fusionax_import` ( SELECT `id_ancien`, NULL, NULL FROM `fusionax_anciens` );
+REPLACE INTO `fusionax_import` ( SELECT `matricule_ax`, `user_id`, NOW() FROM `auth_user_md5` );
--- /dev/null
+-- Import complet des entreprises
+
+DROP TABLE IF EXISTS `fusionax_entreprises`;
+
+CREATE TABLE IF NOT EXISTS `fusionax_entreprises` (
+ `EN` CHAR(2) NOT NULL COMMENT 'Vaut toujours EN pour cette table',
+ `Code_etab` BIGINT(10) NOT NULL COMMENT 'Code de l''établissement',
+ `Raison_sociale` VARCHAR(255) collate utf8_general_ci NOT NULL COMMENT 'Raison sociale de l''établissement',
+ `Sigle` VARCHAR(50) collate utf8_general_ci NOT NULL COMMENT 'Sigle de l''établissement',
+ `Date_maj` DATE NOT NULL COMMENT 'Date de mise à jour de ces informations',
+ PRIMARY KEY(`Code_etab`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
+
+LOAD DATA LOCAL INFILE 'Entreprises.txt' INTO TABLE `fusionax_entreprises` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'
+(EN, Code_etab, Raison_sociale, Sigle, @Inconnu, @StringDate_maj)
+SET
+`Date_maj` = CONCAT(SUBSTRING(@StringDate_maj,7),'-',SUBSTRING(@StringDate_maj,4,2),'-',SUBSTRING(@StringDate_maj,1,2));
--- /dev/null
+-- Import complet des formations
+
+DROP TABLE IF EXISTS `fusionax_formations`;
+
+CREATE TABLE IF NOT EXISTS `fusionax_formations` (
+ `FO` CHAR(2) NOT NULL COMMENT 'Vaut toujours FO pour cette table',
+ `id_ancien` VARCHAR(8) NOT NULL COMMENT 'Id unique de l''ancien',
+ `Intitule_formation` VARCHAR(60) collate utf8_general_ci NOT NULL COMMENT 'Intitulé de la formation',
+ `Date_maj` DATE NOT NULL COMMENT 'Date de mise à jour de ces informations',
+ PRIMARY KEY (`id_ancien`, `Intitule_formation`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
+
+LOAD DATA LOCAL INFILE 'Formations.txt' INTO TABLE `fusionax_formations` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'
+(FO, id_ancien, Intitule_formation, @StringDate_maj)
+SET
+`Date_maj` = CONCAT(SUBSTRING(@StringDate_maj,7),'-',SUBSTRING(@StringDate_maj,4,2),'-',SUBSTRING(@StringDate_maj,1,2));
--- /dev/null
+#! /bin/bash
+
+# import des données
+#scp -i ax_xorg_rsa xorg@polytechniciens.com:/home/axasso/ax-import/export_4D.txt.rar .
+#unrar e -inul export_4D.txt.rar
+cp /home/x2004jacob/export*utf8.TXT .
+
+# séparation en fichiers de tables
+cat export_total* | grep ^AD > Adresses.txt
+cat export_total* | grep ^AN > Anciens.txt
+cat export_total* | grep ^FO > Formations.txt
+cat export_total* | grep ^AC > Activites.txt
+cat export_total* | grep ^EN > Entreprises.txt
+
+exit 1
+
+# intégration dans notre bdd
+echo intégration dans notre bdd
+$MYSQL x4dat < Activites.sql
+$MYSQL x4dat < Adresses.sql
+$MYSQL x4dat < Anciens.sql
+$MYSQL x4dat < Formations.sql
+$MYSQL x4dat < Entreprises.sql
+
+# nettoyage
+echo nettoyage
+#rm Adresses.txt Anciens.txt Formations.txt Activites.txt Entreprises.txt export_4D.txt.rar export-total*
+rm Adresses.txt Anciens.txt Formations.txt Activites.txt Entreprises.txt export-total*
'geoloc' => $this->make_hook('default', AUTH_COOKIE),
'admin/geoloc' => $this->make_hook('admin', AUTH_MDP, 'admin'),
'admin/geoloc/dynamap' => $this->make_hook('admin_dynamap', AUTH_MDP, 'admin'),
+ 'admin/geoloc/country' => $this->make_hook('admin_country', AUTH_MDP, 'admin')
);
}
$page->assign("no_coordinates", $noCoordinates);
}
+ function handler_admin_country(&$page, $action = 'list', $id = null)
+ {
+ $page->assign('xorg_title', 'Polytechnique.org - Administration - Pays');
+ $page->assign('title', 'Gestion des pays');
+ $table_editor = new PLTableEditor('admin/geoloc/country', 'geoloc_pays', 'a2', true);
+ $table_editor->describe('a2', 'alpha-2', true);
+ $table_editor->describe('a3', 'alpha-3', false);
+ $table_editor->describe('n3', 'ISO numeric', false);
+ $table_editor->describe('num', 'num', false);
+ $table_editor->describe('worldrgn', 'Continent', false);
+ $table_editor->describe('subd', 'Subdivisions territoriales', false);
+ $table_editor->describe('post', 'post', false);
+ $table_editor->describe('pays', 'Nom (fr)', true);
+ $table_editor->describe('country', 'Nom (en)', true);
+ $table_editor->describe('phoneprf', 'Préfixe téléphonique', true);
+ $table_editor->describe('phoneformat', 'Format du téléphone (ex: (+p) ### ## ## ##)', false);
+ $table_editor->describe('capital', 'Capitale', true);
+ $table_editor->describe('nat', 'Nationalité', true);
+ $table_editor->describe('display', 'Format des adresses', false);
+
+ if ($action == 'update') {
+ if (Post::has('a2') && (Post::v('a2') == $id) && Post::has('phoneprf') && (Post::v('phoneprf') != '')) {
+ if (Post::has('phoneformat')) {
+ $new_format = Post::v('phoneformat');
+ } else {
+ $new_format = '';
+ }
+ $res = XDB::query("SELECT phoneformat
+ FROM geoloc_pays
+ WHERE phoneprf = {?}
+ LIMIT 1",
+ Post::v('phoneprf'));
+ $old_format = $res->fetchOneCell();
+ if ($new_format != $old_format) {
+ require_once("profil.func.inc.php");
+ XDB::execute("UPDATE geoloc_pays
+ SET phoneformat = {?}
+ WHERE phoneprf = {?}",
+ $new_format, Post::v('phoneprf'));
+ }
+ }
+ }
+ $table_editor->apply($page, $action, $id);
+ }
+
}
// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
$res = XDB::query(
"SELECT a.adr1 AS address1, a.adr2 AS address2,
a.city, a.postcode AS zip, a.country,
- IF(t.tel, t.tel, q.profile_mobile) AS night_phone_b
+ IF(t1.display_tel != '', t1.display_tel, t2.display_tel) AS night_phone_b
FROM auth_user_quick AS q
LEFT JOIN adresses AS a ON (q.user_id = a.uid AND FIND_IN_SET('active', a.statut))
- LEFT JOIN tels AS t ON (t.uid = a.uid AND t.adrid = a.adrid)
+ LEFT JOIN profile_phones AS t1 ON (t1.uid = a.uid AND t1.link_type = 'address' AND t1.link_id = a.adrid)
+ LEFT JOIN profile_phones AS t2 ON (t2.uid = a.uid AND t2.link_type = 'user' AND t2.link_id = 0)
WHERE q.user_id = {?}
LIMIT 1", S::v('uid'));
$this->infos['client'] = array_map('replace_accent', array_merge($info_client, $res->fetchOneAssoc()));
function handlers()
{
return array(
- 'photo' => $this->make_hook('photo', AUTH_PUBLIC),
- 'photo/change' => $this->make_hook('photo_change', AUTH_MDP),
-
- 'fiche.php' => $this->make_hook('fiche', AUTH_PUBLIC),
- 'profile' => $this->make_hook('profile', AUTH_PUBLIC),
- 'profile/private' => $this->make_hook('profile', AUTH_COOKIE),
- 'profile/ax' => $this->make_hook('ax', AUTH_COOKIE, 'admin'),
- 'profile/edit' => $this->make_hook('p_edit', AUTH_MDP),
- 'profile/ajax/address' => $this->make_hook('ajax_address', AUTH_COOKIE, 'user', NO_AUTH),
- 'profile/ajax/tel' => $this->make_hook('ajax_tel', AUTH_COOKIE, 'user', NO_AUTH),
- 'profile/ajax/medal' => $this->make_hook('ajax_medal', AUTH_COOKIE, 'user', NO_AUTH),
- 'profile/ajax/job' => $this->make_hook('ajax_job', AUTH_COOKIE, 'user', NO_AUTH),
- 'profile/ajax/secteur' => $this->make_hook('ajax_secteur', AUTH_COOKIE, 'user', NO_AUTH),
- 'profile/ajax/skill' => $this->make_hook('ajax_skill', AUTH_COOKIE, 'user', NO_AUTH),
- 'javascript/applis.js' => $this->make_hook('applis_js', AUTH_COOKIE),
- 'javascript/grades.js' => $this->make_hook('grades_js', AUTH_COOKIE),
- 'profile/medal' => $this->make_hook('medal', AUTH_PUBLIC),
- 'profile/orange' => $this->make_hook('p_orange', AUTH_MDP),
- 'profile/usage' => $this->make_hook('p_usage', AUTH_MDP),
-
- 'referent' => $this->make_hook('referent', AUTH_COOKIE),
- 'emploi' => $this->make_hook('ref_search', AUTH_COOKIE),
- 'referent/search' => $this->make_hook('ref_search', AUTH_COOKIE),
- 'referent/ssect' => $this->make_hook('ref_sect', AUTH_COOKIE, 'user', NO_AUTH),
- 'referent/country' => $this->make_hook('ref_country', AUTH_COOKIE, 'user', NO_AUTH),
-
- 'groupes-x' => $this->make_hook('xnet', AUTH_COOKIE),
-
- 'vcard' => $this->make_hook('vcard', AUTH_COOKIE, 'user', NO_HTTPS),
- 'admin/binets' => $this->make_hook('admin_binets', AUTH_MDP, 'admin'),
- 'admin/medals' => $this->make_hook('admin_medals', AUTH_MDP, 'admin'),
- 'admin/formations' => $this->make_hook('admin_formations', AUTH_MDP, 'admin'),
- 'admin/sections' => $this->make_hook('admin_sections', AUTH_MDP, 'admin'),
- 'admin/secteurs' => $this->make_hook('admin_secteurs', AUTH_MDP, 'admin'),
- 'admin/trombino' => $this->make_hook('admin_trombino', AUTH_MDP, 'admin'),
- 'admin/ss_secteurs' => $this->make_hook('admin_ss_secteurs', AUTH_MDP, 'admin'),
- 'admin/fonctions' => $this->make_hook('admin_fonctions', AUTH_MDP, 'admin'),
+ 'photo' => $this->make_hook('photo', AUTH_PUBLIC),
+ 'photo/change' => $this->make_hook('photo_change', AUTH_MDP),
+
+ 'fiche.php' => $this->make_hook('fiche', AUTH_PUBLIC),
+ 'profile' => $this->make_hook('profile', AUTH_PUBLIC),
+ 'profile/private' => $this->make_hook('profile', AUTH_COOKIE),
+ 'profile/ax' => $this->make_hook('ax', AUTH_COOKIE, 'admin'),
+ 'profile/edit' => $this->make_hook('p_edit', AUTH_MDP),
+ 'profile/ajax/address' => $this->make_hook('ajax_address', AUTH_COOKIE, 'user', NO_AUTH),
+ 'profile/ajax/tel' => $this->make_hook('ajax_tel', AUTH_COOKIE, 'user', NO_AUTH),
+ 'profile/ajax/edu' => $this->make_hook('ajax_edu', AUTH_COOKIE, 'user', NO_AUTH),
+ 'profile/ajax/medal' => $this->make_hook('ajax_medal', AUTH_COOKIE, 'user', NO_AUTH),
+ 'profile/networking' => $this->make_hook('networking', AUTH_PUBLIC),
+ 'profile/ajax/job' => $this->make_hook('ajax_job', AUTH_COOKIE, 'user', NO_AUTH),
+ 'profile/ajax/secteur' => $this->make_hook('ajax_secteur', AUTH_COOKIE, 'user', NO_AUTH),
+ 'profile/ajax/skill' => $this->make_hook('ajax_skill', AUTH_COOKIE, 'user', NO_AUTH),
+ 'profile/ajax/searchname' => $this->make_hook('ajax_searchname', AUTH_COOKIE, 'user', NO_AUTH),
+ 'javascript/education.js' => $this->make_hook('education_js', AUTH_COOKIE),
+ 'javascript/grades.js' => $this->make_hook('grades_js', AUTH_COOKIE),
+ 'profile/medal' => $this->make_hook('medal', AUTH_PUBLIC),
+ 'profile/orange' => $this->make_hook('p_orange', AUTH_MDP),
+ 'profile/usage' => $this->make_hook('p_usage', AUTH_MDP),
+
+ 'referent' => $this->make_hook('referent', AUTH_COOKIE),
+ 'emploi' => $this->make_hook('ref_search', AUTH_COOKIE),
+ 'referent/search' => $this->make_hook('ref_search', AUTH_COOKIE),
+ 'referent/ssect' => $this->make_hook('ref_sect', AUTH_COOKIE, 'user', NO_AUTH),
+ 'referent/country' => $this->make_hook('ref_country', AUTH_COOKIE, 'user', NO_AUTH),
+
+ 'groupes-x' => $this->make_hook('xnet', AUTH_COOKIE),
+
+ 'vcard' => $this->make_hook('vcard', AUTH_COOKIE, 'user', NO_HTTPS),
+ 'admin/binets' => $this->make_hook('admin_binets', AUTH_MDP, 'admin'),
+ 'admin/medals' => $this->make_hook('admin_medals', AUTH_MDP, 'admin'),
+ 'admin/education' => $this->make_hook('admin_education', AUTH_MDP, 'admin'),
+ 'admin/education_field' => $this->make_hook('admin_education_field', AUTH_MDP, 'admin'),
+ 'admin/education_degree' => $this->make_hook('admin_education_degree', AUTH_MDP, 'admin'),
+ 'admin/education_degree_set' => $this->make_hook('admin_education_degree_set', AUTH_MDP, 'admin'),
+ 'admin/sections' => $this->make_hook('admin_sections', AUTH_MDP, 'admin'),
+ 'admin/secteurs' => $this->make_hook('admin_secteurs', AUTH_MDP, 'admin'),
+ 'admin/networking' => $this->make_hook('admin_networking', AUTH_MDP, 'admin'),
+ 'admin/trombino' => $this->make_hook('admin_trombino', AUTH_MDP, 'admin'),
+ 'admin/ss_secteurs' => $this->make_hook('admin_ss_secteurs', AUTH_MDP, 'admin'),
+ 'admin/fonctions' => $this->make_hook('admin_fonctions', AUTH_MDP, 'admin'),
+ 'admin/corps_enum' => $this->make_hook('admin_corps_enum', AUTH_MDP, 'admin'),
+ 'admin/corps_rank' => $this->make_hook('admin_corps_rank', AUTH_MDP, 'admin'),
);
}
exit;
}
+ function handler_networking(&$page, $mid)
+ {
+ $res = XDB::query("SELECT icon
+ FROM profile_networking_enum
+ WHERE network_type = {?}",
+ $mid);
+ $img = dirname(__FILE__) . '/../htdocs/images/networking/' . $res->fetchOneCell();
+ $type = mime_content_type($img);
+ header("Content-Type: $type");
+ echo file_get_contents($img);
+ exit;
+ }
+
function handler_photo_change(&$page)
{
global $globals;
// Build the page
$page->addJsLink('ajax.js');
- $page->addJsLink('applis.js');
+ $page->addJsLink('education.js');
$page->addJsLink('grades.js');
$page->addJsLink('profile.js');
$page->addJsLink('jquery.autocomplete.js');
$page->setTitle('Mon Profil');
}
- function handler_applis_js(&$page)
+ function handler_education_js(&$page)
{
header('Content-Type: text/javascript; charset=utf-8');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified:' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-cache, must-revalidate');
header('Pragma: no-cache');
- $page->changeTpl('profile/applis.js.tpl', NO_SKIN);
- require_once "applis.func.inc.php";
+ $page->changeTpl('profile/education.js.tpl', NO_SKIN);
+ require_once "education.func.inc.php";
}
function handler_grades_js(&$page)
$page->assign('adr', array());
}
- function handler_ajax_tel(&$page, $adid, $telid)
+ function handler_ajax_tel(&$page, $prefid, $prefname, $telid)
{
header('Content-Type: text/html; charset=utf-8');
- $page->changeTpl('profile/adresses.tel.tpl', NO_SKIN);
- $page->assign('i', $adid);
- $page->assign('adid', "addresses_$adid");
- $page->assign('adpref', "addresses[$adid]");
- $page->assign('t', $telid);
+ $page->changeTpl('profile/phone.tpl', NO_SKIN);
+ $page->assign('prefid', $prefid);
+ $page->assign('prefname', $prefname);
+ $page->assign('telid', $telid);
$page->assign('tel', array());
}
+ function handler_ajax_edu(&$page, $eduid, $class)
+ {
+ header('Content-Type: text/html; charset=utf-8');
+ $page->changeTpl('profile/edu.tpl', NO_SKIN);
+ $res = XDB::iterator("SELECT id, field
+ FROM profile_education_field_enum
+ ORDER BY field");
+ $page->assign('edu_fields', $res->fetchAllAssoc());
+ $page->assign('eduid', $eduid);
+ $page->assign('class', $class);
+ require_once "education.func.inc.php";
+ }
+
function handler_ajax_medal(&$page, $id)
{
header('Content-Type: text/html; charset=utf-8');
}
}
+ function handler_ajax_searchname(&$page, $snid)
+ {
+ header('Content-Type: text/html; charset=utf-8');
+ $page->changeTpl('profile/general.searchname.tpl', NO_SKIN);
+ $page->assign('i', $snid);
+ $page->assign('sn', array());
+ $page->assign('newsn', true);
+ }
+
function handler_p_orange(&$page)
{
$page->changeTpl('profile/orange.tpl');
$table_editor->describe('text','intitulé',true);
$table_editor->apply($page, $action, $id);
}
- function handler_admin_formations(&$page, $action = 'list', $id = null) {
+ function handler_admin_education(&$page, $action = 'list', $id = null) {
$page->setTitle('Administration - Formations');
$page->assign('title', 'Gestion des formations');
- $table_editor = new PLTableEditor('admin/formations','applis_def','id');
- $table_editor->add_join_table('applis_ins','aid',true);
- $table_editor->describe('text','intitulé',true);
- $table_editor->describe('url','site web',false);
+ $table_editor = new PLTableEditor('admin/education', 'profile_education_enum', 'id');
+ $table_editor->add_join_table('profile_education', 'eduid', true);
+ $table_editor->add_join_table('profile_education_degree', 'eduid', true);
+ $table_editor->describe('name', 'intitulé', true);
+ $table_editor->describe('url', 'site web', false);
+ $table_editor->apply($page, $action, $id);
+ }
+ function handler_admin_education_field(&$page, $action = 'list', $id = null) {
+ $page->setTitle('Administration - Domaines de formation');
+ $page->assign('title', 'Gestion des domaines de formation');
+ $table_editor = new PLTableEditor('admin/education_field', 'profile_education_field_enum', 'id', true);
+ $table_editor->add_join_table('profile_education', 'fieldid', true);
+ $table_editor->describe('field', 'domaine', true);
+ $table_editor->apply($page, $action, $id);
+ }
+ function handler_admin_education_degree(&$page, $action = 'list', $id = null) {
+ $page->setTitle('Administration - Niveau de formation');
+ $page->assign('title', 'Gestion des niveau de formation');
+ $table_editor = new PLTableEditor('admin/education_degree', 'profile_education_degree_enum', 'id', true);
+ $table_editor->add_join_table('profile_education_degree', 'degreeid', true);
+ $table_editor->add_join_table('profile_education', 'degreeid', true);
+ $table_editor->describe('degree', 'niveau', true);
+ $table_editor->apply($page, $action, $id);
+ }
+ function handler_admin_education_degree_set(&$page, $action = 'list', $id = null) {
+ $page->setTitle('Administration - Correspondances formations - niveau de formation');
+ $page->assign('title', 'Gestion des correspondances formations - niveau de formation');
+ $table_editor = new PLTableEditor('admin/education_degree_set', 'profile_education_degree', 'eduid', true);
+ $table_editor->describe('eduid', 'formation', true);
+ $table_editor->describe('degreeid', 'niveau', true);
$table_editor->apply($page, $action, $id);
}
function handler_admin_sections(&$page, $action = 'list', $id = null) {
$table_editor->describe('label', 'intitulé', true);
$table_editor->apply($page, $action, $id);
}
+ function handler_admin_networking(&$page, $action = 'list', $id = null) {
+ $page->assign('xorg_title', 'Polytechnique.org - Administration - Networking');
+ $page->assign('title', 'Gestion des types de networking');
+ $table_editor = new PLTableEditor('admin/networking', 'profile_networking_enum', 'network_type');
+ $table_editor->describe('name', 'intitulé', true);
+ $table_editor->describe('icon', 'nom de l\'icône', false);
+ $table_editor->describe('filter', 'filtre', true);
+ $table_editor->describe('link', 'lien web', true);
+ $table_editor->apply($page, $action, $id);
+ }
+ function handler_admin_corps_enum(&$page, $action = 'list', $id = null) {
+ $page->setTitle('Administration - Corps');
+ $page->assign('title', 'Gestion des Corps');
+ $table_editor = new PLTableEditor('admin/corps_enum', 'profile_corps_enum', 'id');
+ $table_editor->describe('name', 'intitulé', true);
+ $table_editor->describe('abbreviation', 'abbréviation', true);
+ $table_editor->describe('still_exists', 'existe encore ?', true);
+ $table_editor->apply($page, $action, $id);
+ }
+ function handler_admin_corps_rank(&$page, $action = 'list', $id = null) {
+ $page->setTitle('Administration - Grade dans les Corps');
+ $page->assign('title', 'Gestion des grade dans les Corps');
+ $table_editor = new PLTableEditor('admin/corps_rank', 'profile_corps_rank_enum', 'id');
+ $table_editor->describe('name', 'intitulé', true);
+ $table_editor->describe('abbreviation', 'abbréviation', true);
+ $table_editor->apply($page, $action, $id);
+ }
function handler_admin_medals(&$page, $action = 'list', $id = null) {
$page->setTitle('Administration - Distinctions');
$page->assign('title', 'Gestion des Distinctions');
{
private $bool;
private $pub;
- private $tel;
public function __construct()
{
$this->bool = new ProfileBool();
$this->pub = new ProfilePub();
- $this->tel = new ProfileTel();
}
- private function cleanAddress(ProfilePage &$page, array &$address, &$success)
+ private function cleanAddress(ProfilePage &$page, $adrid, array &$address, &$success)
{
if (@$address['changed']) {
$address['datemaj'] = time();
}
$success = true;
- foreach ($address['tel'] as $t=>&$tel) {
- if (@$tel['removed'] || !trim($tel['tel'])) {
- unset($address['tel'][$t]);
- } else {
- $tel['pub'] = $this->pub->value($page, 'pub', $tel['pub'], $s);
- $tel['tel'] = $this->tel->value($page, 'tel', $tel['tel'], $s);
- if (!$s) {
- $tel['error'] = true;
- $success = false;
- }
- }
- unset($tel['removed']);
+ if (!isset($address['tel'])) {
+ $address['tel'] = array();
}
+ $profiletel = new ProfilePhones('address', $adrid);
+ $address['tel'] = $profiletel->value($page, 'tel', $address['tel'], $s);
$address['checked'] = $this->bool->value($page, 'checked', $address['checked'], $s);
$address['secondaire'] = $this->bool->value($page, 'secondaire', $address['secondaire'], $s);
$address['mail'] = $this->bool->value($page, 'mail', $address['mail'], $s);
$ls = true;
$this->geolocAddress($adr, $s);
$ls = ($ls && $s);
- $this->cleanAddress($page, $adr, $s);
+ $this->cleanAddress($page, $key, $adr, $s);
$ls = ($ls && $s);
if (!trim($adr['text'])) {
unset($value[$key]);
private function saveTel($adrid, $telid, array &$tel)
{
- XDB::execute("INSERT INTO tels (uid, adrid, telid,
- tel_type, tel_pub, tel)
- VALUES ({?}, {?}, {?},
+ XDB::execute("INSERT INTO profile_phones (uid, link_type, link_id, tel_id, tel_type,
+ search_tel, display_tel, pub)
+ VALUES ({?}, 'address', {?}, {?}, {?},
{?}, {?}, {?})",
- S::i('uid'), $adrid, $telid,
- $tel['type'], $tel['pub'], $tel['tel']);
+ S::i('uid'), $adrid, $telid, $tel['type'],
+ format_phone_number($tel['tel']), $tel['tel'], $tel['pub']);
}
private function saveAddress($adrid, array &$address)
postcode, city, cityid,
country, region, regiontxt,
pub, datemaj, statut,
- uid, adrid, glat, glng)
+ uid, adrid, glat, glng, comment)
VALUES ({?}, {?}, {?},
{?}, {?}, {?},
{?}, {?}, {?},
{?}, FROM_UNIXTIME({?}), {?},
- {?}, {?}, {?}, {?})",
+ {?}, {?}, {?}, {?}, {?})",
$address['adr1'], $address['adr2'], $address['adr3'],
$address['postcode'], $address['city'], $address['cityid'],
$address['country'], $address['region'], $address['regiontxt'],
$address['pub'], $address['datemaj'], $flags,
- S::i('uid'), $adrid, $address['precise_lat'], $address['precise_lon']);
- foreach ($address['tel'] as $telid=>&$tel) {
- $this->saveTel($adrid, $telid, $tel);
- }
+ S::i('uid'), $adrid, $address['precise_lat'], $address['precise_lon'], $address['comment']);
}
public function save(ProfilePage &$page, $field, $value)
XDB::execute("DELETE FROM adresses
WHERE uid = {?}",
S::i('uid'));
- XDB::execute("DELETE FROM tels
- WHERE uid = {?}",
+ XDB::execute("DELETE FROM profile_phones
+ WHERE uid = {?} AND link_type = 'address'",
S::i('uid'));
foreach ($value as $adrid=>&$address) {
$this->saveAddress($adrid, $address);
+ $profiletel = new ProfilePhones('address', $adrid);
+ $profiletel->saveTels('tel', $address['tel']);
}
}
}
FIND_IN_SET('courrier', a.statut) AS mail,
FIND_IN_SET('temporaire', a.statut) AS temporary,
FIND_IN_SET('active', a.statut) AS current,
- a.glat AS precise_lat, a.glng AS precise_lon
+ a.glat AS precise_lat, a.glng AS precise_lon,
+ a.comment
FROM adresses AS a
INNER JOIN geoloc_pays AS gp ON(gp.a2 = a.country)
WHERE uid = {?} AND NOT FIND_IN_SET('pro', statut)
$this->values['addresses'] = $res->fetchAllAssoc();
}
- $res = XDB::iterator("SELECT adrid, tel_type AS type, tel_pub AS pub, tel
- FROM tels
- WHERE uid = {?}
- ORDER BY adrid",
+ $res = XDB::iterator("SELECT link_id AS adrid, tel_type AS type, pub, display_tel AS tel, comment
+ FROM profile_phones
+ WHERE uid = {?} AND link_type = 'address'
+ ORDER BY link_id",
S::i('uid'));
$i = 0;
$adrNb = count($this->values['addresses']);
}
}
-class ProfileAppli implements ProfileSetting
+class ProfileSearchName implements ProfileSetting
{
+
+ public function __construct()
+ {
+ }
+
+ public function value(ProfilePage &$page, $field, $value, &$success)
+ {
+ }
+
+ public function save(ProfilePage &$page, $field, $new_value)
+ {
+ }
+}
+
+class ProfileEdu implements ProfileSetting
+{
+ public function __construct()
+ {
+ }
+
+ static function sortByGradYear($line1, $line2) {
+ $a = (int) $line1['grad_year'];
+ $b = (int) $line2['grad_year'];
+ if ($a == $b) {
+ return 0;
+ }
+ return ($a < $b) ? -1 : 1;
+ }
+
public function value(ProfilePage &$page, $field, $value, &$success)
{
$success = true;
+ if (is_null($value) || !is_array($value)) {
+ $value = array();
+ $res = XDB::iterator("SELECT eduid, degreeid, fieldid, grad_year, program
+ FROM profile_education
+ WHERE uid = {?}
+ ORDER BY id",
+ S::v('uid'));
+ while($edu = $res->next()) {
+ $value[] = $edu;
+ }
+ } else {
+ $i = 0;
+ foreach ($value as $key=>&$edu) {
+ if (($edu['grad_year'] < 1921) || ($edu['grad_year'] > (date('Y') + 4))) {
+ Platal::page()->trigError('L\'année d\'obtention du diplôme est mal renseignée, elle doit être du type : 2004.');
+ $edu['error'] = true;
+ $success = false;
+ }
+ if ($key != $i) {
+ $value[$i] = $edu;
+ unset($value[$key]);
+ }
+ $i++;
+ }
+ usort($value, array("ProfileEdu", "sortByGradYear"));
+ }
+ return $value;
+ }
+
+ public function save(ProfilePage &$page, $field, $value)
+ {
+ XDB::execute("DELETE FROM profile_education
+ WHERE uid = {?}",
+ S::i('uid'));
+ foreach ($value as $eduid=>&$edu) {
+ if ($edu['eduid'] != '') {
+ XDB::execute("INSERT INTO profile_education
+ SET id = {?}, uid = {?}, eduid = {?}, degreeid = {?},
+ fieldid = {?}, grad_year = {?}, program = {?}",
+ $eduid, S::i('uid'), $edu['eduid'], $edu['degreeid'],
+ $edu['fieldid'], $edu['grad_year'], $edu['program']);
+ }
+ }
+ }
+
+}
+
+class ProfileEmailDirectory implements ProfileSetting
+{
+ public function __construct()
+ {
+ }
+
+ public function value(ProfilePage &$page, $field, $value, &$success)
+ {
+ $p = Platal::page();
+
+ $success = true;
+ if (!is_null($value)) {
+ $email_stripped = strtolower(trim($value));
+ if ((!isvalid_email($email_stripped)) && ($email_stripped) && ($page->values['email_directory'] == "new@example.org")) {
+ $p->assign('email_error', '1');
+ $p->assign('email_directory_error', $email_stripped);
+ $p->trigError('Adresse Email invalide');
+ $success = false;
+ } else {
+ $p->assign('email_error', '0');
+ }
+ }
+ return $value;
+ }
+
+ public function save(ProfilePage &$page, $field, $value)
+ {
+ }
+}
+
+class ProfileNetworking implements ProfileSetting
+{
+ private $email;
+ private $pub;
+ private $web;
+ private $number;
+
+ public function __construct()
+ {
+ $this->email = new ProfileEmail();
+ $this->pub = new ProfilePub();
+ $this->web = new ProfileWeb();
+ $this->number = new ProfileNumber();
+ }
+
+ public function value(ProfilePage &$page, $field, $value, &$success)
+ {
if (is_null($value)) {
- return $page->values[$field];
+ $value = array();
+ $res = XDB::iterator("SELECT n.address, n.network_type AS type, n.pub, m.name
+ FROM profile_networking AS n
+ INNER JOIN profile_networking_enum AS m ON (n.network_type = m.network_type)
+ WHERE n.uid = {?}",
+ S::i('uid'));
+ while($network = $res->next()) {
+ $value[] = $network;
+ }
+ }
+ if (!is_array($value)) {
+ $value = array();
+ }
+ $res = XDB::iterator("SELECT filter, network_type AS type
+ FROM profile_networking_enum;");
+ $filters = array();
+ while($filter = $res->next()) {
+ $filters[$filter['type']] = $filter['filter'];
+ }
+ $success = true;
+ foreach($value as $i=>&$network) {
+ if (!trim($network['address'])) {
+ unset($value[$i]);
+ } else {
+ if (!isset($network['pub'])) {
+ $network['pub'] = 'private';
+ }
+ $network['error'] = false;
+ $network['pub'] = $this->pub->value($page, 'pub', $network['pub'], $s);
+ $s = true;
+ if ($filters[$network['type']] == 'web') {
+ $network['address'] = $this->web->value($page, 'address', $network['address'], $s);
+ } elseif ($filters[$network['type']] == 'email') {
+ $network['address'] = $this->email->value($page, 'address', $network['address'], $s);
+ } elseif ($filters[$network['type']] == 'number') {
+ $network['address'] = $this->number->value($page, 'address', $network['address'], $s);
+ }
+ if (!$s) {
+ $success = false;
+ $network['error'] = true;
+ }
+ }
}
return $value;
}
- public function save(ProfilePage &$page, $field, $new_value)
+ public function save(ProfilePage &$page, $field, $value)
{
- $index = ($field == 'appli1' ? 0 : 1);
- if ($new_value['id'] > 0) {
- XDB::execute("REPLACE INTO applis_ins
- SET uid = {?}, aid = {?}, type = {?}, ordre = {?}",
- S::i('uid'), $new_value['id'], $new_value['type'], $index);
- } else {
- XDB::execute("DELETE FROM applis_ins
- WHERE uid = {?} AND ordre = {?}",
- S::i('uid'), $index);
+ XDB::execute("DELETE FROM profile_networking
+ WHERE uid = {?}",
+ S::i('uid'));
+ if (!count($value)) {
+ return;
+ }
+ $insert = array();
+ foreach ($value as $id=>$network) {
+ XDB::execute("INSERT INTO profile_networking (uid, nwid, network_type, address, pub)
+ VALUES ({?}, {?}, {?}, {?}, {?})",
+ S::i('uid'), $id, $network['type'], $network['address'], $network['pub']);
}
}
}
public function __construct(PlWizard &$wiz)
{
parent::__construct($wiz);
- $this->settings['nom'] = $this->settings['prenom']
- = new ProfileNom();
+ $this->settings['nom'] = $this->settings['prenom']
+ = new ProfileNom();
$this->settings['naissance'] = new ProfileDate();
- $this->settings['mobile_pub']
- = $this->settings['web_pub']
- = $this->settings['freetext_pub']
+ $this->settings['freetext_pub']
= $this->settings['photo_pub']
= new ProfilePub();
$this->settings['freetext']
= $this->settings['nationalite']
+ = $this->settings['nationalite2']
+ = $this->settings['nationalite3']
= $this->settings['nick']
+ = $this->settings['yourself']
+ = $this->settings['display_name']
+ = $this->settings['sort_name']
+ = $this->settings['tooltip_name']
= null;
$this->settings['synchro_ax']
= new ProfileBool();
- $this->settings['mobile'] = new ProfileTel();
- $this->settings['web'] = new ProfileWeb();
- $this->settings['appli1']
- = $this->settings['appli2']
- = new ProfileAppli();
- $this->watched= array('nom' => true, 'freetext' => true, 'mobile' => true, 'web' => true,
- 'appli1' => true, 'appli2' => true, 'nationalite' => true, 'nick' => true);
+ $this->settings['email_directory']
+ = new ProfileEmail();
+ $this->settings['email_directory_new']
+ = new ProfileEmailDirectory();
+ $this->settings['networking'] = new ProfileNetworking();
+ $this->settings['tels'] = new ProfilePhones('user', 0);
+ $this->settings['edus'] = new ProfileEdu();
+ $this->watched= array('nom' => true, 'freetext' => true, 'tels' => true,
+ 'networking' => true, 'edus' => true,
+ 'nationalite' => true, 'nationalite2' => true,
+ 'nationalite3' => true, 'nick' => true);
}
protected function _fetchData()
{
// Checkout all data...
- $res = XDB::query("SELECT u.promo, u.promo_sortie, u.nom_usage, u.nationalite, u.naissance,
- q.profile_mobile as mobile, q.profile_mobile_pub as mobile_pub,
- q.profile_web as web, q.profile_web_pub as web_pub,
+ $res = XDB::query("SELECT u.promo, u.promo_sortie, u.nom_usage, u.nationalite,
+ u.nationalite2, u.nationalite3, u.naissance,
+ t.display_tel as mobile, t.pub as mobile_pub,
+ d.email_directory as email_directory,
q.profile_freetext as freetext, q.profile_freetext_pub as freetext_pub,
q.profile_nick as nick, q.profile_from_ax as synchro_ax, u.matricule_ax,
- IF(a1.aid IS NULL, -1, a1.aid) as appli_id1, a1.type as appli_type1,
- IF(a2.aid IS NULL, -1, a2.aid) as appli_id2, a2.type as appli_type2
- FROM auth_user_md5 AS u
- INNER JOIN auth_user_quick AS q USING(user_id)
- LEFT JOIN applis_ins AS a1 ON(a1.uid = u.user_id and a1.ordre = 0)
- LEFT JOIN applis_ins AS a2 ON(a2.uid = u.user_id and a2.ordre = 1)
+ n.yourself, n.display AS display_name, n.sort AS sort_name,
+ n.tooltip AS tooltip_name
+ FROM auth_user_md5 AS u
+ INNER JOIN auth_user_quick AS q ON(u.user_id = q.user_id)
+ INNER JOIN profile_names_display AS n ON(n.user_id = u.user_id)
+ LEFT JOIN profile_phones AS t ON(u.user_id = t.uid AND link_type = 'user')
+ LEFT JOIN profile_directory AS d ON(d.uid = u.user_id)
WHERE u.user_id = {?}", S::v('uid', -1));
$this->values = $res->fetchOneAssoc();
- // Reformat formation data
- $this->values['appli1'] = array('id' => $this->values['appli_id1'],
- 'type' => $this->values['appli_type1']);
- unset($this->values['appli_id1']);
- unset($this->values['appli_type1']);
- $this->values['appli2'] = array('id' => $this->values['appli_id2'],
- 'type' => $this->values['appli_type2']);
- unset($this->values['appli_id2']);
- unset($this->values['appli_type2']);
-
// Retreive photo informations
$res = XDB::query("SELECT pub
FROM photo
WHERE type='photo' AND user_id = {?}",
S::v('uid'));
$this->values['nouvellephoto'] = $res->fetchOneCell();
+
+ // Retreive search names info
+ $this->values['search_names'] = XDB::iterator("
+ SELECT sn.search_name, sn.name_type, sn.pub, sn.sn_id
+ FROM profile_names_search AS sn
+ WHERE sn.user_id = {?}
+ ORDER BY sn.name_type, search_score, search_name",
+ S::v('uid'));
+
+ // Retreive phones
+ $res = XDB::iterator("SELECT t.display_tel AS tel, t.tel_type AS type, t.pub, t.comment
+ FROM profile_phones AS t
+ WHERE t.uid = {?} AND t.link_type = 'user'
+ ORDER BY t.tel_id",
+ S::v('uid'));
+ $this->values['tels'] = $res->fetchAllAssoc();
}
protected function _saveData()
{
- if ($this->changed['nationalite'] || $this->changed['nom'] || $this->changed['prenom']
- || $this->changed['naissance']) {
+ if ($this->changed['nationalite'] || $this->changed['nationalite2'] || $this->changed['nationalite3']
+ || $this->changed['nom'] || $this->changed['prenom'] || $this->changed['naissance']) {
+ if ($this->values['nationalite3'] == "") {
+ $this->values['nationalite3'] = NULL;
+ }
+ if ($this->values['nationalite2'] == "") {
+ $this->values['nationalite2'] = $this->values['nationalite3'];
+ $this->values['nationalite3'] = NULL;
+ }
+ if ($this->values['nationalite'] == "") {
+ $this->values['nationalite'] = $this->values['nationalite2'];
+ $this->values['nationalite2'] = $this->values['nationalite3'];
+ $this->values['nationalite3'] = NULL;
+ }
+
XDB::execute("UPDATE auth_user_md5
- SET nationalite = {?}, nom={?}, prenom={?}, naissance={?}
+ SET nationalite = {?}, nationalite2 = {?}, nationalite3 = {?}, nom={?}, prenom={?}, naissance={?}
WHERE user_id = {?}",
- $this->values['nationalite'], $this->values['nom'], $this->values['prenom'],
+ $this->values['nationalite'], $this->values['nationalite2'], $this->values['nationalite3'],
+ $this->values['nom'], $this->values['prenom'],
preg_replace('@(\d{2})/(\d{2})/(\d{4})@', '\3-\2-\1', $this->values['naissance']),
S::v('uid'));
}
- if ($this->changed['nick'] || $this->changed['mobile'] || $this->changed['mobile_pub']
- || $this->changed['web'] || $this->changed['web_pub'] || $this->changed['freetext']
- || $this->changed['freetext_pub'] || $this->changed['synchro_ax']) {
+ if ($this->changed['nick'] || $this->changed['freetext'] || $this->changed['freetext_pub'] || $this->changed['synchro_ax']) {
XDB::execute("UPDATE auth_user_quick
- SET profile_nick= {?}, profile_mobile={?}, profile_mobile_pub={?},
- profile_web={?}, profile_web_pub={?}, profile_freetext={?},
+ SET profile_nick= {?},
+ profile_freetext={?},
profile_freetext_pub={?}, profile_from_ax = {?}
WHERE user_id = {?}",
- $this->values['nick'], $this->values['mobile'], $this->values['mobile_pub'],
- $this->values['web'], $this->values['web_pub'],
+ $this->values['nick'],
$this->values['freetext'], $this->values['freetext_pub'],
$this->values['synchro_ax'], S::v('uid'));
}
+ if ($this->changed['email_directory']) {
+ $new_email = ($this->values['email_directory'] == "new@example.org") ?
+ $this->values['email_directory_new'] : $this->values['email_directory'];
+ if ($new_email == "") {
+ $new_email = NULL;
+ }
+ XDB::execute("REPLACE INTO profile_directory (uid, email_directory)
+ VALUES ({?}, {?})",
+ S::v('uid'), $new_email);
+ }
if ($this->changed['nick']) {
require_once('user.func.inc.php');
user_reindex(S::v('uid'));
WHERE uid = {?}",
$this->values['photo_pub'], S::v('uid'));
}
+ if ($this->changed['yourself'] || $this->changed['sort_name'] ||
+ $this-> changed['display_name'] || $this->changed['tooltip_name']) {
+ XDB::execute("UPDATE profile_names_display AS n
+ SET n.yourself = {?},
+ n.sort = {?}, ". // SET
+ "n.display = {?}, ". // SET
+ "n.tooltip = {?} ". // SET
+ "WHERE n.user_id = {?}",
+ $this->values['yourself'],
+ $this->values['sort_name'],
+ $this->values['display_name'],
+ $this->values['tooltip_name'],
+ S::v('uid'));
+ }
}
public function _prepare(PlPage &$page, $id)
{
- require_once "applis.func.inc.php";
+ require_once "education.func.inc.php";
+
+ $res = XDB::iterator("SELECT id, field
+ FROM profile_education_field_enum
+ ORDER BY field");
+ $page->assign('edu_fields', $res->fetchAllAssoc());
+
+ require_once "emails.combobox.inc.php";
+ fill_email_combobox($page);
+
+ $res = XDB::iterator("SELECT nw.network_type AS type, nw.name
+ FROM profile_networking_enum AS nw
+ ORDER BY name");
+ $page->assign('network_list', $res->fetchAllAssoc());
}
}
class ProfileJob extends ProfileGeoloc
{
private $pub;
+ private $mail_new;
private $mail;
private $web;
- private $tel;
private $bool;
private $checks;
public function __construct()
{
$this->pub = new ProfilePub();
- $this->mail = new ProfileEmail();
+ $this->mail
+ = $this->mail_new
+ = new ProfileEmail();
$this->web = new ProfileWeb();
- $this->tel = new ProfileTel();
$this->bool = new ProfileBool();
$this->checks = array('web' => array('web'),
+ 'mail_new' => array('email_new'),
'mail' => array('email'),
- 'tel' => array('tel', 'fax', 'mobile'),
- 'pub' => array('pub', 'tel_pub', 'email_pub'));
+ 'pub' => array('pub', 'email_pub'));
}
- private function cleanJob(ProfilePage &$page, array &$job, &$success)
+ private function cleanJob(ProfilePage &$page,$jobid, array &$job, &$success)
{
$success = true;
foreach ($this->checks as $obj=>&$fields) {
$chk =& $this->$obj;
foreach ($fields as $field) {
+ if ($field == "email_new") {
+ if ($job['email'] == "new@example.org") {
+ $job['email'] = $job[$field];
+ }
+ continue;
+ }
$job[$field] = $chk->value($page, $field, $job[$field], $s);
if (!$s) {
$success = false;
}
$job['adr']['pub'] = $this->pub->value($page, 'adr_pub', @$job['adr']['pub'], $s);
$job['adr']['checked'] = $this->bool->value($page, 'adr_checked', @$job['adr']['checked'], $s);
+ if (!isset($job['tel'])) {
+ $job['tel'] = array();
+ }
+ $profiletel = new ProfilePhones('pro', $jobid);
+ $job['tel'] = $profiletel->value($page, 'tel', $job['tel'], $s);
unset($job['removed']);
unset($job['new']);
unset($job['adr']['changed']);
$ls = true;
$this->geolocAddress($job['adr'], $s);
$ls = ($ls && $s);
- $this->cleanJob($page, $job, $s);
+ $this->cleanJob($page, $key, $job, $s);
$ls = ($ls && $s);
if (!$init) {
$success = ($success && $ls);
public function save(ProfilePage &$page, $field, $value)
{
+ require_once('profil.func.inc.php');
XDB::execute("DELETE FROM entreprises
WHERE uid = {?}",
S::i('uid'));
+ XDB::execute("DELETE FROM profile_phones
+ WHERE uid = {?} AND link_type = 'pro'",
+ S::i('uid'));
$i = 0;
- foreach ($value as &$job) {
+ foreach ($value as $jobid=>&$job) {
+ if ($job['email'] == "new@example.org") {
+ $job['email'] = $job['email_new'];
+ }
XDB::execute("INSERT INTO entreprises (uid, entrid, entreprise, secteur, ss_secteur,
fonction, poste, adr1, adr2, adr3, postcode,
city, cityid, country, region, regiontxt,
- tel, fax, mobile, email, web,
- pub, adr_pub, tel_pub, email_pub, flags,
+ email, web,
+ pub, adr_pub, email_pub, flags,
glat, glng)
VALUES ({?}, {?}, {?}, {?}, {?},
{?}, {?}, {?}, {?}, {?}, {?},
{?}, {?}, {?}, {?}, {?},
- {?}, {?}, {?}, {?}, {?},
- {?}, {?}, {?}, {?}, {?},
+ {?}, {?},
+ {?}, {?}, {?}, {?},
{?}, {?})",
- S::i('uid'), $i++, $job['name'], $job['secteur'], $job['ss_secteur'],
+ S::i('uid'), $i, $job['name'], $job['secteur'], $job['ss_secteur'],
$job['fonction'], $job['poste'], $job['adr']['adr1'], $job['adr']['adr2'], $job['adr']['adr3'],
$job['adr']['postcode'],
$job['adr']['city'], $job['adr']['cityid'], $job['adr']['country'], $job['adr']['region'],
$job['adr']['regiontxt'],
- $job['tel'], $job['fax'], $job['mobile'], $job['email'], $job['web'],
- $job['pub'], $job['adr']['pub'], $job['tel_pub'], $job['email_pub'],
+ $job['email'], $job['web'],
+ $job['pub'], $job['adr']['pub'], $job['email_pub'],
$job['adr']['checked'] ? 'geoloc' : '', $job['adr']['precise_lat'],
$job['adr']['precise_lon']);
+ $profiletel = new ProfilePhones('pro', $jobid);
+ $profiletel->saveTels('tel', $job['tel']);
+ $i++;
}
}
}
{
parent::__construct($wiz);
$this->settings['cv'] = null;
+ $this->settings['corps'] = null;
$this->settings['jobs'] = new ProfileJob();
- $this->watched['cv'] = $this->watched['jobs'] = true;
+ $this->watched = array('cv' => true, 'jobs' => true, 'corps' => true);
}
protected function _fetchData()
S::i('uid'));
$this->values['cv'] = $res->fetchOneCell();
+ // Checkout the corps
+ $res = XDB::query("SELECT original_corpsid AS original, current_corpsid AS current,
+ rankid AS rank, corps_pub AS pub
+ FROM profile_corps
+ WHERE uid = {?}",
+ S::i('uid'));
+ $this->values['corps'] = $res->fetchOneAssoc();
+
// Build the jobs tree
- $res = XDB::iterRow("SELECT e.entreprise, e.secteur, e.ss_secteur,
+ $res = XDB::iterRow("SELECT e.entrid, e.entreprise, e.secteur, e.ss_secteur,
e.fonction, e.poste, e.adr1, e.adr2, e.adr3,
e.postcode, e.city, e.cityid, e.region, e.regiontxt,
e.country, gp.pays, gp.display,
FIND_IN_SET('geoloc', flags),
- e.tel, e.fax, e.mobile, e.email, e.web, e.pub,
- e.adr_pub, e.tel_pub, e.email_pub,
+ e.email, e.web, e.pub,
+ e.adr_pub, e.email_pub,
e.glat AS precise_lat, e.glng AS precise_lon
FROM entreprises AS e
LEFT JOIN geoloc_pays AS gp ON(gp.a2 = e.country)
- WHERE uid = {?} AND entreprise != ''
+ WHERE e.uid = {?} AND entreprise != ''
ORDER BY entrid", S::i('uid'));
$this->values['jobs'] = array();
- while (list($name, $secteur, $ss_secteur, $fonction, $poste,
+ while (list($id, $name, $secteur, $ss_secteur, $fonction, $poste,
$adr1, $adr2, $adr3, $postcode, $city, $cityid,
$region, $regiontxt, $country, $countrytxt, $display,
- $checked, $tel, $fax, $mobile, $email, $web,
- $pub, $adr_pub, $tel_pub, $email_pub, $glat, $glng) = $res->next()) {
- $this->values['jobs'][] = array('name' => $name,
+ $checked, $email, $web,
+ $pub, $adr_pub, $email_pub, $glat, $glng
+ ) = $res->next()) {
+ $this->values['jobs'][] = array('id' => $id,
+ 'name' => $name,
'secteur' => $secteur,
'ss_secteur' => $ss_secteur,
'fonction' => $fonction,
'checked' => $checked,
'precise_lat'=> $glat,
'precise_lon'=> $glng),
- 'tel' => $tel,
- 'fax' => $fax,
- 'mobile' => $mobile,
'email' => $email,
'web' => $web,
'pub' => $pub,
- 'tel_pub' => $tel_pub,
'email_pub' => $email_pub);
}
+
+ $res = XDB::iterator("SELECT link_id AS jobid, tel_type AS type, pub, display_tel AS tel, comment
+ FROM profile_phones
+ WHERE uid = {?} AND link_type = 'pro'
+ ORDER BY link_id",
+ S::i('uid'));
+ $i = 0;
+ $jobNb = count($this->values['jobs']);
+ while ($tel = $res->next()) {
+ $jobid = $tel['jobid'];
+ unset($tel['jobid']);
+ while ($i < $jobNb && $this->values['jobs'][$i]['id'] < $jobid) {
+ $i++;
+ }
+ if ($i >= $jobNb) {
+ break;
+ }
+ $job =& $this->values['jobs'][$i];
+ if (!isset($job['tel'])) {
+ $job['tel'] = array();
+ }
+ if ($job['id'] == $jobid) {
+ $job['tel'][] = $tel;
+ }
+ }
+ foreach ($this->values['jobs'] as $id=>&$job) {
+ if (!isset($job['tel'])) {
+ $job['tel'] = array();
+ }
+ unset($job['id']);
+ }
}
protected function _saveData()
WHERE user_id = {?}",
$this->values['cv'], S::i('uid'));
}
+
+ if ($this->changed['corps']) {
+ XDB::execute("UPDATE profile_corps
+ SET original_corpsid = {?}, current_corpsid = {?},
+ rankid = {?}, corps_pub = {?}
+ WHERE uid = {?}",
+ $this->values['corps']['original'], $this->values['corps']['current'],
+ $this->values['corps']['rank'], $this->values['corps']['pub'], S::i('uid'));
+ }
}
public function _prepare(PlPage &$page, $id)
{
+ require_once "emails.combobox.inc.php";
+ fill_email_combobox($page);
+
$page->assign('secteurs', XDB::iterator("SELECT id, label
FROM emploi_secteur"));
$page->assign('fonctions', XDB::iterator("SELECT id, fonction_fr, FIND_IN_SET('titre', flags) AS title
FROM fonctions_def
ORDER BY id"));
+
+ $res = XDB::iterator("SELECT id, name
+ FROM profile_corps_enum
+ ORDER BY id = 1 DESC, name");
+ $page->assign('original_corps', $res->fetchAllAssoc());
+
+ $res = XDB::iterator("SELECT id, name
+ FROM profile_corps_enum
+ WHERE still_exists = 1
+ ORDER BY id = 1 DESC, name");
+ $page->assign('current_corps', $res->fetchAllAssoc());
+
+ $res = XDB::iterator("SELECT id, name
+ FROM profile_corps_rank_enum");
+ $page->assign('corps_rank', $res->fetchAllAssoc());
}
}
}
}
+class ProfileNumber extends ProfileNoSave
+{
+ public function value(ProfilePage &$page, $field, $value, &$success)
+ {
+ if (is_null($value)) {
+ return isset($page->values[$field]) ? $page->values[$field] : S::v($field);
+ }
+ $value = trim($value);
+ $success = empty($value) || is_numeric($value);
+ if (!$success) {
+ Platal::page()->trigError('Numéro invalide');
+ }
+ return $value;
+ }
+}
+
class ProfileTel extends ProfileNoSave
{
if (is_null($value)) {
return isset($page->values[$field]) ? $page->values[$field] : S::v($field);
}
- $success = !preg_match('/[<>{}@&#~\/:;?,!§*_`\[\]|%$^=]/', $value, $matches);
+ require_once('profil.func.inc.php');
+ $value = format_phone_number($value);
+ if($value == '') {
+ $success = true;
+ return $value;
+ }
+ $value = format_display_number($value,$error);
+ $success = !$error;
if (!$success) {
- Platal::page()->trigError('Le numéro de téléphone contient un caractère interdit : ' . pl_entities($matches[0][0]));
+ Platal::page()->trigError('Le préfixe international du numéro de téléphone est inconnu. ');
+ }
+ return $value;
+ }
+}
+
+class ProfilePhones implements ProfileSetting
+{
+ private $tel;
+ private $pub;
+ protected $link_type;
+ protected $link_id;
+
+ public function __construct($type, $id)
+ {
+ $this->tel = new ProfileTel();
+ $this->pub = new ProfilePub();
+ $this->link_type = $type;
+ $this->link_id = $id;
+ }
+
+ public function value(ProfilePage &$page, $field, $value, &$success)
+ {
+ $success = true;
+ if (is_null($value)) {
+ $value = isset($page->values[$field]) ? $page->values[$field] : array();
+ }
+ if (!is_array($value)) {
+ $value = array();
+ }
+ foreach ($value as $key=>&$phone) {
+ if (@$phone['removed']) {
+ unset($value[$key]);
+ } else {
+ unset($phone['removed']);
+ $phone['pub'] = $this->pub->value($page, 'pub', $phone['pub'], $s);
+ $phone['tel'] = $this->tel->value($page, 'tel', $phone['tel'], $s);
+ if(!isset($phone['type']) || ($phone['type'] != 'fixed' && $phone['type'] != 'mobile' && $phone['type'] != 'fax')) {
+ $phone['type'] = 'fixed';
+ $s = false;
+ }
+ if (!$s) {
+ $phone['error'] = true;
+ $success = false;
+ }
+ if (!isset($phone['comment'])) {
+ $phone['comment'] = '';
+ }
+ }
}
return $value;
}
+
+ private function saveTel($telid, array &$phone)
+ {
+ if ($phone['tel'] != '') {
+ XDB::execute("INSERT INTO profile_phones (uid, link_type, link_id, tel_id, tel_type,
+ search_tel, display_tel, pub, comment)
+ VALUES ({?}, {?}, {?}, {?}, {?},
+ {?}, {?}, {?}, {?})",
+ S::i('uid'), $this->link_type, $this->link_id, $telid, $phone['type'],
+ format_phone_number($phone['tel']), $phone['tel'], $phone['pub'], $phone['comment']);
+ }
+ }
+
+ public function save(ProfilePage &$page, $field, $value)
+ {
+ XDB::execute("DELETE FROM profile_phones
+ WHERE uid = {?} AND link_type = {?} AND link_id = {?}",
+ S::i('uid'), $this->link_type, $this->link_id);
+ $this->saveTels($field, $value);
+ }
+
+ //Only saves phones without a delete operation
+ public function saveTels($field, $value)
+ {
+ foreach ($value as $telid=>&$phone) {
+ $this->saveTel($telid, $phone);
+ }
+ }
}
class ProfilePub extends ProfileNoSave
function handlers()
{
return array(
- 'search' => $this->make_hook('quick', AUTH_PUBLIC),
- 'search/adv' => $this->make_hook('advanced', AUTH_COOKIE),
+ 'search' => $this->make_hook('quick', AUTH_PUBLIC),
+ 'search/adv' => $this->make_hook('advanced', AUTH_COOKIE),
'advanced_search.php' => $this->make_hook('redir_advanced', AUTH_PUBLIC),
- 'search/autocomplete' => $this->make_hook('autocomplete', AUTH_COOKIE, 'user', NO_AUTH),
- 'search/list' => $this->make_hook('list', AUTH_COOKIE, 'user', NO_AUTH),
+ 'search/autocomplete' => $this->make_hook('autocomplete', AUTH_COOKIE, 'user', NO_AUTH),
+ 'search/list' => $this->make_hook('list', AUTH_COOKIE, 'user', NO_AUTH),
);
}
$school = Env::i('school');
}
- if (!is_null($school)) {
- $sql = 'SELECT type FROM applis_def WHERE id=' . $school;
+ if ((!is_null($school)) && ($school != '')) {
+ $sql = 'SELECT degreeid
+ FROM profile_education_degree
+ WHERE eduid=' . $school;
} else {
- $sql = 'DESCRIBE applis_def type';
+ $sql = 'SELECT id
+ FROM profile_education_degree_enum
+ ORDER BY id';
}
$res = XDB::query($sql);
- $row = $res->fetchOneRow();
- if (!is_null($school)) {
- $types = $row[0];
- } else {
- $types = explode('(',$row[1]);
- $types = str_replace("'","",substr($types[1],0,-1));
- }
- Platal::page()->assign('choix_diplomas', explode(',',$types));
+ Platal::page()->assign('choix_diplomas', $res->fetchColumn());
+
+ $sql = 'SELECT degree
+ FROM profile_education_degree_enum
+ ORDER BY id';
+ $res = XDB::query($sql);
+ Platal::page()->assign('name_diplomas', $res->fetchColumn());
}
function handler_quick(&$page, $action = null, $subaction = null)
$this->form_prepare();
} else {
$textFields = array(
- 'country' => array('field' => 'a2', 'table' => 'geoloc_pays', 'text' => 'pays', 'exact' => false),
- 'fonction' => array('field' => 'id', 'table' => 'fonctions_def', 'text' => 'fonction_fr', 'exact' => true),
- 'secteur' => array('field' => 'id', 'table' => 'emploi_secteur', 'text' => 'label', 'exact' => false),
- 'nationalite' => array('field' => 'a2', 'table' => 'geoloc_pays', 'text' => 'nat', 'exact' => 'false'),
- 'binet' => array('field' => 'id', 'table' => 'binets_def', 'text' => 'text', 'exact' => false),
- 'groupex' => array('field' => 'id', 'table' => 'groupex.asso',
- 'text' => "(a.cat = 'GroupesX' OR a.cat = 'Institutions') AND pub = 'public' AND nom",
- 'exact' => false),
- 'section' => array('field' => 'id', 'table' => 'sections', 'text' => 'text', 'exact' => false),
- 'school' => array('field' => 'id', 'table' => 'applis_def', 'text' => 'text', 'exact' => false),
- 'city' => array('table' => 'geoloc_city', 'text' => 'name', 'exact' => false)
+ 'country' => array('field' => 'a2', 'table' => 'geoloc_pays', 'text' => 'pays', 'exact' => false),
+ 'fonction' => array('field' => 'id', 'table' => 'fonctions_def', 'text' => 'fonction_fr', 'exact' => true),
+ 'secteur' => array('field' => 'id', 'table' => 'emploi_secteur', 'text' => 'label', 'exact' => false),
+ 'nationalite' => array('field' => 'a2', 'table' => 'geoloc_pays', 'text' => 'nat', 'exact' => 'false'),
+ 'binet' => array('field' => 'id', 'table' => 'binets_def', 'text' => 'text', 'exact' => false),
+ 'networking_type' => array('field' => 'network_type', 'table' => 'profile_networking_enum',
+ 'text' => 'name', 'exact' => false),
+ 'groupex' => array('field' => 'id', 'table' => 'groupex.asso',
+ 'text' => "(a.cat = 'GroupesX' OR a.cat = 'Institutions') AND pub = 'public' AND nom",
+ 'exact' => false),
+ 'section' => array('field' => 'id', 'table' => 'sections', 'text' => 'text', 'exact' => false),
+ 'school' => array('field' => 'id', 'table' => 'profile_education_enum', 'text' => 'name', 'exact' => false),
+ 'city' => array('table' => 'geoloc_city', 'text' => 'name', 'exact' => false)
);
if (!Env::has('page')) {
S::logger()->log('search', 'adv=' . var_export($_GET, true));
case 'binetTxt':
$db = '`binets_def` INNER JOIN
`binets_ins` ON(`binets_def`.`id` = `binets_ins`.`binet_id`)';
- $field='`binets_def`.`text`';
+ $field = '`binets_def`.`text`';
if (strlen($q) > 2)
$beginwith = false;
$realid = '`binets_def`.`id`';
break;
+ case 'networking_typeTxt':
+ $db = '`profile_networking_enum` INNER JOIN
+ `profile_networking` ON(`profile_networking`.`network_type` = `profile_networking_enum`.`network_type`)';
+ $field = '`profile_networking_enum`.`name`';
+ $unique = 'uid';
+ $realid = '`profile_networking_enum`.`network_type`';
+ break;
case 'city':
$db = '`geoloc_city` INNER JOIN
`adresses` ON(`geoloc_city`.`id` = `adresses`.`cityid`)';
case 'countryTxt':
$db = '`geoloc_pays` INNER JOIN
`adresses` ON(`geoloc_pays`.`a2` = `adresses`.`country`)';
- $unique='`uid`';
+ $unique = '`uid`';
$field = '`geoloc_pays`.`pays`';
$field2 = '`geoloc_pays`.`country`';
- $realid='`geoloc_pays`.`a2`';
+ $realid = '`geoloc_pays`.`a2`';
break;
case 'entreprise':
$db = '`entreprises`';
$field = '`entreprise`';
- $unique='`uid`';
+ $unique = '`uid`';
break;
case 'firstname':
$field = '`prenom`';
break;
case 'nationaliteTxt':
$db = '`geoloc_pays` INNER JOIN
- `auth_user_md5` ON(`geoloc_pays`.`a2` = `auth_user_md5`.`nationalite`)';
+ `auth_user_md5` ON (`geoloc_pays`.`a2` = `auth_user_md5`.`nationalite` OR
+ `geoloc_pays`.`a2` = `auth_user_md5`.`nationalite2` OR
+ `geoloc_pays`.`a2` = `auth_user_md5`.`nationalite3`)';
$field = 'IF(`geoloc_pays`.`nat`=\'\',
`geoloc_pays`.`pays`,
`geoloc_pays`.`nat`)';
case 'poste':
$db = '`entreprises`';
$field = '`poste`';
- $unique='`uid`';
+ $unique = '`uid`';
break;
case 'schoolTxt':
- $db = '`applis_def` INNER JOIN
- `applis_ins` ON(`applis_def`.`id` = `applis_ins`.`aid`)';
- $field='`applis_def`.`text`';
- $unique = '`uid`';
- $realid = '`applis_def`.`id`';
+ $db = 'profile_education_enum INNER JOIN
+ profile_education ON (profile_education_enum.id = profile_education.eduid)';
+ $field = 'profile_education_enum.name';
+ $unique = 'uid';
+ $realid = 'profile_education_enum.id';
if (strlen($q) > 2)
$beginwith = false;
break;
LIMIT 11',
$qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch,
$qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch);
+
$nbResults = 0;
$res = "";
while ($result = $list->next()) {
case 'binet':
$db = '`binets_def`';
break;
+ case 'networking_type':
+ $db = '`profile_networking_enum`';
+ $field = '`name`';
+ $id = '`network_type`';
+ break;
case 'country':
$db = '`geoloc_pays`';
$field = '`pays`';
break;
case 'nationalite':
$db = '`geoloc_pays` INNER JOIN
- `auth_user_md5` ON (`geoloc_pays`.`a2` = `auth_user_md5`.`nationalite`)';
+ `auth_user_md5` ON (`geoloc_pays`.`a2` = `auth_user_md5`.`nationalite` OR
+ `geoloc_pays`.`a2` = `auth_user_md5`.`nationalite2` OR
+ `geoloc_pays`.`a2` = `auth_user_md5`.`nationalite3`)';
$field = 'IF(`nat`=\'\', `pays`, `nat`)';
$id = '`a2`';
break;
}
break;
case 'school':
- $db = '`applis_def`';
+ $db = 'profile_education_enum';
+ $field = 'name';
+ $id = 'id';
$page->assign('onchange', 'changeSchool(this.value)');
break;
case 'section':
u.perms != \'pending\' AS wasinscrit,
FIND_IN_SET(\'femme\', u.flags) AS sexe,
a.alias AS forlife,
- ad0.text AS app0text, ad0.url AS app0url, ai0.type AS app0type,
- ad1.text AS app1text, ad1.url AS app1url, ai1.type AS app1type,
+ ede0.name AS eduname0, ede0.url AS eduurl0, edd0.degree AS edudegree0,
+ edu0.grad_year AS edugrad_year0, f0.field AS edufield0, edu0.program AS eduprogram0,
+ ede1.name AS eduname1, ede1.url AS eduurl1, edd1.degree AS edudegree1,
+ edu1.grad_year AS edugrad_year1, f1.field AS edufield1, edu1.program AS eduprogram1,
+ ede2.name AS eduname2, ede2.url AS eduurl2, edd2.degree AS edudegree2,
+ edu2.grad_year AS edugrad_year2, f2.field AS edufield2, edu2.program AS eduprogram2,
+ ede3.name AS eduname3, ede3.url AS eduurl3, edd3.degree AS edudegree3,
+ edu3.grad_year AS edugrad_year3, f3.field AS edufield3, edu3.program AS eduprogram3,
es.label AS secteur, ef.fonction_fr AS fonction,
- IF(n.nat=\'\',n.pays,n.nat) AS nat, n.a2 AS iso3166,
+ IF(n1.nat=\'\',n1.pays,n1.nat) AS nat1, n1.a2 AS iso3166_1,
+ IF(n2.nat=\'\',n2.pays,n2.nat) AS nat2, n2.a2 AS iso3166_2,
+ IF(n3.nat=\'\',n3.pays,n3.nat) AS nat3, n3.a2 AS iso3166_3,
(COUNT(em.email) > 0 OR FIND_IN_SET("googleapps", u.mail_storage) > 0) AS actif,';
// hide private information if not logged
if (S::logged())
$globals->search->result_fields .='
- q.profile_web AS web,
- q.profile_mobile AS mobile,
q.profile_freetext AS freetext,
adr.city, gp.pays AS countrytxt, gr.name AS region,
- e.entreprise,';
+ e.entreprise,
+ nw.address AS networking_address,
+ nwe.name AS networking_name,';
else
$globals->search->result_fields .="
- IF(q.profile_web_pub='public', q.profile_web, '') AS web,
- IF(q.profile_mobile_pub='public', q.profile_mobile, '') AS mobile,
IF(q.profile_freetext_pub='public', q.profile_freetext, '') AS freetext,
- IF(adr.pub='public', adr.city, '') AS city,
- IF(adr.pub='public', gp.pays, '') AS countrytxt,
- IF(adr.pub='public', gr.name, '') AS region,
- IF(e.pub='public', e.entreprise, '') AS entreprise,";
+ IF(adr.pub='public', adr.city, '') AS city,
+ IF(adr.pub='public', gp.pays, '') AS countrytxt,
+ IF(adr.pub='public', gr.name, '') AS region,
+ IF(e.pub='public', e.entreprise, '') AS entreprise,
+ IF(nw.pub='public', nw.address, '') AS networking_address,
+ IF(nw.pub='public', nwe.name, '') AS networking_name,";
@$globals->search->result_where_statement = '
- LEFT JOIN applis_ins AS ai0 ON (u.user_id = ai0.uid AND ai0.ordre = 0)
- LEFT JOIN applis_def AS ad0 ON (ad0.id = ai0.aid)
- LEFT JOIN applis_ins AS ai1 ON (u.user_id = ai1.uid AND ai1.ordre = 1)
- LEFT JOIN applis_def AS ad1 ON (ad1.id = ai1.aid)
- LEFT JOIN entreprises AS e ON (e.entrid = 0 AND e.uid = u.user_id)
- LEFT JOIN emploi_secteur AS es ON (e.secteur = es.id)
- LEFT JOIN fonctions_def AS ef ON (e.fonction = ef.id)
- LEFT JOIN geoloc_pays AS n ON (u.nationalite = n.a2)
- LEFT JOIN adresses AS adr ON (u.user_id = adr.uid AND FIND_IN_SET(\'active\',adr.statut))
- LEFT JOIN geoloc_pays AS gp ON (adr.country = gp.a2)
- LEFT JOIN geoloc_region AS gr ON (adr.country = gr.a2 AND adr.region = gr.region)
- LEFT JOIN emails AS em ON (em.uid = u.user_id AND em.flags = \'active\')';
+ LEFT JOIN profile_education AS edu0 ON (u.user_id = edu0.uid AND edu0.id = 0)
+ LEFT JOIN profile_education_enum AS ede0 ON (ede0.id = edu0.eduid)
+ LEFT JOIN profile_education_degree_enum AS edd0 ON (edd0.id = edu0.degreeid)
+ LEFT JOIN profile_education_field_enum AS f0 ON (f0.id = edu0.fieldid)
+ LEFT JOIN profile_education AS edu1 ON (u.user_id = edu1.uid AND edu1.id = 1)
+ LEFT JOIN profile_education_enum AS ede1 ON (ede1.id = edu1.eduid)
+ LEFT JOIN profile_education_degree_enum AS edd1 ON (edd1.id = edu1.degreeid)
+ LEFT JOIN profile_education_field_enum AS f1 ON (f1.id = edu1.fieldid)
+ LEFT JOIN profile_education AS edu2 ON (u.user_id = edu2.uid AND edu2.id = 2)
+ LEFT JOIN profile_education_enum AS ede2 ON (ede2.id = edu2.eduid)
+ LEFT JOIN profile_education_degree_enum AS edd2 ON (edd2.id = edu2.degreeid)
+ LEFT JOIN profile_education_field_enum AS f2 ON (f2.id = edu2.fieldid)
+ LEFT JOIN profile_education AS edu3 ON (u.user_id = edu3.uid AND edu3.id = 3)
+ LEFT JOIN profile_education_enum AS ede3 ON (ede3.id = edu3.eduid)
+ LEFT JOIN profile_education_degree_enum AS edd3 ON (edd3.id = edu3.degreeid)
+ LEFT JOIN profile_education_field_enum AS f3 ON (f3.id = edu3.fieldid)
+ LEFT JOIN entreprises AS e ON (e.entrid = 0 AND e.uid = u.user_id)
+ LEFT JOIN emploi_secteur AS es ON (e.secteur = es.id)
+ LEFT JOIN fonctions_def AS ef ON (e.fonction = ef.id)
+ LEFT JOIN geoloc_pays AS n1 ON (u.nationalite = n1.a2)
+ LEFT JOIN geoloc_pays AS n2 ON (u.nationalite2 = n2.a2)
+ LEFT JOIN geoloc_pays AS n3 ON (u.nationalite3 = n3.a2)
+ LEFT JOIN adresses AS adr ON (u.user_id = adr.uid AND FIND_IN_SET(\'active\',adr.statut))
+ LEFT JOIN geoloc_pays AS gp ON (adr.country = gp.a2)
+ LEFT JOIN geoloc_region AS gr ON (adr.country = gr.a2 AND adr.region = gr.region)
+ LEFT JOIN emails AS em ON (em.uid = u.user_id AND em.flags = \'active\')
+ LEFT JOIN profile_networking AS nw ON (nw.uid = u.user_id)
+ LEFT JOIN profile_networking_enum AS nwe ON (nwe.network_type = nw.network_type)';
// }}}
// {{{ class ThrowError
/** stores admin searches */
var $email;
var $ip;
+ /** stores phone number */
+ var $phone;
// }}}
// {{{ constructor
function isempty()
{
- return empty($this->strings) && empty($this->ranges) && empty($this->email) && empty($this->ip);
+ return empty($this->strings) && empty($this->ranges) && empty($this->email) && empty($this->ip) && empty($this->phone);
}
// }}}
foreach ($ranges as $r) {
if (preg_match('!^([<>]\d{4}|\d{4}(-\d{4})?)$!', $r)) $this->ranges[] = $r;
}
+
+ $t = preg_replace('!(\d{4}-\d{4}|>\d{4}|<\d{4})!', '', $s);
+ $t = preg_replace('![<>\- ]!', '', $t);
+ if (strlen($t) > 4) {
+ $this->phone = $t;
+ }
}
// }}}
$ip = ip_to_uint($this->ip);
$where[] = "( ls.ip = $ip OR ls.forward_ip = $ip ) AND ls.suid = 0";
}
+ if (!empty($this->phone)){
+ require_once("profil.func.inc.php");
+ $phone = format_phone_number($this->phone) . "%";
+ $where[] = 't.search_tel LIKE ' . XDB::escape($phone);
+ }
return join(" AND ", $where);
}
if (!empty($this->ip)) {
$join .= "INNER JOIN logger.sessions AS ls ON (ls.uid = u.user_id)\n";
}
+ if (!empty($this->phone)) {
+ if (!S::logged()) {
+ $join .= "INNER JOIN profile_phones AS t ON (t.uid = u.user_id AND t.pub = 'public')";
+ } else {
+ $join .= "INNER JOIN profile_phones AS t ON (t.uid = u.user_id)";
+ }
+ }
return $join;
}
// }}}
// }}}
// {{{ class RefSFieldMultipleTable
+class PhoneSField extends RefSField
+{
+ function PhoneSField($_fieldFormName, $_fieldDbName='', $_refTable, $_refAlias, $_refCondition)
+ {
+ $this->RefSField($_fieldFormName, $_fieldDbName, $_refTable, $_refAlias, $_refCondition, true);
+ }
+
+ function get_request()
+ {
+ require_once("profil.func.inc.php");
+ $this->value = trim(Env::v($this->fieldFormName));
+ $this->value = format_phone_number($this->value);
+ }
+
+ function compare()
+ {
+ return " LIKE '" . addslashes($this->value) . "%'";
+ }
+}
+
+class IndexSField extends RefSField
+{
+ function IndexSField($_fieldFormName, $_fieldDbName='', $_refTable, $_refAlias, $_refCondition)
+ {
+ $this->RefSField($_fieldFormName, $_fieldDbName, $_refTable, $_refAlias, $_refCondition, true);
+ }
+
+ function get_request()
+ {
+ $this->value = trim(Env::v($this->fieldFormName));
+ }
+}
+
class MapSField extends RefSField
{
var $mapId;
// {{{ function advancedSearchFromInput
function getadr_join($table) {
- return 'u.user_id='.$table.'.uid'.(Env::v('only_current',false)?' AND FIND_IN_SET(\'active\','.$table.'.statut)':'');
+ return 'u.user_id = ' . $table . '.uid' . (Env::v('only_current', false) ? ' AND FIND_IN_SET(\'active\', ' . $table . '.statut)' : '');
}
function advancedSearchFromInput()
{
$nameField = new RefWithSoundexSField('name',array('rn.nom1_soundex','rn.nom2_soundex','rn.nom3_soundex'),'recherche_soundex','rn','u.matricule = rn.matricule');
$firstnameField = new RefWithSoundexSField('firstname',array('rp.prenom1_soundex','rp.prenom2_soundex'),'recherche_soundex','rp','u.matricule = rp.matricule');
} else {
- $nameField = new NameSField('name',array('u.nom','u.nom_usage'),'');
- $firstnameField = new StringSField('firstname',array('u.prenom'),'');
+ $nameField = new NameSField('name', array('u.nom','u.nom_usage'), '');
+ $firstnameField = new StringSField('firstname', array('u.prenom'), '');
}
- $nicknameField = new StringSField('nickname',array('q.profile_nick'),'');
+ $nicknameField = new StringSField('nickname', array('q.profile_nick'), '');
- $promo1Field = new PromoSField('promo1','egal1',array('u.promo'),'');
- $promo2Field = new PromoSField('promo2','egal2',array('u.promo'),'');
- $womanField = new RefSField('woman',array('FIND_IN_SET(\'femme\',u.flags)+1'),'','','');
- $subscriberField = new RefSField('subscriber',array('!(u.perms IN (\'admin\',\'user\'))+1'),'','','');
- $aliveField = new RefSField('alive',array('(u.deces!=0)+1'),'','','');
+ $promo1Field = new PromoSField('promo1', 'egal1', array('u.promo'), '');
+ $promo2Field = new PromoSField('promo2', 'egal2', array('u.promo'), '');
+ $womanField = new RefSField('woman', array('FIND_IN_SET(\'femme\', u.flags) + 1'), '', '', '');
+ $subscriberField = new RefSField('subscriber', array('!(u.perms IN (\'admin\', \'user\')) + 1'), '', '', '');
+ $aliveField = new RefSField('alive', array('(u.deces != 0) + 1'), '', '', '');
if (Env::v('only_referent') == 'on') {
- $referentField = new RefSField('only_referent', array('"on"'), 'mentor', 'mt', 'mt.expertise != "" AND mt.uid=u.user_id');
+ $referentField = new RefSField('only_referent', array('"on"'), 'mentor', 'mt', 'mt.expertise != "" AND mt.uid = u.user_id');
} else {
- $referentField = null;
+ $referentField = null;
}
if (!Env::i('cityid')) {
- $townField = new RefSField('city',array('ac.city', 'ac.postcode'),'adresses','ac',getadr_join('ac'),false);
+ $townField = new RefSField('city', array('ac.city', 'ac.postcode'), 'adresses', 'ac', getadr_join('ac'), false);
} else {
- $townField = new RefSField('cityid',array('av.cityid', 'av.postcode'),'adresses','av',getadr_join('av'));
+ $townField = new RefSField('cityid', array('av.cityid', 'av.postcode'), 'adresses', 'av', getadr_join('av'));
}
- $countryField = new RefSField('country',array('ap.country'),'adresses','ap',getadr_join('ap'));
- $regionField = new RefSField('region',array('ar.region'),'adresses','ar',getadr_join('ar'));
- $mapField = new MapSField('mapid', array('sgcim.map_id'), array('adresses','geoloc_city_in_maps'), array('amp','sgcim'), array(getadr_join('amp'), 'amp.cityid = sgcim.city_id'));
+ $countryField = new RefSField('country', array('ap.country'), 'adresses', 'ap', getadr_join('ap'));
+ $regionField = new RefSField('region',array('ar.region'), 'adresses', 'ar', getadr_join('ar'));
+ $mapField = new MapSField('mapid', array('sgcim.map_id'), array('adresses', 'geoloc_city_in_maps'),
+ array('amp', 'sgcim'), array(getadr_join('amp'), 'amp.cityid = sgcim.city_id'));
- $entrepriseField = new RefSField('entreprise',array('ee.entreprise'),'entreprises','ee','u.user_id=ee.uid',false);
- $posteField = new RefSField('poste',array('ep.poste'),'entreprises','ep','u.user_id=ep.uid', false);
- $fonctionField = new RefSField('fonction',array('en.fonction'),'entreprises','en','u.user_id=en.uid');
- $secteurField = new RefSField('secteur',array('fm.secteur'),'entreprises','fm','u.user_id=fm.uid');
- $cvField = new RefSField('cv',array('u.cv'),'','','',false);
+ $entrepriseField = new RefSField('entreprise', array('ee.entreprise'), 'entreprises', 'ee', 'u.user_id = ee.uid', false);
+ $posteField = new RefSField('poste', array('ep.poste'), 'entreprises', 'ep', 'u.user_id = ep.uid', false);
+ $fonctionField = new RefSField('fonction', array('en.fonction'), 'entreprises', 'en', 'u.user_id = en.uid');
+ $secteurField = new RefSField('secteur', array('fm.secteur'), 'entreprises', 'fm', 'u.user_id = fm.uid');
+ $cvField = new RefSField('cv', array('u.cv'), '', '', '', false);
- $natField = new RefSField('nationalite',array('u.nationalite'),'','','');
- $binetField = new RefSField('binet',array('b.binet_id'),'binets_ins','b','u.user_id=b.user_id');
- $groupexField = new RefSField('groupex',array('g.id'),array('groupex.asso', 'groupex.membres'),array('g', 'gm'),
- array("(g.cat = 'GroupesX' OR g.cat = 'Institutions') AND g.pub = 'public'",
- 'gm.asso_id = g.id AND u.user_id=gm.uid'));
- $sectionField = new RefSField('section',array('u.section'),'','','');
- $schoolField = new RefSField('school',array('as.aid'),'applis_ins','`as`','u.user_id=as.uid');
- $diplomaField = new RefSField('diploma',array('ad.type'),'applis_ins','ad','u.user_id=ad.uid');
+ $natField = new RefSField('nationalite', array('u.nationalite', 'u.nationalite2', 'u.nationalite3'), '', '', '');
+ $binetField = new RefSField('binet', array('b.binet_id'), 'binets_ins', 'b', 'u.user_id=b.user_id');
+ $groupexField = new RefSField('groupex', array('g.id'), array('groupex.asso', 'groupex.membres'), array('g', 'gm'),
+ array("(g.cat = 'GroupesX' OR g.cat = 'Institutions') AND g.pub = 'public'",
+ 'gm.asso_id = g.id AND u.user_id = gm.uid'));
+ $sectionField = new RefSField('section', array('u.section'), '', '', '');
+ $schoolField = new RefSField('school', array('edu.eduid'), 'profile_education', 'edu', 'u.user_id = edu.uid');
+ $diplomaField = new RefSField('diploma', array('edd.degreeid'), 'profile_education', 'edd', 'u.user_id = edd.uid');
- $freeField = new RefSField('free',array('q.profile_freetext'),'','','',false);
+ $freeField = new RefSField('free', array('q.profile_freetext'), '', '', '', false);
+ $nwAddressField = new RefSField('networking_address', array('nw.address'), 'profile_networking', 'nw', 'nw.uid=u.user_id', false);
+ if (Env::v('networking_address') == '') {
+ $nwTypeField = new IndexSField('networking_type', array('nwe.network_type'), array('profile_networking', 'profile_networking_enum'),
+ array('nw', 'nwe'), array('nw.uid = u.user_id', 'nwe.network_type = nw.network_type'));
+ } else {
+ $nwTypeField = new IndexSField('networking_type',
+ array('nwe.network_type'), 'profile_networking_enum', 'nwe', 'nwe.network_type = nw.network_type');
+ }
+ $nwPhoneField = new PhoneSField('phone_number', array('t.search_tel'), 'profile_phones', 't', 't.uid = u.user_id');
return array(
$nameField, $firstnameField, $nicknameField, $promo1Field,
- $promo2Field, $womanField, $subscriberField, $aliveField, $referentField,
+ $promo2Field, $womanField, $subscriberField, $aliveField,
$townField, $countryField, $regionField, $mapField, $entrepriseField,
$posteField, $secteurField, $cvField, $natField, $binetField,
$groupexField, $sectionField, $schoolField, $diplomaField,
- $freeField, $fonctionField);
+ $freeField, $fonctionField, $nwAddressField, $nwTypeField,
+ $nwPhoneField, $referentField);
}
// }}}
{
require_once('geoloc.inc.php');
$txtad = get_address_text($param['adr']);
- if (!$txtad &&
- !$param['adr']['tels'] && !count($param['adr']['tels']) &&
- !$param['adr']['tel'] &&
- !$param['adr']['fax'] &&
- !$param['adr']['mobile']) return "";
-
+ if (!$txtad && !$param['adr']['tels'] && !count($param['adr']['tels'])) {
+ return "";
+ }
$lines = explode("\n", $txtad);
$idt = array_shift($lines);
$map = "<a href=\"http://maps.google.fr/?q="
. urlencode(implode(", ", $lines) . " ($idt)")
. "\"><img src=\"images/icons/map.gif\" alt=\"Google Maps\" title=\"Carte\"/></a>";
+ $comment = "";
+ if ($param['adr']['comment'] != "")
+ {
+ $commentHtml = str_replace(array('&', '"'), array('&', '"'), $param['adr']['comment']);
+ $commentJs = str_replace(array('\\', '\''), array('\\\\', '\\\''), $commentHtml);
+ $comment = "<img style=\"margin-left: 5px;\" src=\"images/icons/comments.gif\""
+ . " onmouseover=\"return overlib('"
+ . $commentJs
+ . "',WIDTH,250);\""
+ . " onmouseout=\"nd();\""
+ . " alt=\"Commentaire\" title=\""
+ . $commentHtml
+ . "\"/>";
+ }
if ($restore) {
array_unshift($lines, $idt);
}
if ($param['titre'])
{
if ($param['titre_div'])
- $txthtml .= "<div class='titre'>".pl_entity_decode($param['titre'])." ".$map."</div>\n";
+ $txthtml .= "<div class='titre'>".pl_entity_decode($param['titre'])." ".$map.$comment."</div>\n";
else
- $txthtml .= "<em>".pl_entity_decode($param['titre'])." </em>".$map."<br />\n";
+ $txthtml .= "<em>".pl_entity_decode($param['titre'])." </em>".$map.$comment."<br />\n";
}
foreach ($lines as $line)
{
$txthtml .= "<strong>".$line."</strong><br/>\n";
}
- if ($param['adr']['tel'])
- $txthtml .= "<div>\n<em>Tél : </em>\n<strong>".$param['adr']['tel']."</strong>\n</div>\n";
- if ($param['adr']['fax'])
- $txthtml .= "<div>\n<em>Fax : </em>\n<strong>".$param['adr']['fax']."</strong>\n</div>\n";
- if ($param['adr']['mobile'])
- $txthtml .= "<div>\n<em>Tél : </em>\n<strong>".$param['adr']['mobile']."</strong>\n</div>\n";
- if ($param['adr']['tels'] && count($param['adr']['tels'])) {
- foreach ($param['adr']['tels'] as $tel)
- $txthtml .= "<div>\n<em>".$tel['tel_type']." : </em>\n<strong>".$tel['tel']."</strong>\n</div>\n";
+ if(isset($param['adr']['tels'])) {
+ require_once('function.display_phones.php');
+ $txthtml .= smarty_function_display_phones($param['adr'],$smarty);
}
if (!$param['nodiv']) {
$pos = $param['pos'] ? " style='float: " . $param['pos'] . "'" : '';
--- /dev/null
+<?php
+/***************************************************************************
+ * Copyright (C) 2003-2008 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 *
+ ***************************************************************************/
+
+function smarty_function_display_phones($param, &$smarty)
+{
+ $txthtml = "";
+ if (count($param['tels'])) {
+ foreach ($param['tels'] as $tel) {
+ switch ($tel['tel_type']) {
+ case 'fixed':
+ $tel_type = 'Tél';
+ break;
+ case 'fax':
+ $tel_type = 'Fax';
+ break;
+ case 'mobile':
+ $tel_type = 'Mob';
+ break;
+ default:
+ $tel_type = $tel['tel_type'];
+ }
+ $txthtml .= "<div>\n<em>" . $tel_type . " : </em>\n<strong>" . $tel['tel'] . "</strong>\n";
+ $comment = "";
+ if ($tel['comment'] != "") {
+ $commentHtml = str_replace(array('&', '"'), array('&', '"'), $tel['comment']);
+ $commentJs = str_replace(array('\\', '\''), array('\\\\', '\\\''), $commentHtml);
+ $txthtml .= "<img style=\"margin-left: 5px;\" src=\"images/icons/comments.gif\""
+ . " onmouseover=\"return overlib('"
+ . $commentJs
+ . "',WIDTH,250);\""
+ . " onmouseout=\"nd();\""
+ . " alt=\"Commentaire\" title=\""
+ . $commentHtml
+ . "\"/>\n";
+ }
+ $txthtml .= "</div>\n";
+ }
+ }
+ return $txthtml;
+}
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+?>
***************************************************************************/
-function select_nat($valeur,$pad=false) {
- $sql = "SELECT a2 AS id,IF(nat='',pays,nat) AS text FROM geoloc_pays WHERE nat IS NOT NULL ORDER BY text";
+function select_nat($valeur, $pad=false) {
+ $sql = "SELECT a2 AS id, IF(nat='', pays, nat) AS text FROM geoloc_pays WHERE nat IS NOT NULL ORDER BY text";
$res = XDB::iterRow($sql);
$sel = ' selected="selected"';
// on ajoute une entree vide si $pad est vrai
$html = "";
if ($pad) {
- $html.= '<option value="0"'.($valeur==0?$sel:"")."></option>\n";
+ $html .= sprintf("<option value=\"\"%s></option>\n", ($valeur ? $sel : ""));
}
- while (list($my_id,$my_text) = $res->next()) {
- $html .= sprintf("<option value=\"%s\" %s>%s</option>\n",$my_id,($valeur==$my_id?$sel:""),$my_text);
+ while (list($my_id, $my_text) = $res->next()) {
+ $html .= sprintf("<option value=\"%s\"%s>%s</option>\n", $my_id, ($valeur==$my_id ? $sel : ""), $my_text);
}
+
return $html;
}
function smarty_function_select_nat($params, &$smarty) {
- if(empty($params['pad']) || !($params['pad']))
- $pad = false;
- else
- $pad = true;
+ if (empty($params['pad']) || !($params['pad'])) {
+ $pad = false;
+ } else {
+ $pad = true;
+ }
+
return select_nat($params['valeur'], $pad);
}
<tr class="impair">
<td>
<strong>Champs profil :</strong>
- <a href="admin/formations">Formations</a>
+ <a href="admin/education">Formations</a>
+ |
+ <a href="admin/education_field">Domaines de formation</a>
+ |
+ <a href="admin/education_degree">Niveau de formation</a>
+ |
+ <a href="admin/education_degree_set">Niveau par formation</a>
|
<a href="admin/binets">Binets</a>
|
<a href="admin/ss_secteurs">Sous-secteurs</a>
|
<a href="admin/fonctions">Fonctions</a>
+ |
+ <a href="admin/networking">Networking</a>
+ |
+ <a href="admin/corps_enum">Corps</a>
+ |
+ <a href="admin/corps_rank">Grade</a>
</td>
</tr>
<tr class="pair">
<a href="admin/geoloc">Synchro</a>
|
<a href="admin/geoloc/dynamap">Dynamap</a>
+ |
+ <a href="admin/geoloc/country">Pays</a>
</td>
</tr>
<tr class="impair">
--- /dev/null
+{**************************************************************************}
+{* *}
+{* Copyright (C) 2003-2008 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 *}
+{* *}
+{**************************************************************************}
+{iterate from=$users item=vcard}
+BEGIN:VCARD
+VERSION:3.0
+{if $vcard.nom_usage}
+FN:{$vcard.prenom|vcard_enc} {$vcard.nom_usage|vcard_enc} ({$vcard.nom|vcard_enc})
+{else}
+FN:{$vcard.prenom|vcard_enc} {$vcard.nom|vcard_enc}
+{/if}
+N:{$vcard.nom|vcard_enc};{$vcard.prenom|vcard_enc};{$vcard.nom_usage|vcard_enc};;
+{if $vcard.nickname}
+NICKNAME:{$vcard.nickname|vcard_enc}
+{/if}
+EMAIL;TYPE=internet,pref:{$vcard.bestalias}@{#globals.mail.domain#}
+EMAIL;TYPE=internet:{$vcard.bestalias}@{#globals.mail.domain2#}
+{if $vcard.bestalias neq $vcard.forlife}
+EMAIL;TYPE=internet:{$vcard.forlife}@{#globals.mail.domain#}
+EMAIL;TYPE=internet:{$vcard.forlife}@{#globals.mail.domain2#}
+{/if}
+{if $vcard.virtualalias}
+EMAIL;TYPE=internet:{$vcard.virtualalias}
+{/if}
+{if $vcard.tels}
+{foreach item=tel from=$vcard.tels}
+{if $tel.tel_type eq 'mobile'}TEL;TYPE=cell{else}{if $tel.tel_type eq 'fax'}FAX{else}TEL{/if};TYPE=home{/if}:{$tel.tel|vcard_enc}
+{/foreach}
+{/if}
+{if $vcard.adr_pro}
+{if $vcard.adr_pro[0].entreprise}
+ORG:{$vcard.adr_pro[0].entreprise|vcard_enc}
+{/if}
+{if $vcard.adr_pro[0].poste}
+TITLE:{$vcard.adr_pro[0].poste|vcard_enc}
+{/if}
+{if $vcard.adr_pro[0].fonction}
+ROLE:{$vcard.adr_pro[0].fonction|vcard_enc}
+{/if}
+{if $vcard.adr_pro[0].tels}
+{foreach item=tel from=$vcard.adr_pro[0].tels}
+{if $tel.tel_type eq 'mobile'}TEL;TYPE=cell,work{else}{if $tel.tel_type eq 'fax'}FAX{else}TEL{/if};TYPE=work{/if}:{$tel.tel|vcard_enc}
+{/foreach}
+{/if}
+ADR;TYPE=work:{format_adr adr=$vcard.adr_pro[0]}
+{/if}
+{foreach item=adr from=$vcard.adr}
+ADR;TYPE=home{if $adr.courier},postal{/if}:{format_adr adr=$adr}
+{if $adr.tels}
+{foreach item=tel from=$adr.tels}
+{if $tel.tel_type eq 'mobile'}TEL;TYPE=cell,home{else}{if $tel.tel_type eq 'fax'}FAX{else}TEL{/if};TYPE=home{/if}:{$tel.tel|vcard_enc}
+{/foreach}
+{/if}
+{/foreach}
+{foreach from=$vcard.networking item=nw}
+{if $nw.filter eq 'web'}
+URL:{$nw.address}
+{/if}
+{/foreach}
+{if strlen(trim($vcard.freetext)) == 0}
+NOTE:(X{$vcard.promo})
+{else}
+NOTE:(X{$vcard.promo})\n{$vcard.freetext|miniwiki:'no_title':'text'|vcard_enc}
+{/if}
+{if $vcard.section}
+X-SECTION:{$vcard.section}
+{/if}
+{if $vcard.binets_vcardjoin}
+X-BINETS:{$vcard.binets_vcardjoin}
+{/if}
+{if $vcard.gpxs_vcardjoin}
+X-GROUPS:{$vcard.gpxs_vcardjoin}
+{/if}
+{if $vcard.photo}
+PHOTO;ENCODING=b;TYPE={$vcard.photo.attachmime}:{$vcard.photo.attach|base64_encode|vcard_enc}
+{/if}
+SORT-STRING:{$vcard.nom|vcard_enc}
+REV:{$vcard.date|date_format:"%Y%m%dT000000Z"}
+END:VCARD{"\n"}
+{/iterate}
+{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
</td>
</tr>
{/foreach}
- <tr class="{cycle values="pair,impair"}"><td colspan="4">
- <form action="emails/redirect" method="post">
- <div>
- <br />
- Ajouter une adresse email :
- <input type="text" size="35" maxlength="60" name="email" value="" />
- <input type="submit" value="ajouter" name="emailop" />
+ <form action="emails/redirect" method="post">
+ {cycle values="pair,impair" assign=class_combobox}
+ {include file="include/emails.combobox.tpl" name="email" val=$email class=$class_combobox error=$error_email}
+ <tr class=$class_combobox><td colspan="4"><div>
+ <input type="submit" value="ajouter" name="emailop" />
{xsrf_token_field}
- </div>
- </form>
- </td></tr>
+ </div></td></tr>
+ </form>
</table>
<script type="text/javascript">showRemove(); activeEnable();</script>
</div>
{else}
<h1 id='pagetop'>
-Bienvenue {$smarty.session.prenom}{if $birthday}
+Bienvenue {$smarty.session.yourself_name}{if $birthday}
et joyeux anniversaire de la part de toute l'équipe !
{else},
{/if}
--- /dev/null
+{**************************************************************************}
+{* *}
+{* Copyright (C) 2003-2007 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 *}
+{* *}
+{**************************************************************************}
+
+<h2><a href="fusionax">Fusion des annuaires X.org - AX<a> / Décès</h2>
+
+{if $deceasedErrors}
+<p>Voici les {$deceasedErrors} différences entre les deux annuaires pour les renseignements de
+décès.</p>
+
+{if $nbDeceasedMissingInXorg > 0}
+<p>Anciens déclarés décédés dans l'annuaire AX mais pas sur Xorg</p>
+{include file='fusionax/listFusion.tpl' fusionList=$deceasedMissingInXorg field1='deces_ax' namefield1='Décès AX'}
+
+<a href="fusionax/deceased/updateXorg">Inclure toutes les dates de décès connues par l'AX sur Xorg.</a>
+{/if}
+
+{if $nbDeceasedMissingInAX > 0}
+<p>Anciens déclarés décédés dans l'annuaire Xorg mais pas chez l'AX</p>
+{include file='fusionax/listFusion.tpl' fusionList=$deceasedMissingInAX field1='deces_xorg' namefield1='Décès X.org'}
+
+<a href="fusionax/deceased/updateAX">Considérer ces cas comme traités (il n'y a rien à importer).</a>
+{/if}
+
+{if $nbDeceasedDifferent > 0}
+<p>Anciens déclarés décédés dans les deux annuaires mais pas avec la même date</p>
+{include file='fusionax/listFusion.tpl' fusionList=$deceasedDifferent field1='deces_xorg' field2='deces_ax' namefield1='Décès X.org' namefield2='Décès AX'}
+
+<h3>Mettre en correspondance</h3>
+<form action="fusionax/deceased/update" method="post">
+ User ID X.org : <input type="text" name="user_id" value=""/><br/>
+ Date de décès : <input type="text" name="date" value""/><br/>
+ <input type="submit" value="Mettre à jour"/>
+</form>
+{/if}
+
+{else}
+<p>Aucune différence pour les renseignements de décès entre les deux annuaires.</p>
+{/if}
+
+{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
--- /dev/null
+{**************************************************************************}
+{* *}
+{* Copyright (C) 2003-2007 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 *}
+{* *}
+{**************************************************************************}
+
+<h2><a href="fusionax">Fusion des annuaires X.org - AX</a> / Identifiants</h2>
+
+<p>Le préalable à toute fusion de renseignements pour une personne entre ce
+que contient la base AX et ce que contient ce site est bien évidemment de
+trouver une correspondance entre les personnes renseignés dans ces annuaires.</p>
+
+{if $nbMissingInAX}
+<h3>Anciens manquants à l'AX</h3>
+
+<p><a href="fusionax/ids/missingInAX">{$nbMissingInAX} ancien{if $nbMissingInAX > 1}s{/if}</a>.</p>
+{/if}
+
+{if $nbMissingInXorg > 0}
+<h3>Anciens manquants à x.org</h3>
+
+<p><a href="fusionax/ids/missingInXorg">{$nbMissingInXorg} ancien{if $nbMissingInXorg > 1}s{/if}</a>.</p>
+{/if}
+
+{if $wrongInXorg > 0}
+<h3>Anciens ayant un matricule_ax sur Xorg ne correspondant à rien dans la base de l'AX</h3>
+
+<p><a href="fusionax/ids/wrongInXorg">{$wrongInXorg} ancien{if $wrongInXorg > 1}s{/if}</a>.</p>
+{/if}
+
+<h3>Mettre en correspondance</h3>
+<form action="fusionax/ids/lier" method="post">
+ Matricule AX : <input type="text" name="matricule_ax" value""/><br/>
+ User ID X.org : <input type="text" name="user_id" value=""/><br/>
+ <input type="submit" value="Lier"/>
+</form>
+
+<p></p>
+<div id="autolink" name="autolink">
+<h3>Mise en correspondance automatique</h3>
+{if $easyToLink}
+<p>
+ Ces anciens sont probablement les mêmes (à peu près mêmes nom, prénom, promo)<br />
+ {$nbMatch} correspondances trouvées.
+</p>
+
+{include file="fusionax/listFusion.tpl" fusionList=$easyToLink fusionAction="fusionax/ids/link" name="lier" field1="display_name_ax" namefield1="Ancien AX"}
+<p><a href="fusionax/ids/linknext">Lier toutes les fiches affichées</a> <span id="fusion-reload" style="display:none"> - <a href="fusionax/ids#autolink">Trouver d'autres correspondances</a></span></p>
+<script type="text/javascript">
+{literal}
+//<!--
+$(document).ready(function() {
+ $('#autolink a.fusion-action').click(function(a){
+ $.get(a.currentTarget.href,{},function(){
+ $(a.currentTarget).hide();
+ $('#fusion-reload').show();
+ $('#fusion-reload a').click(function(a) {
+ document.location = a.currentTarget.href;
+ document.location.reload();
+ });
+ });
+ return false;
+ });
+});
+//-->
+{/literal}
+</script>
+{else}
+<p>Aucune correspondance automatique n'a été trouvée (mêmes nom, prénom, promo d'étude).</p>
+{/if}
+</div>
--- /dev/null
+{**************************************************************************}
+{* *}
+{* Copyright (C) 2003-2007 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 *}
+{* *}
+{**************************************************************************}
+
+<h2><a href="fusionax">Fusion des annuaires X.org - AX<a> / <a href="fusionax/ids">Identifiants<a> / Manquants dans l'annuaire de l'AX</h2>
+
+<p></p>
+
+{if $missingInAX}
+{include file='fusionax/listFusion.tpl' fusionList=$missingInAX field1='user_id' namefield1='ID X.org'}
+{/if}
--- /dev/null
+{**************************************************************************}
+{* *}
+{* Copyright (C) 2003-2007 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 *}
+{* *}
+{**************************************************************************}
+
+<h2><a href="fusionax">Fusion des annuaires X.org - AX<a> / <a href="fusionax/ids">Identifiants<a> / Manquants dans l'annuaire d'X.org</h2>
+
+<p></p>
+
+{if $missingInXorg}
+{include file='fusionax/listFusion.tpl' fusionList=$missingInXorg field1='id_ancien' namefield1='matricule AX'}
+{/if}
--- /dev/null
+{**************************************************************************}
+{* *}
+{* Copyright (C) 2003-2007 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 *}
+{* *}
+{**************************************************************************}
+
+<h2><a href="fusionax">Fusion des annuaires X.org - AX<a> / <a href="fusionax/ids">Identifiants<a> / Présents dans Xorg avec un matricule_ax ne correspondant à rien
+dans la base de l'AX (mises à part les promo 1921 et 1923 qui ne figurent pas dans les données de l'AX)</h2>
+
+<p></p>
+
+{if $wrongInXorg}
+{include file='fusionax/listFusion.tpl' fusionList=$wrongInXorg field1='user_id' namefield1='ID X.org'}
+
+<p><a href="fusionax/ids/cleanwronginxorg">Mettre à NULL le matricule_ax de ces camarades pour marquer le fait qu'ils ne figurent pas dans l'annuaire de l'AX</a></p>
+{/if}
{**************************************************************************}
{* *}
-{* Copyright (C) 2003-2008 Polytechnique.org *}
+{* Copyright (C) 2003-2007 Polytechnique.org *}
{* http://opensource.polytechnique.org/ *}
{* *}
{* This program is free software; you can redistribute it and/or modify *}
{* *}
{**************************************************************************}
-{assign var=telpref value="`$adpref`[tel][`$t`]"}
-{assign var=telid value="`$adid`_tel_`$t`"}
-<div style="float: right" class="flags">
- {include file="include/flags.radio.tpl" name="`$telpref`[pub]" val=$tel.pub}
+<script type="text/javascript">
+{literal}
+//<!--
+ $(document).ready(function() {
+ $('#fusionax_import input').click(function() {
+ $('#fusionax_import input').hide();
+ $('#fusionax_import').append('Lancement de l\'import.<br/>');
+ $.getScript('fusionax/import/launch');
+ });
+ });
+//-->
+{/literal}
+</script>
+<h2><a href="fusionax">Fusion des annuaires X.org - AX</a></h2>
+
+<h2>Import de l'annuaire AX</h2>
+{if $lastimport}
+<p>Dernier import {$lastimport}</p>
+{/if}
+
+{if $keymissing}
+<p>Impossible de faire l'import, il manque la clef d'authentification :</p>
+<pre>{$keymissing}</pre>
+{else}
+<div id="fusionax_import">
+<input type="button" value="Lancer l'import"/>
</div>
-<span class="titre">N°{$t+1}</span>
-<input type="hidden" name="{$telpref}[removed]" value="0" />
-<input type="text" size="10" maxlength="30" name="{$telpref}[type]" value="{$tel.type|default:"Tél."}" />
-<input type="text" size="19" maxlength="28" name="{$telpref}[tel]" {if $tel.error}class="error"{/if} value="{$tel.tel}" />
-<a href="javascript:removeObject('{$telid}', '{$telpref}')">
- {icon name=cross title="Supprimer ce numéro de téléphone"}
-</a>
+{/if}
{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
--- /dev/null
+{**************************************************************************}
+{* *}
+{* Copyright (C) 2003-2007 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 *}
+{* *}
+{**************************************************************************}
+
+<h2>Fusion des annuaires X.org - AX</h2>
+<ul>
+<li>Voir la <a href="Fusion">documentation</a></li>
+<li><a href="fusionax/import">Import de la base AX</a> {if $lastimport} - (dernier import le {$lastimport}){/if}</li>
+<li>Mise en <a href="fusionax/ids">correspondance simple</a></li>
+<li>Création des <a href="fusionax/view">VIEW annexes nécessaires aux corrélations</a></li>
+<li>Corrélation des <a href="fusionax/names">données d'identification</a></li>
+<li>Corrélation des <a href="fusionax/coords">coordonnées</a></li>
+<li>Corrélation des <a href="fusionax/pros">informations professionnelles</a></li>
+<li>Corrélation des <a href="fusionax/studies">informations de formations</a></li>
+<li>Corrélation des <a href="fusionax/deceased">dates de décès</a></li>
+</ul>
+
+{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
--- /dev/null
+{**************************************************************************}
+{* *}
+{* Copyright (C) 2003-2007 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 *}
+{* *}
+{**************************************************************************}
+
+<table class="bicol">
+ <tr>
+ <th>Ancien</th>
+ <th>Fiches</th>
+ {if $field1}
+ <th>{$namefield1}</th>
+ {/if}
+ {if $field2}
+ <th>{$namefield2}</th>
+ {/if}
+ {if $fusionAction}
+ <th>Action</th>
+ {/if}
+ </tr>
+{if $fusionList}
+{iterate from=$fusionList item=c}
+ <tr class="{cycle values="pair,impair"}">
+ <td>{$c.display_name} (X {$c.promo})</td>
+ <td style="text-align:center">
+ {if $c.user_id}<a href="admin/user/{$c.user_id}" class="popup2">{icon name="user_suit" title="Administrer utilisateur"}</a>{/if}
+ {if $c.id_ancien}<a href="http://www.polytechniciens.com/?page=AX_FICHE_ANCIEN&anc_id={$c.id_ancien}" class="popup2">{icon name="user_gray" title="fiche AX"}</a>{/if}
+ </td>
+ {if $field1}
+ <td>{$c.$field1}</td>
+ {/if}
+ {if $field2}
+ <td>{$c.$field2}</td>
+ {/if}
+ {if $fusionAction}
+ <td><a class="fusion-action" href="{$fusionAction}/{$c.user_id}/{$c.id_ancien}">{$name}</a></td>
+ {/if}
+ </tr>
+{/iterate}
+{/if}
+</table>
--- /dev/null
+{**************************************************************************}
+{* *}
+{* Copyright (C) 2003-2007 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 *}
+{* *}
+{**************************************************************************}
+
+<h2><a href="fusionax">Fusion des annuaires X.org - AX<a> / Création des VIEW annexes nécessaires aux corrélations </h2>
+
+<p><a href="fusionax/view/create">Création des VIEW annexes nécessaires aux corrélations</a></p>
{if !$c.dcd && $c.inscrit}</a>{/if}
</div>
<div class="autre">
- {if $c.iso3166}
- <img src='images/flags/{$c.iso3166}.gif' alt='{$c.nat}' height='11' title='{$c.nat}' />
+ {if $c.iso3166_1}
+ <img src='images/flags/{$c.iso3166_1}.gif' alt='{$c.nat1}' height='11' title='{$c.nat1}' />
+ {/if}
+ {if $c.iso3166_2}
+ <img src='images/flags/{$c.iso3166_2}.gif' alt='{$c.nat2}' height='11' title='{$c.nat2}' />
+ {/if}
+ {if $c.iso3166_3}
+ <img src='images/flags/{$c.iso3166_3}.gif' alt='{$c.nat3}' height='11' title='{$c.nat3}' />
{/if}
(X {$c.promo})
{if $c.dcd}décédé{if $c.sexe}e{/if} le {$c.deces|date_format}{/if}
--- /dev/null
+{**************************************************************************}
+{* *}
+{* Copyright (C) 2003-2008 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 *}
+{* *}
+{**************************************************************************}
+
+<tr {if $class}class="{$class}"{/if}>
+ <td>
+ <span class="titre">{if $name eq "email_directory"}Email annuaire AX
+ {elseif $name eq "email"}Ajouter une adresse email{else}
+ Email professionnel{/if}</span>
+ </td>
+ {if $name eq "email"}<td></td>{/if}
+ <td>
+ <select name="{$name}" id="combobox">
+ {if $email_type eq "directory"}
+ <optgroup label="Email annuaire AX">
+ <option value="{$email_directory}" {if
+ $val eq $email_directory}selected="selected"{/if}>{$email_directory}</option>
+ </optgroup>
+ {/if}
+ {if $name eq "email_directory"}
+ <optgroup label="Emails polytechniciens">
+ {if $melix}
+ <option value="{$melix}@{#globals.mail.alias_dom#}" {if
+ $val eq $melix|cat:'@'|cat:#globals.mail.alias_dom#}selected="selected"{/if}>
+ {$melix}@{#globals.mail.alias_dom#}</option>
+ <option value="{$melix}@{#globals.mail.alias_dom2#}" {if
+ $val eq $melix|cat:'@'|cat:#globals.mail.alias_dom2#}selected="selected"{/if}>
+ {$melix}@{#globals.mail.alias_dom2#}</option>
+ {/if}
+ {foreach from=$list_email_X item=email}
+ <option value="{$email.alias}@{#globals.mail.domain#}" {if
+ $val eq $email.alias|cat:'@'|cat:#globals.mail.domain#}selected="selected"{/if}>
+ {$email.alias}@{#globals.mail.domain#}</option>
+ <option value="{$email.alias}@{#globals.mail.domain2#}" {if
+ $val eq $email.alias|cat:'@'|cat:#globals.mail.domain2#}selected="selected"{/if}>
+ {$email.alias}@{#globals.mail.domain2#}</option>
+ {/foreach}
+ </optgroup>
+ {/if}
+ {if (($name neq "email") && ($list_email_redir|@count neq 0))}
+ <optgroup label="Redirections">
+ {foreach from=$list_email_redir item=email}
+ <option value="{$email}" {if $val eq $email}selected="selected"{/if}>{$email}</option>
+ {/foreach}
+ </optgroup>
+ {/if}
+ {if $list_email_pro|@count neq 0}
+ <optgroup label="Emails professionels">
+ {foreach from=$list_email_pro item=email}
+ <option value="{$email}" {if
+ $val eq $email}selected="selected"{/if}>{$email}</option>
+ {/foreach}
+ </optgroup>
+ {/if}
+ <optgroup label="Autres choix">
+ <option value="new@example.org" {if $error}selected="selected"{/if}>Utiliser une autre adresse email</option>
+ <option value="" {if (($val eq '') && (!$error))}selected="selected"{/if}>{if
+ $name neq "email"}Ne pas mettre d'adresse email{else} {/if}</option>
+ </optgroup>
+ </select>
+ {if $name eq "email_directory"}
+ <input type="checkbox" disabled="disabled" checked="checked"/>
+ {icon name="flag_orange" title="Visible sur l'annuaire"}
+ {elseif $name neq "email"}
+ <span class="flags">
+ {include file="include/flags.radio.tpl" name="`$jobpref`[email_pub]" val=$job.mail_pub}
+ </span>
+ {/if}
+ <br />
+ <span class="new" style="display: none">
+ <input type="text" maxlength="60" {if $error}class="error" value="{$val}"{/if} name="{if (($name neq "email_directory")
+ && ($name neq "email"))}jobs[{$i}][email_new]{else}{$name}_new{/if}"/>
+ </span>
+ <script type="text/javascript">//<![CDATA[
+ {literal}
+ $(function() {
+ $("select#combobox").change(function() {
+ $(".new").hide();
+ if ($("select#combobox").val() == "new@example.org") {
+ $(".new").show();
+ }
+ }).change();
+ });
+ {/literal}
+ // ]]></script>
+ </td>
+ {if $name eq "email"}<td></td>{/if}
+</tr>
+{if $name neq "email"}
+ <tr {if $class}class="{$class}"{/if} class="new" style="display: none">
+ <td colspan="2">
+ <p><small><strong><em>Attention :</em></strong> cette adresse email figurera dans
+ {if $name eq "email_directory"}l'annuaire papier{else}tes informations professionnelles
+ {/if} mais n'est pas ajoutée à la liste de tes redirections. Nous te conseillons fortement de
+ <strong><a href="emails/redirect">l'ajouter là</a></strong>, surtout
+ si tu n'en as plus de valide.</small></p>
+ </td>
+ </tr>
+{/if}
+
+{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
{if $smarty.session.auth ge AUTH_COOKIE}
<div class="photo">
<img src="photo/{if $c.inscrit}{$c.forlife}{else}{make_forlife nom=$c.nom prenom=$c.prenom promo=$c.promo}{/if}"
- alt="{$c.prenom} {$c.nom}" />
+ alt="{$c.name_display}" />
</div>
{/if}
<div class="nom">
{if $c.sexe}•{/if}
{if !$c.dcd && ($c.inscrit || $smarty.session.auth eq AUTH_PUBLIC)}<a href="profile/{if $c.inscrit}{$c.forlife}{else}{make_forlife nom=$c.nom prenom=$c.prenom promo=$c.promo}{/if}" class="popup2">{/if}
- {if $c.nom_usage}{$c.nom_usage} {$c.prenom}<br />({$c.nom}){else}{$c.nom} {$c.prenom}{/if}
+ <span {if $c.name_tooltip}class="hinted" title="{$c.name_tooltip}"{/if}>{$c.name_display}</span>
{if !$c.dcd && ($c.inscrit || $smarty.session.auth eq AUTH_PUBLIC)}</a>{/if}
</div>
- <div class="appli">
- {if $c.iso3166}
- <img src='images/flags/{$c.iso3166}.gif' alt='{$c.nat}' height='11' title='{$c.nat}' />
+ <div class="edu">
+ {if $c.iso3166_1}
+ <img src='images/flags/{$c.iso3166_1}.gif' alt='{$c.nat1}' height='11' title='{$c.nat1}' />
{/if}
- X {$c.promo}{if $c.app0text}, {applis_fmt type=$c.app0type text=$c.app0text url=$c.app0url}{*
- *}{/if}{if $c.app1text}, {applis_fmt type=$c.app1type text=$c.app1text url=$c.app1url}{/if}{*
- *}{if $c.dcd}, décédé{if $c.sexe}e{/if} le {$c.deces|date_format}{/if}
+ {if $c.iso3166_2}
+ <img src='images/flags/{$c.iso3166_2}.gif' alt='{$c.nat2}' height='11' title='{$c.nat2}' />
+ {/if}
+ {if $c.iso3166_3}
+ <img src='images/flags/{$c.iso3166_3}.gif' alt='{$c.nat3}' height='11' title='{$c.nat3}' />
+ {/if}
+ X {$c.promo}{if $c.eduname0}, {education_fmt name=$c.eduname0 url=$c.eduurl0 degree=$c.edudegree0
+ grad_year=$c.edugrad_year0 field=$c.edufield0 program=$c.eduprogram0 sexe=$c.sexe}{*
+ *}{/if}{if $c.eduname1}, {education_fmt name=$c.eduname1 url=$c.eduurl1 degree=$c.edudegree1
+ grad_year=$c.edugrad_year1 field=$c.edufield1 program=$c.eduprogram1 sexe=$c.sexe}{*
+ *}{/if}{if $c.eduname2}, {education_fmt name=$c.eduname2 url=$c.eduurl2 degree=$c.edudegree2
+ grad_year=$c.edugrad_year2 field=$c.edufield2 program=$c.eduprogram2 sexe=$c.sexe}{*
+ *}{/if}{if $c.eduname3}, {education_fmt name=$c.eduname3 url=$c.eduurl3 degree=$c.edudegree3
+ grad_year=$c.edugrad_year3 field=$c.edufield3 program=$c.eduprogram3 sexe=$c.sexe}{*
+ *}{/if}{if $c.dcd}, décédé{if $c.sexe}e{/if} le {$c.deces|date_format}{/if}
</div>
</div>
{foreach from=$set item=p}
<div class="contact">
<div class="nom">
- {$p.nom} {$p.prenom}
+ <span {if $p.name_tooltip}class="hinted" title="{$p.name_tooltip}"{/if}>{$p.name_display}</span>
</div>
- <div class="appli">
+ <div class="edu">
X{$p.promo}
</div>
<div class="bits" style="width: 40%;">
<tr>
<td class="center" style="vertical-align: bottom; padding-bottom: 15px">
<a href="{$mainsiteurl}profile/{$set[trombi.index_prev].forlife}" class="popup2">
- {$set[trombi.index_prev].prenom} {$set[trombi.index_prev].nom}{if $trombi_with_promo} ({$set[trombi.index_prev].promo}){/if}
+ <span {if $set[trombi.index_prev].name_tooltip}class="hinted" title="{$set[trombi.index_prev].name_tooltip}"{/if}>{$set[trombi.index_prev].name_display}</span>{if $trombi_with_promo} ({$set[trombi.index_prev].promo}){/if}
</a>
</td>
<td class="center" style="vertical-align: bottom; padding-bottom: 15px">
<a href="{$mainsiteurl}profile/{$set[trombi].forlife}" class="popup2">
- {$set[trombi].prenom} {$set[trombi].nom}{if $trombi_with_promo} ({$set[trombi].promo}){/if}
+ <span {if $set[trombi].name_tooltip}class="hinted" title="{$set[trombi].name_tooltip}"{/if}>{$set[trombi].name_display}</span>{if $trombi_with_promo} ({$set[trombi].promo}){/if}
</a>
</td>
<td class="center" style="vertical-align: bottom; padding-bottom: 15px">
{if $set[trombi.index_next]}
<a href="{$mainsiteurl}profile/{$set[trombi.index_next].forlife}" class="popup2">
- {$set[trombi.index_next].prenom} {$set[trombi.index_next].nom}{if $trombi_with_promo} ({$set[trombi.index_next].promo}){/if}
+ <span {if $set[trombi.index_next].name_tooltip}class="hinted" title="{$set[trombi.index_next].name_tooltip}"{/if}>{$set[trombi.index_next].name_display}</span>{if $trombi_with_promo} ({$set[trombi.index_next].promo}){/if}
</a>
{/if}
</td>
<tr style="margin-top: 0; padding-top: 0">
<td class="center" style="vertical-align: bottom">
<a href="{$mainsiteurl}profile/{$set[trombi].forlife}" class="popup2">
- {$set[trombi].prenom} {$set[trombi].nom}{if $trombi_with_promo} ({$set[trombi].promo}){/if}
+ <span {if $set[trombi].name_tooltip}class="hinted" title="{$set[trombi].name_tooltip}"{/if}>{$set[trombi].name_display}</span>{if $trombi_with_promo} ({$set[trombi].promo}){/if}
</a>
</td>
<td></td><td></td>
{/if}
<br />
<a href="{if $urlmainsite}{$urlmainsite}{/if}profile/{$p.forlife}" class="popup2">
- {$p.prenom} {$p.nom}{if $trombi_show_promo} ({$p.promo}){/if}
+ <span {if $p.name_tooltip}class="hinted" title="{$p.name_tooltip}"{/if}>{$p.name_display}</span>{if $trombi_show_promo} ({$p.promo}){/if}
</a>
</td>
{if $loop eq "3"}
{iterate from=$addr item=a}
<tr class="{cycle values='impair,pair'}">
<td>{$a.email}</td>
- <td>{if $a.alias}<a href="profile/{$a.alias}" class="popup2">{$a.alias}</a> {if $a.type eq user}(*){/if}{/if}</td>
+ <td>
+ {if $a.alias neq ''}<a href="profile/{$a.alias}" class="popup2">{$a.alias}</a>
+ {if $a.type eq user}(*){/if}{else}Email connu de l'AX{/if}
+ </td>
<td>{$a.date|date_format|default:'-'}</td>
<td>{$a.last|date_format|default:'-'}</td>
<td class='center'>{$a.nb|default:"-"}</td>
{if $adr.mail}checked="checked"{/if} />
<label for="{$adid}_mail">on peut m'y envoyer du courrier par la poste</label>
</div>
+ <div>
+ <label for="{$adpref}[comment]">Commentaire : </label>
+ <input type="text" size="35" maxlength="100" name="{$adpref}[comment]" id="{$adpref}_comment" value="{$adr.comment}" />
+ </div>
</div>
</td>
</tr>
<tr class="pair">
<td>
{foreach from=$adr.tel key=t item=tel}
- <div id="{"`$adid`_tel_`$t`"}" style="clear: both">
- {include file="profile/adresses.tel.tpl" t=$t tel=$tel}
- </div>
+ <div id="{"`$adid`_tel_`$t`"}" style="clear: both">
+ {include file="profile/phone.tpl" prefname="`$adpref`[tel]" prefid="`$adid`_tel" telid=$t tel=$tel}
+ </div>
{/foreach}
{if $adr.tel|@count eq 0}
- <div id="{"`$adid`_tel_0"}" style="clear: both">
- {include file="profile/adresses.tel.tpl" t=0 tel=0}
- </div>
+ <div id="{"`$adid`_tel_0"}" style="clear: both">
+ {include file="profile/phone.tpl" prefname="`$adpref`[tel]" prefid="`$adid`_tel" telid=0 tel=0}
+ </div>
{/if}
- <div id="{$adid}_add_tel" class="center" style="clear: both">
- <a href="javascript:addTel({$i})">
+ <div id="{$adid}_tel_add" class="center" style="clear: both; padding-top: 4px">
+ <a href="javascript:addTel('{$adid}_tel', '{$adpref}[tel]')">
{icon name=add title="Ajouter un numéro de téléphone"} Ajouter un numéro de téléphone
</a>
</div>
--- /dev/null
+{**************************************************************************}
+{* *}
+{* Copyright (C) 2003-2008 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 *}
+{* *}
+{**************************************************************************}
+
+{assign var=eduname value="edus[`$eduid`]"}
+<tr class="edu_{$eduid} {$class}">
+ <td colspan="2">
+ <a href="javascript:removeEdu('{$eduid}')">
+ {icon name=cross title="Supprimer cette formation"}
+ </a>
+ <select name="{$eduname}[eduid]" onchange="fillType(this.form['{$eduname}[degreeid]'], this.selectedIndex - 1);">
+ {education_options selected=$edu.eduid}
+ </select>
+ <input type="hidden" name="edu_{$eduid}_tmp" value="{$edu.degreeid}" />
+ <select name="{$eduname}[degreeid]">
+ <option value=""></option>
+ </select>
+ </td>
+</tr>
+<tr class="edu_{$eduid} {$class}">
+ <td>
+ <span class="titre">Domaine de formation :</span>
+ </td>
+ <td>
+ <select name="{$eduname}[fieldid]">
+ {foreach from=$edu_fields item=field}
+ <option value="{$field.id}" {if $field.id eq $edu.fieldid}selected="selected"{/if}>{$field.field}</option>
+ {/foreach}
+ </select>
+ </td>
+</tr>
+<tr class="edu_{$eduid} {$class}">
+ <td>
+ <span class="titre">Année d'obtention du diplôme :</span>
+ </td>
+ <td>
+ <input type="text" {if $edu.error}class="error"{/if} name="{$eduname}[grad_year]"
+ value="{$edu.grad_year}" size="4" maxlength="4" />
+ <small>(par exemple : 2008)</small>
+ </td>
+</tr>
+<tr class="edu_{$eduid} {$class}">
+ <td>
+ <span class="titre">Intitulé de la formation :</span>
+ </td>
+ <td>
+ <input type="text" name="{$eduname}[program]" value="{$edu.program}" size="30" maxlength="255" />
+ </td>
+</tr>
+
+{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
{* *}
{**************************************************************************}
-applisType = new Array({applis_type});
-applisTypeAll = new Array({applis_type_all});
+educationDegree = new Array({education_degree});
+educationDegreeAll = new Array({education_degree_all});
+educationDegreeName = new Array({education_degree_name});
{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
--- /dev/null
+{**************************************************************************}
+{* *}
+{* Copyright (C) 2003-2008 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 *}
+{* *}
+{**************************************************************************}
+
+<tr id="networking_{$i}">
+ <td colspan="2">
+ <div style="float: left; width: 200px;">
+ <span class="flags">
+ <label><input type="checkbox"
+ {if $nw.pub neq 'private'} checked="checked"{/if}
+ name="networking[{$i}][pub]"/>
+ {icon name="flag_green" title="site public"}</label>
+ </span>
+ <input type="hidden" name="networking[{$i}][type]" value="{$nw.type}"/>
+ <input type="hidden" name="networking[{$i}][name]" value="{$nw.name}"/>
+ <img src="profile/networking/{$nw.type}" alt="{$nw.name}" title="{$nw.name}" />
+ <span style="">{$nw.name}</span>
+ </div>
+ <div style="float: left">
+ <input type="text" name="networking[{$i}][address]" value="{$nw.address}"
+ {if $nw.error} class="error" {/if}
+ size="30"/>
+ <a href="javascript:removeNetworking({$i})">
+ {icon name=cross title="Supprimer cet élément"}
+ </a>
+ </div>
+ </td>
+</tr>
+
+{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
--- /dev/null
+{**************************************************************************}
+{* *}
+{* Copyright (C) 2003-2008 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 *}
+{* *}
+{**************************************************************************}
+
+<span class="flags">
+ <input type="checkbox"
+ {if $sn.pub neq 'private'} checked="checked"{/if}
+ {if $sn.pub eq 'always public'} disabled="disabled"{else} name="search_name[{$i}][pub]"{/if}/>
+ {icon name="flag_green" title="site public"}
+</span>
+<input type="text" name="search_name[{$i}][name]" value="{$sn.search_name}" size="30"/>
+<select name="search_name[{$i}][type]">
+ <option value="firstname"{if $sn.name_type eq 'firstname'} selected="selected"{/if}>Prénom</option>
+ <option value="lastname"{if $sn.name_type eq 'lastname'} selected="selected"{/if}>Nom de famille</option>
+ <option value="surname"{if $sn.name_type eq 'surname'} selected="selected"{/if}>Surnom</option>
+</select>
+{if $sn.pub neq 'always public'}
+ <a href="javascript:removeSearchName({$i})">
+ {icon name=cross title="Supprimer ce nom de recherche"}
+ </a>
+ {if $newsn}
+ <span style="display:none" id="search_name_{$i}_new">Nouveau</span>
+ {else}
+ <input type="hidden" name="search_name[{$i}][removed]" value=""/>
+ {/if}
+{else}
+ {icon name="null"}
+{/if}
</tr>
<tr>
<td>
- <span class="titre">Nom</span>
- <span class="comm"></span>
+ <span class="titre">Nom</span><br/>
</td>
<td>
- <input type='text' name='nom' {if $errors.nom}class="error"{/if} value="{$nom}" />
+ {$nom}
+ <input type='hidden' name='nom' {if $errors.nom}class="error"{/if} value="{$nom}" />
</td>
</tr>
<tr>
<td>
- <span class="titre">Prénom</span>
- <span class="comm"></span>
+ <span class="titre">Prénom</span><br/>
</td>
<td>
- <input type='text' name='prenom' {if $errors.prenom}class="error"{/if} value="{$prenom}" />
+ {$prenom}
+ <input type='hidden' name='prenom' {if $errors.prenom}class="error"{/if} value="{$prenom}" />
</td>
</tr>
<tr>
<td>
- <span class="titre">Promotion</span>
+ <span class="titre">Affichage de ton nom</span>
</td>
<td>
- <span class="nom">X{$promo}{if ($promo != $promo_sortie - 3)} - X{math equation="a - b" a=$promo_sortie b=3}{/if}</span>
- <span class="lien"><a href="profile/orange">modifier</a>{if ($promo_sortie -3 == $promo)} pour les oranges{/if}</span>
+ {if $tooltip_name}<span title="{$tooltip_name}" class="hint">{$display_name}</span>{else}{$display_name}{/if}
+ <a href="profile/edit#names_advanced" onclick="$('#names_advanced').show();$(this).hide();document.location = document.location + '#names_advanced';return false">
+ {icon name="page_edit" title="Plus de détail"}
+ </a>
</td>
</tr>
<tr>
<td>
- <span class="titre">Nom d'usage</span><br />
- {if $smarty.session.sexe}
- <span class="comm">(Notamment nom d'épouse)</span>
- {else}
- <span class="comm">(si différent de {$nom} seulement)</span>
- {/if}
+ <span class="titre">Promotion</span>
</td>
<td>
- <span class="nom">{$nom_usage|default:"Aucun"}</span>
- <span class="lien"><a href="profile/usage">modifier</a></span>
+ <span class="nom">X{$promo}{if ($promo != $promo_sortie - 3)} - X{math equation="a - b" a=$promo_sortie b=3}{/if}</span>
+ <span class="lien"><a href="profile/orange" {if ($promo_sortie -3 == $promo)} {popup text="pour les oranges"}{/if}>{icon name="page_edit" title="modifier"}</a></span>
</td>
</tr>
<tr>
- <td class="titre">Date de naissance</td>
+ <td>
+ <span class="titre">Date de naissance</span>
+ </td>
<td><input type="text" {if $errors.naissance}class="error"{/if} name="naissance" value="{$naissance}" /></td>
</tr>
<tr>
</td>
<td>
<select name="nationalite">
- {select_nat valeur=$nationalite}
+ {select_nat valeur=$nationalite pad=1}
</select>
+ <a href="javascript:addNationality();">{icon name=add title="Ajouter une nationalité"}</a>
</td>
</tr>
- <tr class="pair">
- <td>
- <span class="titre">Application</span><br />
- <span class="comm">(4e année de l'X)</span>
- </td>
+ <tr id="nationalite2" {if !$nationalite2}style="display: none"{/if}>
+ <td></td>
<td>
- <select name="appli1[id]" onchange="fillType(this.form['appli1[type]'], this.selectedIndex-1);">
- {applis_options selected=$appli1.id}
- </select>
- <br />
- <input type="hidden" name="appli1_tmp" value="{$appli1.type}" />
- <select name="appli1[type]">
- <option value=""></option>
+ <select name="nationalite2">
+ {select_nat valeur=$nationalite2 pad=1}
</select>
+ <a href="javascript:delNationality('2');">{icon name=cross title="Supprimer cette nationalité"}</a>
</td>
</tr>
- <tr class="pair">
- <td>
- <span class="titre">Post-application</span>
- </td>
+ <tr id="nationalite3" {if !$nationalite3}style="display: none"{/if}>
+ <td></td>
<td>
- <select name="appli2[id]" onchange="fillType(this.form['appli2[type]'], this.selectedIndex-1);">
- {applis_options selected=$appli2.id}
- </select>
- <br />
- <input type="hidden" name="appli2_tmp" value="{$appli2.type}" />
- <select name="appli2[type]">
- <option value=""></option>
+ <select name="nationalite3">
+ {select_nat valeur=$nationalite3 pad=1}
</select>
+ <a href="javascript:delNationality('3');">{icon name=cross title="Supprimer cette nationalité"}</a>
</td>
</tr>
- <tr class="pair">
+</table>
+
+<table class="bicol" style="margin-bottom: 1em" summary="Profil : Formations">
+ <tr>
+ <th colspan="2">
+ <div class="flags" style="float: left">
+ <input type="checkbox" disabled="disabled" checked="checked" />
+ {icon name="flag_green" title="site public"}
+ </div>
+ Formations
+ </th>
+ </tr>
+ {foreach from=$edus key=eduid item=edu}
+ {cycle values="impair, pair" assign=class}
+ {include file="profile/edu.tpl" eduid=$eduid edu=$edu edu_fields=$edu_fields class=$class}
+ {/foreach}
+ {if $edus|@count eq 0}
+ {cycle values="impair, pair" assign=class}
+ {include file="profile/edu.tpl" eduid=0 edu=0 class=$class}
+ {/if}
+ {cycle values="impair, pair" assign=class}
+ {assign var=eduaddid value=$edus|@count}
+ <tr id="edu_add" class="edu_{$eduaddid} {$class}">
+ <td colspan="2">
+ <div class="center" style="clear: both; padding-top: 4px;">
+ <a href="javascript:addEdu();">
+ {icon name=add title="Ajouter une formation"} Ajouter une formation
+ </a>
+ </div>
+ </td>
+ </tr>
+ <tr class="{$class}">
<td class="center" colspan="2">
<small>Si ta formation ne figure pas dans la liste,
<a href="mailto:support@{#globals.mail.domain#}">contacte-nous</a>.</small>
</tr>
</table>
+<table class="bicol" style="margin-bottom: 1em;display:none"
+ summary="Profil : Noms" id="names_advanced">
+ <tr>
+ <th colspan="2">
+ Noms
+ </th>
+ </tr>
+ <tr class="impair">
+ <td>
+ <span class="flags">
+ <input type="checkbox" checked="checked" disabled="disabled" />
+ {icon name="flag_green" title="site public"}
+ </span>
+ <span class="titre">Affichage courant de ton nom</span>
+ <a class="popup3" href="Xorg/Profil#name_displayed">{icon name="information" title="aide"}</a>
+ </td>
+ <td>
+ <input type="text" name="display_name" value="{$display_name}" size="40"/>
+ </td>
+ </tr>
+ <tr class="impair">
+ <td>
+ <span class="titre">explication</span>
+ <a class="popup3" href="Xorg/Profil#name_tooltip">{icon name="information" title="aide"}</a>
+ </td>
+ <td>
+ <input type="text" name="tooltip_name" value="{$tooltip_name}" size="40"/>
+ </td>
+ </tr>
+ <tr class="impair">
+ <td>
+ <span class="titre">ranger ce nom à</span>
+ <a class="popup3" href="Xorg/Profil#name_order">{icon name="information" title="aide"}</a>
+ </td>
+ <td>
+ <input type="text" name="sort_name" value="{$sort_name}" size="40"/>
+ </td>
+ </tr>
+ <tr class="impair">
+ <td>
+ <span class="flags">
+ <input type="checkbox" checked="checked" disabled="disabled" />
+ {icon name="flag_red" title="privé"}
+ </span>
+ <span class="titre">Comment on doit t'appeller</span>
+ <a class="popup3" href="Xorg/Profil#name_yourself">{icon name="information" title="aide"}</a>
+ </td>
+ <td>
+ <input type="text" name="yourself" value="{$yourself}" size="40"/>
+ </td>
+ </tr>
+ <tr class="impair">
+ <td colspan="2">
+ <span class="titre">Recherche</span><span class="smaller">, ta fiche apparaît quand on cherche un de ces noms</span>
+ <a class="popup3" href="Xorg/Profil#name_search">{icon name="information" title="aide"}</a>
+ {iterate from=$search_names item="sn"}
+ <div id="search_name_{$sn.sn_id}" style="padding:2px" class="center">
+ {include file="profile/general.searchname.tpl" i=$sn.sn_id sn=$sn}
+ </div>
+ {/iterate}
+ <div id="add_search_name" class="center" style="clear: both">
+ <a href="javascript:addSearchName()">
+ {icon name=add title="Ajouter un nom de recherche"} Ajouter un nom
+ </a>
+ </div>
+ </td>
+</table>
+
{if !$no_private_key}
<table class="bicol" style="margin-bottom: 1em"
summary="Profil : Informations générales">
</th>
</tr>
<tr>
- <td>
- <span class="flags">
- <input type="checkbox" checked="checked" disabled="disabled" />
- {icon name="flag_red" title="privé"}
- </span>
- <span class="titre">Surnom</span>
- </td>
- <td>
- <input type="text" size="35" maxlength="64"
- {if $errors.nick}class="error"{/if} name="nick" value="{$nick}" />
+ <td colspan="2">
+ <span class="titre">Téléphones personnels</span>
</td>
</tr>
<tr>
- <td>
- <span class="titre">Téléphone mobile</span>
- </td>
- <td>
- <input type="text" size="18" maxlength="18" name="mobile"
- {if $errors.mobile}class="error"{/if} value="{$mobile}" />
- <span class="flags">
- {include file="include/flags.radio.tpl" name="mobile_pub" val=$mobile_pub}
- </span>
+ <td colspan="2">
+ {foreach from=$tels key=telid item=tel}
+ <div id="tels_{$telid}" style="clear: both; padding-top: 4px; padding-bottom: 4px">
+ {include file="profile/phone.tpl" prefname='tels' prefid='tels' telid=$telid tel=$tel}
+ </div>
+ {/foreach}
+ {if $tels|@count eq 0}
+ <div id="tels_0" style="clear: both; padding-top: 4px; padding-bottom: 4px">
+ {include file="profile/phone.tpl" prefname='tels' preid='tels' telid=0 tel=0}
+ </div>
+ {/if}
+ <div id="tels_add" class="center" style="clear: both; padding-top: 4px;">
+ <a href="javascript:addTel('tels', 'tels');">
+ {icon name=add title="Ajouter un téléphone"} Ajouter un téléphone
+ </a>
+ </div>
</td>
</tr>
+ {if $email_error}
+ {include file="include/emails.combobox.tpl" name="email_directory" val=$email_directory_error error=$email_error}
+ {else}{include file="include/emails.combobox.tpl" name="email_directory" val=$email_directory error=$email_error}{/if}
<tr>
- <td>
- <span class="flags">
- <label><input type="checkbox" name="web_pub" {if $web_pub eq 'public'}checked="checked"{/if} />
- {icon name="flag_green" title="site public"}</label>
- </span>
- <span class="titre">Page web Perso</span>
+ <td colspan="2">
+ <span class="titre">Messageries, networking et sites web</span>
</td>
- <td>
- <input type="text" size="35" maxlength="95" name="web"
- {if $errors.web}class="error"{/if} value="{$web}" />
+ </tr>
+ {foreach from=$networking item=network key=id}
+ {include file="profile/general.networking.tpl" nw=$network i=$id}
+ {/foreach}
+ <tr id="networking">
+ <script type="text/javascript">//<![CDATA[
+ var nw_list = new Array();
+ {foreach from=$network_list item=network}
+ nw_list['{$network.name}'] = {$network.type};
+ {/foreach}
+ //]]></script>
+ <td colspan="2">
+ <div id="nw_add" class="center">
+ <a href="javascript:addNetworking();">
+ {icon name=add title="Ajouter une adresse"} Ajouter une adresse
+ </a>
+ </div>
</td>
</tr>
+<!-- <tr id="networking">
+ <td colspan="2">
+ <div style="float: left; width: 200px;">
+ <span class="titre" style="margin-left:1em;">Type à ajouter</span>
+ </div>
+ <div style="float: left;">
+ <div id="nw_type_ac" style="background-color: white; border: solid 1px black; position: absolute; width: 208px; display: none">TEST</div>
+ <input type="text" size="30" id="nw_type" name="nw_type" onkeyup="updateNetworking()">
+ <span id="nw_add" style="display: none">
+ <a href="javascript:addNetworking();">{icon name=add title="Ajouter cette adresse"}</a>
+ </span>
+ </div>
+ </td>
+ </tr>-->
<tr class="pair">
<td>
<div>
<label><input type="checkbox" name="freetext_pub" {if $freetext_pub eq 'public'}checked="checked"{/if} />
{icon name="flag_green" title="site public"}</label>
</span>
- <span class="titre">Complément libre</span><br />
- <span class="comm">Commentaire ? ICQ ? etc...</span>
+ <span class="titre">Commentaire</span>
</div>
<div class="smaller" style="margin-top: 30px">
<a href="wiki_help/notitle" class="popup3">
<a href="mailto:support@{#globals.mail.domain#}">contacte-nous</a>.</small>
</td>
</tr>
- <tr class="pair">
- <td colspan="2">
- <span class="titre">Email professionnel :</span>
- <input type="text" size="30" maxlength="60" {if $job.email_error}class="error"{/if}
- name="{$jobpref}[email]" value="{$job.email}" />
- <span class="flags">
- {include file="include/flags.radio.tpl" name="`$jobpref`[email_pub]" val=$job.mail_pub}
- </span>
- </td>
- </tr>
+ {include file="include/emails.combobox.tpl" name=$jobpref|cat:'[email]' val=$job.email class="pair" i=$i error=$job.email_error}
<tr class="pair">
<td colspan="2">
<div style="float: left">
{include file="geoloc/form.address.tpl" name="`$jobpref`[adr]" id="`$jobid`_adr" adr=$job.adr}
</div>
</div>
- <div style="float: right; width: 50%">
- <div class="titre">Téléphone</div>
- <div class="flags">
- {include file="include/flags.radio.tpl" name="`$jobpref`[tel_pub]" val=$job.tel_pub}
+ </td>
+ </tr>
+ <tr class="pair">
+ <td colspan="2">
+ {foreach from=$job.tel key=t item=tel}
+ <div id="{"`$jobid`_tel_`$t`"}" style="clear: both">
+ {include file="profile/phone.tpl" prefname="`$jobpref`[tel]" prefid="`$jobid`_tel" telid=$t tel=$tel}
+ </div>
+ {/foreach}
+ {if $job.tel|@count eq 0}
+ <div id="{"`$jobid`_tel_0"}" style="clear: both">
+ {include file="profile/phone.tpl" prefname="`$jobpref`[tel]" prefid="`$jobid`_tel" telid=0 tel=0}
</div>
- <table style="clear: both">
- <tr>
- <td>Bureau :</td>
- <td>
- <input type="text" size="18" maxlength="18" {if $job.tel_error}class="error"{/if}
- name="{$jobpref}[tel]" value="{$job.tel}" />
- </td>
- </tr>
- <tr>
- <td>Fax :</td>
- <td>
- <input type="text" size="18" maxlength="18" {if $job.fax_error}class="error"{/if}
- name="{$jobpref}[fax]" value="{$job.fax}" /></td>
- </tr>
- <tr>
- <td>Mobile :</td>
- <td>
- <input type="text" size="18" maxlength="18" {if $job.mobile_error}class="error"{/if}
- name="{$jobpref}[mobile]" value="{$job.mobile}" />
- </td>
- </tr>
- </table>
+ {/if}
+ <div id="{$jobid}_tel_add" class="center" style="clear: both; padding-top: 4px;">
+ <a href="javascript:addTel('{$jobid}_tel', '{$jobpref}[tel]')">
+ {icon name=add title="Ajouter un numéro de téléphone"} Ajouter un numéro de téléphone
+ </a>
</div>
</td>
</tr>
<a href="javascript:addJob()">
{icon name=add title="Ajouter un emploi"} Ajouter un emploi
</a>
+ <br/><br/>
</div>
+<table class="bicol" style="margin-bottom: 1em" summary="Corps">
+ <tr>
+ <th colspan="2">
+ <div class="flags" style="float: left; text-align: left">
+ {include file="include/flags.radio.tpl" name="corps[pub]" val=$corps.pub}
+ </div>
+ Corps
+ </th>
+ </tr>
+ <tr>
+ <td class="titre">Corps d'origine</td>
+ <td>
+ <select name="corps[original]">
+ {foreach from=$original_corps item=o_corps}
+ <option value="{$o_corps.id}" {if $o_corps.id eq $corps.original}selected="selected"{/if}>{$o_corps.name}</option>
+ {/foreach}
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td class="titre">Corps actuel</td>
+ <td>
+ <select name="corps[current]">
+ {foreach from=$current_corps item=c_corps}
+ <option value="{$c_corps.id}" {if $c_corps.id eq $corps.current}selected="selected"{/if}>{$c_corps.name}</option>
+ {/foreach}
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td class="titre">Grade</td>
+ <td>
+ <select name="corps[rank]">
+ {foreach from=$corps_rank item=rank}
+ <option value="{$rank.id}" {if $rank.id eq $corps.rank}selected="selected"{/if}>{$rank.name}</option>
+ {/foreach}
+ </select>
+ </td>
+ </tr>
+</table>
+
<table class="bicol" summary="CV" style="margin-top: 1.5em">
<tr>
<th>
--- /dev/null
+{**************************************************************************}
+{* *}
+{* Copyright (C) 2003-2008 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 *}
+{* *}
+{**************************************************************************}
+
+{assign var=telpref value="`$prefname`[`$telid`]"}
+{assign var=id value="`$prefid`_`$telid`"}
+<div class="titre" style="float: left; width: 2.5em">N°{$telid+1}</div>
+<div style="float: left;">
+ <select name="{$telpref}[type]">
+ <option value="fixed"{if $tel.type eq 'fixed'} selected="selected"{/if}>Fixe</option>
+ <option value="mobile"{if $tel.type eq 'mobile'} selected="selected"{/if}>Mobile</option>
+ <option value="fax"{if $tel.type eq 'fax'} selected="selected"{/if}>Fax</option>
+ </select>
+ <input type="hidden" name="{$telpref}[removed]" value="0"/>
+ <input type="text" size="19" maxlength="28" name="{$telpref}[tel]" {if $tel.error}class="error"{/if} value="{$tel.tel}" />
+ <a href="javascript:removeTel('{$id}')">
+ {icon name=cross title="Supprimer ce numéro de téléphone"}
+ </a>
+ <a id="{$id}_addComment" href="javascript:addPhoneComment('{$id}', '{$telpref}')" {if $tel.comment neq ''}style="display:none" {/if}>
+ {icon name=comments title="Ajouter un commentaire"}
+ </a>
+</div>
+<div style="float: right" class="flags">
+ {include file="include/flags.radio.tpl" name="`$telpref`[pub]" val=$tel.pub}
+</div>
+<div id="{$id}_comment" style="clear: both;{if $tel.comment eq ''} display:none{/if}">
+ Commentaire :
+ <input type="text" size="45" maxlength="80" name="{$telpref}[comment]" {if $tel.error}class="error"{/if} value="{$tel.comment}"/>
+ <a href="javascript:removePhoneComment('{$id}', '{$telpref}')">
+ {icon name=cross title="Supprimer le commentaire"}
+ </a>
+</div>
+{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
{if $x.gpxs_join}<div><em class="intitule">Groupe{if count($x.gpxs) > 1}s{/if} et institution{if count($x.gpxs) > 1}s{/if} X : </em>
<span><br/>{$x.gpxs_join|smarty:nodefaults}</span></div>{/if}
{/if}
+ {if $x.networking}
+ <h2>Sur le web...</h2>
+ {foreach from=$x.networking item=network}
+ <img style="width: auto; padding: 0" src="profile/networking/{$network.type}" alt="{$network.name}" title="{$network.name}"/>
+ {if $network.filter == 'web'}
+ <a href="{$network.address}">{$network.address}</a>
+ {elseif $network.link != ''}
+ <a href="{$network.link}">{$network.address}</a>
+ {else}
+ {$network.address}
+ {/if}
+ <br/>
+ {/foreach}
+ {/if}
{if $x.freetext}
<h2>Commentaires :</h2>
<span>{$x.freetext|miniwiki|smarty:nodefaults}</span>
<div id="fiche_identite" class="part">
<div class="civilite">
{if $x.sexe}•{/if}
- {$x.prenom} {if $x.nom_usage eq ""}{$x.nom}{else}{$x.nom_usage} ({$x.nom}){/if}
+ <span {if $x.name_tooltip neq ""}class="hinted" title="{$x.name_tooltip}"{/if}>{$x.name_display}</span>
{if $logged}
{if $x.nickname} (alias {$x.nickname}){/if}
{/if}
- {if $x.web} <a href="{$x.web}">{icon name="world_go" title="Site Web"}</a>{/if}
{if $logged}
{if !$x.dcd}<a href="vcard/{$x.forlife}.vcf">{*
*}{icon name=vcard title="Afficher la carte de visite"}</a>{/if}
le {$x.date|date_format}
</div>
{/if}
- {if $logged || $x.mobile}
+ {if $logged || $x.tels}
<div class="contact">
{if $logged}
<div class='email'>
{/if}
</div>
{/if}
- {if $x.mobile}
- <div class="mob">
- <em class="intitule">Mobile : </em>{$x.mobile}
- </div>
+ {if $x.tels}
+ {display_phones tels=$x.tels}
{/if}
<div class='spacer'></div>
</div>
{/if}
<div class='formation'>
- {if $x.iso3166}
- <img src='images/flags/{$x.iso3166}.gif' alt='{$x.nationalite}' height='11' title='{$x.nationalite}' />
+ {if $x.iso3166_1}
+ <img src='images/flags/{$x.iso3166_1}.gif' alt='{$x.nationalite}' height='11' title='{$x.nationalite}' />
+ {/if}
+ {if $x.iso3166_2}
+ <img src='images/flags/{$x.iso3166_2}.gif' alt='{$x.nationalite2}' height='11' title='{$x.nationalite2}' />
+ {/if}
+ {if $x.iso3166_3}
+ <img src='images/flags/{$x.iso3166_3}.gif' alt='{$x.nationalite3}' height='11' title='{$x.nationalite3}' />
{/if}
X {$x.promo}
{if ($x.promo_sortie-3 > $x.promo)}
- X {math equation="a-b" a=$x.promo_sortie b=3}
{/if}
- {if $x.applis_join}
- - Formation : {$x.applis_join|smarty:nodefaults}
+ {if $x.education}
+ - Formation : {$x.education|smarty:nodefaults}
{/if}
{if $logged && $x.is_referent}
[<a href="referent/{$x.forlife}" class='popup2'>Ma fiche référent</a>]
{/if}
+ {if $x.corps}
+ <br />
+ {$x.corps|smarty:nodefaults}
+ {/if}
</div>
</div>
{if $x.adr}
if (schoolId) {
$(".autocomplete[@name='schoolTxt']").addClass('hidden_valid');
-
- $("[@name='diploma']").parent().load(baseurl + 'list/diploma/', { school:schoolId }, function() {
- if ($("select[@name='diploma']").children("option").size() > 1) {
- $("select[@name='diploma']").attr('value', '{/literal}{$smarty.request.diploma}{literal}');
- } else {
- $("select[@name='diploma']").attr('value', '');
- }
- });
} else {
$(".autocomplete[@name='schoolTxt']").removeClass('hidden_valid');
-
- $("select[@name='diploma']").attr('value', '');
}
+
+ $("[@name='diploma']").parent().load(baseurl + 'list/diploma/', { school:schoolId }, function() {
+ $("select[@name='diploma']").attr('value', '{/literal}{$smarty.request.diploma}{literal}');
+ });
}
// when choosing autocomplete from list, must validate
<td>Commentaire contient</td>
<td><input type="text" name="free" size="32" value="{$smarty.request.free}" /></td>
</tr>
+ <tr>
+ <td>Numéro de téléphone</td>
+ <td><input type="text" name="phone_number" size="32" value="{$smarty.request.phone_number}"/></td>
+ </tr>
+ <tr>
+ <td style="vertical-align: middle">
+ <span>Networking et sites webs</span>
+ </td>
+ <td>
+ <table>
+ <tr>
+ <td style="padding-left: 0px;">
+ <input type="text" name="networking_address" size="32" value="{$smarty.request.networking_address}" />
+ </td>
+ <td>
+ <input type="text" name="networking_typeTxt" class="autocomplete" size="10" value="{$smarty.request.networking_typeTxt}" />
+ <input name="networking_type" class="autocompleteTarget" type="hidden" value="{$smarty.request.networking_type}"/>
+ <a href="networking_type" class="autocompleteToSelect">{icon name="table" title="Tous les types d'adresse"}</a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
{if $smarty.session.auth ge AUTH_COOKIE}
<tr>
<td colspan="2">
<select name="diploma">
<option value=""> - </option>
{section name=diploma loop=$choix_diplomas}
-<option value="{$choix_diplomas[diploma]}">
- {$choix_diplomas[diploma]}
+{assign var=i value=$choix_diplomas[diploma]}
+{assign var=id value=$i-1}
+<option value="{$i}">
+ {$name_diplomas[$id]}
</option>
{/section}
</select>
--- /dev/null
+set @n = 19200001;
+
+INSERT INTO auth_user_md5 (matricule, matricule_ax, promo, promo_sortie, nom_ini, prenom_ini, perms, nom, prenom)
+ SELECT @n := @n + 1, id_ancien, promotion_etude, promotion_etude + 3, CONCAT(partic_patro, Nom_patronymique), prenom,
+ 'pending', CONCAT(partic_patro, Nom_patronymique), prenom
+ FROM fusionax_anciens
+ WHERE promotion_etude = 1920;
+
+-- vim:set syntax=mysql:
--- /dev/null
+CREATE OR REPLACE ALGORITHM=MERGE VIEW fusionax_xorg_anciens AS
+ SELECT u.user_id, u.matricule_ax, u.promo,
+ n.display AS display_name, n.sort AS sort_name,
+ u.nom, u.prenom
+ FROM auth_user_md5 AS u
+ INNER JOIN profile_names_display AS n ON (n.user_id = u.user_id);
+
+-- vim:set syntax=mysql:
--- /dev/null
+INSERT INTO profile_directory (uid, email_directory)
+ SELECT user_id, Mel_usage
+ FROM fusionax_anciens AS ax
+ INNER JOIN auth_user_md5 AS u ON (ax.id_ancien = u.matricule_ax)
+ WHERE Mel_publiable != '0' AND Mel_usage != '';
+
+INSERT IGNORE INTO register_marketing (uid, email, type)
+ SELECT user_id, Mel_usage, 'ax'
+ FROM fusionax_anciens AS ax
+ INNER JOIN auth_user_md5 AS u ON (ax.id_ancien = u.matricule_ax)
+ LEFT JOIN emails AS e ON (e.uid = u.user_id AND e.flags = 'active')
+ WHERE Mel_usage != '' AND
+ Mel_usage NOT LIKE '%@polytechnique.edu' AND
+ Mel_usage NOT LIKE '%@polytechnique.org' AND
+ Mel_usage NOT LIKE '%@m4x.org' AND
+ Mel_usage NOT LIKE '%@melix.%' AND
+ e.email IS NULL;
+
+-- vim:set syntax=mysql:
--- /dev/null
+CREATE TABLE IF NOT EXISTS alumni_data (
+ uid INT(11) NOT NULL,
+ matricule_ax CHAR(8) UNSIGNED NOT NULL,
+ login_ax VARCHAR(15) NOT NULL,
+ passwd_ax INT(11) UNSIGNED DEFAULT NULL,
+ promo_type ENUM('', 'A', 'B', 'C', 'N', 'S') NOT NULL,
+ membership_type ENUM('', '*', 'F', 'FB', 'P', 'PB', 'T', 'TB', 'TA') NOT NULL,
+ salutation ENUM('', '.', 'M', 'MME', 'MLLE') NOT NULL,
+ last_dues_paid_year INT(4) UNSIGNED NOT NULL,
+ represents ENUM('', 'K', 'DE') NOT NULL,
+ checked TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
+ PRIMARY KEY (uid)
+) CHARSET=utf8;
+
+
+INSERT INTO alumni_data (uid, matricule_ax, login_ax, passwd_ax, promo_type, membership_type,
+ salutation, last_dues_paid_year, represents, checked)
+ SELECT u.user_id, u.matricule_ax, f.Login, f.Password, f.Groupe_promo,
+ f.Type_membre, f.Civilite, f.annee_dernCot, f.Representant, 0
+ FROM fusionax_anciens AS f
+ INNER JOIN auth_user_md5 AS u ON (f.id_ancien = u.matricule_ax);
+
+-- vim:set syntax=mysql:
--- /dev/null
+INSERT IGNORE INTO profile_corps_rank_enum (abbreviation, name)
+ VALUES (" ", "Aucun"),
+ ("A", "Amiral"),
+ ("A2", "Amiral 2e Son"),
+ ("ADC", "Adm.Civil"),
+ ("ADC2", "Adm.Civil retr."),
+ ("ADC3", "Adm.Civil cg."),
+ ("ADC4", "Adm.Civil dém."),
+ ("ADC5", "Adm.Civil dét."),
+ ("ADC6", "Adm.Civil dis."),
+ ("ADC7", "Adm.Civil (H.C)"),
+ ("ADC8", "Adm.Civil h.cl."),
+ ("ADHC", "Adm. h.cl.INSEE"),
+ ("ADHC2", "Adm.h.cl.INSEE retr."),
+ ("ADHC3", "Adm.h.cl.INSEE cg."),
+ ("ADHC4", "Adm.h.cl.INSEE dém."),
+ ("ADHC5", "Adm.h.cl.INSEE dét."),
+ ("ADHC6", "Adm.h.cl.INSEE dis."),
+ ("ADHC7", "Adm.h.cl.INSEE (H.C.)"),
+ ("ADIN", "Adm.INSEE"),
+ ("ADIN2", "Adm.INSEE retr."),
+ ("ADIN3", "Adm.INSEE cg"),
+ ("ADIN4", "Adm.INSEE dém."),
+ ("ADIN5", "Adm.INSEE dét."),
+ ("ADIN6", "Adm.INSEE dis."),
+ ("ADIN7", "Adm.INSEE (H.C.)"),
+ ("CA", "Contre-Amiral"),
+ ("CA2", "Contre-Amiral 2e Son"),
+ ("CAA", "Contrôleur des Armées"),
+ ("CB", "Chef de bataillon"),
+ ("CB2", "Chef de bataillon retr."),
+ ("CB8", "Chef de bataillon rés."),
+ ("CBH", "Chef de bataillon"),
+ ("CC", "Capitaine de Corvette"),
+ ("CC2", "Capitaine de Corvette retr."),
+ ("CC8", "Capitaine de Corvette rés."),
+ ("CCA", "Commiss. Contr. Ass."),
+ ("CCA2", "Commiss. Contr. Ass. retr."),
+ ("CCA3", "Commiss. Contr. Ass. cg."),
+ ("CCA4", "Commiss. Contr. Ass. dém."),
+ ("CCA5", "Commiss. Contr. Ass. dét."),
+ ("CCA6", "Commiss. Contr. Ass. dis."),
+ ("CCA7", "Commiss. Contr. Ass. (HC)"),
+ ("CCCA", "Commiss. Contr. Ch. Ass."),
+ ("CCCA2", "Commiss. Contr. Ch. Ass. retr."),
+ ("CCCA3", "Commiss. Contr. Ch. Ass. cg."),
+ ("CCCA4", "Commiss. Contr. Ch. Ass. dém."),
+ ("CCCA5", "Commiss. Contr. Ch. Ass. dét."),
+ ("CCCA6", "Commiss. Contr. Ch. Ass. dis."),
+ ("CCCA7", "Commiss. Contr. Ch. Ass. (HC)"),
+ ("CCGA", "Commiss. Contr. Gén. Ass."),
+ ("CCGA2", "Commiss. Contr. Gén. Ass.retr."),
+ ("CCGA3", "Commiss. Contr. Gén. Ass. cg."),
+ ("CCGA4", "Commiss. Contr. Gén. Ass. dém."),
+ ("CCGA5", "Commiss. Contr. Gén. Ass. dét."),
+ ("CCGA6", "Commiss. Contr. Gén. Ass. dis."),
+ ("CCGA7", "Commiss. Contr. Gén. Ass. (HC)"),
+ ("CCH", "Capitaine de Corvette hon."),
+ ("Cdt", "Commandant"),
+ ("Cdt2", "Commandant retr."),
+ ("Cdt5", "Commandant dém."),
+ ("Cdt8", "Commandant de rés."),
+ ("CE", "Chef d'Escadron"),
+ ("CE2", "Chef d'Escadron retr."),
+ ("CE3", "Chef d'Escadrons"),
+ ("CE4", "Chef d'Escadrons"),
+ ("CE5", "Chef d'Escadrons de rés."),
+ ("CF", "Capitaine de Frégate"),
+ ("CF2", "Capitaine de Frégate"),
+ ("CF9", "Capitaine de Frégate (CR)"),
+ ("CFC1", "Ing.ch.SNCF"),
+ ("CFC11", "Ing.ch.h.cl.SNCF"),
+ ("CFC2", "Ing.ch.retr.SNCF"),
+ ("CFC3", "Ing.ch.hon.SNCF"),
+ ("CFC31", "Ing.ch.h.cl.SNCF"),
+ ("CFC4", "Ing.ch.H.C.hon.SNCF"),
+ ("CFC5", "Ing.ch.h.cl.hon.SNCF"),
+ ("CFC6", "Ing.ch.h.cl.retr.SNCF"),
+ ("CFD1", "Direct.Gén.SNCF"),
+ ("CFD2", "Direct.Gén.hon.SNCF"),
+ ("CFD3", "Direct.SNCF"),
+ ("CFD4", "Direct.hon.SNCF"),
+ ("CFD5", "Direct.retr.SNCF"),
+ ("CFD6", "DGA hon.SNCF"),
+ ("CFG1", "Ing.gén.SNCF"),
+ ("CFG2", "Ing.gén.retr.SNCF"),
+ ("CFG3", "Ing.gén.hon.SNCF"),
+ ("CFH", "Capitaine de Frégate hon."),
+ ("CFP1", "Ing.pp.SNCF"),
+ ("CFP2", "Ing.pp.retr.SNCF"),
+ ("CFP3", "Ing.pp.hon.SNCF"),
+ ("CFP4", "Ing.pp.H.C.hon.SNCF"),
+ ("CFP5", "Ing.pp.h.cl.hon.SNCF"),
+ ("CFP6", "Ing.pp.h.cl.SNCF"),
+ ("CGA", "Contrôleur Général des Armées"),
+ ("CGA2", "Contrôl.Gén.des Armées 2e Son"),
+ ("Cne", "Capitaine"),
+ ("Cne2", "Capitaine retr."),
+ ("Cne5", "Capitaine dém."),
+ ("Cne6", "Capitaine dis."),
+ ("Cne8", "Capitaine de rés."),
+ ("Col", "Colonel"),
+ ("Col2", "Colonel retr."),
+ ("Col3", "Colonel Brth retr."),
+ ("Col4", "Colonel (Air) retr."),
+ ("Col5", "Colonel hon.(Air)"),
+ ("Colh", "Colonel hon."),
+ ("COM1C", "Commiss.1e cl.Marine"),
+ ("COM2", "Commiss.Marine retr."),
+ ("COM2C", "Commiss.2e cl.Marine"),
+ ("COM4", "Commiss.Marine dém."),
+ ("COM8", "Commiss.Marine rés."),
+ ("COMC", "Commiss.ch.Marine"),
+ ("COMC1", "Commiss.ch.1e cl.Marine"),
+ ("COMC2", "Commiss.ch.Marine retr."),
+ ("COMC8", "Commiss.ch.Marine rés."),
+ ("COMD", "Commiss.Cdt"),
+ ("COMG", "Comm.Gén.Mar.2e Son"),
+ ("COMG1", "Comm.Gén.1e cl.Mar.2e Son"),
+ ("COMG2", "Comm.Gén.2e cl.Mar.2e Son"),
+ ("COMGP", "Commiss.gén.aux prix hon."),
+ ("COMP", "Commiss.pp.Marine"),
+ ("COMP2", "Commiss.pp Marine retr."),
+ ("COMP8", "Commiss.pp.Marine rés."),
+ ("CONE", "Contrôl.Gén Eco.et Financ."),
+ ("CONE2", "Contrôl.Gén Eco.et Financ.ret"),
+ ("CONE3", "Contrôl.Gén Eco.et Financ.cg."),
+ ("CONE4", "Contrôl.Gén Eco.et Financ.dém."),
+ ("CONE5", "Contrôl.Gén Eco.et Financ.dét."),
+ ("CONE6", "Contrôl.Gén Eco.et Financ. dis"),
+ ("CONE7", "Contrôl.Gén Eco.et Financ.H.C."),
+ ("CONEH", "Contrôl.Gén Eco.et Financ.hon."),
+ ("CV", "Capitaine de Vaisseau"),
+ ("CV2", "Capitaine de Vaisseau retr."),
+ ("CV9", "Capitaine de Vaisseau (CR)"),
+ ("CVH", "Capitaine de Vaisseau hon."),
+ ("DRT", "Direct.rég.Téléc."),
+ ("DRT2", "Direct.rég.Téléc. retr."),
+ ("DRT3", "Direct.rég.Téléc. cg."),
+ ("DRT4", "Direct.rég.Téléc. dém."),
+ ("DRT5", "Direct.rég.Téléc. dét."),
+ ("DRT6", "Direct.rég.Téléc. dis."),
+ ("DRT7", "Direct.rég.Téléc. (H.C.)"),
+ ("DRT8", "Direct.rég.Téléc. hon."),
+ ("EF2", "Ing.EDF retr."),
+ ("EF3", "Ing.EDF cg."),
+ ("EF4", "Ing.EDF dém."),
+ ("EF5", "Ing.EDF dét."),
+ ("EF6", "Ing.EDF dis."),
+ ("EFC2", "Ing.ch.EDF retr."),
+ ("EFC3", "Ing.ch.EDF cg."),
+ ("EFC4", "Ing.ch.EDF dém."),
+ ("EFC5", "Ing.ch.EDF dét."),
+ ("EFC6", "Ing.ch.EDF dis."),
+ ("EFC7", "Ing.ch.EDF (HC)"),
+ ("EFCO1", "Contrôl.gén.hon.EDF"),
+ ("EFD", "Direct. EDF"),
+ ("EFD2", "Direct.hon.EDF"),
+ ("EFDG", "Direct.Gén. EDF"),
+ ("EFDG2", "Direct.Gén.hon.EDF"),
+ ("EFG2", "Ing.gén.EDF retr."),
+ ("EFGH", "Insp.gén.hon.EDF"),
+ ("EFP2", "Ing.pp.EDF retr."),
+ ("EFP3", "Ing.pp.EDF cg."),
+ ("EFP4", "Ing.pp.EDF dém."),
+ ("EFP5", "Ing.pp.EDF dét."),
+ ("EFP6", "Ing.pp.EDF dis."),
+ ("EFP7", "Ing.pp.EDF (HC)"),
+ ("EFS", "Insp.gén.EDF"),
+ ("EFS2", "Insp.gén.EDF retr."),
+ ("EFS3", "Insp.gén.hon. EDF"),
+ ("ESC", "Ing.ch.des Essences"),
+ ("ESC10", "Ing.ch. 1e cl.des Essence CR"),
+ ("ESC2", "Ing.ch.des Essences retr."),
+ ("ESC3", "Ing.ch.des Essences cg."),
+ ("ESC4", "Ing.ch.des Essences dém."),
+ ("ESC5", "Ing.ch.des Essences dét."),
+ ("ESC6", "Ing.ch.des Essences dis."),
+ ("ESC7", "Ing.ch.des Essences (H.C.)"),
+ ("ESC9", "Ing.ch.des Essences CR"),
+ ("ESG", "Ing.gén.des Essences"),
+ ("ESG2", "Ing.gén.des Essences retr."),
+ ("ESG3", "Ing.gén.des Essences cg."),
+ ("ESG4", "Ing.gén.des Essences dém."),
+ ("ESG5", "Ing.gén.des Essences dét."),
+ ("ESG6", "Ing.gén.des Essences dis."),
+ ("ESG7", "Ing.gén.des Essences (H.C.)"),
+ ("ESI", "Ing.des Essences"),
+ ("ESI2", "Ing.des Eseences retr."),
+ ("ESI3", "Ing.des Essences cg."),
+ ("ESI4", "Ing.des Essences dém."),
+ ("ESI5", "Ing.des Essences dét."),
+ ("ESI6", "Ing.des Essences dis."),
+ ("ESI7", "Ing.des Essences (H.C.)"),
+ ("EV", "Enseigne de Vaisseau"),
+ ("GA", "Général d'Armée"),
+ ("GA2", "Général d'Armée 2e Son"),
+ ("GAE", "Général d'Armée Aér."),
+ ("GAE2", "Général d'Armée Aér.2e Son"),
+ ("GB", "Général de Brigade"),
+ ("GB2", "Général de Brigade 2e Son"),
+ ("GBAE", "Général de Brigade Aér."),
+ ("GBAE2", "Général de Brig.Aér.2e Son"),
+ ("GCA", "Général de C.A."),
+ ("GCA2", "Général de C.A. 2e Son"),
+ ("GCAE", "Général de C.A.Aér."),
+ ("GCAE2", "Général de C.A.Aér. 2e Son"),
+ ("GD", "Général de Division"),
+ ("GD2", "Général de Division 2e Son"),
+ ("GDAE", "Général de Division Aér."),
+ ("GDAE2", "Général de Div.Aér. 2e Son"),
+ ("GDFC2", "Contrôleur gén.GDF retr."),
+ ("GDFD3", "Direct.hon.GDF"),
+ ("GDFI", "Insp.gén.hon.GDF"),
+ ("GM2", "Ing. Arm. (GM) retr."),
+ ("GM3", "Ing. Arm. (GM) cg."),
+ ("GM4", "Ing. Arm. (GM) dém."),
+ ("GM7", "Ing. Arm. (GM) H.C"),
+ ("GM8", "Ing. Arm. (GM) rés."),
+ ("GM9", "Ing. Arm. (GM) CR"),
+ ("GMC", "Ing.ch.Arm.(GM)"),
+ ("GMC1", "Ing.ch.Arm (GM)"),
+ ("GMC2", "Ing.ch.Arm.(GM) retr."),
+ ("GMC3", "Ing.ch.Arm.(GM) cg."),
+ ("GMC4", "Ing.ch.Arm.(GM) dém."),
+ ("GMC7", "Ing.ch.Arm.(GM) H.C"),
+ ("GMC8", "Ing.ch.Arm.(GM) rés."),
+ ("GMC9", "Ing.ch.Arm.(GM) CR"),
+ ("GMG", "Ing.Gén.Arm.(GM)"),
+ ("GMG02", "Ing.Gén.Arm.(GM) 2e Son"),
+ ("GMG1", "Ing.Gén.1e cl.Arm.(GM) 2e Son"),
+ ("GMG11", "Ing.Gén.1e cl.Arm.(GM)"),
+ ("GMG2", "Ing.Gén.2e cl.Arm.(GM) 2e Son"),
+ ("GMG22", "Ing.Gén.2e cl.Arm.(GM)"),
+ ("GMP", "Ing.pp.Arm.(GM)"),
+ ("GMP2", "Ing.pp.Arm.(GM) retr."),
+ ("GMP3", "Ing.pp.Arm.(GM) cg."),
+ ("GMP4", "Ing.pp.Arm.(GM) dém."),
+ ("GMP7", "Ing.pp.Arm.(GM) H.C"),
+ ("GMP8", "Ing.pp.Arm.(GM) rés."),
+ ("GMP9", "Ing.pp.Arm.(GM) CR"),
+ ("GMT12", "Ing.Gén.1e cl. Mat. 2e Son"),
+ ("GMT2", "Ing.Gén.du Mat. 2e Son"),
+ ("GMT22", "Ing.Gén.2e cl. Mat. 2e Son"),
+ ("HG02", "Ing.Gén.Arm.(H) 2e Son"),
+ ("IA", "Ing.Arm."),
+ ("IA2", "Ing.Arm. retr."),
+ ("IA3", "Ing.Arm. cg."),
+ ("IA4", "Ing.Arm. dém."),
+ ("IA5", "Ing.Arm. dét."),
+ ("IA6", "Ing.Arm. dis."),
+ ("IA7", "Ing.Arm. (H.C.)"),
+ ("IA8", "Ing.Arm. rés."),
+ ("IA9", "Ing.Arm. (CR)"),
+ ("IAC8", "Ing.ch.Arm. rés."),
+ ("IAv", "Ing.Av.C."),
+ ("IAv2", "Ing.Av.C. retr."),
+ ("IAV3", "Ing.Av.C. cg."),
+ ("IAv4", "Ing.Av.C. dém."),
+ ("IAv5", "Ing.Av.C. dét."),
+ ("IAv6", "Ing.Av.C. dis."),
+ ("IAv7", "Ing.Av.C. (H.C.)"),
+ ("ICA", "Ing.ch.Arm."),
+ ("ICA2", "Ing.ch.Arm.retr."),
+ ("ICA3", "Ing.ch.Arm. cg."),
+ ("ICA4", "Ing.ch.Arm. dém."),
+ ("ICA5", "Ing.ch.Arm. dét."),
+ ("ICA6", "Ing.ch.Arm. dis"),
+ ("ICA7", "Ing.ch.Arm. (H.C.)"),
+ ("ICA8", "Ing.ch.Arm.rés."),
+ ("ICA9", "Ing.ch.Arm. (CR)"),
+ ("ICAv", "Ing.ch.Av.C."),
+ ("ICAv2", "Ing.ch.Av.C. retr."),
+ ("ICAv3", "Ing.ch.Av.C. cg."),
+ ("ICAv4", "Ing.ch.Av.C. dém."),
+ ("ICAv5", "Ing.ch.Av.C. dét."),
+ ("ICAv6", "Ing.ch.Av.C. dis."),
+ ("ICAv7", "Ing.ch.Av.C. (H.C.)"),
+ ("ICG", "Ing.ch.GREF"),
+ ("ICG2", "Ing.ch.GREF retr."),
+ ("ICG3", "Ing.ch.GREF cg."),
+ ("ICG4", "Ing.ch.GREF dém."),
+ ("ICG5", "Ing.ch.GREF dét."),
+ ("ICG6", "Ing.ch.GREF dis."),
+ ("ICG7", "Ing.ch.GREF (H.C.)"),
+ ("ICGO", "Ing.ch.Géog."),
+ ("ICGO2", "Ing.ch.Géog. retr."),
+ ("ICGO3", "Ing.ch.Géog. cg"),
+ ("ICGO4", "Ing.ch.Géog. dém."),
+ ("ICGO5", "Ing.ch.Géog. dét."),
+ ("ICGO6", "Ing.ch.Géog. dis."),
+ ("ICGO7", "Ing.ch.Géog. (H.C.)"),
+ ("ICIM", "Ing.ch.I.M."),
+ ("ICIM2", "Ing.ch.I.M. retr."),
+ ("ICIM3", "Ing.ch.I.M. cg."),
+ ("ICIM4", "Ing.ch.I.M. dém."),
+ ("ICIM5", "Ing.ch.I.M. dét."),
+ ("ICIM6", "Ing.ch.I.M. dis."),
+ ("ICIM7", "Ing.ch.I.M. (H.C.)"),
+ ("ICM", "Ing.ch.Mines"),
+ ("ICM2", "Ing.ch.Mines retr."),
+ ("ICM3", "Ing.ch.Mines cg."),
+ ("ICM4", "Ing.ch.Mines dém."),
+ ("ICM5", "Ing.ch.Mines dét."),
+ ("ICM6", "Ing.ch.Mines dis."),
+ ("ICM7", "Ing.ch.Mines (H.C.)"),
+ ("ICME", "Ing.ch.M.E."),
+ ("ICME2", "Ing.ch.M.E. retr."),
+ ("ICME3", "Ing.ch.M.E. cg."),
+ ("ICME4", "Ing.ch.M.E. dém."),
+ ("ICME5", "Ing.ch.M.E. dét."),
+ ("ICME6", "Ing.ch.M.E. dis."),
+ ("ICME7", "Ing.ch.M.E (H.C.)"),
+ ("ICMO", "Ing.ch.Météo."),
+ ("ICMO2", "Ing.ch.Météo.retr."),
+ ("ICMO3", "Ing.ch.Météo.cg"),
+ ("ICMO4", "Ing.ch.Météo.dém."),
+ ("ICMO5", "Ing.ch.Météo.dét."),
+ ("ICMO6", "Ing.ch.Météo.dis"),
+ ("ICMO7", "Ing.ch.Météo. (H.C.)"),
+ ("ICMT2", "Ing.ch.Mat. retr."),
+ ("ICMT3", "Ing.ch.1e cl. Mat hon."),
+ ("ICMT4", "Ing.ch.2e cl. Mat. hon."),
+ ("ICPC", "Ing.ch.P.C."),
+ ("ICPC2", "Ing.ch.P.C. retr."),
+ ("ICPC3", "Ing.ch.P.C. cg."),
+ ("ICPC4", "Ing.ch.P.C. dém."),
+ ("ICPC5", "Ing.ch.P.C. dét."),
+ ("ICPC6", "Ing.ch.P.C. dis."),
+ ("ICPC7", "Ing.ch.P.C. (H.C.)"),
+ ("ICT", "Ing.ch.Téléc."),
+ ("ICT2", "Ing.ch.Téléc. retr."),
+ ("ICT3", "Ing.ch.Téléc. cg."),
+ ("ICT4", "Ing.ch.Téléc. dém."),
+ ("ICT5", "Ing.ch.Téléc. dét."),
+ ("ICT6", "Ing.ch.Téléc. dis."),
+ ("ICT7", "Ing.ch.Téléc. (H.C.)"),
+ ("ICTH", "Ing.ch.Téléc. hon."),
+ ("IFi", "Insp.des Finances"),
+ ("IFi2", "Insp.des Finances retr."),
+ ("IFi3", "Insp.des Finances cg."),
+ ("IFi4", "Insp.des Finances dém."),
+ ("IFi5", "Insp.des Finances dét."),
+ ("IFi6", "Insp.des Finances dis."),
+ ("IFi7", "Insp.des Finances (H.C.)"),
+ ("IG", "Ing.GREF"),
+ ("IG11", "Ing.Gén.1e cl.Arm."),
+ ("IG12", "Ing.Gén.1e cl.Arm. 2e Son"),
+ ("IG13", "Ing.Gén.1e cl.Arm. cg."),
+ ("IG15", "Ing.Gén.1e cl.Arm. dét."),
+ ("IG16", "Ing.Gén.1e cl.Arm. dis."),
+ ("IG17", "Ing.Gén.1e cl.Arm. (H.C.)"),
+ ("IG19", "Ing.Gén.1e cl.Arm. (CR)"),
+ ("IG2", "Ing.GREF retr."),
+ ("IG21", "Ing.Gén.2e cl.Arm."),
+ ("IG22", "Ing.Gén.2e cl.Arm. 2e Son"),
+ ("IG23", "Ing.Gén.2e cl.Arm. cg."),
+ ("IG25", "Ing.Gén.2e cl.Arm. dét."),
+ ("IG26", "Ing.Gén.2e cl.Arm. dis."),
+ ("IG27", "Ing.Gén.2e cl.Arm. (H.C.)"),
+ ("IG29", "Ing.Gén.2e cl.Arm. (CR)"),
+ ("IG3", "Ing.GREF cg."),
+ ("IG4", "Ing.GREF dém."),
+ ("IG5", "Ing.GREF dét."),
+ ("IG6", "Ing.GREF dis."),
+ ("IG7", "Ing.GREF (H.C.)"),
+ ("IGA", "Ing.gén.Arm."),
+ ("IGA2", "Ing.gén.Arm. 2e Son"),
+ ("IGA3", "Ing.gén.Arm. cg."),
+ ("IGA5", "Ing.gén.Arm. dét."),
+ ("IGA6", "Ing.gén.Arm. dis."),
+ ("IGA7", "Ing.gén.Arm. (H.C.)"),
+ ("IGA8", "Ing.gén.Arm.(C.R.)"),
+ ("IGAv", "Ing.gén.Av.C."),
+ ("IGAv2", "Ing.gén.Av.C. retr."),
+ ("IGAv3", "Ing.gén.Av.C. cg."),
+ ("IGAv4", "Ing.gén.Av.C. dém."),
+ ("IGAv5", "Ing.gén.Av.C. dét."),
+ ("IGAv6", "Ing.gén.Av.C. dis"),
+ ("IGAv7", "Ing.gén.Av.C. (H.C.)"),
+ ("IGE", "Ing.gén.de cl.except.Arm."),
+ ("IGE2", "Ing.gén.de cl.except.Arm.2eSon"),
+ ("IGFi", "Insp.gén.des Finances"),
+ ("IGFi2", "Insp.gén.des Finances retr."),
+ ("IGFi3", "Insp.gén.des Finances cg."),
+ ("IGFi4", "Insp.gén.des Finances dém."),
+ ("IGFi5", "Insp.gén.des Finances dét."),
+ ("IGFi6", "Insp.gén.des Finances dis."),
+ ("IGFi7", "Insp.gén.des Finances (H.C.)"),
+ ("IGG", "Ing.gén.GREF"),
+ ("IGG2", "Ing.gén.GREF retr."),
+ ("IGG3", "Ing.gén.GREF cg."),
+ ("IGG4", "Ing.gén.GREF dém."),
+ ("IGG5", "Ing.gén.GREF dét."),
+ ("IGG6", "Ing.gén.GREF dis."),
+ ("IGG7", "Ing.gén.GREF (H.C.)"),
+ ("IGGO", "Ing.gén.Géog."),
+ ("IGGO2", "Ing.gén.Géog. retr."),
+ ("IGGO3", "Ing.gén.Géog. cg."),
+ ("IGGO4", "Ing.gén.Géog. dém."),
+ ("IGGO5", "Ing.gén.Géog. dét."),
+ ("IGGO6", "Ing.gén.Géog. dis."),
+ ("IGGO7", "Ing.gén.Géog. (H.C.)"),
+ ("IGH", "Ing.gén.hors cl. Arm."),
+ ("IGH2", "Ing.gén.hors cl.Arm.2e Son"),
+ ("IGIM", "Ing.gén.I.M."),
+ ("IGIM2", "Ing.gén.I.M. retr."),
+ ("IGIN", "Insp.gén.INSEE"),
+ ("IGIN2", "Insp.gén.INSEE retr."),
+ ("IGIN3", "Insp.gén.INSEE cg."),
+ ("IGIN4", "Insp.gén.INSEE dém."),
+ ("IGIN5", "Insp.gén.INSEE dét."),
+ ("IGIN6", "Insp.gén.INSEE dis."),
+ ("IGIN7", "Insp.gén.INSEE (H.C.)"),
+ ("IGIN8", "Insp.gén.INSEE hon."),
+ ("IGM", "Ing.gén.Mines"),
+ ("IGM2", "Ing.gén.Mines retr."),
+ ("IGM3", "Ing.gén.Mines cg."),
+ ("IGM4", "Ing.gén.Mines dém."),
+ ("IGM5", "Ing.gén.Mines dét."),
+ ("IGM6", "Ing.gén.Mines dis."),
+ ("IGM7", "Ing.gén.Mines (H.C.)"),
+ ("IGME", "Insp.gén.M.E."),
+ ("IGME2", "Insp.gén.M.E. retr."),
+ ("IGME3", "Insp.gén.M.E. cg"),
+ ("IGME4", "Insp.gén.M.E. dém."),
+ ("IGME5", "Insp.gén.M.E. dét."),
+ ("IGME6", "Insp.gén.M.E. dis."),
+ ("IGME7", "Insp.gén.M.E.(H.C)."),
+ ("IGMO", "Ing.gén.Météo."),
+ ("IGMO2", "Ing.gén.Météo. retr."),
+ ("IGMO3", "Ing.gén.Météo. cg."),
+ ("IGMO4", "Ing.gén.Météo. dém."),
+ ("IGMO5", "Ing.gén.Météo. dét."),
+ ("IGMO6", "Ing.gén.Météo. dis."),
+ ("IGMO7", "Ing.gén.Météo. (H.C.)"),
+ ("IGO", "Ing.Géog."),
+ ("IGO2", "Ing.Géog. retr."),
+ ("IGO3", "Ing.Géog. cg."),
+ ("IGO4", "Ing.Géog. dém."),
+ ("IGO5", "Ing.Géog. dét."),
+ ("IGO6", "Ing.Géog. dis."),
+ ("IGO7", "Ing.Géog. (H.C.)"),
+ ("IGPC", "Ing.gén.P.C."),
+ ("IGPC2", "Ing.gén.P.C. hon."),
+ ("IGPC3", "Ing.gén.P.C. cg."),
+ ("IGPC4", "Ing.gén.P.C. dém."),
+ ("IGPC5", "Ing.gén.P.C. dét."),
+ ("IGPC6", "Ing.gén.P.C. dis."),
+ ("IGPC7", "Ing.gén.P.C. (H.C.)"),
+ ("IGT", "Ing.gén.Téléc."),
+ ("IGT12", "Ing.gén.1e cl.Téléc. retr."),
+ ("IGT2", "Ing.gén.Téléc. retr."),
+ ("IGT22", "Ing.gén.2e cl.Téléc. retr."),
+ ("IGT3", "Ing.gén.Téléc. cg."),
+ ("IGT4", "Ing.gén.Téléc. dém."),
+ ("IGT5", "Ing.gén.Téléc. dét."),
+ ("IGT6", "Ing.gén.Téléc. dis."),
+ ("IGT7", "Ing.gén.Téléc.(H.C.)"),
+ ("IGTH", "Ing.gén.Téléc. hon."),
+ ("IIM", "Ing.I.M."),
+ ("IIM2", "Ing.I.M. retr."),
+ ("IIM3", "Ing.I.M. cg."),
+ ("IIM4", "Ing.I.M. dém."),
+ ("IIM5", "Ing.I.M. dét."),
+ ("IIM6", "Ing.I.M. dis."),
+ ("IIM7", "Ing.I.M. (H.C.)"),
+ ("IM", "Ing.Mines"),
+ ("IM2", "Ing.Mines retr."),
+ ("IM3", "Ing.Mines cg."),
+ ("IM4", "Ing.Mines dém."),
+ ("IM5", "Ing.Mines dét."),
+ ("IM6", "Ing.Mines dis."),
+ ("IM7", "Ing.Mines (H.C.)"),
+ ("IME", "Ing.M.E."),
+ ("IME2", "Ing.M.E. retr."),
+ ("IME3", "Ing.M.E. cg."),
+ ("IME4", "Ing.M.E. dém."),
+ ("IME5", "Ing.M.E. dét."),
+ ("IME6", "Ing.M.E. dis."),
+ ("IME7", "Ing.M.E (H.C.)"),
+ ("IMO", "Ing.Météo."),
+ ("IMO2", "Ing.Météo. retr."),
+ ("IMO3", "Ing.Météo. cg."),
+ ("IMO4", "Ing.Météo.dém."),
+ ("IMO5", "Ing.Météo. dét."),
+ ("IMO6", "Ing.Météo. dis."),
+ ("IMO7", "Ing.Météo. (H.C.)"),
+ ("ININ", "Insp.INSEE"),
+ ("ININ2", "Insp.INSEE retr."),
+ ("ININ3", "Insp.INSEE cg."),
+ ("ININ4", "Insp.INSEE dém."),
+ ("ININ5", "Insp.INSEE dét."),
+ ("ININ6", "Insp.INSEE dis."),
+ ("ININ7", "Insp.INSEE (H.C.)"),
+ ("INT12", "Intent.Milit.1e cl. retr."),
+ ("INT22", "Intent.Milit.2e cl. retr."),
+ ("INTG", "Intent.Gén.2e Son"),
+ ("INTG1", "Intent.Gén.1ere cl.2e Son"),
+ ("INTG2", "Intent.Gén.2e cl.2e Son"),
+ ("IPA", "Ing.pp.Arm."),
+ ("IPA2", "Ing.pp.Arm.retr."),
+ ("IPA3", "Ing.pp.Arm. cg."),
+ ("IPA4", "Ing.pp.Arm. dém."),
+ ("IPA5", "Ing.pp.Arm. dét."),
+ ("IPA6", "Ing.pp.Arm. dis."),
+ ("IPA7", "Ing.pp.Arm. (H.C.)"),
+ ("IPA8", "Ing.pp.Arm. rés."),
+ ("IPA9", "Ing.pp.Arm. (CR)"),
+ ("IPC", "Ing.P.C."),
+ ("IPC2", "Ing.P.C. retr."),
+ ("IPC3", "Ing.P.C. cg."),
+ ("IPC4", "Ing.P.C. dém."),
+ ("IPC5", "Ing.P.C. dét."),
+ ("IPC6", "Ing.P.C. dis."),
+ ("IPC7", "Ing.P.C. (H.C.)"),
+ ("IPG", "Ing.pp.GREF"),
+ ("IPG2", "Ing.pp.GREF retr."),
+ ("IPG3", "Ing.pp.GREF cg."),
+ ("IPG4", "Ing.pp.GREF dém."),
+ ("IPG5", "Ing.pp.GREF dét."),
+ ("IPG6", "Ing.pp.GREF dis."),
+ ("IPG7", "Ing.pp.GREF (H.C.)"),
+ ("ISG2", "Insp.pp.des E.et F.OM.retr."),
+ ("IT", "Ing.Téléc."),
+ ("IT2", "Ing.Téléc. retr."),
+ ("IT3", "Ing.Téléc. cg."),
+ ("IT4", "Ing.Téléc. dém."),
+ ("IT5", "Ing.Téléc. dét."),
+ ("IT6", "Ing.Téléc. dis."),
+ ("IT7", "Ing.Téléc. (H.C.)"),
+ ("L.Co", "Lieut.-Colonel"),
+ ("L.Co2", "Lieut.-Colonel retr."),
+ ("L.Co5", "Lieut.-Colonel dém."),
+ ("L.Co8", "Lieut.-Colonel rés."),
+ ("L.Coh", "Lieut.-Colonel hon."),
+ ("Lt", "Lieutenant"),
+ ("Lt6", "Lieutenant dis."),
+ ("Lt8", "Lieutenant rés."),
+ ("LV", "Lieutenant de Vaisseau"),
+ ("NAéG2", "Ing.gén.N.Aé.retr"),
+ ("VA", "Vice-Amiral"),
+ ("VA2", "Vice-Amiral 2e Son"),
+ ("VAE", "Vice-Amiral d'Escadre"),
+ ("VAE2", "Vice-Amiral d'Escadre 2e Son");
+
+INSERT IGNORE INTO profile_corps_enum (abbreviation, name, still_exists)
+ VALUES ("D", "Aucun (anc. démissionnaire)", 1),
+ ("Ad.C", "Adm. des Colonies", 0),
+ ("Agr.C", "Agriculture aux Colonies", 0),
+ ("Z", "Ancien élève étranger", 0),
+ ("Aé", "Arm.Aéronautique", 0),
+ ("ABC", "Arme blindée", 0),
+ ("Arm", "Ingénieurs de l'Armement", 1),
+ ("A", "Artillerie", 0),
+ ("AC", "Artillerie coloniale", 0),
+ ("AM", "Artillerie de Marine", 0),
+ ("AN", "Artillerie Navale", 0),
+ ("Av.C", "Aviation Civile", 0),
+ ("B", "Bourse d'études", 0),
+ ("Cav", "Cavalerie", 0),
+ ("Cha", "Chars de Combat", 0),
+ ("C.A", "Commissaire de l'Air", 0),
+ ("C.M", "Commissariat de la Marine", 0),
+ ("C.Ap", "Contrôle des Assurances", 1),
+ ("EF.Ma", "E.& F. du Maroc", 0),
+ ("E.F", "Eaux et Forêts", 0),
+ ("EFC", "Eaux et Forêts des Colonies", 0),
+ ("EFOM", "Eaux et Forêts Outre-Mer", 0),
+ ("ENA", "Ecole Nation.d'Administration", 0),
+ ("-", "Elève à l'Ecole", 0),
+ ("W", "Elève catégorie particulière", 0),
+ ("w", "Elève étranger naturalisé", 0),
+ (" ", "Elève non sorti de l'école", 0),
+ ("FA", "Fabrication d'Armement", 0),
+ ("Gend", "Gendarmerie", 0),
+ ("G", "Génie", 0),
+ ("GM", "Génie Maritime", 0),
+ ("GR", "Génie Rural", 0),
+ ("GREF", "Génie Rural Eaux et Forêts", 1),
+ ("IG", "Géographe", 0),
+ ("Géo.C", "Géologie des Colonies", 0),
+ ("H", "Hydrographes", 0),
+ ("I", "Infanterie", 0),
+ ("I.C", "Infanterie Coloniale", 0),
+ ("I.Ma", "Infanterie de Marine", 0),
+ ("St", "Institut nat.de la statistique", 0),
+ ("IM", "Instruments de mesure", 0),
+ ("ME", "Manufactures Etat Tabacs", 0),
+ ("Mat", "Matériel Armée de Terre", 0),
+ ("Mét", "Météorologie nationale", 0),
+ ("M", "Mines", 1),
+ ("MC", "Mines coloniales", 0),
+ ("MOM", "Mines Outre-Mer", 0),
+ ("N.Aé", "Navigation Aérienne", 0),
+ ("Air", "Offic.de l'Air", 0),
+ ("ORTF", "Office Radio-Télévision franç.", 0),
+ ("BaAir", "Officier des Bases de l'Air", 0),
+ ("Mar", "Officiers de marine", 0),
+ ("OMAir", "Officiers mécaniciens Air", 0),
+ ("PC", "Ponts et Chaussées", 1),
+ ("PCC", "Ponts et Chaussées Colonies", 0),
+ ("PCOM", "Ponts et Chaussées Outre-Mer", 0),
+ ("PTC", "Postes et Télécom.Colonies", 0),
+ ("PTOM", "Postes et Télécom.Outre-Mer", 0),
+ ("P", "Poudres", 0),
+ ("Rad", "Radiodiffusion française", 0),
+ ("Rech", "Recherche", 0),
+ ("R", "Réformé en fin d'études", 0),
+ ("Bât.", "Service des Bâtiments", 0),
+ ("C.F", "SNCF", 0),
+ ("Sp", "Sports", 0),
+ ("Téléc", "Télécommunications", 1),
+ ("Té.A", "Télécommunications d'Armement", 0),
+ ("Tr", "Train", 0),
+ ("Tra", "Transmissions", 0),
+ ("Tra.C", "Transmissions Coloniales", 0),
+ ("TPC", "Travaux publics des Colonies", 0),
+ ("TP Ic", "Travaux publics en Indochine", 0),
+ ("TPOM", "Travaux publics Outre-Mer", 0),
+ ("TdM", "Troupes de Marine", 0),
+ ("INSEE", "Administrateurs de l'INSEE", 1),
+ ("Off", "Officiers des Armées", 1);
+
+INSERT IGNORE INTO profile_corps (uid, original_corpsid, current_corpsid, rankid, corps_pub)
+ SELECT u.user_id, c.id, c.id, r.id, 'ax'
+ FROM auth_user_md5 AS u
+ INNER JOIN fusionax_anciens AS f ON (u.matricule_ax = f.id_ancien)
+ INNER JOIN profile_corps_enum AS c ON (f.corps_sortie = c.abbreviation)
+ INNER JOIN profile_corps_rank_enum AS r ON (f.grade = r.abbreviation);
+
+ALTER TABLE watch_profile MODIFY field ENUM('nom', 'freetext', 'mobile', 'nationalite', 'nationalite2',
+ 'nationalite3', 'nick', 'web', 'networking', 'edus', 'addresses',
+ 'section', 'binets', 'medals', 'cv', 'jobs', 'photo', 'corps');
+
+-- vim:set syntax=mysql:
--- /dev/null
+CREATE TEMPORARY TABLE IF NOT EXISTS tmp_update_fusionax_anciens (
+ good CHAR(4) DEFAULT NULL,
+ bad CHAR(4) DEFAULT NULL,
+ PRIMARY KEY(bad),
+ UNIQUE KEY(good)
+) CHARSET=utf8;
+
+INSERT IGNORE INTO tmp_update_fusionax_anciens (bad, good)
+ VALUES ('TC', 'CAM'),
+ ('SH', 'CN'),
+ ('R', 'RO'),
+ ('TW', 'RC'),
+ ('TG', 'RT'),
+ ('U', 'ROU'),
+ ('KP', 'ROK'),
+ ('CRO', 'HR'),
+ ('UKR', 'UA'),
+ ('AM', 'ARM'),
+ ('CS', 'CZ'),
+ ('SU', 'RUS'),
+ ('LET', 'LV'),
+ ('MDA', 'MD');
+
+ UPDATE fusionax_anciens AS f
+INNER JOIN tmp_update_fusionax_anciens AS t ON (f.Code_nationalite = t.bad)
+ SET f.Code_nationalite = t.good;
+
+-- vim:set syntax=mysql:
--- /dev/null
+-- Query to check if all the nationalities are now rocognized
+-- If the result of this query is not empty, 04_nationalities.sql nedds to be updated
+SELECT DISTINCT Code_nationalite
+ FROM fusionax_anciens AS f
+ WHERE NOT EXISTS (SELECT *
+ FROM geoloc_pays AS g
+ WHERE g.license_plate = f.Code_nationalite);
+
+
+-- vim:set syntax=mysql:
--- /dev/null
+ALTER TABLE geoloc_pays ADD INDEX (license_plate);
+
+ UPDATE auth_user_md5 AS u
+LEFT JOIN fusionax_anciens AS f ON (u.matricule_ax = f.id_ancien)
+LEFT JOIN geoloc_pays AS g ON (g.license_plate = f.Code_nationalite)
+ SET u.nationalite = g.a2
+ WHERE u.nationalite IS NULL;
+
+ UPDATE auth_user_md5 AS u
+LEFT JOIN fusionax_anciens AS f ON (u.matricule_ax = f.id_ancien)
+LEFT JOIN geoloc_pays AS g ON (g.license_plate = f.Code_nationalite)
+ SET u.nationalite2 = g.a2
+ WHERE u.nationalite != g.a2 AND u.nationalite2 IS NULL;
+
+ UPDATE auth_user_md5 AS u
+LEFT JOIN fusionax_anciens AS f ON (u.matricule_ax = f.id_ancien)
+LEFT JOIN geoloc_pays AS g ON (g.license_plate = f.Code_nationalite)
+ SET u.nationalite3 = g.a2
+ WHERE u.nationalite != g.a2 AND u.nationalite2 != g.a2 AND u.nationalite3 IS NULL;
+
+ALTER TABLE geoloc_pays DROP INDEX (license_plate);
+
+-- vim:set syntax=mysql:
--- /dev/null
+CREATE TABLE IF NOT EXISTS `profile_names_display` (
+ `user_id` int(11) NOT NULL COMMENT 'id of alumni',
+ `display` varchar(100) NOT NULL COMMENT 'name to display',
+ `sort` varchar(100) NOT NULL COMMENT 'name used for sorting',
+ `tooltip` varchar(150) NOT NULL COMMENT 'text to explain display name if needed',
+ `firstname` varchar(50) NOT NULL COMMENT 'first name',
+ `lastname` varchar(50) NOT NULL COMMENT 'last name',
+ `yourself` varchar(100) NOT NULL COMMENT 'name we used to speak to him/her',
+ PRIMARY KEY (`user_id`),
+ KEY `sort` (`sort`)
+) CHARSET=utf8 COMMENT='Alumnis'' names to display';
+
+INSERT INTO `profile_names_display` (
+ SELECT
+ `user_id`,
+ CONCAT(`prenom`, ' ',IF(`nom_usage` != '',CONCAT(`nom_usage`,' (',`nom`,')'),`nom`)),
+ CONCAT(IF(`nom_usage` != '',`nom_usage`,`nom`),', ',`prenom`),
+ '',
+ `prenom`,
+ IF(`nom_usage` != '',`nom_usage`,`nom`),
+ `prenom`
+ FROM `auth_user_md5`);
+
+UPDATE `profile_names_display` AS n INNER JOIN `auth_user_md5` AS u ON n.lastname = u.prenom
+SET n.tooltip = CONCAT('Prénom : ', n.firstname,' - Nom : ', n.lastname);
+
+CREATE TABLE IF NOT EXISTS `profile_names_search` (
+ `user_id` int(11) NOT NULL COMMENT 'id of alumni',
+ `sn_id` smallint(6) NOT NULL COMMENT 'id of this search name in all alumni''s search names',
+ `search_name` varchar(50) NOT NULL COMMENT 'name to search for',
+ `name_type` enum('firstname','lastname','surname') NOT NULL default 'lastname' COMMENT 'type of name',
+ `search_score` smallint(6) NOT NULL COMMENT 'used to sort search results',
+ `pub` enum('always public','public','private') NOT NULL default 'private' COMMENT 'searchable on public site or only on private',
+ PRIMARY KEY (`name_type`,`search_name`,`user_id`),
+ KEY `user_id` (`user_id`)
+) CHARSET=utf8 COMMENT='Names of alumni (search table)';
+
+INSERT INTO `profile_names_search` ( SELECT `user_id`, 0, `nom`, 'lastname', 10, 'always public' FROM `auth_user_md5` WHERE `nom` != '');
+INSERT INTO `profile_names_search` ( SELECT `user_id`, 1, `nom_usage`, 'lastname', 10, 'public' FROM `auth_user_md5` WHERE `nom` != `nom_usage` AND `nom_usage` != '');
+INSERT INTO `profile_names_search` ( SELECT `user_id`, 2, `nom_ini`, 'lastname', 7, 'private' FROM `auth_user_md5` WHERE `nom` != `nom_ini` AND `nom_ini` != '' AND `nom_ini` != `nom_usage`);
+INSERT INTO `profile_names_search` ( SELECT `user_id`, 3, `prenom`, 'firstname', 8, 'always public' FROM `auth_user_md5` WHERE `prenom` != '');
+INSERT INTO `profile_names_search` ( SELECT `user_id`, 4, `prenom_ini`, 'firstname', 5, 'private' FROM `auth_user_md5` WHERE `prenom_ini` != `prenom` AND `prenom_ini` != '');
+INSERT INTO `profile_names_search` ( SELECT `user_id`, 5, `profile_nick`, 'surname', 7, 'private' FROM `auth_user_quick` WHERE `profile_nick` != '');
+
+-- vim:set syntax=mysql:
--- /dev/null
+ALTER TABLE `adresses` ADD `comment` varchar(100) NOT NULL;
+
--- /dev/null
+CREATE TABLE IF NOT EXISTS `profile_networking_enum` (
+ `network_type` tinyint unsigned NOT NULL,
+ `name` varchar(30) NOT NULL,
+ `icon` varchar(50) NOT NULL COMMENT 'icon filename',
+ `filter` enum('email','web','number','none') NOT NULL DEFAULT 'none' COMMENT 'filter type for addresses',
+ `link` varchar(255) NOT NULL COMMENT 'string used to forge an URL linking to the the profile page',
+ PRIMARY KEY (`network_type`)
+) CHARSET=utf8 COMMENT='types of networking addresses';
+
+CREATE TABLE IF NOT EXISTS `profile_networking` (
+ `uid` int NOT NULL COMMENT 'user id',
+ `nwid` tinyint unsigned NOT NULL COMMENT 'number of the address for the user',
+ `network_type` tinyint unsigned NOT NULL,
+ `address` varchar(255) NOT NULL,
+ `pub` enum('private','public') NOT NULL DEFAULT 'private',
+ PRIMARY KEY (`uid`, `nwid`)
+) CHARSET=utf8 COMMENT='networking addresses';
+
+-- Insert a first address type for old URLs
+INSERT INTO `profile_networking_enum` (`network_type`, `name`, `icon`, `filter`)
+ VALUES (0, 'Page web', 'web.gif', 'web');
+
+INSERT INTO `profile_networking` (`uid`, `nwid`, `network_type`, `address`, `pub`)
+ SELECT `user_id`, 0, 0, `profile_web`, `profile_web_pub`
+ FROM `auth_user_quick`
+ WHERE `profile_web` <> "";
+
+-- Modify watch_profile to update 'field' from web to networking
+ALTER TABLE `watch_profile`
+ MODIFY `field` enum('nom', 'freetext', 'mobile', 'nationalite', 'nick',
+ 'web', 'networking', 'appli1', 'appli2', 'addresses',
+ 'section', 'binets', 'medals', 'cv', 'jobs', 'photo');
+
+UPDATE `watch_profile` SET `field` = 'networking' WHERE `field` = 'web';
+
+ALTER TABLE `watch_profile`
+ MODIFY `field` enum('nom', 'freetext', 'mobile', 'nationalite', 'nick',
+ 'networking', 'appli1', 'appli2', 'addresses',
+ 'section', 'binets', 'medals', 'cv', 'jobs', 'photo');
+
+-- Drop old web URL columns
+ALTER TABLE `auth_user_quick` DROP COLUMN `profile_web`;
+ALTER TABLE `auth_user_quick` DROP COLUMN `profile_web_pub`;
+
--- /dev/null
+CREATE TABLE IF NOT EXISTS profile_directory (
+ uid INT NOT NULL,
+ email_directory VARCHAR(255) DEFAULT NULL,
+ PRIMARY KEY (uid)
+) CHARSET=utf8;
+
+ALTER TABLE register_marketing MODIFY COLUMN type ENUM('user', 'staff', 'ax');
--- /dev/null
+CREATE TABLE IF NOT EXISTS `profile_phones` (
+ `uid` smallint unsigned NOT NULL,
+ `link_type` enum('address', 'pro', 'user') NOT NULL DEFAULT 'user' COMMENT 'type of parent element',
+ `link_id` tinyint unsigned NOT NULL COMMENT 'id of his parent element',
+ `tel_id` tinyint unsigned NOT NULL COMMENT 'index of this number for the couple (user, parent element)',
+ `tel_type` enum('fixed', 'mobile', 'fax') NOT NULL DEFAULT 'fixed',
+ `search_tel` varchar(25) NOT NULL COMMENT 'search number in an international format with only digits and the initial +',
+ `display_tel` varchar(30) NOT NULL COMMENT 'display number',
+ `pub` enum('private', 'ax', 'public') NOT NULL DEFAULT 'private',
+ `comment` varchar(80) NOT NULL,
+ PRIMARY KEY(`uid`, `link_type`, `link_id`, `tel_id`),
+ INDEX (`search_tel`)
+);
+
+
+-- Adds a temporary column to convert phone prefixes from varchar to int
+ALTER TABLE `geoloc_pays` ADD COLUMN `tmp_phoneprf` smallint unsigned NULL;
+
+-- Adds phone format column
+ALTER TABLE `geoloc_pays` ADD COLUMN `phoneformat` varchar(25) NOT NULL AFTER `nat`;
+
--- /dev/null
+ALTER TABLE auth_user_md5 ADD COLUMN nationalite2 CHAR(2) DEFAULT NULL,
+ ADD COLUMN nationalite3 CHAR(2) DEFAULT NULL,
+ ADD KEY nationalite2 (nationalite2),
+ ADD KEY nationalite3 (nationalite3),
+ MODIFY nationalite CHAR(2) DEFAULT NULL;
+
+UPDATE auth_user_md5 SET nationalite=NULL WHERE nationalite="00" OR nationalite='';
+
+DELETE FROM geoloc_pays WHERE a2="00";
+
+ALTER TABLE watch_profile MODIFY field enum('nom', 'freetext', 'mobile', 'nationalite', 'nationalite2', 'nationalite3',
+ 'nick', 'web', 'networking', 'appli1', 'appli2', 'addresses',
+ 'section', 'binets', 'medals', 'cv', 'jobs', 'photo');
+
+# vim:set syntax=mysql:
--- /dev/null
+CREATE TABLE IF NOT EXISTS profile_education_field_enum (
+ id INT(2) NOT NULL AUTO_INCREMENT,
+ field VARCHAR(255) DEFAULT NULL,
+ PRIMARY KEY(id),
+ UNIQUE KEY(field)
+) CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS profile_education_degree_enum (
+ id INT(2) NOT NULL AUTO_INCREMENT,
+ degree VARCHAR(255) DEFAULT NULL,
+ PRIMARY KEY(id),
+ UNIQUE KEY(degree)
+) CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS profile_education_degree (
+ eduid INT(4) NOT NULL DEFAULT 0,
+ degreeid INT(2) NOT NULL DEFAULT 0,
+ PRIMARY KEY(eduid, degreeid)
+) CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS profile_education_enum (
+ id INT(4) NOT NULL AUTO_INCREMENT,
+ name VARCHAR(255) DEFAULT NULL,
+ url VARCHAR(255) DEFAULT NULL,
+ country CHAR(2) NOT NULL DEFAULT 'FR',
+ PRIMARY KEY(id),
+ UNIQUE KEY(name)
+) CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS profile_education (
+ id INT(2) NOT NULL DEFAULT 0,
+ uid INT(11) NOT NULL DEFAULT 0,
+ eduid INT(4) NOT NULL DEFAULT 0,
+ degreeid INT(4) NOT NULL DEFAULT 0,
+ fieldid INT(2) NOT NULL DEFAULT 0,
+ grad_year INT(4) DEFAULT NULL,
+ program VARCHAR(255) DEFAULT NULL,
+ PRIMARY KEY(id, uid)
+) CHARSET=utf8;
+
+INSERT INTO profile_education_field_enum (field)
+ VALUES ('Aéronautique'), ('Agronomie'), ('Assurance'), ('Biologie'),
+ ('Chimie'), ('Droit'), ('Économie'), ('Électronique/électricité'),
+ ('Environnement/développement durable'), ('Finance'), ('Géographie'),
+ ('Histoire'), ('Informatique'), ('Langues'), ('Mathématiques'),
+ ('Mathématiques appliquées'), ('Mécanique'), ('Médecine'),
+ ('Philosophie'), ('Physique'), ('Sciences politiques');
+
+INSERT INTO profile_education_degree_enum (degree)
+ VALUES ('Diplôme'), ('Ingénieur'), ('Corps'), ('MS'), ('PhD'),
+ ('DEA'), ('ME'), ('MBA'), ('MiF'), ('MPA'), ('Licence');
+
+INSERT INTO profile_education_degree (eduid, degreeid)
+ SELECT a.id, d.id
+ FROM applis_def AS a
+ INNER JOIN profile_education_degree_enum AS d ON (FIND_IN_SET(d.degree, a.type));
+
+INSERT INTO profile_education_enum (id, name, url)
+ SELECT id, text, url
+ FROM applis_def;
+
+INSERT INTO profile_education (id, uid, eduid, degreeid)
+ SELECT a.ordre, a.uid, a.aid, d.id
+ FROM applis_ins AS a
+ INNER JOIN profile_education_degree_enum AS d ON (a.type = d.degree);
+
+ UPDATE watch_profile AS w1
+ INNER JOIN watch_profile AS w2 ON (w1.uid = w2.uid AND w1.field = 'appli1' AND w2.field = 'appli2')
+ SET w1.ts = IF(w1.ts > w2.ts, w1.ts, w2.ts), w2.ts = IF(w1.ts > w2.ts, w1.ts, w2.ts);
+
+INSERT IGNORE INTO watch_profile (uid, ts, field)
+ SELECT uid, ts, 'appli1'
+ FROM watch_profile
+ WHERE field = 'appli2';
+
+ALTER TABLE watch_profile MODIFY field enum('nom', 'freetext', 'mobile', 'nationalite', 'nationalite2',
+ 'nationalite3', 'nick', 'web', 'networking', 'appli1', 'appli2',
+ 'edus', 'addresses', 'section', 'binets', 'medals', 'cv', 'jobs',
+ 'photo');
+
+UPDATE watch_profile SET field = 'edus' WHERE field = 'appli1';
+
+DELETE FROM watch_profile WHERE field = 'appli2';
+
+ALTER TABLE watch_profile MODIFY field enum('nom', 'freetext', 'mobile', 'nationalite', 'nationalite2',
+ 'nationalite3', 'nick', 'web', 'networking', 'edus', 'addresses',
+ 'section', 'binets', 'medals', 'cv', 'jobs', 'photo');
+
+# vim:set syntax=mysql:
+
--- /dev/null
+CREATE TABLE IF NOT EXISTS profile_corps (
+ uid INT(11) NOT NULL,
+ original_corpsid INT(4) UNSIGNED NOT NULL DEFAULT 0,
+ current_corpsid INT(4) UNSIGNED NOT NULL DEFAULT 0,
+ rankid INT(4) UNSIGNED NOT NULL DEFAULT 0,
+ corps_pub ENUM('private', 'ax', 'public') NOT NULL DEFAULT 'private',
+ PRIMARY KEY(uid)
+) CHARSET=utf8;
+
+
+CREATE TABLE IF NOT EXISTS profile_corps_enum (
+ id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
+ name VARCHAR(255) NOT NULL DEFAULT '',
+ abbreviation CHAR(5) NOT NULL DEFAULT '',
+ still_exists TINYINT(1) UNSIGNED NOT NULL DEFAULT 1,
+ PRIMARY KEY(id),
+ UNIQUE KEY(name),
+ UNIQUE KEY(abbreviation)
+) CHARSET=utf8;
+
+
+CREATE TABLE IF NOT EXISTS profile_corps_rank_enum (
+ id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
+ name VARCHAR(255) NOT NULL DEFAULT '',
+ abbreviation CHAR(5) NOT NULL DEFAULT '',
+ PRIMARY KEY(id),
+ UNIQUE KEY(name),
+ UNIQUE KEY(abbreviation)
+) CHARSET=utf8;
+
+-- vim:set syntax=mysql:
--- /dev/null
+ALTER TABLE geoloc_pays ADD COLUMN license_plate CHAR(4) DEFAULT NULL;
+
+CREATE TEMPORARY TABLE IF NOT EXISTS tmp_update_geoloc_pays (
+ a2 CHAR(2) DEFAULT NULL,
+ code CHAR(4) DEFAULT NULL,
+ PRIMARY KEY(a2),
+ UNIQUE KEY(code)
+) CHARSET=utf8;
+
+INSERT IGNORE INTO tmp_update_geoloc_pays (a2, code)
+ VALUES ('AF', 'AFG'),
+ ('ZA', 'ZA'),
+ ('AL', 'AL'),
+ ('DZ', 'DZ'),
+ ('DE', 'D'),
+ ('AD', 'AND'),
+ ('AO', 'ANG'),
+ ('AG', 'AG'),
+ ('AN', 'NA'),
+ ('SA', 'KSA'),
+ ('AR', 'RA'),
+ ('AM', 'ARM'),
+ ('AU', 'AUS'),
+ ('AT', 'A'),
+ ('AZ', 'AZ'),
+ ('BS', 'BS'),
+ ('BH', 'BRN'),
+ ('BD', 'BD'),
+ ('BB', 'BDS'),
+ ('BY', 'BY'),
+ ('BE', 'B'),
+ ('BZ', 'BZ'),
+ ('BJ', 'DY'),
+ ('BM', ''),
+ ('BT', 'BHT'),
+ ('BO', 'BOL'),
+ ('BA', 'BIH'),
+ ('BW', 'RB'),
+ ('BR', 'BR'),
+ ('BN', 'BRU'),
+ ('BG', 'BG'),
+ ('BF', 'BF'),
+ ('BI', 'BU'),
+ ('KH', 'K'),
+ ('CM', 'CAM'),
+ ('CA', 'CDN'),
+ ('CV', 'CV'),
+ ('CF', 'RCA'),
+ ('CG', 'CGO'),
+ ('CL', 'RCH'),
+ ('CN', 'CN'),
+ ('CY', 'CY'),
+ ('CO', 'CO'),
+ ('KM', 'COM'),
+ ('CG', 'RCB'),
+ ('CD', 'CD'),
+ ('KR', 'ROK'),
+ ('KP', 'DVRK'),
+ ('CR', 'CR'),
+ ('CI', 'CI'),
+ ('HR', 'HR'),
+ ('CU', 'C'),
+ ('DK', 'DK'),
+ ('DJ', 'DJI'),
+ ('DO', 'DOM'),
+ ('DM', 'WD'),
+ ('EG', 'ET'),
+ ('SV', 'ES'),
+ ('AE', 'UAE'),
+ ('EC', 'EC'),
+ ('ER', 'ER'),
+ ('ES', 'E'),
+ ('EE', 'EST'),
+ ('US', 'USA'),
+ ('ET', 'ETH'),
+ ('FO', 'FR'),
+ ('FJ', 'FJI'),
+ ('FI', 'FIN'),
+ ('FR', 'F'),
+ ('GA', 'G'),
+ ('GM', 'WAG'),
+ ('GE', 'GE'),
+ ('GH', 'GH'),
+ ('GI', 'GBZ'),
+ ('GR', 'GR'),
+ ('GD', 'WG'),
+ ('GL', 'KN'),
+ ('GT', 'GCA'),
+ ('GN', 'RG'),
+ ('GQ', 'GQ'),
+ ('GY', 'GUY'),
+ ('HT', 'RH'),
+ ('HN', 'HN'),
+ ('HK', 'HK'),
+ ('HU', 'H'),
+ ('VG', 'BVI'),
+ ('IN', 'IND'),
+ ('ID', 'RI'),
+ ('IR', 'IR'),
+ ('IQ', 'IRQ'),
+ ('IE', 'IRL'),
+ ('IS', 'IS'),
+ ('IL', 'IL'),
+ ('IT', 'I'),
+ ('JM', 'JA'),
+ ('JP', 'J'),
+ ('JO', 'JOR'),
+ ('KZ', 'KZ'),
+ ('KE', 'EAK'),
+ ('KG', 'KS'),
+ ('KI', 'KIR'),
+ ('KW', 'KWT'),
+ ('LA', 'LAO'),
+ ('LS', 'LS'),
+ ('LV', 'LV'),
+ ('LB', 'RL'),
+ ('LR', 'LB'),
+ ('LY', 'LAR'),
+ ('LI', 'FL'),
+ ('LT', 'LT'),
+ ('LU', 'L'),
+ ('MK', 'MK'),
+ ('MG', 'RM'),
+ ('MY', 'MAL'),
+ ('MW', 'MW'),
+ ('MV', 'MV'),
+ ('ML', 'RMM'),
+ ('MT', 'M'),
+ ('MA', 'MA'),
+ ('MH', 'MH'),
+ ('MU', 'MS'),
+ ('MR', 'RIM'),
+ ('MX', 'MEX'),
+ ('FM', 'FSM'),
+ ('MD', 'MD'),
+ ('MC', 'MC'),
+ ('MN', 'MGL'),
+ ('MZ', 'MOC'),
+ ('MM', 'MYA'),
+ ('NA', 'NAM'),
+ ('NR', 'NAU'),
+ ('NP', 'NEP'),
+ ('NI', 'NIC'),
+ ('NE', 'RN'),
+ ('NG', 'WAN'),
+ ('NO', 'N'),
+ ('NZ', 'NZ'),
+ ('OM', 'OM'),
+ ('UG', 'EAU'),
+ ('UZ', 'UZ'),
+ ('PK', 'PK'),
+ ('PW', 'PAL'),
+ ('PS', 'PS'),
+ ('PA', 'PA'),
+ ('PG', 'PNG'),
+ ('PY', 'PY'),
+ ('NL', 'NL'),
+ ('PE', 'PE'),
+ ('PH', 'RP'),
+ ('PL', 'PL'),
+ ('PT', 'P'),
+ ('QA', 'Q'),
+ ('RE', 'RE'),
+ ('RO', 'RO'),
+ ('GB', 'GB'),
+ ('RU', 'RUS'),
+ ('RW', 'RWA'),
+ ('LC', 'WL'),
+ ('KN', 'SCN'),
+ ('SM', 'RSM'),
+ ('VA', 'V'),
+ ('VC', 'WV'),
+ ('SB', 'SOL'),
+ ('WS', 'WS'),
+ ('ST', 'STP'),
+ ('SN', 'SN'),
+ ('CS', 'SCG'),
+ ('SC', 'SY'),
+ ('SL', 'WAL'),
+ ('SG', 'SGP'),
+ ('SK', 'SK'),
+ ('SI', 'SLO'),
+ ('SO', 'SP'),
+ ('SD', 'SUD'),
+ ('LK', 'CL'),
+ ('SE', 'S'),
+ ('CH', 'CH'),
+ ('SR', 'SME'),
+ ('SZ', 'SD'),
+ ('SY', 'SYR'),
+ ('TJ', 'TJ'),
+ ('TW', 'RC'),
+ ('TZ', 'EAT'),
+ ('TD', 'TCH'),
+ ('CZ', 'CZ'),
+ ('TH', 'THA'),
+ ('TL', 'TL'),
+ ('TG', 'RT'),
+ ('TO', 'TO'),
+ ('TT', 'TT'),
+ ('TN', 'TN'),
+ ('TM', 'TM'),
+ ('TR', 'TR'),
+ ('TV', 'TUV'),
+ ('UA', 'UA'),
+ ('UY', 'ROU'),
+ ('VU', 'VU'),
+ ('VE', 'YV'),
+ ('VN', 'VN'),
+ ('YE', 'YAR'),
+ ('YU', 'YU'),
+ ('ZM', 'Z'),
+ ('ZW', 'ZW');
+
+ UPDATE geoloc_pays AS g
+INNER JOIN tmp_update_geoloc_pays AS t ON (t.a2 = g.a2)
+ SET g.license_plate = t.code;
+
+-- vim:set syntax=mysql:
--- /dev/null
+<?php
+/***************************************************************************
+ * Copyright (C) 2003-2008 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 *
+ ***************************************************************************/
+
+ini_set('include_path', dirname(__FILE__).'/../../include:' . dirname(__FILE__).'/../../classes:/usr/share/php');
+
+require_once 'xorg.inc.php';
+require_once 'xdb.php';
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+?>
--- /dev/null
+#!/usr/bin/php5
+<?php
+require_once 'connect.db.inc.php';
+require_once 'profil.func.inc.php';
+
+$globals->debug = 0; //do not store backtraces
+
+// Convert phone prefixes from varchar to int
+$prefixes = XDB::iterRow("SELECT a2, phoneprf FROM geoloc_pays WHERE phoneprf IS NOT NULL");
+while (list($id, $pref) = $prefixes->next()) {
+ $pref = preg_replace('/[^0-9]/', '', $pref);
+ if ($pref[0] == '1') {
+ $pref = '1';
+ }
+ if ($pref[0] == '7') {
+ $pref = '7';
+ }
+ if ($pref != '' && strlen($pref) < 4) {
+ XDB::execute("UPDATE geoloc_pays SET tmp_phoneprf = {?} WHERE a2 = {?}", $pref, $id);
+ }
+}
+
+// geoloc_pays post operations
+// Drops old prfix column
+XDB::execute("ALTER TABLE geoloc_pays DROP COLUMN phoneprf");
+// Renames temporary column
+XDB::execute("ALTER TABLE geoloc_pays CHANGE COLUMN tmp_phoneprf phoneprf smallint unsigned NULL AFTER nat");
+// Adds an index on phoneprf column
+XDB::execute("ALTER TABLE geoloc_pays ADD INDEX (phoneprf)");
+// Adds French phone prefix
+XDB::execute("UPDATE geoloc_pays SET phoneprf = '33' WHERE a2 = 'FR'");
+// Adds some phone formats
+XDB::execute("UPDATE geoloc_pays SET phoneformat = '0# ## ## ## ##' WHERE phoneprf = '33'"); //France
+XDB::execute("UPDATE geoloc_pays SET phoneformat = '(+p) ### ### ####' WHERE phoneprf = '1'"); //USA and NANP countries
+
+
+
+//Phone number import
+
+$warnings = 0;
+
+// Import from auth_user_quick
+echo "\nImporting mobile phone numbers from auth_user_quick...\n";
+$phones = XDB::iterRow("SELECT user_id, profile_mobile_pub, profile_mobile FROM auth_user_quick WHERE profile_mobile <> ''");
+while (list($uid, $pub, $phone) = $phones->next()) {
+ $fmt_phone = format_phone_number($phone);
+ if ($fmt_phone != '') {
+ $display = format_display_number($fmt_phone, $error);
+ if (!XDB::execute("INSERT INTO profile_phones (uid, link_type, link_id, tel_id, tel_type, search_tel, display_tel, pub)
+ VALUES ({?}, 'user', 0, 0, 'mobile', {?}, {?}, {?})", $uid, $fmt_phone, $display, $pub)) {
+ echo "WARNING: insert of profile mobile phone number failed for user $uid.\n";
+ $warnings++;
+ }
+ }
+}
+
+
+// Import from entreprises
+echo "\nImporting professional phone numbers from entreprises...\n";
+$phones = XDB::iterator("SELECT uid, entrid, tel, fax, mobile, tel_pub FROM entreprises ORDER BY uid");
+while ($row = $phones->next()) {
+ $request = "INSERT INTO profile_phones (uid, link_type, link_id, tel_id, tel_type, search_tel, display_tel, pub)
+ VALUES ({?}, 'pro', {?}, {?}, {?}, {?}, {?}, {?})";
+ $fmt_fixed = format_phone_number($row['tel']);
+ $fmt_mobile = format_phone_number($row['mobile']);
+ $fmt_fax = format_phone_number($row['fax']);
+ if ($fmt_fixed != '') {
+ $disp_fixed = format_display_number($fmt_fixed, $error);
+ if (!XDB::execute($request, $row['uid'], $row['entrid'], 0, 'fixed', $fmt_fixed, $disp_fixed, $row['tel_pub'])) {
+ echo 'WARNING: insert of professional fixed phone number failed for user ' . $row['uid'] . ' and entreprise ' . $row['entrid'] . ".\n";
+ $warnings++;
+ }
+ }
+ if ($fmt_mobile != '') {
+ $disp_mobile = format_display_number($fmt_mobile, $error);
+ if (!XDB::execute($request, $row['uid'], $row['entrid'], 1, 'mobile', $fmt_mobile, $disp_mobile, $row['tel_pub'])) {
+ echo 'WARNING: insert of professional mobile number failed for user ' . $row['uid'] . ' and entreprise ' . $row['entrid'] . ".\n";
+ $warnings++;
+ }
+ }
+ if ($fmt_fax != '') {
+ $disp_fax = format_display_number($fmt_fax, $error);
+ if (!XDB::execute($request, $row['uid'], $row['entrid'], 2, 'fax', $fmt_fax, $disp_fax, $row['tel_pub'])) {
+ echo 'WARNING: insert of professional fax number failed for user ' . $row['uid'] . ' and entreprise ' . $row['entrid'] . ".\n";
+ $warnings++;
+ }
+ }
+}
+
+
+//import from tels
+echo "\nImporting personnal phone numbers from tels...\n";
+$phones = XDB::iterator("SELECT uid, adrid, telid, tel_type, tel_pub, tel FROM tels");
+$conversions = array();
+$autre_count = 0;
+while ($row = $phones->next()) {
+ $fmt_phone = format_phone_number($row['tel']);
+ if ($fmt_phone != '') {
+ $display = format_display_number($fmt_phone, $error);
+ $guess_type = guess_phone_type($row['tel_type'], $fmt_phone);
+
+ switch ($guess_type) {
+ case 'fixed':
+ case 'fax':
+ case 'mobile':
+ if (!XDB::execute("INSERT INTO profile_phones (uid, link_type, link_id, tel_id, tel_type, search_tel, display_tel, pub)
+ VALUES ({?}, 'address', {?}, {?}, {?}, {?}, {?}, {?})",
+ $row['uid'], $row['adrid'], $row['telid'], $guess_type, $fmt_phone, $display, $row['tel_pub'])) {
+ echo 'WARNING: insert of address phone number failed for user ' . $row['uid'] . ', address ' . $row['adrid']
+ . ' and telephone id ' . $row['telid'] . ".\n";
+ $warnings++;
+ } else {
+ if ($row['tel_type'] == 'Autre') {
+ $autre_count++;
+ } else if (!isset($conversions[$row['tel_type']])) {
+ $conversions[$row['tel_type']] = $guess_type;
+ }
+ }
+ break;
+ case 'conflict':
+ echo 'WARNING: conflict for user ' . $row['uid'] . ', address ' . $row['adrid']
+ . ' and telephone id ' . $row['telid'] . ': type = "' . $row['tel_type']
+ . '", number = "' .$fmt_phone . "\"\n";
+ $warnings++;
+ break;
+ case 'unknown':
+ default:
+ echo 'WARNING: unknown phone type (' . $row['tel_type'] . ') for user ' . $row['uid'] . ', address ' . $row['adrid']
+ . ' and telephone id ' . $row['telid'] . "\n";
+ $warnings++;
+ }
+ }
+}
+
+echo "\nSummary of automatic phone type conversion\n";
+foreach ($conversions as $old => $new) {
+ echo "* $old => $new\n";
+}
+echo "There was also $autre_count conversions from old type 'Autre' to a new one determined by the phone number.\n";
+
+
+
+//end of import
+if ($warnings) {
+ echo "\n----------------------------------------------------------------------\n"
+ . " There is $warnings phone numbers that couldn't be imported.\n"
+ . " They need to be manually inserted.\n";
+}
+echo "\nAfter solving any import problem and checking automatic conversions,\n"
+ . "you can drop useless columns and tables by these requests:\n"
+ . "DROP TABLE IF EXISTS `tels`;\n"
+ . "ALTER TABLE `auth_user_quick` DROP COLUMN `profile_mobile`;\n"
+ . "ALTER TABLE `auth_user_quick` DROP COLUMN `profile_mobile_pub`;\n"
+ . "ALTER TABLE `entreprises` DROP COLUMN `tel`;\n"
+ . "ALTER TABLE `entreprises` DROP COLUMN `fax`;\n"
+ . "ALTER TABLE `entreprises` DROP COLUMN `mobile`;\n"
+ . "ALTER TABLE `entreprises` DROP COLUMN `tel_pub`;\n";
+
+
+// auxilliary functions
+
+function guess_phone_type($str_type, $phone)
+{
+ $str_type = strtolower(trim($str_type));
+
+ // special case for phone type 'autre', guessing by phone number
+ if ($str_type == 'autre') {
+ if (substr($phone, 3) == '336') {
+ return 'mobile';
+ } else {
+ return 'fixed';
+ }
+ }
+
+ if ((strpos($str_type, 'mob') !== false) || (strpos($str_type, 'cell') !== false) || (strpos($str_type, 'port') !== false)) || (strpos($str_type, 'ptb') !== false) {
+ if (substr($phone, 3) == '336' || substr($phone, 2) != '33') {
+ return 'mobile'; //for France check if number is a mobile one
+ } else {
+ return 'conflict';
+ }
+ }
+ if (strpos($str_type, 'fax') !== false) {
+ if (substr($phone, 3) == '336') {
+ return 'conflict';
+ } else {
+ return 'fax';
+ }
+ }
+ if ((strpos($str_type, 'fixe') !== false) || (strpos($str_type, 'tél') !== false) || (strpos($str_type, 'tel') !== false) || (strpos($str_type, 'free') !== false)) {
+ if (substr($phone, 3) == '336') {
+ return 'conflict';
+ } else {
+ return 'fixed';
+ }
+ }
+
+ return 'unknown';
+}
+
+/* vim:set et sw=4 sts=4 ts=4: */
+?>
--- /dev/null
+#!/bin/bash
+
+. ../inc/pervasive.sh
+
+mailman_stop
+mailman_templates
+mailman_start
+
+
+###########################################################
+for sql in *.sql
+do
+ echo -n $sql
+ $MYSQL x4dat < $sql &>/dev/null || echo -n " ERROR"
+ echo .
+done
+
+###########################################################
+
+echo "Importing phone numbers"
+
+./phones.php
+
+###########################################################
+
+echo "we will now upgrade the search table (this may be a long operation)
+
+please hit ^D to continue
+"
+
+cat
+
+pushd ../../bin
+./search.rebuild_db.php
+popd
+
+###########################################################
+