}
}
+ /** Subscribe a batch of users to a newsletter.
+ * This skips 'maySubscribe' test.
+ *
+ * @p $user_ids Array of user IDs to subscribe to the newsletter.
+ */
+ public function bulkSubscribe($user_ids)
+ {
+ // TODO: use a 'bulkMaySubscribe'.
+ XDB::execute('INSERT IGNORE INTO newsletter_ins (nlid, uid, last, hash)
+ SELECT {?}, a.uid, NULL, NULL
+ FROM accounts AS a
+ WHERE a.uid IN {?}',
+ $this->id, $user_ids);
+ }
+
/** Retrieve subscription state of a user
* @p $user Target user; if null, use current user.
* @return Boolean: true if the user has subscribed to the NL.
/** Get the prefix leading to the page for this NL
* Only X.org / AX / X groups may be seen on X.org.
*/
- public function prefix($enforce_xnet=true)
+ public function prefix($enforce_xnet=true, $with_group=true)
{
if (!empty($GLOBALS['IS_XNET_SITE'])) {
- return $this->group . '/nl';
+ if ($with_group) {
+ return $this->group . '/nl';
+ } else {
+ return 'nl';
+ }
}
switch ($this->group) {
case self::GROUP_XORG:
/** Get the prefix to use for all 'admin' pages of this NL.
*/
- public function adminPrefix($enforce_xnet=true)
+ public function adminPrefix($enforce_xnet=true, $with_group=true)
{
if (!empty($GLOBALS['IS_XNET_SITE'])) {
- return $this->group . '/admin/nl';
+ if ($with_group) {
+ return $this->group . '/admin/nl';
+ } else {
+ return 'admin/nl';
+ }
}
switch ($this->group) {
case self::GROUP_XORG:
return $this->custom_css;
}
+ public function canSyncWithGroup()
+ {
+ switch ($this->group) {
+ case self::GROUP_XORG:
+ case self::GROUP_AX:
+ case self::GROUP_EP:
+ return false;
+ default:
+ return true;
+ }
+ }
+
// }}}
}
public function last()
{
if (is_null($this->id_last)) {
- $this->id_last = $this->nl->getIssue('last')->id;
+ try {
+ $this->id_last = $this->nl->getIssue('last')->id;
+ } catch (MailNotFound $e) {
+ $this->id_last = null;
+ }
}
return $this->id_last;
}
$this->id);
$ufc = new PFC_And($this->getRecipientsUFC(), new UFC_NLSubscribed($this->nl->id, $this->id), new UFC_HasValidEmail());
- $emailsCount = 0;
$uf = new UserFilter($ufc, array(new UFO_IsAdmin(), new UFO_Uid()));
$limit = new PlLimit(self::BATCH_SIZE);
+ $global_sent = array();
while (true) {
$sent = array();
$users = $uf->getUsers($limit);
if (count($users) == 0) {
- return $emailsCount;
+ break;
}
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.');
+ }
$sent[] = $user->id();
+ $global_sent[$user->id()] = true;
$this->sendTo($user, $hash);
- ++$emailsCount;
}
XDB::execute("UPDATE newsletter_ins
SET last = {?}
sleep(60);
}
- return $emailsCount;
+ return count($global_sent);
}
// }}}