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')
->select('statistics.newsletter_id', 'newsletter_id')
->select('newsletter_rendered_subject')
->select('opens.created_at', 'opened_at')
->select('sent_at')
->join(
SendingQueue::$_table,
array('statistics.queue_id', '=', 'queue.id'),
'queue'
)
->leftOuterJoin(
StatisticsOpens::$_table,
array('statistics.newsletter_id', '=', 'opens.newsletter_id'),
'opens'
)
->where('statistics.subscriber_id', $subscriber->id())
->orderByAsc('newsletter_id');
}

View File

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

View File

@@ -29,20 +29,20 @@ class SegmentsExporter {
private function exportSegment($segment) {
$segment_data = array();
$segment_data[] = array(
'name' => __('List name'),
'name' => __('List name', 'mailpoet'),
'value' => $segment['name'],
);
$segment_data[] = array(
'name' => __('Subscription status'),
'name' => __('Subscription status', 'mailpoet'),
'value' => $segment['status'],
);
$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'],
);
return array(
'group_id' => 'mailpoet-lists',
'group_label' => __('MailPoet Mailing Lists'),
'group_label' => __('MailPoet Mailing Lists', 'mailpoet'),
'item_id' => 'list-' . $segment['segment_id'],
'data' => $segment_data,
);

View File

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

View File

@@ -5,6 +5,7 @@ namespace MailPoet\Subscribers\ImportExport\PersonalDataExporters;
use MailPoet\Models\Newsletter;
use MailPoet\Models\SendingQueue;
use MailPoet\Models\StatisticsNewsletters;
use MailPoet\Models\StatisticsOpens;
use MailPoet\Models\Subscriber;
class NewslettersExporterTest extends \MailPoetTest {
@@ -81,7 +82,51 @@ class NewslettersExporterTest extends \MailPoetTest {
'queue_id' => $queue->id(),
)));
$result = $this->exporter->export('user1@with.newsletters');
expect($result['data'][0]['data'][2]['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]['name'])->equals('Email preview');
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' => 'Email', 'value' => 'email.that@has.no.custom.fields'),
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);
}