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

profile.go 6.4 kB

10 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. // Copyright 2015 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package user
  5. import (
  6. "fmt"
  7. "path"
  8. "strings"
  9. "github.com/Unknwon/paginater"
  10. "code.gitea.io/gitea/models"
  11. "code.gitea.io/gitea/modules/base"
  12. "code.gitea.io/gitea/modules/context"
  13. "code.gitea.io/gitea/modules/setting"
  14. "code.gitea.io/gitea/routers/repo"
  15. )
  16. const (
  17. tplFollowers base.TplName = "user/meta/followers"
  18. tplStars base.TplName = "user/meta/stars"
  19. )
  20. // GetUserByName get user by name
  21. func GetUserByName(ctx *context.Context, name string) *models.User {
  22. user, err := models.GetUserByName(name)
  23. if err != nil {
  24. if models.IsErrUserNotExist(err) {
  25. ctx.Handle(404, "GetUserByName", nil)
  26. } else {
  27. ctx.Handle(500, "GetUserByName", err)
  28. }
  29. return nil
  30. }
  31. return user
  32. }
  33. // GetUserByParams returns user whose name is presented in URL paramenter.
  34. func GetUserByParams(ctx *context.Context) *models.User {
  35. return GetUserByName(ctx, ctx.Params(":username"))
  36. }
  37. // Profile render user's profile page
  38. func Profile(ctx *context.Context) {
  39. uname := ctx.Params(":username")
  40. // Special handle for FireFox requests favicon.ico.
  41. if uname == "favicon.ico" {
  42. ctx.ServeFile(path.Join(setting.StaticRootPath, "public/img/favicon.png"))
  43. return
  44. } else if strings.HasSuffix(uname, ".png") {
  45. ctx.Error(404)
  46. return
  47. }
  48. isShowKeys := false
  49. if strings.HasSuffix(uname, ".keys") {
  50. isShowKeys = true
  51. }
  52. ctxUser := GetUserByName(ctx, strings.TrimSuffix(uname, ".keys"))
  53. if ctx.Written() {
  54. return
  55. }
  56. // Show SSH keys.
  57. if isShowKeys {
  58. ShowSSHKeys(ctx, ctxUser.ID)
  59. return
  60. }
  61. if ctxUser.IsOrganization() {
  62. showOrgProfile(ctx)
  63. return
  64. }
  65. ctx.Data["Title"] = ctxUser.DisplayName()
  66. ctx.Data["PageIsUserProfile"] = true
  67. ctx.Data["Owner"] = ctxUser
  68. showPrivate := ctx.IsSigned && (ctx.User.IsAdmin || ctx.User.ID == ctxUser.ID)
  69. orgs, err := models.GetOrgsByUserID(ctxUser.ID, showPrivate)
  70. if err != nil {
  71. ctx.Handle(500, "GetOrgsByUserIDDesc", err)
  72. return
  73. }
  74. ctx.Data["Orgs"] = orgs
  75. tab := ctx.Query("tab")
  76. ctx.Data["TabName"] = tab
  77. page := ctx.QueryInt("page")
  78. if page <= 0 {
  79. page = 1
  80. }
  81. var (
  82. repos []*models.Repository
  83. count int64
  84. orderBy string
  85. )
  86. ctx.Data["SortType"] = ctx.Query("sort")
  87. switch ctx.Query("sort") {
  88. case "newest":
  89. orderBy = "created_unix DESC"
  90. case "oldest":
  91. orderBy = "created_unix ASC"
  92. case "recentupdate":
  93. orderBy = "updated_unix DESC"
  94. case "leastupdate":
  95. orderBy = "updated_unix ASC"
  96. case "reversealphabetically":
  97. orderBy = "name DESC"
  98. case "alphabetically":
  99. orderBy = "name ASC"
  100. default:
  101. ctx.Data["SortType"] = "recentupdate"
  102. orderBy = "updated_unix DESC"
  103. }
  104. // set default sort value if sort is empty.
  105. if ctx.Query("sort") == "" {
  106. ctx.Data["SortType"] = "recentupdate"
  107. }
  108. keyword := strings.Trim(ctx.Query("q"), " ")
  109. ctx.Data["Keyword"] = keyword
  110. switch tab {
  111. case "activity":
  112. retrieveFeeds(ctx, ctxUser, -1, 0, !showPrivate)
  113. if ctx.Written() {
  114. return
  115. }
  116. case "stars":
  117. ctx.Data["PageIsProfileStarList"] = true
  118. if len(keyword) == 0 {
  119. repos, err = ctxUser.GetStarredRepos(showPrivate, page, setting.UI.User.RepoPagingNum, orderBy)
  120. if err != nil {
  121. ctx.Handle(500, "GetStarredRepos", err)
  122. return
  123. }
  124. count, err = ctxUser.GetStarredRepoCount(showPrivate)
  125. if err != nil {
  126. ctx.Handle(500, "GetStarredRepoCount", err)
  127. return
  128. }
  129. } else {
  130. repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{
  131. Keyword: keyword,
  132. OwnerID: ctxUser.ID,
  133. OrderBy: orderBy,
  134. Private: showPrivate,
  135. Page: page,
  136. PageSize: setting.UI.User.RepoPagingNum,
  137. Starred: true,
  138. })
  139. if err != nil {
  140. ctx.Handle(500, "SearchRepositoryByName", err)
  141. return
  142. }
  143. }
  144. ctx.Data["Repos"] = repos
  145. ctx.Data["Page"] = paginater.New(int(count), setting.UI.User.RepoPagingNum, page, 5)
  146. ctx.Data["Total"] = count
  147. default:
  148. if len(keyword) == 0 {
  149. var total int
  150. repos, err = models.GetUserRepositories(ctxUser.ID, showPrivate, page, setting.UI.User.RepoPagingNum, orderBy)
  151. if err != nil {
  152. ctx.Handle(500, "GetRepositories", err)
  153. return
  154. }
  155. ctx.Data["Repos"] = repos
  156. if showPrivate {
  157. total = ctxUser.NumRepos
  158. } else {
  159. count, err := models.GetPublicRepositoryCount(ctxUser)
  160. if err != nil {
  161. ctx.Handle(500, "GetPublicRepositoryCount", err)
  162. return
  163. }
  164. total = int(count)
  165. }
  166. ctx.Data["Page"] = paginater.New(total, setting.UI.User.RepoPagingNum, page, 5)
  167. ctx.Data["Total"] = total
  168. } else {
  169. repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{
  170. Keyword: keyword,
  171. OwnerID: ctxUser.ID,
  172. OrderBy: orderBy,
  173. Private: showPrivate,
  174. Page: page,
  175. IsProfile: true,
  176. PageSize: setting.UI.User.RepoPagingNum,
  177. })
  178. if err != nil {
  179. ctx.Handle(500, "SearchRepositoryByName", err)
  180. return
  181. }
  182. ctx.Data["Repos"] = repos
  183. ctx.Data["Page"] = paginater.New(int(count), setting.UI.User.RepoPagingNum, page, 5)
  184. ctx.Data["Total"] = count
  185. }
  186. }
  187. ctx.HTML(200, tplProfile)
  188. }
  189. // Followers render user's followers page
  190. func Followers(ctx *context.Context) {
  191. u := GetUserByParams(ctx)
  192. if ctx.Written() {
  193. return
  194. }
  195. ctx.Data["Title"] = u.DisplayName()
  196. ctx.Data["CardsTitle"] = ctx.Tr("user.followers")
  197. ctx.Data["PageIsFollowers"] = true
  198. ctx.Data["Owner"] = u
  199. repo.RenderUserCards(ctx, u.NumFollowers, u.GetFollowers, tplFollowers)
  200. }
  201. // Following render user's followering page
  202. func Following(ctx *context.Context) {
  203. u := GetUserByParams(ctx)
  204. if ctx.Written() {
  205. return
  206. }
  207. ctx.Data["Title"] = u.DisplayName()
  208. ctx.Data["CardsTitle"] = ctx.Tr("user.following")
  209. ctx.Data["PageIsFollowing"] = true
  210. ctx.Data["Owner"] = u
  211. repo.RenderUserCards(ctx, u.NumFollowing, u.GetFollowing, tplFollowers)
  212. }
  213. // Action response for follow/unfollow user request
  214. func Action(ctx *context.Context) {
  215. u := GetUserByParams(ctx)
  216. if ctx.Written() {
  217. return
  218. }
  219. var err error
  220. switch ctx.Params(":action") {
  221. case "follow":
  222. err = models.FollowUser(ctx.User.ID, u.ID)
  223. case "unfollow":
  224. err = models.UnfollowUser(ctx.User.ID, u.ID)
  225. }
  226. if err != nil {
  227. ctx.Handle(500, fmt.Sprintf("Action (%s)", ctx.Params(":action")), err)
  228. return
  229. }
  230. redirectTo := ctx.Query("redirect_to")
  231. if len(redirectTo) == 0 {
  232. redirectTo = u.HomeLink()
  233. }
  234. ctx.Redirect(redirectTo)
  235. }