Eileen has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/377664 )
Change subject: Update Omnimail to use offset ...................................................................... Update Omnimail to use offset Bug: T175665 Change-Id: If520df67b3a00a557ec849bc367406d0ec22b330 --- M sites/default/civicrm/extensions/org.wikimedia.omnimail/CRM/Omnimail/Omnigroupmembers.php 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/composer.lock M sites/default/civicrm/extensions/org.wikimedia.omnimail/tests/phpunit/OmnigroupmemberLoadTest.php 5 files changed, 139 insertions(+), 15 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/wikimedia/fundraising/crm refs/changes/64/377664/1 diff --git a/sites/default/civicrm/extensions/org.wikimedia.omnimail/CRM/Omnimail/Omnigroupmembers.php b/sites/default/civicrm/extensions/org.wikimedia.omnimail/CRM/Omnimail/Omnigroupmembers.php index e38e65f..3e8c48f 100644 --- a/sites/default/civicrm/extensions/org.wikimedia.omnimail/CRM/Omnimail/Omnigroupmembers.php +++ b/sites/default/civicrm/extensions/org.wikimedia.omnimail/CRM/Omnimail/Omnigroupmembers.php @@ -41,6 +41,13 @@ } $request = Omnimail::create($params['mail_provider'], $mailerCredentials)->getGroupMembers($jobParameters); + $offset = CRM_Utils_Array::value('offset', $jobSettings, 0); + if (isset($params['options']['offset'])) { + $offset = $params['options']['offset']; + } + if ($offset) { + $request->setOffset((int) $offset); + } $startTimestamp = self::getStartTimestamp($params, $jobSettings); $this->endTimeStamp = self::getEndTimestamp(CRM_Utils_Array::value('end_date', $params), $settings, $startTimestamp); @@ -58,6 +65,7 @@ $request->setGroupIdentifier($params['group_identifier']); $result = $request->getResponse(); + $this->setRetrievalParameters($result->getRetrievalParameters()); for ($i = 0; $i < $settings['omnimail_job_retry_number']; $i++) { if ($result->isCompleted()) { $data = $result->getData(); @@ -69,7 +77,7 @@ } throw new CRM_Omnimail_IncompleteDownloadException('Download incomplete', 0, array( - 'retrieval_parameters' => $result->getRetrievalParameters(), + 'retrieval_parameters' => $this->getRetrievalParameters(), 'mail_provider' => $params['mail_provider'], 'end_date' => $this->endTimeStamp, )); 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 b372980..04a548f 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 @@ -26,6 +26,26 @@ */ public $endTimeStamp; + + /** + * @var array + */ + protected $retrievalParameters; + + /** + * @return array + */ + public function getRetrievalParameters() { + return $this->retrievalParameters; + } + + /** + * @param array $retrievalParameters + */ + public function setRetrievalParameters($retrievalParameters) { + $this->retrievalParameters = $retrievalParameters; + } + /** * Get the timestamp to start from. * 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 7744a1a..6ce2547 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 @@ -22,17 +22,18 @@ $rowsLeftBeforeThrottle = $throttleCount; $job = new CRM_Omnimail_Omnigroupmembers(); + $jobSettings = $job->getJobSettings($params); try { $contacts = $job->getResult($params); } catch (CRM_Omnimail_IncompleteDownloadException $e) { - $jobSettings = $job->getJobSettings($params); 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, ), ), )); @@ -42,7 +43,31 @@ $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); + } + $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, + ), + ), + )); + // 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. + return civicrm_api3_create_success($values); + } $groupMember = $job->formatRow($contact, $params['custom_data_map']); if (!empty($groupMember['email']) && !civicrm_api3('email', 'getcount', array('email' => $groupMember['email']))) { // If there is already a contact with this email we will skip for now. @@ -76,12 +101,23 @@ } $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) + ) + ), + )); $rowsLeftBeforeThrottle--; if ($throttleStagePoint && (strtotime('now') > $throttleStagePoint)) { $throttleStagePoint = strtotime('+ ' . (int) $throttleSeconds . 'seconds'); $rowsLeftBeforeThrottle = $throttleCount; } + if ($throttleSeconds && $rowsLeftBeforeThrottle <= 0) { sleep(ceil($throttleStagePoint - strtotime('now'))); } diff --git a/sites/default/civicrm/extensions/org.wikimedia.omnimail/composer.lock b/sites/default/civicrm/extensions/org.wikimedia.omnimail/composer.lock index 65a33d2..545b430 100644 --- a/sites/default/civicrm/extensions/org.wikimedia.omnimail/composer.lock +++ b/sites/default/civicrm/extensions/org.wikimedia.omnimail/composer.lock @@ -707,7 +707,7 @@ "source": { "type": "git", "url": "https://github.com/eileenmcnaughton/omnimail-silverpop.git", - "reference": "e06e50192ae17fe93f1045ee7562aa286272cbcc" + "reference": "aac29243defa1dfc78cff7f51bbb4f2c30de39ec" }, "require": { "league/csv": "^8.0", @@ -746,7 +746,7 @@ "omnimail", "silverpop" ], - "time": "2017-07-05 04:12:48" + "time": "2017-09-12 13:57:41" } ], "packages-dev": [ 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 54ee55f..451e119 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 @@ -47,15 +47,7 @@ civicrm_api3('Omnigroupmember', 'load', array('mail_provider' => 'Silverpop', 'username' => 'Shrek', 'password' => 'Fiona', 'options' => array('limit' => 3), 'client' => $client, 'group_identifier' => 123, 'group_id' => $group['id'])); $groupMembers = civicrm_api3('GroupContact', 'get', array('group_id' => $group['id'])); $this->assertEquals(3, $groupMembers['count']); - $contactIDs = array('IN' => array()); - foreach ($groupMembers['values'] as $groupMember) { - $contactIDs['IN'][] = $groupMember['contact_id']; - } - $contacts = civicrm_api3('Contact', 'get', array( - 'contact_id' => $contactIDs, - 'sequential' => 1, - 'return' => array('contact_source', 'email', 'country', 'created_date', 'preferred_language', 'is_opt_out') - )); + $contacts = $this->getGroupMemberDetails($groupMembers); $this->assertEquals('fr_FR', $contacts['values'][0]['preferred_language']); $this->assertEquals('e...@example.com', $contacts['values'][0]['email']); $this->assertEquals('France', $contacts['values'][0]['country']); @@ -63,6 +55,45 @@ $this->assertEquals('Silverpop Added by WebForms 10/18/16', $contacts['values'][0]['contact_source']); $this->assertEquals('Silverpop clever place 07/04/17', $contacts['values'][2]['contact_source']); + $this->cleanupGroup($group); + } + + /** + * Example: Test that offset is respected. + */ + public function testOmnigroupmemberLoadOffset() { + $client = $this->setupSuccessfulDownloadClient(); + $group = civicrm_api3('Group', 'create', array('name' => 'Omnimailers', 'title' => 'Omni')); + + civicrm_api3('Omnigroupmember', 'load', array('mail_provider' => 'Silverpop', 'username' => 'Shrek', 'password' => 'Fiona', 'options' => array('offset' => 1), 'client' => $client, 'group_identifier' => 123, 'group_id' => $group['id'])); + $groupMembers = civicrm_api3('GroupContact', 'get', array('group_id' => $group['id'])); + $this->assertEquals(2, $groupMembers['count']); + $contacts = $this->getGroupMemberDetails($groupMembers); + $this->assertEquals('sa...@example.com', $contacts['values'][0]['email']); + $this->assertEquals('l...@example.com', $contacts['values'][1]['email']); + $this->cleanupGroup($group); + } + + /** + * Example: Test that offset is respected. + */ + public function testOmnigroupmemberLoadUseOffsetSetting() { + $client = $this->setupSuccessfulDownloadClient(); + $group = civicrm_api3('Group', 'create', array('name' => 'Omnimailers', 'title' => 'Omni')); + + civicrm_api3('Omnigroupmember', 'load', array('mail_provider' => 'Silverpop', 'username' => 'Shrek', 'password' => 'Fiona', 'options' => array('limit' => 1), 'client' => $client, 'group_identifier' => 123, 'group_id' => $group['id'])); + $groupMembers = civicrm_api3('GroupContact', 'get', array('group_id' => $group['id'])); + $this->assertEquals(1, $groupMembers['count']); + $contacts = $this->getGroupMemberDetails($groupMembers); + $this->assertEquals('e...@example.com', $contacts['values'][0]['email']); + + // Re-run. Offset is now 1 in settings & we are passing in limit =1. Sarah should be created. + $client = $this->setupSuccessfulDownloadClient(FALSE); + civicrm_api3('Omnigroupmember', 'load', array('mail_provider' => 'Silverpop', 'username' => 'Shrek', 'password' => 'Fiona', 'options' => array('limit' => 1), 'client' => $client, 'group_identifier' => 123, 'group_id' => $group['id'])); + $groupMembers = civicrm_api3('GroupContact', 'get', array('group_id' => $group['id'])); + $this->assertEquals(2, $groupMembers['count']); + $contacts = $this->getGroupMemberDetails($groupMembers); + $this->assertEquals('sa...@example.com', $contacts['values'][1]['email']); $this->cleanupGroup($group); } @@ -140,16 +171,21 @@ } /** + * Set up the mock client to emulate a successful download. + * @param bool $isUpdateSetting + * * @return \GuzzleHttp\Client */ - protected function setupSuccessfulDownloadClient() { + protected function setupSuccessfulDownloadClient($isUpdateSetting = TRUE) { $responses = array( file_get_contents(__DIR__ . '/Responses/ExportListResponse.txt'), file_get_contents(__DIR__ . '/Responses/JobStatusCompleteResponse.txt'), ); copy(__DIR__ . '/Responses/20170509_noCID - All - Jul 5 2017 06-27-45 AM.csv', sys_get_temp_dir() . '/20170509_noCID - All - Jul 5 2017 06-27-45 AM.csv'); fopen(sys_get_temp_dir() . '/20170509_noCID - All - Jul 5 2017 06-27-45 AM.csv.complete', 'c'); - $this->createSetting('omnimail_omnigroupmembers_load', array('Silverpop' => array('last_timestamp' => '1487890800'))); + if ($isUpdateSetting) { + $this->createSetting('omnimail_omnigroupmembers_load', array('Silverpop' => array('last_timestamp' => '1487890800'))); + } $client = $this->getMockRequest($responses); return $client; @@ -177,4 +213,28 @@ } + /** + * @param $groupMembers + * @return array + */ + protected function getGroupMemberDetails($groupMembers) { + $contactIDs = array('IN' => array()); + foreach ($groupMembers['values'] as $groupMember) { + $contactIDs['IN'][] = $groupMember['contact_id']; + } + $contacts = civicrm_api3('Contact', 'get', array( + 'contact_id' => $contactIDs, + 'sequential' => 1, + 'return' => array( + 'contact_source', + 'email', + 'country', + 'created_date', + 'preferred_language', + 'is_opt_out' + ) + )); + return $contacts; + } + } -- To view, visit https://gerrit.wikimedia.org/r/377664 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: If520df67b3a00a557ec849bc367406d0ec22b330 Gerrit-PatchSet: 1 Gerrit-Project: wikimedia/fundraising/crm Gerrit-Branch: master Gerrit-Owner: Eileen <emcnaugh...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits