classes.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. package api
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "html/template"
  6. "io/ioutil"
  7. "log"
  8. "net/http"
  9. "github.com/gorilla/mux"
  10. "github.com/gorilla/schema"
  11. "gogs.carducci-dante.gov.it/karmen/core/orm"
  12. "gogs.carducci-dante.gov.it/karmen/core/renderer"
  13. "gogs.carducci-dante.gov.it/karmen/datasource/edt"
  14. )
  15. func classesHandler() http.Handler {
  16. fn := func(w http.ResponseWriter, r *http.Request) {
  17. classes, err := orm.GetClassesAll()
  18. if err != nil {
  19. renderer.Render[r.URL.Query()["format"][0]](w, r, err)
  20. } else {
  21. renderer.Render[r.URL.Query()["format"][0]](w, r, classes, r.URL.Query()["options"]...)
  22. }
  23. }
  24. return http.HandlerFunc(fn)
  25. }
  26. func classesShowHandler() http.Handler {
  27. fn := func(w http.ResponseWriter, r *http.Request) {
  28. class, err := orm.GetClass(mux.Vars(r)["id"])
  29. if err != nil {
  30. renderer.Render[r.URL.Query()["format"][0]](w, r, err)
  31. } else {
  32. renderer.Render[r.URL.Query()["format"][0]](w, r, class, r.URL.Query()["options"]...)
  33. }
  34. // if err := renderer.Render(w, "base", "classes_show", data); err != nil {
  35. // panic(err)
  36. // }
  37. }
  38. return http.HandlerFunc(fn)
  39. }
  40. func classesAddHandler() http.Handler {
  41. fn := func(w http.ResponseWriter, r *http.Request) {
  42. if r.Method == "GET" {
  43. var data struct {
  44. Update bool
  45. Teachers []orm.Teacher
  46. SubmitUrl template.URL
  47. }
  48. data.SubmitUrl = template.URL(fmt.Sprintf("/classes/add"))
  49. if err := orm.DB().Find(&data.Teachers).Error; err != nil {
  50. panic(err)
  51. }
  52. // if err := renderer.Render(w, "base", "classes_add_update", data); err != nil {
  53. // panic(err)
  54. // }
  55. } else if r.Method == "POST" {
  56. var class orm.Class
  57. if err := r.ParseForm(); err != nil {
  58. panic(err)
  59. }
  60. decoder := schema.NewDecoder()
  61. if err := decoder.Decode(&class, r.PostForm); err != nil {
  62. panic(err)
  63. }
  64. orm.DB().NewRecord(class)
  65. if err := orm.DB().Create(&class).Error; err != nil {
  66. panic(err)
  67. }
  68. http.Redirect(w, r, fmt.Sprintf("/classes/%d", class.ID), http.StatusSeeOther)
  69. }
  70. }
  71. return http.HandlerFunc(fn)
  72. }
  73. func classesDeleteHandler() http.Handler {
  74. fn := func(w http.ResponseWriter, r *http.Request) {
  75. var class orm.Class
  76. if err := orm.DB().First(&class, mux.Vars(r)["id"]).Error; err != nil {
  77. panic(err)
  78. }
  79. if err := orm.DB().Delete(&class).Error; err != nil {
  80. panic(err)
  81. }
  82. var data struct {
  83. RedirectUrl string `json:"redirect_url"`
  84. }
  85. data.RedirectUrl = "/classes"
  86. w.Header().Set("Content-Type", "application/json")
  87. json.NewEncoder(w).Encode(data)
  88. }
  89. return http.HandlerFunc(fn)
  90. }
  91. func classesUpdateHandler() http.Handler {
  92. fn := func(w http.ResponseWriter, r *http.Request) {
  93. if r.Method == "GET" {
  94. var data struct {
  95. Update bool
  96. SubmitUrl template.URL
  97. Class orm.Class
  98. Teachers []orm.Teacher
  99. SelectedCoordinator map[uint]string
  100. SelectedMinuter map[uint]string
  101. }
  102. if err := orm.DB().First(&data.Class, mux.Vars(r)["id"]).Error; err != nil {
  103. panic(err)
  104. }
  105. if err := orm.DB().Find(&data.Teachers).Error; err != nil {
  106. panic(err)
  107. }
  108. log.Println("Coordinator ID", data.Class.CoordinatorID)
  109. if id := data.Class.CoordinatorID; id != 0 {
  110. data.SelectedCoordinator = make(map[uint]string)
  111. data.SelectedCoordinator[id] = "selected"
  112. }
  113. if id := data.Class.MinuterID; id != 0 {
  114. data.SelectedMinuter = make(map[uint]string)
  115. data.SelectedMinuter[id] = "selected"
  116. }
  117. data.Update = true
  118. data.SubmitUrl = template.URL(fmt.Sprintf("/classes/%d/update", data.Class.ID))
  119. // if err := renderer.Render(w, "base", "classes_add_update", data); err != nil {
  120. // panic(err)
  121. // }
  122. } else if r.Method == "POST" {
  123. var class orm.Class
  124. if err := orm.DB().First(&class, mux.Vars(r)["id"]).Error; err != nil {
  125. panic(err)
  126. }
  127. if err := r.ParseForm(); err != nil {
  128. panic(err)
  129. }
  130. decoder := schema.NewDecoder()
  131. if err := decoder.Decode(&class, r.PostForm); err != nil {
  132. panic(err)
  133. }
  134. if err := orm.DB().Save(&class).Error; err != nil {
  135. panic(err)
  136. }
  137. http.Redirect(w, r, fmt.Sprintf("/classes/%d", class.ID), http.StatusSeeOther)
  138. }
  139. }
  140. return http.HandlerFunc(fn)
  141. }
  142. func classesImportHandler() http.Handler {
  143. fn := func(w http.ResponseWriter, r *http.Request) {
  144. r.ParseMultipartForm(32 << 20)
  145. file, _, err := r.FormFile("classes_import")
  146. if err != nil {
  147. panic(err)
  148. }
  149. defer file.Close()
  150. data, err := ioutil.ReadAll(file)
  151. if err != nil {
  152. panic(err)
  153. }
  154. if importer, err := edt.NewImporter(
  155. string(data),
  156. map[string]string{
  157. "NOME": "name",
  158. },
  159. ); err != nil {
  160. panic(err)
  161. } else {
  162. if err := orm.Import(&orm.Class{}, importer); err != nil {
  163. panic(err)
  164. }
  165. http.Redirect(w, r, "/classes", http.StatusSeeOther)
  166. }
  167. }
  168. return http.HandlerFunc(fn)
  169. }