summaryrefslogtreecommitdiff
path: root/app/Model
diff options
context:
space:
mode:
Diffstat (limited to 'app/Model')
-rw-r--r--app/Model/Base.php1
-rw-r--r--app/Model/ProjectDuplication.php27
-rw-r--r--app/Model/Swimlane.php33
3 files changed, 57 insertions, 4 deletions
diff --git a/app/Model/Base.php b/app/Model/Base.php
index 785785a7..e29588a2 100644
--- a/app/Model/Base.php
+++ b/app/Model/Base.php
@@ -34,6 +34,7 @@ use Pimple\Container;
* @property \Model\Swimlane $swimlane
* @property \Model\Task $task
* @property \Model\TaskCreation $taskCreation
+ * @property \Model\TaskDuplication $taskDuplication
* @property \Model\TaskExport $taskExport
* @property \Model\TaskFinder $taskFinder
* @property \Model\TaskHistory $taskHistory
diff --git a/app/Model/ProjectDuplication.php b/app/Model/ProjectDuplication.php
index ef4558ba..b93cbee5 100644
--- a/app/Model/ProjectDuplication.php
+++ b/app/Model/ProjectDuplication.php
@@ -59,10 +59,11 @@ class ProjectDuplication extends Base
/**
* Clone a project with all settings
*
- * @param integer $project_id Project Id
+ * @param integer $project_id Project Id
+ * @param array $part_selection Selection of optional project parts to duplicate. Possible options: 'swimlane', 'action', 'category', 'task'
* @return integer Cloned Project Id
*/
- public function duplicate($project_id)
+ public function duplicate($project_id, $part_selection = array('category', 'action'))
{
$this->db->startTransaction();
@@ -74,7 +75,14 @@ class ProjectDuplication extends Base
return false;
}
- foreach (array('board', 'category', 'projectPermission', 'action') as $model) {
+ // Clone Columns, Categories, Permissions and Actions
+ $optional_parts = array('swimlane', 'action', 'category');
+ foreach (array('board', 'category', 'projectPermission', 'action', 'swimlane') as $model) {
+
+ // Skip if optional part has not been selected
+ if (in_array($model, $optional_parts) && ! in_array($model, $part_selection)) {
+ continue;
+ }
if (! $this->$model->duplicate($project_id, $clone_project_id)) {
$this->db->cancelTransaction();
@@ -82,8 +90,21 @@ class ProjectDuplication extends Base
}
}
+
$this->db->closeTransaction();
+ //* Clone Tasks if in $part_selection
+
+ if(in_array('task', $part_selection)) {
+ $tasks = $this->taskFinder->getAll($project_id);
+
+ foreach ($tasks as $task) {
+ if (!$this->taskDuplication->duplicateToProject($task['id'], $clone_project_id)) {
+ return false;
+ }
+ }
+ }
+
return (int) $clone_project_id;
}
}
diff --git a/app/Model/Swimlane.php b/app/Model/Swimlane.php
index 71b95ae9..c9bc43e1 100644
--- a/app/Model/Swimlane.php
+++ b/app/Model/Swimlane.php
@@ -183,7 +183,7 @@ class Swimlane extends Base
* @access public
* @param integer $project_id
* @param string $name
- * @return bool
+ * @return integer|boolean
*/
public function create($project_id, $name)
{
@@ -413,6 +413,37 @@ class Swimlane extends Base
}
/**
+ * Duplicate Swimlane to project
+ *
+ * @access public
+ * @param integer $project_from Project Template
+ * @param integer $project_to Project that receives the copy
+ * @return integer|boolean
+ */
+
+ public function duplicate($project_from, $project_to)
+ {
+ $swimlanes = $this->getAll($project_from);
+
+ foreach ($swimlanes as $swimlane) {
+
+ unset($swimlane['id']);
+ $swimlane['project_id'] = $project_to;
+
+ if (! $this->db->table(self::TABLE)->save($swimlane)) {
+ return false;
+ }
+ }
+
+ $default_swimlane = $this->getDefault($project_from);
+ $default_swimlane['id'] = $project_to;
+
+ $this->updateDefault($default_swimlane);
+
+ return true;
+ }
+
+ /**
* Validate creation
*
* @access public