Task duplication

This commit is contained in:
Frédéric Guillot
2014-03-19 21:49:39 -04:00
parent 41dd9b2eff
commit ab63ffafc5
9 changed files with 344 additions and 25 deletions

View File

@@ -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);