*/
abstract class UserFilterCondition implements PlFilterCondition
{
- const OP_EQUALS = '==';
+ const OP_EQUALS = '=';
const OP_GREATER = '>';
const OP_NOTGREATER = '<=';
const OP_LESSER = '<';
$cond = new $class($values);
break;
+ case 'school_id':
+ $values = $export->v('values', array());
+ $school_type = $export->s('school_type');
+ $cond = new UFC_SchoolId($school_type, $values);
+ break;
+
case 'has_profile':
+ case 'has_email_redirect':
+ case 'has_valid_email':
$class = 'ufc_' . str_replace('_', '', $type);
$cond = new $class();
break;
}
}
// }}}
+// {{{ class UFC_HasEmailRedirect
+/** Filters users, keeping only those with a valid email redirection (only X.org accounts).
+ */
+class UFC_HasEmailRedirect extends UserFilterCondition
+{
+ public function buildCondition(PlFilter $uf)
+ {
+ $sub_redirect = $uf->addActiveEmailRedirectFilter();
+ return 'rf.redirect IS NOT NULL';
+ }
+
+ public function export()
+ {
+ $export = $this->buildExport('has_email_redirect');
+ return $export;
+ }
+}
+// }}}
+// {{{ class UFC_HasValidEmail
+/** Filters users, keeping only those with a valid email address (all accounts).
+ */
+class UFC_HasValidEmail extends UserFilterCondition
+{
+ public function buildCondition(PlFilter $uf)
+ {
+ $sub_redirect = $uf->addEmailRedirectFilter();
+ $uf->requireAccounts();
+ return 'ra' . $sub_redirect . '.flags = \'active\' OR a.email IS NOT NULL';
+ }
+
+ public function export()
+ {
+ $export = $this->buildExport('has_valid_email');
+ return $export;
+ }
+}
+// }}}
// {{{ class UFC_Ip
/** Filters users based on one of their last IPs
* @param $ip IP from which connection are checked
public function export()
{
+ $export = $this->buildExport('promo');
$export['comparison'] = $this->comparison;
if ($this->grade != UserFilter::DISPLAY) {
$export['grade'] = $this->grade;
}
return XDB::format('p.' . $type . '_id IN {?}', $ids);
}
+
+ public function export()
+ {
+ $export = $this->buildExport('school_id');
+ $export['school_type'] = $this->type;
+ $export['values'] = $this->ids;
+ return $export;
+ }
}
// }}}
// {{{ class UFC_EducationSchool
private $flags;
private $soundex;
private $exact;
+ private $general_type;
- public function __construct($tokens, $flags = array(), $soundex = false, $exact = false)
+ public function __construct($tokens, $flags = array(), $soundex = false, $exact = false, $general_type = '')
{
if (is_array($tokens)) {
$this->tokens = $tokens;
}
$this->soundex = $soundex;
$this->exact = $exact;
+ $this->general_type = $general_type;
}
public function buildCondition(PlFilter $uf)
if ($this->flags != null) {
$c .= XDB::format(' AND ' . $sub . '.flags IN {?}', $this->flags);
}
+ if ($this->general_type) {
+ $c .= XDB::format(' AND ' . $sub . '.general_type = {?}', $this->general_type);
+ }
$conds[] = $c;
}
}
}
// }}}
+// {{{ class UFC_NLSubscribed
+/** Filters users based on NL subscription
+ * @param $nlid NL whose subscribers we are selecting
+ * @param $issue Select only subscribers who have not yet received that issue
+ */
+class UFC_NLSubscribed extends UserFilterCondition
+{
+ private $nlid;
+ private $issue_id;
+ public function __construct($nlid, $issue_id)
+ {
+ $this->nlid = $nlid;
+ $this->issue_id = $issue_id;
+ }
+
+ public function buildCondition(PlFilter $uf)
+ {
+ $sub = $uf->addNewsLetterFilter($this->nlid);
+ return XDB::format($sub . '.last < {?}', $this->issue_id);
+ }
+}
+// }}}
// {{{ class UFC_Group
/** Filters users based on group membership
* @param $group Group whose members we are selecting
public function buildCondition(PlFilter $uf)
{
- // Groups have AX visibility.
- if ($uf->getVisibilityLevel() == ProfileVisibility::VIS_PUBLIC) {
- return self::COND_TRUE;
+ // Groups are only visible for users with perm 'groups'.
+ if (!S::user()->checkPerms(User::PERM_GROUPS)) {
+ return self::COND_FALSE;
}
$sub = $uf->addGroupFilter($this->group);
$where = 'gpm' . $sub . '.perms IS NOT NULL';
{
// Binets are private.
if ($uf->getVisibilityLevel() != ProfileVisibility::VIS_PRIVATE) {
- return self::CONF_TRUE;
+ return self::COND_TRUE;
}
$sub = $uf->addBinetsFilter();
return XDB::format($sub . '.binet_id IN {?}', $this->val);
{
// Sections are private.
if ($uf->getVisibilityLevel() != ProfileVisibility::VIS_PRIVATE) {
- return self::CONF_TRUE;
+ return self::COND_TRUE;
}
$uf->requireProfiles();
return XDB::format('p.section IN {?}', $this->section);
public function buildCondition(PlFilter $uf)
{
$foreign = array();
- $virtual = array();
- $aliases = array();
- $cond = array();
+ $local = array();
+ $cond = array();
if (count($this->emails) == 0) {
return PlFilterCondition::COND_TRUE;
foreach ($this->emails as $entry) {
if (User::isForeignEmailAddress($entry)) {
$foreign[] = $entry;
- } else if (User::isVirtualEmailAddress($entry)) {
- $virtual[] = $entry;
} else {
- @list($user, $domain) = explode('@', $entry);
- $aliases[] = $user;
+ list($local_part, ) = explode('@', $entry);
+ $local[] = $local_part;
}
}
if (count($foreign) > 0) {
$sub = $uf->addEmailRedirectFilter($foreign);
- $cond[] = XDB::format('e' . $sub . '.email IS NOT NULL OR a.email IN {?}', $foreign);
+ $cond[] = XDB::format('ra' . $sub . '.redirect IS NOT NULL OR ra' . $sub . '.redirect IN {?} OR a.email IN {?}', $foreign, $foreign);
}
- if (count($virtual) > 0) {
- $sub = $uf->addVirtualEmailFilter($virtual);
- $cond[] = 'vr' . $sub . '.redirect IS NOT NULL';
- }
- if (count($aliases) > 0) {
- $sub = $uf->addAliasFilter($aliases);
- $cond[] = 'al' . $sub . '.alias IS NOT NULL';
+ if (count($local) > 0) {
+ $sub = $uf->addAliasFilter($local);
+ $cond[] = 'sa' . $sub . '.email IS NOT NULL';
}
return '(' . implode(') OR (', $cond) . ')';
}
const ORIGIN = 2;
private $corps;
+ private $id;
private $type;
- public function __construct($corps, $type = self::CURRENT)
+ public function __construct($corps, $id = null, $type = self::CURRENT)
{
$this->corps = $corps;
+ $this->id = $id;
$this->type = $type;
}
* pcec for profile_corps_enum - current
*/
$sub = $uf->addCorpsFilter($this->type);
- $cond = $sub . '.abbreviation = ' . $corps;
- $cond .= ' AND ' . $uf->getVisibilityCondition($sub . '.corps_pub');
+ if (is_null($this->id)) {
+ $cond = $sub . '.abbreviation = ' . $this->corps;
+ } else {
+ $cond = $sub . '.id = ' . $this->id;
+ }
+ // XXX(x2006barrois): find a way to get rid of that hardcoded
+ // reference to 'pc'.
+ $cond .= ' AND ' . $uf->getVisibilityCondition('pc.corps_pub');
return $cond;
}
}
class UFC_Corps_Rank extends UserFilterCondition
{
private $rank;
- public function __construct($rank)
+ private $id;
+
+ public function __construct($rank, $id = null)
{
$this->rank = $rank;
+ $this->id = $id;
}
public function buildCondition(PlFilter $uf)
* pcr for profile_corps_rank
*/
$sub = $uf->addCorpsRankFilter();
- $cond = $sub . '.abbreviation = ' . $rank;
+ if (is_null($this->id)) {
+ $cond = $sub . '.abbreviation = ' . $this->rank;
+ } else {
+ $cond = $sub . '.id = ' . $this->id;
+ }
// XXX(x2006barrois): find a way to get rid of that hardcoded
// reference to 'pc'.
$cond .= ' AND ' . $uf->getVisibilityCondition('pc.corps_pub');
// don't do anything. Otherwise restrict to standard job visibility.
if ($this->fields == UserFilter::JOB_CV) {
if ($uf->getVisibilityLevel() != ProfileVisibility::VIS_PRIVATE) {
- return self::CONF_TRUE;
+ return self::COND_TRUE;
}
- } else {
- $conds[] = $uf->getVisibilityCondition($jsub . '.pub');
}
-
if ($this->fields & UserFilter::JOB_USERDEFINED) {
$conds[] = $jsub . '.description ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description);
}
$uf->requireProfiles();
$conds[] = 'p.cv ' . XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $this->description);
}
- return implode(' OR ', $conds);
+ if (count($conds) == 0) {
+ return self::COND_TRUE;
+ }
+ return $uf->getVisibilityCondition($jsub . '.pub') . ' AND ( ' . implode(' OR ', $conds) . ' )';
}
}
// }}}
abstract class UFC_UserRelated extends UserFilterCondition
{
protected $user;
- public function __construct(PlUser &$user)
+ public function __construct(PlUser $user)
{
$this->user =& $user;
}
class UFC_WatchPromo extends UFC_UserRelated
{
private $grade;
- public function __construct(PlUser &$user, $grade = UserFilter::GRADE_ING)
+ public function __construct(PlUser $user, $grade = UserFilter::GRADE_ING)
{
parent::__construct($user);
$this->grade = $grade;