| | <?php |
| |
|
| | namespace Kanboard\Model; |
| |
|
| | use Kanboard\Core\Base; |
| | use Kanboard\Core\Security\Token; |
| | use Kanboard\Core\Security\Role; |
| | use Kanboard\Model\TaskModel; |
| | use Kanboard\Model\TaskFileModel; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | class ProjectModel extends Base |
| | { |
| | |
| | |
| | |
| | |
| | |
| | const TABLE = 'projects'; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | const ACTIVE = 1; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | const INACTIVE = 0; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | const TYPE_PRIVATE = 1; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | const TYPE_TEAM = 0; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getById($project_id) |
| | { |
| | return $this->db->table(self::TABLE)->eq('id', $project_id)->findOne(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getByIdWithOwner($project_id) |
| | { |
| | return $this->db->table(self::TABLE) |
| | ->columns(self::TABLE.'.*', UserModel::TABLE.'.username AS owner_username', UserModel::TABLE.'.name AS owner_name') |
| | ->eq(self::TABLE.'.id', $project_id) |
| | ->join(UserModel::TABLE, 'id', 'owner_id') |
| | ->findOne(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getByIdWithOwnerAndTaskCount($project_id) |
| | { |
| | return $this->db->table(self::TABLE) |
| | ->columns( |
| | self::TABLE.'.*', |
| | UserModel::TABLE.'.username AS owner_username', |
| | UserModel::TABLE.'.name AS owner_name', |
| | "(SELECT count(*) FROM tasks WHERE tasks.project_id=projects.id AND tasks.is_active='1') AS nb_active_tasks" |
| | ) |
| | ->eq(self::TABLE.'.id', $project_id) |
| | ->join(UserModel::TABLE, 'id', 'owner_id') |
| | ->join(TaskModel::TABLE, 'project_id', 'id') |
| | ->findOne(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getByName($name) |
| | { |
| | return $this->db->table(self::TABLE)->eq('name', $name)->findOne(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getByIdentifier($identifier) |
| | { |
| | if (empty($identifier)) { |
| | return false; |
| | } |
| |
|
| | return $this->db->table(self::TABLE)->eq('identifier', strtoupper($identifier))->findOne(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getByEmail($email) |
| | { |
| | if (empty($email)) { |
| | return false; |
| | } |
| |
|
| | return $this->db->table(self::TABLE)->eq('email', $email)->findOne(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getByToken($token) |
| | { |
| | if (empty($token)) { |
| | return false; |
| | } |
| |
|
| | return $this->db->table(self::TABLE)->eq('token', $token)->eq('is_public', 1)->findOne(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getFirst() |
| | { |
| | return $this->db->table(self::TABLE)->findOne(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function isPrivate($project_id) |
| | { |
| | return $this->db->table(self::TABLE)->eq('id', $project_id)->eq('is_private', 1)->exists(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getAll() |
| | { |
| | return $this->db->table(self::TABLE)->asc('name')->findAll(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getAllByIds(array $project_ids) |
| | { |
| | if (empty($project_ids)) { |
| | return array(); |
| | } |
| |
|
| | return $this->db->table(self::TABLE)->in('id', $project_ids)->asc('name')->findAll(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getAllIds() |
| | { |
| | return $this->db->table(self::TABLE)->asc('name')->findAllByColumn('id'); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getList($prependNone = true, $noPrivateProjects = true) |
| | { |
| | if ($noPrivateProjects) { |
| | $projects = $this->db->hashtable(self::TABLE)->eq('is_private', 0)->asc('name')->getAll('id', 'name'); |
| | } else { |
| | $projects = $this->db->hashtable(self::TABLE)->asc('name')->getAll('id', 'name'); |
| | } |
| |
|
| | if ($prependNone) { |
| | return array(t('None')) + $projects; |
| | } |
| |
|
| | return $projects; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getAllByStatus($status) |
| | { |
| | return $this->db |
| | ->table(self::TABLE) |
| | ->asc('name') |
| | ->eq('is_active', $status) |
| | ->findAll(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getListByStatus($status) |
| | { |
| | return $this->db |
| | ->hashtable(self::TABLE) |
| | ->asc('name') |
| | ->eq('is_active', $status) |
| | ->getAll('id', 'name'); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function countByStatus($status) |
| | { |
| | return $this->db |
| | ->table(self::TABLE) |
| | ->eq('is_active', $status) |
| | ->count(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getColumnStats(array &$project) |
| | { |
| | $project['columns'] = $this->columnModel->getAllWithTaskCount($project['id']); |
| | $project['nb_active_tasks'] = 0; |
| |
|
| | foreach ($project['columns'] as $column) { |
| | $project['nb_active_tasks'] += $column['nb_open_tasks']; |
| | } |
| |
|
| | return $project; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function applyColumnStats(array $projects) |
| | { |
| | foreach ($projects as &$project) { |
| | $this->getColumnStats($project); |
| | } |
| |
|
| | return $projects; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getQueryColumnStats(array $project_ids) |
| | { |
| | if (empty($project_ids)) { |
| | return $this->db->table(ProjectModel::TABLE)->eq(ProjectModel::TABLE.'.id', 0); |
| | } |
| |
|
| | return $this->db |
| | ->table(ProjectModel::TABLE) |
| | ->columns(self::TABLE.'.*', UserModel::TABLE.'.username AS owner_username', UserModel::TABLE.'.name AS owner_name') |
| | ->join(UserModel::TABLE, 'id', 'owner_id') |
| | ->in(self::TABLE.'.id', $project_ids) |
| | ->callback(array($this, 'applyColumnStats')); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function getQueryByProjectIds(array $projectIds) |
| | { |
| | if (empty($projectIds)) { |
| | return $this->db->table(ProjectModel::TABLE)->eq(ProjectModel::TABLE.'.id', 0); |
| | } |
| |
|
| | return $this->db |
| | ->table(ProjectModel::TABLE) |
| | ->columns(self::TABLE.'.*', UserModel::TABLE.'.username AS owner_username', UserModel::TABLE.'.name AS owner_name') |
| | ->join(UserModel::TABLE, 'id', 'owner_id') |
| | ->in(self::TABLE.'.id', $projectIds); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function create(array $values, $userId = 0, $addUser = false) |
| | { |
| | if (! empty($userId) && ! $this->userModel->exists($userId)) { |
| | return false; |
| | } |
| |
|
| | $this->db->startTransaction(); |
| |
|
| | $values['token'] = ''; |
| | $values['last_modified'] = time(); |
| | $values['is_private'] = empty($values['is_private']) ? 0 : 1; |
| | $values['owner_id'] = $userId; |
| |
|
| | if (! empty($values['identifier'])) { |
| | $values['identifier'] = strtoupper($values['identifier']); |
| | } |
| |
|
| | $this->helper->model->convertIntegerFields($values, array('priority_default', 'priority_start', 'priority_end', 'task_limit')); |
| |
|
| | if (! $this->db->table(self::TABLE)->save($values)) { |
| | $this->db->cancelTransaction(); |
| | return false; |
| | } |
| |
|
| | $project_id = $this->db->getLastId(); |
| |
|
| | if (! $this->boardModel->create($project_id, $this->boardModel->getUserColumns())) { |
| | $this->db->cancelTransaction(); |
| | return false; |
| | } |
| |
|
| | if (! $this->swimlaneModel->create($project_id, t('Default swimlane'))) { |
| | $this->db->cancelTransaction(); |
| | return false; |
| | } |
| |
|
| | if ($addUser && $userId) { |
| | $this->projectUserRoleModel->addUser($project_id, $userId, Role::PROJECT_MANAGER); |
| | } |
| |
|
| | $this->categoryModel->createDefaultCategories($project_id); |
| |
|
| | $this->db->closeTransaction(); |
| |
|
| | return (int) $project_id; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function isModifiedSince($project_id, $timestamp) |
| | { |
| | return (bool) $this->db->table(self::TABLE) |
| | ->eq('id', $project_id) |
| | ->gt('last_modified', $timestamp) |
| | ->count(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function updateModificationDate($project_id) |
| | { |
| | return $this->db->table(self::TABLE)->eq('id', $project_id)->update(array( |
| | 'last_modified' => time() |
| | )); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function update(array $values) |
| | { |
| | if (! empty($values['identifier'])) { |
| | $values['identifier'] = strtoupper($values['identifier']); |
| | } |
| |
|
| | if (! empty($values['start_date'])) { |
| | $values['start_date'] = $this->dateParser->getIsoDate($values['start_date']); |
| | } |
| |
|
| | if (! empty($values['end_date'])) { |
| | $values['end_date'] = $this->dateParser->getIsoDate($values['end_date']); |
| | } |
| |
|
| | if (! empty($values['owner_id']) && ! $this->userModel->exists($values['owner_id'])) { |
| | return false; |
| | } |
| |
|
| | $values['per_swimlane_task_limits'] = empty($values['per_swimlane_task_limits']) ? 0 : 1; |
| |
|
| | $this->helper->model->convertIntegerFields($values, array('priority_default', 'priority_start', 'priority_end', 'task_limit')); |
| |
|
| | $updates = $values; |
| | unset($updates['id']); |
| | return $this->exists($values['id']) && |
| | $this->db->table(self::TABLE)->eq('id', $values['id'])->save($updates); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function remove($project_id) |
| | { |
| | |
| | $this->projectFileModel->removeAll($project_id); |
| |
|
| | |
| | $file_ids = $this->db |
| | ->table(TaskFileModel::TABLE) |
| | ->eq(TaskModel::TABLE.'.project_id', $project_id) |
| | ->join(TaskModel::TABLE, 'id', 'task_id', TaskFileModel::TABLE) |
| | ->findAllByColumn(TaskFileModel::TABLE.'.id'); |
| |
|
| | foreach ($file_ids as $file_id) { |
| | $this->taskFileModel->remove($file_id); |
| | } |
| |
|
| | |
| | $this->db->table(TagModel::TABLE)->eq('project_id', $project_id)->remove(); |
| | return $this->db->table(self::TABLE)->eq('id', $project_id)->remove(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function exists($project_id) |
| | { |
| | return $this->db->table(self::TABLE)->eq('id', $project_id)->exists(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function enable($project_id) |
| | { |
| | return $this->exists($project_id) && |
| | $this->db |
| | ->table(self::TABLE) |
| | ->eq('id', $project_id) |
| | ->update(array('is_active' => 1)); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function disable($project_id) |
| | { |
| | return $this->exists($project_id) && |
| | $this->db |
| | ->table(self::TABLE) |
| | ->eq('id', $project_id) |
| | ->update(array('is_active' => 0)); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function enablePublicAccess($project_id) |
| | { |
| | return $this->exists($project_id) && |
| | $this->db |
| | ->table(self::TABLE) |
| | ->eq('id', $project_id) |
| | ->save(array('is_public' => 1, 'token' => Token::getToken())); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function disablePublicAccess($project_id) |
| | { |
| | return $this->exists($project_id) && |
| | $this->db |
| | ->table(self::TABLE) |
| | ->eq('id', $project_id) |
| | ->save(array('is_public' => 0, 'token' => '')); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function changeGlobalTagUsage($project_id, $global_tags) |
| | { |
| | return $this->exists($project_id) && |
| | $this->db |
| | ->table(self::TABLE) |
| | ->eq('id', $project_id) |
| | ->save(array('enable_global_tags' => $global_tags)); |
| | } |
| | } |
| |
|