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.

home.go 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package org
  4. import (
  5. "net/http"
  6. "strings"
  7. "code.gitea.io/gitea/models/db"
  8. "code.gitea.io/gitea/models/organization"
  9. repo_model "code.gitea.io/gitea/models/repo"
  10. user_model "code.gitea.io/gitea/models/user"
  11. "code.gitea.io/gitea/modules/base"
  12. "code.gitea.io/gitea/modules/context"
  13. "code.gitea.io/gitea/modules/markup"
  14. "code.gitea.io/gitea/modules/markup/markdown"
  15. "code.gitea.io/gitea/modules/setting"
  16. )
  17. const (
  18. tplOrgHome base.TplName = "org/home"
  19. )
  20. // Home show organization home page
  21. func Home(ctx *context.Context) {
  22. uname := ctx.Params(":username")
  23. if strings.HasSuffix(uname, ".keys") || strings.HasSuffix(uname, ".gpg") {
  24. ctx.NotFound("", nil)
  25. return
  26. }
  27. ctx.SetParams(":org", uname)
  28. context.HandleOrgAssignment(ctx)
  29. if ctx.Written() {
  30. return
  31. }
  32. org := ctx.Org.Organization
  33. ctx.Data["PageIsUserProfile"] = true
  34. ctx.Data["Title"] = org.DisplayName()
  35. if len(org.Description) != 0 {
  36. desc, err := markdown.RenderString(&markup.RenderContext{
  37. Ctx: ctx,
  38. URLPrefix: ctx.Repo.RepoLink,
  39. Metas: map[string]string{"mode": "document"},
  40. GitRepo: ctx.Repo.GitRepo,
  41. }, org.Description)
  42. if err != nil {
  43. ctx.ServerError("RenderString", err)
  44. return
  45. }
  46. ctx.Data["RenderedDescription"] = desc
  47. }
  48. var orderBy db.SearchOrderBy
  49. ctx.Data["SortType"] = ctx.FormString("sort")
  50. switch ctx.FormString("sort") {
  51. case "newest":
  52. orderBy = db.SearchOrderByNewest
  53. case "oldest":
  54. orderBy = db.SearchOrderByOldest
  55. case "recentupdate":
  56. orderBy = db.SearchOrderByRecentUpdated
  57. case "leastupdate":
  58. orderBy = db.SearchOrderByLeastUpdated
  59. case "reversealphabetically":
  60. orderBy = db.SearchOrderByAlphabeticallyReverse
  61. case "alphabetically":
  62. orderBy = db.SearchOrderByAlphabetically
  63. case "moststars":
  64. orderBy = db.SearchOrderByStarsReverse
  65. case "feweststars":
  66. orderBy = db.SearchOrderByStars
  67. case "mostforks":
  68. orderBy = db.SearchOrderByForksReverse
  69. case "fewestforks":
  70. orderBy = db.SearchOrderByForks
  71. default:
  72. ctx.Data["SortType"] = "recentupdate"
  73. orderBy = db.SearchOrderByRecentUpdated
  74. }
  75. keyword := ctx.FormTrim("q")
  76. ctx.Data["Keyword"] = keyword
  77. language := ctx.FormTrim("language")
  78. ctx.Data["Language"] = language
  79. page := ctx.FormInt("page")
  80. if page <= 0 {
  81. page = 1
  82. }
  83. var (
  84. repos []*repo_model.Repository
  85. count int64
  86. err error
  87. )
  88. repos, count, err = repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{
  89. ListOptions: db.ListOptions{
  90. PageSize: setting.UI.User.RepoPagingNum,
  91. Page: page,
  92. },
  93. Keyword: keyword,
  94. OwnerID: org.ID,
  95. OrderBy: orderBy,
  96. Private: ctx.IsSigned,
  97. Actor: ctx.Doer,
  98. Language: language,
  99. IncludeDescription: setting.UI.SearchRepoDescription,
  100. })
  101. if err != nil {
  102. ctx.ServerError("SearchRepository", err)
  103. return
  104. }
  105. opts := &organization.FindOrgMembersOpts{
  106. OrgID: org.ID,
  107. PublicOnly: true,
  108. ListOptions: db.ListOptions{Page: 1, PageSize: 25},
  109. }
  110. if ctx.Doer != nil {
  111. isMember, err := org.IsOrgMember(ctx.Doer.ID)
  112. if err != nil {
  113. ctx.Error(http.StatusInternalServerError, "IsOrgMember")
  114. return
  115. }
  116. opts.PublicOnly = !isMember && !ctx.Doer.IsAdmin
  117. }
  118. members, _, err := organization.FindOrgMembers(opts)
  119. if err != nil {
  120. ctx.ServerError("FindOrgMembers", err)
  121. return
  122. }
  123. membersCount, err := organization.CountOrgMembers(opts)
  124. if err != nil {
  125. ctx.ServerError("CountOrgMembers", err)
  126. return
  127. }
  128. var isFollowing bool
  129. if ctx.Doer != nil {
  130. isFollowing = user_model.IsFollowing(ctx.Doer.ID, ctx.ContextUser.ID)
  131. }
  132. ctx.Data["Repos"] = repos
  133. ctx.Data["Total"] = count
  134. ctx.Data["MembersTotal"] = membersCount
  135. ctx.Data["Members"] = members
  136. ctx.Data["Teams"] = ctx.Org.Teams
  137. ctx.Data["DisableNewPullMirrors"] = setting.Mirror.DisableNewPull
  138. ctx.Data["PageIsViewRepositories"] = true
  139. ctx.Data["IsFollowing"] = isFollowing
  140. pager := context.NewPagination(int(count), setting.UI.User.RepoPagingNum, page, 5)
  141. pager.SetDefaultParams(ctx)
  142. pager.AddParam(ctx, "language", "Language")
  143. ctx.Data["Page"] = pager
  144. ctx.Data["ContextUser"] = ctx.ContextUser
  145. ctx.HTML(http.StatusOK, tplOrgHome)
  146. }