X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fprofile.php;h=d3a1fddf3964f6cf998a9271b700bf06d5c5ef33;hb=c76545c351fae4e2298624ff9ee5bf854dc5a5b6;hp=9aeef1dec1f49e185bf078e21ffa81de2cb8dd49;hpb=7a8da8e83d51f52bad9d84273437b6f8e494c921;p=platal.git diff --git a/classes/profile.php b/classes/profile.php index 9aeef1d..d3a1fdd 100644 --- a/classes/profile.php +++ b/classes/profile.php @@ -19,64 +19,6 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ***************************************************************************/ -class ProfileVisibility -{ - static private $v_values = array(self::VIS_PUBLIC => array(self::VIS_PUBLIC), - self::VIS_AX => array(self::VIS_AX, self::VIS_PUBLIC), - self::VIS_PRIVATE => array(self::VIS_PRIVATE, self::VIS_AX, self::VIS_PUBLIC)); - - const VIS_PUBLIC = 'public'; - const VIS_AX = 'ax'; - const VIS_PRIVATE = 'private'; - - private $level; - - public function __construct($level = null) - { - $this->setLevel($level); - } - - public function setLevel($level = self::VIS_PUBLIC) - { - if ($level != null && $level != self::VIS_PRIVATE && $level != self::VIS_AX && $level != self::VIS_PUBLIC) { - Platal::page()->kill("Invalid visibility: " . $level); - } - - if (!S::logged()) { - $level = self::VIS_PUBLIC; - } else if ($level == null) { - $level = self::VIS_PRIVATE; - } - - if ($this->level == null || $this->level == self::VIS_PRIVATE) { - $this->level = $level; - } else if ($this->level == self::VIS_AX && $level == self::VIS_PRIVATE) { - return; - } else { - $this->level = self::VIS_PUBLIC; - } - } - - public function level() - { - if ($this->level == null) { - return self::VIS_PUBLIC; - } else { - return $this->level; - } - } - - public function levels() - { - return self::$v_values[$this->level()]; - } - - public function isVisible($visibility) - { - return in_array($visibility, $this->levels()); - } -} - class Profile { @@ -111,27 +53,40 @@ class Profile self::FIRSTNAME => array(self::VN_ORDINARY, self::VN_INI, self::VN_OTHER) ); - const ADDRESS_MAIN = 0x000001; - const ADDRESS_PERSO = 0x000002; - const ADDRESS_PRO = 0x000004; - const ADDRESS_ALL = 0x000006; - const ADDRESS_POSTAL = 0x000008; - - const EDUCATION_MAIN = 0x000010; - const EDUCATION_EXTRA = 0x000020; - const EDUCATION_ALL = 0x000040; - const EDUCATION_FINISHED = 0x000080; - const EDUCATION_CURRENT = 0x000100; - - const JOBS_MAIN = 0x001000; - const JOBS_ALL = 0x002000; - const JOBS_FINISHED = 0x004000; - const JOBS_CURRENT = 0x008000; - - const NETWORKING_ALL = 0x000000; - const NETWORKING_WEB = 0x010000; - const NETWORKING_IM = 0x020000; - const NETWORKING_SOCIAL = 0x040000; + const ADDRESS_MAIN = 0x00000001; + const ADDRESS_PERSO = 0x00000002; + const ADDRESS_PRO = 0x00000004; + const ADDRESS_ALL = 0x00000006; + const ADDRESS_POSTAL = 0x00000008; + + const EDUCATION_MAIN = 0x00000010; + const EDUCATION_EXTRA = 0x00000020; + const EDUCATION_ALL = 0x00000040; + const EDUCATION_FINISHED = 0x00000080; + const EDUCATION_CURRENT = 0x00000100; + + const JOBS_MAIN = 0x00001000; + const JOBS_ALL = 0x00002000; + const JOBS_FINISHED = 0x00004000; + const JOBS_CURRENT = 0x00008000; + + const NETWORKING_ALL = 0x00070000; + const NETWORKING_WEB = 0x00010000; + const NETWORKING_IM = 0x00020000; + const NETWORKING_SOCIAL = 0x00040000; + + const PHONE_LINK_JOB = 0x00100000; + const PHONE_LINK_ADDRESS = 0x00200000; + const PHONE_LINK_PROFILE = 0x00400000; + const PHONE_LINK_COMPANY = 0x00800000; + const PHONE_LINK_ANY = 0x00F00000; + + const PHONE_TYPE_FAX = 0x01000000; + const PHONE_TYPE_FIXED = 0x02000000; + const PHONE_TYPE_MOBILE = 0x04000000; + const PHONE_TYPE_ANY = 0x07000000; + + const PHONE_ANY = 0x07F00000; const FETCH_ADDRESSES = 0x000001; const FETCH_CORPS = 0x000002; @@ -142,10 +97,12 @@ class Profile const FETCH_MENTOR_SECTOR = 0x000040; const FETCH_MENTOR_COUNTRY = 0x000080; const FETCH_PHONES = 0x000100; + const FETCH_JOB_TERMS = 0x000200; + const FETCH_MENTOR_TERMS = 0x000400; const FETCH_MINIFICHES = 0x00012D; // FETCH_ADDRESSES | FETCH_EDU | FETCH_JOBS | FETCH_NETWORKING | FETCH_PHONES - const FETCH_ALL = 0x0001FF; // OR of FETCH_* + const FETCH_ALL = 0x0007FF; // OR of FETCH_* private $fetched_fields = 0x000000; @@ -185,6 +142,14 @@ class Profile return $this->owner; } + public function isActive() + { + if ($this->owner()) { + return $this->owner->isActive(); + } + return false; + } + public function promo() { return $this->promo; @@ -358,14 +323,15 @@ class Profile public function nationalities() { $nats = array(); + $countries = DirEnum::getOptions(DirEnum::COUNTRIES); if ($this->nationality1) { - $nats[] = $this->nationality1; + $nats[$this->nationality1] = $countries[$this->nationality1]; } if ($this->nationality2) { - $nats[] = $this->nationality2; + $nats[$this->nationality2] = $countries[$this->nationality2]; } if ($this->nationality3) { - $nats[] = $this->nationality3; + $nats[$this->nationality3] = $countries[$this->nationality3]; } return $nats; } @@ -398,6 +364,36 @@ class Profile } + /** + * Clears a profile. + * *always deletes in: profile_addresses, profile_binets, profile_job, + * profile_langskills, profile_mentor, profile_networking, + * profile_phones, profile_skills, watch_profile + * *always keeps in: profile_corps, profile_display, profile_education, + * profile_medals, profile_name, profile_photos, search_name + * *modifies: profiles + */ + public function clear() + { + $tables = array( + 'profile_job', 'profile_langskills', 'profile_mentor', + 'profile_networking', 'profile_skills', 'watch_profile', + 'profile_phones', 'profile_addresses', 'profile_binets'); + + foreach ($tables as $t) { + XDB::execute('DELETE FROM ' . $t . ' + WHERE pid = {?}', + $this->id()); + } + + XDB::execute("UPDATE profiles + SET cv = NULL, freetext = NULL, freetext_pub = 'private', + medals_pub = 'private', alias_pub = 'private', + email_directory = NULL + WHERE pid = {?}", + $this->id()); + } + /** Sets the level of visibility of the profile * Sets $this->visibility to a list of valid visibilities. * @param one of the self::VIS_* values @@ -427,6 +423,8 @@ class Profile $this->fetched_fields = $fields; } + /** Have we already fetched this field ? + */ private function fetched($field) { if (!array_key_exists($field, ProfileField::$fields)) { @@ -442,6 +440,9 @@ class Profile */ private function getProfileField($field) { + if (!array_key_exists($field, ProfileField::$fields)) { + Platal::page()->kill("Invalid field: $field"); + } if ($this->fetched($field)) { return null; } else { @@ -457,6 +458,7 @@ class Profile */ private function consolidateFields() { + // Link phones to addresses if ($this->phones != null) { if ($this->addresses != null) { $this->addresses->addPhones($this->phones); @@ -467,9 +469,15 @@ class Profile } } + // Link addresses to jobs if ($this->addresses != null && $this->jobs != null) { $this->jobs->addAddresses($this->addresses); } + + // Link jobterms to jobs + if ($this->jobs != null && $this->jobterms != null) { + $this->jobs->addJobTerms($this->jobterms); + } } /* Photo @@ -503,14 +511,20 @@ class Profile $this->consolidateFields(); } - public function getAddresses($flags, $limit = null) + private function fetchAddresses() { if ($this->addresses == null && !$this->fetched(self::FETCH_ADDRESSES)) { $addr = $this->getProfileField(self::FETCH_ADDRESSES); if ($addr) { $this->setAddresses($addr); + $this->fetchPhones(); } } + } + + public function getAddresses($flags, $limit = null) + { + $this->fetchAddresses(); if ($this->addresses == null) { return array(); @@ -542,12 +556,19 @@ class Profile $this->consolidateFields(); } - public function getPhones($flags, $limit = null) + private function fetchPhones() { if ($this->phones == null && !$this->fetched(self::FETCH_PHONES)) { - $this->setPhones($this->getProfileField(self::FETCH_PHONES)); + $phones = $this->getProfileField(self::FETCH_PHONES); + if (isset($phones)) { + $this->setPhones($phones); + } } + } + public function getPhones($flags, $limit = null) + { + $this->fetchPhones(); if ($this->phones == null) { return array(); } @@ -637,14 +658,20 @@ class Profile $this->consolidateFields(); } - public function getJobs($flags, $limit = null) + private function fetchJobs() { if ($this->jobs == null && !$this->fetched(self::FETCH_JOBS)) { $jobs = $this->getProfileField(self::FETCH_JOBS); if ($jobs) { $this->setJobs($jobs); + $this->fetchAddresses(); } } + } + + public function getJobs($flags, $limit = null) + { + $this->fetchJobs(); if ($this->jobs == null) { return array(); @@ -661,6 +688,15 @@ class Profile return array_pop($job); } + /** JobTerms + */ + private $jobterms = null; + public function setJobTerms(ProfileJobTerms $jobterms) + { + $this->jobterms = $jobterms; + $this->consolidateFields(); + } + /* Mentoring */ private $mentor_sectors = null; @@ -701,6 +737,34 @@ class Profile } } + /** List of job terms to specify mentoring */ + private $mentor_terms = null; + /** + * set job terms to specify mentoring + * @param $terms a ProfileMentoringTerms object listing terms only for this profile + */ + public function setMentoringTerms(ProfileMentoringTerms $terms) + { + $this->mentor_terms = $terms; + } + /** + * get all job terms that specify mentoring + * @return an array of JobTerms objects + */ + public function getMentoringTerms() + { + if ($this->mentor_terms == null && !$this->fetched(self::FETCH_MENTOR_TERMS)) { + $this->setMentoringTerms($this->getProfileField(self::FETCH_MENTOR_TERMS)); + } + + if ($this->mentor_terms == null) { + return array(); + } else { + return $this->mentor_terms->get(); + } + } + + /* Binets */ public function getBinets() @@ -779,16 +843,18 @@ class Profile $it = XDB::Iterator('SELECT p.pid, p.hrpid, p.xorg_id, p.ax_id, p.birthdate, p.birthdate_ref, p.next_birthday, p.deathdate, p.deathdate_rec, p.sex = \'female\' AS sex, - p.cv, p.medals_pub, p.alias_pub, p.email_directory, p.last_change, - p.nationality1, p.nationality2, p.nationality3, + IF ({?}, p.cv, NULL) AS cv, p.medals_pub, p.alias_pub, p.email_directory, + p.last_change, p.nationality1, p.nationality2, p.nationality3, IF (p.freetext_pub IN {?}, p.freetext, NULL) AS freetext, pe.entry_year, pe.grad_year, - IF ({?} IN {?}, pse.text, NULL) AS section, - pn_f.name AS firstname, pn_l.name AS lastname, pn_n.name AS nickname, + IF ({?}, pse.text, NULL) AS section, + pn_f.name AS firstname, pn_l.name AS lastname, + IF( {?}, pn_n.name, NULL) 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, IF(pp.pub IN {?}, pp.display_tel, NULL) AS mobile, + pd.yourself, pd.promo, pd.short_name, pd.public_name AS full_name, + pd.directory_name, pd.public_name, pd.private_name, + IF(pp.pub IN {?}, pp.display_tel, NULL) AS mobile, (ph.pub IN {?} AND ph.attach IS NOT NULL) AS has_photo, ph.x AS photo_width, ph.y AS photo_height, p.last_change < DATE_SUB(NOW(), INTERVAL 365 DAY) AS is_old, @@ -815,9 +881,12 @@ class Profile WHERE p.pid IN {?} GROUP BY p.pid ' . $order, - $visibility->levels(), - ProfileVisibility::VIS_PRIVATE, $visibility->levels(), - $visibility->levels(), $visibility->levels(), + $visibility->isVisible(ProfileVisibility::VIS_PRIVATE), // CV + $visibility->levels(), // freetext + $visibility->isVisible(ProfileVisibility::VIS_PRIVATE), // section + $visibility->isVisible(ProfileVisibility::VIS_PRIVATE), // nickname + $visibility->levels(), // mobile + $visibility->levels(), // photo $pids ); return new ProfileIterator($it, $pids, $fields, $visibility); @@ -924,6 +993,26 @@ class Profile || $name == self::DN_SHORT || $name == self::DN_SORT; } + /** Returns the closest "accounts only" name type for $name + */ + public static function getAccountEquivalentName($name) + { + switch ($name) + { + case self::DN_DIRECTORY: + case self::DN_SORT: + return 'directory_name'; + case self::DN_FULL: + case self::DN_PUBLIC: + return 'full_name'; + case self::DN_PRIVATE: + case self::DN_SHORT: + case self::DN_YOURSELF: + default: + return 'display_name'; + } + } + public static function getNameTypeId($type, $for_sql = false) { if (!S::has('name_types')) { @@ -972,7 +1061,7 @@ class Profile /** The school identifier consists of 6 digits. The first 3 represent the * promotion entry year. The last 3 indicate the student's rank. - * + * * Our identifier consists of 8 digits and both half have the same role. * This enables us to deal with bigger promotions and with a wider range * of promotions. @@ -1028,6 +1117,8 @@ class ProfileIterator implements PlIterator private $fields; private $visibility; + const FETCH_ALL = 0x000033F; // FETCH_ADDRESSES | FETCH_CORPS | FETCH_EDU | FETCH_JOBS | FETCH_MEDALS | FETCH_NETWORKING | FETCH_PHONES | FETCH_JOB_TERMS + public function __construct(PlIterator $it, array $pids, $fields = 0x0000, ProfileVisibility $visibility = null) { require_once 'profilefields.inc.php'; @@ -1046,39 +1137,12 @@ class ProfileIterator implements PlIterator $callbacks[0] = PlIteratorUtils::arrayValueCallback('pid'); $cb = PlIteratorUtils::objectPropertyCallback('pid'); - if ($fields & Profile::FETCH_ADDRESSES) { - $callbacks[Profile::FETCH_ADDRESSES] = $cb; - $subits[Profile::FETCH_ADDRESSES] = new ProfileFieldIterator('ProfileAddresses', $pids, $visibility); - } - - if ($fields & Profile::FETCH_CORPS) { - $callbacks[Profile::FETCH_CORPS] = $cb; - $subits[Profile::FETCH_CORPS] = new ProfileFieldIterator('ProfileCorps', $pids, $visibility); - } - - if ($fields & Profile::FETCH_EDU) { - $callbacks[Profile::FETCH_EDU] = $cb; - $subits[Profile::FETCH_EDU] = new ProfileFieldIterator('ProfileEducation', $pids, $visibility); - } - - if ($fields & Profile::FETCH_JOBS) { - $callbacks[Profile::FETCH_JOBS] = $cb; - $subits[Profile::FETCH_JOBS] = new ProfileFieldIterator('ProfileJobs', $pids, $visibility); - } - - if ($fields & Profile::FETCH_MEDALS) { - $callbacks[Profile::FETCH_MEDALS] = $cb; - $subits[Profile::FETCH_MEDALS] = new ProfileFieldIterator('ProfileMedals', $pids, $visibility); - } - - if ($fields & Profile::FETCH_NETWORKING) { - $callbacks[Profile::FETCH_NETWORKING] = $cb; - $subits[Profile::FETCH_NETWORKING] = new ProfileFieldIterator('ProfileNetworking', $pids, $visibility); - } - - if ($fields & Profile::FETCH_PHONES) { - $callbacks[Profile::FETCH_PHONES] = $cb; - $subits[Profile::FETCH_PHONES] = new ProfileFieldIterator('ProfilePhones', $pids, $visibility); + $fields = $fields & self::FETCH_ALL; + for ($field = 1; $field < $fields; $field *= 2) { + if (($fields & $field) ) { + $callbacks[$field] = $cb; + $subits[$field] = new ProfileFieldIterator($field, $pids, $visibility); + } } $this->iterator = PlIteratorUtils::parallelIterator($subits, $callbacks, 0); @@ -1104,6 +1168,9 @@ class ProfileIterator implements PlIterator if ($this->hasData(Profile::FETCH_JOBS, $vals)) { $pf->setJobs($vals[Profile::FETCH_JOBS]); } + if ($this->hasData(Profile::FETCH_JOB_TERMS, $vals)) { + $pf->setJobTerms($vals[Profile::FETCH_JOB_TERMS]); + } if ($this->hasData(Profile::FETCH_CORPS, $vals)) { $pf->setCorps($vals[Profile::FETCH_CORPS]);