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.1 kB

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