X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=include%2Fnewsletter.inc.php;h=b9e51dcf59a1431e22770bbfc034b55bd9eb3282;hb=5a8a7dad52b11bee51d21887efcfe38050e28494;hp=2f6ccca41fb87c5f2bd5a8bd8a4afec49bf89659;hpb=e4b8520cb1fbd583010c36a29ac99744a8389d43;p=platal.git diff --git a/include/newsletter.inc.php b/include/newsletter.inc.php index 2f6ccca..b9e51dc 100644 --- a/include/newsletter.inc.php +++ b/include/newsletter.inc.php @@ -105,15 +105,13 @@ class NewsLetter /** Retrieve all newsletters * @return An array of $id => NewsLetter objects */ - public static function getAll() + public static function getAll($sort = 'id', $order = 'ASC') { - $res = XDB::query('SELECT id - FROM newsletters'); - $nls = array(); - foreach ($res->fetchColumn() as $id) { - $nls[$id] = new NewsLetter($id); - } - return $nls; + $res = XDB::fetchAllAssoc('SELECT n.id, g.nom AS group_name, n.name, n.custom_css, n.criteria, g.diminutif AS group_link + FROM newsletters AS n + INNER JOIN groups AS g ON (n.group_id = g.id) + ORDER BY ' . $sort . ' ' . $order); + return $res; } // }}} @@ -407,6 +405,20 @@ class NewsLetter WHERE nlid = {?}', $this->id); } + /** Get the count of subscribers with non valid redirection. + */ + public function lostSubscriberCount() + { + return XDB::fetchOneCell('SELECT COUNT(DISTINCT(n.uid)) + FROM newsletter_ins AS n + INNER JOIN accounts AS a ON (n.uid = a.uid) + INNER JOIN account_types AS t ON (t.type = a.type) + LEFT JOIN email_redirect_account AS r ON (r.uid = a.uid AND r.flags = \'active\' AND r.broken_level < 3 + AND r.type != \'imap\' AND r.type != \'homonym\') + WHERE n.nlid = {?} AND r.redirect IS NULL AND a.state = \'active\' AND FIND_IN_SET(\'mail\', t.perms)', + $this->id); + } + /** Get the number of subscribers to the NL whose last received mailing was $last. * @p $last ID of the issue for which subscribers should be counted. * @return Number of subscribers @@ -562,6 +574,16 @@ class NewsLetter } } + /** Get links for nl pages. + */ + public function adminLinks() + { + return array( + 'index' => array('link' => $this->prefix(), 'title' => 'Archives'), + 'admin' => array('link' => $this->adminPrefix(), 'title' => 'Administrer') + ); + } + /** Hack used to remove "admin" links on X.org page on X.net * The 'admin' links are enabled for all pages, except for X.org when accessing NL through X.net */ @@ -623,6 +645,7 @@ class NLIssue public $send_before; // Date at which issue should be sent public $head; // Foreword of the issue (or body for letters with no articles) public $signature; // Signature of the letter + public $reply_to; // Adress to reply to the message (can be empty) public $arts = array(); // Articles of the issue const BATCH_SIZE = 60; // Number of emails to send every minute. @@ -647,7 +670,7 @@ class NLIssue { // Load this issue $res = XDB::query('SELECT nlid, short_name, date, send_before, state, sufb_json, - title, mail_title, head, signature + title, mail_title, head, signature, reply_to FROM newsletter_issues WHERE id = {?}', $id); @@ -670,6 +693,7 @@ class NLIssue $this->title_mail = $issue['mail_title']; $this->head = $issue['head']; $this->signature = $issue['signature']; + $this->reply_to = $issue['reply_to']; $this->sufb = $this->importJSonStoredUFB($issue['sufb_json']); if ($fetch_articles) { @@ -872,6 +896,7 @@ class NLIssue // }}} // {{{ Edition, articles + const ERROR_INVALID_REPLY_TO = 'invalid_reply_to'; const ERROR_INVALID_SHORTNAME = 'invalid_shortname'; const ERROR_INVALID_UFC = 'invalid_ufc'; const ERROR_TOO_LONG_UFC = 'too_long_ufc'; @@ -891,6 +916,12 @@ class NLIssue 'signature' => $this->signature, ); + if (!empty($this->reply_to) && !isvalid_email($this->reply_to)) { + $errors[] = self::ERROR_INVALID_REPLY_TO ; + } else { + $fields['reply_to'] = $this->reply_to; + } + if ($this->isEditable()) { $fields['date'] = $this->date; if (!preg_match('/^[-a-z0-9]+$/i', $this->shortname) || is_numeric($this->shortname)) { @@ -1167,6 +1198,9 @@ class NLIssue $mailer->assign('user', $user); $mailer->assign('prefix', null); $mailer->assign('hash', $hash); + if (!empty($this->reply_to)) { + $mailer->addHeader('Reply-To', $this->reply_to); + } $mailer->sendTo($user); } @@ -1205,7 +1239,7 @@ class NLIssue $this->id); $ufc = new PFC_And($this->getRecipientsUFC(), new UFC_NLSubscribed($this->nl->id, $this->id), new UFC_HasValidEmail()); - $uf = new UserFilter($ufc, array(new UFO_IsAdmin(), new UFO_Uid())); + $uf = new UserFilter($ufc, array(new UFO_IsAdmin(true), new UFO_Uid())); $limit = new PlLimit(self::BATCH_SIZE); $global_sent = array(); @@ -1217,7 +1251,7 @@ class NLIssue } foreach ($users as $user) { if (array_key_exists($user->id(), $global_sent)) { - Platal::kill('Sending the same newsletter issue ' . $this->id . ' to user ' . $user->id() . ' twice, something must be wrong.'); + Platal::page()->kill('Sending the same newsletter issue ' . $this->id . ' to user ' . $user->id() . ' twice, something must be wrong.'); } $sent[] = $user->id(); $global_sent[$user->id()] = true;