@@ -11,6 +11,7 @@ import ( | |||
"net/url" | |||
"path" | |||
"strings" | |||
"time" | |||
"code.gitea.io/gitea/models" | |||
"code.gitea.io/gitea/modules/cache" | |||
@@ -517,6 +518,7 @@ func RepoAssignment() macaron.Handler { | |||
return | |||
} | |||
startTime := time.Now() | |||
tags, err := ctx.Repo.GitRepo.GetTags() | |||
if err != nil { | |||
ctx.ServerError("GetTags", err) | |||
@@ -524,11 +526,17 @@ func RepoAssignment() macaron.Handler { | |||
} | |||
ctx.Data["Tags"] = tags | |||
duration := time.Since(startTime) | |||
log.Info("GetTags cost: %v seconds", duration.Seconds()) | |||
brs, _, err := ctx.Repo.GitRepo.GetBranches(0, 0) | |||
if err != nil { | |||
ctx.ServerError("GetBranches", err) | |||
return | |||
} | |||
duration = time.Since(startTime) | |||
log.Info("GetBranches cost: %v seconds", duration.Seconds()) | |||
ctx.Data["Branches"] = brs | |||
ctx.Data["BranchesCount"] = len(brs) | |||
@@ -95,9 +95,7 @@ func (m *MinioStorage) DeleteDir(dir string) error { | |||
} | |||
}() | |||
for rErr := range m.client.RemoveObjects(m.bucket, objectsCh) { | |||
log.Error("Error detected during deletion: ", rErr) | |||
} | |||
m.client.RemoveObjects(m.bucket, objectsCh) | |||
return nil | |||
} | |||
@@ -850,6 +850,7 @@ modelarts.current_version=Current version | |||
modelarts.parent_version=Parent Version | |||
modelarts.run_version=Run Version | |||
modelarts.train_job.compute_node=Compute Node | |||
modelarts.create_model = Create Model | |||
modelarts.train_job.basic_info=Basic Info | |||
@@ -856,6 +856,7 @@ modelarts.modify=修改 | |||
modelarts.current_version=当前版本 | |||
modelarts.parent_version=父版本 | |||
modelarts.run_version=运行版本 | |||
modelarts.create_model=创建模型 | |||
@@ -99,6 +99,18 @@ func saveModelByParameters(jobId string, versionName string, name string, versio | |||
//udpate status and version count | |||
models.ModifyModelNewProperty(lastNewModelId, MODEL_NOT_LATEST, 0) | |||
} | |||
var units []models.RepoUnit | |||
var deleteUnitTypes []models.UnitType | |||
units = append(units, models.RepoUnit{ | |||
RepoID: ctx.Repo.Repository.ID, | |||
Type: models.UnitTypeModelManage, | |||
Config: &models.ModelManageConfig{ | |||
EnableModelManage: true, | |||
}, | |||
}) | |||
deleteUnitTypes = append(deleteUnitTypes, models.UnitTypeModelManage) | |||
models.UpdateRepositoryUnits(ctx.Repo.Repository, units, deleteUnitTypes) | |||
// | |||
var units []models.RepoUnit | |||
@@ -144,10 +156,13 @@ func SaveModel(ctx *context.Context) { | |||
version := ctx.Query("Version") | |||
label := ctx.Query("Label") | |||
description := ctx.Query("Description") | |||
trainTaskCreate := ctx.QueryBool("trainTaskCreate") | |||
if !ctx.Repo.CanWrite(models.UnitTypeModelManage) { | |||
ctx.ServerError("No right.", errors.New(ctx.Tr("repo.model_noright"))) | |||
return | |||
if !trainTaskCreate { | |||
if !ctx.Repo.CanWrite(models.UnitTypeModelManage) { | |||
ctx.ServerError("No right.", errors.New(ctx.Tr("repo.model_noright"))) | |||
return | |||
} | |||
} | |||
if JobId == "" || VersionName == "" { | |||
@@ -13,6 +13,7 @@ import ( | |||
"net/http" | |||
"strconv" | |||
"strings" | |||
"time" | |||
"code.gitea.io/gitea/models" | |||
"code.gitea.io/gitea/modules/auth" | |||
@@ -336,6 +337,7 @@ func issues(ctx *context.Context, milestoneID int64, isPullOption util.OptionalB | |||
// Issues render issues page | |||
func Issues(ctx *context.Context) { | |||
startTime := time.Now() | |||
isPullList := ctx.Params(":type") == "pulls" | |||
if isPullList { | |||
MustAllowPulls(ctx) | |||
@@ -366,6 +368,9 @@ func Issues(ctx *context.Context) { | |||
ctx.Data["CanWriteIssuesOrPulls"] = ctx.Repo.CanWriteIssuesOrPulls(isPullList) | |||
duration := time.Since(startTime) | |||
log.Info("Issues cost: %v seconds", duration.Seconds()) | |||
ctx.HTML(200, tplIssues) | |||
} | |||
@@ -982,7 +982,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
}, context.RepoRef()) | |||
m.Group("/modelmanage", func() { | |||
m.Post("/create_model", reqRepoModelManageWriter, repo.SaveModel) | |||
m.Post("/create_new_model", reqRepoModelManageWriter, repo.SaveNewNameModel) | |||
m.Post("/create_new_model", repo.SaveNewNameModel) | |||
m.Delete("/delete_model", repo.DeleteModel) | |||
m.Put("/modify_model", repo.ModifyModelInfo) | |||
m.Get("/show_model", reqRepoModelManageReader, repo.ShowModelTemplate) | |||
@@ -331,7 +331,7 @@ | |||
</a> | |||
{{end}} | |||
{{else}} | |||
{{if eq .Status "RUNNING"}} | |||
{{if eq .Status "RUNNING" "WAITING" "CREATING" "STARTING"}} | |||
<a class="ui basic disabled button"> | |||
{{$.i18n.Tr "repo.debug"}} | |||
</a> | |||
@@ -51,7 +51,7 @@ | |||
</div> | |||
{{if not .IsBeingCreated}} | |||
<div class="repo-buttons"> | |||
<form method="post" action="{{$.RepoLink}}/action/{{if $.IsWatchingRepo}}un{{end}}watch?redirect_to={{$.Link}}"> | |||
<form method="post" style="margin: 0;" action="{{$.RepoLink}}/action/{{if $.IsWatchingRepo}}un{{end}}watch?redirect_to={{$.Link}}"> | |||
{{$.CsrfTokenHtml}} | |||
<div class="ui labeled button" tabindex="0"> | |||
<button type="submit" class="ui compact basic button"> | |||
@@ -62,7 +62,7 @@ | |||
</a> | |||
</div> | |||
</form> | |||
<form method="post" action="{{$.RepoLink}}/action/{{if $.IsStaringRepo}}un{{end}}star?redirect_to={{$.Link}}"> | |||
<form method="post" style="margin: 0;" action="{{$.RepoLink}}/action/{{if $.IsStaringRepo}}un{{end}}star?redirect_to={{$.Link}}"> | |||
{{$.CsrfTokenHtml}} | |||
<div class="ui labeled button" tabindex="0"> | |||
<button type="submit" class="ui compact basic button"> | |||
@@ -181,4 +181,4 @@ | |||
</div> | |||
<script src="https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js"></script> | |||
<script src="{{StaticUrlPrefix}}/js/jquery.js?v={{MD5 AppVer}}"></script> |
@@ -161,6 +161,15 @@ td, th { | |||
padding-top: 0.5rem ; | |||
} | |||
</style> | |||
<div id="mask"> | |||
<div id="loadingPage"> | |||
<div class="rect1"></div> | |||
<div class="rect2"></div> | |||
<div class="rect3"></div> | |||
<div class="rect4"></div> | |||
<div class="rect5"></div> | |||
</div> | |||
</div> | |||
<div class="repository"> | |||
{{template "repo/header" .}} | |||
<div class="ui container"> | |||
@@ -186,6 +195,12 @@ td, th { | |||
<span class="accordion-panel-title-content"> | |||
<span> | |||
<div style="float: right;"> | |||
{{$.CsrfTokenHtml}} | |||
{{if .CanModify}} | |||
<a class="ti-action-menu-item" onclick="showcreate({{.}})">{{$.i18n.Tr "repo.modelarts.create_model"}}</a> | |||
{{else}} | |||
<a class="ti-action-menu-item disabled">{{$.i18n.Tr "repo.modelarts.create_model"}}</a> | |||
{{end}} | |||
{{$.CsrfTokenHtml}} | |||
{{if .CanModify}} | |||
<a class="ti-action-menu-item" href="{{$.RepoLink}}/modelarts/train-job/{{.JobID}}/create_version?version_name={{.VersionName}}">{{$.i18n.Tr "repo.modelarts.modify"}}</a> | |||
@@ -446,6 +461,62 @@ td, th { | |||
</div> | |||
</div> | |||
</div> | |||
<!-- 创建模型 --> | |||
<div id="newmodel"> | |||
<div class="ui modal second"> | |||
<div class="header" style="padding: 1rem;background-color: rgba(240, 240, 240, 100);"> | |||
<h4 id="model_header">导入新模型</h4> | |||
</div> | |||
<div class="content content-padding"> | |||
<form id="formId" method="POST" class="ui form"> | |||
<div class="ui error message"> | |||
</div> | |||
{{$.CsrfTokenHtml}} | |||
<input type="hidden" name="trainTaskCreate" value="true"> | |||
<div class="two inline fields "> | |||
<div class="required ten wide field"> | |||
<label style="margin-left: -23px;">选择训练任务</label> | |||
<input type="hidden" class="width83" id="JobId" name="JobId" readonly required> | |||
<input class="width83" id="JobName" readonly required> | |||
</div> | |||
<div class="required six widde field"> | |||
<label>版本</label> | |||
<input class="width70" id="VersionName" name="VersionName" readonly required> | |||
</div> | |||
</div> | |||
<div class="required inline field" id="modelname"> | |||
<label>模型名称</label> | |||
<input style="width: 45%;" id="name" name="Name" required maxlength="25" onkeyup="this.value=this.value.replace(/[, ]/g,'')"> | |||
</div> | |||
<div class="required inline field" id="verionname"> | |||
<label>模型版本</label> | |||
<input style="width: 45%;" id="version" name="Version" value="" readonly required maxlength="255"> | |||
</div> | |||
<div class="inline field"> | |||
<label>模型标签</label> | |||
<input style="width: 83%;margin-left: 7px;" id="label" name="Label" maxlength="255" placeholder='{{.i18n.Tr "repo.modelarts.train_job.label_place"}}'> | |||
</div> | |||
<div class="inline field"> | |||
<label for="description">模型描述</label> | |||
<textarea style="width: 83%;margin-left: 7px;" id="Description" name="Description" rows="3" maxlength="255" placeholder='{{.i18n.Tr "repo.modelarts.train_job.new_place"}}' onchange="this.value=this.value.substring(0, 255)" onkeydown="this.value=this.value.substring(0, 255)" onkeyup="this.value=this.value.substring(0, 256)"></textarea> | |||
</div> | |||
<div class="inline field" style="margin-left: 75px;"> | |||
<button onclick="createModel()" id="submitId" type="button" class="ui create_train_job green button" style="position: absolute;"> | |||
{{.i18n.Tr "repo.model.manage.sava_model"}} | |||
</button> | |||
</div> | |||
</form> | |||
<div class="actions" style="display: inline-block;margin-left: 180px;"> | |||
<button class="ui button cancel" >{{.i18n.Tr "repo.cloudbrain.cancel"}}</button> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
{{template "base/footer" .}} | |||
@@ -479,7 +550,61 @@ td, th { | |||
} | |||
let timeid = window.setInterval(loadJobStatus, 30000); | |||
$(document).ready(loadJobStatus); | |||
function showcreate(obj){ | |||
$('.ui.modal.second') | |||
.modal({ | |||
centered: false, | |||
onShow:function(){ | |||
$('input[name="Version"]').addClass('model_disabled') | |||
// $('input[name="JobId"]').text(obj.JobName) | |||
$('#JobName').val(obj.JobName).addClass('model_disabled') | |||
$('input[name="JobId"]').val(obj.JobID) | |||
$('input[name="VersionName"]').val(obj.VersionName).addClass('model_disabled') | |||
$('.ui.dimmer').css({"background-color":"rgb(136, 136, 136,0.7)"}) | |||
createModelName() | |||
}, | |||
onHide:function(){ | |||
document.getElementById("formId").reset(); | |||
$('.ui.dimmer').css({"background-color":""}) | |||
$('.ui.error.message').text() | |||
$('.ui.error.message').css('display','none') | |||
} | |||
}) | |||
.modal('show') | |||
} | |||
function createModel(){ | |||
let url_href = `/${userName}/${repoPath}/modelmanage/create_new_model` | |||
let data = $("#formId").serialize() | |||
$("#mask").css({"display":"block","z-index":"9999"}) | |||
$.ajax({ | |||
url:url_href, | |||
type:'POST', | |||
data:data, | |||
success:function(res){ | |||
location.href=`/${userName}/${repoPath}/modelmanage/show_model` | |||
$('.ui.modal.second').modal('hide') | |||
}, | |||
error: function(xhr){ | |||
// 隐藏 loading | |||
// 只有请求不正常(状态码不为200)才会执行 | |||
$('.ui.error.message').text(xhr.responseText) | |||
$('.ui.error.message').css('display','block') | |||
}, | |||
complete:function(xhr){ | |||
$("#mask").css({"display":"none","z-index":"1"}) | |||
} | |||
}) | |||
} | |||
function createModelName(){ | |||
let repoName = location.pathname.split('/')[2] | |||
let modelName = repoName + '_model_' + Math.random().toString(36).substr(2, 4) | |||
$('#name').val(modelName) | |||
$('#version').val("0.0.1") | |||
} | |||
function renderSize(value){ | |||
if(null==value||value==''){ | |||
return "0 Bytes"; | |||
@@ -104,7 +104,6 @@ | |||
<div class="menu" id="job-name"> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="required six widde field"> | |||
<label>版本</label> | |||
@@ -118,7 +117,6 @@ | |||
</div> | |||
</div> | |||
</div> | |||
<div class="required inline field" id="modelname"> | |||
<label>模型名称</label> | |||
<input style="width: 45%;" id="name" name="Name" required maxlength="25" onkeyup="this.value=this.value.replace(/[, ]/g,'')"> | |||
@@ -232,7 +232,7 @@ footer .column{margin-bottom:0!important; padding-bottom:0!important;} | |||
.i-bg-used{background-position: -514px -52px;} | |||
.icon-bind{background-position: -550px -52px;} | |||
.icon-unbind{background-position: -568px -52px;} | |||
.CREATING, .STOPPING, .DELETING, .STARTING, .WAITING ,.INIT,.KILLING{display:inline-block;background-image:url('/img/loading.gif');background-repeat:no-repeat;width:16px;height:16px;background-size:16px 16px;margin-right:5px;} | |||
.CREATING, .STOPPING, .DELETING, .STARTING, i.WAITING ,.INIT,.KILLING{display:inline-block;background-image:url('/img/loading.gif');background-repeat:no-repeat;width:16px;height:16px;background-size:16px 16px;margin-right:5px;} | |||
i.COMPLETED,i.SUCCEEDED{display:inline-block;width:18px;height:18px;background:url("/img/icons.svg");background-position: -496px -52px;background-position: -441px -52px;} | |||
.text_over{ | |||