X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fprofile.php;h=cdd639d23079058bd17f0e17c43608580fbf950e;hb=69ef14a5ffac8efea722ccb8e412e11b3e6d98d9;hp=f1dc23d328fc6f11d8d76c99d085eb5cd9305553;hpb=69b46857922681dd612d78a65edbe625e47d605c;p=platal.git diff --git a/classes/profile.php b/classes/profile.php index f1dc23d..cdd639d 100644 --- a/classes/profile.php +++ b/classes/profile.php @@ -113,6 +113,11 @@ class Profile return $this->promo; } + public function yearpromo() + { + return intval(substr($this->promo, 1, 4)); + } + /** Print a name with the given formatting: * %s = • for women * %f = firstname @@ -125,9 +130,9 @@ class Profile { return str_replace(array('%s', '%f', '%l', '%F', '%S', '%p'), array($this->isFemale() ? '•' : '', - $this->first_name, $this->last_name, - $this->full_name, $this->short_name, - $this->promo), $format); + $this->firstName(), $this->lastName(), + $this->fullName(), $this->shortName(), + $this->promo()), $format); } public function fullName($with_promo = false) @@ -190,6 +195,21 @@ class Profile return array_unique($vals); } + public function nationalities() + { + $nats = array(); + if ($this->nationality1) { + $nats[] = $this->nationality1; + } + if ($this->nationality2) { + $nats[] = $this->nationality2; + } + if ($this->nationality3) { + $nats[] = $this->nationality3; + } + return $nats; + } + public function __get($name) { if (property_exists($this, $name)) { @@ -208,6 +228,10 @@ class Profile return property_exists($this, $name) || isset($this->data[$name]); } + /** Sets the level of visibility of the profile + * Sets $this->visibility to a list of valid visibilities. + * @param one of the self::VISIBILITY_* values + */ public function setVisibilityLevel($visibility) { if ($visibility != self::VISIBILITY_PRIVATE @@ -221,21 +245,27 @@ class Profile } } + /** Determine whether an item with visibility $visibility can be displayed + * with the current level of visibility of the profile + * @param $visibility The level of visibility to be checked + */ + public function isVisible($visibility) + { + return in_array($visibility, $this->visibility); + } /* Photo */ public function getPhoto($fallback = true) { - /* TODO: migrate photo table to profile_photo, change uid to pid - */ $cond = ''; if ($this->visibility) { - $cond = ' AND pub IN ' . XDB::formatArray($this->visibility); + $cond = XDB::format(' AND pub IN {?}', $this->visibility); } - $res = XDB::query('SELECT * + $res = XDB::query("SELECT * FROM profile_photos - WHERE attachmime IN (\'jpeg\', \'png\') - ' . $cond . ' AND pid = {?}', + WHERE attachmime IN ('jpeg', 'png') + " . $cond . ' AND pid = {?}', $this->id()); if ($res->numRows() > 0) { $photo = $res->fetchOneAssoc(); @@ -260,7 +290,7 @@ class Profile $where .= ' AND FIND_IN_SET(\'mail\', pa.flags)'; } if ($this->visibility) { - $where .= ' AND pa.pub IN ' . XDB::formatArray($this->visibility); + $where .= XDB::format(' AND pa.pub IN {?}', $this->visibility); } $type = array(); if ($flags & self::ADDRESS_PRO) { @@ -270,7 +300,7 @@ class Profile $type[] = 'home'; } if (count($type) > 0) { - $where .= ' AND pa.type IN ' . XDB::formatArray($type); + $where .= XDB::format(' AND pa.type IN {?}', $type); } $limit = is_null($limit) ? '' : XDB::format('LIMIT {?}', (int)$limit); return XDB::iterator('SELECT pa.text, pa.postalCode, pa.type, pa.latitude, pa.longitude, @@ -286,8 +316,8 @@ class Profile LEFT JOIN geoloc_administrativeareas AS ga ON (ga.id = pa.administrativeAreaId) LEFT JOIN geoloc_administrativeareas AS gas ON (gas.id = pa.subAdministrativeAreaId) LEFT JOIN geoloc_countries AS gc ON (gc.iso_3166_1_a2 = pa.countryId) - LEFT JOIN profile_phones AS ppfix ON (ppfix.link_type = \'address\' AND ppfix.uid = pa.pid AND ppfix.link_id = pa.id AND ppfix.tel_type = \'fixed\') - LEFT JOIN profile_phones AS ppfax ON (ppfax.link_type = \'address\' AND ppfax.uid = pa.pid AND ppfax.link_id = pa.id AND ppfax.tel_type = \'fax\') + LEFT JOIN profile_phones AS ppfix ON (ppfix.link_type = \'address\' AND ppfix.pid = pa.pid AND ppfix.link_id = pa.id AND ppfix.tel_type = \'fixed\') + LEFT JOIN profile_phones AS ppfax ON (ppfax.link_type = \'address\' AND ppfax.pid = pa.pid AND ppfax.link_id = pa.id AND ppfax.tel_type = \'fax\') WHERE ' . $where . ' ORDER BY pa.id ' . $limit); @@ -308,7 +338,7 @@ class Profile */ public function getEducations($flags, $limit = null) { - $where = XDB::format('pe.uid = {?}', $this->id()); + $where = XDB::format('pe.pid = {?}', $this->id()); if ($flags & self::EDUCATION_MAIN) { $where .= ' AND FIND_IN_SET(\'primary\', pe.flags)'; } else if ($flags & self::EDUCATION_EXTRA) { @@ -344,12 +374,12 @@ class Profile public function getNetworking($flags, $limit = null) { - $where = XDB::format('pn.uid = {?}', $this->id()); + $where = XDB::format('pn.pid = {?}', $this->id()); if ($flags & self::NETWORKING_WEB) { $where .= ' AND pn.network_type = 0'; // XXX hardcoded reference to web site index } if ($this->visibility) { - $where .= ' AND pn.pub IN ' . XDB::formatArray($this->visibility); + $where .= XDB::format(' AND pn.pub IN {?}', $this->visibility); } $limit = is_null($limit) ? '' : XDB::format('LIMIT {?}', (int)$limit); return XDB::iterator('SELECT pne.name, pne.icon, @@ -378,11 +408,11 @@ class Profile public function getJobs($flags, $limit = null) { - $where = XDB::format('pj.uid = {?}', $this->id()); + $where = XDB::format('pj.pid = {?}', $this->id()); $cond = 'TRUE'; if ($this->visibility) { - $where .= ' AND pj.pub IN ' . XDB::formatArray($this->visibility); - $cond = 'pj.email_pub IN ' . XDB::formatArray($this->visibility); + $where .= XDB::format(' AND pj.pub IN {?}', $this->visibility); + $cond = XDB::format('pj.email_pub IN {?}', $this->visibility); } $limit = is_null($limit) ? '' : XDB::format('LIMIT {?}', (int)$limit); return XDB::iterator('SELECT pje.name, pje.acronym, pje.url, pje.email, pje.NAF_code, @@ -414,8 +444,8 @@ class Profile public function getBinets() { return XDB::fetchColumn('SELECT binet_id - FROM binets_ins - WHERE user_id = {?}', $this->id()); + FROM profile_binets + WHERE pid = {?}', $this->id()); } @@ -424,6 +454,25 @@ class Profile return User::getSilent($this); } + public function compareNames($firstname, $lastname) + { + $_lastname = mb_strtoupper($this->lastName()); + $_firstname = mb_strtoupper($this->firstName()); + $lastname = mb_strtoupper($lastname); + $firstname = mb_strtoupper($firstname); + + $isOk = (mb_strtoupper($_firstname) == mb_strtoupper($firstname)); + $tokens = preg_split("/[ \-']/", $lastname, -1, PREG_SPLIT_NO_EMPTY); + $maxlen = 0; + + foreach ($tokens as $str) { + $isOk &= (strpos($_lastname, $str) !== false); + $maxlen = max($maxlen, strlen($str)); + } + + return ($isOk && ($maxlen > 2 || $maxlen == strlen($_lastname))); + } + private static function fetchProfileData(array $pids, $respect_order = true) { if (count($pids) == 0) { @@ -436,32 +485,35 @@ class Profile $order = ''; } + require_once 'directory.enums.inc.php'; return XDB::Iterator('SELECT p.*, p.sex = \'female\' AS sex, pe.entry_year, pe.grad_year, pn_f.name AS firstname, pn_l.name AS lastname, pn_n.name AS nickname, IF(pn_uf.name IS NULL, pn_f.name, pn_uf.name) AS firstname_ordinary, IF(pn_ul.name IS NULL, pn_l.name, pn_ul.name) AS lastname_ordinary, pd.promo AS promo, pd.short_name, pd.directory_name AS full_name, pd.directory_name, pp.display_tel AS mobile, pp.pub AS mobile_pub, - ph.pub AS photo_pub, ap.uid AS owner_id + ph.attach IS NOT NULL AS has_photo, ph.pub AS photo_pub, + p.last_change < DATE_SUB(NOW(), INTERVAL 365 DAY) AS is_old, + ap.uid AS owner_id FROM profiles AS p INNER JOIN profile_display AS pd ON (pd.pid = p.pid) - INNER JOIN profile_education AS pe ON (pe.uid = p.pid AND FIND_IN_SET(\'primary\', pe.flags)) - INNER JOIN profile_name AS pn_f ON (pn_f.pid = p.pid - AND pn_f.typeid = ' . self::getNameTypeId('firstname', true) . ') - INNER JOIN profile_name AS pn_l ON (pn_l.pid = p.pid - AND pn_l.typeid = ' . self::getNameTypeId('lastname', true) . ') - LEFT JOIN profile_name AS pn_uf ON (pn_uf.pid = p.pid - AND pn_uf.typeid = ' . self::getNameTypeId('firstname_ordinary', true) . ') - LEFT JOIN profile_name AS pn_ul ON (pn_ul.pid = p.pid - AND pn_ul.typeid = ' . self::getNameTypeId('lastname_ordinary', true) . ') - LEFT JOIN profile_name AS pn_n ON (pn_n.pid = p.pid - AND pn_n.typeid = ' . self::getNameTypeId('nickname', true) . ') - LEFT JOIN profile_phones AS pp ON (pp.uid = p.pid AND pp.link_type = \'user\' AND tel_type = \'mobile\') + INNER JOIN profile_education AS pe ON (pe.pid = p.pid AND FIND_IN_SET(\'primary\', pe.flags)) + INNER JOIN profile_name AS pn_f ON (pn_f.pid = p.pid AND pn_f.typeid = {?}) + INNER JOIN profile_name AS pn_l ON (pn_l.pid = p.pid AND pn_l.typeid = {?}) + LEFT JOIN profile_name AS pn_uf ON (pn_uf.pid = p.pid AND pn_uf.typeid = {?}) + LEFT JOIN profile_name AS pn_ul ON (pn_ul.pid = p.pid AND pn_ul.typeid = {?}) + LEFT JOIN profile_name AS pn_n ON (pn_n.pid = p.pid AND pn_n.typeid = {?}) + LEFT JOIN profile_phones AS pp ON (pp.pid = p.pid AND pp.link_type = \'user\' AND tel_type = \'mobile\') LEFT JOIN profile_photos AS ph ON (ph.pid = p.pid) LEFT JOIN account_profiles AS ap ON (ap.pid = p.pid AND FIND_IN_SET(\'owner\', ap.perms)) - WHERE p.pid IN ' . XDB::formatArray($pids) . ' + WHERE p.pid IN {?} GROUP BY p.pid - ' . $order); + ' . $order, + DirEnum::getID(DirEnum::NAMETYPES, 'firstname'), + DirEnum::getID(DirEnum::NAMETYPES, 'lastname'), + DirEnum::getID(DirEnum::NAMETYPES, 'firstname_ordinary'), + DirEnum::getID(DirEnum::NAMETYPES, 'lastname_ordinary'), + DirEnum::getID(DirEnum::NAMETYPES, 'nickname'), $pids); } public static function getPID($login) @@ -492,8 +544,8 @@ class Profile return XDB::fetchAllAssoc('uid', 'SELECT ap.uid, ap.pid FROM account_profiles AS ap WHERE FIND_IN_SET(\'owner\', ap.perms) - AND ap.uid IN ' . XDB::formatArray($uids) .' - ' . $order); + AND ap.uid IN {?} + ' . $order, $uids); } /** Return the profile associated with the given login. @@ -563,26 +615,10 @@ class Profile || $name == self::DN_SHORT || $name == self::DN_SORT; } - public static function getNameTypeId($type, $for_sql = false) - { - if (!S::has('name_types')) { - $table = XDB::fetchAllAssoc('type', 'SELECT id, type - FROM profile_name_enum'); - S::set('name_types', $table); - } else { - $table = S::v('name_types'); - } - if ($for_sql) { - return XDB::escape($table[$type]); - } else { - return $table[$type]; - } - } - public static function rebuildSearchTokens($pid) { XDB::execute('DELETE FROM search_name - WHERE uid = {?}', + WHERE pid = {?}', $pid); $keys = XDB::iterator("SELECT CONCAT(n.particle, n.name) AS name, e.score, FIND_IN_SET('public', e.flags) AS public @@ -601,9 +637,9 @@ class Profile while ($toks) { $token = strtolower(replace_accent(array_pop($toks) . $token)); $score = ($toks ? 0 : 10 + $first) * ($key['score'] / 10); - XDB::execute('REPLACE INTO search_name (token, uid, soundex, score, flags) + XDB::execute('REPLACE INTO search_name (token, pid, soundex, score, flags) VALUES ({?}, {?}, {?}, {?}, {?})', - $token, $uid, soundex_fr($token), $score, $key['public']); + $token, $pid, soundex_fr($token), $score, $key['public']); $first = 0; } } @@ -640,6 +676,10 @@ class Profile public static function getXorgId($schoolId) { + if (!preg_match('/^[0-9]{6}$/', $schoolId)) { + return null; + } + $year = intval(substr($schoolId, 0, 3)); $rank = intval(substr($schoolId, 3, 3));