From 660f1f3e64802cda5cacad042c210c51278cb688 Mon Sep 17 00:00:00 2001 From: Bob Trahan Date: Wed, 25 Sep 2013 11:50:15 -0700 Subject: [PATCH] Add herald support for Maniphest Summary: standing on the shoulders of the badass work to move Maniphest to ApplicationTransactions, this diff implements a few methods and adds an adapter class. For now, we can add cc and flag tasks. I figure see what people ask for? Ref T1368. Test Plan: created herald rules for title and description text hits. made tasks and verified CC and flags worked. Reviewers: epriestley Reviewed By: epriestley CC: Korvin, aran Maniphest Tasks: T1368, T1638 Differential Revision: https://secure.phabricator.com/D7122 --- src/__phutil_library_map__.php | 2 + .../adapter/HeraldManiphestTaskAdapter.php | 114 ++++++++++++++++++ .../editor/ManiphestTransactionEditorPro.php | 26 ++++ 3 files changed, 142 insertions(+) create mode 100644 src/applications/herald/adapter/HeraldManiphestTaskAdapter.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index f52d57350c..6dcb395cbb 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -629,6 +629,7 @@ phutil_register_library_map(array( 'HeraldInvalidActionException' => 'applications/herald/engine/exception/HeraldInvalidActionException.php', 'HeraldInvalidConditionException' => 'applications/herald/engine/exception/HeraldInvalidConditionException.php', 'HeraldInvalidFieldException' => 'applications/herald/engine/exception/HeraldInvalidFieldException.php', + 'HeraldManiphestTaskAdapter' => 'applications/herald/adapter/HeraldManiphestTaskAdapter.php', 'HeraldNewController' => 'applications/herald/controller/HeraldNewController.php', 'HeraldObjectTranscript' => 'applications/herald/storage/transcript/HeraldObjectTranscript.php', 'HeraldPHIDTypeRule' => 'applications/herald/phid/HeraldPHIDTypeRule.php', @@ -2692,6 +2693,7 @@ phutil_register_library_map(array( 'HeraldInvalidActionException' => 'Exception', 'HeraldInvalidConditionException' => 'Exception', 'HeraldInvalidFieldException' => 'Exception', + 'HeraldManiphestTaskAdapter' => 'HeraldAdapter', 'HeraldNewController' => 'HeraldController', 'HeraldPHIDTypeRule' => 'PhabricatorPHIDType', 'HeraldPholioMockAdapter' => 'HeraldAdapter', diff --git a/src/applications/herald/adapter/HeraldManiphestTaskAdapter.php b/src/applications/herald/adapter/HeraldManiphestTaskAdapter.php new file mode 100644 index 0000000000..5f0c83440e --- /dev/null +++ b/src/applications/herald/adapter/HeraldManiphestTaskAdapter.php @@ -0,0 +1,114 @@ +task = $task; + return $this; + } + public function getTask() { + return $this->task; + } + + private function setCcPHIDs(array $cc_phids) { + $this->ccPHIDs = $cc_phids; + return $this; + } + public function getCcPHIDs() { + return $this->ccPHIDs; + } + + public function getAdapterContentName() { + return pht('Maniphest Tasks'); + } + + public function getFields() { + return array( + self::FIELD_TITLE, + self::FIELD_BODY, + self::FIELD_AUTHOR, + self::FIELD_CC, + ); + } + + public function getActions($rule_type) { + switch ($rule_type) { + case HeraldRuleTypeConfig::RULE_TYPE_GLOBAL: + return array( + self::ACTION_ADD_CC, + self::ACTION_NOTHING, + ); + case HeraldRuleTypeConfig::RULE_TYPE_PERSONAL: + return array( + self::ACTION_ADD_CC, + self::ACTION_FLAG, + self::ACTION_NOTHING, + ); + } + } + + public function getPHID() { + return $this->getTask()->getPHID(); + } + + public function getHeraldName() { + return 'T'.$this->getTask()->getID(); + } + + public function getHeraldField($field) { + switch ($field) { + case self::FIELD_TITLE: + return $this->getTask()->getTitle(); + case self::FIELD_BODY: + return $this->getTask()->getDescription(); + case self::FIELD_AUTHOR: + return $this->getTask()->getAuthorPHID(); + case self::FIELD_CC: + return $this->getTask()->getCCPHIDs(); + } + + return parent::getHeraldField($field); + } + + public function applyHeraldEffects(array $effects) { + assert_instances_of($effects, 'HeraldEffect'); + + $result = array(); + foreach ($effects as $effect) { + $action = $effect->getAction(); + switch ($action) { + case self::ACTION_NOTHING: + $result[] = new HeraldApplyTranscript( + $effect, + true, + pht('Great success at doing nothing.')); + break; + case self::ACTION_ADD_CC: + $add_cc = array(); + foreach ($effect->getTarget() as $phid) { + $add_cc[$phid] = true; + } + $this->setCcPHIDs(array_keys($add_cc)); + $result[] = new HeraldApplyTranscript( + $effect, + true, + pht('Added address to cc list.')); + break; + case self::ACTION_FLAG: + $result[] = parent::applyFlagEffect( + $effect, + $this->getTask()->getPHID()); + break; + default: + throw new Exception("No rules to handle action '{$action}'."); + } + } + return $result; + } +} diff --git a/src/applications/maniphest/editor/ManiphestTransactionEditorPro.php b/src/applications/maniphest/editor/ManiphestTransactionEditorPro.php index 377d693f08..65f9888991 100644 --- a/src/applications/maniphest/editor/ManiphestTransactionEditorPro.php +++ b/src/applications/maniphest/editor/ManiphestTransactionEditorPro.php @@ -189,4 +189,30 @@ final class ManiphestTransactionEditorPro return true; } + protected function supportsHerald() { + return true; + } + + protected function buildHeraldAdapter( + PhabricatorLiskDAO $object, + array $xactions) { + + return id(new HeraldManiphestTaskAdapter()) + ->setTask($object); + } + + protected function didApplyHeraldRules( + PhabricatorLiskDAO $object, + HeraldAdapter $adapter, + HeraldTranscript $transcript) { + + $cc_phids = $adapter->getCcPHIDs(); + if ($cc_phids) { + $existing_cc = $object->getCCPHIDs(); + $new_cc = array_unique(array_merge($cc_phids, $existing_cc)); + $object->setCCPHIDs($new_cc); + $object->save(); + } + } + }