- Enables check for subscribers who has "subscribed" status during

newsletter sending
- Enforces "signup_confirmation" option when selecting subscribers for
  newsletter sending
- Updates unit tests
This commit is contained in:
Vlad
2016-04-15 19:57:18 -04:00
committed by Tautvidas Sipavičius
parent d4abaa7150
commit 91076580ef
4 changed files with 74 additions and 14 deletions

View File

@ -65,8 +65,15 @@ class Scheduler {
function processPostNotificationNewsletter($newsletter, $queue) { function processPostNotificationNewsletter($newsletter, $queue) {
$next_run_date = $this->getQueueNextRunDate($newsletter->schedule); $next_run_date = $this->getQueueNextRunDate($newsletter->schedule);
$segments = unserialize($newsletter->segments); $segments = unserialize($newsletter->segments);
$subscribers = SubscriberSegment::whereIn('segment_id', $segments) if((boolean) Setting::getValue('signup_confirmation.enabled')) {
$subscribers = Subscriber::getSubscribedInSegments($segments)
->findArray(); ->findArray();
}
else {
$subscribers = SubscriberSegment::whereIn('segment_id', $segments)
->where('status', 'subscribed')
->findArray();
}
$subscribers = Helpers::arrayColumn($subscribers, 'subscriber_id'); $subscribers = Helpers::arrayColumn($subscribers, 'subscriber_id');
$subscribers = array_unique($subscribers); $subscribers = array_unique($subscribers);
if(!count($subscribers) || !$this->checkIfNewsletterChanged($newsletter)) { if(!count($subscribers) || !$this->checkIfNewsletterChanged($newsletter)) {

View File

@ -316,6 +316,19 @@ class Subscriber extends Model {
return $orm; return $orm;
} }
static function getSubscribedInSegments($segment_ids) {
$subscribers = SubscriberSegment::table_alias('relation')
->whereIn('relation.segment_id', $segment_ids)
->where('relation.status', 'subscribed')
->join(
MP_SUBSCRIBERS_TABLE,
'subscribers.id = relation.subscriber_id',
'subscribers'
)
->where('subscribers.status', 'subscribed');
return $subscribers;
}
function customFields() { function customFields() {
return $this->hasManyThrough( return $this->hasManyThrough(
__NAMESPACE__.'\CustomField', __NAMESPACE__.'\CustomField',

View File

@ -5,6 +5,8 @@ use MailPoet\Mailer\Mailer;
use MailPoet\Models\Newsletter; use MailPoet\Models\Newsletter;
use MailPoet\Models\NewsletterOption; use MailPoet\Models\NewsletterOption;
use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\NewsletterOptionField;
use MailPoet\Models\Setting;
use MailPoet\Models\Subscriber;
use MailPoet\Models\SubscriberSegment; use MailPoet\Models\SubscriberSegment;
use MailPoet\Util\Helpers; use MailPoet\Util\Helpers;
use Cron\CronExpression as Cron; use Cron\CronExpression as Cron;
@ -81,9 +83,18 @@ class SendingQueue {
$queue = \MailPoet\Models\SendingQueue::create(); $queue = \MailPoet\Models\SendingQueue::create();
$queue->newsletter_id = $newsletter->id; $queue->newsletter_id = $newsletter->id;
$subscribers = SubscriberSegment::whereIn('segment_id', $data['segments'])
if((boolean) Setting::getValue('signup_confirmation.enabled')) {
$subscribers = Subscriber::getSubscribedInSegments($data['segments'])
->findArray(); ->findArray();
}
else {
$subscribers = SubscriberSegment::whereIn('segment_id', $data['segments'])
->where('status', 'subscribed')
->findArray();
}
$subscribers = Helpers::arrayColumn($subscribers, 'subscriber_id'); $subscribers = Helpers::arrayColumn($subscribers, 'subscriber_id');
$subscribers = array_unique($subscribers); $subscribers = array_unique($subscribers);
if(!count($subscribers)) { if(!count($subscribers)) {
return array( return array(

View File

@ -389,16 +389,45 @@ class SubscriberTest extends MailPoetTest {
->equals('non_default_value'); ->equals('non_default_value');
} }
function testItCanGetOnlySubscribedSubscribersInSegments() {
ORM::raw_execute('TRUNCATE ' . Subscriber::$_table);
$columns = array(
'first_name',
'last_name',
'email',
'status'
);
$values = array(
array(
'first_name' => 'Adam',
'last_name' => 'Smith',
'email' => 'adam@smith.com',
'status' => 'unconfirmed'
),
array(
'first_name' => 'Mary',
'last_name' => 'Jane',
'email' => 'mary@jane.com',
'status' => 'subscribed'
)
);
Subscriber::createMultiple($columns, $values);
SubscriberSegment::createMultiple(array(1), array(1,2));
$subscribed_subscribers_in_segment =
Subscriber::getSubscribedInSegments(array(1))->findArray();
expect(count($subscribed_subscribers_in_segment))->equals(1);
$subscriber = Subscriber::findOne(1);
$subscriber->status = 'subscribed';
$subscriber->save();
$subscribed_subscribers_in_segment =
Subscriber::getSubscribedInSegments(array(1))->findArray();
expect(count($subscribed_subscribers_in_segment))->equals(2);
}
function _after() { function _after() {
ORM::forTable(Subscriber::$_table) ORM::raw_execute('TRUNCATE ' . Subscriber::$_table);
->deleteMany(); ORM::raw_execute('TRUNCATE ' . Segment::$_table);
ORM::forTable(Segment::$_table) ORM::raw_execute('TRUNCATE ' . SubscriberSegment::$_table);
->deleteMany(); ORM::raw_execute('TRUNCATE ' . CustomField::$_table);
ORM::forTable(SubscriberSegment::$_table) ORM::raw_execute('TRUNCATE ' . SubscriberCustomField::$_table);
->deleteMany();
ORM::forTable(CustomField::$_table)
->deleteMany();
ORM::forTable(SubscriberCustomField::$_table)
->deleteMany();
} }
} }