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.

home.go 30 kB

11 years ago
11 years ago
11 years ago
3 years ago
11 years ago
11 years ago
4 years ago
3 years ago
3 years ago
5 years ago
3 years ago
3 years ago
3 years ago
5 years ago
11 years ago
3 years ago
3 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
Restricted users (#6274) * Restricted users (#4334): initial implementation * Add User.IsRestricted & UI to edit it * Pass user object instead of user id to places where IsRestricted flag matters * Restricted users: maintain access rows for all referenced repos (incl public) * Take logged in user & IsRestricted flag into account in org/repo listings, searches and accesses * Add basic repo access tests for restricted users Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Mention restricted users in the faq Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert unnecessary change `.isUserPartOfOrg` -> `.IsUserPartOfOrg` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Remove unnecessary `org.IsOrganization()` call Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert to an `int64` keyed `accessMap` * Add type `userAccess` * Add convenience func updateUserAccess() * Turn accessMap into a `map[int64]userAccess` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * or even better: `map[int64]*userAccess` * updateUserAccess(): use tighter syntax as suggested by lafriks * even tighter * Avoid extra loop * Don't disclose limited orgs to unauthenticated users * Don't assume block only applies to orgs * Use an array of `VisibleType` for filtering * fix yet another thinko * Ok - no need for u * Revert "Ok - no need for u" This reverts commit 5c3e886aabd5acd997a3b35687d322439732c200. Co-authored-by: Antoine GIRARD <sapk@users.noreply.github.com> Co-authored-by: Lauris BH <lauris@nix.lv>
5 years ago
4 years ago
4 years ago
4 years ago
4 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
Restricted users (#6274) * Restricted users (#4334): initial implementation * Add User.IsRestricted & UI to edit it * Pass user object instead of user id to places where IsRestricted flag matters * Restricted users: maintain access rows for all referenced repos (incl public) * Take logged in user & IsRestricted flag into account in org/repo listings, searches and accesses * Add basic repo access tests for restricted users Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Mention restricted users in the faq Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert unnecessary change `.isUserPartOfOrg` -> `.IsUserPartOfOrg` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Remove unnecessary `org.IsOrganization()` call Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert to an `int64` keyed `accessMap` * Add type `userAccess` * Add convenience func updateUserAccess() * Turn accessMap into a `map[int64]userAccess` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * or even better: `map[int64]*userAccess` * updateUserAccess(): use tighter syntax as suggested by lafriks * even tighter * Avoid extra loop * Don't disclose limited orgs to unauthenticated users * Don't assume block only applies to orgs * Use an array of `VisibleType` for filtering * fix yet another thinko * Ok - no need for u * Revert "Ok - no need for u" This reverts commit 5c3e886aabd5acd997a3b35687d322439732c200. Co-authored-by: Antoine GIRARD <sapk@users.noreply.github.com> Co-authored-by: Lauris BH <lauris@nix.lv>
5 years ago
11 years ago
4 years ago
11 years ago
11 years ago
4 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
API add/generalize pagination (#9452) * paginate results * fixed deadlock * prevented breaking change * updated swagger * go fmt * fixed find topic * go mod tidy * go mod vendor with go1.13.5 * fixed repo find topics * fixed unit test * added Limit method to Engine struct; use engine variable when provided; fixed gitignore * use ItemsPerPage for default pagesize; fix GetWatchers, getOrgUsersByOrgID and GetStargazers; fix GetAllCommits headers; reverted some changed behaviors * set Page value on Home route * improved memory allocations * fixed response headers * removed logfiles * fixed import order * import order * improved swagger * added function to get models.ListOptions from context * removed pagesize diff on unit test * fixed imports * removed unnecessary struct field * fixed go fmt * scoped PR * code improvements * code improvements * go mod tidy * fixed import order * fixed commit statuses session * fixed files headers * fixed headers; added pagination for notifications * go mod tidy * go fmt * removed Private from user search options; added setting.UI.IssuePagingNum as default valeu on repo's issues list * Apply suggestions from code review Co-Authored-By: 6543 <6543@obermui.de> Co-Authored-By: zeripath <art27@cantab.net> * fixed build error * CI.restart() * fixed merge conflicts resolve * fixed conflicts resolve * improved FindTrackedTimesOptions.ToOptions() method * added backwards compatibility on ListReleases request; fixed issue tracked time ToSession * fixed build error; fixed swagger template * fixed swagger template * fixed ListReleases backwards compatibility * added page to user search route Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: zeripath <art27@cantab.net>
5 years ago
11 years ago
3 years ago
Restricted users (#6274) * Restricted users (#4334): initial implementation * Add User.IsRestricted & UI to edit it * Pass user object instead of user id to places where IsRestricted flag matters * Restricted users: maintain access rows for all referenced repos (incl public) * Take logged in user & IsRestricted flag into account in org/repo listings, searches and accesses * Add basic repo access tests for restricted users Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Mention restricted users in the faq Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert unnecessary change `.isUserPartOfOrg` -> `.IsUserPartOfOrg` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Remove unnecessary `org.IsOrganization()` call Signed-off-by: Manush Dodunekov <manush@stendahls.se> * Revert to an `int64` keyed `accessMap` * Add type `userAccess` * Add convenience func updateUserAccess() * Turn accessMap into a `map[int64]userAccess` Signed-off-by: Manush Dodunekov <manush@stendahls.se> * or even better: `map[int64]*userAccess` * updateUserAccess(): use tighter syntax as suggested by lafriks * even tighter * Avoid extra loop * Don't disclose limited orgs to unauthenticated users * Don't assume block only applies to orgs * Use an array of `VisibleType` for filtering * fix yet another thinko * Ok - no need for u * Revert "Ok - no need for u" This reverts commit 5c3e886aabd5acd997a3b35687d322439732c200. Co-authored-by: Antoine GIRARD <sapk@users.noreply.github.com> Co-authored-by: Lauris BH <lauris@nix.lv>
5 years ago
4 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // Copyright 2019 The Gitea Authors. All rights reserved.
  3. // Use of this source code is governed by a MIT-style
  4. // license that can be found in the LICENSE file.
  5. package routers
  6. import (
  7. "bytes"
  8. "code.gitea.io/gitea/routers/response"
  9. "encoding/json"
  10. "net/http"
  11. "strconv"
  12. "strings"
  13. "code.gitea.io/gitea/services/repository"
  14. "code.gitea.io/gitea/models"
  15. "code.gitea.io/gitea/modules/base"
  16. "code.gitea.io/gitea/modules/context"
  17. code_indexer "code.gitea.io/gitea/modules/indexer/code"
  18. "code.gitea.io/gitea/modules/log"
  19. "code.gitea.io/gitea/modules/setting"
  20. "code.gitea.io/gitea/modules/structs"
  21. "code.gitea.io/gitea/modules/util"
  22. "code.gitea.io/gitea/routers/user"
  23. )
  24. const (
  25. // tplHome home page template
  26. tplHome base.TplName = "home"
  27. // tplExploreRepos explore repositories page template
  28. tplExploreRepos base.TplName = "explore/repos"
  29. // tplExploreDataset explore datasets page template
  30. tplExploreDataset base.TplName = "explore/datasets"
  31. // tplExploreUsers explore users page template
  32. tplExploreUsers base.TplName = "explore/users"
  33. // tplExploreOrganizations explore organizations page template
  34. tplExploreOrganizations base.TplName = "explore/organizations"
  35. // tplExploreCode explore code page template
  36. tplExploreCode base.TplName = "explore/code"
  37. tplExploreImages base.TplName = "explore/images"
  38. tplExploreExploreDataAnalysis base.TplName = "explore/data_analysis"
  39. tplHomeTerm base.TplName = "terms"
  40. tplHomePrivacy base.TplName = "privacy"
  41. tplResoruceDesc base.TplName = "resource_desc"
  42. tplRepoSquare base.TplName = "explore/repos/square"
  43. tplRepoSearch base.TplName = "explore/repos/search"
  44. )
  45. // Home render home page
  46. func Home(ctx *context.Context) {
  47. ctx.Data["PageIsHome"] = true
  48. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  49. setRecommendURL(ctx)
  50. ctx.HTML(200, tplHome)
  51. }
  52. func setRecommendURLOnly(ctx *context.Context) {
  53. addr := setting.RecommentRepoAddr[10:]
  54. start := strings.Index(addr, "/")
  55. end := strings.Index(addr, "raw")
  56. if start != -1 && end != -1 {
  57. ctx.Data["RecommendURL"] = addr[start:end]
  58. } else {
  59. ctx.Data["RecommendURL"] = setting.RecommentRepoAddr
  60. }
  61. }
  62. func setRecommendURL(ctx *context.Context) {
  63. setRecommendURLOnly(ctx)
  64. ctx.Data["page_title"] = ctx.Tr("home.page_title")
  65. ctx.Data["page_small_title"] = ctx.Tr("home.page_small_title")
  66. ctx.Data["page_description"] = ctx.Tr("home.page_description")
  67. ctx.Data["page_use"] = ctx.Tr("home.page_use")
  68. ctx.Data["page_only_dynamic"] = ctx.Tr("home.page_only_dynamic")
  69. ctx.Data["page_recommend_org"] = ctx.Tr("home.page_recommend_org")
  70. ctx.Data["page_recommend_org_desc"] = ctx.Tr("home.page_recommend_org_desc")
  71. ctx.Data["page_recommend_org_commit"] = ctx.Tr("home.page_recommend_org_commit")
  72. ctx.Data["page_recommend_org_more"] = ctx.Tr("home.page_recommend_org_more")
  73. ctx.Data["page_recommend_repo"] = ctx.Tr("home.page_recommend_repo")
  74. ctx.Data["page_recommend_repo_desc"] = ctx.Tr("home.page_recommend_repo_desc")
  75. ctx.Data["page_recommend_repo_commit"] = ctx.Tr("home.page_recommend_repo_commit")
  76. ctx.Data["page_recommend_repo_go"] = ctx.Tr("home.page_recommend_repo_go")
  77. ctx.Data["page_recommend_repo_more"] = ctx.Tr("home.page_recommend_repo_more")
  78. ctx.Data["page_dev_env"] = ctx.Tr("home.page_dev_env")
  79. ctx.Data["page_dev_env_desc"] = ctx.Tr("home.page_dev_env_desc")
  80. ctx.Data["page_dev_env_desc_title"] = ctx.Tr("home.page_dev_env_desc_title")
  81. ctx.Data["page_dev_env_desc_desc"] = ctx.Tr("home.page_dev_env_desc_desc")
  82. ctx.Data["page_dev_env_desc1_title"] = ctx.Tr("home.page_dev_env_desc1_title")
  83. ctx.Data["page_dev_env_desc1_desc"] = ctx.Tr("home.page_dev_env_desc1_desc")
  84. ctx.Data["page_dev_env_desc2_title"] = ctx.Tr("home.page_dev_env_desc2_title")
  85. ctx.Data["page_dev_env_desc2_desc"] = ctx.Tr("home.page_dev_env_desc2_desc")
  86. ctx.Data["page_dev_env_desc3_title"] = ctx.Tr("home.page_dev_env_desc3_title")
  87. ctx.Data["page_dev_env_desc3_desc"] = ctx.Tr("home.page_dev_env_desc3_desc")
  88. ctx.Data["page_dev_yunlao"] = ctx.Tr("home.page_dev_yunlao")
  89. ctx.Data["page_dev_yunlao_desc1"] = ctx.Tr("home.page_dev_yunlao_desc1")
  90. ctx.Data["page_dev_yunlao_desc2"] = ctx.Tr("home.page_dev_yunlao_desc2")
  91. ctx.Data["page_dev_yunlao_desc3"] = ctx.Tr("home.page_dev_yunlao_desc3")
  92. ctx.Data["page_dev_yunlao_desc4"] = ctx.Tr("home.page_dev_yunlao_desc4")
  93. ctx.Data["page_dev_yunlao_desc5"] = ctx.Tr("home.page_dev_yunlao_desc5")
  94. ctx.Data["page_dev_yunlao_apply"] = ctx.Tr("home.page_dev_yunlao_apply")
  95. ctx.Data["page_recommend_activity"] = ctx.Tr("home.page_recommend_activity")
  96. ctx.Data["page_recommend_activity_desc"] = ctx.Tr("home.page_recommend_activity_desc")
  97. }
  98. func Dashboard(ctx *context.Context) {
  99. if ctx.IsSigned {
  100. pictureInfo, err := getImageInfo("dashboard-picture")
  101. if err == nil && len(pictureInfo) > 0 {
  102. log.Info("set image info=" + pictureInfo[0]["url"])
  103. ctx.Data["image_url"] = pictureInfo[0]["url"]
  104. ctx.Data["image_link"] = pictureInfo[0]["image_link"]
  105. if len(pictureInfo) > 1 {
  106. ctx.Data["invite_image_url"] = pictureInfo[1]["url"]
  107. ctx.Data["invite_image_link"] = pictureInfo[1]["image_link"]
  108. }
  109. }
  110. if !ctx.User.IsActive && setting.Service.RegisterEmailConfirm {
  111. ctx.Data["Title"] = ctx.Tr("auth.active_your_account")
  112. ctx.HTML(200, user.TplActivate)
  113. } else if !ctx.User.IsActive || ctx.User.ProhibitLogin {
  114. log.Info("Failed authentication attempt for %s from %s", ctx.User.Name, ctx.RemoteAddr())
  115. ctx.Data["Title"] = ctx.Tr("auth.prohibit_login")
  116. ctx.HTML(200, "user/auth/prohibit_login")
  117. } else if ctx.User.MustChangePassword {
  118. ctx.Data["Title"] = ctx.Tr("auth.must_change_password")
  119. ctx.Data["ChangePasscodeLink"] = setting.AppSubURL + "/user/change_password"
  120. ctx.SetCookie("redirect_to", setting.AppSubURL+ctx.Req.URL.RequestURI(), 0, setting.AppSubURL)
  121. ctx.Redirect(setting.AppSubURL + "/user/settings/change_password")
  122. } else if setting.PhoneService.Enabled && ctx.User.IsActive && ctx.User.PhoneNumber == "" {
  123. ctx.Data["Title"] = ctx.Tr("phone.bind_phone")
  124. ctx.HTML(200, "user/auth/bind_phone")
  125. return
  126. } else {
  127. user.Dashboard(ctx)
  128. }
  129. return
  130. // Check non-logged users landing page.
  131. } else if setting.LandingPageURL != setting.LandingPageHome {
  132. ctx.Redirect(setting.AppSubURL + string(setting.LandingPageURL))
  133. return
  134. }
  135. // Check auto-login.
  136. uname := ctx.GetCookie(setting.CookieUserName)
  137. if len(uname) != 0 {
  138. ctx.Redirect(setting.AppSubURL + "/user/login")
  139. return
  140. }
  141. setRecommendURL(ctx)
  142. ctx.Data["PageIsHome"] = true
  143. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  144. ctx.HTML(200, tplHome)
  145. }
  146. // RepoSearchOptions when calling search repositories
  147. type RepoSearchOptions struct {
  148. OwnerID int64
  149. Private bool
  150. Restricted bool
  151. PageSize int
  152. TplName base.TplName
  153. Course util.OptionalBool
  154. }
  155. var (
  156. nullByte = []byte{0x00}
  157. )
  158. func isKeywordValid(keyword string) bool {
  159. return !bytes.Contains([]byte(keyword), nullByte)
  160. }
  161. // RenderRepoSearch render repositories search page
  162. func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) {
  163. page := ctx.QueryInt("page")
  164. if page <= 0 {
  165. page = 1
  166. }
  167. var (
  168. repos []*models.Repository
  169. count int64
  170. err error
  171. orderBy models.SearchOrderBy
  172. )
  173. ctx.Data["SortType"] = ctx.Query("sort")
  174. switch ctx.Query("sort") {
  175. case "newest":
  176. orderBy = models.SearchOrderByNewest
  177. case "oldest":
  178. orderBy = models.SearchOrderByOldest
  179. case "recentupdate":
  180. orderBy = models.SearchOrderByRecentUpdated
  181. case "leastupdate":
  182. orderBy = models.SearchOrderByLeastUpdated
  183. case "reversealphabetically":
  184. orderBy = models.SearchOrderByAlphabeticallyReverse
  185. case "alphabetically":
  186. orderBy = models.SearchOrderByAlphabetically
  187. case "reversesize":
  188. orderBy = models.SearchOrderBySizeReverse
  189. case "size":
  190. orderBy = models.SearchOrderBySize
  191. case "moststars":
  192. orderBy = models.SearchOrderByStarsReverse
  193. case "feweststars":
  194. orderBy = models.SearchOrderByStars
  195. case "mostforks":
  196. orderBy = models.SearchOrderByForksReverse
  197. case "fewestforks":
  198. orderBy = models.SearchOrderByForks
  199. case "hot":
  200. orderBy = models.SearchOrderByHot
  201. case "active":
  202. orderBy = models.SearchOrderByActive
  203. default:
  204. ctx.Data["SortType"] = "hot"
  205. orderBy = models.SearchOrderByHot
  206. }
  207. orderBy = orderBy + ",id"
  208. //todo:support other topics
  209. keyword := strings.Trim(ctx.Query("q"), " ")
  210. topic := strings.Trim(ctx.Query("topic"), " ")
  211. repos, count, err = models.SearchRepository(&models.SearchRepoOptions{
  212. ListOptions: models.ListOptions{
  213. Page: page,
  214. PageSize: opts.PageSize,
  215. },
  216. Actor: ctx.User,
  217. OrderBy: orderBy,
  218. Private: opts.Private,
  219. Keyword: keyword,
  220. OwnerID: opts.OwnerID,
  221. AllPublic: true,
  222. AllLimited: true,
  223. TopicName: topic,
  224. IncludeDescription: setting.UI.SearchRepoDescription,
  225. Course: opts.Course,
  226. })
  227. if err != nil {
  228. ctx.ServerError("SearchRepository", err)
  229. return
  230. }
  231. for _, repo := range repos {
  232. repo.Hot = int64(repo.NumWatches) + int64(repo.NumStars) + int64(repo.NumForks) + int64(repo.CloneCnt)
  233. repo.Active = int64(repo.NumIssues) + int64(repo.NumPulls) + int64(repo.NumCommit)
  234. }
  235. ctx.Data["Keyword"] = keyword
  236. ctx.Data["Topic"] = topic
  237. ctx.Data["Total"] = count
  238. ctx.Data["Repos"] = repos
  239. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  240. pager := context.NewPagination(int(count), opts.PageSize, page, 5)
  241. pager.SetDefaultParams(ctx)
  242. pager.AddParam(ctx, "topic", "TopicOnly")
  243. ctx.Data["Page"] = pager
  244. recommendOrgs, err := models.GetRecommendOrgInfos()
  245. if err != nil {
  246. log.Error("GetRecommendOrgInfos failed:%v", err.Error(), ctx.Data["MsgID"])
  247. ctx.ServerError("GetRecommendOrgInfos", err)
  248. return
  249. }
  250. ctx.Data["RecommendOrgs"] = recommendOrgs
  251. ctx.HTML(http.StatusOK, opts.TplName)
  252. }
  253. // ExploreRepos render explore repositories page
  254. func ExploreRepos(ctx *context.Context) {
  255. ctx.Data["Title"] = ctx.Tr("explore")
  256. ctx.Data["PageIsExplore"] = true
  257. ctx.Data["PageIsExploreRepositories"] = true
  258. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  259. pictureInfo, err := getImageInfo("explore-user-picture")
  260. if err == nil && len(pictureInfo) > 0 {
  261. ctx.Data["image_url"] = pictureInfo[0]["url"]
  262. ctx.Data["image_link"] = pictureInfo[0]["image_link"]
  263. }
  264. var ownerID int64
  265. if ctx.User != nil && !ctx.User.IsAdmin {
  266. ownerID = ctx.User.ID
  267. }
  268. RenderRepoSearch(ctx, &RepoSearchOptions{
  269. PageSize: setting.UI.ExplorePagingNum,
  270. OwnerID: ownerID,
  271. Private: ctx.User != nil,
  272. TplName: tplExploreRepos,
  273. })
  274. }
  275. func GetRepoSquarePage(ctx *context.Context) {
  276. ctx.Data["SquareBanners"] = repository.GetBanners()
  277. ctx.Data["SquareTopics"] = repository.GetTopics()
  278. ctx.Data["SquareRecommendRepos"] = repository.GetRecommendRepos()
  279. repos, _ := repository.GetPreferredRepos()
  280. ctx.Data["SquarePreferredRepos"] = repos
  281. ctx.HTML(200, tplRepoSquare)
  282. }
  283. func GetRepoSearchPage(ctx *context.Context) {
  284. ctx.Data["SquareTopics"] = repository.GetTopics()
  285. ctx.HTML(200, tplRepoSearch)
  286. }
  287. func RepoSquare(ctx *context.Context) {
  288. var result []*models.Repository4Card
  289. var err error
  290. switch ctx.Query("type") {
  291. case "preferred":
  292. result, err = repository.GetPreferredRepos()
  293. case "incubation":
  294. result, err = repository.GetIncubationRepos()
  295. case "hot-paper":
  296. result, err = repository.GetHotPaperRepos()
  297. default:
  298. result, err = repository.GetPreferredRepos()
  299. }
  300. if err != nil {
  301. ctx.JSON(http.StatusOK, response.ResponseError(err))
  302. return
  303. }
  304. resultMap := make(map[string]interface{}, 0)
  305. resultMap["Repos"] = result
  306. ctx.JSON(http.StatusOK, response.SuccessWithData(resultMap))
  307. }
  308. func ActiveUser(ctx *context.Context) {
  309. var err error
  310. var currentUserId int64
  311. if ctx.User != nil {
  312. currentUserId = ctx.User.ID
  313. }
  314. result, err := repository.GetActiveUser4Square(currentUserId)
  315. if err != nil {
  316. log.Error("ActiveUser err. %v", err)
  317. ctx.JSON(http.StatusOK, response.Success())
  318. return
  319. }
  320. resultMap := make(map[string]interface{}, 0)
  321. resultMap["Users"] = result
  322. ctx.JSON(http.StatusOK, response.SuccessWithData(resultMap))
  323. }
  324. func ActiveOrg(ctx *context.Context) {
  325. result, err := repository.GetActiveOrgs()
  326. if err != nil {
  327. log.Error("ActiveOrg err. %v", err)
  328. ctx.JSON(http.StatusOK, response.Success())
  329. return
  330. }
  331. resultMap := make(map[string]interface{}, 0)
  332. resultMap["Orgs"] = result
  333. ctx.JSON(http.StatusOK, response.SuccessWithData(resultMap))
  334. }
  335. func RepoFind(ctx *context.Context) {
  336. keyword := strings.Trim(ctx.Query("q"), " ")
  337. topic := strings.Trim(ctx.Query("topic"), " ")
  338. sort := strings.Trim(ctx.Query("sort"), " ")
  339. page := ctx.QueryInt("page")
  340. pageSize := ctx.QueryInt("pageSize")
  341. if pageSize == 0 {
  342. pageSize = 15
  343. }
  344. if pageSize > 100 {
  345. ctx.JSON(http.StatusOK, response.ServerError("pageSize illegal"))
  346. return
  347. }
  348. if page <= 0 {
  349. page = 1
  350. }
  351. var ownerID int64
  352. if ctx.User != nil && !ctx.User.IsAdmin {
  353. ownerID = ctx.User.ID
  354. }
  355. result, err := repository.FindRepos(repository.FindReposOptions{
  356. ListOptions: models.ListOptions{Page: page, PageSize: pageSize},
  357. Actor: ctx.User,
  358. Sort: sort,
  359. Keyword: keyword,
  360. Topic: topic,
  361. Private: ctx.User != nil,
  362. OwnerID: ownerID,
  363. })
  364. if err != nil {
  365. log.Error("RepoFind error. %v", err)
  366. ctx.JSON(http.StatusOK, response.ResponseError(err))
  367. return
  368. }
  369. ctx.JSON(http.StatusOK, response.SuccessWithData(result))
  370. }
  371. func ExploreDatasets(ctx *context.Context) {
  372. ctx.Data["Title"] = ctx.Tr("explore")
  373. ctx.Data["PageIsExplore"] = true
  374. ctx.Data["PageIsExploreDatasets"] = true
  375. // ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  376. var (
  377. datasets []*models.Dataset
  378. count int64
  379. err error
  380. orderBy models.SearchOrderBy
  381. )
  382. page := ctx.QueryInt("page")
  383. if page <= 0 {
  384. page = 1
  385. }
  386. ctx.Data["SortType"] = ctx.Query("sort")
  387. switch ctx.Query("sort") {
  388. case "newest":
  389. orderBy = models.SearchOrderByNewest
  390. case "oldest":
  391. orderBy = models.SearchOrderByOldest
  392. case "recentupdate":
  393. orderBy = models.SearchOrderByRecentUpdated
  394. case "leastupdate":
  395. orderBy = models.SearchOrderByLeastUpdated
  396. case "reversealphabetically":
  397. orderBy = models.SearchOrderByAlphabeticallyReverse
  398. case "alphabetically":
  399. orderBy = models.SearchOrderByAlphabetically
  400. case "reversesize":
  401. orderBy = models.SearchOrderBySizeReverse
  402. case "downloadtimes":
  403. orderBy = models.SearchOrderByDownloadTimes
  404. case "moststars":
  405. orderBy = models.SearchOrderByStarsReverse
  406. case "feweststars":
  407. orderBy = models.SearchOrderByStars
  408. case "mostusecount":
  409. orderBy = models.SearchOrderByUseCountReverse
  410. case "fewestusecount":
  411. orderBy = models.SearchOrderByUseCount
  412. case "default":
  413. orderBy = models.SearchOrderByDefault
  414. default:
  415. ctx.Data["SortType"] = "default"
  416. orderBy = models.SearchOrderByDefault
  417. }
  418. keyword := strings.Trim(ctx.Query("q"), " ")
  419. category := ctx.Query("category")
  420. task := ctx.Query("task")
  421. license := ctx.Query("license")
  422. var ownerID int64
  423. if ctx.User != nil && !ctx.User.IsAdmin {
  424. ownerID = ctx.User.ID
  425. }
  426. var datasetsIds []int64
  427. if ownerID > 0 {
  428. collaboratorDatasetsIds := models.GetCollaboratorDatasetIdsByUserID(ownerID)
  429. teamDatasetsIds := models.GetTeamDatasetIdsByUserID(ownerID)
  430. datasetsIds = append(collaboratorDatasetsIds, teamDatasetsIds...)
  431. }
  432. opts := &models.SearchDatasetOptions{
  433. Keyword: keyword,
  434. IncludePublic: true,
  435. SearchOrderBy: orderBy,
  436. Category: category,
  437. Task: task,
  438. License: license,
  439. OwnerID: ownerID,
  440. DatasetIDs: datasetsIds,
  441. RecommendOnly: ctx.QueryBool("recommend"),
  442. CloudBrainType: -1,
  443. ListOptions: models.ListOptions{
  444. Page: page,
  445. PageSize: 30,
  446. },
  447. }
  448. datasets, count, err = models.SearchDataset(opts)
  449. if err != nil {
  450. ctx.ServerError("SearchDatasets", err)
  451. return
  452. }
  453. pager := context.NewPagination(int(count), opts.PageSize, page, 5)
  454. ctx.Data["Keyword"] = opts.Keyword
  455. ctx.Data["Category"] = category
  456. ctx.Data["Task"] = task
  457. ctx.Data["License"] = license
  458. ctx.Data["Recommend"] = ctx.QueryBool("recommend")
  459. pager.SetDefaultParams(ctx)
  460. ctx.Data["Page"] = pager
  461. ctx.Data["Datasets"] = repository.ConvertToDatasetWithStar(ctx, datasets)
  462. ctx.Data["Total"] = count
  463. ctx.Data["PageIsDatasets"] = true
  464. ctx.HTML(200, tplExploreDataset)
  465. }
  466. // RenderUserSearch render user search page
  467. func RenderUserSearch(ctx *context.Context, opts *models.SearchUserOptions, tplName base.TplName) {
  468. opts.Page = ctx.QueryInt("page")
  469. if opts.Page <= 1 {
  470. opts.Page = 1
  471. }
  472. var (
  473. users []*models.User
  474. count int64
  475. err error
  476. orderBy models.SearchOrderBy
  477. )
  478. ctx.Data["SortType"] = ctx.Query("sort")
  479. switch ctx.Query("sort") {
  480. case "newest":
  481. orderBy = models.SearchOrderByIDReverse
  482. case "oldest":
  483. orderBy = models.SearchOrderByID
  484. case "recentupdate":
  485. orderBy = models.SearchOrderByRecentUpdated
  486. case "leastupdate":
  487. orderBy = models.SearchOrderByLeastUpdated
  488. case "reversealphabetically":
  489. orderBy = models.SearchOrderByAlphabeticallyReverse
  490. case "alphabetically":
  491. orderBy = models.SearchOrderByAlphabetically
  492. default:
  493. ctx.Data["SortType"] = "alphabetically"
  494. orderBy = models.SearchOrderByAlphabetically
  495. }
  496. opts.Keyword = strings.Trim(ctx.Query("q"), " ")
  497. opts.OrderBy = orderBy
  498. if len(opts.Keyword) == 0 || isKeywordValid(opts.Keyword) {
  499. users, count, err = models.SearchUsers(opts)
  500. if err != nil {
  501. ctx.ServerError("SearchUsers", err)
  502. return
  503. }
  504. }
  505. ctx.Data["Keyword"] = opts.Keyword
  506. ctx.Data["Total"] = count
  507. ctx.Data["Users"] = users
  508. ctx.Data["ShowUserEmail"] = setting.UI.ShowUserEmail
  509. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  510. pager := context.NewPagination(int(count), opts.PageSize, opts.Page, 5)
  511. pager.SetDefaultParams(ctx)
  512. ctx.Data["Page"] = pager
  513. ctx.HTML(200, tplName)
  514. }
  515. // ExploreUsers render explore users page
  516. func ExploreUsers(ctx *context.Context) {
  517. ctx.Data["Title"] = ctx.Tr("explore")
  518. ctx.Data["PageIsExplore"] = true
  519. ctx.Data["PageIsExploreUsers"] = true
  520. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  521. pictureInfo, err := getImageInfo("explore-user-picture")
  522. if err == nil && len(pictureInfo) > 0 {
  523. ctx.Data["image_url"] = pictureInfo[0]["url"]
  524. ctx.Data["image_link"] = pictureInfo[0]["image_link"]
  525. }
  526. RenderUserSearch(ctx, &models.SearchUserOptions{
  527. Actor: ctx.User,
  528. Type: models.UserTypeIndividual,
  529. ListOptions: models.ListOptions{PageSize: setting.UI.ExplorePagingNum},
  530. IsActive: util.OptionalBoolTrue,
  531. Visible: []structs.VisibleType{structs.VisibleTypePublic, structs.VisibleTypeLimited, structs.VisibleTypePrivate},
  532. }, tplExploreUsers)
  533. }
  534. // ExploreOrganizations render explore organizations page
  535. func ExploreOrganizations(ctx *context.Context) {
  536. ctx.Data["Title"] = ctx.Tr("explore")
  537. ctx.Data["PageIsExplore"] = true
  538. ctx.Data["PageIsExploreOrganizations"] = true
  539. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  540. N := 10
  541. starInfo, err := models.FindTopNStarsOrgs(N)
  542. if err != nil {
  543. log.Error("GetStarOrgInfos failed:%v", err.Error(), ctx.Data["MsgID"])
  544. ctx.ServerError("GetStarOrgInfos", err)
  545. return
  546. }
  547. memberInfo, err := models.FindTopNMembersOrgs(N)
  548. if err != nil {
  549. log.Error("GetMemberOrgInfos failed:%v", err.Error(), ctx.Data["MsgID"])
  550. ctx.ServerError("GetMemberOrgInfos", err)
  551. return
  552. }
  553. openIInfo, err := models.FindTopNOpenIOrgs(N)
  554. if err != nil {
  555. log.Error("GetOpenIOrgInfos failed:%v", err.Error(), ctx.Data["MsgID"])
  556. ctx.ServerError("GetOpenIOrgInfos", err)
  557. return
  558. }
  559. recommendOrgs, err := getRecommendOrg()
  560. if err != nil {
  561. log.Error("GetRecommendOrgInfos failed:%v", err.Error(), ctx.Data["MsgID"])
  562. ctx.ServerError("GetRecommendOrgInfos", err)
  563. return
  564. }
  565. setRecommendURLOnly(ctx)
  566. ctx.Data["RecommendOrgs"] = recommendOrgs
  567. ctx.Data["StarOrgs"] = starInfo
  568. ctx.Data["MemberOrgs"] = memberInfo
  569. ctx.Data["ActiveOrgs"] = openIInfo
  570. ctx.HTML(http.StatusOK, tplExploreOrganizations)
  571. }
  572. // ExploreCode render explore code page
  573. func ExploreCode(ctx *context.Context) {
  574. if !setting.Indexer.RepoIndexerEnabled {
  575. ctx.Redirect(setting.AppSubURL+"/explore", 302)
  576. return
  577. }
  578. ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
  579. ctx.Data["Title"] = ctx.Tr("explore")
  580. ctx.Data["PageIsExplore"] = true
  581. ctx.Data["PageIsExploreCode"] = true
  582. language := strings.TrimSpace(ctx.Query("l"))
  583. keyword := strings.TrimSpace(ctx.Query("q"))
  584. page := ctx.QueryInt("page")
  585. if page <= 0 {
  586. page = 1
  587. }
  588. var (
  589. repoIDs []int64
  590. err error
  591. isAdmin bool
  592. userID int64
  593. )
  594. if ctx.User != nil {
  595. userID = ctx.User.ID
  596. isAdmin = ctx.User.IsAdmin
  597. }
  598. // guest user or non-admin user
  599. if ctx.User == nil || !isAdmin {
  600. repoIDs, err = models.FindUserAccessibleRepoIDs(ctx.User)
  601. if err != nil {
  602. ctx.ServerError("SearchResults", err)
  603. return
  604. }
  605. }
  606. var (
  607. total int
  608. searchResults []*code_indexer.Result
  609. searchResultLanguages []*code_indexer.SearchResultLanguages
  610. )
  611. // if non-admin login user, we need check UnitTypeCode at first
  612. if ctx.User != nil && len(repoIDs) > 0 {
  613. repoMaps, err := models.GetRepositoriesMapByIDs(repoIDs)
  614. if err != nil {
  615. ctx.ServerError("SearchResults", err)
  616. return
  617. }
  618. var rightRepoMap = make(map[int64]*models.Repository, len(repoMaps))
  619. repoIDs = make([]int64, 0, len(repoMaps))
  620. for id, repo := range repoMaps {
  621. if repo.CheckUnitUser(userID, isAdmin, models.UnitTypeCode) {
  622. rightRepoMap[id] = repo
  623. repoIDs = append(repoIDs, id)
  624. }
  625. }
  626. ctx.Data["RepoMaps"] = rightRepoMap
  627. total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(repoIDs, language, keyword, page, setting.UI.RepoSearchPagingNum)
  628. if err != nil {
  629. ctx.ServerError("SearchResults", err)
  630. return
  631. }
  632. // if non-login user or isAdmin, no need to check UnitTypeCode
  633. } else if (ctx.User == nil && len(repoIDs) > 0) || isAdmin {
  634. total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(repoIDs, language, keyword, page, setting.UI.RepoSearchPagingNum)
  635. if err != nil {
  636. ctx.ServerError("SearchResults", err)
  637. return
  638. }
  639. var loadRepoIDs = make([]int64, 0, len(searchResults))
  640. for _, result := range searchResults {
  641. var find bool
  642. for _, id := range loadRepoIDs {
  643. if id == result.RepoID {
  644. find = true
  645. break
  646. }
  647. }
  648. if !find {
  649. loadRepoIDs = append(loadRepoIDs, result.RepoID)
  650. }
  651. }
  652. repoMaps, err := models.GetRepositoriesMapByIDs(loadRepoIDs)
  653. if err != nil {
  654. ctx.ServerError("SearchResults", err)
  655. return
  656. }
  657. ctx.Data["RepoMaps"] = repoMaps
  658. }
  659. ctx.Data["Keyword"] = keyword
  660. ctx.Data["Language"] = language
  661. ctx.Data["SearchResults"] = searchResults
  662. ctx.Data["SearchResultLanguages"] = searchResultLanguages
  663. ctx.Data["RequireHighlightJS"] = true
  664. ctx.Data["PageIsViewCode"] = true
  665. pager := context.NewPagination(total, setting.UI.RepoSearchPagingNum, page, 5)
  666. pager.SetDefaultParams(ctx)
  667. pager.AddParam(ctx, "l", "Language")
  668. ctx.Data["Page"] = pager
  669. ctx.HTML(200, tplExploreCode)
  670. }
  671. func ExploreImages(ctx *context.Context) {
  672. ctx.HTML(200, tplExploreImages)
  673. }
  674. func ExploreDataAnalysisUserTrend(ctx *context.Context) {
  675. ctx.Data["url_params"] = "UserTrend"
  676. ctx.HTML(200, tplExploreExploreDataAnalysis)
  677. }
  678. func ExploreDataAnalysisUserAnalysis(ctx *context.Context) {
  679. ctx.Data["url_params"] = "UserAnalysis"
  680. ctx.HTML(200, tplExploreExploreDataAnalysis)
  681. }
  682. func ExploreDataAnalysisProTrend(ctx *context.Context) {
  683. ctx.Data["url_params"] = "ProTrend"
  684. ctx.HTML(200, tplExploreExploreDataAnalysis)
  685. }
  686. func ExploreDataAnalysisProAnalysis(ctx *context.Context) {
  687. ctx.Data["url_params"] = "ProAnalysis"
  688. ctx.HTML(200, tplExploreExploreDataAnalysis)
  689. }
  690. func ExploreDataAnalysisOverview(ctx *context.Context) {
  691. ctx.Data["url_params"] = "Overview"
  692. ctx.HTML(200, tplExploreExploreDataAnalysis)
  693. }
  694. func ExploreDataAnalysisBrainAnalysis(ctx *context.Context) {
  695. ctx.Data["url_params"] = "BrainAnalysis"
  696. ctx.HTML(200, tplExploreExploreDataAnalysis)
  697. }
  698. func ExploreDataAnalysis(ctx *context.Context) {
  699. ctx.Data["url_params"] = ""
  700. ctx.HTML(200, tplExploreExploreDataAnalysis)
  701. }
  702. // NotFound render 404 page
  703. func NotFound(ctx *context.Context) {
  704. ctx.Data["Title"] = "Page Not Found"
  705. ctx.NotFound("home.NotFound", nil)
  706. }
  707. func getRecommendOrg() ([]map[string]interface{}, error) {
  708. url := setting.RecommentRepoAddr + "home/organizations"
  709. result, err := repository.RecommendFromPromote(url)
  710. if err != nil {
  711. return nil, err
  712. }
  713. names := make([]string, 0)
  714. for _, userName := range result {
  715. names = append(names, userName)
  716. }
  717. users, _ := models.GetUsersByNames(names)
  718. userMap := make(map[string]*models.User, 0)
  719. for _, user := range users {
  720. userMap[user.Name] = user
  721. }
  722. resultOrg := make([]map[string]interface{}, 0)
  723. for _, userName := range result {
  724. user := userMap[userName]
  725. if user != nil {
  726. userMap := make(map[string]interface{})
  727. userMap["Name"] = user.Name
  728. userMap["Description"] = user.Description
  729. userMap["FullName"] = user.FullName
  730. userMap["HomeLink"] = user.HomeLink()
  731. userMap["ID"] = user.ID
  732. userMap["Avatar"] = user.RelAvatarLink()
  733. userMap["NumRepos"] = user.NumRepos
  734. userMap["NumTeams"] = user.NumTeams
  735. userMap["NumMembers"] = user.NumMembers
  736. resultOrg = append(resultOrg, userMap)
  737. } else {
  738. log.Info("the user not exist," + userName)
  739. }
  740. }
  741. return resultOrg, nil
  742. }
  743. func getImageInfo(filename string) ([]map[string]string, error) {
  744. url := setting.RecommentRepoAddr + filename
  745. result, err := repository.RecommendFromPromote(url)
  746. if err != nil {
  747. return nil, err
  748. }
  749. imageInfo := make([]map[string]string, 0)
  750. for i := 0; i < (len(result) - 1); i++ {
  751. line := result[i]
  752. imageMap := make(map[string]string)
  753. if line[0:4] == "url=" {
  754. url := line[4:]
  755. imageMap["url"] = url
  756. if result[i+1][0:11] == "image_link=" {
  757. image_link := result[i+1][11:]
  758. imageMap["image_link"] = image_link
  759. }
  760. }
  761. imageInfo = append(imageInfo, imageMap)
  762. i = i + 1
  763. }
  764. return imageInfo, nil
  765. }
  766. func GetMapInfo(ctx *context.Context) {
  767. filename := ctx.Query("filename")
  768. url := setting.RecommentRepoAddr + filename
  769. result, err := repository.RecommendContentFromPromote(url)
  770. if err != nil {
  771. log.Info("get file error:" + err.Error())
  772. }
  773. ctx.JSON(http.StatusOK, result)
  774. }
  775. func GetRankUser(index string) ([]map[string]interface{}, error) {
  776. url := setting.RecommentRepoAddr + "user_rank/user_rank_" + index
  777. result, err := repository.RecommendFromPromote(url)
  778. if err != nil {
  779. return nil, err
  780. }
  781. resultOrg := make([]map[string]interface{}, 0)
  782. for _, userRank := range result {
  783. tmpIndex := strings.Index(userRank, " ")
  784. userName := userRank
  785. score := 0
  786. label := ""
  787. if tmpIndex != -1 {
  788. userName = userRank[0:tmpIndex]
  789. left := userRank[tmpIndex+1:]
  790. tmpIndex1 := strings.Index(left, " ")
  791. if tmpIndex1 != -1 {
  792. tmpScore, err := strconv.Atoi(left[0:tmpIndex1])
  793. if err != nil {
  794. log.Info("convert to int error.")
  795. }
  796. score = tmpScore
  797. label = left[tmpIndex1+1:]
  798. } else {
  799. tmpScore, err := strconv.Atoi(left[tmpIndex+1:])
  800. if err != nil {
  801. log.Info("convert to int error.")
  802. }
  803. score = tmpScore
  804. }
  805. }
  806. user, err := models.GetUserByName(userName)
  807. if err == nil {
  808. userMap := make(map[string]interface{})
  809. userMap["Name"] = user.Name
  810. userMap["Description"] = user.Description
  811. userMap["FullName"] = user.FullName
  812. userMap["HomeLink"] = user.HomeLink()
  813. userMap["ID"] = user.ID
  814. userMap["Label"] = label
  815. userMap["Avatar"] = user.RelAvatarLink()
  816. userMap["Score"] = score
  817. resultOrg = append(resultOrg, userMap)
  818. } else {
  819. log.Info("query user error," + err.Error())
  820. }
  821. }
  822. return resultOrg, nil
  823. }
  824. func GetUserRankFromPromote(ctx *context.Context) {
  825. index := ctx.Params("index")
  826. resultUserRank, err := GetRankUser(index)
  827. if err != nil {
  828. ctx.ServerError("500", err)
  829. return
  830. }
  831. ctx.JSON(200, resultUserRank)
  832. }
  833. func getMapContent(fileName string) []map[string]string {
  834. url := setting.RecommentRepoAddr + fileName
  835. result, err := repository.RecommendContentFromPromote(url)
  836. remap := make([]map[string]string, 0)
  837. if err == nil {
  838. json.Unmarshal([]byte(result), &remap)
  839. }
  840. return remap
  841. }
  842. func HomeNoticeTmpl(ctx *context.Context) {
  843. ctx.Data["url_params"] = ""
  844. ctx.HTML(200, "notice")
  845. }
  846. func RecommendHomeInfo(ctx *context.Context) {
  847. resultOrg, err := getRecommendOrg()
  848. if err != nil {
  849. log.Info("error." + err.Error())
  850. }
  851. repoMap := getMapContent("home/projects")
  852. resultRepo, err := repository.GetRecommendRepoFromPromote(repoMap)
  853. if err != nil {
  854. log.Info("error." + err.Error())
  855. }
  856. resultActivityInfo := getMapContent("home/activity_info")
  857. mapInterface := make(map[string]interface{})
  858. mapInterface["org"] = resultOrg
  859. mapInterface["repo"] = resultRepo
  860. mapInterface["activity"] = resultActivityInfo
  861. user_experience := getMapContent("home/user_experience")
  862. for _, amap := range user_experience {
  863. userId := amap["userid"]
  864. userIntId, _ := strconv.Atoi(userId)
  865. user, err := models.GetUserByID(int64(userIntId))
  866. if err == nil {
  867. amap["name"] = user.Name
  868. amap["fullname"] = user.FullName
  869. amap["detail"] = user.Description
  870. amap["avatar"] = user.AvatarLink()
  871. }
  872. }
  873. mapInterface["user_experience"] = user_experience
  874. dataset, err := models.QueryDatasetGroupByTask()
  875. if err == nil {
  876. mapInterface["dataset"] = dataset
  877. }
  878. ctx.JSON(http.StatusOK, mapInterface)
  879. }
  880. func HomeTerm(ctx *context.Context) {
  881. ctx.HTML(200, tplHomeTerm)
  882. }
  883. func HomePrivacy(ctx *context.Context) {
  884. ctx.HTML(200, tplHomePrivacy)
  885. }
  886. func HomeResoruceDesc(ctx *context.Context) {
  887. ctx.HTML(200, tplResoruceDesc)
  888. }