diff --git a/resources/sql/autopatches/20150724.herald.2.sql b/resources/sql/autopatches/20150724.herald.2.sql new file mode 100644 --- /dev/null +++ b/resources/sql/autopatches/20150724.herald.2.sql @@ -0,0 +1,13 @@ +UPDATE {$NAMESPACE}_herald.herald_actionrecord a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'email.other' + WHERE r.ruleType != 'personal' + AND a.action = 'email'; + +UPDATE {$NAMESPACE}_herald.herald_actionrecord a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'email.self' + WHERE r.ruleType = 'personal' + AND a.action = 'email'; diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2235,6 +2235,9 @@ 'PhabricatorMetaMTADAO' => 'applications/metamta/storage/PhabricatorMetaMTADAO.php', 'PhabricatorMetaMTAEmailBodyParser' => 'applications/metamta/parser/PhabricatorMetaMTAEmailBodyParser.php', 'PhabricatorMetaMTAEmailBodyParserTestCase' => 'applications/metamta/parser/__tests__/PhabricatorMetaMTAEmailBodyParserTestCase.php', + 'PhabricatorMetaMTAEmailHeraldAction' => 'applications/metamta/herald/PhabricatorMetaMTAEmailHeraldAction.php', + 'PhabricatorMetaMTAEmailOthersHeraldAction' => 'applications/metamta/herald/PhabricatorMetaMTAEmailOthersHeraldAction.php', + 'PhabricatorMetaMTAEmailSelfHeraldAction' => 'applications/metamta/herald/PhabricatorMetaMTAEmailSelfHeraldAction.php', 'PhabricatorMetaMTAErrorMailAction' => 'applications/metamta/action/PhabricatorMetaMTAErrorMailAction.php', 'PhabricatorMetaMTAMail' => 'applications/metamta/storage/PhabricatorMetaMTAMail.php', 'PhabricatorMetaMTAMailBody' => 'applications/metamta/view/PhabricatorMetaMTAMailBody.php', @@ -6053,6 +6056,9 @@ 'PhabricatorMetaMTADAO' => 'PhabricatorLiskDAO', 'PhabricatorMetaMTAEmailBodyParser' => 'Phobject', 'PhabricatorMetaMTAEmailBodyParserTestCase' => 'PhabricatorTestCase', + 'PhabricatorMetaMTAEmailHeraldAction' => 'HeraldAction', + 'PhabricatorMetaMTAEmailOthersHeraldAction' => 'PhabricatorMetaMTAEmailHeraldAction', + 'PhabricatorMetaMTAEmailSelfHeraldAction' => 'PhabricatorMetaMTAEmailHeraldAction', 'PhabricatorMetaMTAErrorMailAction' => 'PhabricatorSystemAction', 'PhabricatorMetaMTAMail' => array( 'PhabricatorMetaMTADAO', diff --git a/src/applications/differential/herald/HeraldDifferentialRevisionAdapter.php b/src/applications/differential/herald/HeraldDifferentialRevisionAdapter.php --- a/src/applications/differential/herald/HeraldDifferentialRevisionAdapter.php +++ b/src/applications/differential/herald/HeraldDifferentialRevisionAdapter.php @@ -162,7 +162,6 @@ case HeraldRuleTypeConfig::RULE_TYPE_GLOBAL: return array_merge( array( - self::ACTION_EMAIL, self::ACTION_ADD_REVIEWERS, self::ACTION_ADD_BLOCKING_REVIEWERS, self::ACTION_APPLY_BUILD_PLANS, @@ -172,7 +171,6 @@ case HeraldRuleTypeConfig::RULE_TYPE_PERSONAL: return array_merge( array( - self::ACTION_EMAIL, self::ACTION_ADD_REVIEWERS, self::ACTION_ADD_BLOCKING_REVIEWERS, ), diff --git a/src/applications/diffusion/herald/HeraldCommitAdapter.php b/src/applications/diffusion/herald/HeraldCommitAdapter.php --- a/src/applications/diffusion/herald/HeraldCommitAdapter.php +++ b/src/applications/diffusion/herald/HeraldCommitAdapter.php @@ -89,7 +89,6 @@ case HeraldRuleTypeConfig::RULE_TYPE_OBJECT: return array_merge( array( - self::ACTION_EMAIL, self::ACTION_AUDIT, self::ACTION_APPLY_BUILD_PLANS, ), @@ -97,7 +96,6 @@ case HeraldRuleTypeConfig::RULE_TYPE_PERSONAL: return array_merge( array( - self::ACTION_EMAIL, self::ACTION_AUDIT, ), parent::getActions($rule_type)); diff --git a/src/applications/diffusion/herald/HeraldPreCommitAdapter.php b/src/applications/diffusion/herald/HeraldPreCommitAdapter.php --- a/src/applications/diffusion/herald/HeraldPreCommitAdapter.php +++ b/src/applications/diffusion/herald/HeraldPreCommitAdapter.php @@ -80,13 +80,11 @@ return array_merge( array( self::ACTION_BLOCK, - self::ACTION_EMAIL, ), parent::getActions($rule_type)); case HeraldRuleTypeConfig::RULE_TYPE_PERSONAL: return array_merge( array( - self::ACTION_EMAIL, ), parent::getActions($rule_type)); } diff --git a/src/applications/herald/adapter/HeraldAdapter.php b/src/applications/herald/adapter/HeraldAdapter.php --- a/src/applications/herald/adapter/HeraldAdapter.php +++ b/src/applications/herald/adapter/HeraldAdapter.php @@ -26,7 +26,6 @@ const CONDITION_IS_TRUE = 'true'; const CONDITION_IS_FALSE = 'false'; - const ACTION_EMAIL = 'email'; const ACTION_AUDIT = 'audit'; const ACTION_ASSIGN_TASK = 'assigntask'; const ACTION_ADD_PROJECTS = 'addprojects'; @@ -56,6 +55,14 @@ return array_values($this->forcedEmailPHIDs); } + public function addEmailPHID($phid, $force) { + $this->emailPHIDs[$phid] = $phid; + if ($force) { + $this->forcedEmailPHIDs[$phid] = $phid; + } + return $this; + } + public function getCustomActions() { if ($this->customActions === null) { $custom_actions = id(new PhutilSymbolLoader()) @@ -721,7 +728,6 @@ case HeraldRuleTypeConfig::RULE_TYPE_GLOBAL: case HeraldRuleTypeConfig::RULE_TYPE_OBJECT: $standard = array( - self::ACTION_EMAIL => pht('Send an email to'), self::ACTION_AUDIT => pht('Trigger an Audit by'), self::ACTION_ASSIGN_TASK => pht('Assign task to'), self::ACTION_ADD_PROJECTS => pht('Add projects'), @@ -735,7 +741,6 @@ break; case HeraldRuleTypeConfig::RULE_TYPE_PERSONAL: $standard = array( - self::ACTION_EMAIL => pht('Send me an email'), self::ACTION_AUDIT => pht('Trigger an Audit by me'), self::ACTION_ASSIGN_TASK => pht('Assign task to me'), self::ACTION_ADD_REVIEWERS => pht('Add me as a reviewer'), @@ -779,7 +784,6 @@ $rule_type = $rule->getRuleType(); if ($rule_type == HeraldRuleTypeConfig::RULE_TYPE_PERSONAL) { switch ($action->getAction()) { - case self::ACTION_EMAIL: case self::ACTION_AUDIT: case self::ACTION_ASSIGN_TASK: case self::ACTION_ADD_REVIEWERS: @@ -820,7 +824,6 @@ if ($is_personal) { switch ($action) { - case self::ACTION_EMAIL: case self::ACTION_AUDIT: case self::ACTION_ASSIGN_TASK: case self::ACTION_ADD_REVIEWERS: @@ -833,9 +836,6 @@ } } else { switch ($action) { - case self::ACTION_EMAIL: - return $this->buildTokenizerFieldValue( - new PhabricatorMetaMTAMailableDatasource()); case self::ACTION_ADD_PROJECTS: case self::ACTION_REMOVE_PROJECTS: return $this->buildTokenizerFieldValue( @@ -1204,8 +1204,6 @@ case self::ACTION_ADD_PROJECTS: case self::ACTION_REMOVE_PROJECTS: return $this->applyProjectsEffect($effect); - case self::ACTION_EMAIL: - return $this->applyEmailEffect($effect); default: break; } @@ -1253,29 +1251,6 @@ pht('Added projects.')); } - - /** - * @task apply - */ - private function applyEmailEffect(HeraldEffect $effect) { - foreach ($effect->getTarget() as $phid) { - $this->emailPHIDs[$phid] = $phid; - - // If this is a personal rule, we'll force delivery of a real email. This - // effect is stronger than notification preferences, so you get an actual - // email even if your preferences are set to "Notify" or "Ignore". - $rule = $effect->getRule(); - if ($rule->isPersonalRule()) { - $this->forcedEmailPHIDs[$phid] = $phid; - } - } - - return new HeraldApplyTranscript( - $effect, - true, - pht('Added mailable to mail targets.')); - } - public function loadEdgePHIDs($type) { if (!isset($this->edgeCache[$type])) { $phids = PhabricatorEdgeQuery::loadDestinationPHIDs( diff --git a/src/applications/maniphest/herald/HeraldManiphestTaskAdapter.php b/src/applications/maniphest/herald/HeraldManiphestTaskAdapter.php --- a/src/applications/maniphest/herald/HeraldManiphestTaskAdapter.php +++ b/src/applications/maniphest/herald/HeraldManiphestTaskAdapter.php @@ -72,14 +72,12 @@ case HeraldRuleTypeConfig::RULE_TYPE_GLOBAL: return array_merge( array( - self::ACTION_EMAIL, self::ACTION_ASSIGN_TASK, ), parent::getActions($rule_type)); case HeraldRuleTypeConfig::RULE_TYPE_PERSONAL: return array_merge( array( - self::ACTION_EMAIL, self::ACTION_ASSIGN_TASK, ), parent::getActions($rule_type)); diff --git a/src/applications/metamta/herald/PhabricatorMetaMTAEmailHeraldAction.php b/src/applications/metamta/herald/PhabricatorMetaMTAEmailHeraldAction.php new file mode 100644 --- /dev/null +++ b/src/applications/metamta/herald/PhabricatorMetaMTAEmailHeraldAction.php @@ -0,0 +1,69 @@ +getAdapter(); + + foreach ($phids as $phid) { + $adapter->addEmailPHID($phid, $force); + } + + if ($force) { + $this->logEffect(self::DO_FORCE, $phids); + } else { + $this->logEffect(self::DO_SEND, $phids); + } + } + + protected function getActionEffectMap() { + return array( + self::DO_SEND => array( + 'icon' => 'fa-envelope', + 'color' => 'green', + 'name' => pht('Sent Mail'), + ), + self::DO_FORCE => array( + 'icon' => 'fa-envelope', + 'color' => 'blue', + 'name' => pht('Forced Mail'), + ), + ); + } + + public function renderActionEffectDescription($type, $data) { + switch ($type) { + case self::DO_SEND: + return pht( + 'Queued email to be delivered to %s target(s): %s.', + new PhutilNumber(count($data)), + $this->renderHandleList($data)); + case self::DO_FORCE: + return pht( + 'Queued email to be delivered to %s target(s), ignoring their '. + 'notification preferences: %s.', + new PhutilNumber(count($data)), + $this->renderHandleList($data)); + } + } + +} diff --git a/src/applications/metamta/herald/PhabricatorMetaMTAEmailOthersHeraldAction.php b/src/applications/metamta/herald/PhabricatorMetaMTAEmailOthersHeraldAction.php new file mode 100644 --- /dev/null +++ b/src/applications/metamta/herald/PhabricatorMetaMTAEmailOthersHeraldAction.php @@ -0,0 +1,32 @@ +applyEmail($effect->getTarget(), $force = false); + } + + public function getHeraldActionStandardType() { + return self::STANDARD_PHID_LIST; + } + + protected function getDatasource() { + return new PhabricatorMetaMTAMailableDatasource(); + } + + public function renderActionDescription($value) { + return pht('Send an email to: %s.', $this->renderHandleList($value)); + } + +} diff --git a/src/applications/metamta/herald/PhabricatorMetaMTAEmailSelfHeraldAction.php b/src/applications/metamta/herald/PhabricatorMetaMTAEmailSelfHeraldAction.php new file mode 100644 --- /dev/null +++ b/src/applications/metamta/herald/PhabricatorMetaMTAEmailSelfHeraldAction.php @@ -0,0 +1,34 @@ +getRule()->getAuthorPHID(); + + // For personal rules, we'll force delivery of a real email. This effect + // is stronger than notification preferences, so you get an actual email + // even if your preferences are set to "Notify" or "Ignore". + + return $this->applyEmail(array($phid), $force = true); + } + + public function getHeraldActionStandardType() { + return self::STANDARD_NONE; + } + + public function renderActionDescription($value) { + return pht('Send an email to rule author.'); + } + +} diff --git a/src/applications/phriction/herald/PhrictionDocumentHeraldAdapter.php b/src/applications/phriction/herald/PhrictionDocumentHeraldAdapter.php --- a/src/applications/phriction/herald/PhrictionDocumentHeraldAdapter.php +++ b/src/applications/phriction/herald/PhrictionDocumentHeraldAdapter.php @@ -48,24 +48,6 @@ } } - public function getActions($rule_type) { - switch ($rule_type) { - case HeraldRuleTypeConfig::RULE_TYPE_GLOBAL: - return array_merge( - array( - self::ACTION_EMAIL, - ), - parent::getActions($rule_type)); - case HeraldRuleTypeConfig::RULE_TYPE_PERSONAL: - return array_merge( - array( - self::ACTION_EMAIL, - ), - parent::getActions($rule_type)); - } - } - - public function getHeraldName() { return pht('Wiki Document %d', $this->getDocument()->getID()); } diff --git a/src/applications/subscriptions/herald/PhabricatorSubscriptionsAddSelfHeraldAction.php b/src/applications/subscriptions/herald/PhabricatorSubscriptionsAddSelfHeraldAction.php --- a/src/applications/subscriptions/herald/PhabricatorSubscriptionsAddSelfHeraldAction.php +++ b/src/applications/subscriptions/herald/PhabricatorSubscriptionsAddSelfHeraldAction.php @@ -9,14 +9,6 @@ return pht('Add me as a subscriber'); } - public function getActionGroupKey() { - return HeraldSupportActionGroup::ACTIONGROUPKEY; - } - - public function supportsObject($object) { - return ($object instanceof PhabricatorSubscribableInterface); - } - public function supportsRuleType($rule_type) { return ($rule_type == HeraldRuleTypeConfig::RULE_TYPE_PERSONAL); } diff --git a/src/applications/subscriptions/herald/PhabricatorSubscriptionsAddSubscribersHeraldAction.php b/src/applications/subscriptions/herald/PhabricatorSubscriptionsAddSubscribersHeraldAction.php --- a/src/applications/subscriptions/herald/PhabricatorSubscriptionsAddSubscribersHeraldAction.php +++ b/src/applications/subscriptions/herald/PhabricatorSubscriptionsAddSubscribersHeraldAction.php @@ -9,14 +9,6 @@ return pht('Add subscribers'); } - public function getActionGroupKey() { - return HeraldSupportActionGroup::ACTIONGROUPKEY; - } - - public function supportsObject($object) { - return ($object instanceof PhabricatorSubscribableInterface); - } - public function supportsRuleType($rule_type) { return ($rule_type != HeraldRuleTypeConfig::RULE_TYPE_PERSONAL); } diff --git a/src/applications/subscriptions/herald/PhabricatorSubscriptionsHeraldAction.php b/src/applications/subscriptions/herald/PhabricatorSubscriptionsHeraldAction.php --- a/src/applications/subscriptions/herald/PhabricatorSubscriptionsHeraldAction.php +++ b/src/applications/subscriptions/herald/PhabricatorSubscriptionsHeraldAction.php @@ -12,6 +12,14 @@ const DO_SUBSCRIBED = 'do.subscribed'; const DO_UNSUBSCRIBED = 'do.unsubscribed'; + public function getActionGroupKey() { + return HeraldSupportActionGroup::ACTIONGROUPKEY; + } + + public function supportsObject($object) { + return ($object instanceof PhabricatorSubscribableInterface); + } + protected function applySubscribe(array $phids, $is_add) { $adapter = $this->getAdapter(); diff --git a/src/applications/subscriptions/herald/PhabricatorSubscriptionsRemoveSelfHeraldAction.php b/src/applications/subscriptions/herald/PhabricatorSubscriptionsRemoveSelfHeraldAction.php --- a/src/applications/subscriptions/herald/PhabricatorSubscriptionsRemoveSelfHeraldAction.php +++ b/src/applications/subscriptions/herald/PhabricatorSubscriptionsRemoveSelfHeraldAction.php @@ -9,14 +9,6 @@ return pht('Remove me as a subscriber'); } - public function getActionGroupKey() { - return HeraldSupportActionGroup::ACTIONGROUPKEY; - } - - public function supportsObject($object) { - return ($object instanceof PhabricatorSubscribableInterface); - } - public function supportsRuleType($rule_type) { return ($rule_type == HeraldRuleTypeConfig::RULE_TYPE_PERSONAL); } diff --git a/src/applications/subscriptions/herald/PhabricatorSubscriptionsRemoveSubscribersHeraldAction.php b/src/applications/subscriptions/herald/PhabricatorSubscriptionsRemoveSubscribersHeraldAction.php --- a/src/applications/subscriptions/herald/PhabricatorSubscriptionsRemoveSubscribersHeraldAction.php +++ b/src/applications/subscriptions/herald/PhabricatorSubscriptionsRemoveSubscribersHeraldAction.php @@ -9,14 +9,6 @@ return pht('Remove subscribers'); } - public function getActionGroupKey() { - return HeraldSupportActionGroup::ACTIONGROUPKEY; - } - - public function supportsObject($object) { - return ($object instanceof PhabricatorSubscribableInterface); - } - public function supportsRuleType($rule_type) { return ($rule_type != HeraldRuleTypeConfig::RULE_TYPE_PERSONAL); } diff --git a/src/infrastructure/internationalization/translation/PhabricatorUSEnglishTranslation.php b/src/infrastructure/internationalization/translation/PhabricatorUSEnglishTranslation.php --- a/src/infrastructure/internationalization/translation/PhabricatorUSEnglishTranslation.php +++ b/src/infrastructure/internationalization/translation/PhabricatorUSEnglishTranslation.php @@ -1215,6 +1215,20 @@ 'Removed a subscriber: %2$s.', 'Removed subscribers: %2$s.', ), + + 'Queued email to be delivered to %s target(s): %s.' => array( + 'Queued email to be delivered to target: %2$s.', + 'Queued email to be delivered to targets: %2$s.', + ), + + 'Queued email to be delivered to %s target(s), ignoring their '. + 'notification preferences: %s.' => array( + 'Queued email to be delivered to target, ignoring notification '. + 'preferences: %2$s.', + 'Queued email to be delivered to targets, ignoring notification '. + 'preferences: %2$s.', + ), + ); }