Skip to content

Commit bef293c

Browse files
add group pages to web router
- `/{username}/groups/{group_id}` -> show a group's homepage with its repositories - `/{org}/groups/new` -> create a new group in an org - `/{org}/groups/{group_id}` -> show a group in an org - `/{org}/groups/{group_id}/teams` -> show/edit teams with access to a group - `/{org}/groups/{group_id}/teams/{team}/edit` -> edit a team's access to a group - `/{org}/group/{group_id}/settings` -> show/edit a group's settings - `/group/search` -> search for groups with parameters. return matching groups and repos contained within them
1 parent f24321e commit bef293c

File tree

7 files changed

+810
-0
lines changed

7 files changed

+810
-0
lines changed

routers/web/group/edit.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package group
2+
3+
import (
4+
group_model "code.gitea.io/gitea/models/group"
5+
repo_model "code.gitea.io/gitea/models/repo"
6+
"code.gitea.io/gitea/modules/json"
7+
"code.gitea.io/gitea/services/context"
8+
"code.gitea.io/gitea/services/forms"
9+
group_service "code.gitea.io/gitea/services/group"
10+
)
11+
12+
func MoveGroupItem(ctx *context.Context) {
13+
form := &forms.MovedGroupItemForm{}
14+
if err := json.NewDecoder(ctx.Req.Body).Decode(form); err != nil {
15+
ctx.ServerError("DecodeMovedGroupItemForm", err)
16+
return
17+
}
18+
if form.IsGroup {
19+
group, err := group_model.GetGroupByID(ctx, form.ItemID)
20+
if err != nil {
21+
ctx.ServerError("GetGroupByID", err)
22+
return
23+
}
24+
if group.ParentGroupID != form.NewParent {
25+
if err = group_model.MoveGroup(ctx, group, form.NewParent, form.NewPos); err != nil {
26+
ctx.ServerError("MoveGroup", err)
27+
return
28+
}
29+
if err = group_service.RecalculateGroupAccess(ctx, group, false); err != nil {
30+
ctx.ServerError("RecalculateGroupAccess", err)
31+
}
32+
}
33+
} else {
34+
repo, err := repo_model.GetRepositoryByID(ctx, form.ItemID)
35+
if err != nil {
36+
ctx.ServerError("GetRepositoryByID", err)
37+
}
38+
if repo.GroupID != form.NewParent {
39+
if err = group_service.MoveRepositoryToGroup(ctx, repo, form.NewParent, form.NewPos); err != nil {
40+
ctx.ServerError("MoveRepositoryToGroup", err)
41+
}
42+
}
43+
}
44+
ctx.JSONOK()
45+
}

routers/web/group/home.go

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package group
2+
3+
import (
4+
"code.gitea.io/gitea/models/db"
5+
"code.gitea.io/gitea/models/organization"
6+
repo_model "code.gitea.io/gitea/models/repo"
7+
shared_group_model "code.gitea.io/gitea/models/shared/group"
8+
"code.gitea.io/gitea/modules/setting"
9+
shared_group "code.gitea.io/gitea/routers/web/shared/group"
10+
"code.gitea.io/gitea/services/context"
11+
"net/http"
12+
)
13+
14+
const (
15+
tplGroupHome = "group/home"
16+
)
17+
18+
func Home(ctx *context.Context) {
19+
org := ctx.Org.Organization
20+
21+
ctx.Data["PageIsUserProfile"] = true
22+
ctx.Data["Title"] = org.DisplayName()
23+
24+
var orderBy db.SearchOrderBy
25+
sortOrder := ctx.FormString("sort")
26+
if _, ok := repo_model.OrderByFlatMap[sortOrder]; !ok {
27+
sortOrder = setting.UI.ExploreDefaultSort
28+
}
29+
ctx.Data["SortType"] = sortOrder
30+
orderBy = repo_model.OrderByFlatMap[sortOrder]
31+
32+
keyword := ctx.FormTrim("q")
33+
ctx.Data["Keyword"] = keyword
34+
35+
language := ctx.FormTrim("language")
36+
ctx.Data["Language"] = language
37+
38+
page := ctx.FormInt("page")
39+
if page <= 0 {
40+
page = 1
41+
}
42+
43+
archived := ctx.FormOptionalBool("archived")
44+
ctx.Data["IsArchived"] = archived
45+
46+
fork := ctx.FormOptionalBool("fork")
47+
ctx.Data["IsFork"] = fork
48+
49+
mirror := ctx.FormOptionalBool("mirror")
50+
ctx.Data["IsMirror"] = mirror
51+
52+
template := ctx.FormOptionalBool("template")
53+
ctx.Data["IsTemplate"] = template
54+
55+
private := ctx.FormOptionalBool("private")
56+
ctx.Data["IsPrivate"] = private
57+
58+
err := shared_group.LoadHeaderCount(ctx)
59+
if err != nil {
60+
ctx.ServerError("LoadHeaderCount", err)
61+
return
62+
}
63+
64+
opts := &organization.FindOrgMembersOpts{
65+
Doer: ctx.Doer,
66+
OrgID: org.ID,
67+
IsDoerMember: ctx.Org.IsMember,
68+
ListOptions: db.ListOptions{Page: 1, PageSize: 25},
69+
}
70+
71+
members, err := shared_group_model.FindGroupMembers(ctx, ctx.RepoGroup.Group.ID, opts)
72+
if err != nil {
73+
ctx.ServerError("FindOrgMembers", err)
74+
return
75+
}
76+
ctx.Data["Members"] = members
77+
ctx.Data["Teams"] = ctx.RepoGroup.Teams
78+
ctx.Data["DisableNewPullMirrors"] = setting.Mirror.DisableNewPull
79+
ctx.Data["ShowMemberAndTeamTab"] = ctx.RepoGroup.IsMember || len(members) > 0
80+
ctx.Data["PageIsViewRepositories"] = true
81+
82+
var (
83+
repos []*repo_model.Repository
84+
count int64
85+
)
86+
repos, count, err = repo_model.SearchRepository(ctx, repo_model.SearchRepoOptions{
87+
ListOptions: db.ListOptions{
88+
PageSize: setting.UI.User.RepoPagingNum,
89+
Page: page,
90+
},
91+
Keyword: keyword,
92+
OwnerID: org.ID,
93+
OrderBy: orderBy,
94+
Private: ctx.IsSigned,
95+
Actor: ctx.Doer,
96+
Language: language,
97+
IncludeDescription: setting.UI.SearchRepoDescription,
98+
Archived: archived,
99+
Fork: fork,
100+
Mirror: mirror,
101+
Template: template,
102+
IsPrivate: private,
103+
GroupID: ctx.RepoGroup.Group.ID,
104+
})
105+
if err != nil {
106+
ctx.ServerError("SearchRepository", err)
107+
return
108+
}
109+
110+
ctx.Data["Repos"] = repos
111+
ctx.Data["Total"] = count
112+
113+
pager := context.NewPagination(int(count), setting.UI.User.RepoPagingNum, page, 5)
114+
pager.AddParamFromRequest(ctx.Req)
115+
ctx.Data["Page"] = pager
116+
ctx.HTML(http.StatusOK, tplGroupHome)
117+
}

routers/web/group/new.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package group
2+
3+
import (
4+
"code.gitea.io/gitea/models/perm"
5+
"net/http"
6+
7+
"code.gitea.io/gitea/models/db"
8+
group_model "code.gitea.io/gitea/models/group"
9+
unit_model "code.gitea.io/gitea/models/unit"
10+
"code.gitea.io/gitea/modules/log"
11+
"code.gitea.io/gitea/modules/optional"
12+
"code.gitea.io/gitea/modules/web"
13+
shared_user "code.gitea.io/gitea/routers/web/shared/user"
14+
"code.gitea.io/gitea/services/context"
15+
"code.gitea.io/gitea/services/forms"
16+
group_service "code.gitea.io/gitea/services/group"
17+
)
18+
19+
const tplGroupNew = "group/create"
20+
21+
func NewGroup(ctx *context.Context) {
22+
ctx.Data["Title"] = ctx.Org.Organization.FullName
23+
ctx.Data["PageIsNewGroup"] = true
24+
if ctx.RepoGroup.Group != nil {
25+
ctx.Data["Group"] = &group_model.Group{ParentGroupID: ctx.RepoGroup.Group.ID}
26+
} else {
27+
ctx.Data["Group"] = &group_model.Group{}
28+
}
29+
ctx.Data["Units"] = unit_model.Units
30+
if _, err := shared_user.RenderUserOrgHeader(ctx); err != nil {
31+
ctx.ServerError("LoadHeaderCount", err)
32+
return
33+
}
34+
35+
opts := group_model.FindGroupsOptions{
36+
ActorID: ctx.Doer.ID,
37+
CanCreateIn: optional.Some(true),
38+
OwnerID: ctx.Org.Organization.ID,
39+
}
40+
cond := group_model.AccessibleGroupCondition(ctx.Doer, unit_model.TypeInvalid, perm.AccessModeWrite)
41+
cond = cond.And(opts.ToConds())
42+
groups, err := group_model.FindGroupsByCond(ctx, &group_model.FindGroupsOptions{
43+
ListOptions: db.ListOptions{
44+
ListAll: true,
45+
},
46+
ParentGroupID: -1,
47+
}, cond)
48+
for _, g := range groups {
49+
err = g.LoadAccessibleSubgroups(ctx, true, ctx.Doer)
50+
if err != nil {
51+
ctx.ServerError("LoadAccessibleSubgroups", err)
52+
return
53+
}
54+
}
55+
if err != nil {
56+
ctx.ServerError("FindGroupsByCond", err)
57+
return
58+
}
59+
ctx.Data["Groups"] = groups
60+
ctx.HTML(http.StatusOK, tplGroupNew)
61+
}
62+
func NewGroupPost(ctx *context.Context) {
63+
form := web.GetForm(ctx).(*forms.CreateGroupForm)
64+
log.GetLogger(log.DEFAULT).Info("what? %+v", form)
65+
g := &group_model.Group{
66+
OwnerID: ctx.Org.Organization.ID,
67+
Name: form.GroupName,
68+
Description: form.Description,
69+
OwnerName: ctx.Org.Organization.Name,
70+
ParentGroupID: form.ParentGroupID,
71+
}
72+
ctx.Data["Title"] = ctx.Org.Organization.FullName
73+
ctx.Data["PageIsGroupNew"] = true
74+
ctx.Data["Units"] = unit_model.Units
75+
ctx.Data["Group"] = g
76+
77+
if ctx.HasError() {
78+
ctx.HTML(http.StatusOK, tplGroupNew)
79+
return
80+
}
81+
82+
if err := group_service.NewGroup(ctx, g); err != nil {
83+
ctx.Data["Err_GroupName"] = true
84+
ctx.ServerError("NewGroup", err)
85+
return
86+
}
87+
log.Trace("Group created: %s/%s", ctx.Org.Organization.Name, g.Name)
88+
ctx.Redirect(g.GroupLink())
89+
}

0 commit comments

Comments
 (0)