Add ui to create new custom project roles and column restrictions

This commit is contained in:
Frederic Guillot
2016-09-10 22:37:57 -04:00
parent 75470c7242
commit 44f680cf2f
25 changed files with 717 additions and 26 deletions

View File

@@ -34,6 +34,35 @@ class ColumnMoveRestrictionModel extends Base
->exists();
}
/**
* Fetch one restriction
*
* @param int $project_id
* @param int $restriction_id
* @return array|null
*/
public function getById($project_id, $restriction_id)
{
return $this->db
->table(self::TABLE)
->columns(
self::TABLE.'.restriction_id',
self::TABLE.'.project_id',
self::TABLE.'.role_id',
self::TABLE.'.src_column_id',
self::TABLE.'.dst_column_id',
'pr.role',
'sc.title as src_column_title',
'dc.title as dst_column_title'
)
->left(ColumnModel::TABLE, 'sc', 'id', self::TABLE, 'src_column_id')
->left(ColumnModel::TABLE, 'dc', 'id', self::TABLE, 'dst_column_id')
->left(ProjectRoleModel::TABLE, 'pr', 'role_id', self::TABLE, 'role_id')
->eq(self::TABLE.'.project_id', $project_id)
->eq(self::TABLE.'.restriction_id', $restriction_id)
->findOne();
}
/**
* Get all project column restrictions
*
@@ -45,9 +74,11 @@ class ColumnMoveRestrictionModel extends Base
return $this->db
->table(self::TABLE)
->columns(
'restriction_id',
'src_column_id',
'dst_column_id',
self::TABLE.'.restriction_id',
self::TABLE.'.project_id',
self::TABLE.'.role_id',
self::TABLE.'.src_column_id',
self::TABLE.'.dst_column_id',
'pr.role',
'sc.title as src_column_title',
'dc.title as dst_column_title'
@@ -61,15 +92,18 @@ class ColumnMoveRestrictionModel extends Base
/**
* Get all source column Ids
*
* @param int $project_id
*
* @param int $project_id
* @param string $role
* @return array
*/
public function getAllSrcColumns($project_id)
public function getAllSrcColumns($project_id, $role)
{
return $this->db
->hashtable(self::TABLE)
->left(ProjectRoleModel::TABLE, 'pr', 'role_id', self::TABLE, 'role_id')
->eq(self::TABLE.'.project_id', $project_id)
->eq('pr.role', $role)
->getAll('src_column_id', 'src_column_id');
}

View File

@@ -3,6 +3,7 @@
namespace Kanboard\Model;
use Kanboard\Core\Base;
use Kanboard\Core\Security\Role;
/**
* Class ProjectRoleModel
@@ -14,6 +15,38 @@ class ProjectRoleModel extends Base
{
const TABLE = 'project_has_roles';
/**
* Get list of project roles
*
* @param int $project_id
* @return array
*/
public function getList($project_id)
{
$defaultRoles = $this->role->getProjectRoles();
$customRoles = $this->db
->hashtable(self::TABLE)
->eq('project_id', $project_id)
->getAll('role', 'role');
return $defaultRoles + $customRoles;
}
/**
* Get a role
*
* @param int $project_id
* @param int $role_id
* @return array|null
*/
public function getById($project_id, $role_id)
{
return $this->db->table(self::TABLE)
->eq('project_id', $project_id)
->eq('role_id', $role_id)
->findOne();
}
/**
* Get all project roles
*
@@ -28,6 +61,22 @@ class ProjectRoleModel extends Base
->findAll();
}
/**
* Get all project roles with restrictions
*
* @param int $project_id
* @return array
*/
public function getAllWithRestrictions($project_id)
{
$roles = $this->getAll($project_id);
$restrictions = $this->columnMoveRestrictionModel->getAll($project_id);
$restrictions = array_column_index($restrictions, 'role_id');
array_merge_relation($roles, $restrictions, 'restrictions', 'role_id');
return $roles;
}
/**
* Create a new project role
*
@@ -73,10 +122,38 @@ class ProjectRoleModel extends Base
*/
public function remove($project_id, $role_id)
{
return $this->db
$this->db->startTransaction();
$role = $this->getById($project_id, $role_id);
$r1 = $this->db
->table(ProjectUserRoleModel::TABLE)
->eq('project_id', $project_id)
->eq('role', $role['role'])
->update(array(
'role' => Role::PROJECT_MEMBER
));
$r2 = $this->db
->table(ProjectGroupRoleModel::TABLE)
->eq('project_id', $project_id)
->eq('role', $role['role'])
->update(array(
'role' => Role::PROJECT_MEMBER
));
$r3 = $this->db
->table(self::TABLE)
->eq('project_id', $project_id)
->eq('role_id', $role_id)
->remove();
if ($r1 && $r2 && $r3) {
$this->db->closeTransaction();
return true;
}
$this->db->cancelTransaction();
return false;
}
}