From 61fccca0701272278d838db6d1bd3a868a11b860 Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Fri, 12 Nov 2021 23:52:22 +0100 Subject: [PATCH] Implement unit property for flags --- admin/sync/exercice_defines.go | 1 + admin/sync/exercice_keys.go | 1 + frontend/ui/src/components/FlagKey.svelte | 3 +++ libfic/db.go | 1 + libfic/file.go | 2 +- libfic/flag_key.go | 14 ++++++++------ libfic/team_my.go | 2 ++ 7 files changed, 17 insertions(+), 7 deletions(-) diff --git a/admin/sync/exercice_defines.go b/admin/sync/exercice_defines.go index 8bb946dd..f27e7a4c 100644 --- a/admin/sync/exercice_defines.go +++ b/admin/sync/exercice_defines.go @@ -46,6 +46,7 @@ type ExerciceFlag struct { LockedFile []ExerciceUnlockFile `toml:"unlock_file,omitempty"` NeedFlag []ExerciceDependency `toml:"need_flag,omitempty"` NoShuffle bool + Unit string `toml:"unit,omitempty"` NumberMin interface{} `toml:"min,omitempty"` NumberMax interface{} `toml:"max,omitempty"` NumberStep interface{} `toml:"step,omitempty"` diff --git a/admin/sync/exercice_keys.go b/admin/sync/exercice_keys.go index 2979f00c..c8fdb363 100644 --- a/admin/sync/exercice_keys.go +++ b/admin/sync/exercice_keys.go @@ -136,6 +136,7 @@ func buildKeyFlag(exercice fic.Exercice, flag ExerciceFlag, flagline int, defaul Label: flag.Label, Placeholder: flag.Placeholder, Help: flag.Help, + Unit: flag.Unit, IgnoreCase: !flag.CaseSensitive, Multiline: flag.Type == "text", ValidatorRegexp: validatorRegexp(flag.ValidatorRe), diff --git a/frontend/ui/src/components/FlagKey.svelte b/frontend/ui/src/components/FlagKey.svelte index f97434ab..16080d3c 100644 --- a/frontend/ui/src/components/FlagKey.svelte +++ b/frontend/ui/src/components/FlagKey.svelte @@ -171,6 +171,9 @@ {/if} + {#if flag.unit} + {flag.unit} + {/if} {/each} {#if flag.help} diff --git a/libfic/db.go b/libfic/db.go index 08c652fa..31d7bc2a 100644 --- a/libfic/db.go +++ b/libfic/db.go @@ -186,6 +186,7 @@ CREATE TABLE IF NOT EXISTS exercice_flags( type VARCHAR(255) NOT NULL, placeholder VARCHAR(255) NOT NULL, help VARCHAR(255) NOT NULL, + unit VARCHAR(255) NOT NULL, ignorecase BOOLEAN NOT NULL DEFAULT 0, multiline BOOLEAN NOT NULL DEFAULT 0, validator_regexp VARCHAR(255) NULL, diff --git a/libfic/file.go b/libfic/file.go index 750ee52b..05731881 100644 --- a/libfic/file.go +++ b/libfic/file.go @@ -330,7 +330,7 @@ func (f EFile) GetDepends() ([]Flag, error) { if err := rows.Scan(&d); err != nil { return nil, err } - deps = append(deps, FlagKey{d, f.IdExercice, 0, "", "", "", "", false, false, nil, []byte{}, 0}) + deps = append(deps, FlagKey{d, f.IdExercice, 0, "", "", "", "", "", false, false, nil, []byte{}, 0}) } if err := rows.Err(); err != nil { return nil, err diff --git a/libfic/flag_key.go b/libfic/flag_key.go index 1b991bed..bc5865b8 100644 --- a/libfic/flag_key.go +++ b/libfic/flag_key.go @@ -25,6 +25,8 @@ type FlagKey struct { Placeholder string `json:"placeholder"` // Help is a description of the flag Help string `json:"help"` + // Unit is another indication appended to the input + Unit string `json:"unit"` // IgnoreCase indicates if the case is sensitive to case or not IgnoreCase bool `json:"ignorecase"` // Multiline indicates if the flag is stored on multiple lines @@ -39,7 +41,7 @@ type FlagKey struct { // GetFlagKeys returns a list of key's flags comming with the challenge. func (e Exercice) GetFlagKeys() ([]FlagKey, error) { - if rows, err := DBQuery("SELECT id_flag, id_exercice, ordre, label, type, placeholder, help, ignorecase, multiline, validator_regexp, cksum, choices_cost FROM exercice_flags WHERE id_exercice = ?", e.Id); err != nil { + if rows, err := DBQuery("SELECT id_flag, id_exercice, ordre, label, type, placeholder, help, unit, ignorecase, multiline, validator_regexp, cksum, choices_cost FROM exercice_flags WHERE id_exercice = ?", e.Id); err != nil { return nil, err } else { defer rows.Close() @@ -49,7 +51,7 @@ func (e Exercice) GetFlagKeys() ([]FlagKey, error) { var k FlagKey k.IdExercice = e.Id - if err := rows.Scan(&k.Id, &k.IdExercice, &k.Order, &k.Label, &k.Type, &k.Placeholder, &k.Help, &k.IgnoreCase, &k.Multiline, &k.ValidatorRegexp, &k.Checksum, &k.ChoicesCost); err != nil { + if err := rows.Scan(&k.Id, &k.IdExercice, &k.Order, &k.Label, &k.Type, &k.Placeholder, &k.Help, &k.Unit, &k.IgnoreCase, &k.Multiline, &k.ValidatorRegexp, &k.Checksum, &k.ChoicesCost); err != nil { return nil, err } @@ -65,13 +67,13 @@ func (e Exercice) GetFlagKeys() ([]FlagKey, error) { // GetFlagKey returns a list of flags comming with the challenge. func GetFlagKey(id int) (k FlagKey, err error) { - err = DBQueryRow("SELECT id_flag, id_exercice, ordre, label, type, placeholder, help, ignorecase, multiline, validator_regexp, cksum, choices_cost FROM exercice_flags WHERE id_flag = ?", id).Scan(&k.Id, &k.IdExercice, &k.Order, &k.Label, &k.Type, &k.Placeholder, &k.Help, &k.IgnoreCase, &k.Multiline, &k.ValidatorRegexp, &k.Checksum, &k.ChoicesCost) + err = DBQueryRow("SELECT id_flag, id_exercice, ordre, label, type, placeholder, help, unit, ignorecase, multiline, validator_regexp, cksum, choices_cost FROM exercice_flags WHERE id_flag = ?", id).Scan(&k.Id, &k.IdExercice, &k.Order, &k.Label, &k.Type, &k.Placeholder, &k.Help, &k.Unit, &k.IgnoreCase, &k.Multiline, &k.ValidatorRegexp, &k.Checksum, &k.ChoicesCost) return } // GetFlagKeyByLabel returns a flag matching the given label. func (e Exercice) GetFlagKeyByLabel(label string) (k FlagKey, err error) { - err = DBQueryRow("SELECT id_flag, id_exercice, ordre, label, type, placeholder, help, ignorecase, multiline, validator_regexp, cksum, choices_cost FROM exercice_flags WHERE type LIKE ? AND id_exercice = ?", label, e.Id).Scan(&k.Id, &k.IdExercice, &k.Order, &k.Label, &k.Type, &k.Placeholder, &k.Help, &k.IgnoreCase, &k.Multiline, &k.ValidatorRegexp, &k.Checksum, &k.ChoicesCost) + err = DBQueryRow("SELECT id_flag, id_exercice, ordre, label, type, placeholder, help, unit, ignorecase, multiline, validator_regexp, cksum, choices_cost FROM exercice_flags WHERE type LIKE ? AND id_exercice = ?", label, e.Id).Scan(&k.Id, &k.IdExercice, &k.Order, &k.Label, &k.Type, &k.Placeholder, &k.Help, &k.Unit, &k.IgnoreCase, &k.Multiline, &k.ValidatorRegexp, &k.Checksum, &k.ChoicesCost) return } @@ -155,7 +157,7 @@ func (k FlagKey) Create(e Exercice) (Flag, error) { } } - if res, err := DBExec("INSERT INTO exercice_flags (id_exercice, ordre, label, type, placeholder, help, ignorecase, multiline, validator_regexp, cksum, choices_cost) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", e.Id, k.Order, k.Label, k.Type, k.Placeholder, k.Help, k.IgnoreCase, k.Multiline, k.ValidatorRegexp, k.Checksum, k.ChoicesCost); err != nil { + if res, err := DBExec("INSERT INTO exercice_flags (id_exercice, ordre, label, type, placeholder, help, unit, ignorecase, multiline, validator_regexp, cksum, choices_cost) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", e.Id, k.Order, k.Label, k.Type, k.Placeholder, k.Help, k.Unit, k.IgnoreCase, k.Multiline, k.ValidatorRegexp, k.Checksum, k.ChoicesCost); err != nil { return k, err } else if kid, err := res.LastInsertId(); err != nil { return k, err @@ -180,7 +182,7 @@ func (k FlagKey) Update() (int64, error) { } } - if res, err := DBExec("UPDATE exercice_flags SET id_exercice = ?, ordre = ?, label = ?, type = ?, placeholder = ?, help = ?, ignorecase = ?, multiline = ?, validator_regexp = ?, cksum = ?, choices_cost = ? WHERE id_flag = ?", k.IdExercice, k.Order, k.Label, k.Type, k.Placeholder, k.Help, k.IgnoreCase, k.Multiline, k.ValidatorRegexp, k.Checksum, k.ChoicesCost, k.Id); err != nil { + if res, err := DBExec("UPDATE exercice_flags SET id_exercice = ?, ordre = ?, label = ?, type = ?, placeholder = ?, help = ?, unit = ?, ignorecase = ?, multiline = ?, validator_regexp = ?, cksum = ?, choices_cost = ? WHERE id_flag = ?", k.IdExercice, k.Order, k.Label, k.Type, k.Placeholder, k.Help, k.Unit, k.IgnoreCase, k.Multiline, k.ValidatorRegexp, k.Checksum, k.ChoicesCost, k.Id); err != nil { return 0, err } else if nb, err := res.RowsAffected(); err != nil { return 0, err diff --git a/libfic/team_my.go b/libfic/team_my.go index 19196c0c..427382b5 100644 --- a/libfic/team_my.go +++ b/libfic/team_my.go @@ -34,6 +34,7 @@ type myTeamFlag struct { Type string `json:"type,omitempty"` Placeholder string `json:"placeholder,omitempty"` Help string `json:"help,omitempty"` + Unit string `json:"unit,omitempty"` Separator string `json:"separator,omitempty"` NbLines uint64 `json:"nb_lines,omitempty"` IgnoreOrder bool `json:"ignore_order,omitempty"` @@ -205,6 +206,7 @@ func MyJSONTeam(t *Team, started bool) (interface{}, error) { Type: k.Type, order: k.Order, Help: k.Help, + Unit: k.Unit, } if strings.HasPrefix(flag.Type, "number") {