Set newsletter status as draft when restoring newsletters trashed during sending [MAILPOET-816]

This commit is contained in:
Alexey Stoletniy
2017-02-21 13:13:59 +03:00
parent c98cdb3e57
commit bcf89f0dfe
3 changed files with 69 additions and 3 deletions

View File

@ -715,4 +715,23 @@ class Newsletter extends Model {
self::NEWSLETTER_HASH_LENGTH
);
}
function restore() {
if ($this->status == self::STATUS_SENDING) {
$this->set('status', self::STATUS_DRAFT);
$this->save();
}
return parent::restore();
}
static function bulkRestore($orm) {
parent::bulkAction($orm, function($ids) {
Newsletter::whereIn('id', $ids)
->where('status', Newsletter::STATUS_SENDING)
->findResultSet()
->set('status', Newsletter::STATUS_DRAFT)
->save();
});
return parent::bulkRestore($orm);
}
}

View File

@ -136,6 +136,9 @@ abstract class ValidModel extends \Model {
} else {
$this->validateAndSet($key, $value);
}
// we should return $this to not break Idiorm's fluent interface:
// $model->set('property', 'foo')->save();
return $this;
}

View File

@ -16,7 +16,7 @@ class NewsletterTest extends MailPoetTest {
$this->newsletter = Newsletter::createOrUpdate(array(
'subject' => 'My Standard Newsletter',
'preheader' => 'Pre Header',
'type' => 'standard'
'type' => Newsletter::TYPE_STANDARD
));
$this->segment_1 = Segment::createOrUpdate(array(
@ -162,7 +162,7 @@ class NewsletterTest extends MailPoetTest {
$is_created = Newsletter::createOrUpdate(
array(
'subject' => 'new newsletter',
'type' => 'standard',
'type' => Newsletter::TYPE_STANDARD,
'body' => 'body'
));
expect($is_created->id() > 0)->true();
@ -246,7 +246,7 @@ class NewsletterTest extends MailPoetTest {
Newsletter::createOrUpdate(
array(
'subject' => 'search for "pineapple"',
'type' => 'standard',
'type' => Newsletter::TYPE_STANDARD,
'body' => 'body'
));
$newsletter = Newsletter::filter('search', 'pineapple')
@ -384,6 +384,50 @@ class NewsletterTest extends MailPoetTest {
expect($this->newsletter->queue()->findOne()->id)->equals($queue->id);
}
function testItCanBeRestored() {
$this->newsletter->status = Newsletter::STATUS_SENT;
$this->newsletter->trash();
expect($this->newsletter->deleted_at)->notNull();
$this->newsletter->restore();
expect($this->newsletter->deleted_at)->equals('NULL');
expect($this->newsletter->status)->equals(Newsletter::STATUS_SENT);
// if the restored newsletter was trashed while in sending,
// its status should be set to 'draft' to be able to send it again
$this->newsletter->status = Newsletter::STATUS_SENDING;
$this->newsletter->trash();
$this->newsletter->restore();
expect($this->newsletter->status)->equals(Newsletter::STATUS_DRAFT);
}
function testItCanBulkRestoreNewsletters() {
$statuses = array(
Newsletter::STATUS_DRAFT,
Newsletter::STATUS_SENT,
Newsletter::STATUS_SENDING
);
$newsletters = array();
for($i = 0; $i < count($statuses); $i++) {
$newsletters[$i] = Newsletter::createOrUpdate(
array(
'subject' => 'Test',
'preheader' => 'Some text',
'type' => Newsletter::TYPE_STANDARD,
'status' => $statuses[$i]
)
);
}
Newsletter::filter('bulkTrash');
expect(Newsletter::whereNull('deleted_at')->findArray())->isEmpty();
expect(Newsletter::where('status', Newsletter::STATUS_SENDING)->findArray())->count(1);
Newsletter::filter('bulkRestore');
expect(Newsletter::whereNotNull('deleted_at')->findArray())->isEmpty();
expect(Newsletter::where('status', Newsletter::STATUS_SENDING)->findArray())->count(0);
}
function _after() {
ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table);
ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);