X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=modules%2Fnewsletter.php;h=230265e1afebc3e74fdcaf2e3ecff9d041448139;hb=ad47a0aa4c6a13b4e4d051f7159641204707d11c;hp=02efc32042f1719185ace29649dcb6f69adf1fc7;hpb=42df7fa8d32b209083a983b4eaccc018c80018bd;p=platal.git diff --git a/modules/newsletter.php b/modules/newsletter.php index 02efc32..230265e 100644 --- a/modules/newsletter.php +++ b/modules/newsletter.php @@ -1,6 +1,6 @@ $this->make_hook('nl', AUTH_COOKIE), - 'nl/show' => $this->make_hook('nl_show', AUTH_COOKIE), - 'nl/search' => $this->make_hook('nl_search', AUTH_COOKIE), - 'nl/submit' => $this->make_hook('nl_submit', AUTH_MDP), - 'nl/remaining' => $this->make_hook('nl_remaining', AUTH_MDP), - 'admin/nls' => $this->make_hook('admin_nl_groups', AUTH_MDP, 'admin'), - 'admin/newsletter' => $this->make_hook('admin_nl', AUTH_MDP, 'admin'), - 'admin/newsletter/categories' => $this->make_hook('admin_nl_cat', AUTH_MDP, 'admin'), - 'admin/newsletter/edit' => $this->make_hook('admin_nl_edit', AUTH_MDP, 'admin'), - 'admin/newsletter/edit/delete' => $this->make_hook('admin_nl_delete', AUTH_MDP, 'admin'), + 'nl' => $this->make_hook('nl', AUTH_COOKIE, 'user'), + 'nl/show' => $this->make_hook('nl_show', AUTH_COOKIE, 'user'), + 'nl/search' => $this->make_hook('nl_search', AUTH_COOKIE, 'user'), + 'nl/submit' => $this->make_hook('nl_submit', AUTH_PASSWD, 'user'), + 'nl/remaining' => $this->make_hook('nl_remaining', AUTH_PASSWD, 'user'), + 'admin/nls' => $this->make_hook('admin_nl_groups', AUTH_PASSWD, 'admin'), + 'admin/newsletter' => $this->make_hook('admin_nl', AUTH_PASSWD, 'admin'), + 'admin/newsletter/categories' => $this->make_hook('admin_nl_cat', AUTH_PASSWD, 'admin'), + 'admin/newsletter/edit' => $this->make_hook('admin_nl_edit', AUTH_PASSWD, 'admin'), + 'admin/newsletter/edit/delete' => $this->make_hook('admin_nl_delete', AUTH_PASSWD, 'admin'), + 'stat/newsletter' => $this->make_hook('stat_nl', AUTH_PASSWD, 'admin') // Automatic mailing is disabled for X.org NL -// 'admin/newsletter/edit/cancel' => $this->make_hook('cancel', AUTH_MDP, 'admin'), -// 'admin/newsletter/edit/valid' => $this->make_hook('valid', AUTH_MDP, 'admin'), +// 'admin/newsletter/edit/cancel' => $this->make_hook('cancel', AUTH_PASSWD, 'admin'), +// 'admin/newsletter/edit/valid' => $this->make_hook('valid', AUTH_PASSWD, 'admin'), ); } @@ -55,16 +56,26 @@ class NewsletterModule extends PLModule return PL_NOT_FOUND; } - $page->changeTpl('newsletter/index.tpl'); - $page->setTitle('Lettres mensuelles'); - $hash = ($hash == 'nohash') ? null : $hash; switch ($action) { - case 'out': $nl->unsubscribe($issue_id, $hash, $hash != null); break; + case 'out': + $success = $nl->unsubscribe($issue_id, $hash, $hash != null); + if (!is_null($hash)) { + if ($success) { + $page->trigSuccess('La désinscription a été effectuée avec succès.'); + } else { + $page->trigError("La désinscription n'a été pas pu être effectuée."); + } + return; + } + break; case 'in': $nl->subscribe(); break; default: ; } + $page->changeTpl('newsletter/index.tpl'); + $page->setTitle('Lettres mensuelles'); + $page->assign_by_ref('nl', $nl); $page->assign('nls', $nl->subscriptionState()); $page->assign('nl_list', $nl->listSentIssues(true)); @@ -103,7 +114,7 @@ class NewsletterModule extends PLModule } if (!Post::has('nl_search')) { - pl_redirect($nl->prefix()); + pl_redirect($nl->prefix(true, false)); } $nl_search = Post::t('nl_search'); @@ -199,21 +210,42 @@ class NewsletterModule extends PLModule S::logger()->log('nl_issue_create', $nid); $id = $nl->createPending(); - pl_redirect($nl->adminPrefix() . '/edit/' . $id); + pl_redirect($nl->adminPrefix(true, false) . '/edit/' . $id); } $page->assign_by_ref('nl', $nl); $page->assign('nl_list', $nl->listAllIssues()); } - function handler_admin_nl_groups($page) + function handler_admin_nl_groups($page, $sort = 'id', $order = 'ASC') { require_once 'newsletter.inc.php'; + static $titles = array( + 'id' => 'Id', + 'group_name' => 'Groupe', + 'name' => 'Titre', + 'criteria' => 'Critères actifs' + ); + static $next_orders = array( + 'ASC' => 'DESC', + 'DESC' => 'ASC' + ); + + if (!array_key_exists($sort, $titles)) { + $sort = 'id'; + } + if (!in_array($order, array('ASC', 'DESC'))) { + $order = 'ASC'; + } + $page->changeTpl('newsletter/admin_all.tpl'); $page->setTitle('Administration - Newsletters : Liste des Newsletters'); - - $page->assign('nls', Newsletter::getAll()); + $page->assign('nls', Newsletter::getAll($sort, $order)); + $page->assign('sort', $sort); + $page->assign('order', $order); + $page->assign('next_order', $next_orders[$order]); + $page->assign('titles', $titles); } function handler_admin_nl_edit($page, $nid = 'last', $aid = null, $action = 'edit') { @@ -237,6 +269,7 @@ class NewsletterModule extends PLModule // Convert NLIssue error messages to human-readable errors $error_msgs = array( + NLIssue::ERROR_INVALID_REPLY_TO => "L'adresse de réponse est invalide.", NLIssue::ERROR_INVALID_SHORTNAME => "Le nom court est invalide ou vide.", NLIssue::ERROR_INVALID_UFC => "Le filtre des destinataires est invalide.", NLIssue::ERROR_TOO_LONG_UFC => "Le nombre de matricules AX renseigné est trop élevé.", @@ -251,6 +284,7 @@ class NewsletterModule extends PLModule $issue->title_mail = Post::s('title_mail'); $issue->head = Post::s('head'); $issue->signature = Post::s('signature'); + $issue->reply_to = Post::s('reply_to'); if ($issue->isEditable()) { // Date and shortname may only be modified for pending NLs, otherwise all links get broken. @@ -273,7 +307,7 @@ class NewsletterModule extends PLModule // Delete an article if($action == 'delete') { $issue->delArticle($aid); - pl_redirect($nl->adminPrefix() . "/edit/$nid"); + pl_redirect($nl->adminPrefix(true, false) . "/edit/$nid"); } // Save an article @@ -281,7 +315,7 @@ class NewsletterModule extends PLModule $art = new NLArticle(Post::v('title'), Post::v('body'), Post::v('append'), $aid, Post::v('cid'), Post::v('pos')); $issue->saveArticle($art); - pl_redirect($nl->adminPrefix() . "/edit/$nid"); + pl_redirect($nl->adminPrefix(true, false) . "/edit/$nid"); } // Edit an article @@ -386,6 +420,11 @@ class NewsletterModule extends PLModule if (!$issue) { $page->kill("La lettre {$nid} n'existe pas."); } + + if ($issue->isEmpty()) { + $page->trigErrorRedirect("La lettre étant vide, il n'est pas possible de l'envoyer.", $nl->adminPrefix()); + } + if (!$issue->scheduleMailing()) { $page->trigErrorRedirect("Une erreur est survenue lors de la validation de l'envoi.", $nl->adminPrefix()); } @@ -451,13 +490,59 @@ class NewsletterModule extends PLModule $table_editor->describe('nlid', 'ID NL', true); } else { $table_editor->force_field_value('nlid', $nl->id); - $table_editor->describe('nlid', 'nlid', false); + $table_editor->describe('nlid', 'nlid', false, false); } // Prevent deletion. $table_editor->on_delete(null, null); $table_editor->apply($page, $action, $id); } + + function handler_stat_nl($page) + { + $nl = $this->getNl(); + if (!$nl) { + return PL_NOT_FOUND; + } + if (!$nl->mayEdit()) { + return PL_FORBIDDEN; + } + + $page->setTitle('Statistiques - Newsletter'); + $page->changeTpl('newsletter/statistics.tpl'); + + $data = array(); + foreach (Profile::$cycles as $grade => $name) { + $data[$name] = array(); + list($min, $max) = Profile::extremePromotions($grade); + $bound = (((int)($min / 10)) + 1) * 10; + while ($bound <= $max) { + $data[$name][$min . ' - ' . $bound] = array( + 'count' => $nl->subscriberCount(null, null, $grade, $min, $bound), + 'lost' => $nl->subscriberCount(true, null, $grade, $min, $bound), + 'count_female' => $nl->subscriberCount(null, User::GENDER_FEMALE, $grade, $min, $bound), + 'lost_female' => $nl->subscriberCount(true, User::GENDER_FEMALE, $grade, $min, $bound) + ); + $min = $bound + 1; + $bound += 10; + } + $bound -= 9; + if ($bound <= $max) { + $data[$name][$bound . ' - ' . $max] = array( + 'count' => $nl->subscriberCount(null, null, $grade, $bound, $max), + 'lost' => $nl->subscriberCount(true, null, $grade, $bound, $max), + 'count_female' => $nl->subscriberCount(null, User::GENDER_FEMALE, $grade, $bound, $max), + 'lost_female' => $nl->subscriberCount(true, User::GENDER_FEMALE, $grade, $bound, $max) + ); + } + } + $page->assign_by_ref('nl', $nl); + $page->assign('count', $nl->subscriberCount()); + $page->assign('lost', $nl->lostSubscriberCount()); + $page->assign('count_female', $nl->subscriberCount(null, User::GENDER_FEMALE)); + $page->assign('lost_female', $nl->lostSubscriberCount(User::GENDER_FEMALE)); + $page->assign('data', $data); + } } -// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: +// vim:set et sw=4 sts=4 sws=4 foldmethod=marker fenc=utf-8: ?>