From: Florent Bruneau
';
- }
- return null;
-}
-
-// }}}
-// {{{ function register_profile_update
-
-function register_profile_update($uid, $field) {
- XDB::execute("REPLACE INTO watch_profile (uid, ts, field)
- VALUES ({?}, NOW(), {?})",
- $uid, $field);
-}
-
-// {{{ class AllNotifs
-
-class AllNotifs
-{
- public $_cats = Array();
- public $_data = Array();
-
- public function __construct()
- {
- $res = XDB::iterator("SELECT * FROM watch_cat");
- while($tmp = $res->next()) {
- $this->_cats[$tmp['id']] = $tmp;
- }
-
- // recupère tous les watchers, avec détails des watchers, a partir du
- // watch_last de chacun, seulement ceux qui sont surveillés, ordonnés
- $res = select_notifs(true);
-
- while($tmp = $res->next()) {
- $aid = $tmp['aid'];
- if (empty($this->_data[$aid])) {
- $this->_data[$aid] = Array("prenom" => $tmp['aprenom'], 'nom' => $tmp['anom'],
- 'bestalias'=>$tmp['abestalias'], 'sexe' => $tmp['asexe'], 'mail_fmt' => $tmp['mail_fmt'],
- 'dcd'=>$tmp['dcd']);
- }
- unset($tmp['aprenom'], $tmp['anom'], $tmp['abestalias'], $tmp['aid'], $tmp['asexe'], $tmp['mail_fmt'], $tmp['dcd']);
- $this->_data[$aid]['data'][$tmp['cid']][] = $tmp;
- }
- }
-}
-
-// }}}
-// {{{ class Notifs
-
-class Notifs
-{
- public $_uid;
- public $_cats = Array();
- public $_data = Array();
-
- function __construct($uid, $up=false)
- {
- $this->_uid = $uid;
-
- $res = XDB::iterator("SELECT * FROM watch_cat");
- while($tmp = $res->next()) {
- $this->_cats[$tmp['id']] = $tmp;
- }
-
- $lastweek = date('YmdHis', time() - 7*24*60*60);
-
- // recupere les notifs du watcher $uid, sans detail sur le watcher,
- // depuis la semaine dernière, meme ceux sans surveillance, ordonnés
- $res = select_notifs(false, $uid, $lastweek);
- while($tmp = $res->next()) {
- if ($tmp['cid'] == WATCH_FICHE) {
- $tmp['data'] = get_profile_change_details($tmp, $lastweek);
- }
- $this->_data[$tmp['cid']][$tmp['promo']][] = $tmp;
- }
-
- if($up) {
- XDB::execute('UPDATE watch
- SET last = NOW()
- WHERE uid = {?}', $uid);
- }
- }
-}
-
-// }}}
-// {{{ class Watch
-
-class Watch
+class WatchProfileUpdate
{
- public $_uid;
- public $_promos;
- public $_nonins;
- public $_cats = Array();
- public $_subs;
- public $watch_contacts;
- public $watch_mail;
-
- public function __construct($uid)
- {
- $this->_uid = $uid;
- $this->_promos = new PromoNotifs($uid);
- $this->_nonins = new NoninsNotifs($uid);
- $this->_subs = new WatchSub($uid);
- $res = XDB::query('SELECT FIND_IN_SET(\'contacts\', flags),
- FIND_IN_SET(\'mail\', flags)
- FROM watch
- WHERE uid = {?}', $uid);
- list($this->watch_contacts, $this->watch_mail) = $res->fetchOneRow();
+ const ID = 1;
- $this->_cats = XDB::fetchAllAssoc('id', 'SELECT * FROM watch_cat');
- }
-
- public function saveFlags()
+ public static function register(Profile &$profile, $field)
{
- $flags = new PlFlagSet();
- $flags->addFlag('contacts', $this->watch_contacts);
- $flags->addFlag('mail', $this->watch_mail);
- XDB::execute('UPDATE watch
- SET flags = {?}
- WHERE uid = {?}',
- $flags, $this->_uid);
+ XDB::execute('REPLACE INTO watch_profile (uid, ts, field)
+ VALUES ({?}, NOW(), {?})',
+ $profile->id(), $field);
}
- public function cats()
+ public static function getCondition(PlUser &$user)
{
- return $this->_cats;
- }
-
- public function subs($i)
- {
- return $this->_subs->_data[$i];
- }
-
- public function promos()
- {
- return $this->_promos->toRanges();
- }
-
- public function nonins()
- {
- return $this->_nonins->_data;
+ return new UFC_And(new UFC_ProfileUpdated('>=', $user->watch_last),
+ new UFC_WatchContacts($user->id()));
}
}
-// }}}
-// {{{ class WatchSub
-
-class WatchSub
+class WatchRegistration
{
- public $_uid;
- public $_data = Array();
-
- public function __construct($uid)
- {
- $this->_uid = $uid;
- $res = XDB::iterRow('SELECT cid FROM watch_sub WHERE uid={?}', $uid);
- while(list($c) = $res->next()) {
- $this->_data[$c] = $c;
- }
- }
+ const ID = 2;
- public function update($ind)
+ public static function getCondition(PlUser &$user)
{
- $this->_data = Array();
- XDB::execute('DELETE FROM watch_sub WHERE uid={?}', $this->_uid);
- foreach (Env::v($ind) as $key=>$val) {
- XDB::query('INSERT INTO watch_sub SELECT {?},id FROM watch_cat WHERE id={?}', $this->_uid, $key);
- if(XDB::affectedRows()) {
- $this->_data[$key] = $key;
- }
- }
+ return new UFC_And(new UFC_Registered(false, '>=', $user->watch_last),
+ new UFC_WatchRegistration($user->id()));
}
}
-// }}}
-// {{{ class PromoNotifs
-
-class PromoNotifs
+class WatchDeath
{
- public $_uid;
- public $_data = Array();
-
- public function __construct($uid)
- {
- $this->_uid = $uid;
- $res = XDB::iterRow('SELECT promo FROM watch_promo WHERE uid={?} ORDER BY promo', $uid);
- while (list($p) = $res->next()) {
- $this->_data[intval($p)] = intval($p);
- }
- }
-
- public function add($p)
- {
- $promo = intval($p);
- XDB::execute('REPLACE INTO watch_promo (uid,promo) VALUES({?},{?})', $this->_uid, $promo);
- $this->_data[$promo] = $promo;
- asort($this->_data);
- }
-
- public function del($p)
- {
- $promo = intval($p);
- XDB::execute('DELETE FROM watch_promo WHERE uid={?} AND promo={?}', $this->_uid, $promo);
- unset($this->_data[$promo]);
- }
-
- public function addRange($_p1,$_p2)
- {
- $p1 = intval($_p1);
- $p2 = intval($_p2);
- $values = Array();
- for($i = min($p1,$p2); $i<=max($p1,$p2); $i++) {
- $values[] = "('{$this->_uid}',$i)";
- $this->_data[$i] = $i;
- }
- XDB::execute('REPLACE INTO watch_promo (uid,promo) VALUES '.join(',',$values));
- asort($this->_data);
- }
-
- public function delRange($_p1,$_p2)
- {
- $p1 = intval($_p1);
- $p2 = intval($_p2);
- $where = Array();
- for($i = min($p1,$p2); $i<=max($p1,$p2); $i++) {
- $where[] = "promo=$i";
- unset($this->_data[$i]);
- }
- XDB::execute('DELETE FROM watch_promo WHERE uid={?} AND ('.join(' OR ',$where).')', $this->_uid);
- }
+ const ID = 3;
- public function toRanges()
+ public static function getCondition(PlUser &$user)
{
- $ranges = Array();
- $I = Array();
- foreach($this->_data as $promo) {
- if(!isset($I[0])) {
- $I = Array($promo,$promo);
- }
- elseif($I[1]+1 == $promo) {
- $I[1] ++;
- }
- else {
- $ranges[] = $I;
- $I = Array($promo,$promo);
- }
- }
- if(isset($I[0])) $ranges[] = $I;
- return $ranges;
+ return new UFC_And(new UFC_Dead('>=', $user->watch_last, true),
+ new UFC_Or(new UFC_WatchPromo($user->id()),
+ new UFC_WatchContacts($user->id())));
}
}
-// }}}
-// {{{ class NoninsNotifs
-
-class NoninsNotifs
+class WatchBirthday
{
- public $_uid;
- public $_data = Array();
-
- public function __construct($uid)
- {
- $this->_uid = $uid;
- $res = XDB::iterator("SELECT u.prenom,IF(u.nom_usage='',u.nom,u.nom_usage) AS nom, u.promo, u.user_id
- FROM watch_nonins AS w
- INNER JOIN auth_user_md5 AS u ON (u.user_id = w.ni_id)
- WHERE w.uid = {?}
- ORDER BY promo,nom", $uid);
- while($tmp = $res->next()) {
- $this->_data[$tmp['user_id']] = $tmp;
- }
- }
-
- public function del($p)
- {
- unset($this->_data["$p"]);
- XDB::execute('DELETE FROM watch_nonins WHERE uid={?} AND ni_id={?}', $this->_uid, $p);
- }
+ const ID = 4;
- public function add($p)
+ public static function getCondition(PlUser &$user)
{
- XDB::execute('INSERT IGNORE INTO watch_nonins (uid,ni_id) VALUES({?},{?})', $this->_uid, $p);
- $res = XDB::query('SELECT prenom, IF(nom_usage="",nom,nom_usage) AS nom,promo,user_id
- FROM auth_user_md5
- WHERE user_id={?}', $p);
- $this->_data["$p"] = $res->fetchOneAssoc();
+ return new UFC_And(new UFC_Birthday(),
+ new UFC_Or(new UFC_WatchPromo($user->id()),
+ new UFC_WatchContacts($user->id())));
}
}
-// }}}
-
-// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
?>
diff --git a/modules/carnet.php b/modules/carnet.php
index 42b954e..7cd9320 100644
--- a/modules/carnet.php
+++ b/modules/carnet.php
@@ -73,89 +73,176 @@ class CarnetModule extends PLModule
$this->_add_rss_link($page);
}
- function _handler_notifs_promos(&$page, &$watch, $action, $arg)
+ private function getSinglePromotion(PlPage &$page, $promo)
{
- if(preg_match('!^ *(\d{4}) *$!', $arg, $matches)) {
- $p = intval($matches[1]);
- if($p<1900 || $p>2100) {
- $page->trigError("la promo entrée est invalide");
- } else {
- if ($action == 'add_promo') {
- $watch->_promos->add($p);
- } else {
- $watch->_promos->del($p);
- }
- }
- } elseif (preg_match('!^ *(\d{4}) *- *(\d{4}) *$!', $arg, $matches)) {
- $p1 = intval($matches[1]);
- $p2 = intval($matches[2]);
- if($p1<1900 || $p1>2100) {
- $page->trigError('la première promo de la plage entrée est invalide');
- } elseif($p2<1900 || $p2>2100) {
- $page->trigError('la seconde promo de la plage entrée est invalide');
+ if (!ctype_digit($promo) || $promo < 1920 || $promo > date('Y')) {
+ $page->trigError('Promotion invalide : ' . $promo);
+ return null;
+ }
+ return (int)$promo;
+ }
+
+ private function getPromo(PlPage &$page, $promo)
+ {
+ if (strpos($promo, '-') === false) {
+ $promo = $this->getSinglePromotion($page, $promo);
+ if (!$promo) {
+ return null;
} else {
- if ($action == 'add_promo') {
- $watch->_promos->addRange($p1, $p2);
- } else {
- $watch->_promos->delRange($p1, $p2);
- }
+ return array($promo);
}
- } else {
- $page->trigError("La promo (ou la plage de promo) entrée est dans un format incorrect.");
}
+
+ list($promo1, $promo2) = explode('-', $promo);
+ $promo1 = $this->getSinglePromotion($page, $promo1);
+ if (!$promo1) {
+ return null;
+ }
+ $promo2 = $this->getSinglePromotion($page, $promo2);
+ if (!$promo2) {
+ return null;
+ }
+ if ($promo1 > $promo2) {
+ $page->trigError("Intervale non valide : " . $promo);
+ return null;
+ }
+ $array = array();
+ for ($i = $promo1 ; $i <= $promo2 ; ++$i) {
+ $array[] = $i;
+ }
+ return $array;
}
- function handler_notifs(&$page, $action = null, $arg = null)
+ private function addPromo(PlPage &$page, $promo)
{
- $page->changeTpl('carnet/notifs.tpl');
+ $promos = $this->getPromo($page, $promo);
+ if (!$promos || count($promos) == 0) {
+ return;
+ }
+ $to_add = array();
+ foreach ($promos as $promo) {
+ $to_add[] = XDB::format('({?}, {?})', S::i('uid'), $promo);
+ }
+ XDB::execute('INSERT IGNORE INTO watch_promo (uid, promo)
+ VALUES ' . implode(', ', $to_add));
+ }
- require_once 'notifs.inc.php';
+ private function delPromo(PlPage &$page, $promo)
+ {
+ $promos = $this->getPromo($page, $promo);
+ if (!$promos || count($promos) == 0) {
+ return;
+ }
+ $to_delete = array();
+ foreach ($promos as $promo) {
+ $to_delete[] = XDB::format('{?}', $promo);
+ }
+ XDB::execute('DELETE FROM watch_promo
+ WHERE ' . XDB::format('uid = {?}', S::i('uid')) . '
+ AND promo IN (' . implode(', ', $to_delete) . ')');
+ }
+
+ public function addNonRegistered(PlPage &$page, PlUser &$user)
+ {
+ XDB::execute('INSERT IGNORE INTO watch_nonins (uid, ni_id)
+ VALUES ({?}, {?})', S::i('uid'), $user->id());
+ }
- $watch = new Watch(S::v('uid'));
+ public function delNonRegistered(PlPage &$page, PlUser &$user)
+ {
+ XDB::execute('DELETE FROM watch_nonins
+ WHERE uid = {?} AND ni_id = {?}',
+ S::i('uid'), $user->id());
+ }
- $res = XDB::query("SELECT promo_sortie
- FROM auth_user_md5
- WHERE user_id = {?}",
- S::v('uid', -1));
- $promo_sortie = $res->fetchOneCell();
- $page->assign('promo_sortie', $promo_sortie);
+ public function handler_notifs(&$page, $action = null, $arg = null)
+ {
+ $page->changeTpl('carnet/notifs.tpl');
if ($action) {
S::assert_xsrf_token();
- }
- switch ($action) {
- case 'add_promo':
- case 'del_promo':
- $this->_handler_notifs_promos($page, $watch, $action, $arg);
- break;
-
- case 'del_nonins':
- $watch->_nonins->del($arg);
- break;
-
- case 'add_nonins':
- $watch->_nonins->add($arg);
- break;
+ switch ($action) {
+ case 'add_promo':
+ $this->addPromo($page, $arg);
+ break;
+
+ case 'del_promo':
+ $this->delPromo($page, $arg);
+ break;
+
+ case 'del_nonins':
+ $user = User::get($arg);
+ if ($user) {
+ $this->delNonRegistered($page, $user);
+ }
+ break;
+
+ case 'add_nonins':
+ $user = User::get($arg);
+ if ($user) {
+ $this->addNonRegistered($page, $user);
+ }
+ break;
+ }
}
if (Env::has('subs')) {
S::assert_xsrf_token();
- $watch->_subs->update('sub');
+ $flags = new PlFlagSet();
+ foreach (Env::v('sub') as $key=>$value) {
+ $flags->addFlag($key, $value);
+ }
+ XDB::execute('UPDATE watch
+ SET actions = {?}
+ WHERE uid = {?}', $flags, S::i('uid'));
}
if (Env::has('flags_contacts')) {
S::assert_xsrf_token();
- $watch->watch_contacts = Env::b('contacts');
- $watch->saveFlags();
+ XDB::execute('UPDATE watch
+ SET ' . XDB::changeFlag('flags', 'contacts', Env::b('contacts')) . '
+ WHERE uid = {?}', S::i('uid'));
}
if (Env::has('flags_mail')) {
S::assert_xsrf_token();
- $watch->watch_mail = Env::b('mail');
- $watch->saveFlags();
+ XDB::execute('UPDATE watch
+ SET ' . XDB::changeFlag('flags', 'mail', Env::b('mail')) . '
+ WHERE uid = {?}', S::i('uid'));
}
- $page->assign_by_ref('watch', $watch);
+ $user = S::user();
+ $nonins = new UserFilter(new UFC_WatchRegistration($user));
+
+ $promo = XDB::fetchColumn('SELECT promo
+ FROM watch_promo
+ WHERE uid = {?}
+ ORDER BY promo', S::i('uid'));
+ $page->assign('promo_count', count($promo));
+ $ranges = array();
+ $range_start = null;
+ $range_end = null;
+ foreach ($promo as $p) {
+ if (is_null($range_start)) {
+ $range_start = $range_end = $p;
+ } else if ($p != $range_end + 1) {
+ $ranges[] = array($range_start, $range_end);
+ $range_start = $range_end = $p;
+ } else {
+ $range_end = $p;
+ }
+ }
+ $ranges[] = array($range_start, $range_end);
+ $page->assign('promo_ranges', $ranges);
+ $page->assign('nonins', $nonins->getUsers());
+
+ list($flags, $actions) = XDB::fetchOneRow('SELECT flags, actions
+ FROM watch
+ WHERE uid = {?}', S::i('uid'));
+ $flags = new PlFlagSet($flags);
+ $actions = new PlFlagSet($actions);
+ $page->assign('flags', $flags);
+ $page->assign('actions', $actions);
}
function handler_contacts(&$page, $action = null, $subaction = null, $ssaction = null)
diff --git a/modules/profile/page.inc.php b/modules/profile/page.inc.php
index cd9d38c..da36717 100644
--- a/modules/profile/page.inc.php
+++ b/modules/profile/page.inc.php
@@ -347,17 +347,15 @@ abstract class ProfilePage implements PlWizardPage
$setting->save($this, $field, $this->values[$field]);
}
if ($this->changed[$field] && @$this->watched[$field]) {
- register_profile_update($this->pid(), $field);
+ WatchProfileUpdate::register($this->profile, $field);
}
}
$this->_saveData();
// Update the last modification date
- XDB::execute('REPLACE INTO user_changes
- SET user_id = {?}', $this->pid());
- if (!S::suid()) {
- register_watch_op($this->pid(), WATCH_FICHE);
- }
+ XDB::execute('UPDATE profiles
+ SET last_change = NOW()
+ WHERE pid = {?}', $this->pid());
global $platal;
S::logger()->log('profil', $platal->pl_self(2));
}
diff --git a/templates/carnet/notifs.tpl b/templates/carnet/notifs.tpl
index f5ef990..d19dbaf 100644
--- a/templates/carnet/notifs.tpl
+++ b/templates/carnet/notifs.tpl
@@ -30,8 +30,10 @@ S'il n'y a rien à te signaler l'email ne t'est pas envoyé.
Tu ne surveilles actuellement aucune promo.
{else} -Tu surveilles les promos suivantes :
+Tu surveilles {if $promo_count eq 1}la promotion suivante :{else}les promotions suivantes :{/if}