[Issue #11] - added ability to create new benchmark settings profiles
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
This commit is contained in:
27
models/Benchmark_profile.go
Normal file
27
models/Benchmark_profile.go
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
package models
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type BenchmarkProfile struct {
|
||||||
|
gorm.Model
|
||||||
|
Label string
|
||||||
|
Settings string
|
||||||
|
|
||||||
|
// belongs to Benchmark
|
||||||
|
BenchmarkID int
|
||||||
|
Benchmark Benchmark
|
||||||
|
|
||||||
|
// many-to-many with tests
|
||||||
|
Tests []Test `gorm:"many2many:tests_benchmark_profiles;"`
|
||||||
|
|
||||||
|
// has many results
|
||||||
|
Results []Result
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BenchmarkProfile) StringID() string {
|
||||||
|
return strconv.Itoa(int(b.ID))
|
||||||
|
}
|
||||||
@@ -12,11 +12,8 @@ type Benchmark struct {
|
|||||||
ScoringType string
|
ScoringType string
|
||||||
Description string
|
Description string
|
||||||
|
|
||||||
// many-to-many test
|
// one-to-many BenchmarkProfiles
|
||||||
Tests []Test `gorm:"many2many:tests_benchmarks;"`
|
BenchmarkProfiles []BenchmarkProfile
|
||||||
|
|
||||||
// has many results
|
|
||||||
Results []Result
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Benchmark) StringID() string {
|
func (b *Benchmark) StringID() string {
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ type Result struct {
|
|||||||
MaximumScore float32
|
MaximumScore float32
|
||||||
|
|
||||||
// belongs to Benchmark
|
// belongs to Benchmark
|
||||||
BenchmarkID int
|
BenchmarkProfileID int
|
||||||
Benchmark Benchmark
|
BenchmarkProfile BenchmarkProfile
|
||||||
|
|
||||||
// belongs to Test
|
// belongs to Test
|
||||||
TestID int
|
TestID int
|
||||||
|
|||||||
@@ -15,15 +15,15 @@ type Test struct {
|
|||||||
HardwareID int
|
HardwareID int
|
||||||
Hardware Hardware
|
Hardware Hardware
|
||||||
|
|
||||||
// many-to-many benchmarks
|
// many-to-many benchmark profiles
|
||||||
Benchmarks []Benchmark `gorm:"many2many:tests_benchmarks;"`
|
BenchmarkProfiles []Benchmark `gorm:"many2many:tests_benchmark_profiles;"`
|
||||||
|
|
||||||
// has many results
|
// has many results
|
||||||
Results []Result
|
Results []Result
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Test) SelectedBenchmarks() []string {
|
func (t *Test) SelectedBenchmarks() []string {
|
||||||
benchmarks := t.Benchmarks
|
benchmarks := t.BenchmarkProfiles
|
||||||
ids := make([]string, len(benchmarks))
|
ids := make([]string, len(benchmarks))
|
||||||
for i, b := range benchmarks {
|
for i, b := range benchmarks {
|
||||||
ids[i] = strconv.Itoa(int(b.ID))
|
ids[i] = strconv.Itoa(int(b.ID))
|
||||||
@@ -34,7 +34,7 @@ func (t *Test) SelectedBenchmarks() []string {
|
|||||||
func (t *Test) IsBenchmarkSelected(benchmarkID uint) bool {
|
func (t *Test) IsBenchmarkSelected(benchmarkID uint) bool {
|
||||||
benchmarkUint := uint(benchmarkID)
|
benchmarkUint := uint(benchmarkID)
|
||||||
|
|
||||||
for _, b := range t.Benchmarks {
|
for _, b := range t.BenchmarkProfiles {
|
||||||
if b.ID == benchmarkUint {
|
if b.ID == benchmarkUint {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|||||||
37
templates/benchmark/profile/add.tmpl
Normal file
37
templates/benchmark/profile/add.tmpl
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
{{ template "header" . }}
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<h2>Add profile for {{ .benchmark.Name }}</h2>
|
||||||
|
|
||||||
|
<form class="twelve columns" action="/benchmark/{{ .benchmark.ID }}/profile/add" method="POST">
|
||||||
|
<div class="row">
|
||||||
|
<div class="six columns">
|
||||||
|
<label for="benchmark_profile_benchmark">
|
||||||
|
Benchmark:
|
||||||
|
<select id="benchmark_profile_benchmark" class="u-full-width" disabled>
|
||||||
|
<option value="{{ .benchmark.ID }}">{{ .benchmark.Name }}</option>
|
||||||
|
</select>
|
||||||
|
<input type="hidden" name="benchmark_profile_benchmark" value="{{ .benchmark.ID }}">
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="six columns">
|
||||||
|
<label for="benchmark_profile_label">
|
||||||
|
Profile label:
|
||||||
|
<input id="benchmark_profile_label" class="u-full-width" type="text" name="benchmark_profile_label" placeholder="My benchmark settings profile">
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<label for="benchmark_description">
|
||||||
|
Benchmark description:
|
||||||
|
<textarea id="benchmark_description" class="twelve columns" cols="30" rows="10" name="benchmark_description"></textarea>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<input class="button-primary u-full-width" type="submit" value="Submit">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{ template "footer" . }}
|
||||||
@@ -11,6 +11,18 @@
|
|||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
|
<h4>Profiles for this Benchmark</h4>
|
||||||
|
|
||||||
|
<p><a href="/benchmark/{{ .benchmark.ID }}/profile/add">Add settings profile</a></p>
|
||||||
|
|
||||||
|
<ul class="benchmark-profiles">
|
||||||
|
{{ range $profile := .benchmark.BenchmarkProfiles }}
|
||||||
|
<li>{{ $profile.Label }}</li>
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
<h4>Latest Benchmark Results:</h4>
|
<h4>Latest Benchmark Results:</h4>
|
||||||
|
|
||||||
<p>There are currently no results recorded using this benchmark.</p>
|
<p>There are currently no results recorded using this benchmark.</p>
|
||||||
|
|||||||
7
web/forms/benchmark_profile.go
Normal file
7
web/forms/benchmark_profile.go
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
package forms
|
||||||
|
|
||||||
|
type BenchmarkProfileForm struct {
|
||||||
|
BenchmarkID int `form:"benchmark_profile_benchmark" validate:"required"`
|
||||||
|
Label string `form:"benchmark_profile_label" validate:"required"`
|
||||||
|
Settings string `form:"benchmark_profile_settings" validate:"required"`
|
||||||
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
package forms
|
package forms
|
||||||
|
|
||||||
type ResultForm struct {
|
type ResultForm struct {
|
||||||
Test int `form:"result_test" validate:"required"`
|
Test int `form:"result_test" validate:"required"`
|
||||||
Benchmark int `form:"result_benchmark" validate:"required"`
|
BenchmarkProfile int `form:"result_benchmark" validate:"required"`
|
||||||
AverageScore float32 `form:"result_avg" validate:"required"`
|
AverageScore float32 `form:"result_avg" validate:"required"`
|
||||||
MinimumScore float32 `form:"result_min"`
|
MinimumScore float32 `form:"result_min"`
|
||||||
MaximumScore float32 `form:"result_max"`
|
MaximumScore float32 `form:"result_max"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
package forms
|
package forms
|
||||||
|
|
||||||
type TestForm struct {
|
type TestForm struct {
|
||||||
Name string `form:"test_name" validate:"required"`
|
Name string `form:"test_name" validate:"required"`
|
||||||
Description string `form:"test_description"`
|
Description string `form:"test_description"`
|
||||||
Hardware int `form:"test_hardware" validate:"required"`
|
Hardware int `form:"test_hardware" validate:"required"`
|
||||||
Benchmarks []uint `form:"test_benchmarks" validate:"required"`
|
BenchmarkProfiles []uint `form:"test_benchmarks" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TestForm) IsBenchmarkSelected(checkID uint) bool {
|
func (t *TestForm) IsBenchmarkSelected(checkID uint) bool {
|
||||||
for _, selectedID := range t.Benchmarks {
|
for _, selectedID := range t.BenchmarkProfiles {
|
||||||
if checkID == selectedID {
|
if checkID == selectedID {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,6 +44,11 @@ func RegisterRoutes(f *flamego.Flame) {
|
|||||||
|
|
||||||
f.Get("/{benchmark_id}/edit", routes.BenchmarkGetEdit)
|
f.Get("/{benchmark_id}/edit", routes.BenchmarkGetEdit)
|
||||||
f.Post("/{benchmark_id}/edit", binding.Form(forms.BenchmarkForm{}), routes.BenchmarkPostEdit)
|
f.Post("/{benchmark_id}/edit", binding.Form(forms.BenchmarkForm{}), routes.BenchmarkPostEdit)
|
||||||
|
|
||||||
|
f.Group("/{benchmark_id}/profile", func() {
|
||||||
|
f.Get("/add", routes.BenchmarkGetProfileAdd)
|
||||||
|
f.Post("/add", binding.Form(forms.BenchmarkProfileForm{}), routes.BenchmarkPostProfileAdd)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
// test routes
|
// test routes
|
||||||
@@ -76,6 +81,10 @@ func RegisterRoutes(f *flamego.Flame) {
|
|||||||
f.Get("/details", routes.ApiV1BenchmarkDetails)
|
f.Get("/details", routes.ApiV1BenchmarkDetails)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
f.Group("/benchmark_profile", func() {
|
||||||
|
f.Get("/details", routes.ApiV1BenchmarkProfileDetails)
|
||||||
|
})
|
||||||
|
|
||||||
f.Group("/result", func() {
|
f.Group("/result", func() {
|
||||||
f.Post("/add", binding.Form(forms.ResultForm{}), routes.ApiV1ResultAdd)
|
f.Post("/add", binding.Form(forms.ResultForm{}), routes.ApiV1ResultAdd)
|
||||||
f.Get("/list", routes.ApiV1ResultList)
|
f.Get("/list", routes.ApiV1ResultList)
|
||||||
|
|||||||
@@ -18,11 +18,23 @@ func ApiV1BenchmarkDetails(c flamego.Context, r flamego.Render) {
|
|||||||
// find benchmark from DB
|
// find benchmark from DB
|
||||||
var benchmark models.Benchmark
|
var benchmark models.Benchmark
|
||||||
models.DB.First(&benchmark, benchmarkID)
|
models.DB.First(&benchmark, benchmarkID)
|
||||||
|
|
||||||
// return JSON response
|
// return JSON response
|
||||||
r.JSON(200, benchmark)
|
r.JSON(200, benchmark)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ApiV1BenchmarkProfileDetails(c flamego.Context, r flamego.Render) {
|
||||||
|
// find benchmark ID from request
|
||||||
|
benchmarkProfileID := c.Query("benchmark_profile_id")
|
||||||
|
|
||||||
|
// find benchmark from DB
|
||||||
|
var benchmarkProfile models.BenchmarkProfile
|
||||||
|
models.DB.Preload("BenchmarkProfiles").First(&benchmarkProfile, benchmarkProfileID)
|
||||||
|
|
||||||
|
// return JSON response
|
||||||
|
r.JSON(200, benchmarkProfile)
|
||||||
|
}
|
||||||
|
|
||||||
func ApiV1ResultAdd(c flamego.Context, form forms.ResultForm, errs binding.Errors, r flamego.Render) {
|
func ApiV1ResultAdd(c flamego.Context, form forms.ResultForm, errs binding.Errors, r flamego.Render) {
|
||||||
if len(errs) > 0 {
|
if len(errs) > 0 {
|
||||||
var err error
|
var err error
|
||||||
@@ -36,8 +48,8 @@ func ApiV1ResultAdd(c flamego.Context, form forms.ResultForm, errs binding.Error
|
|||||||
}
|
}
|
||||||
|
|
||||||
result := models.Result{
|
result := models.Result{
|
||||||
TestID: form.Test,
|
TestID: form.Test,
|
||||||
BenchmarkID: form.Benchmark,
|
BenchmarkProfileID: form.BenchmarkProfile,
|
||||||
AverageScore: form.AverageScore,
|
AverageScore: form.AverageScore,
|
||||||
MinimumScore: form.MinimumScore,
|
MinimumScore: form.MinimumScore,
|
||||||
MaximumScore: form.MaximumScore,
|
MaximumScore: form.MaximumScore,
|
||||||
@@ -50,12 +62,12 @@ func ApiV1ResultAdd(c flamego.Context, form forms.ResultForm, errs binding.Error
|
|||||||
|
|
||||||
func ApiV1ResultList(c flamego.Context, r flamego.Render) {
|
func ApiV1ResultList(c flamego.Context, r flamego.Render) {
|
||||||
// find benchmark and test IDs from request
|
// find benchmark and test IDs from request
|
||||||
benchmarkID := c.Query("benchmark_id")
|
benchmarkProfileID := c.Query("benchmark_id")
|
||||||
testID := c.Query("test_id")
|
testID := c.Query("test_id")
|
||||||
|
|
||||||
// find results from the DB that match the benchmark and test
|
// find results from the DB that match the benchmark and test
|
||||||
var results []models.Result
|
var results []models.Result
|
||||||
models.DB.Where("test_id = ? AND benchmark_id = ?", testID, benchmarkID).Find(&results)
|
models.DB.Where("test_id = ? AND benchmark_profile_id = ?", testID, benchmarkProfileID).Find(&results)
|
||||||
|
|
||||||
// return JSON response
|
// return JSON response
|
||||||
r.JSON(200, results)
|
r.JSON(200, results)
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ func BenchmarkGetView(c flamego.Context, t template.Template, data template.Data
|
|||||||
|
|
||||||
// find benchmark from DB
|
// find benchmark from DB
|
||||||
var benchmark models.Benchmark
|
var benchmark models.Benchmark
|
||||||
models.DB.First(&benchmark, benchmarkID)
|
models.DB.Preload("BenchmarkProfiles").First(&benchmark, benchmarkID)
|
||||||
data["benchmark"] = benchmark
|
data["benchmark"] = benchmark
|
||||||
|
|
||||||
data["title"] = benchmark.Name
|
data["title"] = benchmark.Name
|
||||||
@@ -105,3 +105,37 @@ func BenchmarkPostEdit(c flamego.Context, form forms.BenchmarkForm, errs binding
|
|||||||
|
|
||||||
c.Redirect(fmt.Sprintf("/benchmark/%d", benchmark.ID))
|
c.Redirect(fmt.Sprintf("/benchmark/%d", benchmark.ID))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkGetProfileAdd(c flamego.Context, t template.Template, data template.Data) {
|
||||||
|
// find benchmark ID from request
|
||||||
|
benchmarkID := c.Param("benchmark_id")
|
||||||
|
|
||||||
|
// find benchmark from DB
|
||||||
|
var benchmark models.Benchmark
|
||||||
|
models.DB.First(&benchmark, benchmarkID)
|
||||||
|
data["benchmark"] = benchmark
|
||||||
|
|
||||||
|
data["title"] = benchmark.Name
|
||||||
|
t.HTML(http.StatusOK, "benchmark/profile/add")
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkPostProfileAdd(c flamego.Context, form forms.BenchmarkProfileForm, errs binding.Errors) {
|
||||||
|
// find benchmark ID from request
|
||||||
|
benchmarkID := c.Param("benchmark_id")
|
||||||
|
|
||||||
|
// find benchmark from DB
|
||||||
|
var benchmark models.Benchmark
|
||||||
|
models.DB.First(&benchmark, benchmarkID)
|
||||||
|
|
||||||
|
benchmarkProfile := models.BenchmarkProfile{
|
||||||
|
BenchmarkID: form.BenchmarkID,
|
||||||
|
Label: form.Label,
|
||||||
|
Settings: form.Settings,
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(form.BenchmarkID)
|
||||||
|
|
||||||
|
_ = models.DB.Create(&benchmarkProfile)
|
||||||
|
|
||||||
|
c.Redirect(fmt.Sprintf("/benchmark/%d", benchmark.ID))
|
||||||
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ func ResultPostCreate(c flamego.Context, form forms.ResultForm, errs binding.Err
|
|||||||
|
|
||||||
result := models.Result{
|
result := models.Result{
|
||||||
TestID: form.Test,
|
TestID: form.Test,
|
||||||
BenchmarkID: form.Benchmark,
|
BenchmarkProfileID: form.BenchmarkProfile,
|
||||||
AverageScore: form.AverageScore,
|
AverageScore: form.AverageScore,
|
||||||
MinimumScore: form.MinimumScore,
|
MinimumScore: form.MinimumScore,
|
||||||
MaximumScore: form.MaximumScore,
|
MaximumScore: form.MaximumScore,
|
||||||
|
|||||||
@@ -73,10 +73,10 @@ func TestPostCreate(c flamego.Context, form forms.TestForm, errs binding.Errors)
|
|||||||
_ = models.DB.Create(&test)
|
_ = models.DB.Create(&test)
|
||||||
|
|
||||||
// bind benchmarks to test
|
// bind benchmarks to test
|
||||||
for _, v := range form.Benchmarks {
|
for _, v := range form.BenchmarkProfiles {
|
||||||
var benchmark models.Benchmark
|
var benchmark models.Benchmark
|
||||||
models.DB.First(&benchmark, v) // find benchmark
|
models.DB.First(&benchmark, v) // find benchmark
|
||||||
models.DB.Model(&test).Association("Benchmarks").Append(&benchmark)
|
models.DB.Model(&test).Association("BenchmarkProfiles").Append(&benchmark)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Redirect(fmt.Sprintf("/test/%d", test.ID))
|
c.Redirect(fmt.Sprintf("/test/%d", test.ID))
|
||||||
@@ -86,7 +86,7 @@ func TestGetEdit(c flamego.Context, t template.Template, data template.Data) {
|
|||||||
// find test in DB
|
// find test in DB
|
||||||
testID := c.Param("test_id")
|
testID := c.Param("test_id")
|
||||||
var test models.Test
|
var test models.Test
|
||||||
models.DB.Preload("Hardware").Preload("Benchmarks").First(&test, testID)
|
models.DB.Preload("Hardware").Preload("BenchmarkProfiles").First(&test, testID)
|
||||||
data["test"] = test
|
data["test"] = test
|
||||||
|
|
||||||
// add hardware components to template
|
// add hardware components to template
|
||||||
@@ -124,27 +124,27 @@ func TestPostEdit(c flamego.Context, form forms.TestForm, errs binding.Errors) {
|
|||||||
|
|
||||||
// find hardware from DB
|
// find hardware from DB
|
||||||
var test models.Test
|
var test models.Test
|
||||||
models.DB.Preload("Hardware").Preload("Benchmarks").First(&test, testID)
|
models.DB.Preload("Hardware").Preload("BenchmarkProfiles").First(&test, testID)
|
||||||
|
|
||||||
test.Name = form.Name
|
test.Name = form.Name
|
||||||
test.Description = form.Description
|
test.Description = form.Description
|
||||||
test.HardwareID = form.Hardware
|
test.HardwareID = form.Hardware
|
||||||
|
|
||||||
// bind benchmarks to test that aren't already associated
|
// bind benchmarks to test that aren't already associated
|
||||||
for _, b := range form.Benchmarks {
|
for _, b := range form.BenchmarkProfiles {
|
||||||
if ! test.IsBenchmarkSelected(b) {
|
if ! test.IsBenchmarkSelected(b) {
|
||||||
var benchmark models.Benchmark
|
var benchmark models.BenchmarkProfile
|
||||||
models.DB.First(&benchmark, b) // find benchmark
|
models.DB.First(&benchmark, b) // find benchmark
|
||||||
models.DB.Model(&test).Association("Benchmarks").Append(&benchmark)
|
models.DB.Model(&test).Association("BenchmarkProfiles").Append(&benchmark)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// removed associated benchmarks that weren't in the form
|
// removed associated benchmarks that weren't in the form
|
||||||
for _, b := range test.Benchmarks {
|
for _, b := range test.BenchmarkProfiles {
|
||||||
if ! form.IsBenchmarkSelected(b.ID) {
|
if ! form.IsBenchmarkSelected(b.ID) {
|
||||||
var benchmark models.Benchmark
|
var benchmark models.BenchmarkProfile
|
||||||
models.DB.First(&benchmark, b) // find benchmark
|
models.DB.First(&benchmark, b) // find benchmark
|
||||||
models.DB.Model(&test).Association("Benchmarks").Delete(&benchmark)
|
models.DB.Model(&test).Association("BenchmarkProfiles").Delete(&benchmark)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user