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
@@ -332,7 +332,6 @@ func HasAccessUnit(ctx context.Context, user *user_model.User, repo *repo_model. | |||
// 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. | |||
// 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) { | |||
if user.IsOrganization() { | |||
return false, fmt.Errorf("Organization can't be added as assignee [user_id: %d, repo_id: %d]", user.ID, repo.ID) | |||
@@ -341,7 +340,8 @@ func CanBeAssigned(ctx context.Context, user *user_model.User, repo *repo_model. | |||
if err != nil { | |||
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 |
@@ -8,6 +8,7 @@ import ( | |||
"code.gitea.io/gitea/models/db" | |||
"code.gitea.io/gitea/models/perm" | |||
"code.gitea.io/gitea/models/unit" | |||
user_model "code.gitea.io/gitea/models/user" | |||
"code.gitea.io/gitea/modules/container" | |||
api "code.gitea.io/gitea/modules/structs" | |||
@@ -78,7 +79,8 @@ func GetRepoAssignees(ctx context.Context, repo *Repository) (_ []*user_model.Us | |||
if err = e.Table("team_user"). | |||
Join("INNER", "team_repo", "`team_repo`.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"). | |||
Select("`team_user`.uid"). | |||
Find(&additionalUserIDs); err != nil { |