From: Raphaël Barrois Date: Mon, 22 Mar 2010 18:35:19 +0000 (+0100) Subject: Update visibility model, apply to photo fetching X-Git-Tag: xorg/1.0.0~332^2~6 X-Git-Url: http://git.polytechnique.org/?a=commitdiff_plain;h=1a9affb739c4fb36894dac6fa8a8c36b74eb6e58;p=platal.git Update visibility model, apply to photo fetching Signed-off-by: Raphaël Barrois --- diff --git a/classes/profile.php b/classes/profile.php index 951e6f2..4a5033d 100644 --- a/classes/profile.php +++ b/classes/profile.php @@ -19,15 +19,69 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ***************************************************************************/ -class Profile +class ProfileVisibility { - static private $v_values = array('public' => array('public'), - 'ax' => array('ax', 'public'), - 'private' => array('private', 'ax', 'public')); + 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; - const VISIBILITY_PUBLIC = 'public'; - const VISIBILITY_AX = 'ax'; - const VISIBILITY_PRIVATE = 'private'; + 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 +{ /* name tokens */ const LASTNAME = 'lastname'; @@ -105,46 +159,7 @@ class Profile $this->data = $data; $this->pid = $this->data['pid']; $this->hrpid = $this->data['hrpid']; - if (!S::logged()) { - $this->setVisibilityLevel(self::VISIBILITY_PUBLIC); - } else { - $this->setVisibilityLevel(self::VISIBILITY_PRIVATE); - } - } - - static private $contexts = array(); - - /** Returns the best visibility context toward $visibility - * @param $visibility A wished visibility level - * @return An array of compatible visibilities - * - * if $visibility is null, the best visibility is returned - */ - static public function getVisibilityContext($visibility = null) - { - if (array_key_exists($visibility, self::$contexts)) { - return self::$contexts[$visibility]; - } - - $asked_vis = $visibility; - - if (S::logged()) { - $minvis = self::VISIBILITY_PRIVATE; - } else { - $minvis = self::VISIBILITY_PUBLIC; - } - if ($visibility == null) { - $visibility = $minvis; - } - - if ($minvis == self::VISIBILITY_PUBLIC) { - $visibility = self::VISIBILITY_PUBLIC; - } - - $visibility = self::$v_values[$visibility]; - self::$contexts[$asked_vis] = $visibility; - - return $visibility; + $this->visibility = new ProfileVisibility(); } public function id() @@ -284,19 +299,11 @@ class Profile /** Sets the level of visibility of the profile * Sets $this->visibility to a list of valid visibilities. - * @param one of the self::VISIBILITY_* values + * @param one of the self::VIS_* values */ public function setVisibilityLevel($visibility) { - if ($visibility != self::VISIBILITY_PRIVATE - && $visibility != self::VISIBILITY_AX - && $visibility != self::VISIBILITY_PUBLIC) { - Platal::page()->kill("Visibility invalide: " . $visibility); - } - $this->visibility = self::$v_values[$visibility]; - if ($this->mobile && !in_array($this->mobile_pub, $this->visibility)) { - unset($this->data['mobile']); - } + $this->visibility->setLevel($visibility); } /** Determine whether an item with visibility $visibility can be displayed @@ -305,12 +312,7 @@ class Profile */ public function isVisible($visibility) { - return in_array($visibility, $this->visibility); - } - - public static function getCompatibleVisibilities($visibility) - { - return self::$v_values[$visibility]; + return $this->visibility->isVisible($visibility); } private function getProfileField($cls) @@ -339,23 +341,19 @@ class Profile /* Photo */ - private $_photo = null; + private $photo = null; public function getPhoto($fallback = true, $data = false) { - if ($data && $this->has_photo && $this->isVisible($this->photo_pub) && - ($this->_photo == null || $this->_photo->mimeType() == null)) { - $res = XDB::fetchOneAssoc('SELECT attach, attachmime, x, y + if ($this->has_photo) { + if ($data && ($this->photo == null || $this->photo->mimeType == null)) { + $res = XDB::fetchOneAssoc('SELECT attach, attachmime, x, y FROM profile_photos WHERE pid = {?}', $this->pid); - $this->_photo = PlImage::fromData($res['attach'], $res['attachmime'], $res['x'], $res['y']); - } - - if (!$data && $this->_photo == null) { - $this->_photo = PlImage::fromData(null, null, $this->photo_width, $this->photo_height); - } - - if ($this->has_photo && $this->isVisible($this->photo_pub)) { - return $this->_photo; + $this->photo = PlImage::fromData($res['attach'], $res['attachmime'], $res['x'], $res['y']); + } 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'); @@ -592,14 +590,15 @@ class Profile $order = ''; } + $visibility = new ProfileVisibility($visibility); $it = XDB::Iterator('SELECT p.*, p.sex = \'female\' AS sex, pe.entry_year, pe.grad_year, pse.text AS section, 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.attach IS NOT NULL AS has_photo, ph.pub AS photo_pub, + pd.directory_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, pm.expertise AS mentor_expertise, @@ -624,7 +623,7 @@ class Profile 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) . ' GROUP BY p.pid - ' . $order); + ' . $order, $visibility->levels(), $visibility->levels()); return new ProfileIterator($it, $pids, $fields, $visibility); } @@ -665,7 +664,9 @@ class Profile public static function get($login, $fields = 0x0000, $visibility = null) { if (is_array($login)) { - return new Profile($login); + $pf = new Profile($login); + $pf->setVisibilityLevel($visibility); + return $pf; } $pid = self::getPID($login); if (!is_null($pid)) { @@ -696,7 +697,7 @@ class Profile /** Return profiles for the list of pids. */ - public static function getBulkProfilesWithPIDs(array $pids, $fields = self::FETCH_ADDRESSES, $visibility = null) + public static function getBulkProfilesWithPIDs(array $pids, $fields = 0x0000, $visibility = null) { if (count($pids) == 0) { return array(); @@ -829,12 +830,18 @@ class ProfileIterator implements PlIterator { private $iterator = null; private $fields; + private $visibility; - public function __construct(PlIterator $it, array $pids, $fields = 0x0000, $visibility = null) + public function __construct(PlIterator $it, array $pids, $fields = 0x0000, ProfileVisibility $visibility = null) { require_once 'profilefields.inc.php'; - $visibility = Profile::getVisibilityContext($visibility); + + if ($visibility == null) { + $visibility = new ProfileVisibility(); + } + $this->fields = $fields; + $this->visibility = $visibility; $subits = array(); $callbacks = array(); @@ -889,6 +896,8 @@ class ProfileIterator implements PlIterator private function fillProfile(array $vals) { $pf = Profile::get($vals[0]); + $pf->setVisibilityLevel($this->visibility->level()); + if ($this->hasData(Profile::FETCH_PHONES, $vals)) { $pf->setPhones($vals[Profile::FETCH_PHONES]); } diff --git a/include/profilefields.inc.php b/include/profilefields.inc.php index 5641072..26d73a1 100644 --- a/include/profilefields.inc.php +++ b/include/profilefields.inc.php @@ -36,12 +36,12 @@ abstract class ProfileField * @return a PlIterator yielding data suitable for a "new ProfileBlah($data)" * XXX MUST be reimplemented for each kind of ProfileField */ - public static function fetchData(array $pids, $visibility) + public static function fetchData(array $pids, ProfileVisibility $visibility) { return PlIteratorUtils::emptyIterator(); } - public static function buildForPID($cls, $pid, $visibility) + public static function buildForPID($cls, $pid, ProfileVisibility $visibility) { $res = self::buildFromPIDs($cls, array($pid), $visibility); return array_pop($res); @@ -53,7 +53,7 @@ abstract class ProfileField * @param $visibility An array of allowed visibility contexts * @return An array of $pid => ProfileField */ - public static function buildFromPIDs($cls, array $pids, $visibility) + public static function buildFromPIDs($cls, array $pids, ProfileVisibility $visibility) { $it = new ProfileFieldIterator($cls, $pids, $visibility); $res = array(); @@ -63,7 +63,7 @@ abstract class ProfileField return $res; } - public static function getForPID($cls, $pid, $visibility) + public static function getForPID($cls, $pid, ProfileVisibility $visibility) { $it = new ProfileFieldIterator($cls, array($pid), $visibility); return $it->next(); @@ -77,7 +77,7 @@ class ProfileFieldIterator implements PlIterator private $data; private $cls; - public function __construct($cls, array $pids, $visibility) + public function __construct($cls, array $pids, ProfileVisibility $visibility) { $this->data = call_user_func(array($cls, 'fetchData'), $pids, $visibility); $this->cls = $cls; @@ -327,7 +327,6 @@ class ProfileEducation extends ProfileField public function __construct(PlInnerSubIterator $it) { $this->pid = $it->value(); - $this->visibility = Profile::VISIBILITY_PUBLIC; while ($edu = $it->next()) { $this->educations[$edu['id']] = new Education($edu); } @@ -361,7 +360,7 @@ class ProfileEducation extends ProfileField return $educations; } - public static function fetchData(array $pids, $visibility) + public static function fetchData(array $pids, ProfileVisibility $visibility) { $data = XDB::iterator('SELECT pe.id, pe.pid, pe.entry_year, pe.grad_year, pe.program, pe.flags, @@ -396,7 +395,7 @@ class ProfileMedals extends ProfileField } } - public static function fetchData(array $pids, $visibility) + public static function fetchData(array $pids, ProfileVisibility $visibility) { $data = XDB::iterator('SELECT pm.pid, pm.mid, pm.gid, pme.text, pme.img FROM profile_medals AS pm @@ -404,7 +403,7 @@ class ProfileMedals extends ProfileField LEFT JOIN profile_medal_enum AS pme ON (pme.id = pm.mid) WHERE pm.pid IN {?} AND p.medals_pub IN {?} ORDER BY ' . XDB::formatCustomOrder('pm.pid', $pids), - $pids, $visibility); + $pids, $visibility->levels()); return PlIteratorUtils::subIterator($data, PlIteratorUtils::arrayValueCallback('pid')); } @@ -422,14 +421,14 @@ class ProfileNetworking extends ProfileField } } - public static function fetchData(array $pids, $visibility) + public static function fetchData(array $pids, ProfileVisibility $visibility) { $data = XDB::iterator('SELECT pid, nwid, address, network_type FROM profile_networking WHERE pid IN {?} AND pub IN {?} ORDER BY ' . XDB::formatCustomOrder('pid', $pids) . ', network_type, nwid', - $pids, $visibility); + $pids, $visibility->levels()); return PlIteratorUtils::subIterator($data, PlIteratorUtils::arrayValueCallback('pid')); } @@ -479,7 +478,7 @@ class ProfileCorps extends ProfileField } } - public static function fetchData(array $pids, $visibility) + public static function fetchData(array $pids, ProfileVisibility $visibility) { $data = XDB::iterator('SELECT pc.pid, pc.original_corpsid AS original, pc.current_corpsid AS current, pceo.name AS original_name, pceo.abbreviation AS original_abbrev, @@ -494,7 +493,7 @@ class ProfileCorps extends ProfileField LEFT JOIN profile_corps_rank_enum AS pcrec ON (pcrec.id = pc.rankid) WHERE pc.pid IN {?} AND pc.corps_pub IN {?} ORDER BY ' . XDB::formatCustomOrder('pid', $pids), - $pids, $visibility); + $pids, $visibility->levels()); return $data; } @@ -549,7 +548,7 @@ class ProfileAddresses extends ProfileField return $res; } - public static function fetchData(array $pids, $visibility) + public static function fetchData(array $pids, ProfileVisibility $visibility) { $data = XDB::iterator('SELECT pa.id, pa.pid, pa.flags, pa.type AS link_type, IF(pa.type = \'home\', pid, jobid) AS link_id, @@ -563,7 +562,7 @@ class ProfileAddresses extends ProfileField LEFT JOIN geoloc_countries AS gc ON (gc.iso_3166_1_a2 = pa.countryId) WHERE pa.pid in {?} AND pa.pub IN {?} ORDER BY ' . XDB::formatCustomOrder('pid', $pids), - $pids, $visibility); + $pids, $visibility->levels()); return PlIteratorUtils::subIterator($data, PlIteratorUtils::arrayValueCallback('pid')); } @@ -606,13 +605,13 @@ class ProfilePhones extends ProfileField return $phones; } - public static function fetchData(array $pids, $visibility) + public static function fetchData(array $pids, ProfileVisibility $visibility) { $data = XDB::iterator('SELECT tel_type AS type, search_tel AS search, display_tel AS display, link_type, comment FROM profile_phones WHERE pid IN {?} AND pub IN {?} ORDER BY ' . XDB::formatCustomOrder('pid', $pids), - $pids, $visibility); + $pids, $visibility->levels()); return PlIteratorUtils::subIterator($data, PlIteratorUtils::arrayValueCallback('pid')); } } @@ -630,7 +629,7 @@ class ProfileJobs extends ProfileField } } - public static function fetchData(array $pids, $visibility) + public static function fetchData(array $pids, ProfileVisibility $visibility) { CompanyList::preload($pids); $data = XDB::iterator('SELECT pj.id, pj.pid, pj.description, pj.url as user_site, @@ -644,7 +643,7 @@ class ProfileJobs extends ProfileField WHERE pj.pid IN {?} AND pj.pub IN {?} ORDER BY ' . XDB::formatCustomOrder('pid', $pids) . ', pj.id', - $visibility, $pids, $visibility); + $visibility->levels(), $pids, $visibility->levels()); return PlIteratorUtils::subIterator($data, PlIteratorUtils::arrayValueCallback('pid')); }