student.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. package orm
  2. import (
  3. "fmt"
  4. "net/http"
  5. "gogs.carduccidante.edu.it/karmen/core/renderer"
  6. )
  7. type Student struct {
  8. Credential
  9. Handicap bool
  10. DSA bool
  11. BES bool
  12. FatherLastname string
  13. FatherFirstname string
  14. FatherEmail string
  15. MotherLastname string
  16. MotherFirstname string
  17. MotherEmail string
  18. LegalGuardianLastname string
  19. LegalGuardianFirstname string
  20. LegalGuardianEmail string
  21. TutorID uint `schema:"tutor_id"`
  22. ClassID uint `schema:"class_id"`
  23. OperatorIDs []uint `schema:"operator_ids" gorm:"-"`
  24. Operators []*Operator `gorm:"many2many:student_operators"`
  25. Class *Class
  26. Tutor *Teacher
  27. Teachers []*Teacher
  28. Activities []*Activity
  29. AllClasses []*Class `gorm:"-"`
  30. AllTeachers []*Teacher `gorm:"-"`
  31. AllOperators []*Operator `gorm:"-"`
  32. SelectedClass map[uint]string `gorm:"-"`
  33. SelectedTeacher map[uint]string `gorm:"-"`
  34. SelectedOperator map[uint]string `gorm:"-"`
  35. }
  36. var (
  37. selectStudentTeachers = `
  38. SELECT teachers.* FROM activities
  39. INNER JOIN teachers ON (activities.teacher_id=teachers.id OR activities.supply_teacher_id=teachers.id)
  40. WHERE student_id=?
  41. `
  42. )
  43. func (s *Student) GetID() uint { return s.ID }
  44. func (s *Student) String() string { return s.CompleteName() }
  45. func (s *Student) Create(args map[string]string, r *http.Request) (interface{}, error) {
  46. if r.Method == "GET" {
  47. student := new(Student)
  48. if err := DB().Find(&student.AllTeachers).Error; err != nil {
  49. return nil, err
  50. }
  51. if err := DB().Find(&student.AllClasses).Error; err != nil {
  52. return nil, err
  53. }
  54. if err := DB().Find(&student.AllOperators).Error; err != nil {
  55. return nil, err
  56. }
  57. return student, nil
  58. } else {
  59. student := new(Student)
  60. err := renderer.Decode(student, r)
  61. if err != nil {
  62. return nil, err
  63. }
  64. student, err = CreateStudent(student)
  65. if err != nil {
  66. return nil, err
  67. }
  68. return student, nil
  69. }
  70. }
  71. func (s *Student) Read(args map[string]string, r *http.Request) (interface{}, error) {
  72. var student Student
  73. id := args["id"]
  74. if err := DB().Preload("Class").Preload("Class.Coordinator").Preload("Operators").Where("id = ?", id).Find(&student).Error; err != nil {
  75. return nil, err
  76. }
  77. if err := DB().Preload("Subject").Preload("Teacher").Preload("Class").Where("student_id=?", id).Find(&student.Activities).Error; err != nil {
  78. return nil, err
  79. }
  80. return &student, nil
  81. }
  82. func (s *Student) ReadAll(args map[string]string, r *http.Request) (interface{}, error) {
  83. var students []*Student
  84. if err := DB().Preload("Operators").Preload("Class").Preload("Class.Coordinator").Preload("Tutor").Order("surname,name").Find(&students).Error; err != nil {
  85. return nil, err
  86. }
  87. for _, student := range students {
  88. student.GetTeachers()
  89. }
  90. for _, student := range students {
  91. student.GetActivities()
  92. }
  93. return students, nil
  94. }
  95. func (s *Student) Update(args map[string]string, r *http.Request) (interface{}, error) {
  96. if r.Method == "GET" {
  97. result, err := s.Read(args, r)
  98. if err != nil {
  99. return nil, err
  100. }
  101. student := result.(*Student)
  102. if err := DB().Find(&student.AllTeachers).Error; err != nil {
  103. return nil, err
  104. }
  105. if err := DB().Find(&student.AllClasses).Error; err != nil {
  106. return nil, err
  107. }
  108. if err := DB().Find(&student.AllOperators).Error; err != nil {
  109. return nil, err
  110. }
  111. student.SelectedTeacher = make(map[uint]string)
  112. student.SelectedTeacher[student.TutorID] = "selected"
  113. student.SelectedClass = make(map[uint]string)
  114. student.SelectedClass[student.ClassID] = "selected"
  115. student.SelectedOperator = make(map[uint]string)
  116. for _, o := range student.Operators {
  117. student.SelectedOperator[o.ID] = "selected"
  118. }
  119. return student, nil
  120. } else {
  121. student, err := s.Read(args, r)
  122. if err != nil {
  123. return nil, err
  124. }
  125. // FIXME: Should not be hard set.
  126. student.(*Student).Handicap = false
  127. student.(*Student).DSA = false
  128. student.(*Student).BES = false
  129. err = renderer.Decode(student, r)
  130. if err != nil {
  131. return nil, err
  132. }
  133. if err := DB().
  134. Where([]uint(student.(*Student).OperatorIDs)).
  135. Find(&student.(*Student).Operators).Error; err != nil {
  136. return nil, err
  137. }
  138. _, err = SaveStudent(student.(*Student))
  139. if err != nil {
  140. return nil, err
  141. }
  142. if err := DB().
  143. Model(student).
  144. Association("Operators").
  145. Replace(student.(*Student).Operators).Error; err != nil {
  146. return nil, err
  147. }
  148. student, err = s.Read(args, r)
  149. if err != nil {
  150. return nil, err
  151. }
  152. return student.(*Student), nil
  153. }
  154. }
  155. func (s *Student) Delete(args map[string]string, r *http.Request) (interface{}, error) {
  156. student, err := s.Read(args, r)
  157. if err != nil {
  158. return nil, err
  159. }
  160. if err := DB().Unscoped().Delete(student.(*Student)).Error; err != nil {
  161. return nil, err
  162. }
  163. return student.(*Student), nil
  164. }
  165. func SaveStudent(student *Student) (interface{}, error) {
  166. if err := DB().Omit("Class", "Tutor", "Teachers", "Activities").Save(student).Error; err != nil {
  167. return nil, err
  168. }
  169. return student, nil
  170. }
  171. func CreateStudent(student *Student) (*Student, error) {
  172. if err := DB().Where([]uint(student.OperatorIDs)).Find(&student.Operators).Error; err != nil {
  173. return nil, err
  174. }
  175. if err := DB().Create(student).Error; err != nil {
  176. return nil, err
  177. }
  178. return student, nil
  179. }
  180. func (s *Student) GetTeachers() ([]*Teacher, error) {
  181. if err := DB().Raw(selectStudentTeachers, s.ID).Scan(&s.Teachers).Error; err != nil {
  182. return nil, err
  183. }
  184. return s.Teachers, nil
  185. }
  186. func (s *Student) GetActivities() ([]*Activity, error) {
  187. if err := DB().Preload("Student").Preload("Subject").Preload("Class").Where("student_id=?", s.ID).Find(&s.Activities).Error; err != nil {
  188. return nil, err
  189. }
  190. return s.Activities, nil
  191. }
  192. func (s *Student) CompleteName() string {
  193. return fmt.Sprintf("%s %s", s.Name, s.Surname)
  194. }