}
// }}}
+// {{{ class UFC_AccountType
+/** Filters users who have the given account types
+ */
+class UFC_AccountType implements UserFilterCondition
+{
+ private $types;
+
+ public function __construct()
+ {
+ $this->types = pl_flatten(func_get_args());
+ }
+
+ public function buildCondition(PlFilter &$uf)
+ {
+ $uf->requireAccounts();
+ return XDB::format('a.type IN {?}', $this->types);
+ }
+}
+
// {{{ class UFC_Hruid
/** Filters users based on their hruid
* @param $val Either an hruid, or a list of those
public function buildCondition(PlFilter &$uf)
{
$uf->requireProfiles();
- return 'p.freetext ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->text);
+ return $uf->getVisibilityCondition('p.freetext_pub') . ' AND p.freetext ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->text);
}
}
// }}}
public function buildCondition(PlFilter &$uf)
{
+ // Groups have AX visibility.
+ if ($uf->getVisibilityLevel() == ProfileVisibility::VIS_PUBLIC) {
+ return PlFilter::COND_TRUE;
+ }
$sub = $uf->addGroupFilter($this->group);
$where = 'gpm' . $sub . '.perms IS NOT NULL';
if ($this->anim) {
public function buildCondition(PlFilter &$uf)
{
+ // Binets are private.
+ if ($uf->getVisibilityLevel() != ProfileVisibility::VIS_PRIVATE) {
+ return PlFilter::COND_TRUE;
+ }
$sub = $uf->addBinetsFilter();
return XDB::format($sub . '.binet_id IN {?}', $this->val);
}
public function buildCondition(PlFilter &$uf)
{
+ // Sections are private.
+ if ($uf->getVisibilityLevel() != ProfileVisibility::VIS_PRIVATE) {
+ return PlFilter::COND_TRUE;
+ }
$uf->requireProfiles();
return XDB::format('p.section IN {?}', $this->section);
}
$this->flags = $flags;
}
- protected function initConds($sub)
+ protected function initConds($sub, $vis_cond)
{
- $conds = array();
+ $conds = array($vis_cond);
+
$types = array();
foreach (self::$typetexts as $flag => $type) {
if ($flag & $this->type) {
public function buildCondition(PlFilter &$uf)
{
$sub = $uf->addAddressFilter();
- $conds = $this->initConds($sub);
+ $conds = $this->initConds($sub, $uf->getVisibilityCondition($sub . '.pub'));
if ($this->text != null) {
$conds[] = $sub . '.text' . $this->mkMatch($this->text);
}
public function buildCondition(PlFilter &$uf)
{
$sub = $uf->addAddressFilter();
- $conds = $this->initConds($sub);
+ $conds = $this->initConds($sub, $uf->getVisibilityCondition($sub . '.pub'));
switch ($this->fieldtype) {
case self::FIELD_COUNTRY:
*/
$sub = $uf->addCorpsFilter($this->type);
$cond = $sub . '.abbreviation = ' . $corps;
+ $cond .= ' AND ' . $uf->getVisibilityCondition($sub . '.corps_pub');
return $cond;
}
}
public function buildCondition(PlFilter &$uf)
{
/** Tables shortcuts:
+ * pc for profile_corps
* pcr for profile_corps_rank
*/
$sub = $uf->addCorpsRankFilter();
$cond = $sub . '.abbreviation = ' . $rank;
+ // XXX(x2006barrois): find a way to get rid of that hardcoded
+ // reference to 'pc'.
+ $cond .= ' AND ' . $uf->getVisibilityCondition('pc.corps_pub');
return $cond;
}
}
{
$sub = $uf->addJobCompanyFilter();
$cond = $sub . '.' . $this->type . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->value);
+ $jsub = $uf->addJobFilter();
+ $cond .= ' AND ' . $uf->getVisibilityCondition($jsub . '.pub');
return $cond;
}
}
public function buildCondition(PlFilter &$uf)
{
$sub = $uf->addJobSectorizationFilter($this->type);
- return $sub . '.id = ' . XDB::format('{?}', $this->val);
+ $cond = $sub . '.id = ' . XDB::format('{?}', $this->val);
+ $jsub = $uf->addJobFilter();
+ $cond .= ' AND ' . $uf->getVisibilityCondition($jsub . '.pub');
+ return $cond;
+ }
+}
+// }}}
+
+// {{{ class UFC_Job_Terms
+/** Filters users based on the job terms they assigned to one of their
+ * jobs.
+ * @param $val The ID of the job term, or an array of such IDs
+ */
+class UFC_Job_Terms implements UserFilterCondition
+{
+ private $val;
+
+ public function __construct($val)
+ {
+ if (!is_array($val)) {
+ $val = array($val);
+ }
+ $this->val = $val;
+ }
+
+ public function buildCondition(PlFilter &$uf)
+ {
+ $sub = $uf->addJobTermsFilter(count($this->val));
+ $conditions = array();
+ foreach ($this->val as $i => $jtid) {
+ $conditions[] = $sub[$i] . '.jtid_1 = ' . XDB::escape($jtid);
+ }
+ $jsub = $uf->addJobFilter();
+ $conditions[] = $uf->getVisibilityCondition($jsub . '.pub');
+ return implode(' AND ', $conditions);
}
}
// }}}
public function buildCondition(PlFilter &$uf)
{
$conds = array();
+
+ $jsub = $uf->addJobFilter();
+ // CV is private => if only CV requested, and not private,
+ // don't do anything. Otherwise restrict to standard job visibility.
+ if ($this->fields == UserFilter::JOB_CV) {
+ if ($uf->getVisibilityLevel() != ProfileVisibility::VIS_PRIVATE) {
+ return PlFilter::COND_TRUE;
+ }
+ } else {
+ $conds[] = $uf->getVisibilityCondition($jsub . '.pub');
+ }
+
if ($this->fields & UserFilter::JOB_USERDEFINED) {
- $sub = $uf->addJobFilter();
- $conds[] = $sub . '.description ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description);
+ $conds[] = $jsub . '.description ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description);
}
- if ($this->fields & UserFilter::JOB_CV) {
+ if ($this->fields & UserFilter::JOB_CV && $uf->getVisibilityLevel == ProfileVisibility::VIS_PRIVATE) {
$uf->requireProfiles();
$conds[] = 'p.cv ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description);
}
{
$sub = $uf->addNetworkingFilter();
$conds = array();
+ $conds[] = $uf->getVisibilityCondition($sub . '.pub');
$conds[] = $sub . '.address ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->value);
if ($this->type != -1) {
$conds[] = $sub . '.nwid = ' . XDB::format('{?}', $this->type);
{
$sub = $uf->addPhoneFilter();
$conds = array();
+
+ $conds[] = $uf->getVisibilityCondition($sub . '.pub');
+
$conds[] = $sub . '.search_tel = ' . XDB::format('{?}', $this->number);
if ($this->num_type != self::NUM_ANY) {
$conds[] = $sub . '.link_type = ' . XDB::format('{?}', $this->num_type);
public function buildCondition(PlFilter &$uf)
{
$conds = array();
+
+ // This will require profiles => table 'p' will be available.
$sub = $uf->addMedalFilter();
+
+ $conds[] = $uf->getVisibilityCondition('p.medals_pub');
+
$conds[] = $sub . '.mid = ' . XDB::format('{?}', $this->medal);
if ($this->grade != null) {
$conds[] = $sub . '.gid = ' . XDB::format('{?}', $this->grade);
{
public function buildCondition(PlFilter &$uf)
{
- $uf->addPhotoFilter();
- return 'photo.attach IS NOT NULL';
+ $sub = $uf->addPhotoFilter();
+ return $sub . '.attach IS NOT NULL AND ' . $uf->getVisibilityCondition($sub . '.pub');
+ }
+}
+// }}}
+
+// {{{ class UFC_Mentor
+class UFC_Mentor implements UserFilterCondition
+{
+ public function buildCondition(PlFilter &$uf)
+ {
+ $sub = $uf->addMentorFilter(UserFilter::MENTOR);
+ return $sub . '.expertise IS NOT NULL';
}
}
// }}}
+
// {{{ class UFC_Mentor_Expertise
/** Filters users by mentoring expertise
* @param $expertise Domain of expertise
}
// }}}
+// {{{ class UFC_Mentor_Terms
+/** Filters users based on the job terms they used in mentoring.
+ * @param $val The ID of the job term, or an array of such IDs
+ */
+class UFC_Mentor_Terms implements UserFilterCondition
+{
+ private $val;
+
+ public function __construct($val)
+ {
+ $this->val = $val;
+ }
+
+ public function buildCondition(PlFilter &$uf)
+ {
+ $sub = $uf->addMentorFilter(UserFilter::MENTOR_TERM);
+ return $sub . '.jtid_1 = ' . XDB::escape($this->val);
+ }
+}
+// }}}
+
// {{{ class UFC_Mentor_Sectorization
/** Filters users based on mentoring (sub|)sector
* @param $sector ID of (sub)sector
private $query = null;
private $orderby = null;
+ // Store the current 'search' visibility.
+ private $profile_visibility = null;
+
private $lastusercount = null;
private $lastprofilecount = null;
}
}
}
+
+ // This will set the visibility to the default correct level.
+ $this->profile_visibility = new ProfileVisibility();
+ }
+
+ public function getVisibilityLevels()
+ {
+ return $this->profile_visibility->levels();
+ }
+
+ public function getVisibilityLevel()
+ {
+ return $this->profile_visibility->level();
+ }
+
+ public function restrictVisibilityTo($level)
+ {
+ $this->profile_visibility->setLevel($level);
+ }
+
+ public function getVisibilityCondition($field)
+ {
+ return $field . ' IN ' . XDB::formatArray($this->getVisibilityLevels());
}
private function buildQuery()
* pjsse => profile_job_subsector_enum
* pjssse => profile_job_subsubsector_enum
* pja => profile_job_alternates
+ * pjt => profile_job_terms
*/
private $with_pj = false;
private $with_pje = false;
private $with_pjsse = false;
private $with_pjssse = false;
private $with_pja = false;
+ private $with_pjt = 0;
public function addJobFilter()
{
}
}
+ /**
+ * Adds a filter on job terms of profile.
+ * @param $nb the number of job terms to use
+ * @return an array of the fields to filter (one for each term).
+ */
+ public function addJobTermsFilter($nb = 1)
+ {
+ $this->with_pjt = $nb;
+ $jobtermstable = array();
+ for ($i = 1; $i <= $nb; ++$i) {
+ $jobtermstable[] = 'pjtr_'.$i;
+ }
+ return $jobtermstable;
+ }
+
protected function jobJoins()
{
$joins = array();
if ($this->with_pja) {
$joins['pja'] = PlSqlJoin::left('profile_job_alternates', '$ME.subsubsectorid = pj.subsubsectorid');
}
+ if ($this->with_pjt > 0) {
+ for ($i = 1; $i <= $this->with_pjt; ++$i) {
+ $joins['pjt_'.$i] = PlSqlJoin::left('profile_job_term', '$ME.pid = $PID');
+ $joins['pjtr_'.$i] = PlSqlJoin::left('profile_job_term_relation', '$ME.jtid_2 = pjt_'.$i.'.jtid');
+ }
+ }
return $joins;
}
*/
private $pms = array();
- const MENTOR_EXPERTISE = 1;
- const MENTOR_COUNTRY = 2;
- const MENTOR_SECTOR = 3;
+ private $mjtr = false;
+ const MENTOR = 1;
+ const MENTOR_EXPERTISE = 2;
+ const MENTOR_COUNTRY = 3;
+ const MENTOR_SECTOR = 4;
+ const MENTOR_TERM = 5;
public function addMentorFilter($type)
{
$this->requireAccounts();
switch($type) {
+ case self::MENTOR:
+ $this->pms['pm'] = 'profile_mentor';
+ return 'pm';
case self::MENTOR_EXPERTISE:
$this->pms['pme'] = 'profile_mentor';
return 'pme';
case self::MENTOR_SECTOR:
$this->pms['pms'] = 'profile_mentor_sector';
return 'pms';
+ case self::MENTOR_TERM:
+ $this->pms['pmt'] = 'profile_mentor_term';
+ $this->mjtr = true;
+ return 'mjtr';
default:
Platal::page()->killError("Undefined mentor filter.");
}
foreach ($this->pms as $sub => $tab) {
$joins[$sub] = PlSqlJoin::left($tab, '$ME.pid = $PID');
}
+ if ($this->mjtr) {
+ $joins['mjtr'] = PlSqlJoin::left('profile_job_term_relation', '$ME.jtid_2 = pmt.jtid');
+ }
return $joins;
}
{
$this->requireProfiles();
$this->with_photo = true;
+ return 'photo';
}
protected function photoJoins()