Fetch gradation status
This commit is contained in:
parent
1f7896ff26
commit
018ed9227f
3 changed files with 75 additions and 7 deletions
|
@ -40,4 +40,16 @@ export class Grade {
|
||||||
throw new Error((await res.json()).errmsg);
|
throw new Error((await res.json()).errmsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async gradationStatus() {
|
||||||
|
const res = await fetch(this.id_user?`api/users/${this.id_user}/works/${this.id_work}/grades/${this.id}/status`:`api/works/${this.id_work}/grades/${this.id}/status`, {
|
||||||
|
method: 'GET',
|
||||||
|
headers: {'Accept': 'application/json'},
|
||||||
|
});
|
||||||
|
if (res.status == 200) {
|
||||||
|
return await res.json();
|
||||||
|
} else {
|
||||||
|
throw new Error((await res.json()).errmsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
let warn_already_used = false;
|
let warn_already_used = false;
|
||||||
let w = null;
|
let w = null;
|
||||||
let gradesP = null;
|
let gradesP = null;
|
||||||
|
let gradationStatus = {};
|
||||||
let stats = {"mean": 0, "min": 999, "max": 0};
|
let stats = {"mean": 0, "min": 999, "max": 0};
|
||||||
|
|
||||||
$: w = data.work;
|
$: w = data.work;
|
||||||
|
@ -33,6 +34,9 @@
|
||||||
|
|
||||||
let sum = 0;
|
let sum = 0;
|
||||||
for (const grade of grades) {
|
for (const grade of grades) {
|
||||||
|
if (!gradationStatus[grade.id])
|
||||||
|
gradationStatus[grade.id] = grade.gradationStatus();
|
||||||
|
|
||||||
sum += grade.score;
|
sum += grade.score;
|
||||||
if (stats.min > grade.score && grade.comment != "- Non rendu -") stats.min = grade.score;
|
if (stats.min > grade.score && grade.comment != "- Non rendu -") stats.min = grade.score;
|
||||||
if (stats.max < grade.score) stats.max = grade.score;
|
if (stats.max < grade.score) stats.max = grade.score;
|
||||||
|
@ -143,13 +147,27 @@
|
||||||
>
|
>
|
||||||
<i class="bi bi-git"></i>
|
<i class="bi bi-git"></i>
|
||||||
</a>
|
</a>
|
||||||
<button
|
{#await gradationStatus[grade.id]}
|
||||||
class="btn btn-sm btn-success mr-1"
|
<button
|
||||||
title="Relancer la notation"
|
class="btn btn-sm btn-outline-success mr-1"
|
||||||
on:click={() => { grade.redoGradation(); }}
|
title="Relancer la notation"
|
||||||
>
|
on:click={() => { grade.redoGradation().then(() => gradationStatus[grade.id] = grade.gradationStatus()); }}
|
||||||
<i class="bi bi-arrow-clockwise"></i>
|
>
|
||||||
</button>
|
<div class="spinner-border spinner-border-sm" role="status"></div>
|
||||||
|
</button>
|
||||||
|
{:then status}
|
||||||
|
<button
|
||||||
|
class="btn btn-sm mr-1"
|
||||||
|
class:btn-success={status.status == "success"}
|
||||||
|
class:btn-danger={status.status == "failure"}
|
||||||
|
class:btn-outline-danger={status.status == "killed"}
|
||||||
|
class:btn-outline-warning={status.status == "pending" || status.status == "running"}
|
||||||
|
title="Relancer la notation"
|
||||||
|
on:click={() => { grade.redoGradation(); gradationStatus[grade.id] = null; }}
|
||||||
|
>
|
||||||
|
<i class="bi bi-arrow-clockwise"></i>
|
||||||
|
</button>
|
||||||
|
{/await}
|
||||||
<button
|
<button
|
||||||
class="btn btn-sm btn-danger mr-1"
|
class="btn btn-sm btn-danger mr-1"
|
||||||
title="Supprimer la note"
|
title="Supprimer la note"
|
||||||
|
|
38
works.go
38
works.go
|
@ -10,6 +10,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/drone/drone-go/drone"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/russross/blackfriday/v2"
|
"github.com/russross/blackfriday/v2"
|
||||||
)
|
)
|
||||||
|
@ -256,6 +257,43 @@ func declareAPIAdminWorksRoutes(router *gin.RouterGroup) {
|
||||||
g.Delete()
|
g.Delete()
|
||||||
c.JSON(http.StatusOK, true)
|
c.JSON(http.StatusOK, true)
|
||||||
})
|
})
|
||||||
|
gradesRoutes.GET("/status", func(c *gin.Context) {
|
||||||
|
g := c.MustGet("grade").(*WorkGrade)
|
||||||
|
|
||||||
|
var u *User
|
||||||
|
if user, ok := c.Get("user"); ok {
|
||||||
|
u = user.(*User)
|
||||||
|
} else {
|
||||||
|
u = c.MustGet("LoggedUser").(*User)
|
||||||
|
}
|
||||||
|
|
||||||
|
repo, err := u.getRepositoryByWork(g.IdWork)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Unable to getRepositoryByWork(uid=%d, wid=%d): %s", u.Id, g.IdWork, err.Error())
|
||||||
|
c.AbortWithStatusJSON(http.StatusNotFound, gin.H{"errmsg": "Unable to find a corresponding repository."})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
slug := strings.Split(repo.TestsRef, "/")
|
||||||
|
if len(slug) < 3 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
buildn, err := strconv.ParseInt(slug[2], 10, 32)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
client := drone.NewClient(droneEndpoint, droneConfig)
|
||||||
|
build, err := client.Build(slug[0], slug[1], int(buildn))
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Unable to communicate with Drone:", err.Error())
|
||||||
|
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"errmsg": "Unable to communicate with Drone"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, build)
|
||||||
|
})
|
||||||
gradesRoutes.GET("/traces", func(c *gin.Context) {
|
gradesRoutes.GET("/traces", func(c *gin.Context) {
|
||||||
g := c.MustGet("grade").(*WorkGrade)
|
g := c.MustGet("grade").(*WorkGrade)
|
||||||
|
|
||||||
|
|
Reference in a new issue