Backport #27263 by @lunny This PR will also keep the consistent between list assigned users and check assigned users. Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>tags/v1.21.7
// CanBeAssigned return true if user can be assigned to issue or pull requests in repo | // CanBeAssigned return true if user can be assigned to issue or pull requests in repo | ||||
// Currently any write access (code, issues or pr's) is assignable, to match assignee list in user interface. | // Currently any write access (code, issues or pr's) is assignable, to match assignee list in user interface. | ||||
// FIXME: user could send PullRequest also could be assigned??? | |||||
func CanBeAssigned(ctx context.Context, user *user_model.User, repo *repo_model.Repository, _ bool) (bool, error) { | func CanBeAssigned(ctx context.Context, user *user_model.User, repo *repo_model.Repository, _ bool) (bool, error) { | ||||
if user.IsOrganization() { | if user.IsOrganization() { | ||||
return false, fmt.Errorf("Organization can't be added as assignee [user_id: %d, repo_id: %d]", user.ID, repo.ID) | return false, fmt.Errorf("Organization can't be added as assignee [user_id: %d, repo_id: %d]", user.ID, repo.ID) | ||||
if err != nil { | if err != nil { | ||||
return false, err | return false, err | ||||
} | } | ||||
return perm.CanAccessAny(perm_model.AccessModeWrite, unit.TypeCode, unit.TypeIssues, unit.TypePullRequests), nil | |||||
return perm.CanAccessAny(perm_model.AccessModeWrite, unit.AllRepoUnitTypes...) || | |||||
perm.CanAccessAny(perm_model.AccessModeRead, unit.TypePullRequests), nil | |||||
} | } | ||||
// HasAccess returns true if user has access to repo | // HasAccess returns true if user has access to repo |
"code.gitea.io/gitea/models/db" | "code.gitea.io/gitea/models/db" | ||||
"code.gitea.io/gitea/models/perm" | "code.gitea.io/gitea/models/perm" | ||||
"code.gitea.io/gitea/models/unit" | |||||
user_model "code.gitea.io/gitea/models/user" | user_model "code.gitea.io/gitea/models/user" | ||||
"code.gitea.io/gitea/modules/container" | "code.gitea.io/gitea/modules/container" | ||||
api "code.gitea.io/gitea/modules/structs" | api "code.gitea.io/gitea/modules/structs" | ||||
if err = e.Table("team_user"). | if err = e.Table("team_user"). | ||||
Join("INNER", "team_repo", "`team_repo`.team_id = `team_user`.team_id"). | Join("INNER", "team_repo", "`team_repo`.team_id = `team_user`.team_id"). | ||||
Join("INNER", "team_unit", "`team_unit`.team_id = `team_user`.team_id"). | Join("INNER", "team_unit", "`team_unit`.team_id = `team_user`.team_id"). | ||||
Where("`team_repo`.repo_id = ? AND `team_unit`.access_mode >= ?", repo.ID, perm.AccessModeWrite). | |||||
Where("`team_repo`.repo_id = ? AND (`team_unit`.access_mode >= ? OR (`team_unit`.access_mode = ? AND `team_unit`.`type` = ?))", | |||||
repo.ID, perm.AccessModeWrite, perm.AccessModeRead, unit.TypePullRequests). | |||||
Distinct("`team_user`.uid"). | Distinct("`team_user`.uid"). | ||||
Select("`team_user`.uid"). | Select("`team_user`.uid"). | ||||
Find(&additionalUserIDs); err != nil { | Find(&additionalUserIDs); err != nil { |