X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fuserfilter.php;h=a2e616e45afdc9c0ee40e71f2b631b3f6ab5bfd1;hb=009b8ab7a296ce9ad4ee41c5e6716ae451a7ddd7;hp=0f592c92535ce2f6322bb55e0ae6af450c337039;hpb=3f42a6ad0763f061f2b53c7ee7ade8a12117f97b;p=platal.git diff --git a/classes/userfilter.php b/classes/userfilter.php index 0f592c9..a2e616e 100644 --- a/classes/userfilter.php +++ b/classes/userfilter.php @@ -292,6 +292,40 @@ class UFC_Registered implements UserFilterCondition } } +class UFC_ProfileUpdated implements UserFilterCondition +{ + private $comparison; + private $date; + + public function __construct($comparison = null, $date = null) + { + $this->comparison = $comparison; + $this->date = $date; + } + + public function buildCondition(UserFilter &$uf) + { + return 'p.last_change ' . $this->comparison . XDB::format(' {?}', date('Y-m-d H:i:s', $this->date)); + } +} + +class UFC_Birthday implements UserFilterCondition +{ + private $comparison; + private $date; + + public function __construct($comparison = null, $date = null) + { + $this->comparison = $comparison; + $this->date = $date; + } + + public function buildCondition(UserFilter &$uf) + { + return 'p.next_birthday ' . $this->comparison . XDB::format(' {?}', date('Y-m-d', $this->date)); + } +} + class UFC_Sex implements UserFilterCondition { private $sex; @@ -397,29 +431,74 @@ class UFC_EmailList implements UserFilterCondition } } -class UFC_Contact implements UserFilterCondition +abstract class UFC_UserRelated implements UserFilterCondition { - private $uid; - public function __construct($uid = null) - { - if (is_null($uid)) { - $this->uid = S::i('uid'); - } else if ($uid instanceof PlUser) { - $this->uid = $uid->id(); - } else if (ctype_digit($uid)) { - $this->uid = (int)$uid; + protected $user; + public function __construct(PlUser &$user) + { + $this->user =& $user; + } +} + +class UFC_Contact extends UFC_UserRelated +{ + public function buildCondition(UserFilter &$uf) + { + $sub = $uf->addContactFilter($this->user->id()); + return 'c' . $sub . '.contact IS NOT NULL'; + } +} + +class UFC_WatchRegistration extends UFC_UserRelated +{ + public function buildCondition(UserFilter &$uf) + { + if (!$this->user->watch('registration')) { + return UserFilterCondition::COND_FALSE; + } + $uids = $this->user->watchUsers(); + if (count($uids) == 0) { + return UserFilterCondition::COND_FALSE; } else { - Platal::page()->kill("Invalid contact type"); + return '$UID IN (' . implode(', ', $uids) . ')'; } } +} + +class UFC_WatchPromo extends UFC_UserRelated +{ + private $grade; + public function __construct(PlUser &$user, $grade = UserFilter::GRADE_ING) + { + parent::__construct($user); + $this->grade = $grade; + } public function buildCondition(UserFilter &$uf) { - $sub = $uf->addContactFilter($this->uid); - return 'c' . $sub . '.contact IS NOT NULL'; + $promos = $this->user->watchPromos(); + if (count($promos) == 0) { + return UserFilterCondition::COND_FALSE; + } else { + $sube = $uf->addEducationFilter(true, $this->grade); + $field = 'pe' . $sube . '.' . UserFilter::promoYear($this->grade); + return $field . ' IN (' . implode(', ', $promos) . ')'; + } + } +} + +class UFC_WatchContact extends UFC_Contact +{ + public function buildCondition(UserFilter &$uf) + { + if (!$this->user->watchContacts()) { + return UserFilterCondition::COND_FALSE; + } + return parent::buildCondition($uf); } } + /****************** * ORDERS ******************/ @@ -427,6 +506,10 @@ class UFC_Contact implements UserFilterCondition abstract class UserFilterOrder { protected $desc = false; + public function __construct($desc = false) + { + $this->desc = $desc; + } public function buildSort(UserFilter &$uf) { @@ -451,8 +534,8 @@ class UFO_Promo extends UserFilterOrder public function __construct($grade = null, $desc = false) { + parent::__construct($desc); $this->grade = $grade; - $this->desc = $desc; } protected function getSortTokens(UserFilter &$uf) @@ -475,10 +558,10 @@ class UFO_Name extends UserFilterOrder public function __construct($type, $variant = null, $particle = false, $desc = false) { + parent::__construct($desc); $this->type = $type; $this->variant = $variant; $this->particle = $particle; - $this->desc = $desc; } protected function getSortTokens(UserFilter &$uf) @@ -499,17 +582,37 @@ class UFO_Name extends UserFilterOrder class UFO_Registration extends UserFilterOrder { - public function __construct($desc = false) + protected function getSortTokens(UserFilter &$uf) { - $this->desc = $desc; + return 'a.registration_date'; } +} +class UFO_Birthday extends UserFilterOrder +{ protected function getSortTokens(UserFilter &$uf) { - return 'a.registration_date'; + return 'p.next_birthday'; } } +class UFO_ProfileUpdate extends UserFilterOrder +{ + protected function getSortTokens(UserFilter &$uf) + { + return 'p.last_change'; + } +} + +class UFO_Death extends UserFilterOrder +{ + protected function getSortTokens(UserFilter &$uf) + { + return 'p.deathdate'; + } +} + + /*********************************** ********************************* USER FILTER CLASS @@ -676,9 +779,8 @@ class UserFilter { if (is_null($this->lastcount)) { $this->buildQuery(); - return (int)XDB::fetchOneCell('SELECT COUNT(*) - ' . $this->query . ' - GROUP BY a.uid'); + return (int)XDB::fetchOneCell('SELECT COUNT(DISTINCT a.uid) + ' . $this->query); } else { return $this->lastcount; } @@ -1003,6 +1105,61 @@ class UserFilter } return $joins; } + + + /** CARNET + */ + private $wn = array(); + public function addWatchRegistrationFilter($uid = null) + { + return $this->register_optional($this->wn, is_null($uid) ? null : 'user_' . $uid); + } + + private $wp = array(); + public function addWatchPromoFilter($uid = null) + { + return $this->register_optional($this->wp, is_null($uid) ? null : 'user_' . $uid); + } + + private $w = array(); + public function addWatchFilter($uid = null) + { + return $this->register_optional($this->w, is_null($uid) ? null : 'user_' . $uid); + } + + private function watchJoins() + { + $joins = array(); + foreach ($this->w as $sub=>$key) { + if (is_null($key)) { + $joins['w' . $sub] = array('left', 'watch'); + } else { + $joins['w' . $sub] = array('left', 'watch', XDB::format('$ME.uid = {?}', substr($key, 5))); + } + } + foreach ($this->wn as $sub=>$key) { + if (is_null($key)) { + $joins['wn' . $sub] = array('left', 'watch_nonins', '$ME.ni_id = $UID'); + } else { + $joins['wn' . $sub] = array('left', 'watch_nonins', XDB::format('$ME.uid = {?} AND $ME.ni_id = $UID', substr($key, 5))); + } + } + foreach ($this->wn as $sub=>$key) { + if (is_null($key)) { + $joins['wn' . $sub] = array('left', 'watch_nonins', '$ME.ni_id = $UID'); + } else { + $joins['wn' . $sub] = array('left', 'watch_nonins', XDB::format('$ME.uid = {?} AND $ME.ni_id = $UID', substr($key, 5))); + } + } + foreach ($this->wp as $sub=>$key) { + if (is_null($key)) { + $joins['wp' . $sub] = array('left', 'watch_promo'); + } else { + $joins['wp' . $sub] = array('left', 'watch_promo', XDB::format('$ME.uid = {?}', substr($key, 5))); + } + } + return $joins; + } }