Adds sent_at column to the newsletters table

Modifies populator to update existing newsletters' sent_at field
This commit is contained in:
Vlad
2017-07-05 21:39:14 -04:00
parent b691fb5a48
commit 394118f113
3 changed files with 91 additions and 31 deletions

View File

@@ -211,6 +211,7 @@ class Migrator {
'reply_to_name varchar(150) NOT NULL DEFAULT "",', 'reply_to_name varchar(150) NOT NULL DEFAULT "",',
'preheader varchar(250) NOT NULL DEFAULT "",', 'preheader varchar(250) NOT NULL DEFAULT "",',
'body longtext,', 'body longtext,',
'sent_at TIMESTAMP NULL,',
'created_at TIMESTAMP NULL,', 'created_at TIMESTAMP NULL,',
'updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,', 'updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,',
'deleted_at TIMESTAMP NULL,', 'deleted_at TIMESTAMP NULL,',

View File

@@ -3,7 +3,9 @@ namespace MailPoet\Config;
use MailPoet\Cron\CronTrigger; use MailPoet\Cron\CronTrigger;
use MailPoet\Mailer\MailerLog; use MailPoet\Mailer\MailerLog;
use MailPoet\Models\Newsletter;
use MailPoet\Models\Segment; use MailPoet\Models\Segment;
use MailPoet\Models\SendingQueue;
use MailPoet\Segments\WP; use MailPoet\Segments\WP;
use MailPoet\Models\Setting; use MailPoet\Models\Setting;
use MailPoet\Settings\Pages; use MailPoet\Settings\Pages;
@@ -26,37 +28,38 @@ class Populator {
'newsletter_templates', 'newsletter_templates',
); );
$this->templates = array( $this->templates = array(
"NewsletterBlank1Column", 'NewsletterBlank1Column',
"NewsletterBlank12Column", 'NewsletterBlank12Column',
"NewsletterBlank121Column", 'NewsletterBlank121Column',
"NewsletterBlank13Column", 'NewsletterBlank13Column',
"PostNotificationsBlank1Column", 'PostNotificationsBlank1Column',
"WelcomeBlank1Column", 'WelcomeBlank1Column',
"WelcomeBlank12Column", 'WelcomeBlank12Column',
"SimpleText", 'SimpleText',
"BurgerJoint", 'BurgerJoint',
"AppWelcome", 'AppWelcome',
"WorldCup", 'WorldCup',
"FoodBox", 'FoodBox',
"Discount", 'Discount',
"KickOff", 'KickOff',
"TakeAHike", 'TakeAHike',
"FestivalEvent", 'FestivalEvent',
"PieceOfCake", 'PieceOfCake',
"Shoes", 'Shoes',
"ScienceWeekly", 'ScienceWeekly',
"ChocolateStore", 'ChocolateStore',
"Faith", 'Faith',
"TravelNomads", 'TravelNomads',
"CoffeeShop", 'CoffeeShop',
"NewsDay", 'NewsDay',
"YogaStudio", 'YogaStudio',
); );
} }
function up() { function up() {
$this->convertExistingDataToUTF8(); $this->convertExistingDataToUTF8();
$this->migrateSimpleScheduledTasks(); $this->migrateSimpleScheduledTasks();
$this->populateNewsletterSentAtField();
array_map(array($this, 'populate'), $this->models); array_map(array($this, 'populate'), $this->models);
@@ -328,8 +331,10 @@ class Populator {
* character set, which usually defaults to latin1, but stored UTF-8 data. * character set, which usually defaults to latin1, but stored UTF-8 data.
* This method converts existing incorrectly stored data that uses the * This method converts existing incorrectly stored data that uses the
* default character set, into a new character set that is used by WordPress. * default character set, into a new character set that is used by WordPress.
*
* TODO: remove in final release
*/ */
public function convertExistingDataToUTF8() { function convertExistingDataToUTF8() {
global $wpdb; global $wpdb;
if(!version_compare(get_option('mailpoet_db_version'), '3.0.0-beta.32', '<=')) { if(!version_compare(get_option('mailpoet_db_version'), '3.0.0-beta.32', '<=')) {
@@ -361,7 +366,6 @@ class Populator {
'forms' => array('name', 'body', 'settings', 'styles'), 'forms' => array('name', 'body', 'settings', 'styles'),
); );
foreach($tables as $table => $columns) { foreach($tables as $table => $columns) {
$query = "UPDATE `%s` SET %s WHERE %s"; $query = "UPDATE `%s` SET %s WHERE %s";
$columns_query = array(); $columns_query = array();
@@ -387,15 +391,16 @@ class Populator {
} }
} }
/** /*
* This migrates simple scheduled tasks from sending queues table to scheduled tasks table * This migrates simple scheduled tasks from sending queues table to scheduled tasks table
*
* TODO: remove in final release
*/ */
public function migrateSimpleScheduledTasks() { public function migrateSimpleScheduledTasks() {
global $wpdb; global $wpdb;
if(!version_compare(get_option('mailpoet_db_version'), '3.0.0-beta.36.2.0', '<=')) { // perform once for versions below 3.0.0-beta.36.2.1
// Data conversion should only be performed only once, when migrating from if(version_compare(get_option('mailpoet_db_version'), '3.0.0-beta.36.2.1', '>=')) {
// older version
return; return;
} }
@@ -436,4 +441,25 @@ class Populator {
)); ));
} }
/*
* This populates existing newsletters' sent_at field with processed_at field data from
* corresponding sending queue.
*
* TODO: remove in final release
*/
function populateNewsletterSentAtField() {
global $wpdb;
// perform once for versions below 3.0.0-beta.36.2.1
if(version_compare(get_option('mailpoet_db_version'), '3.0.0-beta.36.2.1', '>=')) {
return;
}
$query = "UPDATE `%s` newsletters JOIN `%s` queues ON newsletters.id = queues.newsletter_id SET newsletters.sent_at = queues.processed_at";
$wpdb->query(sprintf(
$query,
Newsletter::$_table,
SendingQueue::$_table
));
}
} }

View File

@@ -0,0 +1,33 @@
<?php
use MailPoet\Config\Populator;
use MailPoet\Models\Newsletter;
use MailPoet\Models\SendingQueue;
class PopulatorTest extends MailPoetTest {
function testItPopulatesNewslettersTableSentAtColumn() {
// TODO: remove in final release
$newsletters = array();
for($i = 1; $i <= 3; $i++) {
$newsletters[$i] = Newsletter::create();
$newsletters[$i]->type = Newsletter::TYPE_STANDARD;
$newsletters[$i]->save();
}
expect(Newsletter::whereNull('sent_at')->findMany())->count(3);
$sending_queue = SendingQueue::create();
$sending_queue->newsletter_id = $newsletters[1]->id;
$sending_queue->processed_at = date( 'Y-m-d H:i:s');
$sending_queue->save();
$populator = new Populator();
$populator->populateNewsletterSentAtField();
expect(Newsletter::whereNull('sent_at')->findMany())->count(2);
expect(Newsletter::whereNotNull('sent_at')->findMany())->count(1);
}
function _after() {
ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);
ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table);
}
}