Page MenuHomePhorge

No OneTemporary

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 @@
<?php
final class DeepcloneController extends ManiphestController
{
public function handleRequest(AphrontRequest $request)
{
$task_id = $request->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");
}
}

File Metadata

Mime Type
text/x-diff
Expires
Sun, Jan 19, 20:32 (1 w, 5 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1117870
Default Alt Text
(8 KB)

Event Timeline