teacher.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. package orm
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/jinzhu/gorm"
  6. "gogs.carducci-dante.gov.it/karmen/config"
  7. )
  8. type Teacher struct {
  9. gorm.Model
  10. Credential
  11. Classes []Class
  12. Subjects []Subject
  13. Activities []Activity
  14. Departments []Department
  15. Issues []Issue
  16. Hours int
  17. CurrHours int
  18. TheBossId uint
  19. }
  20. var (
  21. selectUniqueTeacherClasses = `
  22. SELECT DISTINCT classes.* FROM activities
  23. INNER JOIN classes on classes.id=activities.class_id
  24. WHERE teacher_id=?`
  25. selectUniqueTeacherSubjects = `
  26. SELECT DISTINCT subjects.* FROM activities
  27. INNER JOIN subjects on subjects.id=activities.subject_id
  28. WHERE activities.teacher_id=?`
  29. )
  30. func GetTeachers() ([]*Teacher, error) {
  31. var teachers []*Teacher
  32. if err := DB().Order("surname,name").Find(&teachers).Error; err != nil {
  33. return nil, err
  34. }
  35. return teachers, nil
  36. }
  37. func (t *Teacher) GetClasses() ([]Class, error) {
  38. if err := DB().Raw(selectUniqueTeacherClasses, t.ID).Scan(&t.Classes).Error; err != nil {
  39. return nil, err
  40. }
  41. return t.Classes, nil
  42. }
  43. func (t *Teacher) Create(db *gorm.DB, record map[string]interface{}) error {
  44. result := new(Teacher)
  45. if name := record["name"]; name == nil {
  46. return errors.New("Error in creating teacher: field name is empty")
  47. } else {
  48. result.Name = name.(string)
  49. }
  50. if surname := record["surname"]; surname == nil {
  51. return errors.New("Error in creating teacher: field surname is empty")
  52. } else {
  53. result.Surname = surname.(string)
  54. }
  55. db.Create(result)
  56. return nil
  57. }
  58. func (t *Teacher) CalcHours(tx *gorm.DB) {
  59. var (
  60. activities []Activity
  61. sum int
  62. )
  63. if err := tx.Model(t).Related(&activities).Error; err != nil {
  64. panic(err)
  65. }
  66. for _, a := range activities {
  67. sum += a.Hours
  68. }
  69. if err := tx.Model(t).Update("curr_hours", sum).Error; err != nil {
  70. panic(err)
  71. }
  72. }
  73. func (t Teacher) GetSubjectsByClassID(classID uint) []Subject {
  74. var (
  75. activities []Activity
  76. subjects []Subject
  77. )
  78. if err := DB().Model(t).Preload("Subject").Related(&activities).Error; err != nil {
  79. panic(err)
  80. }
  81. for _, a := range activities {
  82. if a.ClassID == classID {
  83. subjects = append(subjects, a.Subject)
  84. }
  85. }
  86. return subjects
  87. }
  88. func (t Teacher) IsCoordinator() []Class {
  89. var (
  90. classes []Class
  91. output []Class
  92. )
  93. if err := DB().Model(t).Related(&classes, "Classes").Error; err != nil {
  94. panic(err)
  95. }
  96. for _, class := range classes {
  97. if class.CoordinatorID == t.ID {
  98. output = append(output, class)
  99. }
  100. }
  101. return output
  102. }
  103. func (t Teacher) IsCoordinatorInClass(className string) bool {
  104. var classes []Class
  105. if err := DB().Model(t).Where("name = ?", className).Related(&classes, "Classes").Error; err != nil {
  106. panic(err)
  107. }
  108. for _, class := range classes {
  109. if class.CoordinatorID == t.ID {
  110. return true
  111. }
  112. }
  113. return false
  114. }
  115. func (t Teacher) HasClass(name string) bool {
  116. var classes []Class
  117. if err := DB().Model(t).Related(&classes, "Classes").Error; err != nil {
  118. panic(err)
  119. }
  120. for _, class := range classes {
  121. if class.Name == name {
  122. return true
  123. }
  124. }
  125. return false
  126. }
  127. func (t Teacher) HasSubject(name string) bool {
  128. var subjects []Subject
  129. if err := DB().Model(t).Related(&subjects, "Subjects").Error; err != nil {
  130. panic(err)
  131. }
  132. for _, subject := range subjects {
  133. if subject.Name == name {
  134. return true
  135. }
  136. }
  137. return false
  138. }
  139. func (t Teacher) HasSubjectInClass(subjectName string, className string) bool {
  140. var classes []Class
  141. if err := DB().Where("name = ?", className).Find(&classes).Error; err != nil {
  142. panic(err)
  143. }
  144. subjects := t.GetSubjectsByClassID(classes[0].ID)
  145. for _, s := range subjects {
  146. if s.Name == subjectName {
  147. return true
  148. }
  149. }
  150. return false
  151. }
  152. func (t Teacher) IsMinuter() []Class {
  153. var (
  154. classes []Class
  155. output []Class
  156. )
  157. if err := DB().Model(t).Related(&classes, "Classes").Error; err != nil {
  158. panic(err)
  159. }
  160. for _, class := range classes {
  161. if class.MinuterID == t.ID {
  162. output = append(output, class)
  163. }
  164. }
  165. return output
  166. }
  167. // func (t *Teacher) CheckForIssues(tx *gorm.DB) {
  168. // if t.CurrHours != t.Hours {
  169. // var issues []Issue
  170. // if err := tx.Where("type = ? and reported = ?", IssueTeacherHours, 1).Model(t).Related(&issues).Error; err != nil {
  171. // panic(err)
  172. // }
  173. // if len(issues) == 0 {
  174. // desc := fmt.Sprintf(
  175. // "Le ore relative alla cattedra del docente %s %s non coincidono con la somma delle ore delle sue attività (%d/%d)",
  176. // t.Surname, t.Name,
  177. // t.CurrHours, t.Hours)
  178. // issue := Issue{
  179. // Type: IssueTeacherHours,
  180. // Description: desc,
  181. // Reported: true,
  182. // TeacherID: t.ID,
  183. // }
  184. // if err := tx.Save(&issue).Error; err != nil {
  185. // panic(err)
  186. // }
  187. // } else {
  188. // issues[0].Description = fmt.Sprintf(
  189. // "Le ore relative alla cattedra del docente %s %s non coincidono con la somma delle ore delle sue attività (%d/%d)",
  190. // t.Surname, t.Name,
  191. // t.CurrHours, t.Hours)
  192. // if err := tx.Save(&issues[0]).Error; err != nil {
  193. // panic(err)
  194. // }
  195. // }
  196. // } else {
  197. // var issues []Issue
  198. // if err := tx.Where("type = ? and reported = ?", IssueTeacherHours, 1).Model(t).Related(&issues).Error; err != nil {
  199. // panic(err)
  200. // }
  201. // if len(issues) > 0 {
  202. // if err := tx.Delete(&issues[0]).Error; err != nil {
  203. // panic(err)
  204. // }
  205. // }
  206. // }
  207. // }
  208. func (t *Teacher) generateCredential() error {
  209. t.Username = t.GenerateUsername()
  210. t.Password = t.GenerateSaltedPassword(t.Username)
  211. t.Email = fmt.Sprintf("%s@%s", t.Username, config.Config.Domain)
  212. return nil
  213. }
  214. func (t *Teacher) CheckForIssues(tx *gorm.DB) {
  215. // issue := newTeacherMaxHoursIssue(t)
  216. // if t.CurrHours != t.Hours {
  217. // issue.createIfNotExist(t)
  218. // } else {
  219. // issue.resetIfExist(t)
  220. // }
  221. }
  222. func (t *Teacher) BeforeCreate(tx *gorm.DB) error {
  223. // FIXME: should re-generate only if related columns are modified
  224. t.generateCredential()
  225. return nil
  226. }
  227. func (t *Teacher) BeforeUpdate(tx *gorm.DB) error {
  228. // FIXME: should re-generate only if related columns are modified
  229. t.generateCredential()
  230. return nil
  231. }
  232. // func (t *Teacher) AfterUpdate(tx *gorm.DB) error {
  233. // // FIXME: should re-generate only if related columns are modified
  234. // t.generateCredential()
  235. // // t.CheckForIssues(tx)
  236. // return nil
  237. // }
  238. func (t *Teacher) AfterDelete(tx *gorm.DB) error {
  239. var issues []Issue
  240. if err := tx.Where("type = ?", IssueTeacherHours).Model(t).Related(&issues).Error; err != nil {
  241. panic(err)
  242. }
  243. if err := tx.Delete(&issues).Error; err != nil {
  244. panic(err)
  245. }
  246. return nil
  247. }