teacher.go 6.8 KB

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