Add rank in contest show view
This commit is contained in:
parent
7eebab73af
commit
e0f5b12575
3 changed files with 63 additions and 1 deletions
|
@ -4,6 +4,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -38,6 +39,7 @@ type Contest struct {
|
||||||
Responses []*Response
|
Responses []*Response
|
||||||
StartedResponses []*Response
|
StartedResponses []*Response
|
||||||
SavedResponses []*Response
|
SavedResponses []*Response
|
||||||
|
Rank []*Response
|
||||||
|
|
||||||
prevStartTime time.Time
|
prevStartTime time.Time
|
||||||
}
|
}
|
||||||
|
@ -99,11 +101,24 @@ func (c *Contest) Read(db *Database, args map[string]string, w http.ResponseWrit
|
||||||
Preload("SavedResponses", func(tx *gorm.DB) *gorm.DB {
|
Preload("SavedResponses", func(tx *gorm.DB) *gorm.DB {
|
||||||
return db.DB().Where("end_time <> ?", time.Time{})
|
return db.DB().Where("end_time <> ?", time.Time{})
|
||||||
}).
|
}).
|
||||||
|
Preload("Rank", func(tx *gorm.DB) *gorm.DB {
|
||||||
|
return db.DB().Order("end_time ASC")
|
||||||
|
}).
|
||||||
Preload("Questions").
|
Preload("Questions").
|
||||||
First(&contest, id).Error; err != nil {
|
First(&contest, id).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, r := range contest.Rank {
|
||||||
|
if err := calcScore(db, r); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.SliceStable(contest.Rank, func(i, j int) bool {
|
||||||
|
return contest.Rank[i].Score < contest.Rank[j].Score
|
||||||
|
})
|
||||||
|
|
||||||
return &contest, nil
|
return &contest, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,8 @@ type Response struct {
|
||||||
EndTime time.Time
|
EndTime time.Time
|
||||||
TimeLeft time.Duration
|
TimeLeft time.Duration
|
||||||
|
|
||||||
Score int `gorm:"-"`
|
Score int `gorm:"-"`
|
||||||
|
ScoreString string `gorm:"-"`
|
||||||
|
|
||||||
Questions []*Question
|
Questions []*Question
|
||||||
SingleResponses []*SingleResponse `gorm:"-"`
|
SingleResponses []*SingleResponse `gorm:"-"`
|
||||||
|
@ -103,6 +104,37 @@ func (model *Response) BeforeSave(tx *gorm.DB) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func calcScore(db *Database, response *Response) error {
|
||||||
|
response.Score = 0
|
||||||
|
if response.AnswersIDs != "" {
|
||||||
|
srIDs := strings.Split(response.AnswersIDs, " ")
|
||||||
|
for _, srID := range srIDs {
|
||||||
|
id, err := strconv.Atoi(srID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
response.SingleResponses = append(response.SingleResponses, &SingleResponse{uint(id)})
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, sr := range response.SingleResponses {
|
||||||
|
var answer Answer
|
||||||
|
|
||||||
|
if err := db._db.First(&answer, sr.AnswerID).Error; err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if answer.Correct {
|
||||||
|
response.Score++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
response.ScoreString = fmt.Sprintf("%s punti %v", strconv.Itoa(response.Score), response.EndTime.Sub(response.StartTime))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (model *Response) Create(db *Database, args map[string]string, w http.ResponseWriter, r *http.Request) (interface{}, error) {
|
func (model *Response) Create(db *Database, args map[string]string, w http.ResponseWriter, r *http.Request) (interface{}, error) {
|
||||||
if r.Method == "GET" {
|
if r.Method == "GET" {
|
||||||
response := new(Response)
|
response := new(Response)
|
||||||
|
@ -151,6 +183,7 @@ func (model *Response) Read(db *Database, args map[string]string, w http.Respons
|
||||||
}
|
}
|
||||||
|
|
||||||
if response.AnswersIDs != "" {
|
if response.AnswersIDs != "" {
|
||||||
|
response.Score = 0
|
||||||
srIDs := strings.Split(response.AnswersIDs, " ")
|
srIDs := strings.Split(response.AnswersIDs, " ")
|
||||||
for _, srID := range srIDs {
|
for _, srID := range srIDs {
|
||||||
id, err := strconv.Atoi(srID)
|
id, err := strconv.Atoi(srID)
|
||||||
|
|
|
@ -66,6 +66,20 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
|
||||||
|
{{$options := `
|
||||||
|
title: "Classifica"
|
||||||
|
model: "Response"
|
||||||
|
icon: "fa fa-hourglass"
|
||||||
|
`}}
|
||||||
|
|
||||||
|
{{$noElements := "Nessun partecipante ha ancora consegnato la prova."}}
|
||||||
|
{{template "relation_list" dict "options" ($options|yaml) "data" .Data.Rank "noElements" $noElements "small" (toSlice "ScoreString")}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
Loading…
Reference in a new issue