Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Only show part of members on orgnization dashboard and add paging for orgnization members page #9092

Merged
merged 10 commits into from
Dec 6, 2019
1 change: 1 addition & 0 deletions docs/content/doc/advanced/config-cheat-sheet.en-us.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`.

- `EXPLORE_PAGING_NUM`: **20**: Number of repositories that are shown in one explore page.
- `ISSUE_PAGING_NUM`: **10**: Number of issues that are shown in one page (for all pages that list issues).
- `MEMBERS_PAGING_NUM`: **20**: Number of members that are shown in organization members.
- `FEED_MAX_COMMIT_NUM`: **5**: Number of maximum commits shown in one activity feed.
- `GRAPH_MAX_COMMIT_NUM`: **100**: Number of maximum commits shown in the commit graph.
- `DEFAULT_THEME`: **gitea**: \[gitea, arc-green\]: Set the default theme for the Gitea install.
Expand Down
1 change: 1 addition & 0 deletions docs/content/doc/advanced/config-cheat-sheet.zh-cn.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ menu:

- `EXPLORE_PAGING_NUM`: 探索页面每页显示的仓库数量。
- `ISSUE_PAGING_NUM`: 工单页面每页显示的工单数量。
- `MEMBERS_PAGING_NUM`: **20**: 组织成员页面每页显示的成员数量。
- `FEED_MAX_COMMIT_NUM`: 活动流页面显示的最大提交数量。

### UI - Admin (`ui.admin`)
Expand Down
57 changes: 45 additions & 12 deletions models/org.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,35 @@ func (org *User) GetTeams() error {
}

// GetMembers returns all members of organization.
func (org *User) GetMembers() error {
ous, err := GetOrgUsersByOrgID(org.ID)
func (org *User) GetMembers() (err error) {
org.Members, org.MembersIsPublic, err = FindOrgMembers(FindOrgMembersOpts{
OrgID: org.ID,
})
return
}

// FindOrgMembersOpts represensts find org members condtions
type FindOrgMembersOpts struct {
OrgID int64
PublicOnly bool
Start int
Limit int
}

// CountOrgMembers counts the organization's members
func CountOrgMembers(opts FindOrgMembersOpts) (int64, error) {
sess := x.Where("org_id=?", opts.OrgID)
if opts.PublicOnly {
sess.And("is_public = ?", true)
}
return sess.Count(new(OrgUser))
}

// FindOrgMembers loads organization members according conditions
func FindOrgMembers(opts FindOrgMembersOpts) (UserList, map[int64]bool, error) {
ous, err := GetOrgUsersByOrgID(opts.OrgID, opts.PublicOnly, opts.Start, opts.Limit)
if err != nil {
return err
return nil, nil, err
}

var ids = make([]int64, len(ous))
Expand All @@ -80,9 +105,12 @@ func (org *User) GetMembers() error {
ids[i] = ou.UID
idsIsPublic[ou.UID] = ou.IsPublic
}
org.MembersIsPublic = idsIsPublic
org.Members, err = GetUsersByIDs(ids)
return err

users, err := GetUsersByIDs(ids)
if err != nil {
return nil, nil, err
}
return users, idsIsPublic, nil
}

// AddMember adds new member to organization.
Expand Down Expand Up @@ -467,15 +495,20 @@ func GetOrgUsersByUserID(uid int64, all bool) ([]*OrgUser, error) {
}

// GetOrgUsersByOrgID returns all organization-user relations by organization ID.
func GetOrgUsersByOrgID(orgID int64) ([]*OrgUser, error) {
return getOrgUsersByOrgID(x, orgID)
func GetOrgUsersByOrgID(orgID int64, publicOnly bool, start, limit int) ([]*OrgUser, error) {
return getOrgUsersByOrgID(x, orgID, publicOnly, start, limit)
}

func getOrgUsersByOrgID(e Engine, orgID int64) ([]*OrgUser, error) {
func getOrgUsersByOrgID(e Engine, orgID int64, publicOnly bool, start, limit int) ([]*OrgUser, error) {
ous := make([]*OrgUser, 0, 10)
err := e.
Where("org_id=?", orgID).
Find(&ous)
sess := e.Where("org_id=?", orgID)
if publicOnly {
sess.And("is_public = ?", true)
}
if limit > 0 {
sess.Limit(limit, start)
}
err := sess.Find(&ous)
return ous, err
}

Expand Down
4 changes: 2 additions & 2 deletions models/org_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,7 @@ func TestGetOrgUsersByUserID(t *testing.T) {
func TestGetOrgUsersByOrgID(t *testing.T) {
assert.NoError(t, PrepareTestDatabase())

orgUsers, err := GetOrgUsersByOrgID(3)
orgUsers, err := GetOrgUsersByOrgID(3, false, 0, 0)
assert.NoError(t, err)
if assert.Len(t, orgUsers, 3) {
assert.Equal(t, OrgUser{
Expand All @@ -410,7 +410,7 @@ func TestGetOrgUsersByOrgID(t *testing.T) {
IsPublic: false}, *orgUsers[1])
}

orgUsers, err = GetOrgUsersByOrgID(NonexistentID)
orgUsers, err = GetOrgUsersByOrgID(NonexistentID, false, 0, 0)
assert.NoError(t, err)
assert.Len(t, orgUsers, 0)
}
Expand Down
2 changes: 2 additions & 0 deletions modules/setting/setting.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,7 @@ var (
ExplorePagingNum int
IssuePagingNum int
RepoSearchPagingNum int
MembersPagingNum int
FeedMaxCommitNum int
GraphMaxCommitNum int
CodeCommentLines int
Expand Down Expand Up @@ -191,6 +192,7 @@ var (
ExplorePagingNum: 20,
IssuePagingNum: 10,
RepoSearchPagingNum: 10,
MembersPagingNum: 20,
FeedMaxCommitNum: 5,
GraphMaxCommitNum: 100,
CodeCommentLines: 4,
Expand Down
31 changes: 7 additions & 24 deletions routers/api/v1/org/member.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,30 +18,13 @@ import (
// listMembers list an organization's members
func listMembers(ctx *context.APIContext, publicOnly bool) {
var members []*models.User
if publicOnly {
orgUsers, err := models.GetOrgUsersByOrgID(ctx.Org.Organization.ID)
if err != nil {
ctx.Error(500, "GetOrgUsersByOrgID", err)
return
}

memberIDs := make([]int64, 0, len(orgUsers))
for _, orgUser := range orgUsers {
if orgUser.IsPublic {
memberIDs = append(memberIDs, orgUser.UID)
}
}

if members, err = models.GetUsersByIDs(memberIDs); err != nil {
ctx.Error(500, "GetUsersByIDs", err)
return
}
} else {
if err := ctx.Org.Organization.GetMembers(); err != nil {
ctx.Error(500, "GetMembers", err)
return
}
members = ctx.Org.Organization.Members
members, _, err := models.FindOrgMembers(models.FindOrgMembersOpts{
OrgID: ctx.Org.Organization.ID,
PublicOnly: publicOnly,
})
if err != nil {
ctx.Error(500, "GetUsersByIDs", err)
return
}

apiMembers := make([]*api.User, len(members))
Expand Down
40 changes: 35 additions & 5 deletions routers/org/members.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,44 @@ func Members(ctx *context.Context) {
ctx.Data["Title"] = org.FullName
ctx.Data["PageIsOrgMembers"] = true

if err := org.GetMembers(); err != nil {
page := ctx.QueryInt("page")
if page <= 1 {
page = 1
}

var opts = models.FindOrgMembersOpts{
OrgID: org.ID,
PublicOnly: true,
}

if ctx.User != nil {
isMember, err := ctx.Org.Organization.IsOrgMember(ctx.User.ID)
if err != nil {
ctx.Error(500, "IsOrgMember")
return
}
opts.PublicOnly = !isMember
}

total, err := models.CountOrgMembers(opts)
if err != nil {
ctx.Error(500, "CountOrgMembers")
return
}

pager := context.NewPagination(int(total), setting.UI.MembersPagingNum, page, 5)
opts.Start = (page - 1) * setting.UI.MembersPagingNum
opts.Limit = setting.UI.MembersPagingNum
members, membersIsPublic, err := models.FindOrgMembers(opts)
if err != nil {
ctx.ServerError("GetMembers", err)
return
}
ctx.Data["Members"] = org.Members
ctx.Data["MembersIsPublicMember"] = org.MembersIsPublic
ctx.Data["MembersIsUserOrgOwner"] = org.Members.IsUserOrgOwner(org.ID)
ctx.Data["MembersTwoFaStatus"] = org.Members.GetTwoFaStatus()
ctx.Data["Page"] = pager
ctx.Data["Members"] = members
ctx.Data["MembersIsPublicMember"] = membersIsPublic
ctx.Data["MembersIsUserOrgOwner"] = members.IsUserOrgOwner(org.ID)
ctx.Data["MembersTwoFaStatus"] = members.GetTwoFaStatus()

ctx.HTML(200, tplMembers)
}
Expand Down
29 changes: 26 additions & 3 deletions routers/user/home.go
Original file line number Diff line number Diff line change
Expand Up @@ -537,14 +537,37 @@ func showOrgProfile(ctx *context.Context) {
return
}

if err := org.GetMembers(); err != nil {
ctx.ServerError("GetMembers", err)
var opts = models.FindOrgMembersOpts{
OrgID: org.ID,
PublicOnly: true,
Limit: 25,
}

if ctx.User != nil {
isMember, err := org.IsOrgMember(ctx.User.ID)
if err != nil {
ctx.Error(500, "IsOrgMember")
return
}
opts.PublicOnly = !isMember
}

members, _, err := models.FindOrgMembers(opts)
if err != nil {
ctx.ServerError("FindOrgMembers", err)
return
}

membersCount, err := models.CountOrgMembers(opts)
if err != nil {
ctx.ServerError("CountOrgMembers", err)
return
}

ctx.Data["Repos"] = repos
ctx.Data["Total"] = count
ctx.Data["Members"] = org.Members
ctx.Data["MembersTotal"] = membersCount
ctx.Data["Members"] = members
ctx.Data["Teams"] = org.Teams

pager := context.NewPagination(int(count), setting.UI.User.RepoPagingNum, page, 5)
Expand Down
2 changes: 2 additions & 0 deletions templates/org/member/members.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@
</div>
{{end}}
</div>

{{template "base/paginate" .}}
</div>
</div>
{{template "base/footer" .}}