mirror of
https://we.phorge.it/source/phorge.git
synced 2025-02-25 13:09:08 +01:00
Summary: Ref T13151. See PHI702. An install is interested in a "members of all projects" (vs "members of any project", which is currently implemented) rule. Although this is fairly niche, I think it's reasonable and doesn't have much of a maintenance cost. This could already be implemented as an extension, but it would have to copy/paste a bunch of code. Test Plan: - Ran unit tests. - Used the UI to select this policy for a task, with various values. Joined/left projects to satisfy/fail the rule. Behavior seemed correct. - Used the UI to select the existing policy rule ("any project"), joined/left projects to satisfy/fail the rule. Doesn't look like I broke anything. Reviewers: amckinley Reviewed By: amckinley Maniphest Tasks: T13151 Differential Revision: https://secure.phabricator.com/D19486
64 lines
1.5 KiB
PHP
64 lines
1.5 KiB
PHP
<?php
|
|
|
|
abstract class PhabricatorProjectsBasePolicyRule
|
|
extends PhabricatorPolicyRule {
|
|
|
|
private $memberships = array();
|
|
|
|
protected function getMemberships($viewer_phid) {
|
|
return idx($this->memberships, $viewer_phid, array());
|
|
}
|
|
|
|
public function willApplyRules(
|
|
PhabricatorUser $viewer,
|
|
array $values,
|
|
array $objects) {
|
|
|
|
$values = array_unique(array_filter(array_mergev($values)));
|
|
if (!$values) {
|
|
return;
|
|
}
|
|
|
|
$projects = id(new PhabricatorProjectQuery())
|
|
->setViewer(PhabricatorUser::getOmnipotentUser())
|
|
->withMemberPHIDs(array($viewer->getPHID()))
|
|
->withPHIDs($values)
|
|
->execute();
|
|
foreach ($projects as $project) {
|
|
$this->memberships[$viewer->getPHID()][$project->getPHID()] = true;
|
|
}
|
|
}
|
|
|
|
public function getValueControlType() {
|
|
return self::CONTROL_TYPE_TOKENIZER;
|
|
}
|
|
|
|
public function getValueControlTemplate() {
|
|
$datasource = id(new PhabricatorProjectDatasource())
|
|
->setParameters(
|
|
array(
|
|
'policy' => 1,
|
|
));
|
|
|
|
return $this->getDatasourceTemplate($datasource);
|
|
}
|
|
|
|
public function getValueForStorage($value) {
|
|
PhutilTypeSpec::newFromString('list<string>')->check($value);
|
|
return array_values($value);
|
|
}
|
|
|
|
public function getValueForDisplay(PhabricatorUser $viewer, $value) {
|
|
$handles = id(new PhabricatorHandleQuery())
|
|
->setViewer($viewer)
|
|
->withPHIDs($value)
|
|
->execute();
|
|
|
|
return mpull($handles, 'getFullName', 'getPHID');
|
|
}
|
|
|
|
public function ruleHasEffect($value) {
|
|
return (bool)$value;
|
|
}
|
|
|
|
}
|