diff --git a/admin/api/exercice.go b/admin/api/exercice.go
index e00772e7..309a0d71 100644
--- a/admin/api/exercice.go
+++ b/admin/api/exercice.go
@@ -3,6 +3,7 @@ package api
import (
"encoding/json"
"errors"
+ "strings"
"srs.epita.fr/fic-server/libfic"
@@ -119,17 +120,29 @@ func createExerciceKey(exercice fic.Exercice, body []byte) (interface{}, error)
return exercice.AddRawKey(uk.Type, uk.Key)
}
+type uploadedHint struct {
+ Title string
+ Content string
+ Cost int64
+ Path string
+}
+
func createExerciceHint(exercice fic.Exercice, body []byte) (interface{}, error) {
- var uh fic.EHint
+ var uh uploadedHint
if err := json.Unmarshal(body, &uh); err != nil {
return nil, err
}
- if len(uh.Content) == 0 {
+ if len(uh.Content) != 0 {
+ return exercice.AddHint(uh.Title, uh.Content, uh.Cost)
+ } else if len(uh.Path) != 0 {
+ return importFile(uploadedFile{Path: uh.Path},
+ func(filePath string, origin string, digest []byte) (interface{}, error) {
+ return exercice.AddHint(uh.Title, "$FILES" + strings.TrimPrefix(filePath, fic.FilesDir), uh.Cost)
+ })
+ } else {
return nil, errors.New("Hint's content not filled")
}
-
- return exercice.AddHint(uh.Title, uh.Content, uh.Cost)
}
func showExerciceHint(hint fic.EHint, body []byte) (interface{}, error) {
@@ -189,6 +202,15 @@ func deleteExerciceKey(key fic.Key, _ fic.Exercice, _ []byte) (interface{}, erro
}
+func createExerciceFile(exercice fic.Exercice, body []byte) (interface{}, error) {
+ var uf uploadedFile
+ if err := json.Unmarshal(body, &uf); err != nil {
+ return nil, err
+ }
+
+ return importFile(uf, exercice.ImportFile)
+}
+
func showExerciceFile(file fic.EFile, body []byte) (interface{}, error) {
return file, nil
}
diff --git a/admin/api/file.go b/admin/api/file.go
index f7bd1634..f9614a26 100644
--- a/admin/api/file.go
+++ b/admin/api/file.go
@@ -5,7 +5,6 @@ import (
"crypto/sha512"
"encoding/base32"
"encoding/hex"
- "encoding/json"
"errors"
"fmt"
"log"
@@ -29,12 +28,7 @@ type uploadedFile struct {
Parts []string
}
-func createExerciceFile(exercice fic.Exercice, body []byte) (interface{}, error) {
- var uf uploadedFile
- if err := json.Unmarshal(body, &uf); err != nil {
- return nil, err
- }
-
+func importFile(uf uploadedFile, next func(string, string, []byte) (interface{}, error)) (interface{}, error) {
var hash [sha512.Size]byte
var logStr string
var fromURI string
@@ -80,7 +74,7 @@ func createExerciceFile(exercice fic.Exercice, body []byte) (interface{}, error)
pathname := path.Join(fic.FilesDir, strings.ToLower(base32.StdEncoding.EncodeToString(hash[:])), path.Base(fromURI))
// Remove the file if it exists
- if _, err := os.Stat(pathname); os.IsExist(err) && !RapidImport {
+ if _, err := os.Stat(pathname); !os.IsNotExist(err) && !RapidImport {
if err := os.Remove(pathname); err != nil {
return nil, err
}
@@ -98,7 +92,7 @@ func createExerciceFile(exercice fic.Exercice, body []byte) (interface{}, error)
if digest, err := hex.DecodeString(uf.Digest); err != nil {
return nil, err
} else {
- return exercice.ImportFile(pathname, fromURI, digest)
+ return next(pathname, fromURI, digest)
}
}
diff --git a/admin/fill_exercices.sh b/admin/fill_exercices.sh
index 149fad64..b57756b6 100755
--- a/admin/fill_exercices.sh
+++ b/admin/fill_exercices.sh
@@ -59,8 +59,12 @@ new_hint() {
TITLE=`echo "$3" | sed 's/"/\\\\"/g'`
CONTENT=`echo "$4" | sed 's/"/\\\\"/g' | sed ':a;N;$!ba;s/\n/
/g'`
COST="$5"
+ URI="$6"
- curl -f -s -d "{\"title\": \"$TITLE\", \"content\": \"$CONTENT\", \"cost\": $COST}" "${BASEURL}/api/themes/$THEME/exercices/$EXERCICE/hints" |
+ [ -n "${CONTENT}" ] && CONTENT=", \"content\": \"${CONTENT}\""
+ [ -n "${URI}" ] && URI=", \"path\": \"${BASEFILE}${URI}\""
+
+ curl -f -s -d "{\"title\": \"$TITLE\"$CONTENT$URI, \"cost\": $COST}" "${BASEURL}/api/themes/$THEME/exercices/$EXERCICE/hints" |
grep -Eo '"id":[0-9]+,' | grep -Eo "[0-9]+"
}
@@ -191,15 +195,28 @@ do
# Hints
- EXO_HINT=$(get_file "${THM_BASEURI}${EXO_BASEURI}/hint.txt")
- if [ -n "$EXO_HINT" ]; then
- HINT_ID=`new_hint "${THEME_ID}" "${EXO_ID}" "Astuce #1" "${EXO_HINT}" "${HINT_COST}"`
- if [ -z "$HINT_ID" ]; then
- echo -e "\e[31;01m!!! An error occured during hint import!\e[00m (title=Astuce #1;content=${EXO_HINT};cost=${HINT_COST})"
- else
- echo -e "\e[32m>>> New hint added:\e[00m $HINT_ID - Astuce #1"
+ HINTS=$(get_dir "${THM_BASEURI}${EXO_BASEURI}/hints/" | sed -E 's#(.*)#hints/\1#')
+ [ -z "${HINTS}" ] && HINTS=$(get_dir "${THM_BASEURI}${EXO_BASEURI}/" | grep ^hint.)
+ [ -z "${HINTS}" ] && HINTS="hint.txt"
+ HINT_COUNT=1
+ echo "${HINTS}" | while read HINT
+ do
+ EXO_HINT=$(get_file "${THM_BASEURI}${EXO_BASEURI}/${HINT}")
+ if [ -n "$EXO_HINT" ]; then
+ if echo "${EXO_HINT}" | file --mime-type -b - | grep text/ && [ $(echo "${EXO_HINT}" | wc -l) -lt 25 ]; then
+ HINT_ID=`new_hint "${THEME_ID}" "${EXO_ID}" "Astuce #${HINT_COUNT}" "${EXO_HINT}" "${HINT_COST}"`
+ else
+ HINT_ID=`new_hint "${THEME_ID}" "${EXO_ID}" "Astuce #${HINT_COUNT}" "" "${HINT_COST}" "${THM_BASEURI}${EXO_BASEURI}/${HINT}"`
+ fi
+
+ if [ -z "$HINT_ID" ]; then
+ echo -e "\e[31;01m!!! An error occured during hint import!\e[00m (title=Astuce #${HINT_COUNT};content=${EXO_HINT};cost=${HINT_COST})"
+ else
+ echo -e "\e[32m>>> New hint added:\e[00m $HINT_ID - Astuce #${HINT_COUNT}"
+ fi
fi
- fi
+ HINT_COUNT=$(($HINT_COUNT + 1))
+ done
# Files: splited
diff --git a/frontend/static/views/theme.html b/frontend/static/views/theme.html
index 792cf571..af62f802 100644
--- a/frontend/static/views/theme.html
+++ b/frontend/static/views/theme.html
@@ -35,8 +35,10 @@
Utilisez le bouton pour télécharger l'indice.
Débloquer cet indice vous coûtera