Skip to content

Commit eb73c50

Browse files
author
Chad Little
committedMar 5, 2017
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
1 parent 8e26916 commit eb73c50

4 files changed

+61
-36
lines changed
 

‎src/applications/people/cache/PhabricatorUserProfileImageCacheType.php

+40-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,43 @@ public function getDefaultValue() {
2424
public function newValueForUsers($key, array $users) {
2525
$viewer = $this->getViewer();
2626

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+
}
2964

3065
if ($file_phids) {
3166
$files = id(new PhabricatorFileQuery())
@@ -40,8 +75,11 @@ public function newValueForUsers($key, array $users) {
4075
$results = array();
4176
foreach ($users as $user) {
4277
$image_phid = $user->getProfileImagePHID();
78+
$default_phid = $user->getDefaultProfileImagePHID();
4379
if (isset($files[$image_phid])) {
4480
$image_uri = $files[$image_phid]->getBestURI();
81+
} else if (isset($files[$default_phid])) {
82+
$image_uri = $files[$default_phid]->getBestURI();
4583
} else {
4684
$image_uri = PhabricatorUser::getDefaultProfileImageURI();
4785
}

‎src/applications/people/controller/PhabricatorPeopleProfilePictureController.php

+11-32
Original file line numberDiff line numberDiff line change
@@ -30,22 +30,12 @@ public function handleRequest(AphrontRequest $request) {
3030
$e_file = true;
3131
$errors = array();
3232

33-
// Verify install has GD extension, otherwise default to avatar.png
34-
$gd = function_exists('imagecreatefromstring');
35-
3633
if ($request->isFormPost()) {
3734
$phid = $request->getStr('phid');
3835
$is_default = false;
3936
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;
4939
} else if ($phid) {
5040
$file = id(new PhabricatorFileQuery())
5141
->setViewer($viewer)
@@ -96,13 +86,15 @@ public function handleRequest(AphrontRequest $request) {
9686
$form = id(new PHUIFormLayoutView())
9787
->setUser($viewer);
9888

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) {
10698
$default_image = PhabricatorFile::loadBuiltin($viewer, 'profile.png');
10799
}
108100

@@ -181,21 +173,9 @@ public function handleRequest(AphrontRequest $request) {
181173
}
182174
}
183175

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-
195176
$images[PhabricatorPHIDConstants::PHID_VOID] = array(
196177
'uri' => $default_image->getBestURI(),
197178
'tip' => pht('Default Picture'),
198-
'style' => implode(' ', $default_style),
199179
);
200180

201181
require_celerity_resource('people-profile-css');
@@ -223,7 +203,6 @@ public function handleRequest(AphrontRequest $request) {
223203
'height' => 50,
224204
'width' => 50,
225205
'src' => $spec['uri'],
226-
'style' => $style,
227206
)));
228207

229208
$button = array(

‎src/applications/people/management/PhabricatorPeopleProfileImageWorkflow.php

+7-1
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,14 @@ public function execute(PhutilArgumentParser $args) {
5555
foreach ($iterator as $user) {
5656
$username = $user->getUsername();
5757
$default_phid = $user->getDefaultProfileImagePHID();
58+
$gen_version = $user->getDefaultProfileImageVersion();
5859

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) {
6066
$file = id(new PhabricatorFilesComposeAvatarBuiltinFile())
6167
->getUserProfileImageFile($username);
6268
$user->setDefaultProfileImagePHID($file->getPHID());

‎src/applications/people/storage/PhabricatorUserProfile.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ public static function initializeNewProfile(PhabricatorUser $user) {
1313

1414
return id(new self())
1515
->setUserPHID($user->getPHID())
16-
->setIcon($default_icon);
16+
->setIcon($default_icon)
17+
->setTitle('')
18+
->setBlurb('');
1719
}
1820

1921
protected function getConfiguration() {

0 commit comments

Comments
 (0)
Failed to load comments.