gitea源码

members.go 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // Copyright 2020 The Gitea Authors.
  3. // SPDX-License-Identifier: MIT
  4. package org
  5. import (
  6. "net/http"
  7. "code.gitea.io/gitea/models/organization"
  8. user_model "code.gitea.io/gitea/models/user"
  9. "code.gitea.io/gitea/modules/log"
  10. "code.gitea.io/gitea/modules/setting"
  11. "code.gitea.io/gitea/modules/templates"
  12. shared_user "code.gitea.io/gitea/routers/web/shared/user"
  13. "code.gitea.io/gitea/services/context"
  14. org_service "code.gitea.io/gitea/services/org"
  15. )
  16. const (
  17. // tplMembers template for organization members page
  18. tplMembers templates.TplName = "org/member/members"
  19. )
  20. // Members render organization users page
  21. func Members(ctx *context.Context) {
  22. org := ctx.Org.Organization
  23. ctx.Data["Title"] = org.FullName
  24. ctx.Data["PageIsOrgMembers"] = true
  25. page := max(ctx.FormInt("page"), 1)
  26. opts := &organization.FindOrgMembersOpts{
  27. Doer: ctx.Doer,
  28. OrgID: org.ID,
  29. }
  30. if ctx.Doer != nil {
  31. isMember, err := ctx.Org.Organization.IsOrgMember(ctx, ctx.Doer.ID)
  32. if err != nil {
  33. ctx.HTTPError(http.StatusInternalServerError, "IsOrgMember")
  34. return
  35. }
  36. opts.IsDoerMember = isMember
  37. }
  38. ctx.Data["PublicOnly"] = opts.PublicOnly()
  39. total, err := organization.CountOrgMembers(ctx, opts)
  40. if err != nil {
  41. ctx.HTTPError(http.StatusInternalServerError, "CountOrgMembers")
  42. return
  43. }
  44. if _, err := shared_user.RenderUserOrgHeader(ctx); err != nil {
  45. ctx.ServerError("RenderUserOrgHeader", err)
  46. return
  47. }
  48. pager := context.NewPagination(int(total), setting.UI.MembersPagingNum, page, 5)
  49. opts.ListOptions.Page = page
  50. opts.ListOptions.PageSize = setting.UI.MembersPagingNum
  51. members, membersIsPublic, err := organization.FindOrgMembers(ctx, opts)
  52. if err != nil {
  53. ctx.ServerError("GetMembers", err)
  54. return
  55. }
  56. ctx.Data["Page"] = pager
  57. ctx.Data["Members"] = members
  58. ctx.Data["MembersIsPublicMember"] = membersIsPublic
  59. ctx.Data["MembersIsUserOrgOwner"] = organization.IsUserOrgOwner(ctx, members, org.ID)
  60. ctx.Data["MembersTwoFaStatus"] = members.GetTwoFaStatus(ctx)
  61. ctx.HTML(http.StatusOK, tplMembers)
  62. }
  63. // MembersAction response for operation to a member of organization
  64. func MembersAction(ctx *context.Context) {
  65. member, err := user_model.GetUserByID(ctx, ctx.FormInt64("uid"))
  66. if err != nil {
  67. log.Error("GetUserByID: %v", err)
  68. }
  69. if member == nil {
  70. ctx.Redirect(ctx.Org.OrgLink + "/members")
  71. return
  72. }
  73. org := ctx.Org.Organization
  74. switch ctx.PathParam("action") {
  75. case "private":
  76. if ctx.Doer.ID != member.ID && !ctx.Org.IsOwner {
  77. ctx.HTTPError(http.StatusNotFound)
  78. return
  79. }
  80. err = organization.ChangeOrgUserStatus(ctx, org.ID, member.ID, false)
  81. case "public":
  82. if ctx.Doer.ID != member.ID && !ctx.Org.IsOwner {
  83. ctx.HTTPError(http.StatusNotFound)
  84. return
  85. }
  86. err = organization.ChangeOrgUserStatus(ctx, org.ID, member.ID, true)
  87. case "remove":
  88. if !ctx.Org.IsOwner {
  89. ctx.HTTPError(http.StatusNotFound)
  90. return
  91. }
  92. err = org_service.RemoveOrgUser(ctx, org, member)
  93. if organization.IsErrLastOrgOwner(err) {
  94. ctx.Flash.Error(ctx.Tr("form.last_org_owner"))
  95. ctx.JSONRedirect(ctx.Org.OrgLink + "/members")
  96. return
  97. }
  98. case "leave":
  99. err = org_service.RemoveOrgUser(ctx, org, ctx.Doer)
  100. if err == nil {
  101. ctx.Flash.Success(ctx.Tr("form.organization_leave_success", org.DisplayName()))
  102. ctx.JSON(http.StatusOK, map[string]any{
  103. "redirect": "", // keep the user stay on current page, in case they want to do other operations.
  104. })
  105. } else if organization.IsErrLastOrgOwner(err) {
  106. ctx.Flash.Error(ctx.Tr("form.last_org_owner"))
  107. ctx.JSONRedirect(ctx.Org.OrgLink + "/members")
  108. } else {
  109. log.Error("RemoveOrgUser(%d,%d): %v", org.ID, ctx.Doer.ID, err)
  110. }
  111. return
  112. }
  113. if err != nil {
  114. log.Error("Action(%s): %v", ctx.PathParam("action"), err)
  115. ctx.JSON(http.StatusOK, map[string]any{
  116. "ok": false,
  117. "err": err.Error(),
  118. })
  119. return
  120. }
  121. redirect := ctx.Org.OrgLink + "/members"
  122. if ctx.PathParam("action") == "leave" {
  123. redirect = setting.AppSubURL + "/"
  124. }
  125. ctx.JSONRedirect(redirect)
  126. }