X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fuserfilter.php;h=30a7029cac9f3cd4300b13cad621605b548f9554;hb=c52d86d1d876e6def108e1d458604cc9714c252d;hp=0f592c92535ce2f6322bb55e0ae6af450c337039;hpb=3f42a6ad0763f061f2b53c7ee7ade8a12117f97b;p=platal.git diff --git a/classes/userfilter.php b/classes/userfilter.php index 0f592c9..30a7029 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 +{ + 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 { + return '$UID IN ' . XDB::formatArray($uids); + } + } +} + +class UFC_WatchPromo extends UFC_UserRelated { - 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; + private $grade; + public function __construct(PlUser &$user, $grade = UserFilter::GRADE_ING) + { + parent::__construct($user); + $this->grade = $grade; + } + + public function buildCondition(UserFilter &$uf) + { + $promos = $this->user->watchPromos(); + if (count($promos) == 0) { + return UserFilterCondition::COND_FALSE; } else { - Platal::page()->kill("Invalid contact type"); + $sube = $uf->addEducationFilter(true, $this->grade); + $field = 'pe' . $sube . '.' . UserFilter::promoYear($this->grade); + return $field . ' IN ' . XDB::formatArray($promos); } } +} +class UFC_WatchContact extends UFC_Contact +{ public function buildCondition(UserFilter &$uf) { - $sub = $uf->addContactFilter($this->uid); - return 'c' . $sub . '.contact IS NOT NULL'; + 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 @@ -622,7 +725,7 @@ class UserFilter } $cond = ''; if (!is_null($uids)) { - $cond = ' AND a.uid IN (' . implode(', ', $uids) . ')'; + $cond = ' AND a.uid IN ' . XDB::formatArray($uids); } $fetched = XDB::fetchColumn('SELECT SQL_CALC_FOUND_ROWS a.uid ' . $this->query . $cond . ' @@ -651,8 +754,13 @@ class UserFilter $table = array(); $uids = array(); foreach ($users as $user) { - $uids[] = $user->id(); - $table[$user->id()] = $user; + if ($user instanceof PlUser) { + $uid = $user->id(); + } else { + $uid = $user; + } + $uids[] = $uid; + $table[$uid] = $user; } $fetched = $this->getUIDList($uids, $count, $offset); $output = array(); @@ -676,9 +784,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; } @@ -711,6 +818,16 @@ class UserFilter return new UserFilter(new UFC_And($min, $max)); } + static public function sortByName() + { + return array(new UFO_Name(self::LASTNAME), new UFO_Name(self::FIRSTNAME)); + } + + static public function sortByPromo() + { + return array(new UFO_Promo(), new UFO_Name(self::LASTNAME), new UFO_Name(self::FIRSTNAME)); + } + static private function getDBSuffix($string) { return preg_replace('/[^a-z0-9]/i', '', $string); @@ -1003,6 +1120,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; + } }