From ae5068f8b83e61ebdba02329eefbccedb969cecc Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Sun, 17 Mar 2024 10:17:39 +0100 Subject: [PATCH] Split Unlock standalone exercices between themes and standalone ex --- admin/api/settings.go | 3 ++- admin/static/views/settings.html | 11 +++++++++-- checker/main.go | 3 ++- generator/main.go | 5 +++-- libfic/team.go | 15 ++++++++++----- libfic/team_my.go | 7 +++++-- settings/settings.go | 6 ++++-- 7 files changed, 35 insertions(+), 15 deletions(-) diff --git a/admin/api/settings.go b/admin/api/settings.go index d3074a58..732240b8 100644 --- a/admin/api/settings.go +++ b/admin/api/settings.go @@ -318,7 +318,8 @@ func ApplySettings(config *settings.Settings) { fic.DisplayAllFlags = config.DisplayAllFlags fic.HideCaseSensitivity = config.HideCaseSensitivity fic.UnlockedStandaloneExercices = config.UnlockedStandaloneExercices - fic.UnlockedStandaloneExercicesByValidation = config.UnlockedStandaloneExercicesByValidation + fic.UnlockedStandaloneExercicesByThemeStepValidation = config.UnlockedStandaloneExercicesByThemeStepValidation + fic.UnlockedStandaloneExercicesByStandaloneExerciceValidation = config.UnlockedStandaloneExercicesByStandaloneExerciceValidation fic.DisplayMCQBadCount = config.DisplayMCQBadCount fic.FirstBlood = config.FirstBlood fic.SubmissionCostBase = config.SubmissionCostBase diff --git a/admin/static/views/settings.html b/admin/static/views/settings.html index 68dbe111..77fa4f67 100644 --- a/admin/static/views/settings.html +++ b/admin/static/views/settings.html @@ -145,9 +145,16 @@
- +
- + +
+
+ +
+ +
+
diff --git a/checker/main.go b/checker/main.go index 8f1e53a1..03befb8d 100644 --- a/checker/main.go +++ b/checker/main.go @@ -80,7 +80,8 @@ func reloadSettings(config *settings.Settings) { fic.UnlockedChallengeDepth = config.UnlockedChallengeDepth fic.UnlockedChallengeUpTo = config.UnlockedChallengeUpTo fic.UnlockedStandaloneExercices = config.UnlockedStandaloneExercices - fic.UnlockedStandaloneExercicesByValidation = config.UnlockedStandaloneExercicesByValidation + fic.UnlockedStandaloneExercicesByThemeStepValidation = config.UnlockedStandaloneExercicesByThemeStepValidation + fic.UnlockedStandaloneExercicesByStandaloneExerciceValidation = config.UnlockedStandaloneExercicesByStandaloneExerciceValidation fic.DisplayAllFlags = config.DisplayAllFlags fic.FirstBlood = config.FirstBlood diff --git a/generator/main.go b/generator/main.go index 313c4b8d..050bfbc9 100644 --- a/generator/main.go +++ b/generator/main.go @@ -30,14 +30,15 @@ func reloadSettings(config *settings.Settings) { fic.WChoiceCoefficient = config.WChoiceCurCoefficient fic.ExerciceCurrentCoefficient = config.ExerciceCurCoefficient ChStarted = config.Start.Unix() > 0 && time.Since(config.Start) >= 0 - if allowRegistration != config.AllowRegistration || fic.PartialValidation != config.PartialValidation || fic.UnlockedChallengeDepth != config.UnlockedChallengeDepth || fic.UnlockedStandaloneExercices != config.UnlockedStandaloneExercices || fic.UnlockedStandaloneExercicesByValidation != config.UnlockedStandaloneExercicesByValidation || fic.UnlockedChallengeUpTo != config.UnlockedChallengeUpTo || fic.DisplayAllFlags != config.DisplayAllFlags || fic.FirstBlood != config.FirstBlood || fic.SubmissionCostBase != config.SubmissionCostBase || fic.SubmissionUniqueness != config.SubmissionUniqueness || fic.DiscountedFactor != config.DiscountedFactor || fic.HideCaseSensitivity != config.HideCaseSensitivity { + if allowRegistration != config.AllowRegistration || fic.PartialValidation != config.PartialValidation || fic.UnlockedChallengeDepth != config.UnlockedChallengeDepth || fic.UnlockedStandaloneExercices != config.UnlockedStandaloneExercices || fic.UnlockedStandaloneExercicesByThemeStepValidation != config.UnlockedStandaloneExercicesByThemeStepValidation || fic.UnlockedStandaloneExercicesByStandaloneExerciceValidation != config.UnlockedStandaloneExercicesByStandaloneExerciceValidation || fic.UnlockedChallengeUpTo != config.UnlockedChallengeUpTo || fic.DisplayAllFlags != config.DisplayAllFlags || fic.FirstBlood != config.FirstBlood || fic.SubmissionCostBase != config.SubmissionCostBase || fic.SubmissionUniqueness != config.SubmissionUniqueness || fic.DiscountedFactor != config.DiscountedFactor || fic.HideCaseSensitivity != config.HideCaseSensitivity { allowRegistration = config.AllowRegistration fic.PartialValidation = config.PartialValidation fic.UnlockedChallengeDepth = config.UnlockedChallengeDepth fic.UnlockedChallengeUpTo = config.UnlockedChallengeUpTo fic.UnlockedStandaloneExercices = config.UnlockedStandaloneExercices - fic.UnlockedStandaloneExercicesByValidation = config.UnlockedStandaloneExercicesByValidation + fic.UnlockedStandaloneExercicesByThemeStepValidation = config.UnlockedStandaloneExercicesByThemeStepValidation + fic.UnlockedStandaloneExercicesByStandaloneExerciceValidation = config.UnlockedStandaloneExercicesByStandaloneExerciceValidation fic.DisplayAllFlags = config.DisplayAllFlags fic.FirstBlood = config.FirstBlood diff --git a/libfic/team.go b/libfic/team.go index 58394c7a..bb030ae2 100644 --- a/libfic/team.go +++ b/libfic/team.go @@ -127,12 +127,12 @@ func (t *Team) HasAccess(e *Exercice) bool { return true } - sc, err := t.SolvedCount() - if sc == nil || err != nil { + nbsteps, nbexos, err := t.SolvedCount() + if nbsteps == nil || nbexos == nil || err != nil { return false } - if ord < UnlockedStandaloneExercices+int(UnlockedStandaloneExercicesByValidation*float64(*sc)) { + if ord < UnlockedStandaloneExercices+int(math.Floor(UnlockedStandaloneExercicesByThemeStepValidation*float64(*nbsteps)))+int(math.Floor(UnlockedStandaloneExercicesByStandaloneExerciceValidation*float64(*nbexos))) { return true } @@ -321,8 +321,13 @@ func (t *Team) LastTryDist(e *Exercice) int64 { } // SolvedCount returns the number of solved exercices. -func (t *Team) SolvedCount() (nb *int64, err error) { - err = DBQueryRow("SELECT COUNT(*) FROM exercice_solved WHERE id_team = ?", t.Id).Scan(&nb) +func (t *Team) SolvedCount() (nbsteps *int64, nbex *int64, err error) { + err = DBQueryRow("SELECT COUNT(S.id_exercice) FROM exercice_solved S INNER JOIN exercices E ON E.id_exercice = S.id_exercice WHERE S.id_team = ? AND E.id_theme IS NOT NULL", t.Id).Scan(&nbsteps) + if err != nil { + return + } + + err = DBQueryRow("SELECT COUNT(S.id_exercice) FROM exercice_solved S INNER JOIN exercices E ON E.id_exercice = S.id_exercice WHERE S.id_team = ? AND E.id_theme IS NULL", t.Id).Scan(&nbex) return } diff --git a/libfic/team_my.go b/libfic/team_my.go index 341ed0e5..64f03779 100644 --- a/libfic/team_my.go +++ b/libfic/team_my.go @@ -25,8 +25,11 @@ var HideCaseSensitivity bool // UnlockedStandaloneExercices unlock this number of standalone exercice. var UnlockedStandaloneExercices int -// UnlockedStandaloneExercicesByValidation unlock this number of standalone exercice for each exercice validated. -var UnlockedStandaloneExercicesByValidation float64 +// UnlockedStandaloneExercicesByThemeStepValidation unlock this number of standalone exercice for each theme step validated. +var UnlockedStandaloneExercicesByThemeStepValidation float64 + +// UnlockedStandaloneExercicesByStandaloneExerciceValidation unlock this number of standalone exercice for each standalone exercice validated. +var UnlockedStandaloneExercicesByStandaloneExerciceValidation float64 type myTeamFile struct { Path string `json:"path"` diff --git a/settings/settings.go b/settings/settings.go index 116cf475..e9ff3764 100644 --- a/settings/settings.go +++ b/settings/settings.go @@ -73,8 +73,10 @@ type Settings struct { UnlockedChallengeUpTo int `json:"unlockedChallengeUpTo"` // UnlockedStandaloneExercices unlock this number of standalone exercice. UnlockedStandaloneExercices int `json:"unlockedStandaloneExercices,omitempty"` - // UnlockedStandaloneExercicesByValidation unlock this number of standalone exercice for each exercice validated. - UnlockedStandaloneExercicesByValidation float64 `json:"unlockedStandaloneExercicesByValidation,omitempty"` + // UnlockedStandaloneExercicesByThemeStepValidation unlock this number of standalone exercice for each theme step validated. + UnlockedStandaloneExercicesByThemeStepValidation float64 `json:"unlockedStandaloneExercicesByThemeStepValidation,omitempty"` + // UnlockedStandaloneExercicesByStandaloneExerciceValidation unlock this number of standalone exercice for each standalone exercice validated. + UnlockedStandaloneExercicesByStandaloneExerciceValidation float64 `json:"unlockedStandaloneExercicesByStandaloneExerciceValidation,omitempty"` // SubmissionUniqueness don't count multiple times identical tries. SubmissionUniqueness bool `json:"submissionUniqueness,omitempty"` // CountOnlyNotGoodTries don't count as a try when one good response is given at least.