@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Resolve timezone conflicts in a modern transactional way

Summary: Ref T4103. Also get rid of the weird cache clear that nothing else uses and which we don't actually need.

Test Plan:
- Resolved timezone conflict by ignoring it.
- Resolved timezone conflict by picking a valid timezone.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T4103

Differential Revision: https://secure.phabricator.com/D16037

+32 -25
-14
src/applications/people/storage/PhabricatorUser.php
··· 533 533 return ($actual == $value); 534 534 } 535 535 536 - 537 - /** 538 - * @task settings 539 - */ 540 - public function clearUserSettingCache() { 541 - $this->settingCacheKeys = array(); 542 - $this->settingCache = array(); 543 - 544 - $settings_key = PhabricatorUserPreferencesCacheType::KEY_PREFERENCES; 545 - $this->clearCacheData($settings_key); 546 - 547 - return $this; 548 - } 549 - 550 536 private function writeUserSettingCache($key, $value) { 551 537 $this->settingCacheKeys[$key] = true; 552 538 $this->settingCache[$key] = $value;
+32 -11
src/applications/settings/controller/PhabricatorSettingsTimezoneController.php
··· 27 27 $settings_help = pht( 28 28 'You can change your date and time preferences in Settings.'); 29 29 30 + $did_calibrate = false; 30 31 if ($request->isFormPost()) { 31 32 $timezone = $request->getStr('timezone'); 32 33 33 34 $pref_ignore = PhabricatorTimezoneIgnoreOffsetSetting::SETTINGKEY; 34 35 $pref_timezone = PhabricatorTimezoneSetting::SETTINGKEY; 35 36 36 - $preferences = $viewer->loadPreferences(); 37 - 38 37 if ($timezone == 'ignore') { 39 - $preferences 40 - ->setPreference($pref_ignore, $client_offset) 41 - ->save(); 38 + $this->writeSettings( 39 + array( 40 + $pref_ignore => $client_offset, 41 + )); 42 42 43 43 return $this->newDialog() 44 44 ->setTitle(pht('Conflict Ignored')) ··· 51 51 } 52 52 53 53 if (isset($options[$timezone])) { 54 - $preferences 55 - ->setPreference($pref_ignore, null) 56 - ->setPreference($pref_timezone, $timezone) 57 - ->save(); 54 + $this->writeSettings( 55 + array( 56 + $pref_ignore => null, 57 + $pref_timezone => $timezone, 58 + )); 58 59 59 - $viewer->clearUserSettingCache(); 60 + $did_calibrate = true; 60 61 } 61 62 } 62 63 63 64 $server_offset = $viewer->getTimeZoneOffset(); 64 65 65 - if ($client_offset == $server_offset) { 66 + if ($client_offset == $server_offset || $did_calibrate) { 66 67 return $this->newDialog() 67 68 ->setTitle(pht('Timezone Calibrated')) 68 69 ->appendParagraph( ··· 119 120 } else { 120 121 return pht('UTC+%d', -$offset); 121 122 } 123 + } 124 + 125 + private function writeSettings(array $map) { 126 + $request = $this->getRequest(); 127 + $viewer = $this->getViewer(); 128 + 129 + $preferences = PhabricatorUserPreferences::loadUserPreferences($viewer); 130 + 131 + $editor = id(new PhabricatorUserPreferencesEditor()) 132 + ->setActor($viewer) 133 + ->setContentSourceFromRequest($request) 134 + ->setContinueOnNoEffect(true) 135 + ->setContinueOnMissingFields(true); 136 + 137 + $xactions = array(); 138 + foreach ($map as $key => $value) { 139 + $xactions[] = $preferences->newTransaction($key, $value); 140 + } 141 + 142 + $editor->applyTransactions($preferences, $xactions); 122 143 } 123 144 124 145 }