@@ -46,3 +46,6 @@ | |||||
- 点击[这里](https://git.openi.org.cn/OpenI/aiforge/issues)在线提交问题(点击页面右上角绿色按钮**创建任务**) | - 点击[这里](https://git.openi.org.cn/OpenI/aiforge/issues)在线提交问题(点击页面右上角绿色按钮**创建任务**) | ||||
- 加入微信群实时交流,获得进一步的支持 | - 加入微信群实时交流,获得进一步的支持 | ||||
<img src="https://git.openi.org.cn/OpenI/aiforge/wiki/raw/img/wechatgroup.jpg" width=200px /> | <img src="https://git.openi.org.cn/OpenI/aiforge/wiki/raw/img/wechatgroup.jpg" width=200px /> | ||||
## 启智社区小白训练营: | |||||
- 结合案例给大家详细讲解如何使用社区平台,帮助无技术背景的小白成长为启智社区达人 (https://git.openi.org.cn/zeizei/OpenI_Learning) |
@@ -439,6 +439,19 @@ func GetModelArtsUserAttachments(userID int64) ([]*AttachmentUsername, error) { | |||||
return getModelArtsUserAttachments(x, userID) | return getModelArtsUserAttachments(x, userID) | ||||
} | } | ||||
func getModelArtsTrainAttachments(e Engine, userID int64) ([]*AttachmentUsername, error) { | |||||
attachments := make([]*AttachmentUsername, 0, 10) | |||||
if err := e.Table("attachment").Join("LEFT", "`user`", "attachment.uploader_id "+ | |||||
"= `user`.id").Where("attachment.type = ? and (uploader_id= ? or is_private = ?) and attachment.decompress_state = ?", TypeCloudBrainTwo, userID, false, DecompressStateDone).Find(&attachments); err != nil { | |||||
return nil, err | |||||
} | |||||
return attachments, nil | |||||
} | |||||
func GetModelArtsTrainAttachments(userID int64) ([]*AttachmentUsername, error) { | |||||
return getModelArtsTrainAttachments(x, userID) | |||||
} | |||||
func CanDelAttachment(isSigned bool, user *User, attach *Attachment) bool { | func CanDelAttachment(isSigned bool, user *User, attach *Attachment) bool { | ||||
if !isSigned { | if !isSigned { | ||||
return false | return false | ||||
@@ -1999,3 +1999,16 @@ func IsErrJobNotExist(err error) bool { | |||||
func (err ErrJobNotExist) Error() string { | func (err ErrJobNotExist) Error() string { | ||||
return fmt.Sprintf("the job does not exist") | return fmt.Sprintf("the job does not exist") | ||||
} | } | ||||
type ErrTagNotExist struct { | |||||
TagID int64 | |||||
} | |||||
func (err ErrTagNotExist) Error() string { | |||||
return fmt.Sprintf("the tag does not exist") | |||||
} | |||||
func IsErrTagNotExist(err error) bool { | |||||
_, ok := err.(ErrTagNotExist) | |||||
return ok | |||||
} |
@@ -134,6 +134,8 @@ func init() { | |||||
new(BlockChain), | new(BlockChain), | ||||
new(RecommendOrg), | new(RecommendOrg), | ||||
new(AiModelManage), | new(AiModelManage), | ||||
new(OfficialTag), | |||||
new(OfficialTagRepos), | |||||
) | ) | ||||
tablesStatistic = append(tablesStatistic, | tablesStatistic = append(tablesStatistic, | ||||
@@ -0,0 +1,163 @@ | |||||
package models | |||||
import ( | |||||
"code.gitea.io/gitea/modules/log" | |||||
"code.gitea.io/gitea/modules/timeutil" | |||||
"fmt" | |||||
) | |||||
type OfficialTag struct { | |||||
ID int64 `xorm:"pk autoincr"` | |||||
Name string `xorm:"NOT NULL"` | |||||
Code string `xorm:"NOT NULL"` | |||||
Limit int `xorm:"NOT NULL default(-1)"` | |||||
Status int `xorm:"NOT NULL default(0)"` | |||||
CreatedUnix timeutil.TimeStamp `xorm:"created"` | |||||
UpdatedUnix timeutil.TimeStamp `xorm:"updated"` | |||||
} | |||||
type OfficialTagRepos struct { | |||||
ID int64 `xorm:"pk autoincr"` | |||||
OrgID int64 `xorm:"NOT NULL INDEX"` | |||||
TagID int64 `xorm:"NOT NULL"` | |||||
RepoID int64 `xorm:"NOT NULL INDEX"` | |||||
CreatedUnix timeutil.TimeStamp `xorm:"created"` | |||||
UpdatedUnix timeutil.TimeStamp `xorm:"updated"` | |||||
} | |||||
type TagReposBrief struct { | |||||
RepoID int64 | |||||
RepoName string | |||||
TagID int64 | |||||
} | |||||
type TagReposSelected struct { | |||||
RepoID int64 | |||||
RepoName string | |||||
Selected bool | |||||
} | |||||
type TagsDetail struct { | |||||
TagId int64 | |||||
TagName string | |||||
TagLimit int | |||||
RepoList []Repository | |||||
} | |||||
func GetTagByID(id int64) (*OfficialTag, error) { | |||||
r := &OfficialTag{ | |||||
ID: id, | |||||
} | |||||
has, err := x.Get(r) | |||||
if err != nil { | |||||
return nil, err | |||||
} else if !has { | |||||
return nil, ErrTagNotExist{0} | |||||
} | |||||
return r, nil | |||||
} | |||||
func UpdateTagReposByID(tagID, orgID int64, repoIdList []int64) error { | |||||
sess := x.NewSession() | |||||
defer sess.Close() | |||||
if err := sess.Begin(); err != nil { | |||||
return fmt.Errorf("UpdateTagReposByID[tagId: %d, orgID: %d,error:%v", tagID, orgID, err) | |||||
} | |||||
//delete old tag repos | |||||
r := &OfficialTagRepos{ | |||||
TagID: tagID, | |||||
OrgID: orgID, | |||||
} | |||||
_, err := sess.Delete(r) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
if len(repoIdList) == 0 { | |||||
return sess.Commit() | |||||
} | |||||
//add new tag repos | |||||
data := make([]*OfficialTagRepos, 0) | |||||
for _, repoId := range repoIdList { | |||||
data = append(data, &OfficialTagRepos{ | |||||
OrgID: orgID, | |||||
TagID: tagID, | |||||
RepoID: repoId, | |||||
}) | |||||
} | |||||
_, err = sess.Insert(&data) | |||||
if err != nil { | |||||
sess.Rollback() | |||||
return err | |||||
} | |||||
return sess.Commit() | |||||
} | |||||
func GetTagRepos(tagID, orgID int64) ([]TagReposSelected, error) { | |||||
t := make([]TagReposBrief, 0) | |||||
const SQLCmd = "select t1.id as repo_id,t1.name as repo_name,t2.id as tag_id from repository t1 left join official_tag_repos t2 on (t1.id = t2.repo_id and t2.tag_id = ?) where t1.owner_id = ? and t1.is_private = false order by t1.updated_unix desc" | |||||
if err := x.SQL(SQLCmd, tagID, orgID).Find(&t); err != nil { | |||||
return nil, err | |||||
} | |||||
r := make([]TagReposSelected, 0) | |||||
for _, v := range t { | |||||
selected := false | |||||
if v.TagID > 0 { | |||||
selected = true | |||||
} | |||||
r = append(r, TagReposSelected{ | |||||
RepoID: v.RepoID, | |||||
RepoName: v.RepoName, | |||||
Selected: selected, | |||||
}) | |||||
} | |||||
return r, nil | |||||
} | |||||
func GetAllOfficialTagRepos(orgID int64, isOwner bool) ([]TagsDetail, error) { | |||||
result := make([]TagsDetail, 0) | |||||
tags, err := GetAllOfficialTags() | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
for _, tag := range tags { | |||||
repos, err := GetOfficialTagDetail(orgID, tag.ID) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
if len(repos) == 0 && !isOwner { | |||||
continue | |||||
} | |||||
result = append(result, TagsDetail{ | |||||
TagId: tag.ID, | |||||
TagName: tag.Name, | |||||
TagLimit: tag.Limit, | |||||
RepoList: repos, | |||||
}) | |||||
} | |||||
return result, nil | |||||
} | |||||
func GetOfficialTagDetail(orgID, tagId int64) ([]Repository, error) { | |||||
t := make([]Repository, 0) | |||||
const SQLCmd = "select t2.* from official_tag_repos t1 inner join repository t2 on t1.repo_id = t2.id where t1.org_id = ? and t1.tag_id=? order by t2.updated_unix desc" | |||||
if err := x.SQL(SQLCmd, orgID, tagId).Find(&t); err != nil { | |||||
return nil, err | |||||
} | |||||
return t, nil | |||||
} | |||||
func GetAllOfficialTags() ([]OfficialTag, error) { | |||||
//todo redis? | |||||
o := make([]OfficialTag, 0) | |||||
err := x.Where("status = ?", 0).OrderBy("updated_unix desc").Find(&o) | |||||
if err != nil { | |||||
log.Error("GetAllOfficialTags error,%v", err) | |||||
return nil, err | |||||
} | |||||
return o, nil | |||||
} |
@@ -70,3 +70,7 @@ type CreateTeamForm struct { | |||||
func (f *CreateTeamForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { | func (f *CreateTeamForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { | ||||
return validate(errs, ctx.Data, f, ctx.Locale) | return validate(errs, ctx.Data, f, ctx.Locale) | ||||
} | } | ||||
type SubmitReposOfTagForm struct { | |||||
RepoList []int64 | |||||
} |
@@ -240,14 +240,15 @@ func GenerateTask(ctx *context.Context, jobName, uuid, description, flavor strin | |||||
} | } | ||||
err = models.CreateCloudbrain(&models.Cloudbrain{ | err = models.CreateCloudbrain(&models.Cloudbrain{ | ||||
Status: string(models.JobWaiting), | |||||
UserID: ctx.User.ID, | |||||
RepoID: ctx.Repo.Repository.ID, | |||||
JobID: jobResult.ID, | |||||
JobName: jobName, | |||||
JobType: string(models.JobTypeDebug), | |||||
Type: models.TypeCloudBrainTwo, | |||||
Uuid: uuid, | |||||
Status: string(models.JobWaiting), | |||||
UserID: ctx.User.ID, | |||||
RepoID: ctx.Repo.Repository.ID, | |||||
JobID: jobResult.ID, | |||||
JobName: jobName, | |||||
JobType: string(models.JobTypeDebug), | |||||
Type: models.TypeCloudBrainTwo, | |||||
Uuid: uuid, | |||||
ComputeResource: models.NPUResource, | |||||
}) | }) | ||||
if err != nil { | if err != nil { | ||||
@@ -21,7 +21,8 @@ type Fields struct { | |||||
Format string `json:"format"` | Format string `json:"format"` | ||||
} | } | ||||
type MatchPhrase struct { | type MatchPhrase struct { | ||||
Message string `json:"message"` | |||||
Message string `json:"message,omitempty"` | |||||
TagName string `json:"tagName.keyword,omitempty"` | |||||
} | } | ||||
type Should struct { | type Should struct { | ||||
MatchPhrase MatchPhrase `json:"match_phrase"` | MatchPhrase MatchPhrase `json:"match_phrase"` | ||||
@@ -144,7 +145,7 @@ func ProjectViewInit(User string, Project string, Gte string, Lte string) (proje | |||||
inputStruct.Batch[0].Request.Params.Body.Fields = make([]Fields, 1) | inputStruct.Batch[0].Request.Params.Body.Fields = make([]Fields, 1) | ||||
inputStruct.Batch[0].Request.Params.Body.Fields[0].Field = setting.TimeField | inputStruct.Batch[0].Request.Params.Body.Fields[0].Field = setting.TimeField | ||||
inputStruct.Batch[0].Request.Params.Body.Fields[0].Format = setting.ElkTimeFormat | inputStruct.Batch[0].Request.Params.Body.Fields[0].Format = setting.ElkTimeFormat | ||||
inputStruct.Batch[0].Request.Params.Body.Query.BoolIn.Filter = make([]Filter, 3) | |||||
inputStruct.Batch[0].Request.Params.Body.Query.BoolIn.Filter = make([]Filter, 4) | |||||
//限定查询时间 | //限定查询时间 | ||||
var timeRange Range | var timeRange Range | ||||
timeRange.Timestamptest.Gte = Gte | timeRange.Timestamptest.Gte = Gte | ||||
@@ -159,6 +160,24 @@ func ProjectViewInit(User string, Project string, Gte string, Lte string) (proje | |||||
var projectName FilterMatchPhrase | var projectName FilterMatchPhrase | ||||
projectName.ProjectName = Project | projectName.ProjectName = Project | ||||
inputStruct.Batch[0].Request.Params.Body.Query.BoolIn.Filter[2].FilterMatchPhrase = &projectName | inputStruct.Batch[0].Request.Params.Body.Query.BoolIn.Filter[2].FilterMatchPhrase = &projectName | ||||
//限定页面 | |||||
var bool Bool | |||||
bool.Should = make([]Should, 14) | |||||
bool.Should[0].MatchPhrase.TagName = "%{[request][3]}" | |||||
bool.Should[1].MatchPhrase.TagName = "datasets?type=0" | |||||
bool.Should[2].MatchPhrase.TagName = "datasets?type=1" | |||||
bool.Should[3].MatchPhrase.TagName = "issues" | |||||
bool.Should[4].MatchPhrase.TagName = "labels" | |||||
bool.Should[5].MatchPhrase.TagName = "pulls" | |||||
bool.Should[6].MatchPhrase.TagName = "wiki" | |||||
bool.Should[7].MatchPhrase.TagName = "activity" | |||||
bool.Should[8].MatchPhrase.TagName = "cloudbrain" | |||||
bool.Should[9].MatchPhrase.TagName = "modelarts" | |||||
bool.Should[10].MatchPhrase.TagName = "blockchain" | |||||
bool.Should[11].MatchPhrase.TagName = "watchers" | |||||
bool.Should[12].MatchPhrase.TagName = "stars" | |||||
bool.Should[13].MatchPhrase.TagName = "forks" | |||||
inputStruct.Batch[0].Request.Params.Body.Query.BoolIn.Filter[3].Bool = &bool | |||||
return inputStruct | return inputStruct | ||||
} | } | ||||
@@ -222,6 +222,7 @@ contributors = Contributors | |||||
[explore] | [explore] | ||||
repos = Repositories | repos = Repositories | ||||
select_repos = Select the project | |||||
users = Users | users = Users | ||||
organizations = Organizations | organizations = Organizations | ||||
images = CloudImages | images = CloudImages | ||||
@@ -234,6 +235,8 @@ org_no_results = No matching organizations found. | |||||
code_no_results = No source code matching your search term found. | code_no_results = No source code matching your search term found. | ||||
code_search_results = Search results for '%s' | code_search_results = Search results for '%s' | ||||
code_last_indexed_at = Last indexed %s | code_last_indexed_at = Last indexed %s | ||||
save=save | |||||
cancel=cancel | |||||
[auth] | [auth] | ||||
create_new_account = Register Account | create_new_account = Register Account | ||||
@@ -905,6 +908,8 @@ model.manage.F1 = F1 | |||||
model.manage.Precision = Precision | model.manage.Precision = Precision | ||||
model.manage.Recall = Recall | model.manage.Recall = Recall | ||||
model.manage.sava_model = Sava Model | model.manage.sava_model = Sava Model | ||||
model.manage.model_manage = ModelManage | |||||
model.manage.model_accuracy = Model Accuracy | |||||
template.items = Template Items | template.items = Template Items | ||||
template.git_content = Git Content (Default Branch) | template.git_content = Git Content (Default Branch) | ||||
@@ -224,6 +224,7 @@ contributors=贡献者 | |||||
[explore] | [explore] | ||||
repos=项目 | repos=项目 | ||||
select_repos=精选项目 | |||||
users=用户 | users=用户 | ||||
organizations=组织 | organizations=组织 | ||||
images = 云脑镜像 | images = 云脑镜像 | ||||
@@ -238,6 +239,8 @@ org_no_results=未找到匹配的组织。 | |||||
code_no_results=未找到与搜索字词匹配的源代码。 | code_no_results=未找到与搜索字词匹配的源代码。 | ||||
code_search_results=“%s” 的搜索结果是 | code_search_results=“%s” 的搜索结果是 | ||||
code_last_indexed_at=最后索引于 %s | code_last_indexed_at=最后索引于 %s | ||||
save=保存 | |||||
cancel=取消 | |||||
[auth] | [auth] | ||||
create_new_account=注册帐号 | create_new_account=注册帐号 | ||||
@@ -914,6 +917,8 @@ model.manage.F1 = F1值 | |||||
model.manage.Precision = 精确率 | model.manage.Precision = 精确率 | ||||
model.manage.Recall = 召回率 | model.manage.Recall = 召回率 | ||||
model.manage.sava_model = 保存模型 | model.manage.sava_model = 保存模型 | ||||
model.manage.model_manage = 模型管理 | |||||
model.manage.model_accuracy = 模型精度 | |||||
template.items=模板选项 | template.items=模板选项 | ||||
template.git_content=Git数据(默认分支) | template.git_content=Git数据(默认分支) | ||||
@@ -7,7 +7,6 @@ package repo | |||||
import ( | import ( | ||||
"net/http" | "net/http" | ||||
"os" | |||||
"strconv" | "strconv" | ||||
"strings" | "strings" | ||||
@@ -15,8 +14,8 @@ import ( | |||||
"code.gitea.io/gitea/modules/context" | "code.gitea.io/gitea/modules/context" | ||||
"code.gitea.io/gitea/modules/log" | "code.gitea.io/gitea/modules/log" | ||||
"code.gitea.io/gitea/modules/modelarts" | "code.gitea.io/gitea/modules/modelarts" | ||||
"code.gitea.io/gitea/modules/setting" | |||||
"code.gitea.io/gitea/modules/storage" | "code.gitea.io/gitea/modules/storage" | ||||
routerRepo "code.gitea.io/gitea/routers/repo" | |||||
) | ) | ||||
func GetModelArtsNotebook(ctx *context.APIContext) { | func GetModelArtsNotebook(ctx *context.APIContext) { | ||||
@@ -258,7 +257,7 @@ func DelTrainJobVersion(ctx *context.APIContext) { | |||||
} | } | ||||
} | } | ||||
} else { //已删除该任务下的所有版本 | } else { //已删除该任务下的所有版本 | ||||
deleteJobStorage(task.JobName) | |||||
routerRepo.DeleteJobStorage(task.JobName) | |||||
} | } | ||||
ctx.JSON(http.StatusOK, map[string]interface{}{ | ctx.JSON(http.StatusOK, map[string]interface{}{ | ||||
@@ -130,5 +130,13 @@ func Home(ctx *context.Context) { | |||||
pager.SetDefaultParams(ctx) | pager.SetDefaultParams(ctx) | ||||
ctx.Data["Page"] = pager | ctx.Data["Page"] = pager | ||||
//find org tag info | |||||
tags, err := models.GetAllOfficialTagRepos(org.ID, ctx.Org.IsOwner) | |||||
if err != nil { | |||||
ctx.ServerError("GetAllOfficialTagRepos", err) | |||||
return | |||||
} | |||||
ctx.Data["tags"] = tags | |||||
ctx.HTML(200, tplOrgHome) | ctx.HTML(200, tplOrgHome) | ||||
} | } |
@@ -0,0 +1,90 @@ | |||||
// Copyright 2014 The Gogs Authors. All rights reserved. | |||||
// Copyright 2020 The Gitea Authors. | |||||
// Use of this source code is governed by a MIT-style | |||||
// license that can be found in the LICENSE file. | |||||
package org | |||||
import ( | |||||
"code.gitea.io/gitea/models" | |||||
"code.gitea.io/gitea/modules/auth" | |||||
"code.gitea.io/gitea/modules/context" | |||||
"errors" | |||||
"strconv" | |||||
) | |||||
const DefaultOrgTagLimit = -1 | |||||
// SubmitTags submit repos of org tag | |||||
func SubmitTags(ctx *context.Context, form auth.SubmitReposOfTagForm) { | |||||
if !ctx.Org.IsOwner { | |||||
ctx.ServerError("UpdateTagReposByID", errors.New("no access to submit tags")) | |||||
return | |||||
} | |||||
tag := getTagFromContext(ctx) | |||||
if ctx.Written() { | |||||
return | |||||
} | |||||
if tag.Limit != DefaultOrgTagLimit && len(form.RepoList) > tag.Limit { | |||||
ctx.ServerError("UpdateTagReposByID", errors.New("tags size over limit")) | |||||
return | |||||
} | |||||
err := models.UpdateTagReposByID(tag.ID, ctx.Org.Organization.ID, form.RepoList) | |||||
if err != nil { | |||||
ctx.ServerError("UpdateTagReposByID", err) | |||||
return | |||||
} | |||||
ctx.JSON(200, map[string]interface{}{ | |||||
"code": "00", | |||||
"msg": "success", | |||||
}) | |||||
} | |||||
// GetTagRepos get repos under org tag | |||||
func GetTagRepos(ctx *context.Context) { | |||||
if !ctx.Org.IsOwner { | |||||
ctx.ServerError("GetTagRepos", errors.New("no access to get tags")) | |||||
return | |||||
} | |||||
tag := getTagFromContext(ctx) | |||||
if ctx.Written() { | |||||
return | |||||
} | |||||
r, err := models.GetTagRepos(tag.ID, ctx.Org.Organization.ID) | |||||
if err != nil { | |||||
ctx.ServerError("GetTagRepos", err) | |||||
return | |||||
} | |||||
ctx.JSON(200, map[string]interface{}{ | |||||
"code": "00", | |||||
"msg": "success", | |||||
"data": r, | |||||
}) | |||||
} | |||||
// getTagFromContext finds out tag info From context. | |||||
func getTagFromContext(ctx *context.Context) *models.OfficialTag { | |||||
var tag *models.OfficialTag | |||||
var err error | |||||
tagIdStr := ctx.Query("tagId") | |||||
if len(tagIdStr) == 0 { | |||||
ctx.ServerError("GetTagInfo", errors.New("tag is not exist")) | |||||
return nil | |||||
} | |||||
tagId, _ := strconv.ParseInt(tagIdStr, 10, 32) | |||||
tag, err = models.GetTagByID(tagId) | |||||
if err != nil { | |||||
if models.IsErrTagNotExist(err) { | |||||
ctx.NotFound("GetTagInfo", err) | |||||
} else { | |||||
ctx.ServerError("GetTagInfo", err) | |||||
} | |||||
return nil | |||||
} | |||||
return tag | |||||
} |
@@ -277,6 +277,13 @@ func CloudBrainRestart(ctx *context.Context) { | |||||
break | break | ||||
} | } | ||||
if !ctx.IsSigned || (ctx.User.ID != task.UserID && !ctx.IsUserSiteAdmin()){ | |||||
log.Error("the user has no right ro restart the job", task.JobName, ctx.Data["MsgID"]) | |||||
resultCode = "-1" | |||||
errorMsg = "you have no right to restart the job" | |||||
break | |||||
} | |||||
count, err := models.GetCloudbrainCountByUserID(ctx.User.ID) | count, err := models.GetCloudbrainCountByUserID(ctx.User.ID) | ||||
if err != nil { | if err != nil { | ||||
log.Error("GetCloudbrainCountByUserID failed:%v", err, ctx.Data["MsgID"]) | log.Error("GetCloudbrainCountByUserID failed:%v", err, ctx.Data["MsgID"]) | ||||
@@ -287,7 +294,7 @@ func CloudBrainRestart(ctx *context.Context) { | |||||
if count >= 1 { | if count >= 1 { | ||||
log.Error("the user already has running or waiting task", ctx.Data["MsgID"]) | log.Error("the user already has running or waiting task", ctx.Data["MsgID"]) | ||||
resultCode = "-1" | resultCode = "-1" | ||||
errorMsg = "the user already has running or waiting task" | |||||
errorMsg = "you have already a running or waiting task, can not create more" | |||||
break | break | ||||
} | } | ||||
} | } | ||||
@@ -12,11 +12,10 @@ import ( | |||||
"strings" | "strings" | ||||
"time" | "time" | ||||
"code.gitea.io/gitea/modules/cloudbrain" | |||||
"code.gitea.io/gitea/models" | "code.gitea.io/gitea/models" | ||||
"code.gitea.io/gitea/modules/auth" | "code.gitea.io/gitea/modules/auth" | ||||
"code.gitea.io/gitea/modules/base" | "code.gitea.io/gitea/modules/base" | ||||
"code.gitea.io/gitea/modules/cloudbrain" | |||||
"code.gitea.io/gitea/modules/context" | "code.gitea.io/gitea/modules/context" | ||||
"code.gitea.io/gitea/modules/git" | "code.gitea.io/gitea/modules/git" | ||||
"code.gitea.io/gitea/modules/log" | "code.gitea.io/gitea/modules/log" | ||||
@@ -55,12 +54,9 @@ func DebugJobIndex(ctx *context.Context) { | |||||
page = 1 | page = 1 | ||||
} | } | ||||
debugType := modelarts.DebugType | debugType := modelarts.DebugType | ||||
jobType := string(models.JobTypeDebug) | |||||
if debugListType == models.GPUResource { | if debugListType == models.GPUResource { | ||||
debugType = models.TypeCloudBrainOne | debugType = models.TypeCloudBrainOne | ||||
jobType = "" | |||||
} | |||||
if debugListType == models.NPUResource { | |||||
} else if debugListType == models.NPUResource { | |||||
debugType = models.TypeCloudBrainTwo | debugType = models.TypeCloudBrainTwo | ||||
} | } | ||||
@@ -69,9 +65,8 @@ func DebugJobIndex(ctx *context.Context) { | |||||
Page: page, | Page: page, | ||||
PageSize: setting.UI.IssuePagingNum, | PageSize: setting.UI.IssuePagingNum, | ||||
}, | }, | ||||
RepoID: repo.ID, | |||||
Type: debugType, | |||||
JobType: jobType, | |||||
RepoID: repo.ID, | |||||
Type: debugType, | |||||
}) | }) | ||||
if err != nil { | if err != nil { | ||||
ctx.ServerError("Get debugjob faild:", err) | ctx.ServerError("Get debugjob faild:", err) | ||||
@@ -79,7 +74,7 @@ func DebugJobIndex(ctx *context.Context) { | |||||
} | } | ||||
for i, task := range ciTasks { | for i, task := range ciTasks { | ||||
ciTasks[i].CanDebug = cloudbrain.CanCreateOrDebugJob(ctx) | |||||
ciTasks[i].CanDebug = cloudbrain.CanModifyJob(ctx, &task.Cloudbrain) | |||||
ciTasks[i].CanDel = cloudbrain.CanDeleteJob(ctx, &task.Cloudbrain) | ciTasks[i].CanDel = cloudbrain.CanDeleteJob(ctx, &task.Cloudbrain) | ||||
ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource | ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource | ||||
} | } | ||||
@@ -154,7 +149,7 @@ func NotebookCreate(ctx *context.Context, form auth.CreateModelArtsNotebookForm) | |||||
ctx.RenderWithErr(err.Error(), tplModelArtsNotebookNew, &form) | ctx.RenderWithErr(err.Error(), tplModelArtsNotebookNew, &form) | ||||
return | return | ||||
} | } | ||||
ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/debugjob") | |||||
ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/debugjob?debugListType=all") | |||||
} | } | ||||
func NotebookShow(ctx *context.Context) { | func NotebookShow(ctx *context.Context) { | ||||
@@ -253,6 +248,13 @@ func NotebookManage(ctx *context.Context) { | |||||
errorMsg = "the job is not running" | errorMsg = "the job is not running" | ||||
break | break | ||||
} | } | ||||
if !ctx.IsSigned || (ctx.User.ID != task.UserID && !ctx.IsUserSiteAdmin() && !ctx.IsUserRepoOwner()) { | |||||
log.Error("the user has no right ro stop the job", task.JobName, ctx.Data["MsgID"]) | |||||
resultCode = "-1" | |||||
errorMsg = "you have no right to stop the job" | |||||
break | |||||
} | |||||
} else if action == models.ActionRestart { | } else if action == models.ActionRestart { | ||||
if task.Status != string(models.ModelArtsStopped) && task.Status != string(models.ModelArtsStartFailed) && task.Status != string(models.ModelArtsCreateFailed) { | if task.Status != string(models.ModelArtsStopped) && task.Status != string(models.ModelArtsStartFailed) && task.Status != string(models.ModelArtsCreateFailed) { | ||||
log.Error("the job(%s) is not stopped", task.JobName, ctx.Data["MsgID"]) | log.Error("the job(%s) is not stopped", task.JobName, ctx.Data["MsgID"]) | ||||
@@ -261,6 +263,13 @@ func NotebookManage(ctx *context.Context) { | |||||
break | break | ||||
} | } | ||||
if !ctx.IsSigned || (ctx.User.ID != task.UserID && !ctx.IsUserSiteAdmin()) { | |||||
log.Error("the user has no right ro restart the job", task.JobName, ctx.Data["MsgID"]) | |||||
resultCode = "-1" | |||||
errorMsg = "you have no right to restart the job" | |||||
break | |||||
} | |||||
count, err := models.GetCloudbrainNotebookCountByUserID(ctx.User.ID) | count, err := models.GetCloudbrainNotebookCountByUserID(ctx.User.ID) | ||||
if err != nil { | if err != nil { | ||||
log.Error("GetCloudbrainNotebookCountByUserID failed:%v", err, ctx.Data["MsgID"]) | log.Error("GetCloudbrainNotebookCountByUserID failed:%v", err, ctx.Data["MsgID"]) | ||||
@@ -416,7 +425,7 @@ func trainJobNewDataPrepare(ctx *context.Context) error { | |||||
var jobName = cutString(ctx.User.Name, 5) + t.Format("2006010215") + strconv.Itoa(int(t.Unix()))[5:] | var jobName = cutString(ctx.User.Name, 5) + t.Format("2006010215") + strconv.Itoa(int(t.Unix()))[5:] | ||||
ctx.Data["job_name"] = jobName | ctx.Data["job_name"] = jobName | ||||
attachs, err := models.GetModelArtsUserAttachments(ctx.User.ID) | |||||
attachs, err := models.GetModelArtsTrainAttachments(ctx.User.ID) | |||||
if err != nil { | if err != nil { | ||||
ctx.ServerError("GetAllUserAttachments failed:", err) | ctx.ServerError("GetAllUserAttachments failed:", err) | ||||
return err | return err | ||||
@@ -485,7 +494,7 @@ func trainJobErrorNewDataPrepare(ctx *context.Context, form auth.CreateModelArts | |||||
var jobName = cutString(ctx.User.Name, 5) + t.Format("2006010215") + strconv.Itoa(int(t.Unix()))[5:] | var jobName = cutString(ctx.User.Name, 5) + t.Format("2006010215") + strconv.Itoa(int(t.Unix()))[5:] | ||||
ctx.Data["job_name"] = jobName | ctx.Data["job_name"] = jobName | ||||
attachs, err := models.GetModelArtsUserAttachments(ctx.User.ID) | |||||
attachs, err := models.GetModelArtsTrainAttachments(ctx.User.ID) | |||||
if err != nil { | if err != nil { | ||||
ctx.ServerError("GetAllUserAttachments failed:", err) | ctx.ServerError("GetAllUserAttachments failed:", err) | ||||
return err | return err | ||||
@@ -573,7 +582,7 @@ func trainJobNewVersionDataPrepare(ctx *context.Context) error { | |||||
var jobName = cutString(ctx.User.Name, 5) + t.Format("2006010215") + strconv.Itoa(int(t.Unix()))[5:] | var jobName = cutString(ctx.User.Name, 5) + t.Format("2006010215") + strconv.Itoa(int(t.Unix()))[5:] | ||||
ctx.Data["job_name"] = task.JobName | ctx.Data["job_name"] = task.JobName | ||||
attachs, err := models.GetModelArtsUserAttachments(ctx.User.ID) | |||||
attachs, err := models.GetModelArtsTrainAttachments(ctx.User.ID) | |||||
if err != nil { | if err != nil { | ||||
ctx.ServerError("GetAllUserAttachments failed:", err) | ctx.ServerError("GetAllUserAttachments failed:", err) | ||||
return err | return err | ||||
@@ -662,7 +671,7 @@ func versionErrorDataPrepare(ctx *context.Context, form auth.CreateModelArtsTrai | |||||
var jobName = cutString(ctx.User.Name, 5) + t.Format("2006010215") + strconv.Itoa(int(t.Unix()))[5:] | var jobName = cutString(ctx.User.Name, 5) + t.Format("2006010215") + strconv.Itoa(int(t.Unix()))[5:] | ||||
ctx.Data["job_name"] = task.JobName | ctx.Data["job_name"] = task.JobName | ||||
attachs, err := models.GetModelArtsUserAttachments(ctx.User.ID) | |||||
attachs, err := models.GetModelArtsTrainAttachments(ctx.User.ID) | |||||
if err != nil { | if err != nil { | ||||
ctx.ServerError("GetAllUserAttachments failed:", err) | ctx.ServerError("GetAllUserAttachments failed:", err) | ||||
return err | return err | ||||
@@ -1426,6 +1435,11 @@ func TrainJobDel(ctx *context.Context) { | |||||
} | } | ||||
} | } | ||||
//删除存储 | |||||
if len(VersionListTasks) > 0 { | |||||
DeleteJobStorage(VersionListTasks[0].JobName) | |||||
} | |||||
ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/modelarts/train-job") | ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/modelarts/train-job") | ||||
} | } | ||||
@@ -2001,3 +2015,20 @@ func ResultDownload(ctx *context.Context) { | |||||
} | } | ||||
http.Redirect(ctx.Resp, ctx.Req.Request, url, http.StatusMovedPermanently) | http.Redirect(ctx.Resp, ctx.Req.Request, url, http.StatusMovedPermanently) | ||||
} | } | ||||
func DeleteJobStorage(jobName string) error { | |||||
//delete local | |||||
localJobPath := setting.JobPath + jobName | |||||
err := os.RemoveAll(localJobPath) | |||||
if err != nil { | |||||
log.Error("RemoveAll(%s) failed:%v", localJobPath, err) | |||||
} | |||||
//delete oss | |||||
dirPath := setting.CodePathPrefix + jobName + "/" | |||||
err = storage.ObsRemoveObject(setting.Bucket, dirPath) | |||||
if err != nil { | |||||
log.Error("ObsRemoveObject(%s) failed:%v", localJobPath, err) | |||||
} | |||||
return nil | |||||
} |
@@ -627,6 +627,10 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
m.Group("/org", func() { | m.Group("/org", func() { | ||||
m.Group("/:org", func() { | m.Group("/:org", func() { | ||||
m.Get("/members", org.Members) | m.Get("/members", org.Members) | ||||
m.Group("/org_tag", func() { | |||||
m.Get("/repo_list", org.GetTagRepos) | |||||
m.Post("/repo_submit", bindIgnErr(auth.SubmitReposOfTagForm{}), org.SubmitTags) | |||||
}) | |||||
}, context.OrgAssignment()) | }, context.OrgAssignment()) | ||||
}) | }) | ||||
m.Group("/org", func() { | m.Group("/org", func() { | ||||
@@ -964,11 +968,11 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
m.Group("/cloudbrain", func() { | m.Group("/cloudbrain", func() { | ||||
m.Group("/:jobid", func() { | m.Group("/:jobid", func() { | ||||
m.Get("", reqRepoCloudBrainReader, repo.CloudBrainShow) | m.Get("", reqRepoCloudBrainReader, repo.CloudBrainShow) | ||||
m.Get("/debug", reqRepoCloudBrainWriter, repo.CloudBrainDebug) | |||||
m.Get("/debug", cloudbrain.AdminOrJobCreaterRight, repo.CloudBrainDebug) | |||||
m.Post("/commit_image", cloudbrain.AdminOrOwnerOrJobCreaterRight, bindIgnErr(auth.CommitImageCloudBrainForm{}), repo.CloudBrainCommitImage) | m.Post("/commit_image", cloudbrain.AdminOrOwnerOrJobCreaterRight, bindIgnErr(auth.CommitImageCloudBrainForm{}), repo.CloudBrainCommitImage) | ||||
m.Post("/stop", cloudbrain.AdminOrOwnerOrJobCreaterRight, repo.CloudBrainStop) | m.Post("/stop", cloudbrain.AdminOrOwnerOrJobCreaterRight, repo.CloudBrainStop) | ||||
m.Post("/del", cloudbrain.AdminOrOwnerOrJobCreaterRight, repo.CloudBrainDel) | m.Post("/del", cloudbrain.AdminOrOwnerOrJobCreaterRight, repo.CloudBrainDel) | ||||
m.Post("/restart", cloudbrain.AdminOrOwnerOrJobCreaterRight, repo.CloudBrainRestart) | |||||
m.Post("/restart", reqRepoCloudBrainWriter, repo.CloudBrainRestart) | |||||
m.Get("/rate", reqRepoCloudBrainReader, repo.GetRate) | m.Get("/rate", reqRepoCloudBrainReader, repo.GetRate) | ||||
m.Get("/models", reqRepoCloudBrainReader, repo.CloudBrainShowModels) | m.Get("/models", reqRepoCloudBrainReader, repo.CloudBrainShowModels) | ||||
m.Get("/download_model", cloudbrain.AdminOrOwnerOrJobCreaterRight, repo.CloudBrainDownloadModel) | m.Get("/download_model", cloudbrain.AdminOrOwnerOrJobCreaterRight, repo.CloudBrainDownloadModel) | ||||
@@ -1005,8 +1009,8 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
m.Group("/notebook", func() { | m.Group("/notebook", func() { | ||||
m.Group("/:jobid", func() { | m.Group("/:jobid", func() { | ||||
m.Get("", reqRepoCloudBrainReader, repo.NotebookShow) | m.Get("", reqRepoCloudBrainReader, repo.NotebookShow) | ||||
m.Get("/debug", reqRepoCloudBrainWriter, repo.NotebookDebug) | |||||
m.Post("/:action", cloudbrain.AdminOrOwnerOrJobCreaterRight, repo.NotebookManage) | |||||
m.Get("/debug", cloudbrain.AdminOrJobCreaterRight, repo.NotebookDebug) | |||||
m.Post("/:action", reqRepoCloudBrainWriter, repo.NotebookManage) | |||||
m.Post("/del", cloudbrain.AdminOrOwnerOrJobCreaterRight, repo.NotebookDel) | m.Post("/del", cloudbrain.AdminOrOwnerOrJobCreaterRight, repo.NotebookDel) | ||||
}) | }) | ||||
m.Get("/create", reqRepoCloudBrainWriter, repo.NotebookNew) | m.Get("/create", reqRepoCloudBrainWriter, repo.NotebookNew) | ||||
@@ -20,10 +20,11 @@ | |||||
</div> | </div> | ||||
<div class="ui container"> | <div class="ui container"> | ||||
<div class="ui stackable grid"> | |||||
{{template "org/navber" .}} | |||||
<div class="ui fourteen wide computer column"> | |||||
{{template "org/navber" .}} | |||||
{{template "org/select_pro" .}} | |||||
<div class="ui stackable grid"> | |||||
<div class="ui sixteen wide computer column"> | |||||
<div class="ui mobile reversed stackable grid"> | <div class="ui mobile reversed stackable grid"> | ||||
<div class="ui ten wide tablet eleven wide computer column"> | <div class="ui ten wide tablet eleven wide computer column"> | ||||
{{if .CanCreateOrgRepo}} | {{if .CanCreateOrgRepo}} | ||||
@@ -3,10 +3,11 @@ | |||||
{{template "org/header" .}} | {{template "org/header" .}} | ||||
<div class="ui container"> | <div class="ui container"> | ||||
{{template "base/alert" .}} | {{template "base/alert" .}} | ||||
{{template "org/navber" .}} | |||||
<div class="ui stackable grid"> | <div class="ui stackable grid"> | ||||
{{template "org/navber" .}} | |||||
<div class="ui fourteen wide computer column list"> | |||||
<div class="ui sixteen wide computer column list"> | |||||
{{ range .Members}} | {{ range .Members}} | ||||
<div class="item ui grid"> | <div class="item ui grid"> | ||||
<div class="ui two wide column"> | <div class="ui two wide column"> | ||||
@@ -1,4 +1,4 @@ | |||||
<div class="tablet only mobile only sixteen wide mobile sixteen wide tablet column row"> | |||||
<!-- <div class="tablet only mobile only sixteen wide mobile sixteen wide tablet column row"> | |||||
<div class="ui secondary pointing tabular top attached borderless menu navbar"> | <div class="ui secondary pointing tabular top attached borderless menu navbar"> | ||||
<a class="{{if $.PageIsOrgHome}}active{{end}} item" href="{{.HomeLink}}"> | <a class="{{if $.PageIsOrgHome}}active{{end}} item" href="{{.HomeLink}}"> | ||||
{{svg "octicon-home" 16}} {{$.i18n.Tr "org.home"}} | {{svg "octicon-home" 16}} {{$.i18n.Tr "org.home"}} | ||||
@@ -12,10 +12,10 @@ | |||||
</a> | </a> | ||||
{{end}} | {{end}} | ||||
</div> | </div> | ||||
</div> | |||||
</div> --> | |||||
<!--平板、移动端--> | <!--平板、移动端--> | ||||
<div class="computer only two wide computer column"> | |||||
<!-- <div class="computer only two wide computer column"> | |||||
<div class="ui grid"> | <div class="ui grid"> | ||||
<div class="sixteen wide column ui secondary sticky pointing tabular vertical menu"> | <div class="sixteen wide column ui secondary sticky pointing tabular vertical menu"> | ||||
{{with .Org}} | {{with .Org}} | ||||
@@ -33,5 +33,37 @@ | |||||
{{end}} | {{end}} | ||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | |||||
<!--电脑、宽屏--> | |||||
</div> --> | |||||
<!--电脑、宽屏--> | |||||
<style> | |||||
.dis{ | |||||
margin-bottom: 10px; | |||||
} | |||||
.active{ | |||||
color:#0366D6 !important; | |||||
} | |||||
.mleft{ | |||||
margin-left: 30% !important; | |||||
} | |||||
.mbom{ | |||||
margin-bottom: 10px !important; | |||||
} | |||||
</style> | |||||
<div class="row"> | |||||
<div class="ui secondary pointing tabular top attached borderless menu navbar mbom"> | |||||
{{with .Org}} | |||||
<a class="{{if $.PageIsOrgHome}}active{{end}} item mleft" href="{{.HomeLink}}"> | |||||
{{svg "octicon-home" 16}} {{$.i18n.Tr "org.home"}} | |||||
</a> | |||||
{{end}} | |||||
<a class="{{if $.PageIsOrgMembers}}active{{end}} item" href="{{$.OrgLink}}/members"> | |||||
{{svg "octicon-organization" 16}} {{$.i18n.Tr "org.people"}} | |||||
</a> | |||||
{{if or ($.IsOrganizationMember) ($.IsOrganizationOwner)}} | |||||
<a class="{{if $.PageIsOrgTeams}}active{{end}} item" href="{{$.OrgLink}}/teams"> | |||||
{{svg "octicon-jersey" 16}} {{$.i18n.Tr "org.teams"}} | |||||
</a> | |||||
{{end}} | |||||
</div> | |||||
</div> |
@@ -0,0 +1,319 @@ | |||||
<style> | |||||
.text-right{ | |||||
float:right !important; | |||||
} | |||||
.header{ | |||||
font-weight:bold; | |||||
font-size: 18px; | |||||
font-family: SourceHanSansSC-medium; | |||||
} | |||||
.cor{ | |||||
color:#0366D6 !important; | |||||
} | |||||
.header_card{ | |||||
/* color:#003A8C !important; */ | |||||
color:#0366D6 !important; | |||||
margin: 10px 0 0px 0; | |||||
height: 25px; | |||||
} | |||||
.marg{ | |||||
margin: 0 5px !important; | |||||
} | |||||
.content_list{ | |||||
max-height: 130px; | |||||
overflow: auto; | |||||
} | |||||
.Relist{ | |||||
color:#0366D6 !important; | |||||
} | |||||
.descript_height{ | |||||
color: #101010 !important; | |||||
margin: 10px 0; | |||||
height: 40px !important; | |||||
word-break:break-all; | |||||
line-height: 20px; | |||||
overflow: hidden; | |||||
/* overflow: hidden!important; | |||||
word-wrap:break-word!important; */ | |||||
} | |||||
.tags_height{ | |||||
height: 30px !important; | |||||
} | |||||
.full_height{ | |||||
height: 100%; | |||||
} | |||||
.omit{ | |||||
overflow: hidden; white-space: nowrap; text-overflow: ellipsis; | |||||
} | |||||
/deep/ ui.checkbox input[type=checkbox]::after{ | |||||
border: 1px solid #0366D6 !important; | |||||
} | |||||
.nowrap-2 { | |||||
/* height: 2.837em; */ | |||||
/* line-height: 1.4285em; */ | |||||
overflow: hidden; | |||||
overflow: hidden; | |||||
display: -webkit-box; | |||||
-webkit-line-clamp: 2; | |||||
-webkit-box-orient: vertical; | |||||
} | |||||
</style> | |||||
<div class="ui stackable grid"> | |||||
<div style="width: 100%;margin:15px 0;"> | |||||
{{if .tags}} | |||||
<span class="header"> | |||||
精选项目 | |||||
</span> | |||||
<!-- {{.IsOrganizationOwner}} --> | |||||
{{if .IsOrganizationOwner}} | |||||
<a class="text-right" id="model" onclick="showcreate()" >{{svg "octicon-gear" 16}}自定义</a> | |||||
{{end}} | |||||
{{end}} | |||||
</div> | |||||
<div style="width: 100%;"> | |||||
{{ range .tags}} | |||||
{{if eq .TagName "精选项目"}} | |||||
<div class="ui three cards" style="margin-bottom: 10px;"> | |||||
{{ range .RepoList}} | |||||
<div class="card" > | |||||
<div class="extra full_height cor" > | |||||
<div class=" header header_card omit" > | |||||
<a class="header_card image poping up " href="{{.Link}}" data-content="{{.Name}}" data-position="top left" data-variation="tiny inverted"> {{.Name}}</a> | |||||
</div> | |||||
<div class='content descript_height nowrap-2'> | |||||
{{.Description}} | |||||
</div> | |||||
<div class="content " > | |||||
{{if .Topics }} | |||||
<div class=" tags " style="position: relative;"> | |||||
{{range .Topics}} | |||||
{{if ne . "" }}<a style="max-width:100%;margin: 5px 0;display:inline-flex;" href="{{AppSubUrl}}/explore/repos?q={{.}}&topic={{$.Topic}}" ><span class="ui small label topic omit" >{{.}}</span></a>{{end}} | |||||
{{end}} | |||||
</div> | |||||
{{end}} | |||||
</div> | |||||
</div> | |||||
<div class=" extra " style="color:#888888;border-top: none !important"> | |||||
<div class="ui mini right compact marg" > | |||||
<a class="item marg "> | |||||
{{svg "octicon-eye" 16}} {{.NumWatches}} | |||||
</a> | |||||
<a class="item marg"> | |||||
{{svg "octicon-star" 16}} {{.NumStars}} | |||||
</a> | |||||
<a class="item marg"> | |||||
{{svg "octicon-git-branch" 16}} {{.NumForks}} | |||||
</a> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
{{end}} | |||||
</div> | |||||
{{end}} | |||||
{{end}} | |||||
</div> | |||||
</div> | |||||
<div class="ui modal"> | |||||
<div class="header" style="padding: 1rem;background-color: rgba(240, 240, 240, 100);"> | |||||
<h4 id="model_header">自定义精选项目</h4> | |||||
</div> | |||||
<div class="content content-padding" style="color: black;"> | |||||
<p>最多可选9个公开项目</p> | |||||
<div class="ui search" > | |||||
<div class="ui input" style="width: 100%;"> | |||||
<input type="text" id = 'search_selectPro' placeholder="Search ..." value = '' oninput="search()"> | |||||
</div> | |||||
</div> | |||||
<div style="margin: 10px ;"> | |||||
<div id ='org_list' style="margin-bottom: 20px;"class="content_list" > | |||||
</div> | |||||
</div> | |||||
<p id='recommend'></p> | |||||
<div class="inline field" style="margin-left: 37%;"> | |||||
<div class="actions"> | |||||
<button id="submitId" type="button" class="ui create_train_job green deny button" onclick="saveSeletedPro(1)"> | |||||
{{.i18n.Tr "explore.save"}} | |||||
</button> | |||||
<button class="ui button cancel" >{{.i18n.Tr "explore.cancel"}}</button> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<script> | |||||
var data; | |||||
var filterData=[]; | |||||
var num=0; | |||||
function showcreate(obj){ | |||||
document.getElementById("search_selectPro").value='' | |||||
$('.ui.modal') | |||||
.modal({ | |||||
centered: false, | |||||
onShow:function(){ | |||||
$("#org_list").empty() | |||||
getPro(1) | |||||
}, | |||||
onHide:function(){ | |||||
} | |||||
}) | |||||
.modal('show') | |||||
} | |||||
function getPro(typeTag){ | |||||
$.ajax({ | |||||
type:"GET", | |||||
url:"/org/{{.Org.Name}}/org_tag/repo_list?tagId="+typeTag, | |||||
dataType:"json", | |||||
async:false, | |||||
success:function(json){ | |||||
data = json.data; | |||||
var n_length = data.length | |||||
pro_html = getHTML(data) | |||||
$("#org_list").append(pro_html) | |||||
// console.log('原始',data) | |||||
checkedNum(0) | |||||
} | |||||
}); | |||||
} | |||||
function getHTML(data){ | |||||
let pro_html='' | |||||
for (let i=0;i<data.length;i++){ | |||||
if (data[i].Selected==true){ | |||||
console.log("data[i]:",data[i]) | |||||
pro_html += `<div class="ui checkbox" style="width: 33%;margin-bottom:10px" > <input type="checkbox" id = " ${i}" checked="" onclick="checkedNum(${i})" class="Relist" name ='select_pro_name' data-repoid="${data[i].RepoID}" data-reponame="${data[i].RepoName}" data-selected=${data[i].Selected} > <label class='omit image poping up' data-content=${data[i].RepoName} data-position="top left " data-variation="mini"> ${data[i].RepoName}</label></div>` | |||||
pro_html += '</div>' | |||||
} | |||||
else{ | |||||
pro_html += `<div class="ui checkbox" style="width: 33%;margin-bottom:10px" > <input type="checkbox" id = "${i}" onclick="checkedNum(${i})" class="Relist" name ='select_pro_name' data-repoid="${data[i].RepoID}" data-reponame="${data[i].RepoName}" data-selected= ${data[i].Selected}> <label class='omit image poping up' data-content=${data[i].RepoName} data-position="top left " data-variation="mini"> ${data[i].RepoName} </label></div>` | |||||
pro_html += '</div>' | |||||
} | |||||
} | |||||
return pro_html | |||||
} | |||||
function saveSeletedPro(typeTag){ | |||||
var saveData=[]; | |||||
$('input[name="select_pro_name"]:checked').each(function(){ | |||||
console.log('值',this.dataset.repoid) | |||||
saveData.push(parseInt(this.dataset.repoid)); | |||||
}) | |||||
if(saveData.length>9){ | |||||
alert("最多可选9个,保存失败") | |||||
return | |||||
} | |||||
// saveData = getSelecteDataID(); | |||||
// console.log("数据:",saveData) | |||||
$.ajax({ | |||||
type:"POST", | |||||
url:"/org/{{.Org.Name}}/org_tag/repo_submit?tagId="+typeTag, | |||||
contentType:'application/json', | |||||
dataType:"json", | |||||
async:false, | |||||
data:JSON.stringify({'repoList':saveData | |||||
}), | |||||
success:function(res){ | |||||
console.log('保存成功'); | |||||
location.reload() | |||||
} | |||||
}); | |||||
} | |||||
function getSelecteData(){ | |||||
var selectedData=[]; | |||||
$('input[name="select_pro_name"]:checked').each(function(){ | |||||
// console.log(this) | |||||
// console.log('值',this.dataset.selected) | |||||
selectedData.push({"RepoID":parseInt(this.dataset.repoid),"RepoName":this.dataset.reponame,"Selected":JSON.parse(this.dataset.selected)}); | |||||
}) | |||||
return selectedData | |||||
} | |||||
function search(){ | |||||
var selectedData = getSelecteData(); | |||||
var searchValue = document.getElementById("search_selectPro").value; | |||||
filterData=[]; | |||||
console.log("searchValue:",searchValue) | |||||
for (let i=0;i<data.length;i++){ | |||||
var isInclude=false; | |||||
if(data[i].RepoName.toLowerCase().includes(searchValue.toLowerCase())){ | |||||
filterData.push(data[i]) | |||||
} | |||||
} | |||||
console.log("选中的值:",selectedData) | |||||
console.log("筛选包括选中的值:",filterData) | |||||
var showData=[]; | |||||
for(i=0;i<selectedData.length;i++){ | |||||
filterData =filterData.filter((item)=>{ | |||||
return item.RepoID!=selectedData[i].RepoID | |||||
}); | |||||
} | |||||
console.log("筛选后不包括选中的值:",filterData) | |||||
$("#org_list").empty() | |||||
if(searchValue!=""){ | |||||
if (filterData.length!=0){ | |||||
var pro_html = getHTML(selectedData); | |||||
console.log("selectedData_pro_html:",pro_html) | |||||
$("#org_list").append(pro_html) | |||||
pro_html= getHTML(filterData); | |||||
$("#org_list").append(pro_html) | |||||
}else{ | |||||
var pro_html = getHTML(selectedData); | |||||
$("#org_list").append(pro_html) | |||||
} | |||||
}else{ | |||||
var pro_html = getHTML(data); | |||||
$("#org_list").append(pro_html) | |||||
} | |||||
} | |||||
function checkedNum(id){ | |||||
num=0; | |||||
var inputs = document.getElementsByName("select_pro_name") | |||||
for (var i=0;i<inputs.length;i++){ | |||||
if(inputs[i].checked){ | |||||
num++ | |||||
if(num>9){ | |||||
document.getElementById(id).checked=false | |||||
alert("选择超过9个,请重新选择!") | |||||
return | |||||
} | |||||
} | |||||
} | |||||
var show_num = 9-num; | |||||
document.getElementById("recommend").innerHTML="还能推荐"+show_num+"个" | |||||
} | |||||
</script> |
@@ -3,12 +3,12 @@ | |||||
{{template "org/header" .}} | {{template "org/header" .}} | ||||
<div class="ui container"> | <div class="ui container"> | ||||
{{template "base/alert" .}} | {{template "base/alert" .}} | ||||
{{template "org/navber" .}} | |||||
<div class="ui stackable grid"> | <div class="ui stackable grid"> | ||||
{{template "org/navber" .}} | |||||
<div class="ui fourteen wide computer column list"> | |||||
<div class="ui sixteen wide computer column list"> | |||||
<div class="ui two column grid"> | <div class="ui two column grid"> | ||||
{{range .Teams}} | {{range .Teams}} | ||||
<div class="column"> | <div class="column"> | ||||
@@ -203,18 +203,15 @@ | |||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="alert"></div> | |||||
<div class="repository release dataset-list view"> | <div class="repository release dataset-list view"> | ||||
{{template "repo/header" .}} | {{template "repo/header" .}} | ||||
<!-- {{template "base/alert" .}} --> | |||||
{{template "base/alert" .}} | |||||
<!-- 提示框 --> | <!-- 提示框 --> | ||||
<!-- 列表容器 --> | <!-- 列表容器 --> | ||||
<div class="ui container"> | <div class="ui container"> | ||||
<div class="ui negative message" style="display: none;"> | |||||
<i class="close icon"></i> | |||||
<p></p> | |||||
</div> | |||||
<div class="ui two column stackable grid"> | <div class="ui two column stackable grid"> | ||||
<div class="column"> | <div class="column"> | ||||
<div class="ui blue small menu compact selectcloudbrain"> | <div class="ui blue small menu compact selectcloudbrain"> | ||||
@@ -335,10 +332,15 @@ | |||||
</a> | </a> | ||||
{{end}} | {{end}} | ||||
{{else}} | {{else}} | ||||
<a class="ui basic disabled button"> | |||||
{{$.i18n.Tr "repo.debug_again"}} | |||||
</a> | |||||
{{if eq .Status "RUNNING"}} | |||||
<a class="ui basic disabled button"> | |||||
{{$.i18n.Tr "repo.debug"}} | |||||
</a> | |||||
{{else}} | |||||
<a class="ui basic disabled button"> | |||||
{{$.i18n.Tr "repo.debug_again"}} | |||||
</a> | |||||
{{end}} | |||||
{{end}} | {{end}} | ||||
</form> | </form> | ||||
@@ -401,6 +403,13 @@ | |||||
<a class="ui basic disabled button">{{$.i18n.Tr "repo.download"}}</a> | <a class="ui basic disabled button">{{$.i18n.Tr "repo.download"}}</a> | ||||
{{end}} | {{end}} | ||||
</div> | </div> | ||||
{{if and (ne .JobType "DEBUG") (eq .Cloudbrain.Type 0)}} | |||||
<div class="item" style="padding: 0 !important;"> | |||||
<a class="ui basic blue button" href="{{$.RepoLink}}/cloudbrain/{{.JobID}}/rate" target="_blank"> | |||||
评分 | |||||
</a> | |||||
</div> | |||||
{{end}} | |||||
</div> | </div> | ||||
</div> | </div> | ||||
@@ -518,6 +527,7 @@ | |||||
onApprove: function() { | onApprove: function() { | ||||
document.getElementById(delId).submit() | document.getElementById(delId).submit() | ||||
flag = true | flag = true | ||||
$('.alert').html('操作成功!').removeClass('alert-danger').addClass('alert-success').show().delay(1500).fadeOut(); | |||||
}, | }, | ||||
onHidden: function() { | onHidden: function() { | ||||
if (flag == false) { | if (flag == false) { | ||||
@@ -547,9 +557,7 @@ | |||||
$('#model-delete-'+JobID).removeClass('blue').addClass('disabled') | $('#model-delete-'+JobID).removeClass('blue').addClass('disabled') | ||||
} | } | ||||
}else{ | }else{ | ||||
$(".ui.negative.message").css("display","block") | |||||
$(".ui.negative.message p").text(res.error_msg) | |||||
setTimeout("$('.message .close').click()",3000) | |||||
$('.alert').html(res.error_msg).removeClass('alert-success').addClass('alert-danger').show().delay(2000).fadeOut(); | |||||
} | } | ||||
}, | }, | ||||
error :function(res){ | error :function(res){ | ||||
@@ -581,7 +589,7 @@ | |||||
} | } | ||||
}else{ | }else{ | ||||
$("ui.negative.message").text(res.error_msg) | |||||
$('.alert').html(res.error_msg).removeClass('alert-success').addClass('alert-danger').show().delay(2000).fadeOut(); | |||||
} | } | ||||
}, | }, | ||||
error :function(res){ | error :function(res){ | ||||
@@ -708,8 +716,6 @@ | |||||
var responseText = $("iframe")[0].contentDocument.body.getElementsByTagName("pre")[0].innerHTML; | var responseText = $("iframe")[0].contentDocument.body.getElementsByTagName("pre")[0].innerHTML; | ||||
var json1 = JSON.parse(responseText) | var json1 = JSON.parse(responseText) | ||||
$('#mask').css('display', 'none') | $('#mask').css('display', 'none') | ||||
parent.location.href | |||||
if (json1.result_code === "0") { | if (json1.result_code === "0") { | ||||
$('.alert').html('操作成功!').removeClass('alert-danger').addClass('alert-success').show().delay(1500).fadeOut(); | $('.alert').html('操作成功!').removeClass('alert-danger').addClass('alert-success').show().delay(1500).fadeOut(); | ||||
} else { | } else { | ||||
@@ -4,6 +4,7 @@ | |||||
} | } | ||||
.ovfl{ | .ovfl{ | ||||
overflow-y:hidden !important; | overflow-y:hidden !important; | ||||
min-width: 140px!important; | |||||
} | } | ||||
</style> | </style> | ||||
{{template "base/head" .}} | {{template "base/head" .}} | ||||
@@ -667,7 +667,12 @@ td, th { | |||||
html += "</span>" | html += "</span>" | ||||
html += "</td>" | html += "</td>" | ||||
html += "<td class='message seven wide'>" | html += "<td class='message seven wide'>" | ||||
html += "<span class='truncate has-emoji'>"+ `${dirs_size}` + "</span>" | |||||
if(data.Dirs[i].IsDir){ | |||||
html += "<span class='truncate has-emoji'></span>" | |||||
}else{ | |||||
html += "<span class='truncate has-emoji'>"+ `${dirs_size}` + "</span>" | |||||
} | |||||
html += "</td>" | html += "</td>" | ||||
html += "<td class='text right age three wide'>" | html += "<td class='text right age three wide'>" | ||||
@@ -69,7 +69,7 @@ | |||||
<!-- <a href="javascript:window.history.back();"><i class="arrow left icon"></i>返回</a> --> | <!-- <a href="javascript:window.history.back();"><i class="arrow left icon"></i>返回</a> --> | ||||
<div class="ui breadcrumb"> | <div class="ui breadcrumb"> | ||||
<a class="section" href="{{$.RepoLink}}/modelmanage/show_model"> | <a class="section" href="{{$.RepoLink}}/modelmanage/show_model"> | ||||
模型管理 | |||||
{{$.i18n.Tr "repo.model.manage.model_manage"}} | |||||
</a> | </a> | ||||
<div class="divider"> / </div> | <div class="divider"> / </div> | ||||
<div class="active section">{{.name}}</div> | <div class="active section">{{.name}}</div> | ||||
@@ -83,15 +83,15 @@ | |||||
<table class="tableStyle" style="margin-top:20px;"> | <table class="tableStyle" style="margin-top:20px;"> | ||||
<tbody> | <tbody> | ||||
<tr> | <tr> | ||||
<td class="ti-text-form-label text-width80">模型名称</td> | |||||
<td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.model.manage.model_name"}}</td> | |||||
<td class="ti-text-form-content word-elipsis"><span id="ModelName" title=""></span></td> | <td class="ti-text-form-content word-elipsis"><span id="ModelName" title=""></span></td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td class="ti-text-form-label text-width80">版本</td> | |||||
<td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.model.manage.version"}}</td> | |||||
<td class="ti-text-form-content word-elipsis"><span id="Version" title=""></span></td> | <td class="ti-text-form-content word-elipsis"><span id="Version" title=""></span></td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td class="ti-text-form-label text-width80">标签</td> | |||||
<td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.migrate_items_labels"}}</td> | |||||
<td class="ti-text-form-content"> | <td class="ti-text-form-content"> | ||||
<div id="Label" style="overflow: hidden;width: 95%;"> | <div id="Label" style="overflow: hidden;width: 95%;"> | ||||
@@ -101,15 +101,15 @@ | |||||
</td> | </td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td class="ti-text-form-label text-width80">大小</td> | |||||
<td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.model_size"}}</td> | |||||
<td class="ti-text-form-content word-elipsis"><span id="Size" title=""></span></td> | <td class="ti-text-form-content word-elipsis"><span id="Size" title=""></span></td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td class="ti-text-form-label text-width80">创建时间</td> | |||||
<td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.createtime"}}</td> | |||||
<td class="ti-text-form-content word-elipsis"><span id="CreateTime" title=""></span></td> | <td class="ti-text-form-content word-elipsis"><span id="CreateTime" title=""></span></td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td class="ti-text-form-label text-width80">模型描述</td> | |||||
<td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.model.manage.description"}}</td> | |||||
<td class="ti-text-form-content" > | <td class="ti-text-form-content" > | ||||
<div id="edit-td" style="display:flex"> | <div id="edit-td" style="display:flex"> | ||||
<span id="Description" title="" class="iword-elipsis"></span> | <span id="Description" title="" class="iword-elipsis"></span> | ||||
@@ -118,38 +118,42 @@ | |||||
</td> | </td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td class="ti-text-form-label text-width80">代码版本</td> | |||||
<td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.code_version"}}</td> | |||||
<td class="ti-text-form-content word-elipsis"><span id="CodeBranch" title=""></span></td> | <td class="ti-text-form-content word-elipsis"><span id="CodeBranch" title=""></span></td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td class="ti-text-form-label text-width80">启动文件</td> | |||||
<td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.train_job.start_file"}}</td> | |||||
<td class="ti-text-form-content word-elipsis"><span id="BootFile" title=""></span></td> | <td class="ti-text-form-content word-elipsis"><span id="BootFile" title=""></span></td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td class="ti-text-form-label text-width80">训练数据集</td> | |||||
<td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.train_job.train_dataset"}}</td> | |||||
<td class="ti-text-form-content word-elipsis"><span id="DatasetName" title=""></span></td> | <td class="ti-text-form-content word-elipsis"><span id="DatasetName" title=""></span></td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td class="ti-text-form-label text-width80">运行参数</td> | |||||
<td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.train_job.run_parameter"}}</td> | |||||
<td class="ti-text-form-content word-elipsis"><span id="Parameters" title=""></span></td> | <td class="ti-text-form-content word-elipsis"><span id="Parameters" title=""></span></td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td class="ti-text-form-label text-width80">规格</td> | |||||
<td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.train_job.AI_driver"}}</td> | |||||
<td class="ti-text-form-content word-elipsis"><span id="EngineName" title=""></span></td> | |||||
</tr> | |||||
<tr> | |||||
<td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.train_job.standard"}}</td> | |||||
<td class="ti-text-form-content word-elipsis"><span id="FlavorName" title=""></span></td> | <td class="ti-text-form-content word-elipsis"><span id="FlavorName" title=""></span></td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td class="ti-text-form-label text-width80">计算节点</td> | |||||
<td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.train_job.compute_node"}}</td> | |||||
<td class="ti-text-form-content word-elipsis"><span id="WorkServerNumber" title=""></span></td> | <td class="ti-text-form-content word-elipsis"><span id="WorkServerNumber" title=""></span></td> | ||||
</tr> | </tr> | ||||
</tbody> | </tbody> | ||||
</table> | </table> | ||||
</div> | </div> | ||||
<div class="half-table"> | <div class="half-table"> | ||||
<span class="model_header_text">模型精度</span> | |||||
<span class="model_header_text">{{$.i18n.Tr "repo.model.manage.model_accuracy"}}</span> | |||||
<table class="tableStyle" style="margin-top:20px;"> | <table class="tableStyle" style="margin-top:20px;"> | ||||
<tbody> | <tbody> | ||||
<tr> | <tr> | ||||
<td class="ti-text-form-label text-width80">准确率</td> | |||||
<td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.model.manage.Accuracy"}}</td> | |||||
<td class="ti-text-form-content word-elipsis"><span id="Accuracy" title=""></span></td> | <td class="ti-text-form-content word-elipsis"><span id="Accuracy" title=""></span></td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
@@ -157,11 +161,11 @@ | |||||
<td class="ti-text-form-content word-elipsis"><span id="F1" title=""></span></td> | <td class="ti-text-form-content word-elipsis"><span id="F1" title=""></span></td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td class="ti-text-form-label text-width80">精确率</td> | |||||
<td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.model.manage.Precision"}}</td> | |||||
<td class="ti-text-form-content word-elipsis"><span id="Precision" title=""></span></td> | <td class="ti-text-form-content word-elipsis"><span id="Precision" title=""></span></td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td class="ti-text-form-label text-width80">召回率</td> | |||||
<td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.model.manage.Recall"}}</td> | |||||
<td class="ti-text-form-content word-elipsis"><span id="Recall" title=""></span></td> | <td class="ti-text-form-content word-elipsis"><span id="Recall" title=""></span></td> | ||||
</tr> | </tr> | ||||
</tbody> | </tbody> | ||||
@@ -209,11 +213,9 @@ function transObj(data){ | |||||
let modelAcc = JSON.parse(Accuracy) | let modelAcc = JSON.parse(Accuracy) | ||||
TrainTaskInfo = JSON.parse(TrainTaskInfo) | TrainTaskInfo = JSON.parse(TrainTaskInfo) | ||||
// Parameters = JSON.parse(Parameters) | // Parameters = JSON.parse(Parameters) | ||||
console.log("TrainTaskInfo",TrainTaskInfo) | |||||
let {Parameters} = TrainTaskInfo | |||||
let {Parameters,EngineName} = TrainTaskInfo | |||||
Parameters = JSON.parse(Parameters) | Parameters = JSON.parse(Parameters) | ||||
Parameters = Parameters.parameter.length === 0 ? '--':Parameters.parameter | Parameters = Parameters.parameter.length === 0 ? '--':Parameters.parameter | ||||
console.log(Parameters) | |||||
let size = tranSize(Size) | let size = tranSize(Size) | ||||
let time = transTime(CreatedUnix) | let time = transTime(CreatedUnix) | ||||
let initObj = { | let initObj = { | ||||
@@ -230,7 +232,8 @@ function transObj(data){ | |||||
Parameters:TrainTaskInfo.Parameters || '--', | Parameters:TrainTaskInfo.Parameters || '--', | ||||
FlavorName:TrainTaskInfo.FlavorName || '--', | FlavorName:TrainTaskInfo.FlavorName || '--', | ||||
WorkServerNumber:TrainTaskInfo.WorkServerNumber || '--', | WorkServerNumber:TrainTaskInfo.WorkServerNumber || '--', | ||||
Parameters:Parameters | |||||
Parameters:Parameters, | |||||
EngineName:EngineName, | |||||
} | } | ||||
let initModelAcc = { | let initModelAcc = { | ||||
Accuracy: modelAcc.Accuracy || '--', | Accuracy: modelAcc.Accuracy || '--', | ||||
@@ -319,7 +322,6 @@ function renderInfo(obj,accObj,id){ | |||||
} | } | ||||
else if(key==="Parameters"){ | else if(key==="Parameters"){ | ||||
console.log("obj[key",obj[key]) | |||||
if(obj[key]==='--'){ | if(obj[key]==='--'){ | ||||
$(`#${key}`).text(obj[key]) | $(`#${key}`).text(obj[key]) | ||||
}else{ | }else{ | ||||
@@ -328,7 +330,6 @@ function renderInfo(obj,accObj,id){ | |||||
return labelValue | return labelValue | ||||
}); | }); | ||||
const parameter = parameterArray.join('; ') | const parameter = parameterArray.join('; ') | ||||
console.log(parameter) | |||||
$(`#${key}`).text(parameter) | $(`#${key}`).text(parameter) | ||||
$(`#${key}`).attr("title",parameter) | $(`#${key}`).attr("title",parameter) | ||||
} | } | ||||