diff --git a/src/deepclone/controller/DeepcloneController.php b/src/deepclone/controller/DeepcloneController.php index 2dc5555..cfa0aa6 100644 --- a/src/deepclone/controller/DeepcloneController.php +++ b/src/deepclone/controller/DeepcloneController.php @@ -1,189 +1,246 @@ getURIData('id'); $viewer = $this->getViewer(); if (!$task_id) { throw new Exception("Task ID: $task_id"); return new Aphront404Response(); } - $task = id(new ManiphestTaskQuery()) + $query = new ManiphestTaskQuery(); + $task = $query ->setViewer($viewer) ->withPHIDs(array($task_id)) + ->withOpenSubtasks(true) ->requireCapabilities( array( PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT, ) ) ->needSubscriberPHIDs(true) ->executeOne(); if (!$task) { throw new Exception("Task ID: $task_id"); return new Aphront404Response(); } + $transactions = id(new ManiphestTransactionQuery()) + ->setViewer($request->getUser()) + ->withObjectPHIDs(mpull([$task], 'getPHID')) + ->needComments(true) + ->execute(); + if ($request->isFormPost()) { - return $this->triggerTransaction($request, $task); + return $this->triggerTransaction($request, $task, $transactions); // $properties = $provider->readFormValuesFromRequest($request); // list($errors, $issues, $properties) = $provider->processEditForm( // $request, // $properties); // $xactions = array(); // if (!$errors) { // if ($is_new) { // if (!phutil_nonempty_string($config->getProviderType())) { // $config->setProviderType($provider->getProviderType()); // } // if (!phutil_nonempty_string($config->getProviderDomain())) { // $config->setProviderDomain($provider->getProviderDomain()); // } // } // $xactions[] = id(new PhabricatorAuthProviderConfigTransaction()) // ->setTransactionType( // PhabricatorAuthProviderConfigTransaction::TYPE_LOGIN) // ->setNewValue($request->getInt('allowLogin', 0)); // $xactions[] = id(new PhabricatorAuthProviderConfigTransaction()) // ->setTransactionType( // PhabricatorAuthProviderConfigTransaction::TYPE_REGISTRATION) // ->setNewValue($request->getInt('allowRegistration', 0)); // $xactions[] = id(new PhabricatorAuthProviderConfigTransaction()) // ->setTransactionType( // PhabricatorAuthProviderConfigTransaction::TYPE_LINK) // ->setNewValue($request->getInt('allowLink', 0)); // $xactions[] = id(new PhabricatorAuthProviderConfigTransaction()) // ->setTransactionType( // PhabricatorAuthProviderConfigTransaction::TYPE_UNLINK) // ->setNewValue($request->getInt('allowUnlink', 0)); // $xactions[] = id(new PhabricatorAuthProviderConfigTransaction()) // ->setTransactionType( // PhabricatorAuthProviderConfigTransaction::TYPE_TRUST_EMAILS) // ->setNewValue($request->getInt('trustEmails', 0)); // if ($provider->supportsAutoLogin()) { // $xactions[] = id(new PhabricatorAuthProviderConfigTransaction()) // ->setTransactionType( // PhabricatorAuthProviderConfigTransaction::TYPE_AUTO_LOGIN) // ->setNewValue($request->getInt('autoLogin', 0)); // } // foreach ($properties as $key => $value) { // $xactions[] = id(new PhabricatorAuthProviderConfigTransaction()) // ->setTransactionType( // PhabricatorAuthProviderConfigTransaction::TYPE_PROPERTY) // ->setMetadataValue('auth:property', $key) // ->setNewValue($value); // } // if ($is_new) { // $config->save(); // } // $editor = id(new PhabricatorAuthProviderConfigEditor()) // ->setActor($viewer) // ->setContentSourceFromRequest($request) // ->setContinueOnNoEffect(true); // try { // $editor->applyTransactions($config, $xactions); // $next_uri = $config->getURI(); // return id(new AphrontRedirectResponse())->setURI($next_uri); // } catch (Exception $ex) { // $validation_exception = $ex; // } // } } else { return $this->buildForm($task); } } private function buildForm(ManiphestTask $task) { $form = id(new AphrontFormView()) ->setUser($this->getViewer()) ->appendChild( id(new AphrontFormCheckboxControl()) ->setLabel(pht('Copy Comments')) ->addCheckbox( 'copy_comments', 1, pht('Copy all the comments of the task/s to the new task/s'), ) ) ->appendChild( id(new AphrontFormCheckboxControl()) ->setLabel('Deep Clone Task') ->addCheckbox( 'deep_clone', 1, 'Create a clone of all the sub tasks of this task', ) ); $handle = $this->getHandle($task); $cancel_uri = "/{$handle->getName()}"; $form ->appendChild( id(new AphrontFormSubmitControl()) ->addCancelButton($cancel_uri) ->setValue(pht('Clone')) ); $form_box = id(new PHUIObjectBoxView()) ->setHeaderText($this->generateTitle($task)) // ->setFormErrors($errors) // ->setValidationException($validation_exception) ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) ->setForm($form); $view = id(new PHUITwoColumnView()) ->setFooter(array( $form_box, )); return $this->newPage() ->setTitle($this->generateTitle($task)) ->appendChild($view); } private function generateTitle(ManiphestTask $task) { $handle = $this->getHandle($task); return pht('Deep clone task "%s" (%s)', $task->getTitle(), $handle->getName()); } private function getHandle(ManiphestTask $task) { $viewer = $this->getViewer(); $handles = $viewer->loadHandles(array($task->getPHID())); $handle = $handles[$task->getPHID()]; return $handle; } - private function triggerTransaction(AphrontRequest $request, ManiphestTask $task) { + private function triggerTransaction(AphrontRequest $request, ManiphestTask $task, array $transactions) { $deepCloneRaw = $request->getStr('deep_clone'); $deepClone = $deepCloneRaw === '1'; $copyCommentsRaw = $request->getStr('copy_comments'); $copyComments = $copyCommentsRaw === '1'; + $taskClone = new ManiphestTask(); + + $taskClone->setTitle($task->getTitle()); + $taskClone->setDescription($task->getDescription()); + $taskClone->setAuthorPHID($task->getAuthorPHID()); + $taskClone->setOwnerPHID($task->getOwnerPHID()); + $taskClone->setStatus($task->getStatus()); + $taskClone->setPriority($task->getPriority()); + $taskClone->setSubtype($task->getSubtype()); + $taskClone->setViewPolicy($task->getViewPolicy()); + $taskClone->setEditPolicy($task->getEditPolicy()); + + $taskClone->save(); + + foreach($transactions as &$transaction) { + if ($transaction->getTransactionType() === 'description') { + continue; + } + + if (($transaction->getTransactionType() === 'core:comment') && $copyComments === false) { + continue; + } + + if (($transaction->getTransactionType() === 'core:subscribers')) { + continue; + } + + if (($transaction->getTransactionType() === "core:edit-policy")) { + continue; + } + + if (($transaction->getTransactionType() === "core:view-policy")) { + continue; + } + + if (($transaction->getTransactionType() === "title")) { + continue; + } + + $transactionClone = new ManiphestTransaction(); + $transactionClone->setViewPolicy($transactionClone->getViewPolicy()); + $transactionClone->setEditPolicy($transactionClone->getEditPolicy()); + $transactionClone->setTransactionType($transactionClone->getTransactionType()); + $transactionClone->setObjectPHID($task->getPHID()); + + $transactionClone->save(); + } + + throw new Exception("Deep Clone $deepClone $deepCloneRaw Copy Comments $copyComments $copyCommentsRaw"); } }