@@ -152,6 +152,10 @@ func saveModelByParameters(jobId string, versionName string, name string, versio | |||||
} | } | ||||
func SaveNewNameModel(ctx *context.Context) { | func SaveNewNameModel(ctx *context.Context) { | ||||
if !ctx.Repo.CanWrite(models.UnitTypeModelManage) { | |||||
ctx.Error(403, ctx.Tr("repo.model_noright")) | |||||
return | |||||
} | |||||
name := ctx.Query("Name") | name := ctx.Query("Name") | ||||
if name == "" { | if name == "" { | ||||
ctx.Error(500, fmt.Sprintf("name or version is null.")) | ctx.Error(500, fmt.Sprintf("name or version is null.")) | ||||
@@ -169,6 +173,10 @@ func SaveNewNameModel(ctx *context.Context) { | |||||
} | } | ||||
func SaveModel(ctx *context.Context) { | func SaveModel(ctx *context.Context) { | ||||
if !ctx.Repo.CanWrite(models.UnitTypeModelManage) { | |||||
ctx.Error(403, ctx.Tr("repo.model_noright")) | |||||
return | |||||
} | |||||
log.Info("save model start.") | log.Info("save model start.") | ||||
JobId := ctx.Query("JobId") | JobId := ctx.Query("JobId") | ||||
VersionName := ctx.Query("VersionName") | VersionName := ctx.Query("VersionName") | ||||
@@ -177,16 +185,8 @@ func SaveModel(ctx *context.Context) { | |||||
label := ctx.Query("Label") | label := ctx.Query("Label") | ||||
description := ctx.Query("Description") | description := ctx.Query("Description") | ||||
engine := ctx.QueryInt("Engine") | engine := ctx.QueryInt("Engine") | ||||
trainTaskCreate := ctx.QueryBool("trainTaskCreate") | |||||
modelSelectedFile := ctx.Query("modelSelectedFile") | modelSelectedFile := ctx.Query("modelSelectedFile") | ||||
log.Info("engine=" + fmt.Sprint(engine) + " modelSelectedFile=" + modelSelectedFile) | log.Info("engine=" + fmt.Sprint(engine) + " modelSelectedFile=" + modelSelectedFile) | ||||
if !trainTaskCreate { | |||||
if !ctx.Repo.CanWrite(models.UnitTypeModelManage) { | |||||
//ctx.NotFound(ctx.Req.URL.RequestURI(), nil) | |||||
ctx.JSON(403, ctx.Tr("repo.model_noright")) | |||||
return | |||||
} | |||||
} | |||||
if JobId == "" || VersionName == "" { | if JobId == "" || VersionName == "" { | ||||
ctx.Error(500, fmt.Sprintf("JobId or VersionName is null.")) | ctx.Error(500, fmt.Sprintf("JobId or VersionName is null.")) | ||||
@@ -421,7 +421,7 @@ | |||||
identifier : 'display_job_name', | identifier : 'display_job_name', | ||||
rules: [ | rules: [ | ||||
{ | { | ||||
type: 'regExp[/^[a-zA-Z0-9-_]{1,64}[^-]$/]', | |||||
type: 'regExp[/^[a-zA-Z0-9-_]{1,64}[a-zA-Z0-9_]$/]', | |||||
} | } | ||||
] | ] | ||||
}, | }, | ||||
@@ -472,9 +472,9 @@ | |||||
document.getElementById("mask").style.display = "none" | document.getElementById("mask").style.display = "none" | ||||
} | } | ||||
} | } | ||||
validate(); | |||||
$('.ui.create_train_job.green.button').click(function(e) { | $('.ui.create_train_job.green.button').click(function(e) { | ||||
send_run_para() | send_run_para() | ||||
get_name() | get_name() | ||||
validate() | |||||
}) | }) | ||||
</script> | </script> |
@@ -294,6 +294,27 @@ | |||||
context.value = '' | context.value = '' | ||||
$(".icon.icons").css("visibility", "hidden") | $(".icon.icons").css("visibility", "hidden") | ||||
} | } | ||||
function validate(){ | |||||
$('.ui.form').form({ | |||||
on: 'blur', | |||||
fields: { | |||||
display_job_name:{ | |||||
identifier : 'display_job_name', | |||||
rules: [ | |||||
{ | |||||
type: 'regExp[/^[a-z0-9][a-z0-9-_]{1,34}[a-z0-9-]$/]', | |||||
} | |||||
] | |||||
}, | |||||
}, | |||||
onSuccess: function(){ | |||||
}, | |||||
onFailure: function(e){ | |||||
return false; | |||||
} | |||||
}) | |||||
} | |||||
validate(); | |||||
form.onsubmit = function (e) { | form.onsubmit = function (e) { | ||||
let value_task = $("input[name='display_job_name']").val() | let value_task = $("input[name='display_job_name']").val() | ||||
let value_image = $("input[name='image']").val() | let value_image = $("input[name='image']").val() | ||||
@@ -483,9 +483,9 @@ | |||||
$("input#ai_flaver_name").val(name2) | $("input#ai_flaver_name").val(name2) | ||||
} | } | ||||
validate(); | |||||
$('.ui.create_train_job.green.button').click(function (e) { | $('.ui.create_train_job.green.button').click(function (e) { | ||||
get_name() | get_name() | ||||
send_run_para() | |||||
validate() | |||||
send_run_para() | |||||
}) | }) | ||||
</script> | </script> |
@@ -427,6 +427,7 @@ | |||||
{{if .CanDebug}} | {{if .CanDebug}} | ||||
<a id="model-image-{{.Cloudbrain.ID}}" | <a id="model-image-{{.Cloudbrain.ID}}" | ||||
class='imageBtn ui basic {{if ne .Status "RUNNING"}}disabled {{else}}blue {{end}}button' | class='imageBtn ui basic {{if ne .Status "RUNNING"}}disabled {{else}}blue {{end}}button' | ||||
target="_blank" | |||||
href="{{$.RepoLink}}/cloudbrain/{{.Cloudbrain.ID}}/commit_image">{{$.i18n.Tr "repo.submit_image"}}</a> | href="{{$.RepoLink}}/cloudbrain/{{.Cloudbrain.ID}}/commit_image">{{$.i18n.Tr "repo.submit_image"}}</a> | ||||
{{else}} | {{else}} | ||||
<a | <a | ||||
@@ -433,9 +433,9 @@ | |||||
$("input#ai_flavor_name").val(name2) | $("input#ai_flavor_name").val(name2) | ||||
} | } | ||||
validate(); | |||||
$('.ui.create_train_job.green.button').click(function(e) { | $('.ui.create_train_job.green.button').click(function(e) { | ||||
get_name() | get_name() | ||||
send_run_para() | send_run_para() | ||||
validate() | |||||
}) | }) | ||||
</script> | </script> |
@@ -425,9 +425,9 @@ | |||||
$("input#trainjob_work_server_num").val(val_server_num_select) | $("input#trainjob_work_server_num").val(val_server_num_select) | ||||
} | } | ||||
validate(); | |||||
$('.ui.create_train_job.green.button').click(function(e) { | $('.ui.create_train_job.green.button').click(function(e) { | ||||
get_name() | get_name() | ||||
send_run_para() | send_run_para() | ||||
validate() | |||||
}) | }) | ||||
</script> | </script> |
@@ -11,7 +11,7 @@ | |||||
{{template "base/alert" .}} | {{template "base/alert" .}} | ||||
<div class="inline required field {{if .Err_CloneAddr}}error{{end}}"> | <div class="inline required field {{if .Err_CloneAddr}}error{{end}}"> | ||||
<label for="clone_addr">{{.i18n.Tr "repo.migrate.clone_address"}}</label> | <label for="clone_addr">{{.i18n.Tr "repo.migrate.clone_address"}}</label> | ||||
<input id="clone_addr" name="clone_addr" value="{{.clone_addr}}" autofocus required> | |||||
<input id="clone_addr" name="clone_addr" value="{{.clone_addr}}" autofocus required autocomplete="off" /> | |||||
<span class="help"> | <span class="help"> | ||||
{{.i18n.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{.i18n.Tr "repo.migrate.clone_local_path"}}{{end}} | {{.i18n.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{.i18n.Tr "repo.migrate.clone_local_path"}}{{end}} | ||||
<br/>{{.i18n.Tr "repo.migrate.migrate_items_options"}} | <br/>{{.i18n.Tr "repo.migrate.migrate_items_options"}} | ||||
@@ -438,7 +438,7 @@ | |||||
identifier : 'display_job_name', | identifier : 'display_job_name', | ||||
rules: [ | rules: [ | ||||
{ | { | ||||
type: 'regExp[/^[a-zA-Z0-9-_]{1,64}[^-]$/]', | |||||
type: 'regExp[/^[a-zA-Z0-9-_]{1,64}[a-zA-Z0-9_]$/]', | |||||
} | } | ||||
] | ] | ||||
}, | }, | ||||
@@ -489,9 +489,9 @@ | |||||
document.getElementById("mask").style.display = "none" | document.getElementById("mask").style.display = "none" | ||||
} | } | ||||
} | } | ||||
validate(); | |||||
$('.ui.create_train_job.green.button').click(function(e) { | $('.ui.create_train_job.green.button').click(function(e) { | ||||
send_run_para() | send_run_para() | ||||
get_name() | get_name() | ||||
validate() | |||||
}) | }) | ||||
</script> | </script> |
@@ -110,6 +110,28 @@ | |||||
$('#messageInfo').css('display','none') | $('#messageInfo').css('display','none') | ||||
function validate(){ | |||||
$('.ui.form').form({ | |||||
on: 'blur', | |||||
fields: { | |||||
display_job_name:{ | |||||
identifier : 'display_job_name', | |||||
rules: [ | |||||
{ | |||||
type: 'regExp[/^[a-z0-9][a-z0-9-_]{1,36}$/]', | |||||
} | |||||
] | |||||
}, | |||||
}, | |||||
onSuccess: function(){ | |||||
}, | |||||
onFailure: function(e){ | |||||
return false; | |||||
} | |||||
}) | |||||
} | |||||
validate(); | |||||
form.onsubmit = function(e){ | form.onsubmit = function(e){ | ||||
let value_task = $("input[name='display_job_name']").val() | let value_task = $("input[name='display_job_name']").val() | ||||
@@ -500,9 +500,9 @@ | |||||
$("input#trainjob_work_server_num").val(val_server_num_select) | $("input#trainjob_work_server_num").val(val_server_num_select) | ||||
} | } | ||||
validate(); | |||||
$('.ui.create_train_job.green.button').click(function (e) { | $('.ui.create_train_job.green.button').click(function (e) { | ||||
get_name() | get_name() | ||||
send_run_para() | send_run_para() | ||||
validate() | |||||
}) | }) | ||||
</script> | </script> |
@@ -215,16 +215,16 @@ | |||||
<div style="display:flex;align-items: center;justify-content: center;"> | <div style="display:flex;align-items: center;justify-content: center;"> | ||||
<span v-if="scope.row.isPrivate" style="color: rgb(250, 140, 22);">私有</span> | <span v-if="scope.row.isPrivate" style="color: rgb(250, 140, 22);">私有</span> | ||||
<span v-else style="color: rgb(19, 194, 141);">公开</span> | <span v-else style="color: rgb(19, 194, 141);">公开</span> | ||||
<el-tooltip class="item" effect="dark" content="镜像提交中..." placement="top"> | |||||
<i v-if="scope.row.status===0" class="CREATING" style="margin-left:0.3rem"></i> | |||||
<el-tooltip v-if="scope.row.status===0" class="item" effect="dark" content="镜像提交中..." placement="top"> | |||||
<i class="CREATING" style="margin-left:0.3rem"></i> | |||||
</el-tooltip> | </el-tooltip> | ||||
<el-tooltip class="item" effect="dark" content="检测提交镜像是否大小超过20G!" placement="top"> | |||||
<i v-if="scope.row.status===2" class="FAILED" style="margin-left:0.3rem"></i> | |||||
<el-tooltip v-if="scope.row.status===2" class="item" effect="dark" content="检测提交镜像是否大小超过20G!" placement="top"> | |||||
<i class="FAILED" style="margin-left:0.3rem"></i> | |||||
</el-tooltip> | </el-tooltip> | ||||
<el-tooltip class="item" effect="dark" content="镜像提交成功" placement="top"> | |||||
<i v-if="scope.row.status===1" class="SUCCEEDED" style="margin-left:0.3rem"></i> | |||||
<el-tooltip v-if="scope.row.status===1" class="item" effect="dark" content="镜像提交成功" placement="top"> | |||||
<i class="SUCCEEDED" style="margin-left:0.3rem"></i> | |||||
</el-tooltip> | </el-tooltip> | ||||
</div> | </div> | ||||
@@ -473,6 +473,7 @@ export default { | |||||
tableDataCustom: [], | tableDataCustom: [], | ||||
starCustom:[], | starCustom:[], | ||||
loadingCustom:false, | loadingCustom:false, | ||||
refreshCustomTimer: null, | |||||
currentPageStar:1, | currentPageStar:1, | ||||
pageSizeStar:10, | pageSizeStar:10, | ||||
@@ -485,6 +486,7 @@ export default { | |||||
methods: { | methods: { | ||||
handleClick(tab, event) { | handleClick(tab, event) { | ||||
this.search = '' | this.search = '' | ||||
this.stopImageListCustomRefresh(); | |||||
if(tab.name=="first"){ | if(tab.name=="first"){ | ||||
this.paramsPublic.q = '' | this.paramsPublic.q = '' | ||||
this.getImageListPublic() | this.getImageListPublic() | ||||
@@ -560,9 +562,31 @@ export default { | |||||
}); | }); | ||||
this.loadingCustom = false | this.loadingCustom = false | ||||
this.getImageListCustomRefresh() | |||||
}) | }) | ||||
}, | }, | ||||
getImageListCustomRefresh() { | |||||
this.stopImageListCustomRefresh(); | |||||
this.refreshCustomTimer = setInterval(() => { | |||||
this.tableDataCustom.forEach(item => { | |||||
if (item.status === 0) { | |||||
this.$axios.get(`/image/${item.id}`, {}).then((res) => { | |||||
const newData = res.data; | |||||
this.tableDataCustom.forEach(it => { | |||||
if (it.id === newData.id) { | |||||
it.status = newData.status; | |||||
} | |||||
}); | |||||
}) | |||||
} | |||||
}); | |||||
}, 5000); | |||||
}, | |||||
stopImageListCustomRefresh() { | |||||
this.refreshCustomTimer && clearInterval(this.refreshCustomTimer); | |||||
}, | |||||
getImageListStar(){ | getImageListStar(){ | ||||
this.loadingStar = true | this.loadingStar = true | ||||
this.$axios.get('/explore/images/star',{ | this.$axios.get('/explore/images/star',{ | ||||
@@ -715,8 +739,10 @@ export default { | |||||
else{ | else{ | ||||
this.getImageListPublic() | this.getImageListPublic() | ||||
} | } | ||||
}, | |||||
beforeDestroy() { | |||||
this.stopImageListCustomRefresh(); | |||||
} | } | ||||
}; | }; | ||||
</script> | </script> | ||||
@@ -2950,13 +2950,13 @@ $(document).ready(async () => { | |||||
} | } | ||||
const $cloneAddr = $("#clone_addr"); | const $cloneAddr = $("#clone_addr"); | ||||
$cloneAddr.on("change", () => { | |||||
$cloneAddr.on("input change", () => { | |||||
const $repoName = $("#alias"); | const $repoName = $("#alias"); | ||||
const $owner = $("#ownerDropdown div.text").attr("title"); | const $owner = $("#ownerDropdown div.text").attr("title"); | ||||
const $urlAdd = | const $urlAdd = | ||||
location.href.split("/")[0] + "//" + location.href.split("/")[2]; | location.href.split("/")[0] + "//" + location.href.split("/")[2]; | ||||
if ($cloneAddr.val().length > 0 && $repoName.val().length === 0) { | |||||
// Only modify if repo_name input is blank | |||||
if ($cloneAddr.val().length > 0 /* && $repoName.val().length === 0 */) { | |||||
// modify when clone address change | |||||
const repoValue = $cloneAddr.val().match(/^(.*\/)?((.+?)(\.git)?)$/)[3]; | const repoValue = $cloneAddr.val().match(/^(.*\/)?((.+?)(\.git)?)$/)[3]; | ||||
$repoName.val($cloneAddr.val().match(/^(.*\/)?((.+?)(\.git)?)$/)[3]); | $repoName.val($cloneAddr.val().match(/^(.*\/)?((.+?)(\.git)?)$/)[3]); | ||||
$.get( | $.get( | ||||