Eileen has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/379174 )
Change subject: Update Omnimail jobs to support storing settings about multiple
jobs.
......................................................................
Update Omnimail jobs to support storing settings about multiple jobs.
Omnimail jobs store information about where the job is up to. This change
permits an input parameter 'job_suffix' to denote a job,
allowing multiple jobs of the same type to be tracked.
This might be used if a slow back-fill job is running off-peak
(ahem) due to possibly a mistake cause some data to have been missed
.....
without interfering with the up-to-date job.
Bug: T176255
Change-Id: If0a709b9e9cec7e3276d231e75cca49d2909d4cb
---
M
sites/default/civicrm/extensions/org.wikimedia.omnimail/CRM/Omnimail/Omnimail.php
M
sites/default/civicrm/extensions/org.wikimedia.omnimail/api/v3/Omnigroupmember/Load.php
M
sites/default/civicrm/extensions/org.wikimedia.omnimail/api/v3/Omnirecipient/Load.php
M
sites/default/civicrm/extensions/org.wikimedia.omnimail/tests/phpunit/OmnigroupmemberLoadTest.php
M
sites/default/civicrm/extensions/org.wikimedia.omnimail/tests/phpunit/OmnirecipientLoadTest.php
5 files changed, 131 insertions(+), 64 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/wikimedia/fundraising/crm
refs/changes/74/379174/1
diff --git
a/sites/default/civicrm/extensions/org.wikimedia.omnimail/CRM/Omnimail/Omnimail.php
b/sites/default/civicrm/extensions/org.wikimedia.omnimail/CRM/Omnimail/Omnimail.php
index b40f880..c700aa8 100644
---
a/sites/default/civicrm/extensions/org.wikimedia.omnimail/CRM/Omnimail/Omnimail.php
+++
b/sites/default/civicrm/extensions/org.wikimedia.omnimail/CRM/Omnimail/Omnimail.php
@@ -42,6 +42,15 @@
protected $retrievalParameters;
/**
+ * @var string
+ */
+ protected $job_suffix;
+
+ /**
+ * @var string
+ */
+ protected $mail_provider;
+ /**
* CRM_Omnimail_Omnimail constructor.
*
* @param array $params
@@ -49,6 +58,8 @@
* @throws \API_Exception
*/
public function __construct($params) {
+ $this->job_suffix = $params['job_suffix'];
+ $this->mail_provider = $params['mail_provider'];
$this->setJobSettings($params);
$this->setOffset($params);
$this->setRetrievalParameters(CRM_Utils_Array::value('retrieval_parameters',
$this->jobSettings));
@@ -150,7 +161,20 @@
*/
protected function setJobSettings($params) {
$settings = CRM_Omnimail_Helper::getSettings();
- $this->jobSettings = CRM_Utils_Array::value($params['mail_provider'],
$settings['omnimail_' . $this->job . '_load'], array());
+ $this->jobSettings = CRM_Utils_Array::value($params['mail_provider'] .
$this->job_suffix, $settings['omnimail_' . $this->job . '_load'], array());
+ }
+
+ /**
+ * Save the job settings.
+ *
+ * @param array $setting
+ */
+ function saveJobSetting($setting) {
+ civicrm_api3('Setting', 'create', array(
+ 'omnimail_' . $this->job . '_load' => array(
+ $this->mail_provider . $this->job_suffix => $setting,
+ ),
+ ));
}
}
\ No newline at end of file
diff --git
a/sites/default/civicrm/extensions/org.wikimedia.omnimail/api/v3/Omnigroupmember/Load.php
b/sites/default/civicrm/extensions/org.wikimedia.omnimail/api/v3/Omnigroupmember/Load.php
index eba0d6c..e0e8b7f 100644
---
a/sites/default/civicrm/extensions/org.wikimedia.omnimail/api/v3/Omnigroupmember/Load.php
+++
b/sites/default/civicrm/extensions/org.wikimedia.omnimail/api/v3/Omnigroupmember/Load.php
@@ -27,15 +27,11 @@
$contacts = $job->getResult($params);
}
catch (CRM_Omnimail_IncompleteDownloadException $e) {
- civicrm_api3('Setting', 'create', array(
- 'omnimail_omnigroupmembers_load' => array(
- $params['mail_provider'] => array(
- 'last_timestamp' => $jobSettings['last_timestamp'],
- 'retrieval_parameters' => $e->getRetrievalParameters(),
- 'progress_end_date' => $e->getEndTimestamp(),
- 'offset' => 0,
- ),
- ),
+ $job->saveJobSetting(array(
+ 'last_timestamp' => $jobSettings['last_timestamp'],
+ 'retrieval_parameters' => $e->getRetrievalParameters(),
+ 'progress_end_date' => $e->getEndTimestamp(),
+ 'offset' => 0,
));
return civicrm_api3_create_success(1);
}
@@ -43,26 +39,17 @@
$defaultLocationType = CRM_Core_BAO_LocationType::getDefault();
$locationTypeID = $defaultLocationType->id;
- if (isset($params['options']['offset'])) {
- $offset = $params['options']['offset'];
- }
- else {
- $offset = CRM_Utils_Array::value('offset', $jobSettings, 0);
- }
+ $offset = $job->getOffset();
$limit = (isset($params['options']['limit'])) ? $params['options']['limit']
: NULL;
$count = 0;
foreach ($contacts as $contact) {
if ($count === $limit) {
- civicrm_api3('Setting', 'create', array(
- 'omnimail_omnigroupmembers_load' => array(
- $params['mail_provider'] => array(
- 'last_timestamp' => $jobSettings['last_timestamp'],
- 'retrieval_parameters' => $job->getRetrievalParameters(),
- 'progress_end_date' => $job->endTimeStamp,
- 'offset' => $offset,
- ),
- ),
+ $job->saveJobSetting(array(
+ 'last_timestamp' => $jobSettings['last_timestamp'],
+ 'retrieval_parameters' => $job->getRetrievalParameters(),
+ 'progress_end_date' => $job->endTimeStamp,
+ 'offset' => $offset + $count,
));
// Do this here - ie. before processing a new row rather than at the end
of the last row
// to avoid thinking a job is incomplete if the limit co-incides with
available rows.
@@ -101,16 +88,10 @@
}
$values[$contact['id']] = reset($contact['values']);
}
- $offset++;
+
$count++;
// Every row seems extreme but perhaps not in this performance monitoring
phase.
- civicrm_api3('Setting', 'create', array(
- 'omnimail_omnigroupmembers_load' => array(
- $params['mail_provider'] => array_merge(
- $jobSettings, array('offset' => $offset)
- )
- ),
- ));
+ $job->saveJobSetting(array_merge($jobSettings, array('offset' => $offset +
$count)));
$rowsLeftBeforeThrottle--;
if ($throttleStagePoint && (strtotime('now') > $throttleStagePoint)) {
@@ -122,11 +103,8 @@
sleep(ceil($throttleStagePoint - strtotime('now')));
}
}
- civicrm_api3('Setting', 'create', array(
- 'omnimail_omnigroupmembers_load' => array(
- $params['mail_provider'] => array('last_timestamp' =>
$job->endTimeStamp),
- ),
- ));
+
+ $job->saveJobSetting(array('last_timestamp' => $job->endTimeStamp));
return civicrm_api3_create_success($values);
}
@@ -245,5 +223,11 @@
'type' => CRM_Utils_Type::T_INT,
'api.default' => 60,
);
+ $params['job_suffix'] = array(
+ 'title' => ts('A suffix string to add to job-specific settings.'),
+ 'description' => ts('The suffix allows for multiple settings to be stored
for one job. For example if wishing to run an up-top-date job and a catch-up
job'),
+ 'type' => CRM_Utils_Type::T_STRING,
+ 'api.default' => '',
+ );
}
diff --git
a/sites/default/civicrm/extensions/org.wikimedia.omnimail/api/v3/Omnirecipient/Load.php
b/sites/default/civicrm/extensions/org.wikimedia.omnimail/api/v3/Omnirecipient/Load.php
index 056f045..5a328cc 100644
---
a/sites/default/civicrm/extensions/org.wikimedia.omnimail/api/v3/Omnirecipient/Load.php
+++
b/sites/default/civicrm/extensions/org.wikimedia.omnimail/api/v3/Omnirecipient/Load.php
@@ -44,15 +44,11 @@
foreach ($recipients as $recipient) {
if ($count === $limit) {
- civicrm_api3('Setting', 'create', array(
- 'omnimail_omnirecipient_load' => array(
- $params['mail_provider'] => array(
- 'last_timestamp' => $jobSettings['last_timestamp'],
- 'retrieval_parameters' => $omnimail->getRetrievalParameters(),
- 'progress_end_date' => $omnimail->endTimeStamp,
- 'offset' => $omnimail->getOffset() + $count,
- ),
- ),
+ $omnimail->saveJobSetting(array(
+ 'last_timestamp' => $jobSettings['last_timestamp'],
+ 'retrieval_parameters' => $omnimail->getRetrievalParameters(),
+ 'progress_end_date' => $omnimail->endTimeStamp,
+ 'offset' => $omnimail->getOffset() + $count,
));
// Do this here - ie. before processing a new row rather than at the
end of the last row
// to avoid thinking a job is incomplete if the limit co-incides with
available rows.
@@ -88,22 +84,14 @@
sleep(ceil($throttleStagePoint - strtotime('now')));
}
}
- civicrm_api3('Setting', 'create', array(
- 'omnimail_omnirecipient_load' => array(
- $params['mail_provider'] => array('last_timestamp' =>
$omnimail->endTimeStamp),
- ),
- ));
+ $omnimail->saveJobSetting(array('last_timestamp' =>
$omnimail->endTimeStamp));
return civicrm_api3_create_success(1);
}
catch (CRM_Omnimail_IncompleteDownloadException $e) {
- civicrm_api3('Setting', 'create', array(
- 'omnimail_omnirecipient_load' => array(
- $params['mail_provider'] => array(
- 'last_timestamp' => $omnimail->getStartTimestamp($params),
- 'retrieval_parameters' => $e->getRetrievalParameters(),
- 'progress_end_date' => $e->getEndTimestamp(),
- ),
- ),
+ $omnimail->saveJobSetting(array(
+ 'last_timestamp' => $omnimail->getStartTimestamp($params),
+ 'retrieval_parameters' => $e->getRetrievalParameters(),
+ 'progress_end_date' => $e->getEndTimestamp(),
));
return civicrm_api3_create_success(1);
}
@@ -156,5 +144,11 @@
'type' => CRM_Utils_Type::T_INT,
'api.default' => 300,
);
+ $params['job_suffix'] = array(
+ 'title' => ts('A suffix string to add to job-specific settings.'),
+ 'description' => ts('The suffix allows for multiple settings to be stored
for one job. For example if wishing to run an up-top-date job and a catch-up
job'),
+ 'type' => CRM_Utils_Type::T_STRING,
+ 'api.default' => '',
+ );
}
diff --git
a/sites/default/civicrm/extensions/org.wikimedia.omnimail/tests/phpunit/OmnigroupmemberLoadTest.php
b/sites/default/civicrm/extensions/org.wikimedia.omnimail/tests/phpunit/OmnigroupmemberLoadTest.php
index 46832dd..0a7b36f 100644
---
a/sites/default/civicrm/extensions/org.wikimedia.omnimail/tests/phpunit/OmnigroupmemberLoadTest.php
+++
b/sites/default/civicrm/extensions/org.wikimedia.omnimail/tests/phpunit/OmnigroupmemberLoadTest.php
@@ -144,6 +144,41 @@
}
/**
+ * Test when download does not complete in time.
+ */
+ public function testOmnigroupmemberLoadIncompleteUseSuffix() {
+ civicrm_api3('Setting', 'create', array(
+ 'omnimail_omnigroupmembers_load' => array(
+ 'Silverpop' . '_woot' => array('last_timestamp' => '1487890800'),
+ ),
+ ));
+ $responses = array(
+ file_get_contents(__DIR__ . '/Responses/ExportListResponse.txt'),
+ );
+ for ($i = 0; $i < 15; $i++) {
+ $responses[] = file_get_contents(__DIR__ .
'/Responses/JobStatusWaitingResponse.txt');
+ }
+ civicrm_api3('setting', 'create', array('omnimail_job_retry_interval' =>
0.01));
+ $group = civicrm_api3('Group', 'create', array('name' => 'Omnimailers2',
'title' => 'Omni2'));
+
+ civicrm_api3('Omnigroupmember', 'load', array('mail_provider' =>
'Silverpop', 'username' => 'Donald', 'password' => 'Duck', 'client' =>
$this->getMockRequest($responses), 'group_identifier' => 123, 'group_id' =>
$group['id']));
+
+ $groupMembers = civicrm_api3('GroupContact', 'get', array('group_id' =>
$group['id']));
+ $this->assertEquals(0, $groupMembers['count']);
+
+ $this->assertEquals(array(
+ 'last_timestamp' => '1487890800',
+ 'retrieval_parameters' => array(
+ 'jobId' => '101719657',
+ 'filePath' => '/download/20170509_noCID - All - Jul 5 2017 06-27-45
AM.csv',
+ ),
+ 'progress_end_date' => '1488495600',
+ 'offset' => 0,
+ ), $this->getJobSettings(array('mail_provider' => 'Silverpop',
'job_suffix' => '_woot')));
+ $this->cleanupGroup($group);
+ }
+
+ /**
* After completing an incomplete download the end date should be the
progress end date.
*/
public function testCompleteIncomplete() {
@@ -205,10 +240,12 @@
/**
* Get job settings.
*
+ * @param array $params
+ *
* @return array
*/
- public function getJobSettings() {
- $omnimail = new CRM_Omnimail_Omnigroupmembers(array('mail_provider' =>
'Silverpop'));
+ public function getJobSettings($params = array('mail_provider' =>
'Silverpop')) {
+ $omnimail = new CRM_Omnimail_Omnigroupmembers($params);
return $omnimail->getJobSettings();
}
diff --git
a/sites/default/civicrm/extensions/org.wikimedia.omnimail/tests/phpunit/OmnirecipientLoadTest.php
b/sites/default/civicrm/extensions/org.wikimedia.omnimail/tests/phpunit/OmnirecipientLoadTest.php
index d637c67..7d94d41 100644
---
a/sites/default/civicrm/extensions/org.wikimedia.omnimail/tests/phpunit/OmnirecipientLoadTest.php
+++
b/sites/default/civicrm/extensions/org.wikimedia.omnimail/tests/phpunit/OmnirecipientLoadTest.php
@@ -188,6 +188,32 @@
}
/**
+ * Test the suffix works for multiple jobs..
+ */
+ public function testCompleteIncompleteUseSuffix() {
+ $client = $this->setupSuccessfulDownloadClient();
+ civicrm_api3('setting', 'create', array(
+ 'omnimail_omnirecipient_load' => array(
+ 'Silverpop_woot' => array(
+ 'last_timestamp' => '1487890800',
+ 'retrieval_parameters' => array(
+ 'jobId' => '101569750',
+ 'filePath' => 'Raw Recipient Data Export Jul 03 2017 00-47-42 AM
1295.zip',
+ ),
+ 'progress_end_date' => '1488495600',
+ ),
+ ),
+ ));
+
+ civicrm_api3('Omnirecipient', 'load', array('mail_provider' =>
'Silverpop', 'username' => 'Donald', 'password' => 'Duck', 'client' => $client,
'job_suffix' => '_woot'));
+ $this->assertEquals(4, CRM_Core_DAO::singleValueQuery('SELECT COUNT(*)
FROM civicrm_mailing_provider_data'));
+ $this->assertEquals(array(
+ 'last_timestamp' => '1488495600',
+ ), $this->getJobSettings(array('mail_provider' => 'Silverpop',
'job_suffix' => '_woot')));
+ }
+
+
+ /**
* An exception should be thrown if the download is incomplete & we pass in
a timestamp.
*
* This is because the incomplete download will continue, and we will
incorrectly
@@ -226,10 +252,12 @@
/**
* Get job settings.
*
+ * @param array $params
+ *
* @return array
*/
- public function getJobSettings() {
- $omnimail = new CRM_Omnimail_Omnirecipients(array('mail_provider' =>
'Silverpop'));
+ public function getJobSettings($params = array('mail_provider' =>
'Silverpop')) {
+ $omnimail = new CRM_Omnimail_Omnirecipients($params);
return $omnimail->getJobSettings();
}
}
--
To view, visit https://gerrit.wikimedia.org/r/379174
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: If0a709b9e9cec7e3276d231e75cca49d2909d4cb
Gerrit-PatchSet: 1
Gerrit-Project: wikimedia/fundraising/crm
Gerrit-Branch: master
Gerrit-Owner: Eileen <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits