X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fuserfilter%2Fconditions.inc.php;h=2ad8d1dd7ceed6587220a2439d73d09df5c4912e;hb=73317355964c4cd538157f8b281a1384b7e38e4d;hp=e931395d8f9c292e0a3e3dc52b61ce5de82c40d2;hpb=304cdf32d7c38afbd381909545021fc44c8a0e05;p=platal.git diff --git a/classes/userfilter/conditions.inc.php b/classes/userfilter/conditions.inc.php index e931395..2ad8d1d 100644 --- a/classes/userfilter/conditions.inc.php +++ b/classes/userfilter/conditions.inc.php @@ -1,6 +1,6 @@ requireProfiles(); - return $uf->getVisibilityCondition('p.freetext_pub') . ' AND p.freetext ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->text); + return $uf->getVisibilityConditionForField('p.freetext_pub') . ' AND p.freetext ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->text); } public function export() @@ -598,8 +598,15 @@ class UFC_NameInitial extends UserFilterCondition public function buildCondition(PlFilter $uf) { - $sub = $uf->addDisplayFilter(); - return 'SUBSTRING(pd.sort_name, 1, 1) ' . XDB::formatWildcards(XDB::WILDCARD_PREFIX, $this->initial); + $table = 'sort_name'; + if ($uf->accountsRequired()) { + $table = Profile::getAccountEquivalentName($table); + $sub = 'a'; + } else { + $uf->addDisplayFilter(); + $sub = 'pd'; + } + return 'SUBSTRING(' . $sub . '.' . $table . ', 1, 1) ' . XDB::formatWildcards(XDB::WILDCARD_PREFIX, $this->initial); } public function export() @@ -661,6 +668,7 @@ class UFC_NameTokens extends UserFilterCondition if ($this->general_type) { $c .= XDB::format(' AND ' . $sub . '.general_type = {?}', $this->general_type); } + $c .= ' AND (' . $uf->getVisibilityConditionAbsolute(Visibility::EXPORT_PRIVATE) . ' OR ' . $sub . '.general_type != \'nickname\')'; $conds[] = $c; } @@ -830,7 +838,7 @@ class UFC_NLSubscribed extends UserFilterCondition { private $nlid; private $issue_id; - public function __construct($nlid, $issue_id) + public function __construct($nlid, $issue_id = null) { $this->nlid = $nlid; $this->issue_id = $issue_id; @@ -839,7 +847,11 @@ class UFC_NLSubscribed extends UserFilterCondition public function buildCondition(PlFilter $uf) { $sub = $uf->addNewsLetterFilter($this->nlid); - return XDB::format($sub . '.last < {?}', $this->issue_id); + $cond = $sub . '.nlid IS NOT NULL'; + if (!is_null($this->issue_id)) { + $cond = XDB::format($cond . ' AND ( ' . $sub . '.last IS NULL OR ' . $sub . '.last < {?})', $this->issue_id); + } + return $cond; } } // }}} @@ -850,12 +862,19 @@ class UFC_NLSubscribed extends UserFilterCondition */ class UFC_Group extends UserFilterCondition { + const BOTH = 0; + const NOTIFIED = 1; + const UNNOTIFIED = 2; + private $group; private $anim; - public function __construct($group, $anim = false) + private $notified; + + public function __construct($group, $anim = false, $notified = self::BOTH) { $this->group = $group; $this->anim = $anim; + $this->notified = $notified; } public function buildCondition(PlFilter $uf) @@ -869,6 +888,10 @@ class UFC_Group extends UserFilterCondition if ($this->anim) { $where .= ' AND gpm' . $sub . '.perms = \'admin\''; } + if ($this->notified != self::BOTH) { + $where .= ' AND ' . ($this->notified == self::UNNOTIFIED ? 'NOT ' : '') + . "FIND_IN_SET('notify', gpm" . $sub . '.flags)'; + } return $where; } } @@ -912,12 +935,9 @@ class UFC_Binet extends UserFilterCondition public function buildCondition(PlFilter $uf) { - // Binets are private. - if ($uf->getVisibilityLevel() != ProfileVisibility::VIS_PRIVATE) { - return self::COND_TRUE; - } $sub = $uf->addBinetsFilter(); - return XDB::format($sub . '.binet_id IN {?}', $this->val); + // Binets are private. + return XDB::format($uf->getVisibilityConditionAbsolute(Visibility::EXPORT_PRIVATE) . ' AND ' . $sub . '.binet_id IN {?}', $this->val); } } // }}} @@ -937,11 +957,8 @@ class UFC_Section extends UserFilterCondition public function buildCondition(PlFilter $uf) { // Sections are private. - if ($uf->getVisibilityLevel() != ProfileVisibility::VIS_PRIVATE) { - return self::COND_TRUE; - } $uf->requireProfiles(); - return XDB::format('p.section IN {?}', $this->section); + return XDB::format($uf->getVisibilityConditionAbsolute(Visibility::EXPORT_PRIVATE) . ' AND p.section IN {?}', $this->section); } } // }}} @@ -964,7 +981,7 @@ class UFC_Email extends UserFilterCondition $cond = array(); if (count($this->emails) == 0) { - return PlFilterCondition::COND_TRUE; + return PlFilterCondition::COND_FALSE; } foreach ($this->emails as $entry) { @@ -1011,14 +1028,16 @@ abstract class UFC_Address extends UserFilterCondition /** Flags for addresses */ + const FLAG_NONE = 0x0000; const FLAG_CURRENT = 0x0001; const FLAG_TEMP = 0x0002; const FLAG_SECOND = 0x0004; const FLAG_MAIL = 0x0008; const FLAG_CEDEX = 0x0010; + const FLAG_AX_MAIL = 0x0020; // Binary OR of those flags - const FLAG_ANY = 0x001F; + const FLAG_ANY = 0x003F; /** Text of these flags */ @@ -1028,6 +1047,7 @@ abstract class UFC_Address extends UserFilterCondition self::FLAG_SECOND => 'secondary', self::FLAG_MAIL => 'mail', self::FLAG_CEDEX => 'cedex', + self::FLAG_AX_MAIL => 'ax_mail', ); protected $flags; @@ -1073,7 +1093,7 @@ abstract class UFC_Address extends UserFilterCondition */ class UFC_AddressComponent extends UFC_Address { - static $components = array('sublocality', 'locality', 'administrative_area_level_3', 'administrative_area_level_2', 'administrative_area_level_1', 'country'); + static $components = array('postal_code', 'locality', 'administrative_area_level_3', 'administrative_area_level_2', 'administrative_area_level_1', 'country'); /** Data of the filter */ @@ -1081,7 +1101,7 @@ class UFC_AddressComponent extends UFC_Address private $fieldtype; private $exact; - public function __construct($val, $fieldtype, $exact = true, $type = null, $flags = self::FLAG_ANY) + public function __construct($val, $fieldtype, $type = null, $flags = self::FLAG_ANY) { if (!in_array($fieldtype, self::$components)) { Platal::page()->killError('Invalid address field type: ' . $this->fieldtype); @@ -1093,13 +1113,12 @@ class UFC_AddressComponent extends UFC_Address } $this->val = $val; $this->fieldtype = $fieldtype; - $this->exact = $exact; } public function buildCondition(PlFilter $uf) { $sub = $uf->addAddressFilter($this->fieldtype); - $conds = $this->initConds($sub, $uf->getVisibilityCondition('pa' . $sub . '.pub')); + $conds = $this->initConds($sub, $uf->getVisibilityConditionForField('pa' . $sub . '.pub')); $conds[] = XDB::format('pace' . $sub . '.id IN {?}', $this->val); return implode(' AND ', $conds); @@ -1142,7 +1161,7 @@ class UFC_Corps extends UserFilterCondition } // XXX(x2006barrois): find a way to get rid of that hardcoded // reference to 'pc'. - $cond .= ' AND ' . $uf->getVisibilityCondition('pc.corps_pub'); + $cond .= ' AND ' . $uf->getVisibilityConditionForField('pc.corps_pub'); return $cond; } } @@ -1176,7 +1195,7 @@ class UFC_Corps_Rank extends UserFilterCondition } // XXX(x2006barrois): find a way to get rid of that hardcoded // reference to 'pc'. - $cond .= ' AND ' . $uf->getVisibilityCondition('pc.corps_pub'); + $cond .= ' AND ' . $uf->getVisibilityConditionForField('pc.corps_pub'); return $cond; } } @@ -1214,7 +1233,7 @@ class UFC_Job_Company extends UserFilterCondition $sub = $uf->addJobCompanyFilter(); $cond = $sub . '.' . $this->type . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->value); $jsub = $uf->addJobFilter(); - $cond .= ' AND ' . $uf->getVisibilityCondition($jsub . '.pub'); + $cond .= ' AND ' . $uf->getVisibilityConditionForField($jsub . '.pub'); return $cond; } } @@ -1244,7 +1263,7 @@ class UFC_Job_Terms extends UserFilterCondition $conditions[] = $sub[$i] . '.jtid_1 = ' . XDB::escape($jtid); } $jsub = $uf->addJobFilter(); - $conditions[] = $uf->getVisibilityCondition($jsub . '.pub'); + $conditions[] = $uf->getVisibilityConditionForField($jsub . '.pub'); return implode(' AND ', $conditions); } } @@ -1271,24 +1290,18 @@ class UFC_Job_Description extends UserFilterCondition $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 self::COND_TRUE; - } - } if ($this->fields & UserFilter::JOB_USERDEFINED) { $conds[] = $jsub . '.description ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description); } - if ($this->fields & UserFilter::JOB_CV && $uf->getVisibilityLevel() == ProfileVisibility::VIS_PRIVATE) { + if ($this->fields & UserFilter::JOB_CV) { $uf->requireProfiles(); - $conds[] = 'p.cv ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description); + // CV is private + $conds[] = '( ' . $uf->getVisibilityConditionAbsolute(Visibility::EXPORT_PRIVATE) . ' AND p.cv ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description) . ')'; } if (count($conds) == 0) { return self::COND_TRUE; } - return $uf->getVisibilityCondition($jsub . '.pub') . ' AND ( ' . implode(' OR ', $conds) . ' )'; + return $uf->getVisibilityConditionForField($jsub . '.pub') . ' AND ( ' . implode(' OR ', $conds) . ' )'; } } // }}} @@ -1312,7 +1325,7 @@ class UFC_Networking extends UserFilterCondition { $sub = $uf->addNetworkingFilter(); $conds = array(); - $conds[] = $uf->getVisibilityCondition($sub . '.pub'); + $conds[] = $uf->getVisibilityConditionForField($sub . '.pub'); $conds[] = $sub . '.address ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->value); if ($this->type != -1) { $conds[] = $sub . '.nwid = ' . XDB::format('{?}', $this->type); @@ -1357,7 +1370,7 @@ class UFC_Phone extends UserFilterCondition $sub = $uf->addPhoneFilter(); $conds = array(); - $conds[] = $uf->getVisibilityCondition($sub . '.pub'); + $conds[] = $uf->getVisibilityConditionForField($sub . '.pub'); $conds[] = $sub . '.search_tel = ' . XDB::format('{?}', $this->number); if ($this->num_type != self::NUM_ANY) { @@ -1393,7 +1406,7 @@ class UFC_Medal extends UserFilterCondition // This will require profiles => table 'p' will be available. $sub = $uf->addMedalFilter(); - $conds[] = $uf->getVisibilityCondition('p.medals_pub'); + $conds[] = $uf->getVisibilityConditionForField('p.medals_pub'); $conds[] = $sub . '.mid = ' . XDB::format('{?}', $this->medal); if ($this->grade != null) { @@ -1411,7 +1424,7 @@ class UFC_Photo extends UserFilterCondition public function buildCondition(PlFilter $uf) { $sub = $uf->addPhotoFilter(); - return $sub . '.attach IS NOT NULL AND ' . $uf->getVisibilityCondition($sub . '.pub'); + return $sub . '.attach IS NOT NULL AND ' . $uf->getVisibilityConditionForField($sub . '.pub'); } } // }}} @@ -1586,6 +1599,27 @@ class UFC_WatchPromo extends UFC_UserRelated } } // }}} +// {{{ class UFC_WatchGroup +/** Filters users belonging to a group watched by selected user + * @param $user Selected user (the one watching group) + */ +class UFC_WatchGroup extends UFC_UserRelated +{ + public function buildCondition(PlFilter $uf) + { + $groups = $this->user->watchGroups(); + if (count($groups) == 0) { + return PlFilterCondition::COND_FALSE; + } + $conditions = array(); + foreach ($groups as $group) { + $sub = $uf->addGroupFilter($group); + $conditions[] = 'gpm' . $sub . '.perms IS NOT NULL'; + } + return implode(' OR ', $conditions); + } +} +// }}} // {{{ class UFC_WatchContact /** Filters users watched by selected user */ @@ -1620,6 +1654,72 @@ class UFC_MarketingHash extends UserFilterCondition } } // }}} +// {{{ class UFC_PartnerSharing +/** Filters users, keeping only those sharing data with a given partner. + */ +class UFC_PartnerSharing extends UserFilterCondition +{ + const PTA = 'pta'; + + private $partner_id; + + public function __construct($partner_id) + { + $this->partner_id = $partner_id; + } + + public function buildCondition(PlFilter $uf) + { + $sub = $uf->addPartnerSharingFilter($this->partner_id); + return XDB::format("$sub.exposed_uid IS NOT NULL"); + } +} +// }}} +// {{{ class UFC_PartnerSharingEmail +/** Filters users, keeping only those allowing emails to be sent by + * a given partner. + */ +class UFC_PartnerSharingEmail extends UserFilterCondition +{ + private $partner_id; + + public function __construct($partner_id) + { + $this->partner_id = $partner_id; + } + + public function buildCondition(PlFilter $uf) + { + $sub = $uf->addPartnerSharingFilter($this->partner_id); + return XDB::format("$sub.allow_email IN ('digest', 'direct')"); + } +} +// }}} +// {{{ class UFC_PartnerSharingID +/** Filters users according to a list of partner-known IDs + */ +class UFC_PartnerSharingID extends UserFilterCondition +{ + private $partner_id; + private $ids; + + public function __construct($partner_id) + { + $this->partner_id = $partner_id; + $ids = func_get_args(); + array_shift($ids); + $this->ids = pl_flatten($ids); + } + + public function buildCondition(PlFilter $uf) + { + $uf->requireProfiles(); + $ids = $this->ids; + $sub = $uf->addPartnerSharingFilter($this->partner_id); + return XDB::format("$sub.exposed_uid IN {?}", $ids); + } +} +// }}} -// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: +// vim:set et sw=4 sts=4 sws=4 foldmethod=marker fenc=utf-8: ?>