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

Make project profile picture edits transactional

Summary: Ref T4379. Make changing pictures use apptransactions.

Test Plan: {F111554}

Reviewers: btrahan

Reviewed By: btrahan

CC: aran

Maniphest Tasks: T4379

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

+67 -5
+16 -4
src/applications/project/controller/PhabricatorProjectProfilePictureController.php
··· 75 75 76 76 if (!$errors) { 77 77 if ($is_default) { 78 - $project->setProfileImagePHID(null); 78 + $new_value = null; 79 79 } else { 80 - $project->setProfileImagePHID($xformed->getPHID()); 81 - $xformed->attachToObject($viewer, $project->getPHID()); 80 + $new_value = $xformed->getPHID(); 82 81 } 83 - $project->save(); 82 + 83 + $xactions = array(); 84 + $xactions[] = id(new PhabricatorProjectTransaction()) 85 + ->setTransactionType(PhabricatorProjectTransaction::TYPE_IMAGE) 86 + ->setNewValue($new_value); 87 + 88 + $editor = id(new PhabricatorProjectTransactionEditor()) 89 + ->setActor($viewer) 90 + ->setContentSourceFromRequest($request) 91 + ->setContinueOnMissingFields(true) 92 + ->setContinueOnNoEffect(true); 93 + 94 + $editor->applyTransactions($project, $xactions); 95 + 84 96 return id(new AphrontRedirectResponse())->setURI($project_uri); 85 97 } 86 98 }
+25
src/applications/project/editor/PhabricatorProjectTransactionEditor.php
··· 13 13 14 14 $types[] = PhabricatorProjectTransaction::TYPE_NAME; 15 15 $types[] = PhabricatorProjectTransaction::TYPE_STATUS; 16 + $types[] = PhabricatorProjectTransaction::TYPE_IMAGE; 16 17 17 18 return $types; 18 19 } ··· 26 27 return $object->getName(); 27 28 case PhabricatorProjectTransaction::TYPE_STATUS: 28 29 return $object->getStatus(); 30 + case PhabricatorProjectTransaction::TYPE_IMAGE: 31 + return $object->getProfileImagePHID(); 29 32 } 30 33 31 34 return parent::getCustomTransactionOldValue($object, $xaction); ··· 38 41 switch ($xaction->getTransactionType()) { 39 42 case PhabricatorProjectTransaction::TYPE_NAME: 40 43 case PhabricatorProjectTransaction::TYPE_STATUS: 44 + case PhabricatorProjectTransaction::TYPE_IMAGE: 41 45 return $xaction->getNewValue(); 42 46 } 43 47 ··· 54 58 return; 55 59 case PhabricatorProjectTransaction::TYPE_STATUS: 56 60 $object->setStatus($xaction->getNewValue()); 61 + return; 62 + case PhabricatorProjectTransaction::TYPE_IMAGE: 63 + $object->setProfileImagePHID($xaction->getNewValue()); 57 64 return; 58 65 case PhabricatorTransactions::TYPE_EDGE: 59 66 return; ··· 113 120 case PhabricatorTransactions::TYPE_JOIN_POLICY: 114 121 case PhabricatorTransactions::TYPE_EDGE: 115 122 case PhabricatorProjectTransaction::TYPE_STATUS: 123 + case PhabricatorProjectTransaction::TYPE_IMAGE: 116 124 return; 117 125 } 118 126 ··· 156 164 switch ($xaction->getTransactionType()) { 157 165 case PhabricatorProjectTransaction::TYPE_NAME: 158 166 case PhabricatorProjectTransaction::TYPE_STATUS: 167 + case PhabricatorProjectTransaction::TYPE_IMAGE: 159 168 PhabricatorPolicyFilter::requireCapability( 160 169 $this->requireActor(), 161 170 $object, ··· 200 209 201 210 protected function supportsSearch() { 202 211 return true; 212 + } 213 + 214 + protected function extractFilePHIDsFromCustomTransaction( 215 + PhabricatorLiskDAO $object, 216 + PhabricatorApplicationTransaction $xaction) { 217 + 218 + switch ($xaction->getTransactionType()) { 219 + case PhabricatorProjectTransaction::TYPE_IMAGE: 220 + $new = $xaction->getNewValue(); 221 + if ($new) { 222 + return array($new); 223 + } 224 + break; 225 + } 226 + 227 + return parent::extractFilePHIDsFromCustomTransaction($object, $xaction); 203 228 } 204 229 205 230 }
+26 -1
src/applications/project/storage/PhabricatorProjectTransaction.php
··· 4 4 extends PhabricatorApplicationTransaction { 5 5 6 6 const TYPE_NAME = 'project:name'; 7 + const TYPE_STATUS = 'project:status'; 8 + const TYPE_IMAGE = 'project:image'; 9 + 10 + // NOTE: This is deprecated, members are just a normal edge now. 7 11 const TYPE_MEMBERS = 'project:members'; 8 - const TYPE_STATUS = 'project:status'; 9 12 10 13 public function getApplicationName() { 11 14 return 'project'; ··· 25 28 $add = array_diff($new, $old); 26 29 $rem = array_diff($old, $new); 27 30 $req_phids = array_merge($add, $rem); 31 + break; 32 + case PhabricatorProjectTransaction::TYPE_IMAGE: 33 + $req_phids[] = $old; 34 + $req_phids[] = $new; 28 35 break; 29 36 } 30 37 ··· 58 65 return pht( 59 66 '%s reopened this project.', 60 67 $author_handle); 68 + } 69 + case PhabricatorProjectTransaction::TYPE_IMAGE: 70 + // TODO: Some day, it would be nice to show the images. 71 + if (!$old) { 72 + return pht( 73 + '%s set this project\'s image to %s.', 74 + $author_handle, 75 + $this->renderHandleLink($new)); 76 + } else if (!$new) { 77 + return pht( 78 + '%s removed this project\'s image.', 79 + $author_handle); 80 + } else { 81 + return pht( 82 + '%s updated this project\'s image from %s to %s.', 83 + $author_handle, 84 + $this->renderHandleLink($old), 85 + $this->renderHandleLink($new)); 61 86 } 62 87 case PhabricatorProjectTransaction::TYPE_MEMBERS: 63 88 $add = array_diff($new, $old);