public function toAddress() { return AlmanacAddress::newFromParts($this->getNetworkPHID(), $this->getAddress(), $this->getPort()); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $id = $request->getURIData('id'); if ($id) { $interface = id(new AlmanacInterfaceQuery())->setViewer($viewer)->withIDs(array($id))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$interface) { return new Aphront404Response(); } $device = $interface->getDevice(); $is_new = false; $title = pht('Edit Interface'); $save_button = pht('Save Changes'); } else { $device = id(new AlmanacDeviceQuery())->setViewer($viewer)->withIDs(array($request->getStr('deviceID')))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$device) { return new Aphront404Response(); } $interface = AlmanacInterface::initializeNewInterface(); $is_new = true; $title = pht('Create Interface'); $save_button = pht('Create Interface'); } $device_uri = $device->getURI(); $cancel_uri = $device_uri; $v_network = $interface->getNetworkPHID(); $v_address = $interface->getAddress(); $e_address = true; $v_port = $interface->getPort(); $validation_exception = null; if ($request->isFormPost()) { $v_network = $request->getStr('networkPHID'); $v_address = $request->getStr('address'); $v_port = $request->getStr('port'); $type_interface = AlmanacDeviceTransaction::TYPE_INTERFACE; $address = AlmanacAddress::newFromParts($v_network, $v_address, $v_port); $xaction = id(new AlmanacDeviceTransaction())->setTransactionType($type_interface)->setNewValue($address->toDictionary()); if ($interface->getID()) { $xaction->setOldValue(array('id' => $interface->getID()) + $interface->toAddress()->toDictionary()); } else { $xaction->setOldValue(array()); } $xactions = array(); $xactions[] = $xaction; $editor = id(new AlmanacDeviceEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnNoEffect(true)->setContinueOnMissingFields(true); try { $editor->applyTransactions($device, $xactions); $device_uri = $device->getURI(); return id(new AphrontRedirectResponse())->setURI($device_uri); } catch (PhabricatorApplicationTransactionValidationException $ex) { $validation_exception = $ex; $e_address = $ex->getShortMessage($type_interface); } } $networks = id(new AlmanacNetworkQuery())->setViewer($viewer)->execute(); $form = id(new AphrontFormView())->setUser($viewer)->appendChild(id(new AphrontFormSelectControl())->setLabel(pht('Network'))->setName('networkPHID')->setValue($v_network)->setOptions(mpull($networks, 'getName', 'getPHID')))->appendChild(id(new AphrontFormTextControl())->setLabel(pht('Address'))->setName('address')->setValue($v_address)->setError($e_address))->appendChild(id(new AphrontFormTextControl())->setLabel(pht('Port'))->setName('port')->setValue($v_port)->setError($e_address))->appendChild(id(new AphrontFormSubmitControl())->addCancelButton($cancel_uri)->setValue($save_button)); $box = id(new PHUIObjectBoxView())->setValidationException($validation_exception)->setHeaderText($title)->setForm($form); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb($device->getName(), $device_uri); if ($is_new) { $crumbs->addTextCrumb(pht('Create Interface')); } else { $crumbs->addTextCrumb(pht('Edit Interface')); } return $this->newPage()->setTitle($title)->setCrumbs($crumbs)->appendChild(array($box)); }