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

Implement view and edit policies in Differential CustomFields

Summary:
Ref T3886. Ref T418.

- Adds "View Policy" and "Edit Policy" fields.
- Allows CustomFields to produce arbitrary types of transactions, so these fields can produce standard view/edit policy transactions and get all the strings and validation associated with them.

Test Plan: {F116001}

Reviewers: btrahan

Reviewed By: btrahan

CC: aran

Maniphest Tasks: T418, T3886

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

+162 -5
+4
src/__phutil_library_map__.php
··· 381 381 'DifferentialDiffViewPolicyFieldSpecification' => 'applications/differential/field/specification/DifferentialDiffViewPolicyFieldSpecification.php', 382 382 'DifferentialDoorkeeperRevisionFeedStoryPublisher' => 'applications/differential/doorkeeper/DifferentialDoorkeeperRevisionFeedStoryPublisher.php', 383 383 'DifferentialDraft' => 'applications/differential/storage/DifferentialDraft.php', 384 + 'DifferentialEditPolicyField' => 'applications/differential/customfield/DifferentialEditPolicyField.php', 384 385 'DifferentialEditPolicyFieldSpecification' => 'applications/differential/field/specification/DifferentialEditPolicyFieldSpecification.php', 385 386 'DifferentialException' => 'applications/differential/exception/DifferentialException.php', 386 387 'DifferentialExceptionMail' => 'applications/differential/mail/DifferentialExceptionMail.php', ··· 478 479 'DifferentialUnitFieldSpecification' => 'applications/differential/field/specification/DifferentialUnitFieldSpecification.php', 479 480 'DifferentialUnitStatus' => 'applications/differential/constants/DifferentialUnitStatus.php', 480 481 'DifferentialUnitTestResult' => 'applications/differential/constants/DifferentialUnitTestResult.php', 482 + 'DifferentialViewPolicyField' => 'applications/differential/customfield/DifferentialViewPolicyField.php', 481 483 'DifferentialViewPolicyFieldSpecification' => 'applications/differential/field/specification/DifferentialViewPolicyFieldSpecification.php', 482 484 'DiffusionBranchTableController' => 'applications/diffusion/controller/DiffusionBranchTableController.php', 483 485 'DiffusionBranchTableView' => 'applications/diffusion/view/DiffusionBranchTableView.php', ··· 2926 2928 'DifferentialDiffViewPolicyFieldSpecification' => 'DifferentialFieldSpecification', 2927 2929 'DifferentialDoorkeeperRevisionFeedStoryPublisher' => 'DoorkeeperFeedStoryPublisher', 2928 2930 'DifferentialDraft' => 'DifferentialDAO', 2931 + 'DifferentialEditPolicyField' => 'DifferentialCoreCustomField', 2929 2932 'DifferentialEditPolicyFieldSpecification' => 'DifferentialFieldSpecification', 2930 2933 'DifferentialException' => 'Exception', 2931 2934 'DifferentialExceptionMail' => 'DifferentialMail', ··· 3021 3024 'DifferentialTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 3022 3025 'DifferentialTransactionView' => 'PhabricatorApplicationTransactionView', 3023 3026 'DifferentialUnitFieldSpecification' => 'DifferentialFieldSpecification', 3027 + 'DifferentialViewPolicyField' => 'DifferentialCoreCustomField', 3024 3028 'DifferentialViewPolicyFieldSpecification' => 'DifferentialFieldSpecification', 3025 3029 'DiffusionBranchTableController' => 'DiffusionController', 3026 3030 'DiffusionBranchTableView' => 'DiffusionView',
+56
src/applications/differential/customfield/DifferentialEditPolicyField.php
··· 1 + <?php 2 + 3 + final class DifferentialEditPolicyField 4 + extends DifferentialCoreCustomField { 5 + 6 + public function getFieldKey() { 7 + return 'differential:edit-policy'; 8 + } 9 + 10 + public function getFieldName() { 11 + return pht('Edit Policy'); 12 + } 13 + 14 + public function getFieldDescription() { 15 + return pht('Controls who can edit a revision.'); 16 + } 17 + 18 + protected function readValueFromRevision( 19 + DifferentialRevision $revision) { 20 + return $revision->getEditPolicy(); 21 + } 22 + 23 + protected function writeValueToRevision( 24 + DifferentialRevision $revision, 25 + $value) { 26 + $revision->setEditPolicy($value); 27 + } 28 + 29 + public function readValueFromRequest(AphrontRequest $request) { 30 + $this->setValue($request->getStr($this->getFieldKey())); 31 + } 32 + 33 + public function renderEditControl(array $handles) { 34 + $viewer = $this->getViewer(); 35 + $revision = $this->getObject(); 36 + 37 + $policies = id(new PhabricatorPolicyQuery()) 38 + ->setViewer($viewer) 39 + ->setObject($revision) 40 + ->execute(); 41 + 42 + return id(new AphrontFormPolicyControl()) 43 + ->setUser($viewer) 44 + ->setCapability(PhabricatorPolicyCapability::CAN_EDIT) 45 + ->setPolicyObject($revision) 46 + ->setPolicies($policies) 47 + ->setName($this->getFieldKey()) 48 + ->setValue($this->getValue()) 49 + ->setError($this->getFieldError()); 50 + } 51 + 52 + public function getApplicationTransactionType() { 53 + return PhabricatorTransactions::TYPE_EDIT_POLICY; 54 + } 55 + 56 + }
+56
src/applications/differential/customfield/DifferentialViewPolicyField.php
··· 1 + <?php 2 + 3 + final class DifferentialViewPolicyField 4 + extends DifferentialCoreCustomField { 5 + 6 + public function getFieldKey() { 7 + return 'differential:view-policy'; 8 + } 9 + 10 + public function getFieldName() { 11 + return pht('View Policy'); 12 + } 13 + 14 + public function getFieldDescription() { 15 + return pht('Controls visibility.'); 16 + } 17 + 18 + protected function readValueFromRevision( 19 + DifferentialRevision $revision) { 20 + return $revision->getViewPolicy(); 21 + } 22 + 23 + protected function writeValueToRevision( 24 + DifferentialRevision $revision, 25 + $value) { 26 + $revision->setViewPolicy($value); 27 + } 28 + 29 + public function readValueFromRequest(AphrontRequest $request) { 30 + $this->setValue($request->getStr($this->getFieldKey())); 31 + } 32 + 33 + public function renderEditControl(array $handles) { 34 + $viewer = $this->getViewer(); 35 + $revision = $this->getObject(); 36 + 37 + $policies = id(new PhabricatorPolicyQuery()) 38 + ->setViewer($viewer) 39 + ->setObject($revision) 40 + ->execute(); 41 + 42 + return id(new AphrontFormPolicyControl()) 43 + ->setUser($viewer) 44 + ->setCapability(PhabricatorPolicyCapability::CAN_VIEW) 45 + ->setPolicyObject($revision) 46 + ->setPolicies($policies) 47 + ->setName($this->getFieldKey()) 48 + ->setValue($this->getValue()) 49 + ->setError($this->getFieldError()); 50 + } 51 + 52 + public function getApplicationTransactionType() { 53 + return PhabricatorTransactions::TYPE_VIEW_POLICY; 54 + } 55 + 56 + }
+19 -2
src/applications/differential/editor/DifferentialTransactionEditor.php
··· 6 6 public function getTransactionTypes() { 7 7 $types = parent::getTransactionTypes(); 8 8 9 + $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; 10 + $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; 11 + 9 12 /* 10 13 $types[] = PhabricatorTransactions::TYPE_EDGE; 11 - $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; 12 - $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; 13 14 14 15 $types[] = DifferentialTransaction::TYPE_INLINE; 15 16 $types[] = DifferentialTransaction::TYPE_UPDATE; ··· 24 25 PhabricatorApplicationTransaction $xaction) { 25 26 26 27 switch ($xaction->getTransactionType()) { 28 + case PhabricatorTransactions::TYPE_VIEW_POLICY: 29 + return $object->getViewPolicy(); 30 + case PhabricatorTransactions::TYPE_EDIT_POLICY: 31 + return $object->getEditPolicy(); 27 32 } 28 33 29 34 return parent::getCustomTransactionOldValue($object, $xaction); ··· 34 39 PhabricatorApplicationTransaction $xaction) { 35 40 36 41 switch ($xaction->getTransactionType()) { 42 + case PhabricatorTransactions::TYPE_VIEW_POLICY: 43 + case PhabricatorTransactions::TYPE_EDIT_POLICY: 44 + return $xaction->getNewValue(); 37 45 } 38 46 39 47 return parent::getCustomTransactionNewValue($object, $xaction); ··· 44 52 PhabricatorApplicationTransaction $xaction) { 45 53 46 54 switch ($xaction->getTransactionType()) { 55 + case PhabricatorTransactions::TYPE_VIEW_POLICY: 56 + $object->setViewPolicy($xaction->getNewValue()); 57 + return; 58 + case PhabricatorTransactions::TYPE_EDIT_POLICY: 59 + $object->setEditPolicy($xaction->getNewValue()); 60 + return; 47 61 } 48 62 49 63 return parent::applyCustomInternalTransaction($object, $xaction); ··· 54 68 PhabricatorApplicationTransaction $xaction) { 55 69 56 70 switch ($xaction->getTransactionType()) { 71 + case PhabricatorTransactions::TYPE_VIEW_POLICY: 72 + case PhabricatorTransactions::TYPE_EDIT_POLICY: 73 + return; 57 74 } 58 75 59 76 return parent::applyCustomExternalTransaction($object, $xaction);
+2
src/applications/differential/storage/DifferentialRevision.php
··· 470 470 new DifferentialSummaryField(), 471 471 new DifferentialTestPlanField(), 472 472 new DifferentialRepositoryField(), 473 + new DifferentialViewPolicyField(), 474 + new DifferentialEditPolicyField(), 473 475 ); 474 476 475 477 return array_fill_keys(
+6 -1
src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php
··· 738 738 739 739 $type = $xaction->getTransactionType(); 740 740 if (empty($types[$type])) { 741 - throw new Exception("Transaction has unknown type '{$type}'."); 741 + throw new Exception( 742 + pht( 743 + 'Transaction has type "%s", but that transaction type is not '. 744 + 'supported by this editor (%s).', 745 + $type, 746 + get_class($this))); 742 747 } 743 748 } 744 749
+11
src/infrastructure/customfield/field/PhabricatorCustomField.php
··· 736 736 /** 737 737 * @task appxaction 738 738 */ 739 + public function getApplicationTransactionType() { 740 + if ($this->proxy) { 741 + return $this->proxy->getApplicationTransactionType(); 742 + } 743 + return PhabricatorTransactions::TYPE_CUSTOMFIELD; 744 + } 745 + 746 + 747 + /** 748 + * @task appxaction 749 + */ 739 750 public function getOldValueForApplicationTransactions() { 740 751 if ($this->proxy) { 741 752 return $this->proxy->getOldValueForApplicationTransactions();
+8 -2
src/infrastructure/customfield/field/PhabricatorCustomFieldList.php
··· 202 202 $old_value = $field->getOldValueForApplicationTransactions(); 203 203 204 204 $field->readValueFromRequest($request); 205 + $transaction_type = $field->getApplicationTransactionType(); 205 206 206 207 $xaction = id(clone $template) 207 - ->setTransactionType(PhabricatorTransactions::TYPE_CUSTOMFIELD) 208 + ->setTransactionType($transaction_type) 208 209 ->setMetadataValue('customfield:key', $field->getFieldKey()) 209 - ->setOldValue($old_value) 210 210 ->setNewValue($field->getNewValueForApplicationTransactions()); 211 + 212 + if ($transaction_type == PhabricatorTransactions::TYPE_CUSTOMFIELD) { 213 + // For TYPE_CUSTOMFIELD transactions only, we provide the old value 214 + // as an input. 215 + $xaction->setOldValue($old_value); 216 + } 211 217 212 218 $xactions[] = $xaction; 213 219 }