Fix creation of Organization repos by Users with max created personal repos (#11183)

* Fix creation of Org repos

Fix go-gitea#9269

* Change variable name to appease linter

* Update PR with suggestions

Add a note for user.CanCreateRepo() about failure assumptions
Change repo.create help message

Co-authored-by: guillep2k <18600385+guillep2k@users.noreply.github.com>
This commit is contained in:
Andrew Bezold 2020-04-30 11:11:56 -04:00 committed by GitHub
parent 28e5e7fcbc
commit 3dc6af3d70
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 6 deletions

View file

@ -279,6 +279,7 @@ func (u *User) MaxCreationLimit() int {
} }
// CanCreateRepo returns if user login can create a repository // CanCreateRepo returns if user login can create a repository
// NOTE: functions calling this assume a failure due to repository count limit; if new checks are added, those functions should be revised
func (u *User) CanCreateRepo() bool { func (u *User) CanCreateRepo() bool {
if u.IsAdmin { if u.IsAdmin {
return true return true

View file

@ -61,7 +61,6 @@ func checkContextUser(ctx *context.Context, uid int64) *models.User {
ctx.ServerError("GetOrgsCanCreateRepoByUserID", err) ctx.ServerError("GetOrgsCanCreateRepoByUserID", err)
return nil return nil
} }
ctx.Data["Orgs"] = orgs
// Not equal means current user is an organization. // Not equal means current user is an organization.
if uid == ctx.User.ID || uid == 0 { if uid == ctx.User.ID || uid == 0 {
@ -84,6 +83,14 @@ func checkContextUser(ctx *context.Context, uid int64) *models.User {
return nil return nil
} }
if !ctx.User.IsAdmin { if !ctx.User.IsAdmin {
orgsAvailable := []*models.User{}
for i := 0; i < len(orgs); i++ {
if orgs[i].CanCreateRepo() {
orgsAvailable = append(orgsAvailable, orgs[i])
}
}
ctx.Data["Orgs"] = orgsAvailable
canCreate, err := org.CanCreateOrgRepo(ctx.User.ID) canCreate, err := org.CanCreateOrgRepo(ctx.User.ID)
if err != nil { if err != nil {
ctx.ServerError("CanCreateOrgRepo", err) ctx.ServerError("CanCreateOrgRepo", err)
@ -92,6 +99,8 @@ func checkContextUser(ctx *context.Context, uid int64) *models.User {
ctx.Error(403) ctx.Error(403)
return nil return nil
} }
} else {
ctx.Data["Orgs"] = orgs
} }
return org return org
} }
@ -111,10 +120,6 @@ func getRepoPrivate(ctx *context.Context) bool {
// Create render creating repository page // Create render creating repository page
func Create(ctx *context.Context) { func Create(ctx *context.Context) {
if !ctx.User.CanCreateRepo() {
ctx.RenderWithErr(ctx.Tr("repo.form.reach_limit_of_creation", ctx.User.MaxCreationLimit()), tplCreate, nil)
}
ctx.Data["Title"] = ctx.Tr("new_repo") ctx.Data["Title"] = ctx.Tr("new_repo")
// Give default value for template to render. // Give default value for template to render.
@ -142,8 +147,12 @@ func Create(ctx *context.Context) {
} }
} }
if !ctx.User.CanCreateRepo() {
ctx.RenderWithErr(ctx.Tr("repo.form.reach_limit_of_creation", ctx.User.MaxCreationLimit()), tplCreate, nil)
} else {
ctx.HTML(200, tplCreate) ctx.HTML(200, tplCreate)
} }
}
func handleCreateError(ctx *context.Context, owner *models.User, err error, name string, tpl base.TplName, form interface{}) { func handleCreateError(ctx *context.Context, owner *models.User, err error, name string, tpl base.TplName, form interface{}) {
switch { switch {

View file

@ -31,6 +31,7 @@
{{end}} {{end}}
</div> </div>
</div> </div>
<span class="help">Some organizations may not show up in the dropdown due to a maximum repository count limit</span>
</div> </div>
<div class="inline required field {{if .Err_RepoName}}error{{end}}"> <div class="inline required field {{if .Err_RepoName}}error{{end}}">