X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=modules%2Fcarnet.php;h=5139bb026861c1570ffc0707a2d5697e99f7280c;hb=e93255ef54304c697ef7ac101247f23dc5f7b31f;hp=aee28901b1888192d1bbe01d6768ad84888e4228;hpb=5ae3e9a9b7e095956904a2bedbc0845af88434f0;p=platal.git diff --git a/modules/carnet.php b/modules/carnet.php index aee2890..5139bb0 100644 --- a/modules/carnet.php +++ b/modules/carnet.php @@ -34,6 +34,7 @@ class CarnetModule extends PLModule 'carnet/contacts/ical' => $this->make_token_hook('ical', AUTH_COOKIE, 'directory_private'), 'carnet/contacts/csv' => $this->make_token_hook('csv', AUTH_COOKIE, 'directory_private'), 'carnet/contacts/csv/birthday' => $this->make_token_hook('csv_birthday', AUTH_COOKIE, 'directory_private'), + 'carnet/batch' => $this->make_hook('batch', AUTH_COOKIE, 'directory_private'), 'carnet/rss' => $this->make_token_hook('rss', AUTH_COOKIE, 'directory_private'), ); @@ -152,12 +153,62 @@ class CarnetModule extends PLModule Platal::session()->updateNbNotifs(); } + private function getGroup(PlPage $page, $group) + { + $groupid = XDB::fetchOneCell("SELECT id + FROM groups + WHERE (nom = {?} OR diminutif = {?}) AND NOT FIND_IN_SET('private', pub)", + $group, $group); + if (is_null($groupid)) { + $search = XDB::formatWildcards(XDB::WILDCARD_CONTAINS, $group); + $res = XDB::query('SELECT id + FROM groups + WHERE (nom ' . $search . ' OR diminutif ' . $search . ") AND NOT FIND_IN_SET('private', pub)", + $search, $search); + if ($res->numRows() == 1) { + $groupid = $res->fetchOneCell(); + } + } + return $groupid; + } + + private function addGroup(PlPage $page, $group) + { + $groupid = $this->getGroup($page, $group); + if (is_null($groupid)) { + return; + } + XDB::execute('INSERT IGNORE INTO watch_group (uid, groupid) + VALUES ({?}, {?})', + S::i('uid'), $groupid); + S::user()->invalidWatchCache(); + Platal::session()->updateNbNotifs(); + } + + private function delGroup(PlPage $page, $group) + { + $groupid = $this->getGroup($page, $group); + if (is_null($groupid)) { + return; + } + XDB::execute('DELETE FROM watch_group + WHERE uid = {?} AND groupid = {?}', + S::i('uid'), $groupid); + S::user()->invalidWatchCache(); + Platal::session()->updateNbNotifs(); + } + public function addNonRegistered(PlPage $page, PlUser $user) { XDB::execute('INSERT IGNORE INTO watch_nonins (uid, ni_id) VALUES ({?}, {?})', S::i('uid'), $user->id()); - S::user()->invalidWatchCache(); - Platal::session()->updateNbNotifs(); + if (XDB::affectedRows() > 0) { + S::user()->invalidWatchCache(); + Platal::session()->updateNbNotifs(); + $page->trigSuccess('Contact ajouté : ' . $user->fullName(true)); + } else { + $page->trigWarning('Contact déjà dans la liste : ' . $user->fullName(true)); + } } public function delNonRegistered(PlPage $page, PlUser $user) @@ -169,6 +220,33 @@ class CarnetModule extends PLModule Platal::session()->updateNbNotifs(); } + public function addRegistered(PlPage $page, Profile $profile) + { + XDB::execute('INSERT IGNORE INTO contacts (uid, contact) + VALUES ({?}, {?})', + S::i('uid'), $profile->id()); + if (XDB::affectedRows() > 0) { + S::user()->invalidWatchCache(); + Platal::session()->updateNbNotifs(); + $page->trigSuccess('Contact ajouté : ' . $profile->fullName(true)); + } else { + $page->trigWarning('Contact déjà dans la liste : ' . $profile->fullName(true)); + } + } + + public function delRegistered(PlPage $page, Profile $profile) + { + XDB::execute('DELETE FROM contacts + WHERE uid = {?} AND contact = {?}', + S::i('uid'), $profile->id()); + if (XDB::affectedRows() > 0) { + S::user()->invalidWatchCache(); + Platal::session()->updateNbNotifs(); + $page->trigSuccess("Contact retiré !"); + } + + } + public function handler_notifs($page, $action = null, $arg = null) { $page->changeTpl('carnet/notifs.tpl'); @@ -184,6 +262,14 @@ class CarnetModule extends PLModule $this->delPromo($page, $arg); break; + case 'add_group': + $this->addGroup($page, $arg); + break; + + case 'del_group': + $this->delGroup($page, $arg); + break; + case 'del_nonins': $user = User::get($arg); if ($user) { @@ -256,6 +342,14 @@ class CarnetModule extends PLModule $page->assign('promo_ranges', $ranges); $page->assign('nonins', $nonins->getUsers()); + $groups = XDB::fetchColumn('SELECT g.nom + FROM watch_group AS w + INNER JOIN groups AS g ON (g.id = w.groupid) + WHERE w.uid = {?} + ORDER BY g.nom', + S::i('uid')); + $page->assign('groups', $groups); + $page->assign('groups_count', count($groups)); list($flags, $actions) = XDB::fetchOneRow('SELECT flags, actions FROM watch WHERE uid = {?}', S::i('uid')); @@ -270,9 +364,6 @@ class CarnetModule extends PLModule $page->setTitle('Mes contacts'); $this->_add_rss_link($page); - $uid = S::i('uid'); - $user = S::user(); - // For XSRF protection, checks both the normal xsrf token, and the special RSS token. // It allows direct linking to contact adding in the RSS feed. if (Env::v('action') && Env::v('token') !== S::user()->token) { @@ -280,32 +371,20 @@ class CarnetModule extends PLModule } switch (Env::v('action')) { case 'retirer': - if (($contact = User::get(Env::v('user')))) { - if (XDB::execute("DELETE FROM contacts - WHERE uid = {?} AND contact = {?}", - $uid, $contact->id())) { - Platal::session()->updateNbNotifs(); - $page->trigSuccess("Contact retiré !"); - } + if (($contact = Profile::get(Env::v('user')))) { + $this->delRegistered($page, $contact); } break; case 'ajouter': - if (($contact = User::get(Env::v('user')))) { - XDB::execute('INSERT IGNORE INTO contacts (uid, contact) - VALUES ({?}, {?})', - $uid, $contact->id()); - if (XDB::affectedRows() > 0) { - Platal::session()->updateNbNotifs(); - $page->trigSuccess('Contact ajouté !'); - } else { - $page->trigWarning('Contact déjà dans la liste !'); - } + if (($contact = Profile::get(Env::v('user')))) { + $this->addRegistered($page, $contact); } break; } $search = false; + $user = S::user(); require_once 'userset.inc.php'; @@ -324,12 +403,9 @@ class CarnetModule extends PLModule $view->addMod('minifiche', 'Mini-fiches', true); $view->addMod('trombi', 'Trombinoscope', false, array('with_admin' => false, 'with_promo' => true)); - // TODO: Reactivate when the new map is completed. - // $view->addMod('geoloc', 'Planisphère', false, array('with_annu' => 'carnet/contacts/search')); + $view->addMod('map', 'Planisphère'); $view->apply('carnet/contacts', $page, $action, $subaction); - //if ($action != 'geoloc' || ($search && !$ssaction) || (!$search && !$subaction)) { $page->changeTpl('carnet/mescontacts.tpl'); - //} } function handler_pdf($page, $arg0 = null, $arg1 = null) @@ -339,7 +415,7 @@ class CarnetModule extends PLModule Platal::session()->close(); - $order = array(new UFO_Name(Profile::LASTNAME), new UFO_Name(Profile::FIRSTNAME)); + $order = array(new UFO_Name()); if ($arg0 == 'promo') { $order = array_unshift($order, new UFO_Promo()); } else { @@ -399,7 +475,7 @@ class CarnetModule extends PLModule } else { $encoding = 'utf-8'; } - pl_content_headers("text/comma-separated-values;charset=".$encoding); + pl_cached_content_headers('text/comma-separated-values; charset=' . $encoding, 1); } function handler_ical(PlPage $page, PlUser $user) @@ -412,7 +488,7 @@ class CarnetModule extends PLModule $profiles = $filter->iterProfiles(); $page->assign('events', PlIteratorUtils::map($profiles, array($this, 'buildBirthRef'))); - pl_content_headers("text/calendar"); + pl_cached_content_headers('text/calendar', 1); } function handler_vcard($page, $photos = null) @@ -430,6 +506,85 @@ class CarnetModule extends PLModule require_once 'carnet/outlook.inc.php'; Outlook::output_profiles($pf->getProfiles(), 'fr'); } + + function handler_batch($page) + { + $page->changeTpl('carnet/batch.tpl'); + $errors = false; + $incomplete = array(); + + if (Post::has('add')) { + S::assert_xsrf_token(); + require_once 'userset.inc.php'; + require_once 'emails.inc.php'; + require_once 'marketing.inc.php'; + + $list = explode("\n", Post::v('list')); + $origin = Post::v('origin'); + + foreach ($list as $item) { + if ($item = trim($item)) { + $elements = preg_split("/\s/", $item); + $email = array_pop($elements); + if (!isvalid_email($email)) { + $page->trigError('Email invalide : ' . $email); + $incomplete[] = $item; + $errors = true; + continue; + } + + $user = User::getSilent($email); + if (is_null($user)) { + $details = implode(' ', $elements); + $promo = trim(array_pop($elements)); + $cond = new PFC_And(); + if (preg_match('/^[MDX]\d{4}$/', $promo)) { + $cond->addChild(new UFC_Promo('=', UserFilter::DISPLAY, $promo)); + } else { + $cond->addChild(new UFC_NameTokens($promo)); + } + foreach ($elements as $element) { + $cond->addChild(new UFC_NameTokens($element)); + } + $uf = new UserFilter($cond); + $count = $uf->getTotalCount(); + if ($count == 0) { + $page->trigError('Les informations : « ' . $item . ' » ne correspondent à aucun camarade.'); + $incomplete[] = $item; + $errors = true; + continue; + } elseif ($count > 1) { + $page->trigError('Les informations : « ' . $item . ' » sont ambigues et correspondent à plusieurs camarades.'); + $incomplete[] = $item; + $errors = true; + continue; + } else { + $user = $uf->getUser(); + } + } + + if ($user->state == 'active') { + $this->addRegistered($page, $user->profile()); + } else { + if (!User::isForeignEmailAddress($email)) { + $page->trigError('Email pas encore attribué : ' . $email); + $incomplete[] = $item; + $errors = true; + } else { + $this->addNonRegistered($page, $user); + if (!Marketing::get($user->id(), $email, true)) { + check_email($email, "Une adresse surveillée est proposée au marketing par " . S::user()->login()); + $market = new Marketing($user->id(), $email, 'default', null, $origin, S::v('uid'), null); + $market->add(); + } + } + } + } + } + } + $page->assign('errors', $errors); + $page->assign('incomplete', $incomplete); + } } // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: