]> source.dussan.org Git - gitea.git/commitdiff
Only show part of members on orgnization dashboard and add paging for orgnization...
authorLunny Xiao <xiaolunwen@gmail.com>
Fri, 6 Dec 2019 05:34:54 +0000 (13:34 +0800)
committerGitHub <noreply@github.com>
Fri, 6 Dec 2019 05:34:54 +0000 (13:34 +0800)
* Only show part of members on orgnization dashboard and add paging for orgnization members page

* fix test

* fix typo

docs/content/doc/advanced/config-cheat-sheet.en-us.md
docs/content/doc/advanced/config-cheat-sheet.zh-cn.md
models/org.go
models/org_test.go
modules/setting/setting.go
routers/api/v1/org/member.go
routers/org/members.go
routers/user/home.go
templates/org/member/members.tmpl

index 4fc8511b8c62c52dde19bbf355c4dc837109e3f7..9f02e888cf3909604808bcfee2d583a7b69fe055 100644 (file)
@@ -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.
index 7940e8e1f968112ca6c02fa62e55a8781dc23beb..0f5d300e378b9a4b4d587f87ead0969635ce8e61 100644 (file)
@@ -37,6 +37,7 @@ menu:
 
 - `EXPLORE_PAGING_NUM`: 探索页面每页显示的仓库数量。
 - `ISSUE_PAGING_NUM`: 工单页面每页显示的工单数量。
+- `MEMBERS_PAGING_NUM`: **20**: 组织成员页面每页显示的成员数量。
 - `FEED_MAX_COMMIT_NUM`: 活动流页面显示的最大提交数量。
 
 ### UI - Admin (`ui.admin`)
index f14dad1dbb625e50984f6da70f1f2a3d4ee09870..dbc71761f25a0372cec08e63bfac9de196db2ea4 100644 (file)
@@ -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))
@@ -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.
@@ -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
 }
 
index 1a6b288dc75dd2bc840fccb3e98df29eb1740097..ac1a23991795e16d2a47058befeb5b5e56c823f0 100644 (file)
@@ -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{
@@ -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)
 }
index a97ab94677e5352f384e577c2ad12a5076b614dd..c08621df581a72969ff8e46105eb7e80dc8b42f6 100644 (file)
@@ -159,6 +159,7 @@ var (
                ExplorePagingNum      int
                IssuePagingNum        int
                RepoSearchPagingNum   int
+               MembersPagingNum      int
                FeedMaxCommitNum      int
                GraphMaxCommitNum     int
                CodeCommentLines      int
@@ -191,6 +192,7 @@ var (
                ExplorePagingNum:    20,
                IssuePagingNum:      10,
                RepoSearchPagingNum: 10,
+               MembersPagingNum:    20,
                FeedMaxCommitNum:    5,
                GraphMaxCommitNum:   100,
                CodeCommentLines:    4,
index be47b6963fb4929551b6d727cb58fdc53ab6fd7a..45519e56062a7565e8d256445b6bb9124af566e7 100644 (file)
@@ -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))
index f9cb275e832ec08b6bd182a3d487364cc47e9ea8..b9805c2c035a4954cf45417e84c0cb0b8e651172 100644 (file)
@@ -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)
 }
index 8465216bcf04ad049dcc8918a1a75fe25b513096..2eff889105ab2dc26340d5b99fc057b6b0823dd6 100644 (file)
@@ -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)
index 9db506ee5bf9d1106a943cdd24de9738e097de8e..03aadf97b83107278954ae84e0590ab5255417dc 100644 (file)
@@ -57,6 +57,8 @@
                                </div>
                        {{end}}
                </div>
+
+               {{template "base/paginate" .}}
        </div>
 </div>
 {{template "base/footer" .}}