Merge pull request #1348 from mailpoet/gdpr-opens

Export viewed emails [MAILPOET-1356]
This commit is contained in:
Michelle Shull
2018-05-14 07:00:46 -04:00
committed by GitHub
6 changed files with 85 additions and 19 deletions

View File

@@ -34,12 +34,18 @@ class StatisticsNewsletters extends Model {
return static::table_alias('statistics') return static::table_alias('statistics')
->select('statistics.newsletter_id', 'newsletter_id') ->select('statistics.newsletter_id', 'newsletter_id')
->select('newsletter_rendered_subject') ->select('newsletter_rendered_subject')
->select('opens.created_at', 'opened_at')
->select('sent_at') ->select('sent_at')
->join( ->join(
SendingQueue::$_table, SendingQueue::$_table,
array('statistics.queue_id', '=', 'queue.id'), array('statistics.queue_id', '=', 'queue.id'),
'queue' 'queue'
) )
->leftOuterJoin(
StatisticsOpens::$_table,
array('statistics.newsletter_id', '=', 'opens.newsletter_id'),
'opens'
)
->where('statistics.subscriber_id', $subscriber->id()) ->where('statistics.subscriber_id', $subscriber->id())
->orderByAsc('newsletter_id'); ->orderByAsc('newsletter_id');
} }

View File

@@ -40,16 +40,31 @@ class NewslettersExporter {
private function exportNewsletter($statistics_row, $newsletters, $subscriber) { private function exportNewsletter($statistics_row, $newsletters, $subscriber) {
$newsletter_data = array(); $newsletter_data = array();
$newsletter_data[] = array( $newsletter_data[] = array(
'name' => __('Email subject'), 'name' => __('Email subject', 'mailpoet'),
'value' => $statistics_row['newsletter_rendered_subject'], 'value' => $statistics_row['newsletter_rendered_subject'],
); );
$newsletter_data[] = array( $newsletter_data[] = array(
'name' => __('Sent at'), 'name' => __('Sent at', 'mailpoet'),
'value' => $statistics_row['sent_at'], 'value' => $statistics_row['sent_at'],
); );
if(isset($statistics_row['opened_at'])) {
$newsletter_data[] = array(
'name' => __('Opened', 'mailpoet'),
'value' => 'Yes',
);
$newsletter_data[] = array(
'name' => __('Opened at', 'mailpoet'),
'value' => $statistics_row['opened_at'],
);
} else {
$newsletter_data[] = array(
'name' => __('Opened', 'mailpoet'),
'value' => __('No', 'mailpoet'),
);
}
if(isset($newsletters[$statistics_row['newsletter_id']])) { if(isset($newsletters[$statistics_row['newsletter_id']])) {
$newsletter_data[] = array( $newsletter_data[] = array(
'name' => __('Email preview'), 'name' => __('Email preview', 'mailpoet'),
'value' => Url::getViewInBrowserUrl( 'value' => Url::getViewInBrowserUrl(
'', '',
$newsletters[$statistics_row['newsletter_id']], $newsletters[$statistics_row['newsletter_id']],
@@ -61,7 +76,7 @@ class NewslettersExporter {
} }
return array( return array(
'group_id' => 'mailpoet-newsletters', 'group_id' => 'mailpoet-newsletters',
'group_label' => __('MailPoet Emails Sent'), 'group_label' => __('MailPoet Emails Sent', 'mailpoet'),
'item_id' => 'newsletter-' . $statistics_row['newsletter_id'], 'item_id' => 'newsletter-' . $statistics_row['newsletter_id'],
'data' => $newsletter_data, 'data' => $newsletter_data,
); );

View File

@@ -29,20 +29,20 @@ class SegmentsExporter {
private function exportSegment($segment) { private function exportSegment($segment) {
$segment_data = array(); $segment_data = array();
$segment_data[] = array( $segment_data[] = array(
'name' => __('List name'), 'name' => __('List name', 'mailpoet'),
'value' => $segment['name'], 'value' => $segment['name'],
); );
$segment_data[] = array( $segment_data[] = array(
'name' => __('Subscription status'), 'name' => __('Subscription status', 'mailpoet'),
'value' => $segment['status'], 'value' => $segment['status'],
); );
$segment_data[] = array( $segment_data[] = array(
'name' => __('Timestamp of the subscription (or last change of the subscription status)'), 'name' => __('Timestamp of the subscription (or last change of the subscription status)', 'mailpoet'),
'value' => $segment['updated_at'], 'value' => $segment['updated_at'],
); );
return array( return array(
'group_id' => 'mailpoet-lists', 'group_id' => 'mailpoet-lists',
'group_label' => __('MailPoet Mailing Lists'), 'group_label' => __('MailPoet Mailing Lists', 'mailpoet'),
'item_id' => 'list-' . $segment['segment_id'], 'item_id' => 'list-' . $segment['segment_id'],
'data' => $segment_data, 'data' => $segment_data,
); );

View File

@@ -18,7 +18,7 @@ class SubscriberExporter {
if(!$subscriber) return array(); if(!$subscriber) return array();
return array(array( return array(array(
'group_id' => 'mailpoet-subscriber', 'group_id' => 'mailpoet-subscriber',
'group_label' => __('MailPoet Subscriber Data'), 'group_label' => __('MailPoet Subscriber Data', 'mailpoet'),
'item_id' => 'subscriber-' . $subscriber->id, 'item_id' => 'subscriber-' . $subscriber->id,
'data' => $this->getSubscriberExportData($subscriber->withCustomFields()), 'data' => $this->getSubscriberExportData($subscriber->withCustomFields()),
)); ));
@@ -28,36 +28,36 @@ class SubscriberExporter {
$custom_fields = $this->getCustomFields(); $custom_fields = $this->getCustomFields();
$result = array( $result = array(
array( array(
'name' => __('First Name'), 'name' => __('First Name', 'mailpoet'),
'value' => $subscriber->first_name, 'value' => $subscriber->first_name,
), ),
array( array(
'name' => __('Last Name'), 'name' => __('Last Name', 'mailpoet'),
'value' => $subscriber->last_name, 'value' => $subscriber->last_name,
), ),
array( array(
'name' => __('Email'), 'name' => __('Email', 'mailpoet'),
'value' => $subscriber->email, 'value' => $subscriber->email,
), ),
array( array(
'name' => __('Status'), 'name' => __('Status', 'mailpoet'),
'value' => $subscriber->status, 'value' => $subscriber->status,
), ),
); );
if($subscriber->subscribed_ip) { if($subscriber->subscribed_ip) {
$result[] = array( $result[] = array(
'name' => __('Subscribed IP'), 'name' => __('Subscribed IP', 'mailpoet'),
'value' => $subscriber->subscribed_ip, 'value' => $subscriber->subscribed_ip,
); );
} }
if($subscriber->confirmed_ip) { if($subscriber->confirmed_ip) {
$result[] = array( $result[] = array(
'name' => __('Confirmed IP'), 'name' => __('Confirmed IP', 'mailpoet'),
'value' => $subscriber->confirmed_ip, 'value' => $subscriber->confirmed_ip,
); );
} }
$result[] = array( $result[] = array(
'name' => __('Created at timestamp'), 'name' => __('Created at', 'mailpoet'),
'value' => $subscriber->created_at, 'value' => $subscriber->created_at,
); );

View File

@@ -5,6 +5,7 @@ namespace MailPoet\Subscribers\ImportExport\PersonalDataExporters;
use MailPoet\Models\Newsletter; use MailPoet\Models\Newsletter;
use MailPoet\Models\SendingQueue; use MailPoet\Models\SendingQueue;
use MailPoet\Models\StatisticsNewsletters; use MailPoet\Models\StatisticsNewsletters;
use MailPoet\Models\StatisticsOpens;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
class NewslettersExporterTest extends \MailPoetTest { class NewslettersExporterTest extends \MailPoetTest {
@@ -81,7 +82,51 @@ class NewslettersExporterTest extends \MailPoetTest {
'queue_id' => $queue->id(), 'queue_id' => $queue->id(),
))); )));
$result = $this->exporter->export('user1@with.newsletters'); $result = $this->exporter->export('user1@with.newsletters');
expect($result['data'][0]['data'][2]['name'])->equals('Email preview'); expect($result['data'][0]['data'][3]['name'])->equals('Email preview');
expect($result['data'][0]['data'][2]['value'])->contains('mailpoet_router&endpoint=view_in_browser&action=view&data='); expect($result['data'][0]['data'][3]['value'])->contains('mailpoet_router&endpoint=view_in_browser&action=view&data=');
}
function testExportOpens() {
$subscriber = Subscriber::createOrUpdate(array(
'email' => 'user2@with.newsletters',
));
$newsletter1 = Newsletter::createOrUpdate(array(
'subject' => 'Email Subject1',
'type' => Newsletter::TYPE_STANDARD
));
$newsletter2 = Newsletter::createOrUpdate(array(
'subject' => 'Email Subject2',
'type' => Newsletter::TYPE_STANDARD
));
$queue1 = SendingQueue::createOrUpdate(array(
'newsletter_rendered_subject' => 'Email Subject1',
'task_id' => 2,
'newsletter_id' => $newsletter1->id(),
));
$queue2 = SendingQueue::createOrUpdate(array(
'newsletter_rendered_subject' => 'Email Subject1',
'task_id' => 2,
'newsletter_id' => $newsletter1->id(),
));
StatisticsNewsletters::createMultiple(array(array(
'newsletter_id' => $newsletter1->id(),
'subscriber_id' => $subscriber->id(),
'queue_id' => $queue1->id(),
)));
StatisticsNewsletters::createMultiple(array(array(
'newsletter_id' => $newsletter2->id(),
'subscriber_id' => $subscriber->id(),
'queue_id' => $queue2->id(),
)));
StatisticsOpens::createOrUpdate(array(
'subscriber_id' => $subscriber->id(),
'newsletter_id' => $newsletter1->id(),
'queue_id' => $queue1->id(),
'created_at' => '2017-01-02 12:23:45',
));
$result = $this->exporter->export('user2@with.newsletters');
expect($result['data'][0]['data'])->contains(array('name' => 'Opened', 'value' => 'Yes'));
expect($result['data'][0]['data'])->contains(array('name' => 'Opened at', 'value' => '2017-01-02 12:23:45'));
expect($result['data'][1]['data'])->contains(array('name' => 'Opened', 'value' => 'No'));
} }
} }

View File

@@ -47,7 +47,7 @@ class SubscriberExporterTest extends \MailPoetTest {
array('name' => 'Last Name', 'value' => 'Doe'), array('name' => 'Last Name', 'value' => 'Doe'),
array('name' => 'Email', 'value' => 'email.that@has.no.custom.fields'), array('name' => 'Email', 'value' => 'email.that@has.no.custom.fields'),
array('name' => 'Status', 'value' => 'unconfirmed'), array('name' => 'Status', 'value' => 'unconfirmed'),
array('name' => 'Created at timestamp', 'value' => '2018-05-03 10:30:08'), array('name' => 'Created at', 'value' => '2018-05-03 10:30:08'),
); );
expect($result['data'][0]['data'])->equals($expected); expect($result['data'][0]['data'])->equals($expected);
} }