admin: Better identify tries on exercice page
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
38e3a4efdf
commit
f6713c768b
6 changed files with 177 additions and 3 deletions
102
libfic/exercice_tries.go
Normal file
102
libfic/exercice_tries.go
Normal file
|
@ -0,0 +1,102 @@
|
|||
package fic
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
type ExerciceTryDetail struct {
|
||||
Kind string `json:"kind"`
|
||||
RelatedId int64 `json:"related"`
|
||||
}
|
||||
|
||||
type ExerciceTry struct {
|
||||
Id int64 `json:"id"`
|
||||
IdTeam int64 `json:"id_team"`
|
||||
Time time.Time `json:"time"`
|
||||
Checksum []byte `json:"checksum"`
|
||||
NbDiff int64 `json:"nb_diff"`
|
||||
OneGood bool `json:"one_good"`
|
||||
Details []ExerciceTryDetail `json:"details,omitempty"`
|
||||
}
|
||||
|
||||
// TriesList returns a list of tries related to the exercice.
|
||||
func (e *Exercice) TriesList() ([]*ExerciceTry, error) {
|
||||
tries_table := "exercice_tries"
|
||||
if SubmissionUniqueness {
|
||||
tries_table = "exercice_distinct_tries"
|
||||
}
|
||||
|
||||
if rows, err := DBQuery("SELECT id_try, id_team, time, cksum, nbdiff, onegood FROM "+tries_table+" WHERE id_exercice = ?", e.Id); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
defer rows.Close()
|
||||
|
||||
var tries []*ExerciceTry
|
||||
for rows.Next() {
|
||||
var try ExerciceTry
|
||||
if err := rows.Scan(&try.Id, &try.IdTeam, &try.Time, &try.Checksum, &try.NbDiff, &try.OneGood); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
tries = append(tries, &try)
|
||||
}
|
||||
|
||||
return tries, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (e *Exercice) GetTry(id int64) (try *ExerciceTry, err error) {
|
||||
try = &ExerciceTry{}
|
||||
err = DBQueryRow("SELECT id_try, id_team, time, cksum, nbdiff, onegood FROM exercice_tries WHERE id_exercice = ? AND id_try = ?", e.Id, id).Scan(&try.Id, &try.IdTeam, &try.Time, &try.Checksum, &try.NbDiff, &try.OneGood)
|
||||
return
|
||||
}
|
||||
|
||||
func (try *ExerciceTry) FillDetails() error {
|
||||
if rows, err := DBQuery("SELECT id_flag FROM exercice_tries_flags WHERE id_try = ?", try.Id); err != nil {
|
||||
return err
|
||||
} else {
|
||||
defer rows.Close()
|
||||
|
||||
for rows.Next() {
|
||||
var relatedid int64
|
||||
if err := rows.Scan(&relatedid); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
try.Details = append(try.Details, ExerciceTryDetail{
|
||||
Kind: "flag",
|
||||
RelatedId: relatedid,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
if rows, err := DBQuery("SELECT id_mcq FROM exercice_tries_mcq WHERE id_try = ?", try.Id); err != nil {
|
||||
return err
|
||||
} else {
|
||||
defer rows.Close()
|
||||
|
||||
for rows.Next() {
|
||||
var relatedid int64
|
||||
if err := rows.Scan(&relatedid); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
try.Details = append(try.Details, ExerciceTryDetail{
|
||||
Kind: "mcq",
|
||||
RelatedId: relatedid,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (try *ExerciceTry) Delete() (int64, error) {
|
||||
if res, err := DBExec("DELETE FROM exercice_tries WHERE id_try = ?", try.Id); err != nil {
|
||||
return 0, err
|
||||
} else if nb, err := res.RowsAffected(); err != nil {
|
||||
return 0, err
|
||||
} else {
|
||||
return nb, err
|
||||
}
|
||||
}
|
Reference in a new issue