You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

members.go 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // Copyright 2020 The Gitea Authors.
  3. // Use of this source code is governed by a MIT-style
  4. // license that can be found in the LICENSE file.
  5. package org
  6. import (
  7. "code.gitea.io/gitea/models"
  8. "code.gitea.io/gitea/modules/base"
  9. "code.gitea.io/gitea/modules/context"
  10. "code.gitea.io/gitea/modules/log"
  11. "code.gitea.io/gitea/modules/setting"
  12. "github.com/unknwon/com"
  13. )
  14. const (
  15. // tplMembers template for organization members page
  16. tplMembers base.TplName = "org/member/members"
  17. )
  18. // Members render organization users page
  19. func Members(ctx *context.Context) {
  20. org := ctx.Org.Organization
  21. ctx.Data["Title"] = org.FullName
  22. ctx.Data["PageIsOrgMembers"] = true
  23. page := ctx.QueryInt("page")
  24. if page <= 1 {
  25. page = 1
  26. }
  27. var opts = models.FindOrgMembersOpts{
  28. OrgID: org.ID,
  29. PublicOnly: true,
  30. }
  31. if ctx.User != nil {
  32. isMember, err := ctx.Org.Organization.IsOrgMember(ctx.User.ID)
  33. if err != nil {
  34. ctx.Error(500, "IsOrgMember")
  35. return
  36. }
  37. opts.PublicOnly = !isMember && !ctx.User.IsAdmin
  38. }
  39. total, err := models.CountOrgMembers(opts)
  40. if err != nil {
  41. ctx.Error(500, "CountOrgMembers")
  42. return
  43. }
  44. pager := context.NewPagination(int(total), setting.UI.MembersPagingNum, page, 5)
  45. opts.ListOptions.Page = page
  46. opts.ListOptions.PageSize = setting.UI.MembersPagingNum
  47. members, membersIsPublic, err := models.FindOrgMembers(&opts)
  48. if err != nil {
  49. ctx.ServerError("GetMembers", err)
  50. return
  51. }
  52. ctx.Data["Page"] = pager
  53. ctx.Data["Members"] = members
  54. ctx.Data["MembersIsPublicMember"] = membersIsPublic
  55. ctx.Data["MembersIsUserOrgOwner"] = members.IsUserOrgOwner(org.ID)
  56. ctx.Data["MembersTwoFaStatus"] = members.GetTwoFaStatus()
  57. ctx.HTML(200, tplMembers)
  58. }
  59. // MembersAction response for operation to a member of organization
  60. func MembersAction(ctx *context.Context) {
  61. uid := com.StrTo(ctx.Query("uid")).MustInt64()
  62. if uid == 0 {
  63. ctx.Redirect(ctx.Org.OrgLink + "/members")
  64. return
  65. }
  66. org := ctx.Org.Organization
  67. var err error
  68. switch ctx.Params(":action") {
  69. case "private":
  70. if ctx.User.ID != uid && !ctx.Org.IsOwner {
  71. ctx.Error(404)
  72. return
  73. }
  74. err = models.ChangeOrgUserStatus(org.ID, uid, false)
  75. case "public":
  76. if ctx.User.ID != uid && !ctx.Org.IsOwner {
  77. ctx.Error(404)
  78. return
  79. }
  80. err = models.ChangeOrgUserStatus(org.ID, uid, true)
  81. case "remove":
  82. if !ctx.Org.IsOwner {
  83. ctx.Error(404)
  84. return
  85. }
  86. err = org.RemoveMember(uid)
  87. if models.IsErrLastOrgOwner(err) {
  88. ctx.Flash.Error(ctx.Tr("form.last_org_owner"))
  89. ctx.Redirect(ctx.Org.OrgLink + "/members")
  90. return
  91. }
  92. case "leave":
  93. err = org.RemoveMember(ctx.User.ID)
  94. if models.IsErrLastOrgOwner(err) {
  95. ctx.Flash.Error(ctx.Tr("form.last_org_owner"))
  96. ctx.Redirect(ctx.Org.OrgLink + "/members")
  97. return
  98. }
  99. }
  100. if err != nil {
  101. log.Error("Action(%s): %v", ctx.Params(":action"), err)
  102. ctx.JSON(200, map[string]interface{}{
  103. "ok": false,
  104. "err": err.Error(),
  105. })
  106. return
  107. }
  108. if ctx.Params(":action") != "leave" {
  109. ctx.Redirect(ctx.Org.OrgLink + "/members")
  110. } else {
  111. ctx.Redirect(setting.AppSubURL + "/")
  112. }
  113. }