Differential D14861 Diff 35938 src/applications/project/editor/PhabricatorProjectTransactionEditor.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/project/editor/PhabricatorProjectTransactionEditor.php
| Show All 20 Lines | public function getTransactionTypes() { | ||||
| $types[] = PhabricatorProjectTransaction::TYPE_NAME; | $types[] = PhabricatorProjectTransaction::TYPE_NAME; | ||||
| $types[] = PhabricatorProjectTransaction::TYPE_SLUGS; | $types[] = PhabricatorProjectTransaction::TYPE_SLUGS; | ||||
| $types[] = PhabricatorProjectTransaction::TYPE_STATUS; | $types[] = PhabricatorProjectTransaction::TYPE_STATUS; | ||||
| $types[] = PhabricatorProjectTransaction::TYPE_IMAGE; | $types[] = PhabricatorProjectTransaction::TYPE_IMAGE; | ||||
| $types[] = PhabricatorProjectTransaction::TYPE_ICON; | $types[] = PhabricatorProjectTransaction::TYPE_ICON; | ||||
| $types[] = PhabricatorProjectTransaction::TYPE_COLOR; | $types[] = PhabricatorProjectTransaction::TYPE_COLOR; | ||||
| $types[] = PhabricatorProjectTransaction::TYPE_LOCKED; | $types[] = PhabricatorProjectTransaction::TYPE_LOCKED; | ||||
| $types[] = PhabricatorProjectTransaction::TYPE_PARENT; | |||||
| return $types; | return $types; | ||||
| } | } | ||||
| protected function getCustomTransactionOldValue( | protected function getCustomTransactionOldValue( | ||||
| PhabricatorLiskDAO $object, | PhabricatorLiskDAO $object, | ||||
| PhabricatorApplicationTransaction $xaction) { | PhabricatorApplicationTransaction $xaction) { | ||||
| Show All 10 Lines | switch ($xaction->getTransactionType()) { | ||||
| case PhabricatorProjectTransaction::TYPE_IMAGE: | case PhabricatorProjectTransaction::TYPE_IMAGE: | ||||
| return $object->getProfileImagePHID(); | return $object->getProfileImagePHID(); | ||||
| case PhabricatorProjectTransaction::TYPE_ICON: | case PhabricatorProjectTransaction::TYPE_ICON: | ||||
| return $object->getIcon(); | return $object->getIcon(); | ||||
| case PhabricatorProjectTransaction::TYPE_COLOR: | case PhabricatorProjectTransaction::TYPE_COLOR: | ||||
| return $object->getColor(); | return $object->getColor(); | ||||
| case PhabricatorProjectTransaction::TYPE_LOCKED: | case PhabricatorProjectTransaction::TYPE_LOCKED: | ||||
| return (int)$object->getIsMembershipLocked(); | return (int)$object->getIsMembershipLocked(); | ||||
| case PhabricatorProjectTransaction::TYPE_PARENT: | |||||
| return null; | |||||
| } | } | ||||
| return parent::getCustomTransactionOldValue($object, $xaction); | return parent::getCustomTransactionOldValue($object, $xaction); | ||||
| } | } | ||||
| protected function getCustomTransactionNewValue( | protected function getCustomTransactionNewValue( | ||||
| PhabricatorLiskDAO $object, | PhabricatorLiskDAO $object, | ||||
| PhabricatorApplicationTransaction $xaction) { | PhabricatorApplicationTransaction $xaction) { | ||||
| switch ($xaction->getTransactionType()) { | switch ($xaction->getTransactionType()) { | ||||
| case PhabricatorProjectTransaction::TYPE_NAME: | case PhabricatorProjectTransaction::TYPE_NAME: | ||||
| case PhabricatorProjectTransaction::TYPE_SLUGS: | case PhabricatorProjectTransaction::TYPE_SLUGS: | ||||
| case PhabricatorProjectTransaction::TYPE_STATUS: | case PhabricatorProjectTransaction::TYPE_STATUS: | ||||
| case PhabricatorProjectTransaction::TYPE_IMAGE: | case PhabricatorProjectTransaction::TYPE_IMAGE: | ||||
| case PhabricatorProjectTransaction::TYPE_ICON: | case PhabricatorProjectTransaction::TYPE_ICON: | ||||
| case PhabricatorProjectTransaction::TYPE_COLOR: | case PhabricatorProjectTransaction::TYPE_COLOR: | ||||
| case PhabricatorProjectTransaction::TYPE_LOCKED: | case PhabricatorProjectTransaction::TYPE_LOCKED: | ||||
| case PhabricatorProjectTransaction::TYPE_PARENT: | |||||
| return $xaction->getNewValue(); | return $xaction->getNewValue(); | ||||
| } | } | ||||
| return parent::getCustomTransactionNewValue($object, $xaction); | return parent::getCustomTransactionNewValue($object, $xaction); | ||||
| } | } | ||||
| protected function applyCustomInternalTransaction( | protected function applyCustomInternalTransaction( | ||||
| PhabricatorLiskDAO $object, | PhabricatorLiskDAO $object, | ||||
| Show All 17 Lines | switch ($xaction->getTransactionType()) { | ||||
| $object->setIcon($xaction->getNewValue()); | $object->setIcon($xaction->getNewValue()); | ||||
| return; | return; | ||||
| case PhabricatorProjectTransaction::TYPE_COLOR: | case PhabricatorProjectTransaction::TYPE_COLOR: | ||||
| $object->setColor($xaction->getNewValue()); | $object->setColor($xaction->getNewValue()); | ||||
| return; | return; | ||||
| case PhabricatorProjectTransaction::TYPE_LOCKED: | case PhabricatorProjectTransaction::TYPE_LOCKED: | ||||
| $object->setIsMembershipLocked($xaction->getNewValue()); | $object->setIsMembershipLocked($xaction->getNewValue()); | ||||
| return; | return; | ||||
| case PhabricatorProjectTransaction::TYPE_PARENT: | |||||
| $object->setParentProjectPHID($xaction->getNewValue()); | |||||
| return; | |||||
| } | } | ||||
| return parent::applyCustomInternalTransaction($object, $xaction); | return parent::applyCustomInternalTransaction($object, $xaction); | ||||
| } | } | ||||
| protected function applyCustomExternalTransaction( | protected function applyCustomExternalTransaction( | ||||
| PhabricatorLiskDAO $object, | PhabricatorLiskDAO $object, | ||||
| PhabricatorApplicationTransaction $xaction) { | PhabricatorApplicationTransaction $xaction) { | ||||
| Show All 35 Lines | switch ($xaction->getTransactionType()) { | ||||
| } | } | ||||
| return; | return; | ||||
| case PhabricatorProjectTransaction::TYPE_STATUS: | case PhabricatorProjectTransaction::TYPE_STATUS: | ||||
| case PhabricatorProjectTransaction::TYPE_IMAGE: | case PhabricatorProjectTransaction::TYPE_IMAGE: | ||||
| case PhabricatorProjectTransaction::TYPE_ICON: | case PhabricatorProjectTransaction::TYPE_ICON: | ||||
| case PhabricatorProjectTransaction::TYPE_COLOR: | case PhabricatorProjectTransaction::TYPE_COLOR: | ||||
| case PhabricatorProjectTransaction::TYPE_LOCKED: | case PhabricatorProjectTransaction::TYPE_LOCKED: | ||||
| case PhabricatorProjectTransaction::TYPE_PARENT: | |||||
| return; | return; | ||||
| } | } | ||||
| return parent::applyCustomExternalTransaction($object, $xaction); | return parent::applyCustomExternalTransaction($object, $xaction); | ||||
| } | } | ||||
| protected function applyBuiltinExternalTransaction( | protected function applyBuiltinExternalTransaction( | ||||
| PhabricatorLiskDAO $object, | PhabricatorLiskDAO $object, | ||||
| ▲ Show 20 Lines • Show All 155 Lines • ▼ Show 20 Lines | switch ($type) { | ||||
| '%d project hashtag(s) are already used: %s.', | '%d project hashtag(s) are already used: %s.', | ||||
| count($used_slug_strs), | count($used_slug_strs), | ||||
| implode(', ', $used_slug_strs)), | implode(', ', $used_slug_strs)), | ||||
| $slug_xaction); | $slug_xaction); | ||||
| $errors[] = $error; | $errors[] = $error; | ||||
| } | } | ||||
| break; | break; | ||||
| case PhabricatorProjectTransaction::TYPE_PARENT: | |||||
| if (!$xactions) { | |||||
| break; | |||||
| } | |||||
| $xaction = last($xactions); | |||||
| if (!$this->getIsNewObject()) { | |||||
| $errors[] = new PhabricatorApplicationTransactionValidationError( | |||||
| $type, | |||||
| pht('Invalid'), | |||||
| pht( | |||||
| 'You can only set a parent project when creating a project '. | |||||
| 'for the first time.'), | |||||
| $xaction); | |||||
| break; | |||||
| } | |||||
| $parent_phid = $xaction->getNewValue(); | |||||
| $projects = id(new PhabricatorProjectQuery()) | |||||
| ->setViewer($this->requireActor()) | |||||
| ->withPHIDs(array($parent_phid)) | |||||
| ->requireCapabilities( | |||||
| array( | |||||
| PhabricatorPolicyCapability::CAN_VIEW, | |||||
| PhabricatorPolicyCapability::CAN_EDIT, | |||||
| )) | |||||
| ->execute(); | |||||
| if (!$projects) { | |||||
| $errors[] = new PhabricatorApplicationTransactionValidationError( | |||||
| $type, | |||||
| pht('Invalid'), | |||||
| pht( | |||||
| 'Parent project PHID ("%s") must be the PHID of a valid, '. | |||||
| 'visible project which you have permission to edit.', | |||||
| $parent_phid), | |||||
| $xaction); | |||||
| break; | |||||
| } | |||||
| $project = head($projects); | |||||
| if ($project->isMilestone()) { | |||||
| $errors[] = new PhabricatorApplicationTransactionValidationError( | |||||
| $type, | |||||
| pht('Invalid'), | |||||
| pht( | |||||
| 'Parent project PHID ("%s") must not be a milestone. '. | |||||
| 'Milestones may not have subprojects.', | |||||
| $parent_phid), | |||||
| $xaction); | |||||
| break; | |||||
| } | |||||
| $limit = PhabricatorProject::getProjectDepthLimit(); | |||||
| if ($project->getProjectDepth() >= ($limit - 1)) { | |||||
| $errors[] = new PhabricatorApplicationTransactionValidationError( | |||||
| $type, | |||||
| pht('Invalid'), | |||||
| pht( | |||||
| 'You can not create a subproject under this parent because '. | |||||
| 'it would nest projects too deeply. The maximum nesting '. | |||||
| 'depth of projects is %s.', | |||||
| new PhutilNumber($limit)), | |||||
| $xaction); | |||||
| break; | |||||
| } | |||||
| $object->attachParentProject($project); | |||||
| break; | |||||
| } | } | ||||
| return $errors; | return $errors; | ||||
| } | } | ||||
| protected function requireCapabilities( | protected function requireCapabilities( | ||||
| PhabricatorLiskDAO $object, | PhabricatorLiskDAO $object, | ||||
| ▲ Show 20 Lines • Show All 180 Lines • Show Last 20 Lines | |||||