@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.

Auto-generate profile images for sad psyducks

Summary: Fixes T10319. This looks for custom profile image, then falls back to a generated profile image.

Test Plan: Create a new user, log in, and see new profile image. Note this seems to break `bin/lipsum generate user`

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Maniphest Tasks: T10319

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

+61 -36
+40 -2
src/applications/people/cache/PhabricatorUserProfileImageCacheType.php
··· 24 24 public function newValueForUsers($key, array $users) { 25 25 $viewer = $this->getViewer(); 26 26 27 - $file_phids = mpull($users, 'getProfileImagePHID'); 28 - $file_phids = array_filter($file_phids); 27 + $file_phids = array(); 28 + $generate_users = array(); 29 + foreach ($users as $user) { 30 + $user_phid = $user->getPHID(); 31 + $custom_phid = $user->getProfileImagePHID(); 32 + $default_phid = $user->getDefaultProfileImagePHID(); 33 + $version = $user->getDefaultProfileImageVersion(); 34 + 35 + if ($custom_phid) { 36 + $file_phids[$user_phid] = $custom_phid; 37 + continue; 38 + } 39 + if ($default_phid) { 40 + if ($version == PhabricatorFilesComposeAvatarBuiltinFile::VERSION) { 41 + $file_phids[$user_phid] = $default_phid; 42 + continue; 43 + } 44 + } 45 + $generate_users[] = $user; 46 + } 47 + 48 + // Generate Files for anyone without a default 49 + foreach ($generate_users as $generate_user) { 50 + $generate_user_phid = $generate_user->getPHID(); 51 + $generate_username = $generate_user->getUsername(); 52 + $generate_version = PhabricatorFilesComposeAvatarBuiltinFile::VERSION; 53 + $generate_file = id(new PhabricatorFilesComposeAvatarBuiltinFile()) 54 + ->getUserProfileImageFile($generate_username); 55 + 56 + $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites(); 57 + $generate_user->setDefaultProfileImagePHID($generate_file->getPHID()); 58 + $generate_user->setDefaultProfileImageVersion($generate_version); 59 + $generate_user->save(); 60 + unset($unguarded); 61 + 62 + $file_phids[$generate_user_phid] = $generate_file->getPHID(); 63 + } 29 64 30 65 if ($file_phids) { 31 66 $files = id(new PhabricatorFileQuery()) ··· 40 75 $results = array(); 41 76 foreach ($users as $user) { 42 77 $image_phid = $user->getProfileImagePHID(); 78 + $default_phid = $user->getDefaultProfileImagePHID(); 43 79 if (isset($files[$image_phid])) { 44 80 $image_uri = $files[$image_phid]->getBestURI(); 81 + } else if (isset($files[$default_phid])) { 82 + $image_uri = $files[$default_phid]->getBestURI(); 45 83 } else { 46 84 $image_uri = PhabricatorUser::getDefaultProfileImageURI(); 47 85 }
+11 -32
src/applications/people/controller/PhabricatorPeopleProfilePictureController.php
··· 30 30 $e_file = true; 31 31 $errors = array(); 32 32 33 - // Verify install has GD extension, otherwise default to avatar.png 34 - $gd = function_exists('imagecreatefromstring'); 35 - 36 33 if ($request->isFormPost()) { 37 34 $phid = $request->getStr('phid'); 38 35 $is_default = false; 39 36 if ($phid == PhabricatorPHIDConstants::PHID_VOID) { 40 - // Compose the builtin unique image 41 - if ($gd) { 42 - $file = id(new PhabricatorFilesComposeAvatarBuiltinFile()) 43 - ->getUserProfileImageFile($name); 44 - } else { 45 - $phid = null; 46 - $is_default = true; 47 - } 48 - 37 + $phid = null; 38 + $is_default = true; 49 39 } else if ($phid) { 50 40 $file = id(new PhabricatorFileQuery()) 51 41 ->setViewer($viewer) ··· 96 86 $form = id(new PHUIFormLayoutView()) 97 87 ->setUser($viewer); 98 88 99 - if ($gd) { 100 - $unique_default = id(new PhabricatorFilesComposeAvatarBuiltinFile()) 101 - ->getUniqueProfileImage($name); 102 - $default_image = PhabricatorFile::loadBuiltin( 103 - $viewer, $unique_default['icon']); 104 - } else { 105 - $unique_default = null; 89 + $default_image = $user->getDefaultProfileImagePHID(); 90 + if ($default_image) { 91 + $default_image = id(new PhabricatorFileQuery()) 92 + ->setViewer($viewer) 93 + ->withPHIDs(array($default_image)) 94 + ->executeOne(); 95 + } 96 + 97 + if (!$default_image) { 106 98 $default_image = PhabricatorFile::loadBuiltin($viewer, 'profile.png'); 107 99 } 108 100 ··· 181 173 } 182 174 } 183 175 184 - $default_style = array(); 185 - if ($unique_default) { 186 - $border_color = implode(', ', $unique_default['border']); 187 - $default_style = array( 188 - 'background-color: '.$unique_default['color'].';', 189 - 'border: 4px solid rgba('.$border_color.');', 190 - 'height: 42px;', 191 - 'width: 42px', 192 - ); 193 - } 194 - 195 176 $images[PhabricatorPHIDConstants::PHID_VOID] = array( 196 177 'uri' => $default_image->getBestURI(), 197 178 'tip' => pht('Default Picture'), 198 - 'style' => implode(' ', $default_style), 199 179 ); 200 180 201 181 require_celerity_resource('people-profile-css'); ··· 223 203 'height' => 50, 224 204 'width' => 50, 225 205 'src' => $spec['uri'], 226 - 'style' => $style, 227 206 ))); 228 207 229 208 $button = array(
+7 -1
src/applications/people/management/PhabricatorPeopleProfileImageWorkflow.php
··· 55 55 foreach ($iterator as $user) { 56 56 $username = $user->getUsername(); 57 57 $default_phid = $user->getDefaultProfileImagePHID(); 58 + $gen_version = $user->getDefaultProfileImageVersion(); 58 59 59 - if ($default_phid == null || $is_force) { 60 + $generate = false; 61 + if ($gen_version != $version) { 62 + $generate = true; 63 + } 64 + 65 + if ($default_phid == null || $is_force || $generate) { 60 66 $file = id(new PhabricatorFilesComposeAvatarBuiltinFile()) 61 67 ->getUserProfileImageFile($username); 62 68 $user->setDefaultProfileImagePHID($file->getPHID());
+3 -1
src/applications/people/storage/PhabricatorUserProfile.php
··· 13 13 14 14 return id(new self()) 15 15 ->setUserPHID($user->getPHID()) 16 - ->setIcon($default_icon); 16 + ->setIcon($default_icon) 17 + ->setTitle('') 18 + ->setBlurb(''); 17 19 } 18 20 19 21 protected function getConfiguration() {