score.go 988 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package sessionmanager
  2. import (
  3. "fmt"
  4. "log"
  5. "git.andreafazzi.eu/andrea/probo/pkg/models"
  6. "git.andreafazzi.eu/andrea/probo/pkg/store/file"
  7. )
  8. type Score struct {
  9. Exam *models.Exam
  10. Score float32
  11. }
  12. type Scores []*Score
  13. func NewScores(responseFileStore *file.ResponseFileStore, session *models.Session) (Scores, error) {
  14. var scores Scores
  15. for _, exam := range session.Exams {
  16. response, err := responseFileStore.Read(exam.ID)
  17. if err != nil {
  18. log.Println(err)
  19. continue
  20. }
  21. scores = append(scores, CalcScore(response, exam))
  22. }
  23. return scores, nil
  24. }
  25. func (ss Scores) String() string {
  26. var result string
  27. for _, s := range ss {
  28. result += fmt.Sprintf("%v\t%f\n", s.Exam.Participant, s.Score)
  29. }
  30. return result
  31. }
  32. func CalcScore(response *models.Response, exam *models.Exam) *Score {
  33. var score float32
  34. for _, q := range exam.Quizzes {
  35. answerId := response.Questions[q.Question.ID]
  36. if answerId == q.Correct.ID {
  37. score++
  38. }
  39. }
  40. return &Score{exam, score}
  41. }