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