student.go 5.8 KB

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