-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Modularize "add projects" and "remove projects" Herald actions
Summary: Ref T8726. Convert these to be modular. Test Plan: - Created rules using these actions. - Upgraded them. - Verified they still work. {F659266} Reviewers: btrahan Reviewed By: btrahan Subscribers: joshuaspence, epriestley Maniphest Tasks: T8726 Differential Revision: https://secure.phabricator.com/D13705
- Loading branch information
epriestley
committed
Aug 3, 2015
1 parent
51fead1
commit 3782992
Showing
7 changed files
with
273 additions
and
58 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
UPDATE {$NAMESPACE}_herald.herald_actionrecord a | ||
JOIN {$NAMESPACE}_herald.herald_rule r | ||
ON a.ruleID = r.id | ||
SET a.action = 'projects.add' | ||
WHERE a.action = 'addprojects'; | ||
|
||
UPDATE {$NAMESPACE}_herald.herald_actionrecord a | ||
JOIN {$NAMESPACE}_herald.herald_rule r | ||
ON a.ruleID = r.id | ||
SET a.action = 'projects.remove' | ||
WHERE a.action = 'removeprojects'; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
28 changes: 28 additions & 0 deletions
28
src/applications/project/herald/PhabricatorProjectAddHeraldAction.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
<?php | ||
|
||
final class PhabricatorProjectAddHeraldAction | ||
extends PhabricatorProjectHeraldAction { | ||
|
||
const ACTIONCONST = 'projects.add'; | ||
|
||
public function getHeraldActionName() { | ||
return pht('Add projects'); | ||
} | ||
|
||
public function applyEffect($object, HeraldEffect $effect) { | ||
return $this->applyProjects($effect->getTarget(), $is_add = true); | ||
} | ||
|
||
public function getHeraldActionStandardType() { | ||
return self::STANDARD_PHID_LIST; | ||
} | ||
|
||
protected function getDatasource() { | ||
return new PhabricatorProjectDatasource(); | ||
} | ||
|
||
public function renderActionDescription($value) { | ||
return pht('Add projects: %s.', $this->renderHandleList($value)); | ||
} | ||
|
||
} |
180 changes: 180 additions & 0 deletions
180
src/applications/project/herald/PhabricatorProjectHeraldAction.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,180 @@ | ||
<?php | ||
|
||
abstract class PhabricatorProjectHeraldAction | ||
extends HeraldAction { | ||
|
||
const DO_NO_TARGETS = 'do.no-targets'; | ||
const DO_INVALID = 'do.invalid'; | ||
const DO_ALREADY_ASSOCIATED = 'do.already-associated'; | ||
const DO_ALREADY_UNASSOCIATED = 'do.already-unassociated'; | ||
const DO_ADD_PROJECTS = 'do.add-projects'; | ||
const DO_REMOVE_PROJECTS = 'do.remove-projects'; | ||
|
||
public function getActionGroupKey() { | ||
return HeraldSupportActionGroup::ACTIONGROUPKEY; | ||
} | ||
|
||
public function supportsObject($object) { | ||
return ($object instanceof PhabricatorProjectInterface); | ||
} | ||
|
||
public function supportsRuleType($rule_type) { | ||
return ($rule_type == HeraldRuleTypeConfig::RULE_TYPE_GLOBAL); | ||
} | ||
|
||
protected function applyProjects(array $phids, $is_add) { | ||
$phids = array_fuse($phids); | ||
$adapter = $this->getAdapter(); | ||
|
||
if (!$phids) { | ||
$this->logEffect(self::DO_NO_TARGETS); | ||
return; | ||
} | ||
|
||
$projects = id(new PhabricatorProjectQuery()) | ||
->setViewer(PhabricatorUser::getOmnipotentUser()) | ||
->withPHIDs($phids) | ||
->execute(); | ||
$projects = mpull($projects, null, 'getPHID'); | ||
|
||
$invalid = array(); | ||
foreach ($phids as $phid) { | ||
if (empty($projects[$phid])) { | ||
$invalid[] = $phid; | ||
unset($phids[$phid]); | ||
} | ||
} | ||
|
||
if ($invalid) { | ||
$this->logEffect(self::DO_INVALID, $invalid); | ||
} | ||
|
||
if (!$phids) { | ||
return; | ||
} | ||
|
||
$project_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST; | ||
|
||
$current = $adapter->loadEdgePHIDs($project_type); | ||
|
||
if ($is_add) { | ||
$already = array(); | ||
foreach ($phids as $phid) { | ||
if (isset($current[$phid])) { | ||
$already[$phid] = $phid; | ||
unset($phids[$phid]); | ||
} | ||
} | ||
|
||
if ($already) { | ||
$this->logEffect(self::DO_ALREADY_ASSOCIATED, $already); | ||
} | ||
} else { | ||
$already = array(); | ||
foreach ($phids as $phid) { | ||
if (empty($current[$phid])) { | ||
$already[$phid] = $phid; | ||
unset($phids[$phid]); | ||
} | ||
} | ||
|
||
if ($already) { | ||
$this->logEffect(self::DO_ALREADY_UNASSOCIATED, $already); | ||
} | ||
} | ||
|
||
if (!$phids) { | ||
return; | ||
} | ||
|
||
if ($is_add) { | ||
$kind = '+'; | ||
} else { | ||
$kind = '-'; | ||
} | ||
|
||
$xaction = $adapter->newTransaction() | ||
->setTransactionType(PhabricatorTransactions::TYPE_EDGE) | ||
->setMetadataValue('edge:type', $project_type) | ||
->setNewValue( | ||
array( | ||
$kind => $phids, | ||
)); | ||
|
||
$adapter->queueTransaction($xaction); | ||
|
||
if ($is_add) { | ||
$this->logEffect(self::DO_ADD_PROJECTS, $phids); | ||
} else { | ||
$this->logEffect(self::DO_REMOVE_PROJECTS, $phids); | ||
} | ||
} | ||
|
||
protected function getActionEffectMap() { | ||
return array( | ||
self::DO_NO_TARGETS => array( | ||
'icon' => 'fa-ban', | ||
'color' => 'grey', | ||
'name' => pht('No Targets'), | ||
), | ||
self::DO_INVALID => array( | ||
'icon' => 'fa-ban', | ||
'color' => 'red', | ||
'name' => pht('Invalid Targets'), | ||
), | ||
self::DO_ALREADY_ASSOCIATED => array( | ||
'icon' => 'fa-chevron-right', | ||
'color' => 'grey', | ||
'name' => pht('Already Associated'), | ||
), | ||
self::DO_ALREADY_UNASSOCIATED => array( | ||
'icon' => 'fa-chevron-right', | ||
'color' => 'grey', | ||
'name' => pht('Already Unassociated'), | ||
), | ||
self::DO_ADD_PROJECTS => array( | ||
'icon' => 'fa-briefcase', | ||
'color' => 'green', | ||
'name' => pht('Added Projects'), | ||
), | ||
self::DO_REMOVE_PROJECTS => array( | ||
'icon' => 'fa-minus-circle', | ||
'color' => 'green', | ||
'name' => pht('Removed Projects'), | ||
), | ||
); | ||
} | ||
|
||
public function renderActionEffectDescription($type, $data) { | ||
switch ($type) { | ||
case self::DO_NO_TARGETS: | ||
return pht('Rule lists no projects.'); | ||
case self::DO_INVALID: | ||
return pht( | ||
'Declined to act on %s invalid project(s): %s.', | ||
new PhutilNumber(count($data)), | ||
$this->renderHandleList($data)); | ||
case self::DO_ALREADY_ASSOCIATED: | ||
return pht( | ||
'%s project(s) are already associated: %s.', | ||
new PhutilNumber(count($data)), | ||
$this->renderHandleList($data)); | ||
case self::DO_ALREADY_UNASSOCIATED: | ||
return pht( | ||
'%s project(s) are not associated: %s.', | ||
new PhutilNumber(count($data)), | ||
$this->renderHandleList($data)); | ||
case self::DO_ADD_PROJECTS: | ||
return pht( | ||
'Added %s project(s): %s.', | ||
new PhutilNumber(count($data)), | ||
$this->renderHandleList($data)); | ||
case self::DO_REMOVE_PROJECTS: | ||
return pht( | ||
'Removed %s project(s): %s.', | ||
new PhutilNumber(count($data)), | ||
$this->renderHandleList($data)); | ||
} | ||
} | ||
|
||
} |
Oops, something went wrong.