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.

course.go 5.2 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package repo
  2. import (
  3. "net/http"
  4. "strings"
  5. "code.gitea.io/gitea/models"
  6. "code.gitea.io/gitea/modules/auth"
  7. "code.gitea.io/gitea/modules/base"
  8. "code.gitea.io/gitea/modules/context"
  9. "code.gitea.io/gitea/modules/log"
  10. "code.gitea.io/gitea/modules/setting"
  11. repo_service "code.gitea.io/gitea/services/repository"
  12. )
  13. const (
  14. tplCreateCourse base.TplName = "repo/createCourse"
  15. )
  16. func CreateCourse(ctx *context.Context) {
  17. ctx.Data["Title"] = ctx.Tr("new_course")
  18. org, _ := models.GetUserByName(setting.Course.OrgName)
  19. ctx.Data["Owner"] = org
  20. ctx.Data["IsCourse"] = true
  21. ctx.HTML(200, tplCreateCourse)
  22. }
  23. func CreateCoursePost(ctx *context.Context, form auth.CreateCourseForm) {
  24. ctx.Data["Title"] = ctx.Tr("new_course")
  25. if ctx.Written() {
  26. return
  27. }
  28. org, _ := models.GetUserByName(setting.Course.OrgName)
  29. ctx.Data["Owner"] = org
  30. ctx.Data["IsCourse"] = true
  31. var topics = make([]string, 0)
  32. var topicsStr = strings.TrimSpace(form.Topics)
  33. if len(topicsStr) > 0 {
  34. topics = strings.Split(topicsStr, ",")
  35. }
  36. validTopics, invalidTopics := models.SanitizeAndValidateTopics(topics)
  37. if len(validTopics) > 25 {
  38. ctx.RenderWithErr(ctx.Tr("repo.topic.count_prompt"), tplCreateCourse, form)
  39. return
  40. }
  41. if len(invalidTopics) > 0 {
  42. ctx.RenderWithErr(ctx.Tr("repo.topic.format_prompt"), tplCreateCourse, form)
  43. return
  44. }
  45. var repo *models.Repository
  46. var err error
  47. if setting.Course.OrgName == "" || setting.Course.TeamName == "" {
  48. log.Error("then organization name or team name of course is empty.")
  49. ctx.RenderWithErr(ctx.Tr("repo.failed_to_create_course"), tplCreateCourse, form)
  50. return
  51. }
  52. org, team, err := getOrgAndTeam()
  53. if err != nil {
  54. log.Error("Failed to get team from db.", err)
  55. ctx.RenderWithErr(ctx.Tr("repo.failed_to_create_course"), tplCreateCourse, form)
  56. return
  57. }
  58. isInTeam, err := models.IsUserInTeams(ctx.User.ID, []int64{team.ID})
  59. if err != nil {
  60. log.Error("Failed to get user in team from db.")
  61. ctx.RenderWithErr(ctx.Tr("repo.failed_to_create_course"), tplCreateCourse, form)
  62. return
  63. }
  64. if !isInTeam {
  65. err = models.AddTeamMember(team, ctx.User.ID)
  66. if err != nil {
  67. log.Error("Failed to add user to team.")
  68. ctx.RenderWithErr(ctx.Tr("repo.failed_to_create_course"), tplCreateCourse, form)
  69. return
  70. }
  71. }
  72. if ctx.HasError() {
  73. ctx.HTML(200, tplCreateCourse)
  74. return
  75. }
  76. repo, err = repo_service.CreateRepository(ctx.User, org, models.CreateRepoOptions{
  77. Name: form.RepoName,
  78. Alias: form.Alias,
  79. Description: form.Description,
  80. Gitignores: "",
  81. IssueLabels: "",
  82. License: "",
  83. Readme: "Default",
  84. IsPrivate: false,
  85. DefaultBranch: "master",
  86. AutoInit: true,
  87. IsCourse: true,
  88. Topics: validTopics,
  89. })
  90. if err == nil {
  91. log.Trace("Repository created [%d]: %s/%s", repo.ID, org.Name, repo.Name)
  92. ctx.Redirect(setting.AppSubURL + "/" + org.Name + "/" + repo.Name)
  93. return
  94. }
  95. handleCreateCourseError(ctx, org, err, "CreateCoursePost", tplCreateCourse, &form)
  96. }
  97. func AddCourseOrg(ctx *context.Context) {
  98. _, team, err := getOrgAndTeam()
  99. if err != nil {
  100. log.Error("Failed to get team from db.", err)
  101. ctx.JSON(http.StatusOK, map[string]interface{}{
  102. "code": 1,
  103. "message": ctx.Tr("repo.addCourseOrgFail"),
  104. })
  105. return
  106. }
  107. isInTeam, err := models.IsUserInTeams(ctx.User.ID, []int64{team.ID})
  108. if err != nil {
  109. log.Error("Failed to get user in team from db.", err)
  110. ctx.JSON(http.StatusOK, map[string]interface{}{
  111. "code": 1,
  112. "message": ctx.Tr("repo.add_course_org_fail"),
  113. })
  114. return
  115. }
  116. if !isInTeam {
  117. err = models.AddTeamMember(team, ctx.User.ID)
  118. if err != nil {
  119. log.Error("Failed to add user to team.", err)
  120. ctx.JSON(http.StatusOK, map[string]interface{}{
  121. "code": 1,
  122. "message": ctx.Tr("repo.add_course_org_fail"),
  123. })
  124. return
  125. }
  126. }
  127. ctx.JSON(http.StatusOK, map[string]interface{}{
  128. "code": 0,
  129. "message": "",
  130. })
  131. }
  132. func getOrgAndTeam() (*models.User, *models.Team, error) {
  133. org, err := models.GetUserByName(setting.Course.OrgName)
  134. if err != nil {
  135. log.Error("Failed to get organization from db.", err)
  136. return nil, nil, err
  137. }
  138. team, err := models.GetTeam(org.ID, setting.Course.TeamName)
  139. if err != nil {
  140. log.Error("Failed to get team from db.", err)
  141. return nil, nil, err
  142. }
  143. return org, team, nil
  144. }
  145. func handleCreateCourseError(ctx *context.Context, owner *models.User, err error, name string, tpl base.TplName, form interface{}) {
  146. switch {
  147. case models.IsErrReachLimitOfRepo(err):
  148. ctx.RenderWithErr(ctx.Tr("repo.form.reach_limit_of_course_creation", owner.MaxCreationLimit()), tpl, form)
  149. case models.IsErrRepoAlreadyExist(err):
  150. ctx.Data["Err_RepoName"] = true
  151. ctx.RenderWithErr(ctx.Tr("form.course_name_been_taken"), tpl, form)
  152. case models.IsErrNameReserved(err):
  153. ctx.Data["Err_RepoName"] = true
  154. ctx.RenderWithErr(ctx.Tr("repo.form.course_name_reserved", err.(models.ErrNameReserved).Name), tpl, form)
  155. case models.IsErrNamePatternNotAllowed(err):
  156. ctx.Data["Err_RepoName"] = true
  157. ctx.RenderWithErr(ctx.Tr("repo.form.course_name_pattern_not_allowed", err.(models.ErrNamePatternNotAllowed).Pattern), tpl, form)
  158. default:
  159. ctx.ServerError(name, err)
  160. }
  161. }