Compare commits

...

5 Commits

Author SHA1 Message Date
nemunaire 28815f68c2 repochecker: Remove indication on how to circumvent forbidden-string
continuous-integration/drone/push Build is failing Details
2024-05-18 03:21:46 +02:00
nemunaire eeced21be8 sync: Allow justified as flag type
continuous-integration/drone/push Build is passing Details
2024-05-18 00:28:59 +02:00
nemunaire 651d428223 sync: Prefer challenge.toml over challenge.txt
continuous-integration/drone/push Build is passing Details
2024-05-16 13:09:13 +02:00
nemunaire b5065df4c3 ui: Prepare publication 2024-05-16 13:09:13 +02:00
nemunaire 5ece912ec9 ui: Remove old content 2024-05-16 13:09:13 +02:00
21 changed files with 32 additions and 24 deletions

View File

@ -27,6 +27,6 @@ COPY --from=gobuild /go/src/srs.epita.fr/fic-server/dashboard/dashboard /srv/das
COPY dashboard/static/index.html /srv/htdocs-dashboard/
COPY admin/static/css/bootstrap.min.css dashboard/static/css/fic.css admin/static/css/glyphicon.css /srv/htdocs-dashboard/css/
COPY admin/static/fonts /srv/htdocs-dashboard/fonts
COPY frontend/fic/static/img/ dashboard/static/img/srs.png /srv/htdocs-dashboard/img/
COPY dashboard/static/img/srs.png /srv/htdocs-dashboard/img/
COPY dashboard/static/js/dashboard.js admin/static/js/angular.min.js dashboard/static/js/angular-animate.min.js admin/static/js/angular-route.min.js admin/static/js/angular-sanitize.min.js admin/static/js/bootstrap.min.js admin/static/js/common.js admin/static/js/d3.v3.min.js admin/static/js/jquery.min.js /srv/htdocs-dashboard/js/
COPY admin/static/js/i18n/* /srv/htdocs-dashboard/js/i18n/

View File

@ -31,6 +31,9 @@ func declareExportRoutes(router *gin.RouterGroup) {
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": err.Error()})
return
}
s.End = nil
s.NextChangeTime = nil
s.DelegatedQA = []string{}
teams, err := fic.ExportTeams(false)
if err != nil {

View File

@ -73,7 +73,7 @@ func main() {
func treatDir(p string) {
var expath string
for _, f := range []string{"challenge.txt", "challenge.toml"} {
for _, f := range []string{"challenge.toml", "challenge.txt"} {
if sync.GlobalImporter.Exists(path.Join(p, f)) {
expath = p
break
@ -108,7 +108,7 @@ func treatExercice(expath string) {
paramsFiles, err := sync.GetExerciceFilesParams(sync.GlobalImporter, exercice)
if err != nil {
log.Printf("Unable to read challenge.txt %q: %s", expath, err.Error())
log.Printf("Unable to read challenge.toml %q: %s", expath, err.Error())
return
}

View File

@ -106,9 +106,9 @@ func NewChallengeTxtError(exercice *fic.Exercice, line uint, err error, theme ..
func (e *ChallengeTxtError) Error() string {
if e.ChallengeTxtLine != 0 {
return fmt.Sprintf("%s:%d: %s", path.Join(e.ExercicePath, "challenge.txt"), e.ChallengeTxtLine, e.ThemeError.error.Error())
return fmt.Sprintf("%s:%d: %s", path.Join(e.ExercicePath, "challenge.toml"), e.ChallengeTxtLine, e.ThemeError.error.Error())
} else {
return fmt.Sprintf("%s: %s", path.Join(e.ExercicePath, "challenge.txt"), e.ThemeError.error.Error())
return fmt.Sprintf("%s: %s", path.Join(e.ExercicePath, "challenge.toml"), e.ThemeError.error.Error())
}
}
@ -127,7 +127,7 @@ func NewHintError(exercice *fic.Exercice, hint *fic.EHint, line int, err error,
}
func (e *HintError) Error() string {
return fmt.Sprintf("%s: hint#%d (%s): %s", path.Join(e.ExercicePath, "challenge.txt"), e.HintId, e.HintTitle, e.ThemeError.error.Error())
return fmt.Sprintf("%s: hint#%d (%s): %s", path.Join(e.ExercicePath, "challenge.toml"), e.HintId, e.HintTitle, e.ThemeError.error.Error())
}
type FlagError struct {
@ -144,5 +144,5 @@ func NewFlagError(exercice *fic.Exercice, flag *ExerciceFlag, line int, err erro
}
func (e *FlagError) Error() string {
return fmt.Sprintf("%s: flag#%d: %s", path.Join(e.ExercicePath, "challenge.txt"), e.FlagId, e.ThemeError.error.Error())
return fmt.Sprintf("%s: flag#%d: %s", path.Join(e.ExercicePath, "challenge.toml"), e.FlagId, e.ThemeError.error.Error())
}

View File

@ -26,10 +26,10 @@ const sampleFile = `0-exercice-1/overview.md:spelling:Sterik
0-exercice-1/resolution.md:11:typo_guillemets_typographiques_doubles_fermants
0-exercice-1/resolution.md:spelling:cronjob
0-exercice-1/resolution.md:spelling:Level
challenge.txt:spelling:time
challenge.txt:spelling:ago
challenge.toml:spelling:time
challenge.toml:spelling:ago
0-exercice-1/resolution.md:spelling:SCL
challenge.txt:spelling:SCL`
challenge.toml:spelling:SCL`
func TestLoadExceptions(t *testing.T) {
exceptions := ParseExceptionString(sampleFile, nil)
@ -47,7 +47,7 @@ func TestFilterExceptions(t *testing.T) {
t.Fatalf("Expected 1 exceptions, got %d", len(*filteredExceptions))
}
filteredExceptions = exceptions.GetFileExceptions("challenge.txt")
filteredExceptions = exceptions.GetFileExceptions("challenge.toml")
if len(*filteredExceptions) != 3 {
t.Fatalf("Expected 3 exceptions, got %d", len(*filteredExceptions))
}

View File

@ -121,7 +121,7 @@ func buildExerciceHints(i Importer, exercice *fic.Exercice, exceptions *CheckExc
// CheckExerciceHints checks if all hints are corrects..
func CheckExerciceHints(i Importer, exercice *fic.Exercice, exceptions *CheckExceptions) ([]importHint, error) {
exceptions = exceptions.GetFileExceptions("challenge.txt", "challenge.toml")
exceptions = exceptions.GetFileExceptions("challenge.toml", "challenge.txt")
hints, errs := buildExerciceHints(i, exercice, exceptions)
@ -139,7 +139,7 @@ func SyncExerciceHints(i Importer, exercice *fic.Exercice, flagsBindings map[int
if _, err := exercice.WipeHints(); err != nil {
errs = multierr.Append(errs, err)
} else {
exceptions = exceptions.GetFileExceptions("challenge.txt", "challenge.toml")
exceptions = exceptions.GetFileExceptions("challenge.toml", "challenge.txt")
hints, berrs := buildExerciceHints(i, exercice, exceptions)
errs = multierr.Append(errs, berrs)

View File

@ -355,8 +355,10 @@ func buildExerciceFlag(i Importer, exercice *fic.Exercice, flag ExerciceFlag, nl
flag.Type = "radio"
case "mcq":
flag.Type = "mcq"
case "justified":
flag.Type = "justified"
default:
errs = multierr.Append(errs, NewFlagError(exercice, &flag, nline+1, fmt.Errorf("invalid type of flag: should be 'key', 'number', 'text', 'mcq', 'ucq', 'radio' or 'vector'")))
errs = multierr.Append(errs, NewFlagError(exercice, &flag, nline+1, fmt.Errorf("invalid type of flag: should be 'key', 'number', 'text', 'mcq', 'justified', 'ucq', 'radio' or 'vector'")))
return
}
@ -404,7 +406,7 @@ func buildExerciceFlag(i Importer, exercice *fic.Exercice, flag ExerciceFlag, nl
Choices: choices,
})
}
} else if flag.Type == "mcq" {
} else if flag.Type == "mcq" || flag.Type == "justified" {
addedFlag := fic.MCQ{
IdExercice: exercice.Id,
Order: int8(nline + 1),
@ -413,7 +415,7 @@ func buildExerciceFlag(i Importer, exercice *fic.Exercice, flag ExerciceFlag, nl
}
hasOne := false
isJustified := false
isJustified := flag.Type == "justified"
if len(flag.Variant) != 0 {
errs = multierr.Append(errs, NewFlagError(exercice, &flag, nline+1, fmt.Errorf("variant is not defined for this kind of flag")))
@ -541,7 +543,7 @@ func buildExerciceFlags(i Importer, exercice *fic.Exercice, exceptions *CheckExc
// CheckExerciceFlags checks if all flags for the given challenge are correct.
func CheckExerciceFlags(i Importer, exercice *fic.Exercice, files []string, exceptions *CheckExceptions) (rf []fic.Flag, errs error) {
exceptions = exceptions.GetFileExceptions("challenge.txt", "challenge.toml")
exceptions = exceptions.GetFileExceptions("challenge.toml", "challenge.txt")
flags, flagsids, berrs := buildExerciceFlags(i, exercice, exceptions)
errs = multierr.Append(errs, berrs)
@ -634,7 +636,7 @@ func SyncExerciceFlags(i Importer, exercice *fic.Exercice, exceptions *CheckExce
} else if _, err := exercice.WipeMCQs(); err != nil {
errs = multierr.Append(errs, err)
} else {
exceptions = exceptions.GetFileExceptions("challenge.txt", "challenge.toml")
exceptions = exceptions.GetFileExceptions("challenge.toml", "challenge.txt")
flags, flagids, berrs := buildExerciceFlags(i, exercice, exceptions)
errs = multierr.Append(errs, berrs)

View File

@ -280,7 +280,7 @@ func BuildExercice(i Importer, theme *fic.Theme, epath string, dmap *map[int64]*
e.WIP = p.WIP
if p.WIP && !AllowWIPExercice {
errs = multierr.Append(errs, NewExerciceError(e, fmt.Errorf("exercice declared Work In Progress in challenge.txt"), theme))
errs = multierr.Append(errs, NewExerciceError(e, fmt.Errorf("exercice declared Work In Progress in challenge.toml"), theme))
}
if p.Gain == 0 {

View File

@ -49,7 +49,7 @@
<a href="." style="max-width: 50%">
{#if $challengeInfo && $challengeInfo.main_logo}
{#each $challengeInfo.main_logo as logo, i}
<img src={logo.replace('$FILES$', base + '/files/')} alt={'Logo principal #' + i} class={'h-100' + (i > 0?' d-none d-md-inline ms-2':'')}>
<img src={logo.replace('$FILES$/', base + '/files/')} alt={'Logo principal #' + i} class={'h-100' + (i > 0?' d-none d-md-inline ms-2':'')}>
{/each}
{/if}
</a>

View File

@ -65,7 +65,7 @@
{#each $themesStore["0"].exercices as exercice, index}
<DropdownItem href="{$themesStore["0"].urlid}/{exercice.urlid}" active={$current_theme && $current_theme.id == 0 && $current_exercice && $current_exercice.id == exercice.id}>
{exercice.title}
{#if exercice.solved}
{#if $my && $my.id_team && exercice.solved}
<Badge color="success" pill>
<Icon name="check" />
</Badge>

View File

@ -26,7 +26,7 @@
document.body.style.backgroundColor = "";
let items = [];
$: {
function refresh_items() {
const tmpitems = [];
for (const th of $themes) {
if (th.id == 0) continue;
@ -43,6 +43,8 @@
// Only apply after start
if (!($time.startIn && j < nb_ex_max && j < $settings.unlockedStandaloneExercices))
continue;
} else if ($my && !$my.team_id && j >= nb_ex_max) {
continue;
}
tmpitems.splice(i, 0, {id: tmpitems.length, theme: $themesStore["0"], exercice: $themesStore["0"].exercices[j]});
@ -65,6 +67,7 @@
items = tmpitems;
}
$: refresh_items($themes);
</script>
<Container class="mt-3 mb-5">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

View File

@ -35,7 +35,7 @@ func GrammalecteCheckMDText(str string, lang string, exceptions *sync.CheckExcep
for _, s := range forbiddenStrings {
if strings.Contains(str, s) {
if !exceptions.HasException(":not-forbidden-string:" + s) {
errs = multierr.Append(errs, fmt.Errorf("Forbidden raw string %q included in file content, don't write it (:not-forbidden-string:%s)", s, s))
errs = multierr.Append(errs, fmt.Errorf("Forbidden string %q included in file content, don't write your flag in text", s, s))
}
}
}

View File

@ -248,7 +248,7 @@ func main() {
nberr := 0
theme, exceptions, errs := sync.BuildTheme(sync.GlobalImporter, p)
if theme != nil && !sync.GlobalImporter.Exists(path.Join(p, "challenge.txt")) && !sync.GlobalImporter.Exists(path.Join(p, "challenge.toml")) {
if theme != nil && !sync.GlobalImporter.Exists(path.Join(p, "challenge.toml")) && !sync.GlobalImporter.Exists(path.Join(p, "challenge.txt")) {
thiserrors := multierr.Errors(errs)
nberr += len(thiserrors)
for _, err := range thiserrors {