X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=modules%2Fnewsletter.php;h=6603bc86199b4a7a3df2283da11b9d94dcc3e712;hb=6cce7840e69bc0b6647e1bc5ea3437a925cd63a0;hp=632f375457122d8b6d27f70b22f0ab3f4dc8f075;hpb=4d61c1bbf33a48033b9f172645b6b7b179aaf9b9;p=platal.git diff --git a/modules/newsletter.php b/modules/newsletter.php index 632f375..6603bc8 100644 --- a/modules/newsletter.php +++ b/modules/newsletter.php @@ -24,15 +24,16 @@ class NewsletterModule extends PLModule function handlers() { return array( - 'nl' => $this->make_hook('nl', AUTH_COOKIE), - 'nl/show' => $this->make_hook('nl_show', 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('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_MDP, 'user'), + 'nl/remaining' => $this->make_hook('nl_remaining', AUTH_MDP, 'user'), + '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'), // 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'), @@ -47,22 +48,33 @@ class NewsletterModule extends PLModule return NewsLetter::forGroup(NewsLetter::GROUP_XORG); } - function handler_nl($page, $action = null, $hash = null) + function handler_nl($page, $action = null, $hash = null, $issue_id = null) { $nl = $this->getNl(); if (!$nl) { return PL_NOT_FOUND; } - $page->changeTpl('newsletter/index.tpl'); - $page->setTitle('Lettres mensuelles'); - + $hash = ($hash == 'nohash') ? null : $hash; switch ($action) { - case 'out': $nl->unsubscribe($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)); @@ -92,6 +104,55 @@ class NewsletterModule extends PLModule } } + function handler_nl_search($page) + { + S::assert_xsrf_token(); + $nl = $this->getNl(); + if (!$nl) { + return PL_NOT_FOUND; + } + + if (!Post::has('nl_search')) { + pl_redirect($nl->prefix(true, false)); + } + + $nl_search = Post::t('nl_search'); + $nl_search_type = Post::t('nl_search_type'); + if (!$nl_search || !($nl_search_type > 0 && $nl_search_type < 10)) { + $page->trigErrorRedirect('La recherche est vide ou erronée.', $nl->prefix()); + } + + $page->changeTpl('newsletter/search.tpl'); + $user = S::user(); + $fields = array(1 => 'all', 2 => 'all', 3 => 'title', 4 => 'body', 5 => 'append', 6 => 'all', 7 => 'title', 8 => 'head', 9 => 'signature'); + $res_articles = $res_issues = array(); + if ($nl_search_type < 6) { + $res_articles = $nl->articleSearch($nl_search, $fields[$nl_search_type], $user); + } + if ($nl_search_type > 5 || $nl_search_type == 1) { + $res_issues = $nl->issueSearch($nl_search, $fields[$nl_search_type], $user); + } + + $articles_count = count($res_articles); + $issues_count = count($res_issues); + $results_count = $articles_count + $issues_count; + if ($results_count > 200) { + $page->trigError('Recherche trop générale.'); + } elseif ($results_count == 0) { + $page->trigWarning('Aucun résultat pour cette recherche.'); + } else { + $page->assign('res_articles', $res_articles); + $page->assign('res_issues', $res_issues); + $page->assign('articles_count', $articles_count); + $page->assign('issues_count', $issues_count); + } + + $page->assign_by_ref('nl', $nl); + $page->assign('nl_search', $nl_search); + $page->assign('nl_search_type', $nl_search_type); + $page->assign('results_count', $results_count); + } + function handler_nl_submit($page) { $page->changeTpl('newsletter/submit.tpl'); @@ -144,8 +205,11 @@ class NewsletterModule extends PLModule } if ($new == 'new') { + // Logs NL creation. + 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); @@ -185,6 +249,7 @@ class NewsletterModule extends PLModule $error_msgs = array( 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é.", NLIssue::ERROR_SQL_SAVE => "Une erreur est survenue en tentant de sauvegarder la lettre, merci de réessayer.", ); @@ -218,7 +283,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 @@ -226,7 +291,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 @@ -303,6 +368,9 @@ class NewsletterModule extends PLModule $page->trigErrorRedirect("Une erreur est survenue lors de l'annulation de l'envoi.", $nl->adminPrefix()); } + // Logs NL cancelling. + S::logger()->log('nl_mailing_cancel', $nid); + $page->trigSuccessRedirect("L'envoi de l'annonce {$issue->title()} est annulé.", $nl->adminPrefix()); } @@ -332,6 +400,9 @@ class NewsletterModule extends PLModule $page->trigErrorRedirect("Une erreur est survenue lors de la validation de l'envoi.", $nl->adminPrefix()); } + // Logs NL validation. + S::logger()->log('nl_mailing_valid', $nid); + $page->trigSuccessRedirect("L'envoi de la newsletter {$issue->title()} a été validé.", $nl->adminPrefix()); } @@ -363,15 +434,37 @@ class NewsletterModule extends PLModule $page->trigErrorRedirect("Une erreur est survenue lors de la suppression de la lettre.", $nl->adminPrefix()); } + // Logs NL deletion. + S::logger()->log('nl_issue_delete', $nid); + $page->trigSuccessRedirect("La lettre a bien été supprimée.", $nl->adminPrefix()); } function handler_admin_nl_cat($page, $action = 'list', $id = null) { + $nl = $this->getNl(); + if (!$nl) { + return PL_NOT_FOUND; + } + + if (!$nl->mayEdit()) { + return PL_FORBIDDEN; + } + $page->setTitle('Administration - Newsletter : Catégories'); $page->assign('title', 'Gestion des catégories de la newsletter'); - $table_editor = new PLTableEditor('admin/newsletter/categories','newsletter_cat','cid'); + $table_editor = new PLTableEditor($nl->adminPrefix() . '/categories', 'newsletter_cat','cid'); $table_editor->describe('title','intitulé',true); $table_editor->describe('pos','position',true); + if ($nl->group == Newsletter::GROUP_XORG) { + $table_editor->add_option_table('newsletters', 'newsletters.id = t.nlid'); + $table_editor->add_option_field('newsletters.name', 'newsletter_name', 'Newsletter', null, 'nlid'); + $table_editor->describe('nlid', 'ID NL', true); + } else { + $table_editor->force_field_value('nlid', $nl->id); + $table_editor->describe('nlid', 'nlid', false, false); + } + // Prevent deletion. + $table_editor->on_delete(null, null); $table_editor->apply($page, $action, $id); } }