From 3de4e91dacbf09284657367425c0d3ce719424ee Mon Sep 17 00:00:00 2001 From: Bob Trahan Date: Fri, 8 Nov 2013 12:45:14 -0800 Subject: [PATCH] Naunce - capalities for Source object Summary: another little piece here that basically just adds some permissions to source editing. serving it up before I do anything too complicated to make sure it seems kosher. in terms of what comes next this form needs to be dynamic based on source type so there'll be some fun there. That said, I plan to implement a more simple "phabricator form" only version to start here and flesh out a few other things like queues with that. Test Plan: set permission to no one for source edit and got a nice error page. Reviewers: epriestley Reviewed By: epriestley CC: Korvin, epriestley, aran Differential Revision: https://secure.phabricator.com/D7535 --- src/__phutil_library_map__.php | 9 +++ .../PhabricatorApplicationNuance.php | 15 ++++ .../NuanceCapabilitySourceDefaultEdit.php | 16 +++++ .../NuanceCapabilitySourceDefaultView.php | 20 ++++++ .../NuanceCapabilitySourceManage.php | 20 ++++++ .../nuance/constants/NuanceConstants.php | 5 ++ .../nuance/constants/NuanceSourceType.php | 22 ++++++ .../controller/NuanceItemEditController.php | 1 - .../controller/NuanceSourceEditController.php | 68 +++++++++++++++++-- .../nuance/storage/NuanceSource.php | 16 +++++ 10 files changed, 187 insertions(+), 5 deletions(-) create mode 100644 src/applications/nuance/capability/NuanceCapabilitySourceDefaultEdit.php create mode 100644 src/applications/nuance/capability/NuanceCapabilitySourceDefaultView.php create mode 100644 src/applications/nuance/capability/NuanceCapabilitySourceManage.php create mode 100644 src/applications/nuance/constants/NuanceConstants.php create mode 100644 src/applications/nuance/constants/NuanceSourceType.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 115c47ff68..c6e75cd973 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -834,6 +834,10 @@ phutil_register_library_map(array( 'MetaMTAConstants' => 'applications/metamta/constants/MetaMTAConstants.php', 'MetaMTANotificationType' => 'applications/metamta/constants/MetaMTANotificationType.php', 'MetaMTAReceivedMailStatus' => 'applications/metamta/constants/MetaMTAReceivedMailStatus.php', + 'NuanceCapabilitySourceDefaultEdit' => 'applications/nuance/capability/NuanceCapabilitySourceDefaultEdit.php', + 'NuanceCapabilitySourceDefaultView' => 'applications/nuance/capability/NuanceCapabilitySourceDefaultView.php', + 'NuanceCapabilitySourceManage' => 'applications/nuance/capability/NuanceCapabilitySourceManage.php', + 'NuanceConstants' => 'applications/nuance/constants/NuanceConstants.php', 'NuanceController' => 'applications/nuance/controller/NuanceController.php', 'NuanceDAO' => 'applications/nuance/storage/NuanceDAO.php', 'NuanceItem' => 'applications/nuance/storage/NuanceItem.php', @@ -874,6 +878,7 @@ phutil_register_library_map(array( 'NuanceSourceTransaction' => 'applications/nuance/storage/NuanceSourceTransaction.php', 'NuanceSourceTransactionComment' => 'applications/nuance/storage/NuanceSourceTransactionComment.php', 'NuanceSourceTransactionQuery' => 'applications/nuance/query/NuanceSourceTransactionQuery.php', + 'NuanceSourceType' => 'applications/nuance/constants/NuanceSourceType.php', 'NuanceSourceViewController' => 'applications/nuance/controller/NuanceSourceViewController.php', 'NuanceTransaction' => 'applications/nuance/storage/NuanceTransaction.php', 'OwnersPackageReplyHandler' => 'applications/owners/mail/OwnersPackageReplyHandler.php', @@ -3147,6 +3152,9 @@ phutil_register_library_map(array( 'ManiphestView' => 'AphrontView', 'MetaMTANotificationType' => 'MetaMTAConstants', 'MetaMTAReceivedMailStatus' => 'MetaMTAConstants', + 'NuanceCapabilitySourceDefaultEdit' => 'PhabricatorPolicyCapability', + 'NuanceCapabilitySourceDefaultView' => 'PhabricatorPolicyCapability', + 'NuanceCapabilitySourceManage' => 'PhabricatorPolicyCapability', 'NuanceController' => 'PhabricatorController', 'NuanceDAO' => 'PhabricatorLiskDAO', 'NuanceItem' => @@ -3199,6 +3207,7 @@ phutil_register_library_map(array( 'NuanceSourceTransaction' => 'NuanceTransaction', 'NuanceSourceTransactionComment' => 'PhabricatorApplicationTransactionComment', 'NuanceSourceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'NuanceSourceType' => 'NuanceConstants', 'NuanceSourceViewController' => 'NuanceController', 'NuanceTransaction' => 'PhabricatorApplicationTransaction', 'OwnersPackageReplyHandler' => 'PhabricatorMailReplyHandler', diff --git a/src/applications/nuance/application/PhabricatorApplicationNuance.php b/src/applications/nuance/application/PhabricatorApplicationNuance.php index 7d70973d1e..c085e69a0e 100644 --- a/src/applications/nuance/application/PhabricatorApplicationNuance.php +++ b/src/applications/nuance/application/PhabricatorApplicationNuance.php @@ -50,5 +50,20 @@ final class PhabricatorApplicationNuance extends PhabricatorApplication { ); } + protected function getCustomCapabilities() { + return array( + NuanceCapabilitySourceDefaultView::CAPABILITY => array( + 'caption' => pht( + 'Default view policy for newly created sources.'), + ), + NuanceCapabilitySourceDefaultEdit::CAPABILITY => array( + 'caption' => pht( + 'Default edit policy for newly created sources.'), + ), + NuanceCapabilitySourceManage::CAPABILITY => array( + ), + ); + } + } diff --git a/src/applications/nuance/capability/NuanceCapabilitySourceDefaultEdit.php b/src/applications/nuance/capability/NuanceCapabilitySourceDefaultEdit.php new file mode 100644 index 0000000000..8dcf6e4c03 --- /dev/null +++ b/src/applications/nuance/capability/NuanceCapabilitySourceDefaultEdit.php @@ -0,0 +1,16 @@ + pht('Phabricator Form'), + ); + } + +} diff --git a/src/applications/nuance/controller/NuanceItemEditController.php b/src/applications/nuance/controller/NuanceItemEditController.php index e40013bf3c..7a1deec721 100644 --- a/src/applications/nuance/controller/NuanceItemEditController.php +++ b/src/applications/nuance/controller/NuanceItemEditController.php @@ -25,7 +25,6 @@ final class NuanceItemEditController extends NuanceController { if ($is_new) { $item = new NuanceItem(); - } else { $item = id(new NuanceItemQuery()) ->setViewer($user) diff --git a/src/applications/nuance/controller/NuanceSourceEditController.php b/src/applications/nuance/controller/NuanceSourceEditController.php index 15d7263205..b71ace7d73 100644 --- a/src/applications/nuance/controller/NuanceSourceEditController.php +++ b/src/applications/nuance/controller/NuanceSourceEditController.php @@ -17,6 +17,9 @@ final class NuanceSourceEditController extends NuanceController { } public function processRequest() { + $can_edit = $this->requireApplicationCapability( + NuanceCapabilitySourceManage::CAPABILITY); + $request = $this->getRequest(); $user = $request->getUser(); @@ -24,24 +27,81 @@ final class NuanceSourceEditController extends NuanceController { $is_new = !$source_id; if ($is_new) { - $source = new NuanceSource(); - + $source = NuanceSource::initializeNewSource($user); + $title = pht('Create Source'); } else { $source = id(new NuanceSourceQuery()) ->setViewer($user) ->withIDs(array($source_id)) + ->requireCapabilities( + array( + PhabricatorPolicyCapability::CAN_VIEW, + PhabricatorPolicyCapability::CAN_EDIT, + )) ->executeOne(); + $title = pht('Edit Source'); } if (!$source) { return new Aphront404Response(); } + $error_view = null; + $e_name = null; + if ($request->isFormPost()) { + $error_view = id(new AphrontErrorView()) + ->setTitle(pht('This does not work at all yet.')); + } + + $policies = id(new PhabricatorPolicyQuery()) + ->setViewer($user) + ->setObject($source) + ->execute(); + $crumbs = $this->buildApplicationCrumbs(); - $title = 'TODO'; + + $form = id(new AphrontFormView()) + ->setUser($user) + ->appendChild( + id(new AphrontFormTextControl()) + ->setLabel(pht('Name')) + ->setName('name') + ->setError($e_name) + ->setValue($source->getName())) + ->appendChild( + id(new AphrontFormSelectControl()) + ->setLabel(pht('Type')) + ->setName('type') + ->setOptions(NuanceSourceType::getSelectOptions()) + ->setValue($source->getType())) + ->appendChild( + id(new AphrontFormPolicyControl()) + ->setUser($user) + ->setCapability(PhabricatorPolicyCapability::CAN_VIEW) + ->setPolicyObject($source) + ->setPolicies($policies) + ->setName('viewPolicy')) + ->appendChild( + id(new AphrontFormPolicyControl()) + ->setUser($user) + ->setCapability(PhabricatorPolicyCapability::CAN_EDIT) + ->setPolicyObject($source) + ->setPolicies($policies) + ->setName('editPolicy')) + ->appendChild( + id(new AphrontFormSubmitControl()) + ->setValue(pht('Save'))); + + $layout = id(new PHUIObjectBoxView()) + ->setHeaderText($title) + ->setFormError($error_view) + ->setForm($form); return $this->buildApplicationPage( - $crumbs, + array( + $crumbs, + $layout, + ), array( 'title' => $title, 'device' => true)); diff --git a/src/applications/nuance/storage/NuanceSource.php b/src/applications/nuance/storage/NuanceSource.php index 51407a4ec5..7d371ef8e7 100644 --- a/src/applications/nuance/storage/NuanceSource.php +++ b/src/applications/nuance/storage/NuanceSource.php @@ -36,6 +36,22 @@ final class NuanceSource return '/nuance/source/view/'.$this->getID().'/'; } + public static function initializeNewSource(PhabricatorUser $actor) { + $app = id(new PhabricatorApplicationQuery()) + ->setViewer($actor) + ->withClasses(array('PhabricatorApplicationNuance')) + ->executeOne(); + + $view_policy = $app->getPolicy( + NuanceCapabilitySourceDefaultView::CAPABILITY); + $edit_policy = $app->getPolicy( + NuanceCapabilitySourceDefaultEdit::CAPABILITY); + + return id(new NuanceSource()) + ->setViewPolicy($view_policy) + ->setEditPolicy($edit_policy); + } + public function getCapabilities() { return array( PhabricatorPolicyCapability::CAN_VIEW,