teachers.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. package api
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "html/template"
  6. "io/ioutil"
  7. "net/http"
  8. "sort"
  9. "strings"
  10. "github.com/gorilla/mux"
  11. "github.com/gorilla/schema"
  12. "gogs.carducci-dante.gov.it/karmen/core/orm"
  13. "gogs.carducci-dante.gov.it/karmen/datasource/edt"
  14. )
  15. var (
  16. selectUniqueTeacherClasses = `
  17. SELECT DISTINCT classes.* FROM activities
  18. INNER JOIN classes on classes.id=activities.class_id
  19. WHERE teacher_id=?`
  20. selectUniqueTeacherSubjects = `
  21. SELECT DISTINCT subjects.* FROM activities
  22. INNER JOIN subjects on subjects.id=activities.subject_id
  23. WHERE activities.teacher_id=?`
  24. )
  25. func teachersHandler() http.Handler {
  26. fn := func(w http.ResponseWriter, r *http.Request) {
  27. var teachers []*orm.Teacher
  28. if err := orm.DB().Find(&teachers).Error; err != nil {
  29. panic(err)
  30. }
  31. for _, teacher := range teachers {
  32. orm.DB().Raw(selectUniqueTeacherClasses, teacher.ID).Scan(&teacher.Classes)
  33. orm.DB().Raw(selectUniqueTeacherSubjects, teacher.ID).Scan(&teacher.Subjects)
  34. }
  35. sort.Slice(teachers, func(i, j int) bool {
  36. return strings.ToLower(teachers[i].Surname) < strings.ToLower(teachers[j].Surname)
  37. })
  38. // if err := renderer.Render(w, "base", "teachers", teachers); err != nil {
  39. // panic(err)
  40. // }
  41. }
  42. return http.HandlerFunc(fn)
  43. }
  44. func teacherShowHandler() http.Handler {
  45. fn := func(w http.ResponseWriter, r *http.Request) {
  46. var teacher orm.Teacher
  47. if err := orm.DB().First(&teacher, mux.Vars(r)["id"]).Error; err != nil {
  48. panic(err)
  49. }
  50. orm.DB().Raw(selectUniqueTeacherClasses, mux.Vars(r)["id"]).Scan(&teacher.Classes)
  51. sort.Slice(teacher.Classes, func(i, j int) bool {
  52. return strings.ToLower(teacher.Classes[i].Name) < strings.ToLower(teacher.Classes[j].Name)
  53. })
  54. orm.DB().Raw(selectUniqueTeacherSubjects, mux.Vars(r)["id"]).Scan(&teacher.Subjects)
  55. sort.Slice(teacher.Subjects, func(i, j int) bool {
  56. return strings.ToLower(teacher.Subjects[i].Name) < strings.ToLower(teacher.Subjects[j].Name)
  57. })
  58. orm.DB().Table("activities").Select("*").Where("teacher_id = ?", mux.Vars(r)["id"]).Scan(&teacher.Activities)
  59. sort.Slice(teacher.Activities, func(i, j int) bool {
  60. return teacher.Activities[i].Hours < teacher.Activities[j].Hours
  61. })
  62. // if err := renderer.Render(w, "base", "teachers_show", teacher); err != nil {
  63. // panic(err)
  64. // }
  65. }
  66. return http.HandlerFunc(fn)
  67. }
  68. func teachersAddHandler() http.Handler {
  69. fn := func(w http.ResponseWriter, r *http.Request) {
  70. if r.Method == "GET" {
  71. var data struct {
  72. Update bool
  73. SubmitUrl template.URL
  74. }
  75. data.SubmitUrl = template.URL(fmt.Sprintf("/teachers/add"))
  76. // if err := renderer.Render(w, "base", "teachers_add_update", data); err != nil {
  77. // panic(err)
  78. // }
  79. } else if r.Method == "POST" {
  80. var teacher orm.Teacher
  81. if err := r.ParseForm(); err != nil {
  82. panic(err)
  83. }
  84. decoder := schema.NewDecoder()
  85. if err := decoder.Decode(&teacher, r.PostForm); err != nil {
  86. panic(err)
  87. }
  88. // Generate username and initial password
  89. teacher.Username = teacher.GenerateUsername()
  90. teacher.Password = teacher.GenerateSaltedPassword(teacher.Username)
  91. orm.DB().NewRecord(teacher)
  92. if err := orm.DB().Create(&teacher).Error; err != nil {
  93. panic(err)
  94. }
  95. http.Redirect(w, r, fmt.Sprintf("/teachers/%d", teacher.ID), http.StatusSeeOther)
  96. }
  97. }
  98. return http.HandlerFunc(fn)
  99. }
  100. func teachersDeleteHandler() http.Handler {
  101. fn := func(w http.ResponseWriter, r *http.Request) {
  102. var teacher orm.Teacher
  103. if err := orm.DB().First(&teacher, mux.Vars(r)["id"]).Error; err != nil {
  104. panic(err)
  105. }
  106. if err := orm.DB().Delete(&teacher).Error; err != nil {
  107. panic(err)
  108. }
  109. var data struct {
  110. RedirectUrl string `json:"redirect_url"`
  111. }
  112. data.RedirectUrl = "/teachers"
  113. w.Header().Set("Content-Type", "application/json")
  114. json.NewEncoder(w).Encode(data)
  115. }
  116. return http.HandlerFunc(fn)
  117. }
  118. func teacherUpdateHandler() http.Handler {
  119. fn := func(w http.ResponseWriter, r *http.Request) {
  120. if r.Method == "GET" {
  121. var data struct {
  122. Update bool
  123. SubmitUrl template.URL
  124. Teacher orm.Teacher
  125. }
  126. if err := orm.DB().First(&data.Teacher, mux.Vars(r)["id"]).Error; err != nil {
  127. panic(err)
  128. }
  129. data.Update = true
  130. data.SubmitUrl = template.URL(fmt.Sprintf("/teachers/%d/update", data.Teacher.ID))
  131. // if err := renderer.Render(w, "base", "teachers_add_update", data); err != nil {
  132. // panic(err)
  133. // }
  134. } else if r.Method == "POST" {
  135. var (
  136. teacher orm.Teacher
  137. oldPassword string
  138. )
  139. if err := orm.DB().First(&teacher, mux.Vars(r)["id"]).Error; err != nil {
  140. panic(err)
  141. }
  142. oldPassword = teacher.Password
  143. if err := r.ParseForm(); err != nil {
  144. panic(err)
  145. }
  146. decoder := schema.NewDecoder()
  147. if err := decoder.Decode(&teacher, r.PostForm); err != nil {
  148. panic(err)
  149. }
  150. if oldPassword != teacher.Password {
  151. teacher.Password = teacher.GenerateSaltedPassword(teacher.Password)
  152. }
  153. if err := orm.DB().Save(&teacher).Error; err != nil {
  154. panic(err)
  155. }
  156. var data struct {
  157. Teachers []orm.Teacher
  158. }
  159. data.Teachers = make([]orm.Teacher, 0)
  160. if err := orm.DB().Find(&data.Teachers).Error; err != nil {
  161. panic(err)
  162. }
  163. http.Redirect(w, r, fmt.Sprintf("/teachers/%d", teacher.ID), http.StatusSeeOther)
  164. }
  165. }
  166. return http.HandlerFunc(fn)
  167. }
  168. func teachersCheckUsernameHandler() http.Handler {
  169. fn := func(w http.ResponseWriter, r *http.Request) {
  170. var teacher orm.Teacher
  171. var data struct {
  172. Exists bool `json:"exists"`
  173. }
  174. if orm.DB().Where("username = ?", mux.Vars(r)["username"]).Find(&teacher).RecordNotFound() {
  175. data.Exists = false
  176. } else {
  177. data.Exists = true
  178. }
  179. w.Header().Set("Content-Type", "application/json")
  180. json.NewEncoder(w).Encode(data)
  181. }
  182. return http.HandlerFunc(fn)
  183. }
  184. func teachersImportHandler() http.Handler {
  185. fn := func(w http.ResponseWriter, r *http.Request) {
  186. r.ParseMultipartForm(32 << 20)
  187. file, _, err := r.FormFile("teachers_import")
  188. if err != nil {
  189. panic(err)
  190. }
  191. defer file.Close()
  192. data, err := ioutil.ReadAll(file)
  193. if err != nil {
  194. panic(err)
  195. }
  196. if importer, err := edt.NewImporter(
  197. string(data),
  198. map[string]string{
  199. "COGNOME": "surname",
  200. "NOME": "name",
  201. },
  202. ); err != nil {
  203. panic(err)
  204. } else {
  205. if err := orm.Import(&orm.Teacher{}, importer); err != nil {
  206. panic(err)
  207. }
  208. http.Redirect(w, r, "/teachers", http.StatusSeeOther)
  209. }
  210. }
  211. return http.HandlerFunc(fn)
  212. }