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

Allow Drydock blueprints to define and use custom fields

Summary: This allows Drydock blueprints to define custom fields for blueprint settings.

Test Plan: Pulled out of EC2 allocator diff.

Reviewers: epriestley, #blessed_reviewers

Reviewed By: epriestley, #blessed_reviewers

Subscribers: epriestley, Korvin

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

+136 -5
+8
src/__phutil_library_map__.php
··· 569 569 'DrydockApacheWebrootInterface' => 'applications/drydock/interface/webroot/DrydockApacheWebrootInterface.php', 570 570 'DrydockBlueprint' => 'applications/drydock/storage/DrydockBlueprint.php', 571 571 'DrydockBlueprintController' => 'applications/drydock/controller/DrydockBlueprintController.php', 572 + 'DrydockBlueprintCoreCustomField' => 'applications/drydock/customfield/DrydockBlueprintCoreCustomField.php', 572 573 'DrydockBlueprintCreateController' => 'applications/drydock/controller/DrydockBlueprintCreateController.php', 574 + 'DrydockBlueprintCustomField' => 'applications/drydock/customfield/DrydockBlueprintCustomField.php', 573 575 'DrydockBlueprintEditController' => 'applications/drydock/controller/DrydockBlueprintEditController.php', 574 576 'DrydockBlueprintEditor' => 'applications/drydock/editor/DrydockBlueprintEditor.php', 575 577 'DrydockBlueprintImplementation' => 'applications/drydock/blueprint/DrydockBlueprintImplementation.php', ··· 3306 3308 'DrydockBlueprint' => array( 3307 3309 'DrydockDAO', 3308 3310 'PhabricatorPolicyInterface', 3311 + 'PhabricatorCustomFieldInterface', 3309 3312 ), 3310 3313 'DrydockBlueprintController' => 'DrydockController', 3314 + 'DrydockBlueprintCoreCustomField' => array( 3315 + 'DrydockBlueprintCustomField', 3316 + 'PhabricatorStandardCustomFieldInterface', 3317 + ), 3311 3318 'DrydockBlueprintCreateController' => 'DrydockBlueprintController', 3319 + 'DrydockBlueprintCustomField' => 'PhabricatorCustomField', 3312 3320 'DrydockBlueprintEditController' => 'DrydockBlueprintController', 3313 3321 'DrydockBlueprintEditor' => 'PhabricatorApplicationTransactionEditor', 3314 3322 'DrydockBlueprintListController' => 'DrydockBlueprintController',
+8
src/applications/drydock/blueprint/DrydockBlueprintImplementation.php
··· 56 56 return $this; 57 57 } 58 58 59 + public function getFieldSpecifications() { 60 + return array(); 61 + } 62 + 63 + public function getDetail($key, $default = null) { 64 + return $this->getInstance()->getDetail($key, $default); 65 + } 66 + 59 67 60 68 /* -( Lease Acquisition )-------------------------------------------------- */ 61 69
+23 -4
src/applications/drydock/controller/DrydockBlueprintEditController.php
··· 44 44 $cancel_uri = $this->getApplicationURI('blueprint/'); 45 45 } 46 46 47 + $field_list = PhabricatorCustomField::getObjectFields( 48 + $blueprint, 49 + PhabricatorCustomField::ROLE_EDIT); 50 + $field_list 51 + ->setViewer($viewer) 52 + ->readFieldsFromStorage($blueprint); 53 + 47 54 $v_name = $blueprint->getBlueprintName(); 48 55 $e_name = true; 49 56 $errors = array(); 57 + $validation_exception = null; 50 58 51 59 if ($request->isFormPost()) { 52 60 $v_view_policy = $request->getStr('viewPolicy'); ··· 60 68 if (!$errors) { 61 69 $xactions = array(); 62 70 71 + $xactions = $field_list->buildFieldTransactionsFromRequest( 72 + new DrydockBlueprintTransaction(), 73 + $request); 74 + 63 75 $xactions[] = id(new DrydockBlueprintTransaction()) 64 76 ->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY) 65 77 ->setNewValue($v_view_policy); ··· 77 89 ->setContentSourceFromRequest($request) 78 90 ->setContinueOnNoEffect(true); 79 91 80 - $editor->applyTransactions($blueprint, $xactions); 92 + try { 93 + $editor->applyTransactions($blueprint, $xactions); 81 94 82 - $id = $blueprint->getID(); 83 - $save_uri = $this->getApplicationURI("blueprint/{$id}/"); 95 + $id = $blueprint->getID(); 96 + $save_uri = $this->getApplicationURI("blueprint/{$id}/"); 84 97 85 - return id(new AphrontRedirectResponse())->setURI($save_uri); 98 + return id(new AphrontRedirectResponse())->setURI($save_uri); 99 + } catch (PhabricatorApplicationTransactionValidationException $ex) { 100 + $validation_exception = $ex; 101 + } 86 102 } 87 103 } 88 104 ··· 117 133 ->setCapability(PhabricatorPolicyCapability::CAN_EDIT) 118 134 ->setPolicies($policies)); 119 135 136 + $field_list->appendFieldsToForm($form); 137 + 120 138 $crumbs = $this->buildApplicationCrumbs(); 121 139 122 140 if ($blueprint->getID()) { ··· 139 157 140 158 $box = id(new PHUIObjectBoxView()) 141 159 ->setHeaderText($header) 160 + ->setValidationException($validation_exception) 142 161 ->setFormErrors($errors) 143 162 ->setForm($form); 144 163
+12
src/applications/drydock/controller/DrydockBlueprintViewController.php
··· 61 61 ->withObjectPHIDs(array($blueprint->getPHID())) 62 62 ->execute(); 63 63 64 + $field_list = PhabricatorCustomField::getObjectFields( 65 + $blueprint, 66 + PhabricatorCustomField::ROLE_VIEW); 67 + $field_list 68 + ->setViewer($viewer) 69 + ->readFieldsFromStorage($blueprint); 70 + 71 + $field_list->appendFieldsToPropertyList( 72 + $blueprint, 73 + $viewer, 74 + $properties); 75 + 64 76 $engine = id(new PhabricatorMarkupEngine()) 65 77 ->setViewer($viewer); 66 78
+43
src/applications/drydock/customfield/DrydockBlueprintCoreCustomField.php
··· 1 + <?php 2 + 3 + final class DrydockBlueprintCoreCustomField 4 + extends DrydockBlueprintCustomField 5 + implements PhabricatorStandardCustomFieldInterface { 6 + 7 + public function getStandardCustomFieldNamespace() { 8 + return 'drydock:core'; 9 + } 10 + 11 + public function createFields($object) { 12 + $impl = $object->getImplementation(); 13 + $specs = $impl->getFieldSpecifications(); 14 + 15 + return PhabricatorStandardCustomField::buildStandardFields($this, $specs); 16 + } 17 + 18 + public function shouldUseStorage() { 19 + return false; 20 + } 21 + 22 + public function readValueFromObject(PhabricatorCustomFieldInterface $object) { 23 + $key = $this->getProxy()->getRawStandardFieldKey(); 24 + $this->setValueFromStorage($object->getDetail($key)); 25 + } 26 + 27 + public function applyApplicationTransactionInternalEffects( 28 + PhabricatorApplicationTransaction $xaction) { 29 + $object = $this->getObject(); 30 + $key = $this->getProxy()->getRawStandardFieldKey(); 31 + 32 + $this->setValueFromApplicationTransactions($xaction->getNewValue()); 33 + $value = $this->getValueForStorage(); 34 + 35 + $object->setDetail($key, $value); 36 + } 37 + 38 + public function applyApplicationTransactionExternalEffects( 39 + PhabricatorApplicationTransaction $xaction) { 40 + return; 41 + } 42 + 43 + }
+6
src/applications/drydock/customfield/DrydockBlueprintCustomField.php
··· 1 + <?php 2 + 3 + abstract class DrydockBlueprintCustomField 4 + extends PhabricatorCustomField { 5 + 6 + }
+36 -1
src/applications/drydock/storage/DrydockBlueprint.php
··· 1 1 <?php 2 2 3 3 final class DrydockBlueprint extends DrydockDAO 4 - implements PhabricatorPolicyInterface { 4 + implements 5 + PhabricatorPolicyInterface, 6 + PhabricatorCustomFieldInterface { 5 7 6 8 protected $className; 7 9 protected $blueprintName; ··· 10 12 protected $details = array(); 11 13 12 14 private $implementation = self::ATTACHABLE; 15 + private $customFields = self::ATTACHABLE; 13 16 14 17 public static function initializeNewBlueprint(PhabricatorUser $actor) { 15 18 $app = id(new PhabricatorApplicationQuery()) ··· 58 61 return $this; 59 62 } 60 63 64 + public function getDetail($key, $default = null) { 65 + return idx($this->details, $key, $default); 66 + } 67 + 68 + public function setDetail($key, $value) { 69 + $this->details[$key] = $value; 70 + return $this; 71 + } 72 + 61 73 62 74 /* -( PhabricatorPolicyInterface )----------------------------------------- */ 63 75 ··· 85 97 public function describeAutomaticCapability($capability) { 86 98 return null; 87 99 } 100 + 101 + 102 + /* -( PhabricatorCustomFieldInterface )------------------------------------ */ 103 + 104 + 105 + public function getCustomFieldSpecificationForRole($role) { 106 + return array(); 107 + } 108 + 109 + public function getCustomFieldBaseClass() { 110 + return 'DrydockBlueprintCustomField'; 111 + } 112 + 113 + public function getCustomFields() { 114 + return $this->assertAttached($this->customFields); 115 + } 116 + 117 + public function attachCustomFields(PhabricatorCustomFieldAttachment $fields) { 118 + $this->customFields = $fields; 119 + return $this; 120 + } 121 + 122 + 88 123 89 124 }