student.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. Class *Class
  27. Tutor *Teacher
  28. Teachers []*Teacher
  29. Activities []*Activity
  30. AllClasses []*Class `gorm:"-"`
  31. AllTeachers []*Teacher `gorm:"-"`
  32. SelectedClass map[uint]string `gorm:"-"`
  33. SelectedTeacher map[uint]string `gorm:"-"`
  34. }
  35. var (
  36. selectStudentTeachers = `
  37. SELECT teachers.* FROM activities
  38. INNER JOIN teachers ON (activities.teacher_id=teachers.id OR activities.supply_teacher_id=teachers.id)
  39. WHERE student_id=?
  40. `
  41. )
  42. func (s *Student) GetID() uint { return s.ID }
  43. func (s *Student) String() string { return s.CompleteName() }
  44. func (s *Student) Create(args map[string]string, r *http.Request) (interface{}, error) {
  45. if r.Method == "GET" {
  46. student := new(Student)
  47. if err := DB().Find(&student.AllTeachers).Error; err != nil {
  48. return nil, err
  49. }
  50. if err := DB().Find(&student.AllClasses).Error; err != nil {
  51. return nil, err
  52. }
  53. return student, nil
  54. } else {
  55. student := new(Student)
  56. err := renderer.Decode(student, r)
  57. if err != nil {
  58. return nil, err
  59. }
  60. student, err = CreateStudent(student)
  61. if err != nil {
  62. return nil, err
  63. }
  64. return student, nil
  65. }
  66. }
  67. func (s *Student) Read(args map[string]string, r *http.Request) (interface{}, error) {
  68. var student Student
  69. id := args["id"]
  70. if err := DB().Preload("Class").Preload("Class.Coordinator").Where("id = ?", id).Find(&student).Error; err != nil {
  71. return nil, err
  72. }
  73. if err := DB().Preload("Subject").Preload("Teacher").Preload("Class").Where("student_id=?", id).Find(&student.Activities).Error; err != nil {
  74. return nil, err
  75. }
  76. return &student, nil
  77. }
  78. func (s *Student) ReadAll(args map[string]string, r *http.Request) (interface{}, error) {
  79. var students []*Student
  80. if err := DB().Preload("Class").Preload("Class.Coordinator").Preload("Tutor").Order("surname,name").Find(&students).Error; err != nil {
  81. return nil, err
  82. }
  83. for _, student := range students {
  84. student.GetTeachers()
  85. }
  86. for _, student := range students {
  87. student.GetActivities()
  88. }
  89. return students, nil
  90. }
  91. func (s *Student) Update(args map[string]string, r *http.Request) (interface{}, error) {
  92. if r.Method == "GET" {
  93. result, err := s.Read(args, r)
  94. if err != nil {
  95. return nil, err
  96. }
  97. student := result.(*Student)
  98. if err := DB().Find(&student.AllTeachers).Error; err != nil {
  99. return nil, err
  100. }
  101. if err := DB().Find(&student.AllClasses).Error; err != nil {
  102. return nil, err
  103. }
  104. student.SelectedTeacher = make(map[uint]string)
  105. student.SelectedTeacher[student.TutorID] = "selected"
  106. student.SelectedClass = make(map[uint]string)
  107. student.SelectedClass[student.ClassID] = "selected"
  108. return student, nil
  109. } else {
  110. student, err := s.Read(args, r)
  111. if err != nil {
  112. return nil, err
  113. }
  114. // FIXME: Should not be hard set.
  115. student.(*Student).Handicap = false
  116. student.(*Student).DSA = false
  117. student.(*Student).BES = false
  118. err = renderer.Decode(student, r)
  119. if err != nil {
  120. return nil, err
  121. }
  122. _, err = SaveStudent(student)
  123. if err != nil {
  124. return nil, err
  125. }
  126. student, err = s.Read(args, r)
  127. if err != nil {
  128. return nil, err
  129. }
  130. return student.(*Student), nil
  131. }
  132. }
  133. func (s *Student) Delete(args map[string]string, r *http.Request) (interface{}, error) {
  134. student, err := s.Read(args, r)
  135. if err != nil {
  136. return nil, err
  137. }
  138. if err := DB().Unscoped().Delete(student.(*Student)).Error; err != nil {
  139. return nil, err
  140. }
  141. return student.(*Student), nil
  142. }
  143. func SaveStudent(student interface{}) (interface{}, error) {
  144. if err := DB().Omit("Class", "Tutor", "Teachers", "Activities").Save(student).Error; err != nil {
  145. return nil, err
  146. }
  147. return student, nil
  148. }
  149. func CreateStudent(student *Student) (*Student, error) {
  150. if err := DB().Create(student).Error; err != nil {
  151. return nil, err
  152. }
  153. return student, nil
  154. }
  155. func (s *Student) GetTeachers() ([]*Teacher, error) {
  156. if err := DB().Raw(selectStudentTeachers, s.ID).Scan(&s.Teachers).Error; err != nil {
  157. return nil, err
  158. }
  159. return s.Teachers, nil
  160. }
  161. func (s *Student) GetActivities() ([]*Activity, error) {
  162. if err := DB().Preload("Student").Preload("Subject").Preload("Class").Where("student_id=?", s.ID).Find(&s.Activities).Error; err != nil {
  163. return nil, err
  164. }
  165. return s.Activities, nil
  166. }
  167. func (s *Student) CompleteName() string {
  168. return fmt.Sprintf("%s %s", s.Name, s.Surname)
  169. }