summaryrefslogtreecommitdiff
path: root/models
diff options
context:
space:
mode:
authorFrédéric Guillot <fguillot@users.noreply.github.com>2014-03-19 21:49:39 -0400
committerFrédéric Guillot <fguillot@users.noreply.github.com>2014-03-19 21:49:39 -0400
commitab63ffafc565e75c73c27910abd465bebb09306e (patch)
tree795e09656cfaf3a2042b714dcc3850c9555dec72 /models
parent41dd9b2eff07434a3393b20dcd875e76ac3846b3 (diff)
Task duplication
Diffstat (limited to 'models')
-rw-r--r--models/acl.php2
-rw-r--r--models/board.php5
-rw-r--r--models/task.php214
3 files changed, 212 insertions, 9 deletions
diff --git a/models/acl.php b/models/acl.php
index 25386254..fe23bbb4 100644
--- a/models/acl.php
+++ b/models/acl.php
@@ -18,7 +18,7 @@ class Acl extends Base
'app' => array('index'),
'board' => array('index', 'show', 'assign', 'assigntask', 'save'),
'project' => array('tasks', 'index', 'forbidden'),
- 'task' => array('show', 'create', 'save', 'edit', 'update', 'close', 'confirmclose', 'open', 'confirmopen', 'comment', 'description'),
+ 'task' => array('show', 'create', 'save', 'edit', 'update', 'close', 'confirmclose', 'open', 'confirmopen', 'comment', 'description', 'duplicate'),
'user' => array('index', 'edit', 'update', 'forbidden', 'logout', 'index'),
'config' => array('index'),
);
diff --git a/models/board.php b/models/board.php
index ae306508..723ffd85 100644
--- a/models/board.php
+++ b/models/board.php
@@ -16,6 +16,11 @@ use \SimpleValidator\Validators;
*/
class Board extends Base
{
+ /**
+ * SQL table name
+ *
+ * @var string
+ */
const TABLE = 'columns';
/**
diff --git a/models/task.php b/models/task.php
index fe0f6350..cbe37feb 100644
--- a/models/task.php
+++ b/models/task.php
@@ -8,9 +8,34 @@ require_once __DIR__.'/comment.php';
use \SimpleValidator\Validator;
use \SimpleValidator\Validators;
+/**
+ * Task model
+ *
+ * @package model
+ * @author Frederic Guillot
+ */
class Task extends Base
{
+ /**
+ * SQL table name
+ *
+ * @var string
+ */
const TABLE = 'tasks';
+
+ /**
+ * Task status
+ *
+ * @var integer
+ */
+ const STATUS_OPEN = 1;
+ const STATUS_CLOSED = 0;
+
+ /**
+ * Events
+ *
+ * @var string
+ */
const EVENT_MOVE_COLUMN = 'task.move.column';
const EVENT_MOVE_POSITION = 'task.move.position';
const EVENT_UPDATE = 'task.update';
@@ -18,6 +43,12 @@ class Task extends Base
const EVENT_CLOSE = 'task.close';
const EVENT_OPEN = 'task.open';
+ /**
+ * Get available colors
+ *
+ * @access public
+ * @return array
+ */
public function getColors()
{
return array(
@@ -31,6 +62,14 @@ class Task extends Base
);
}
+ /**
+ * Fetch one task
+ *
+ * @access public
+ * @param integer $task_id Task id
+ * @param boolean $more If true, fetch all related information
+ * @return array
+ */
public function getById($task_id, $more = false)
{
if ($more) {
@@ -67,7 +106,15 @@ class Task extends Base
}
}
- public function getAllByProjectId($project_id, array $status = array(1, 0))
+ /**
+ * Get all tasks for a given project
+ *
+ * @access public
+ * @param integer $project_id Project id
+ * @param array $status List of status id
+ * @return array
+ */
+ public function getAllByProjectId($project_id, array $status = array(self::STATUS_OPEN, self::STATUS_CLOSED))
{
return $this->db->table(self::TABLE)
->columns(
@@ -95,7 +142,15 @@ class Task extends Base
->findAll();
}
- public function countByProjectId($project_id, $status = array(1, 0))
+ /**
+ * Count all tasks for a given project and status
+ *
+ * @access public
+ * @param integer $project_id Project id
+ * @param array $status List of status id
+ * @return integer
+ */
+ public function countByProjectId($project_id, array $status = array(self::STATUS_OPEN, self::STATUS_CLOSED))
{
return $this->db
->table(self::TABLE)
@@ -104,7 +159,16 @@ class Task extends Base
->count();
}
- public function getAllByColumnId($project_id, $column_id, $status = array(1))
+ /**
+ * Get all tasks for a given column
+ *
+ * @access public
+ * @param integer $project_id Project id
+ * @param integer $column_id Column id
+ * @param array $status List of status id
+ * @return array
+ */
+ public function getAllByColumnId($project_id, $column_id, array $status = array(self::STATUS_OPEN))
{
$tasks = $this->db
->table(self::TABLE)
@@ -125,7 +189,16 @@ class Task extends Base
return $tasks;
}
- public function countByColumnId($project_id, $column_id, $status = array(1))
+ /**
+ * Count the number of tasks for a given column and status
+ *
+ * @access public
+ * @param integer $project_id Project id
+ * @param integer $column_id Column id
+ * @param array $status List of status id
+ * @return integer
+ */
+ public function countByColumnId($project_id, $column_id, array $status = array(self::STATUS_OPEN))
{
return $this->db
->table(self::TABLE)
@@ -135,6 +208,55 @@ class Task extends Base
->count();
}
+ /**
+ * Duplicate a task
+ *
+ * @access public
+ * @param integer $task_id Task id
+ * @return boolean
+ */
+ public function duplicate($task_id)
+ {
+ $this->db->startTransaction();
+
+ $boardModel = new Board($this->db, $this->event);
+
+ // Get the original task
+ $task = $this->getById($task_id);
+
+ // Cleanup data
+ unset($task['id']);
+ unset($task['date_completed']);
+
+ // Assign new values
+ $task['date_creation'] = time();
+ $task['is_active'] = 1;
+ $task['position'] = $this->countByColumnId($task['project_id'], $task['column_id']);
+
+ // Save task
+ if (! $this->db->table(self::TABLE)->save($task)) {
+ $this->db->cancelTransaction();
+ return false;
+ }
+
+ $task_id = $this->db->getConnection()->getLastId();
+
+ $this->db->closeTransaction();
+
+ // Trigger events
+ $this->event->trigger(self::EVENT_CREATE, array('task_id' => $task_id) + $task);
+
+ return $task_id;
+ }
+
+ /**
+ * Duplicate a task to another project (always copy to the first column)
+ *
+ * @access public
+ * @param integer $task_id Task id
+ * @param integer $project_id Destination project id
+ * @return boolean
+ */
public function duplicateToAnotherProject($task_id, $project_id)
{
$this->db->startTransaction();
@@ -172,6 +294,13 @@ class Task extends Base
return $task_id;
}
+ /**
+ * Create a task
+ *
+ * @access public
+ * @param array $values Form values
+ * @return boolean
+ */
public function create(array $values)
{
$this->db->startTransaction();
@@ -204,6 +333,13 @@ class Task extends Base
return $task_id;
}
+ /**
+ * Update a task
+ *
+ * @access public
+ * @param array $values Form values
+ * @return boolean
+ */
public function update(array $values)
{
// Prepare data
@@ -241,7 +377,13 @@ class Task extends Base
return $result;
}
- // Mark a task closed
+ /**
+ * Mark a task closed
+ *
+ * @access public
+ * @param integer $task_id Task id
+ * @return boolean
+ */
public function close($task_id)
{
$result = $this->db
@@ -259,7 +401,13 @@ class Task extends Base
return $result;
}
- // Mark a task open
+ /**
+ * Mark a task open
+ *
+ * @access public
+ * @param integer $task_id Task id
+ * @return boolean
+ */
public function open($task_id)
{
$result = $this->db
@@ -277,13 +425,27 @@ class Task extends Base
return $result;
}
- // Remove a task
+ /**
+ * Remove a task
+ *
+ * @access public
+ * @param integer $task_id Task id
+ * @return boolean
+ */
public function remove($task_id)
{
return $this->db->table(self::TABLE)->eq('id', $task_id)->remove();
}
- // Move a task to another column or to another position
+ /**
+ * Move a task to another column or to another position
+ *
+ * @access public
+ * @param integer $task_id Task id
+ * @param integer $column_id Column id
+ * @param integer $position Position (must be greater than 1)
+ * @return boolean
+ */
public function move($task_id, $column_id, $position)
{
return $this->update(array(
@@ -293,6 +455,13 @@ class Task extends Base
));
}
+ /**
+ * Validate task creation
+ *
+ * @access public
+ * @param array $values Form values
+ * @return array $valid, $errors [0] = Success or not, [1] = List of errors
+ */
public function validateCreation(array $values)
{
$v = new Validator($values, array(
@@ -314,6 +483,13 @@ class Task extends Base
);
}
+ /**
+ * Validate description creation
+ *
+ * @access public
+ * @param array $values Form values
+ * @return array $valid, $errors [0] = Success or not, [1] = List of errors
+ */
public function validateDescriptionCreation(array $values)
{
$v = new Validator($values, array(
@@ -328,6 +504,13 @@ class Task extends Base
);
}
+ /**
+ * Validate task modification
+ *
+ * @access public
+ * @param array $values Form values
+ * @return array $valid, $errors [0] = Success or not, [1] = List of errors
+ */
public function validateModification(array $values)
{
$v = new Validator($values, array(
@@ -351,6 +534,13 @@ class Task extends Base
);
}
+ /**
+ * Validate assignee change
+ *
+ * @access public
+ * @param array $values Form values
+ * @return array $valid, $errors [0] = Success or not, [1] = List of errors
+ */
public function validateAssigneeModification(array $values)
{
$v = new Validator($values, array(
@@ -368,6 +558,14 @@ class Task extends Base
);
}
+ /**
+ * Parse a date (different format for each locale) to a timestamp
+ *
+ * @access public
+ * @param string $value Date to parse
+ * @param string $format Date format
+ * @return integer
+ */
public function getTimestampFromDate($value, $format)
{
$date = \DateTime::createFromFormat($format, $value);