X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fprofile.php;h=d9b55b076aa640cd92a37cae24f3dd6d157f5e39;hb=51c2c63a898801a7a6839f7b08313c12ddd1c47f;hp=21bf56d8fa82a937ea41f8ad622c0908c17a0811;hpb=5acd53a92dd25277adee3f8736d14c9ae4876ed1;p=platal.git diff --git a/classes/profile.php b/classes/profile.php index 21bf56d..d9b55b0 100644 --- a/classes/profile.php +++ b/classes/profile.php @@ -1,6 +1,6 @@ 'Noms', + 'nationality1' => 'Nationalité', + 'nationality2' => '2e nationalité', + 'nationality3' => '3e nationalité', + 'promo_display' => 'Promotion affichée', + 'email_directory' => 'Email annuaire papier', + 'networking' => 'Messageries…', + 'tels' => 'Téléphones', + 'edus' => 'Formations', + 'promo' => 'Promotion de sortie', + 'birthdate' => 'Date de naissance', + 'yourself' => 'Nom affiché', + 'freetext' => 'Commentaire', + 'freetext_pub' => 'Affichage du commentaire', + 'photo' => 'Photographie', + 'photo_pub' => 'Affichage de la photographie', + 'addresses' => 'Adresses', + 'corps' => 'Corps', + 'cv' => 'CV', + 'jobs' => 'Emplois', + 'section' => 'Section', + 'binets' => 'Binets', + 'medals' => 'Décorations', + 'medals_pub' => 'Affichage des décorations', + 'competences' => 'Compétences', + 'langues' => 'Langues', + 'expertise' => 'Expertises (mentoring)', + 'terms' => 'Compétences (mentoring)', + 'countries' => 'Pays (mentoring)' + ); + private $fetched_fields = 0x000000; private $pid; @@ -486,17 +518,19 @@ class Profile { if ($this->has_photo) { if ($data && ($this->photo == null || $this->photo->mimeType == null)) { - $res = XDB::fetchOneAssoc('SELECT attach, attachmime, x, y + $res = XDB::fetchOneAssoc('SELECT attach, attachmime, x, y, last_update FROM profile_photos WHERE pid = {?}', $this->pid); - $this->photo = PlImage::fromData($res['attach'], $res['attachmime'], $res['x'], $res['y']); + $this->photo = PlImage::fromData($res['attach'], 'image/' .$res['attachmime'], $res['x'], $res['y'], $res['last_update']); } else if ($this->photo == null) { $this->photo = PlImage::fromData(null, null, $this->photo_width, $this->photo_height); } return $this->photo; } else if ($fallback) { - return PlImage::fromFile(dirname(__FILE__).'/../htdocs/images/none.png', - 'image/png'); + if ($this->mainEducation() == 'X') { + return PlImage::fromFile(dirname(__FILE__) . '/../htdocs/images/none_x.png', 'image/png'); + } + return PlImage::fromFile(dirname(__FILE__) . '/../htdocs/images/none_md.png', 'image/png'); } return null; } @@ -538,11 +572,15 @@ class Profile public function getMainAddress() { - $addr = $this->getAddresses(self::ADDRESS_PERSO | self::ADDRESS_MAIN); - if (count($addr) == 0) { - return null; + $main = $this->getAddresses(self::ADDRESS_MAIN); + $perso = $this->getAddresses(self::ADDRESS_PERSO); + + if (count($main)) { + return array_pop($main); + } else if (count($perso)) { + return array_pop($perso); } else { - return array_pop($addr); + return null; } } @@ -805,6 +843,24 @@ class Profile return ($isOk && ($maxlen > 2 || $maxlen == strlen($_lastname))); } + /* Export to JSON + */ + public function export() + { + return array( + 'hrpid' => $this->hrid(), + 'display_name' => $this->shortName(), + 'full_name' => $this->fullName(), + 'directory_name' => $this->directory_name, + 'promo' => $this->promo(), + 'year_promo' => $this->yearpromo(), + 'is_active' => $this->isActive(), + 'first_name' => $this->firstName(), + 'last_name' => $this->lastName(), + 'is_female' => $this->isFemale(), + ); + } + private static function fetchProfileData(array $pids, $respect_order = true, $fields = 0x0000, $visibility = null) { if (count($pids) == 0) { @@ -1007,45 +1063,61 @@ class Profile } } - public static function rebuildSearchTokens($pids) + public static function rebuildSearchTokens($pids, $transaction = true) { if (!is_array($pids)) { $pids = array($pids); } - $keys = XDB::iterator("SELECT n.pid, CONCAT(n.particle, n.name) AS name, e.score, - IF(FIND_IN_SET('public', e.flags), 'public', '') AS public - FROM profile_name AS n - INNER JOIN profile_name_enum AS e ON (n.typeid = e.id) - WHERE n.pid IN {?}", - $pids); - + $keys = XDB::iterator("(SELECT n.pid AS pid, n.name AS name, e.score AS score, + IF(FIND_IN_SET('public', e.flags), 'public', '') AS public + FROM profile_name AS n + INNER JOIN profile_name_enum AS e ON (n.typeid = e.id) + WHERE n.pid IN {?} AND NOT FIND_IN_SET('not_displayed', e.flags)) + UNION + (SELECT n.pid AS pid, n.particle AS name, 0 AS score, + IF(FIND_IN_SET('public', e.flags), 'public', '') AS public + FROM profile_name AS n + INNER JOIN profile_name_enum AS e ON (n.typeid = e.id) + WHERE n.pid IN {?} AND NOT FIND_IN_SET('not_displayed', e.flags)) + ", + $pids, $pids); $names = array(); while ($key = $keys->next()) { if ($key['name'] == '') { continue; } $pid = $key['pid']; - $toks = preg_split('/[ \'\-]+/', $key['name']); + $toks = preg_split('/[ \'\-]+/', strtolower(replace_accent($key['name'])), + -1, PREG_SPLIT_NO_EMPTY); + $toks = array_reverse($toks); + + /* Split the score between the tokens to avoid the user to be over-rated. + * Let says my user name is "Machin-Truc Bidule" and I also have a user named + * 'Machin Truc'. Distributing the score force "Machin Truc" to be displayed + * before "Machin-Truc" for both "Machin Truc" and "Machin" searches. + */ + $eltScore = ceil(((float)$key['score'])/((float)count($toks))); $token = ''; - $first = 5; - while ($toks) { - $token = strtolower(replace_accent(array_pop($toks) . $token)); - $score = ($toks ? 0 : 10 + $first) * ($key['score'] / 10); + foreach ($toks as $tok) { + $token = $tok . $token; $names["$pid-$token"] = XDB::format('({?}, {?}, {?}, {?}, {?})', $token, $pid, soundex_fr($token), - $score, $key['public']); - $first = 0; + $eltScore, $key['public']); } } - XDB::startTransaction(); + if ($transaction) { + XDB::startTransaction(); + } XDB::execute('DELETE FROM search_name WHERE pid IN {?}', $pids); if (count($names) > 0) { - XDB::execute('INSERT INTO search_name (token, pid, soundex, score, flags) - VALUES ' . implode(', ', $names)); + XDB::rawExecute('INSERT INTO search_name (token, pid, soundex, score, flags) + VALUES ' . implode(', ', $names)); + } + if ($transaction) { + XDB::commit(); } - XDB::commit(); } /** The school identifier consists of 6 digits. The first 3 represent the