diff options
Diffstat (limited to 'models')
-rw-r--r-- | models/action.php | 6 | ||||
-rw-r--r-- | models/category.php | 152 | ||||
-rw-r--r-- | models/project.php | 6 | ||||
-rw-r--r-- | models/task.php | 16 |
4 files changed, 174 insertions, 6 deletions
diff --git a/models/action.php b/models/action.php index a0236eff..c8cbf3b1 100644 --- a/models/action.php +++ b/models/action.php @@ -44,6 +44,7 @@ class Action extends Base 'TaskAssignCurrentUser' => t('Assign the task to the person who does the action'), 'TaskDuplicateAnotherProject' => t('Duplicate the task to another project'), 'TaskAssignColorUser' => t('Assign a color to a specific user'), + 'TaskAssignColorCategory' => t('Assign a color to a specific category'), ); } @@ -62,6 +63,7 @@ class Action extends Base Task::EVENT_CREATE => t('Task creation'), Task::EVENT_OPEN => t('Open a closed task'), Task::EVENT_CLOSE => t('Closing a task'), + Task::EVENT_CREATE_UPDATE => t('Task creation or modification'), ); } @@ -239,6 +241,10 @@ class Action extends Base require_once __DIR__.'/../actions/task_assign_color_user.php'; $className = '\Action\TaskAssignColorUser'; return new $className($project_id, new Task($this->db, $this->event)); + case 'TaskAssignColorCategory': + require_once __DIR__.'/../actions/task_assign_color_category.php'; + $className = '\Action\TaskAssignColorCategory'; + return new $className($project_id, new Task($this->db, $this->event)); default: throw new \LogicException('Action not found: '.$name); } diff --git a/models/category.php b/models/category.php new file mode 100644 index 00000000..2a1891a5 --- /dev/null +++ b/models/category.php @@ -0,0 +1,152 @@ +<?php + +namespace Model; + +require_once __DIR__.'/base.php'; + +use SimpleValidator\Validator; +use SimpleValidator\Validators; + +/** + * Category model + * + * @package model + * @author Frederic Guillot + */ +class Category extends Base +{ + /** + * SQL table name + * + * @var string + */ + const TABLE = 'project_has_categories'; + + /** + * Get a category by the id + * + * @access public + * @param integer $category_id Category id + * @return array + */ + public function getById($category_id) + { + return $this->db->table(self::TABLE)->eq('id', $category_id)->findOne(); + } + + /** + * Return the list of all categories + * + * @access public + * @param integer $project_id Project id + * @param bool $prepend_none If true, prepend to the list the value 'None' + * @param bool $prepend_all If true, prepend to the list the value 'All' + * @return array + */ + public function getList($project_id, $prepend_none = true, $prepend_all = false) + { + $listing = $this->db->table(self::TABLE) + ->eq('project_id', $project_id) + ->asc('name') + ->listing('id', 'name'); + + $prepend = array(); + + if ($prepend_all) { + $prepend[-1] = t('All categories'); + } + + if ($prepend_none) { + $prepend[0] = t('No category'); + } + + return $prepend + $listing; + } + + /** + * Create a category + * + * @access public + * @param array $values Form values + * @return bool + */ + public function create(array $values) + { + return $this->db->table(self::TABLE)->save($values); + } + + /** + * Update a category + * + * @access public + * @param array $values Form values + * @return bool + */ + public function update(array $values) + { + return $this->db->table(self::TABLE)->eq('id', $values['id'])->save($values); + } + + /** + * Remove a category + * + * @access public + * @param integer $category_id Category id + * @return bool + */ + public function remove($category_id) + { + $this->db->startTransaction(); + $r1 = $this->db->table(Task::TABLE)->eq('category_id', $category_id)->update(array('category_id' => 0)); + $r2 = $this->db->table(self::TABLE)->eq('id', $category_id)->remove(); + $this->db->closeTransaction(); + + return $r1 && $r2; + } + + /** + * Validate category creation + * + * @access public + * @param array $array Form values + * @return array $valid, $errors [0] = Success or not, [1] = List of errors + */ + public function validateCreation(array $values) + { + $v = new Validator($values, array( + new Validators\Required('project_id', t('The project id is required')), + new Validators\Integer('project_id', t('The project id must be an integer')), + new Validators\Required('name', t('The name is required')), + new Validators\MaxLength('name', t('The maximum length is %d characters', 50), 50) + )); + + return array( + $v->execute(), + $v->getErrors() + ); + } + + /** + * Validate category modification + * + * @access public + * @param array $array Form values + * @return array $valid, $errors [0] = Success or not, [1] = List of errors + */ + public function validateModification(array $values) + { + $v = new Validator($values, array( + new Validators\Required('id', t('The id is required')), + new Validators\Integer('id', t('The id must be an integer')), + new Validators\Required('project_id', t('The project id is required')), + new Validators\Integer('project_id', t('The project id must be an integer')), + new Validators\Required('name', t('The name is required')), + new Validators\MaxLength('name', t('The maximum length is %d characters', 50), 50) + )); + + return array( + $v->execute(), + $v->getErrors() + ); + } +} diff --git a/models/project.php b/models/project.php index 680d0750..cbbbfda2 100644 --- a/models/project.php +++ b/models/project.php @@ -8,9 +8,9 @@ require_once __DIR__.'/board.php'; require_once __DIR__.'/task.php'; require_once __DIR__.'/../events/task_modification.php'; -use \SimpleValidator\Validator; -use \SimpleValidator\Validators; -use \Event\TaskModification; +use SimpleValidator\Validator; +use SimpleValidator\Validators; +use Event\TaskModification; /** * Project model diff --git a/models/task.php b/models/task.php index f6258e86..0c62a9f4 100644 --- a/models/task.php +++ b/models/task.php @@ -4,8 +4,8 @@ namespace Model; require_once __DIR__.'/base.php'; -use \SimpleValidator\Validator; -use \SimpleValidator\Validators; +use SimpleValidator\Validator; +use SimpleValidator\Validators; use DateTime; /** @@ -42,6 +42,7 @@ class Task extends Base const EVENT_CREATE = 'task.create'; const EVENT_CLOSE = 'task.close'; const EVENT_OPEN = 'task.open'; + const EVENT_CREATE_UPDATE = 'task.create_update'; /** * Get available colors @@ -90,10 +91,13 @@ class Task extends Base self::TABLE.'.position', self::TABLE.'.is_active', self::TABLE.'.score', + self::TABLE.'.category_id', + Category::TABLE.'.name AS category_name', Project::TABLE.'.name AS project_name', Board::TABLE.'.title AS column_title', User::TABLE.'.username' ) + ->join(Category::TABLE, 'id', 'category_id') ->join(Project::TABLE, 'id', 'project_id') ->join(Board::TABLE, 'id', 'column_id') ->join(User::TABLE, 'id', 'owner_id') @@ -150,6 +154,7 @@ class Task extends Base 'tasks.position', 'tasks.is_active', 'tasks.score', + 'tasks.category_id', 'users.username' ) ->join('users', 'id', 'owner_id'); @@ -236,6 +241,7 @@ class Task extends Base $this->db->closeTransaction(); // Trigger events + $this->event->trigger(self::EVENT_CREATE_UPDATE, array('task_id' => $task_id) + $task); $this->event->trigger(self::EVENT_CREATE, array('task_id' => $task_id) + $task); return $task_id; @@ -265,6 +271,7 @@ class Task extends Base // Assign new values $task['date_creation'] = time(); $task['owner_id'] = 0; + $task['category_id'] = 0; $task['is_active'] = 1; $task['column_id'] = $boardModel->getFirstColumn($project_id); $task['project_id'] = $project_id; @@ -281,6 +288,7 @@ class Task extends Base $this->db->closeTransaction(); // Trigger events + $this->event->trigger(self::EVENT_CREATE_UPDATE, array('task_id' => $task_id) + $task); $this->event->trigger(self::EVENT_CREATE, array('task_id' => $task_id) + $task); return $task_id; @@ -320,6 +328,7 @@ class Task extends Base $this->db->closeTransaction(); // Trigger events + $this->event->trigger(self::EVENT_CREATE_UPDATE, array('task_id' => $task_id) + $values); $this->event->trigger(self::EVENT_CREATE, array('task_id' => $task_id) + $values); return $task_id; @@ -355,7 +364,8 @@ class Task extends Base $events = array(); - if ($this->event->getLastTriggeredEvent() !== self::EVENT_UPDATE) { + if (! in_array($this->event->getLastTriggeredEvent(), array(self::EVENT_CREATE_UPDATE))) { + $events[] = self::EVENT_CREATE_UPDATE; $events[] = self::EVENT_UPDATE; } |