[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/differential/customfield/ -> DifferentialReviewersField.php (source)

   1  <?php
   2  
   3  final class DifferentialReviewersField
   4    extends DifferentialCoreCustomField {
   5  
   6    public function getFieldKey() {
   7      return 'differential:reviewers';
   8    }
   9  
  10    public function getFieldKeyForConduit() {
  11      return 'reviewerPHIDs';
  12    }
  13  
  14    public function getFieldName() {
  15      return pht('Reviewers');
  16    }
  17  
  18    public function getFieldDescription() {
  19      return pht('Manage reviewers.');
  20    }
  21  
  22    protected function readValueFromRevision(
  23      DifferentialRevision $revision) {
  24      return $revision->getReviewerStatus();
  25    }
  26  
  27    public function getNewValueForApplicationTransactions() {
  28      $specs = array();
  29      foreach ($this->getValue() as $reviewer) {
  30        $specs[$reviewer->getReviewerPHID()] = array(
  31          'data' => $reviewer->getEdgeData(),
  32        );
  33      }
  34  
  35      return array('=' => $specs);
  36    }
  37  
  38    public function readValueFromRequest(AphrontRequest $request) {
  39      // Compute a new set of reviewer objects. For reviewers who haven't been
  40      // added or removed, retain their existing status. Also, respect the new
  41      // order.
  42  
  43      $old_status = $this->getValue();
  44      $old_status = mpull($old_status, null, 'getReviewerPHID');
  45  
  46      $new_phids = $request->getArr($this->getFieldKey());
  47      $new_phids = array_fuse($new_phids);
  48  
  49      $new_status = array();
  50      foreach ($new_phids as $new_phid) {
  51        if (empty($old_status[$new_phid])) {
  52          $new_status[$new_phid] = new DifferentialReviewer(
  53            $new_phid,
  54            array(
  55              'status' => DifferentialReviewerStatus::STATUS_ADDED,
  56            ));
  57        } else {
  58          $new_status[$new_phid] = $old_status[$new_phid];
  59        }
  60      }
  61  
  62      $this->setValue($new_status);
  63    }
  64  
  65    public function getRequiredHandlePHIDsForEdit() {
  66      $phids = array();
  67      if ($this->getValue()) {
  68        $phids = mpull($this->getValue(), 'getReviewerPHID');
  69      }
  70      return $phids;
  71    }
  72  
  73    public function renderEditControl(array $handles) {
  74      return id(new AphrontFormTokenizerControl())
  75        ->setName($this->getFieldKey())
  76        ->setDatasource(new PhabricatorProjectOrUserDatasource())
  77        ->setValue($handles)
  78        ->setError($this->getFieldError())
  79        ->setLabel($this->getFieldName());
  80    }
  81  
  82    public function getApplicationTransactionType() {
  83      return PhabricatorTransactions::TYPE_EDGE;
  84    }
  85  
  86    public function getApplicationTransactionMetadata() {
  87      return array(
  88        'edge:type' => PhabricatorEdgeConfig::TYPE_DREV_HAS_REVIEWER,
  89      );
  90    }
  91  
  92    public function shouldAppearInPropertyView() {
  93      return true;
  94    }
  95  
  96    public function renderPropertyViewLabel() {
  97      return $this->getFieldName();
  98    }
  99  
 100    public function getRequiredHandlePHIDsForPropertyView() {
 101      return mpull($this->getUserReviewers(), 'getReviewerPHID');
 102    }
 103  
 104    public function renderPropertyViewValue(array $handles) {
 105      $reviewers = $this->getUserReviewers();
 106      if (!$reviewers) {
 107        return phutil_tag('em', array(), pht('None'));
 108      }
 109  
 110      $view = id(new DifferentialReviewersView())
 111        ->setUser($this->getViewer())
 112        ->setReviewers($reviewers)
 113        ->setHandles($handles);
 114  
 115      // TODO: Active diff stuff.
 116  
 117      return $view;
 118    }
 119  
 120    private function getUserReviewers() {
 121      $reviewers = array();
 122      foreach ($this->getObject()->getReviewerStatus() as $reviewer) {
 123        if ($reviewer->isUser()) {
 124          $reviewers[] = $reviewer;
 125        }
 126      }
 127      return $reviewers;
 128    }
 129  
 130    public function shouldAppearInCommitMessage() {
 131      return true;
 132    }
 133  
 134    public function shouldAppearInCommitMessageTemplate() {
 135      return true;
 136    }
 137  
 138    public function getCommitMessageLabels() {
 139      return array(
 140        'Reviewer',
 141        'Reviewers',
 142      );
 143    }
 144  
 145    public function parseValueFromCommitMessage($value) {
 146      return $this->parseObjectList(
 147        $value,
 148        array(
 149          PhabricatorPeopleUserPHIDType::TYPECONST,
 150          PhabricatorProjectProjectPHIDType::TYPECONST,
 151        ));
 152    }
 153  
 154    public function getRequiredHandlePHIDsForCommitMessage() {
 155      return mpull($this->getValue(), 'getReviewerPHID');
 156    }
 157  
 158    public function readValueFromCommitMessage($value) {
 159      $current_reviewers = $this->getObject()->getReviewerStatus();
 160      $current_reviewers = mpull($current_reviewers, null, 'getReviewerPHID');
 161  
 162      $reviewers = array();
 163      foreach ($value as $phid) {
 164        $reviewer = idx($current_reviewers, $phid);
 165        if ($reviewer) {
 166          $reviewers[] = $reviewer;
 167        } else {
 168          $data = array(
 169            'status' => DifferentialReviewerStatus::STATUS_ADDED,
 170          );
 171          $reviewers[] = new DifferentialReviewer($phid, $data);
 172        }
 173      }
 174  
 175      $this->setValue($reviewers);
 176  
 177      return $this;
 178    }
 179  
 180    public function renderCommitMessageValue(array $handles) {
 181      return $this->renderObjectList($handles);
 182    }
 183  
 184    public function validateCommitMessageValue($value) {
 185      $author_phid = $this->getObject()->getAuthorPHID();
 186  
 187      $config_self_accept_key = 'differential.allow-self-accept';
 188      $allow_self_accept = PhabricatorEnv::getEnvConfig($config_self_accept_key);
 189  
 190      foreach ($value as $phid) {
 191        if (($phid == $author_phid) && !$allow_self_accept) {
 192          throw new DifferentialFieldValidationException(
 193            pht('The author of a revision can not be a reviewer.'));
 194        }
 195      }
 196    }
 197  
 198    public function getRequiredHandlePHIDsForRevisionHeaderWarnings() {
 199      return mpull($this->getValue(), 'getReviewerPHID');
 200    }
 201  
 202    public function getWarningsForRevisionHeader(array $handles) {
 203      $revision = $this->getObject();
 204  
 205      $status_needs_review = ArcanistDifferentialRevisionStatus::NEEDS_REVIEW;
 206      if ($revision->getStatus() != $status_needs_review) {
 207        return array();
 208      }
 209  
 210      foreach ($this->getValue() as $reviewer) {
 211        if (!$handles[$reviewer->getReviewerPHID()]->isDisabled()) {
 212          return array();
 213        }
 214      }
 215  
 216      $warnings = array();
 217      if ($this->getValue()) {
 218        $warnings[] = pht(
 219          'This revision needs review, but all specified reviewers are '.
 220          'disabled or inactive.');
 221      } else {
 222        $warnings[] = pht(
 223          'This revision needs review, but there are no reviewers specified.');
 224      }
 225  
 226      return $warnings;
 227    }
 228  
 229  }


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1