jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/343806 )
Change subject: Blank addresses, finally deal with ones with more than one deleted. ...................................................................... Blank addresses, finally deal with ones with more than one deleted. In this last round we are not doing a lot of qualitative analysis to choose between multiple deleted addresses as there is low return. We do exclude restoring addresses that are a subset of the remaining addresses on the contact. Bug: T159408 Change-Id: I12c97ebd639eb134a5dea83c49f8c0ce747df12c --- M sites/all/modules/wmf_civicrm/tests/phpunit/MergeTest.php M sites/all/modules/wmf_civicrm/update_restore_addresses.php 2 files changed, 46 insertions(+), 10 deletions(-) Approvals: jenkins-bot: Verified Ejegg: Looks good to me, approved diff --git a/sites/all/modules/wmf_civicrm/tests/phpunit/MergeTest.php b/sites/all/modules/wmf_civicrm/tests/phpunit/MergeTest.php index 7e449c1..f9ef27e 100644 --- a/sites/all/modules/wmf_civicrm/tests/phpunit/MergeTest.php +++ b/sites/all/modules/wmf_civicrm/tests/phpunit/MergeTest.php @@ -1247,6 +1247,34 @@ } /** + * Test recovery where a blank email has overwritten a non-blank email on merge. + * + * In this case an email existed during merge that held no data. It was used + * on the merge, but now we want the lost data. It underwent 2 merges. + */ + public function testRepairBlankedAddressOnMergeDoubleWhammy() { + $this->prepareForBlankAddressTests(); + $contact3 = $this->breedDuck( + array('api.address.create' => array( + 'street_address' => '25 Ducky Way', + 'country_id' => 'US', + 'contact_id' => $this->contactID, + 'location_type_id' => 'Main', + ))); + $this->replicateBlankedAddress(); + + $address = $this->callAPISuccessGetSingle('Address', array('contact_id' => $this->contactID)); + $this->assertTrue(empty($address['street_address'])); + + wmf_civicrm_fix_blanked_address($address['id']); + $address = $this->callAPISuccessGetSingle('Address', array('contact_id' => $this->contactID)); + $this->assertEquals('25 Mousey Way', $address['street_address']); + + $this->cleanupFromBlankAddressRepairTests(); + } + + + /** * Test recovery where an always-blank email has been transferred to another contact on merge. * * We have established the address was always blank and still exists. Lets diff --git a/sites/all/modules/wmf_civicrm/update_restore_addresses.php b/sites/all/modules/wmf_civicrm/update_restore_addresses.php index 1b3e0bf..e207559 100644 --- a/sites/all/modules/wmf_civicrm/update_restore_addresses.php +++ b/sites/all/modules/wmf_civicrm/update_restore_addresses.php @@ -75,7 +75,9 @@ $deletedAddresses = array(); foreach ($logEntries as $logEntryID => $logEntry) { - if ($logEntryID > 0); + if ($logEntryID === 0) { + continue; + } // Fetch all the address changes that happened during the most recent merge action. $logs = civicrm_api3('Logging', 'get', array( 'tables' => array('civicrm_address'), @@ -88,12 +90,6 @@ } } $updates = array(); - - // Q. What do we do if more than one address was deleted during the merged? - // A. Chicken out. - if (count($deletedAddresses) > 1) { - return; - } /** * Some checks / precautions. @@ -155,11 +151,23 @@ // 2) it was transferred from one contact to another during the // merge. // But... was another address deleted to make way for it? - // If more than one address was deleted in this merge we will chicken out. + // If more than one address was deleted we will select the last + // one which is close enough to latest for this last round. if (count($deletedAddresses) > 1) { - return; + foreach ($deletedAddresses as $deletedAddress) { + $deletedAddressDetails = array_intersect_key($deletedAddress, array_fill_keys($dataFields, 1)); + foreach ($addresses['values'] as $address) { + $addressDetails = array_intersect_key($address, $deletedAddressDetails); + if ($deletedAddressDetails === $addressDetails) { + // This is our last check. Basically $addressDetails holds a subset of the + // address keys that matches those present in the deleted address Details. If it exactly matches + // the deleted address then let's ignore the deleted address & move on. + continue; + } + $updates = $deletedAddressDetails; + } + } } - $updates = array(); } if (empty($updates)) { -- To view, visit https://gerrit.wikimedia.org/r/343806 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I12c97ebd639eb134a5dea83c49f8c0ce747df12c Gerrit-PatchSet: 5 Gerrit-Project: wikimedia/fundraising/crm Gerrit-Branch: master Gerrit-Owner: Eileen <emcnaugh...@wikimedia.org> Gerrit-Reviewer: Awight <awi...@wikimedia.org> Gerrit-Reviewer: Cdentinger <cdentin...@wikimedia.org> Gerrit-Reviewer: Eileen <emcnaugh...@wikimedia.org> Gerrit-Reviewer: Ejegg <eeggles...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits