| @@ -44,6 +44,12 @@ | |||
| -webkit-line-clamp: 2; | |||
| -webkit-box-orient: vertical; | |||
| } | |||
| .ui.label{ | |||
| font-weight: normal; | |||
| } | |||
| .active { | |||
| color: #0366D6 !important; | |||
| } | |||
| .opacity5{ opacity:0.5;} | |||
| .radius15{ border-radius:1.5rem !important; } | |||
| @@ -250,9 +256,13 @@ | |||
| box-shadow: none !important; | |||
| } | |||
| .homeorg-list .card .ui.small.header .content{ | |||
| width: calc(100% - 3.25em); | |||
| width: calc(100% - 3.75em); | |||
| } | |||
| .homepro-list{ | |||
| .homepro-tit{ | |||
| z-index: 9; | |||
| position: relative; | |||
| } | |||
| .homepro-list, .homeorg-list{ | |||
| position: relative; | |||
| z-index: 9; | |||
| padding: 1.0em 1.0em 3.0em; | |||
| @@ -261,42 +271,156 @@ | |||
| .homepro-list .ui.card{ | |||
| border-radius: 15px; | |||
| background-color: #FFF; | |||
| box-shadow: 0px 5px 10px 0px rgba(105, 192, 255, 30); | |||
| border: 1px solid rgba(105, 192, 255, 40); | |||
| box-shadow: 0px 5px 10px 0px rgba(105, 192, 255, .3); | |||
| border: 1px solid rgba(105, 192, 255, .4); | |||
| min-height: 10.8em; | |||
| } | |||
| .homepro-list .ui.card>.content>.header{ | |||
| line-height: 40px !important; | |||
| } | |||
| .homepro-list .swiper-pagination-bullet-active{ | |||
| .homepro-list .swiper-pagination-bullet-active, .homeorg-list .swiper-pagination-bullet-active{ | |||
| width: 40px; | |||
| border-radius: 4px; | |||
| border-radius: 4px; | |||
| } | |||
| .i-env > div{ | |||
| position: relative; | |||
| } | |||
| /**seach**/ | |||
| /**搜索导航条适配窄屏**/ | |||
| .seachnav{ | |||
| overflow-x: auto; | |||
| overflow-y: hidden; | |||
| scrollbar-width: none; /* firefox */ | |||
| -ms-overflow-style: none; /* IE 10+ */ | |||
| } | |||
| .seachnav::-webkit-scrollbar { | |||
| display: none; /* Chrome Safari */ | |||
| } | |||
| .ui.green.button, .ui.green.buttons .button{ | |||
| background-color: #5BB973; | |||
| } | |||
| .seach .repos--seach{ | |||
| padding-bottom: 0; | |||
| border-bottom: none; | |||
| } | |||
| .seach .ui.secondary.pointing.menu{ | |||
| border-bottom: none; | |||
| } | |||
| .seach .ui.secondary.pointing.menu .item > i{ | |||
| margin-right: 5px; | |||
| } | |||
| .seach .ui.secondary.pointing.menu .active.item{ | |||
| border-bottom-width: 2px; | |||
| margin: 0 0 -1px; | |||
| } | |||
| .seach .ui.menu .active.item>.label { | |||
| background: #1684FC; | |||
| color: #FFF; | |||
| } | |||
| .seach .ui.menu .item>.label:not(.active.item>.label) { | |||
| background: #e8e8e8; | |||
| color: rgba(0,0,0,.6); | |||
| } | |||
| .highlight{ | |||
| color: red; | |||
| } | |||
| .ui.list .list>.item>img.image+.content, .ui.list>.item>img.image+.content { | |||
| width: calc(100% - 3.0em); | |||
| margin-left: 0; | |||
| } | |||
| .seach .ui.list .list>.item .header, .seach .ui.list>.item .header{ | |||
| margin-bottom: 0.5em; | |||
| font-size: 1.4rem !important; | |||
| font-weight: normal; | |||
| } | |||
| .seach .time, .seach .time a{ | |||
| font-size: 12px; | |||
| color: grey; | |||
| } | |||
| .seach .list .item.members .ui.avatar.image { | |||
| width: 3.2em; | |||
| height: 3.2em; | |||
| } | |||
| .ui.list .list>.item.members>img.image+.content, .ui.list>.item.members>img.image+.content { | |||
| width: calc(100% - 4.0em); | |||
| margin-left: 0; | |||
| } | |||
| @media only screen and (max-width: 767px) { | |||
| .am-mt-30{ margin-top: 1.5rem !important;} | |||
| .ui.secondary.hometop.segment{ | |||
| margin-bottom: 2.0rem; | |||
| margin-bottom: 5.0rem; | |||
| } | |||
| .bannerpic, .i-code-pic{ | |||
| .bannerpic{ | |||
| display: none; | |||
| } | |||
| .i-code h2::before { | |||
| left: calc(-5.0rem + 6px); | |||
| #homenews{ | |||
| bottom: -3em; | |||
| } | |||
| .i-code h2.am-bw::before{ | |||
| left: calc(-4.0rem + 6px); | |||
| #homenews > p { | |||
| margin-left: 1.0em; | |||
| } | |||
| .homenews{ | |||
| padding-left: 1.3em !important; | |||
| border-radius: 1.5em; | |||
| } | |||
| .homenews::before{ | |||
| left: 2em; | |||
| } | |||
| .homepro-tit > p{ | |||
| background: #FFF; | |||
| } | |||
| .homeorg{ | |||
| padding-left: 3.5em; | |||
| } | |||
| .homeorg-tit::after { | |||
| left: -2.3em; | |||
| } | |||
| .homeorg-list{ | |||
| margin: 0 0 2.0em !important; | |||
| } | |||
| .homeorg-list > .column{ | |||
| width: 3em !important; | |||
| margin-left: -0.5em; | |||
| padding: 0.5rem 0 0 !important; | |||
| } | |||
| .homeorg-list .card{ | |||
| background: none !important; | |||
| } | |||
| .homeorg-list .card > .content{ | |||
| padding: 0 !important; | |||
| } | |||
| .homeorg-list > .column .card .ui.header>img{ | |||
| width: 3.0em; | |||
| height: 3.0em; | |||
| border-radius: 2.0em; | |||
| border: 2px solid #FFF; | |||
| } | |||
| .homeorg-list > .column .card .ui.header > .content{ | |||
| display: none; | |||
| } | |||
| .leftline01{ | |||
| width: calc(50% - 4.0rem); | |||
| width: 4.0em; | |||
| bottom: 4em; | |||
| border-radius: 0 0 0 3.0em; | |||
| } | |||
| .leftline02{ | |||
| left: calc(50% - 1.0rem); | |||
| top: calc(-3.5rem - 2px); | |||
| .leftline02, .leftline02-2{ | |||
| left: 6.0em; | |||
| top: calc(-4.0em - 2px); | |||
| border-radius: 0 3.0em 3.0em 0; | |||
| width: calc(50% - 6.0em); | |||
| } | |||
| .leftline02-2 { | |||
| width: calc(50% - 8.0em); | |||
| } | |||
| .i-env .ui.cards>.card>.content .description{ | |||
| display: none; | |||
| } | |||
| } | |||
| @@ -49,6 +49,14 @@ const ( | |||
| ActionApprovePullRequest // 21 | |||
| ActionRejectPullRequest // 22 | |||
| ActionCommentPull // 23 | |||
| ActionUploadAttachment //24 | |||
| ActionCreateDebugGPUTask //25 | |||
| ActionCreateDebugNPUTask //26 | |||
| ActionCreateTrainTask //27 | |||
| ActionCreateInferenceTask // 28 | |||
| ActionCreateBenchMarkTask //29 | |||
| ActionCreateNewModelTask //30 | |||
| ) | |||
| // Action represents user operation type and other information to | |||
| @@ -88,12 +88,25 @@ func (a *Attachment) APIFormat() *api.Attachment { | |||
| Size: a.Size, | |||
| UUID: a.UUID, | |||
| DownloadURL: a.DownloadURL(), | |||
| S3DownloadURL: a.S3DownloadURL(), | |||
| } | |||
| } | |||
| // DownloadURL returns the download url of the attached file | |||
| func (a *Attachment) DownloadURL() string { | |||
| return fmt.Sprintf("%sattachments/%s", setting.AppURL, a.UUID) | |||
| return fmt.Sprintf("%sattachments/%s?type=%d", setting.AppURL, a.UUID, a.Type) | |||
| } | |||
| // S3DownloadURL returns the s3 download url of the attached file | |||
| func (a *Attachment) S3DownloadURL() string { | |||
| url := "" | |||
| if a.Type == TypeCloudBrainOne { | |||
| url, _ = storage.Attachments.PresignedGetURL(setting.Attachment.Minio.BasePath+AttachmentRelativePath(a.UUID), a.Name) | |||
| } else if a.Type == TypeCloudBrainTwo { | |||
| url, _ = storage.ObsGetPreSignedUrl(a.UUID, a.Name) | |||
| } | |||
| return url | |||
| } | |||
| // AttachmentRelativePath returns the relative path | |||
| @@ -102,7 +102,7 @@ type Cloudbrain struct { | |||
| UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` | |||
| Duration int64 | |||
| TrainJobDuration string | |||
| Image string //GPU镜像名称 | |||
| Image string //镜像名称 | |||
| GpuQueue string //GPU类型即GPU队列 | |||
| ResourceSpecId int //GPU规格id | |||
| DeletedAt time.Time `xorm:"deleted"` | |||
| @@ -452,6 +452,16 @@ type FlavorInfo struct { | |||
| Desc string `json:"desc"` | |||
| } | |||
| type ImageInfosModelArts struct { | |||
| ImageInfo []*ImageInfoModelArts `json:"image_info"` | |||
| } | |||
| type ImageInfoModelArts struct { | |||
| Id string `json:"id"` | |||
| Value string `json:"value"` | |||
| Desc string `json:"desc"` | |||
| } | |||
| type PoolInfos struct { | |||
| PoolInfo []*PoolInfo `json:"pool_info"` | |||
| } | |||
| @@ -12,6 +12,7 @@ type RepoStatistic struct { | |||
| ID int64 `xorm:"pk autoincr" json:"-"` | |||
| RepoID int64 `xorm:"unique(s) NOT NULL" json:"repo_id"` | |||
| Name string `xorm:"INDEX" json:"name"` | |||
| Alias string `xorm:"INDEX" json:"alias"` | |||
| OwnerName string `json:"ownerName"` | |||
| IsPrivate bool `json:"isPrivate"` | |||
| IsMirror bool `json:"isMirror"` | |||
| @@ -63,6 +64,13 @@ type RepoStatistic struct { | |||
| UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated" json:"-"` | |||
| } | |||
| func (repo *RepoStatistic) DisplayName() string { | |||
| if repo.Alias == "" { | |||
| return repo.Name | |||
| } | |||
| return repo.Alias | |||
| } | |||
| func DeleteRepoStatDaily(date string) error { | |||
| sess := xStatistic.NewSession() | |||
| defer sess.Close() | |||
| @@ -19,7 +19,8 @@ type CreateModelArtsNotebookForm struct { | |||
| JobName string `form:"job_name" binding:"Required"` | |||
| Attachment string `form:"attachment"` | |||
| Description string `form:"description"` | |||
| Flavor string `form:"flavor"` | |||
| Flavor string `form:"flavor" binding:"Required"` | |||
| ImageId string `form:"image_id" binding:"Required"` | |||
| } | |||
| func (f *CreateModelArtsNotebookForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { | |||
| @@ -1,16 +1,17 @@ | |||
| package cloudbrain | |||
| import ( | |||
| "code.gitea.io/gitea/modules/storage" | |||
| "encoding/json" | |||
| "errors" | |||
| "strconv" | |||
| "code.gitea.io/gitea/modules/setting" | |||
| "code.gitea.io/gitea/modules/storage" | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/context" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/notification" | |||
| "code.gitea.io/gitea/modules/setting" | |||
| ) | |||
| const ( | |||
| @@ -221,13 +222,19 @@ func GenerateTask(ctx *context.Context, jobName, image, command, uuid, codePath, | |||
| ComputeResource: models.GPUResource, | |||
| BenchmarkTypeID: benchmarkTypeID, | |||
| BenchmarkChildTypeID: benchmarkChildTypeID, | |||
| Description: description, | |||
| Description: description, | |||
| }) | |||
| if err != nil { | |||
| return err | |||
| } | |||
| if string(models.JobTypeBenchmark) == jobType { | |||
| notification.NotifyOtherTask(ctx.User, ctx.Repo.Repository, jobID, jobName, models.ActionCreateBenchMarkTask) | |||
| } else { | |||
| notification.NotifyOtherTask(ctx.User, ctx.Repo.Repository, jobID, jobName, models.ActionCreateDebugGPUTask) | |||
| } | |||
| return nil | |||
| } | |||
| @@ -6,12 +6,14 @@ | |||
| package context | |||
| import ( | |||
| "encoding/base64" | |||
| "net/http" | |||
| "strings" | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/auth" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/setting" | |||
| "encoding/base64" | |||
| "net/http" | |||
| "gitea.com/macaron/csrf" | |||
| "gitea.com/macaron/macaron" | |||
| @@ -94,7 +96,14 @@ func Toggle(options *ToggleOptions) macaron.Handler { | |||
| return | |||
| } | |||
| ctx.SetCookie("redirect_to", setting.AppSubURL+ctx.Req.URL.RequestURI(), 0, setting.AppSubURL) | |||
| tempUrl := ctx.Req.URL.RequestURI() | |||
| if strings.Contains(tempUrl, "action/star?") || strings.Contains(tempUrl, "action/watch?") { | |||
| redirectForStarAndWatch(ctx, tempUrl) | |||
| } else { | |||
| ctx.SetCookie("redirect_to", setting.AppSubURL+ctx.Req.URL.RequestURI(), 0, setting.AppSubURL) | |||
| } | |||
| ctx.Redirect(setting.AppSubURL + "/user/login") | |||
| return | |||
| } else if !ctx.User.IsActive && setting.Service.RegisterEmailConfirm { | |||
| @@ -159,6 +168,17 @@ func Toggle(options *ToggleOptions) macaron.Handler { | |||
| } | |||
| } | |||
| func redirectForStarAndWatch(ctx *Context, tempUrl string) { | |||
| splits := strings.Split(tempUrl, "?") | |||
| if len(splits) > 1 { | |||
| redirectArguments := strings.Split(splits[1], "=") | |||
| if len(redirectArguments) > 0 && redirectArguments[0] == "redirect_to" { | |||
| ctx.SetCookie("redirect_to", setting.AppSubURL+strings.Replace(redirectArguments[1], "%2f", "/", -1), 0, setting.AppSubURL) | |||
| } | |||
| } | |||
| } | |||
| func basicAuth(ctx *Context) bool { | |||
| var siteAuth = base64.StdEncoding.EncodeToString([]byte(setting.CBAuthUser + ":" + setting.CBAuthPassword)) | |||
| auth := ctx.Req.Header.Get("Authorization") | |||
| @@ -2,6 +2,7 @@ package modelarts | |||
| import ( | |||
| "encoding/json" | |||
| "errors" | |||
| "fmt" | |||
| "path" | |||
| "strconv" | |||
| @@ -9,14 +10,15 @@ import ( | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/context" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/notification" | |||
| "code.gitea.io/gitea/modules/setting" | |||
| "code.gitea.io/gitea/modules/storage" | |||
| ) | |||
| const ( | |||
| //notebook | |||
| storageTypeOBS = "obs" | |||
| autoStopDuration = 4 * 60 * 60 | |||
| storageTypeOBS = "obs" | |||
| autoStopDuration = 4 * 60 * 60 | |||
| autoStopDurationMs = 4 * 60 * 60 * 1000 | |||
| DataSetMountPath = "/home/ma-user/work" | |||
| @@ -63,6 +65,7 @@ const ( | |||
| var ( | |||
| poolInfos *models.PoolInfos | |||
| FlavorInfos *models.FlavorInfos | |||
| ImageInfos *models.ImageInfosModelArts | |||
| ) | |||
| type GenerateTrainJobReq struct { | |||
| @@ -259,35 +262,42 @@ func GenerateTask(ctx *context.Context, jobName, uuid, description, flavor strin | |||
| if err != nil { | |||
| return err | |||
| } | |||
| notification.NotifyOtherTask(ctx.User, ctx.Repo.Repository, jobResult.ID, jobName, models.ActionCreateDebugNPUTask) | |||
| return nil | |||
| } | |||
| func GenerateNotebook2(ctx *context.Context, jobName, uuid, description, flavor string) error { | |||
| func GenerateNotebook2(ctx *context.Context, jobName, uuid, description, flavor, imageId string) error { | |||
| if poolInfos == nil { | |||
| json.Unmarshal([]byte(setting.PoolInfos), &poolInfos) | |||
| } | |||
| imageName, err := GetNotebookImageName(imageId) | |||
| if err != nil { | |||
| log.Error("GetNotebookImageName failed: %v", err.Error()) | |||
| return err | |||
| } | |||
| jobResult, err := createNotebook2(models.CreateNotebook2Params{ | |||
| JobName: jobName, | |||
| Description: description, | |||
| Flavor: flavor, | |||
| Duration: autoStopDurationMs, | |||
| ImageID: "59a6e9f5-93c0-44dd-85b0-82f390c5d53a", | |||
| ImageID: imageId, | |||
| PoolID: poolInfos.PoolInfo[0].PoolId, | |||
| Feature: models.NotebookFeature, | |||
| Volume: models.VolumeReq{ | |||
| Capacity: 100, | |||
| Category: models.EVSCategory, | |||
| Ownership: models.ManagedOwnership, | |||
| Volume: models.VolumeReq{ | |||
| Capacity: setting.Capacity, | |||
| Category: models.EVSCategory, | |||
| Ownership: models.ManagedOwnership, | |||
| }, | |||
| WorkspaceID: "0", | |||
| WorkspaceID: "0", | |||
| }) | |||
| if err != nil { | |||
| log.Error("createNotebook2 failed: %v", err.Error()) | |||
| return err | |||
| } | |||
| err = models.CreateCloudbrain(&models.Cloudbrain{ | |||
| Status: string(models.JobWaiting), | |||
| Status: jobResult.Status, | |||
| UserID: ctx.User.ID, | |||
| RepoID: ctx.Repo.Repository.ID, | |||
| JobID: jobResult.ID, | |||
| @@ -296,6 +306,7 @@ func GenerateNotebook2(ctx *context.Context, jobName, uuid, description, flavor | |||
| Type: models.TypeCloudBrainTwo, | |||
| Uuid: uuid, | |||
| ComputeResource: models.NPUResource, | |||
| Image: imageName, | |||
| }) | |||
| if err != nil { | |||
| @@ -335,12 +346,12 @@ func GenerateTrainJob(ctx *context.Context, req *GenerateTrainJobReq) (err error | |||
| log.Error("GetAttachmentByUUID(%s) failed:%v", strconv.FormatInt(jobResult.JobID, 10), err.Error()) | |||
| return err | |||
| } | |||
| jobId := strconv.FormatInt(jobResult.JobID, 10) | |||
| err = models.CreateCloudbrain(&models.Cloudbrain{ | |||
| Status: TransTrainJobStatus(jobResult.Status), | |||
| UserID: ctx.User.ID, | |||
| RepoID: ctx.Repo.Repository.ID, | |||
| JobID: strconv.FormatInt(jobResult.JobID, 10), | |||
| JobID: jobId, | |||
| JobName: req.JobName, | |||
| JobType: string(models.JobTypeTrain), | |||
| Type: models.TypeCloudBrainTwo, | |||
| @@ -371,7 +382,7 @@ func GenerateTrainJob(ctx *context.Context, req *GenerateTrainJobReq) (err error | |||
| log.Error("CreateCloudbrain(%s) failed:%v", req.JobName, err.Error()) | |||
| return err | |||
| } | |||
| notification.NotifyOtherTask(ctx.User, ctx.Repo.Repository, jobId, req.JobName, models.ActionCreateTrainTask) | |||
| return nil | |||
| } | |||
| @@ -555,12 +566,12 @@ func GenerateInferenceJob(ctx *context.Context, req *GenerateInferenceJobReq) (e | |||
| log.Error("GetAttachmentByUUID(%s) failed:%v", strconv.FormatInt(jobResult.JobID, 10), err.Error()) | |||
| return err | |||
| } | |||
| jobID := strconv.FormatInt(jobResult.JobID, 10) | |||
| err = models.CreateCloudbrain(&models.Cloudbrain{ | |||
| Status: TransTrainJobStatus(jobResult.Status), | |||
| UserID: ctx.User.ID, | |||
| RepoID: ctx.Repo.Repository.ID, | |||
| JobID: strconv.FormatInt(jobResult.JobID, 10), | |||
| JobID: jobID, | |||
| JobName: req.JobName, | |||
| JobType: string(models.JobTypeInference), | |||
| Type: models.TypeCloudBrainTwo, | |||
| @@ -595,6 +606,29 @@ func GenerateInferenceJob(ctx *context.Context, req *GenerateInferenceJobReq) (e | |||
| log.Error("CreateCloudbrain(%s) failed:%v", req.JobName, err.Error()) | |||
| return err | |||
| } | |||
| notification.NotifyOtherTask(ctx.User, ctx.Repo.Repository, jobID, req.JobName, models.ActionCreateInferenceTask) | |||
| return nil | |||
| } | |||
| func GetNotebookImageName(imageId string) (string, error) { | |||
| var validImage = false | |||
| var imageName = "" | |||
| if ImageInfos == nil { | |||
| json.Unmarshal([]byte(setting.ImageInfos), &ImageInfos) | |||
| } | |||
| for _, imageInfo := range ImageInfos.ImageInfo { | |||
| if imageInfo.Id == imageId { | |||
| validImage = true | |||
| imageName = imageInfo.Value | |||
| } | |||
| } | |||
| if !validImage { | |||
| log.Error("the image id(%s) is invalid", imageId) | |||
| return imageName, errors.New("the image id is invalid") | |||
| } | |||
| return imageName, nil | |||
| } | |||
| @@ -30,9 +30,11 @@ const ( | |||
| errorCodeExceedLimit = "ModelArts.0118" | |||
| //notebook 2.0 | |||
| urlNotebook2 = "/notebooks" | |||
| urlNotebook2 = "/notebooks" | |||
| //error code | |||
| modelartsIllegalToken = "ModelArts.6401" | |||
| NotebookNotFound = "ModelArts.6404" | |||
| ) | |||
| func getRestyClient() *resty.Client { | |||
| @@ -330,3 +330,18 @@ func (a *actionNotifier) NotifySyncDeleteRef(doer *models.User, repo *models.Rep | |||
| log.Error("notifyWatchers: %v", err) | |||
| } | |||
| } | |||
| func (a *actionNotifier) NotifyOtherTask(doer *models.User, repo *models.Repository, id string, name string, optype models.ActionType) { | |||
| if err := models.NotifyWatchers(&models.Action{ | |||
| ActUserID: repo.OwnerID, | |||
| ActUser: doer, | |||
| OpType: optype, | |||
| RepoID: repo.ID, | |||
| Repo: repo, | |||
| IsPrivate: repo.IsPrivate, | |||
| RefName: name, | |||
| Content: id, | |||
| }); err != nil { | |||
| log.Error("notifyWatchers: %v", err) | |||
| } | |||
| } | |||
| @@ -54,4 +54,6 @@ type Notifier interface { | |||
| NotifySyncPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *repository.PushCommits) | |||
| NotifySyncCreateRef(doer *models.User, repo *models.Repository, refType, refFullName string) | |||
| NotifySyncDeleteRef(doer *models.User, repo *models.Repository, refType, refFullName string) | |||
| NotifyOtherTask(doer *models.User, repo *models.Repository, id string, name string, optype models.ActionType) | |||
| } | |||
| @@ -154,3 +154,7 @@ func (*NullNotifier) NotifySyncCreateRef(doer *models.User, repo *models.Reposit | |||
| // NotifySyncDeleteRef places a place holder function | |||
| func (*NullNotifier) NotifySyncDeleteRef(doer *models.User, repo *models.Repository, refType, refFullName string) { | |||
| } | |||
| func (*NullNotifier) NotifyOtherTask(doer *models.User, repo *models.Repository, id string, name string, optype models.ActionType) { | |||
| } | |||
| @@ -37,6 +37,13 @@ func NewContext() { | |||
| RegisterNotifier(action.NewNotifier()) | |||
| } | |||
| // NotifyUploadAttachment notifies attachment upload message to notifiers | |||
| func NotifyOtherTask(doer *models.User, repo *models.Repository, id string, name string, optype models.ActionType) { | |||
| for _, notifier := range notifiers { | |||
| notifier.NotifyOtherTask(doer, repo, id, name, optype) | |||
| } | |||
| } | |||
| // NotifyCreateIssueComment notifies issue comment related message to notifiers | |||
| func NotifyCreateIssueComment(doer *models.User, repo *models.Repository, | |||
| issue *models.Issue, comment *models.Comment) { | |||
| @@ -513,6 +513,8 @@ var ( | |||
| PoolInfos string | |||
| Flavor string | |||
| DebugHost string | |||
| ImageInfos string | |||
| Capacity int | |||
| //train-job | |||
| ResourcePools string | |||
| Engines string | |||
| @@ -1326,7 +1328,8 @@ func NewContext() { | |||
| ProfileID = sec.Key("PROFILE_ID").MustString("") | |||
| PoolInfos = sec.Key("POOL_INFOS").MustString("") | |||
| Flavor = sec.Key("FLAVOR").MustString("") | |||
| DebugHost = sec.Key("DEBUG_SERVER_HOST").MustString("http://192.168.202.73") | |||
| ImageInfos = sec.Key("IMAGE_INFOS").MustString("") | |||
| Capacity = sec.Key("IMAGE_INFOS").MustInt(100) | |||
| ResourcePools = sec.Key("Resource_Pools").MustString("") | |||
| Engines = sec.Key("Engines").MustString("") | |||
| EngineVersions = sec.Key("Engine_Versions").MustString("") | |||
| @@ -16,9 +16,10 @@ type Attachment struct { | |||
| Size int64 `json:"size"` | |||
| DownloadCount int64 `json:"download_count"` | |||
| // swagger:strfmt date-time | |||
| Created time.Time `json:"created_at"` | |||
| UUID string `json:"uuid"` | |||
| DownloadURL string `json:"browser_download_url"` | |||
| Created time.Time `json:"created_at"` | |||
| UUID string `json:"uuid"` | |||
| DownloadURL string `json:"browser_download_url"` | |||
| S3DownloadURL string | |||
| } | |||
| // EditAttachmentOptions options for editing attachments | |||
| @@ -2063,6 +2063,9 @@ people = People | |||
| teams = Teams | |||
| lower_members = members | |||
| lower_repositories = repositories | |||
| lower_member=member | |||
| lower_repository = repository | |||
| create_new_team = New Team | |||
| create_team = Create Team | |||
| org_desc = Description | |||
| @@ -2082,6 +2085,9 @@ custom_select_courses = Customize selected courses | |||
| recommend_remain_pro = Remain | |||
| save_fail_tips = The upper limit is exceeded | |||
| select_again = Select more than 9, please select again! | |||
| custom_select_projects = Customize selected projects | |||
| customize = Customize | |||
| selected_project=Selected Projects | |||
| form.name_reserved = The organization name '%s' is reserved. | |||
| form.name_pattern_not_allowed = The pattern '%s' is not allowed in an organization name. | |||
| @@ -2687,6 +2693,13 @@ mirror_sync_create = synced new reference <a href="%s/src/%s">%[2]s</a> to <a hr | |||
| mirror_sync_delete = synced and deleted reference <code>%[2]s</code> at <a href="%[1]s">%[3]s</a> from mirror | |||
| approve_pull_request = `approved <a href="%s/pulls/%s">%s#%[2]s</a>` | |||
| reject_pull_request = `suggested changes for <a href="%s/pulls/%s">%s#%[2]s</a>` | |||
| upload_dataset=`upload dataset <a href="%s/datasets?type=%s">%s</a>` | |||
| task_gpudebugjob=`created CPU/GPU type debugging task<a href="%s/cloudbrain/%s">%s</a>` | |||
| task_npudebugjob=`created NPU type debugging task <a href="%s/modelarts/notebook/%s">%s</a>` | |||
| task_trainjob=`created training task<a href="%s/modelarts/train-job/%s">%s</a>` | |||
| task_inferencejob=`created reasoning task <a href="%s/modelarts/inference-job/%s">%s</a>` | |||
| task_benchmark=`created profiling task <a href="%s/cloudbrain/benchmark/%s">%s</a>` | |||
| task_createmodel=`created new model <a href="%s/modelmanage/show_model_info?name=%s">%s</a>` | |||
| [tool] | |||
| ago = %s ago | |||
| @@ -2761,6 +2774,7 @@ head.dataset = Datasets | |||
| foot.council = Council | |||
| foot.technical_committee = Technical Committee | |||
| foot.join = Join OpenI | |||
| foot.agreement=Use agreement | |||
| foot.news = News | |||
| foot.community_news = Community News | |||
| foot.member_news = Member news | |||
| @@ -2072,6 +2072,8 @@ people=组织成员 | |||
| teams=组织团队 | |||
| lower_members=名成员 | |||
| lower_repositories=个项目 | |||
| lower_member=名成员 | |||
| lower_repository=个项目 | |||
| create_new_team=新建团队 | |||
| create_team=创建团队 | |||
| org_desc=组织描述 | |||
| @@ -2091,6 +2093,9 @@ custom_select_courses = 自定义精选课程 | |||
| recommend_remain_pro = 还能推荐 | |||
| save_fail_tips = 最多可选9个,保存失败 | |||
| select_again = 选择超过9个,请重新选择! | |||
| custom_select_projects = 自定义精选项目 | |||
| customize = 自定义 | |||
| selected_project=精选项目 | |||
| form.name_reserved=组织名称 '%s' 是被保留的。 | |||
| form.name_pattern_not_allowed=组织名称中不允许使用 "%s"。 | |||
| @@ -2697,6 +2702,13 @@ mirror_sync_create=从镜像同步了新的引用 <a href="%s/src/%s">%[2]s</a> | |||
| mirror_sync_delete=从镜像同步并从 <a href="%[1]s">%[3]s</a> 删除了引用 <code>%[2]s</code> | |||
| approve_pull_request=`同意了 <a href="%s/pulls/%s">%s#%[2]s</a>` | |||
| reject_pull_request=`建议变更 <a href="%s/pulls/%s">%s#%[2]s</a>` | |||
| upload_dataset=`上传了数据集文件 <a href="%s/datasets?type=%s">%s</a>` | |||
| task_gpudebugjob=`创建了CPU/GPU类型调试任务 <a href="%s/cloudbrain/%s">%s</a>` | |||
| task_npudebugjob=`创建了NPU类型调试任务 <a href="%s/modelarts/notebook/%s">%s</a>` | |||
| task_trainjob=`创建了训练任务 <a href="%s/modelarts/train-job/%s">%s</a>` | |||
| task_inferencejob=`创建了推理任务 <a href="%s/modelarts/inference-job/%s">%s</a>` | |||
| task_benchmark=`创建了评测任务 <a href="%s/cloudbrain/benchmark/%s">%s</a>` | |||
| task_createmodel=`导入了新模型 <a href="%s/modelmanage/show_model_info?name=%s">%s</a>` | |||
| [tool] | |||
| ago=%s前 | |||
| @@ -2771,6 +2783,7 @@ head.dataset=数据集 | |||
| foot.council=理事会 | |||
| foot.technical_committee=技术委员会 | |||
| foot.join=加入启智 | |||
| foot.agreement=使用协议 | |||
| foot.news=动态 | |||
| foot.community_news=社区动态 | |||
| foot.member_news=成员动态 | |||
| @@ -6,7 +6,6 @@ if(isEmpty(token)){ | |||
| token = meta.attr("content"); | |||
| } | |||
| } | |||
| var swiperNewMessage = new Swiper(".newslist", { | |||
| direction: "vertical", | |||
| slidesPerView: 10, | |||
| @@ -17,7 +16,7 @@ var swiperNewMessage = new Swiper(".newslist", { | |||
| }, | |||
| }); | |||
| var swiperRepo = new Swiper(".homepro-list", { | |||
| slidesPerView: 3, | |||
| slidesPerView: 1, | |||
| slidesPerColumn: 2, | |||
| slidesPerColumnFill:'row', | |||
| spaceBetween: 30, | |||
| @@ -29,6 +28,37 @@ var swiperRepo = new Swiper(".homepro-list", { | |||
| delay: 2500, | |||
| disableOnInteraction: false, | |||
| }, | |||
| breakpoints: { | |||
| 768: { | |||
| slidesPerView: 2, | |||
| }, | |||
| 1024: { | |||
| slidesPerView: 3, | |||
| }, | |||
| }, | |||
| }); | |||
| var swiperOrg = new Swiper(".homeorg-list", { | |||
| slidesPerView: 1, | |||
| slidesPerColumn: 4, | |||
| slidesPerColumnFill:'row', | |||
| spaceBetween: 15, | |||
| pagination: { | |||
| el: ".swiper-pagination", | |||
| clickable: true, | |||
| }, | |||
| autoplay: { | |||
| delay: 4500, | |||
| disableOnInteraction: false, | |||
| }, | |||
| breakpoints: { | |||
| 768: { | |||
| slidesPerView: 2, | |||
| }, | |||
| 1024: { | |||
| slidesPerView: 3, | |||
| }, | |||
| }, | |||
| }); | |||
| var output = document.getElementById("newmessage"); | |||
| @@ -95,12 +125,15 @@ socket.onmessage = function (e) { | |||
| else if(record.OpType == "2"){ | |||
| actionName = actionName.replace("{oldRepoName}",record.Content); | |||
| html += recordPrefix + actionName; | |||
| html += " <a href=\"" + getRepoLink(record) + "\" rel=\"nofollow\">" + getRepotext(record) + "</a>" | |||
| html += " <a href=\"" + getRepoLink(record) + "\" rel=\"nofollow\">" + getRepoLink(record) + "</a>" | |||
| } | |||
| else if(record.OpType == "24" || record.OpType == "25" || record.OpType == "26" || record.OpType == "27" || record.OpType == "28" || record.OpType == "29" || record.OpType == "30"){ | |||
| html += recordPrefix + actionName; | |||
| html += " <a href=\"" + getTaskLink(record) + "\" rel=\"nofollow\">" + record.RefName + "</a>" | |||
| } | |||
| else{ | |||
| continue; | |||
| } | |||
| if(record.Repo != null){ | |||
| var time = getTime(record.CreatedUnix,currentTime); | |||
| html += " " + time; | |||
| @@ -108,13 +141,32 @@ socket.onmessage = function (e) { | |||
| html += "</div>"; | |||
| html += "</div>"; | |||
| } | |||
| } | |||
| output.innerHTML = html; | |||
| swiperNewMessage.updateSlides(); | |||
| swiperNewMessage.updateProgress(); | |||
| }; | |||
| function getTaskLink(record){ | |||
| var re = getRepoLink(record); | |||
| if(record.OpType == 24){ | |||
| return re + "/datasets?type=" + record.Content; | |||
| }else if(record.OpType == 25){ | |||
| return re + "/cloudbrain/" + record.RefName; | |||
| }else if(record.OpType == 26){ | |||
| return re + "/modelarts/notebook/" + record.Content; | |||
| }else if(record.OpType == 27){ | |||
| return re + "/modelarts/train-job/" + record.Content; | |||
| }else if(record.OpType == 28){ | |||
| return re + "/modelarts/inference-job/" + record.Content; | |||
| }else if(record.OpType == 29){ | |||
| return re + "/cloudbrain/benchmark/" + record.RefName; | |||
| }else if(record.OpType == 30){ | |||
| return re + "/modelmanage/show_model_info?name=" + record.RefName; | |||
| } | |||
| return re; | |||
| } | |||
| function getMsg(record){ | |||
| var html =""; | |||
| html += "<div class=\"swiper-slide item\">"; | |||
| @@ -246,7 +298,14 @@ var actionNameZH={ | |||
| "15":"重新开启了合并请求", | |||
| "17":"从 {repoName} 删除分支 {deleteBranchName}", | |||
| "22":"建议变更", | |||
| "23":"评论了合并请求" | |||
| "23":"评论了合并请求", | |||
| "24":"上传了数据集文件", | |||
| "25":"创建了CPU/GPU类型调试任务", | |||
| "26":"创建了NPU类型调试任务", | |||
| "27":"创建了训练任务", | |||
| "28":"创建了推理任务", | |||
| "29":"创建了评测任务", | |||
| "30":"导入了新模型" | |||
| }; | |||
| var actionNameEN={ | |||
| @@ -264,7 +323,14 @@ var actionNameEN={ | |||
| "15":" reopened pull request", | |||
| "17":" deleted branch {deleteBranchName} from {repoName}", | |||
| "22":" proposed changes", | |||
| "23":" commented on pull request" | |||
| "23":" commented on pull request", | |||
| "24":" upload dataset ", | |||
| "25":" created CPU/GPU type debugging task ", | |||
| "26":" created NPU type debugging task ", | |||
| "27":" created training task", | |||
| "28":" created reasoning task", | |||
| "29":" created profiling task", | |||
| "30":" created new model" | |||
| }; | |||
| var repoAndOrgZH={ | |||
| @@ -392,7 +458,7 @@ function displayOrg(json){ | |||
| if (json != null && json.length > 0){ | |||
| for(var i = 0; i < json.length;i++){ | |||
| var record = json[i] | |||
| html += "<div class=\"column\">"; | |||
| html += "<div class=\"swiper-slide\">"; | |||
| html += " <a href=\"/" + record["Name"] + "\" class=\"ui fluid card\">"; | |||
| html += " <div class=\"content\">"; | |||
| html += " <div class=\"ui small header\">"; | |||
| @@ -408,4 +474,5 @@ function displayOrg(json){ | |||
| } | |||
| } | |||
| orgDiv.innerHTML = html; | |||
| swiperOrg.updateSlides(); | |||
| } | |||
| @@ -878,8 +878,9 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| }, reqAdmin()) | |||
| }, reqAnyRepoReader()) | |||
| m.Group("/cloudbrain", func() { | |||
| m.Get("/:jobid", repo.GetCloudbrainTask) | |||
| m.Get("/:jobid/log", repo.CloudbrainGetLog) | |||
| // m.Get("/:jobid", repo.GetCloudbrainTask) | |||
| m.Get("/:jobname", repo.GetCloudbrainTask) | |||
| m.Get("/:jobname/log", repo.CloudbrainGetLog) | |||
| }, reqRepoReader(models.UnitTypeCloudBrain)) | |||
| m.Group("/modelarts", func() { | |||
| m.Group("/notebook", func() { | |||
| @@ -6,11 +6,12 @@ | |||
| package repo | |||
| import ( | |||
| "code.gitea.io/gitea/modules/log" | |||
| "net/http" | |||
| "sort" | |||
| "time" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/cloudbrain" | |||
| "code.gitea.io/gitea/modules/context" | |||
| @@ -48,14 +49,12 @@ func GetCloudbrainTask(ctx *context.APIContext) { | |||
| err error | |||
| ) | |||
| jobID := ctx.Params(":jobid") | |||
| repoID := ctx.Repo.Repository.ID | |||
| job, err := models.GetRepoCloudBrainByJobID(repoID, jobID) | |||
| jobName := ctx.Params(":jobname") | |||
| job, err := models.GetCloudbrainByName(jobName) | |||
| if err != nil { | |||
| ctx.NotFound(err) | |||
| return | |||
| ctx.Data["error"] = err.Error() | |||
| } | |||
| jobResult, err := cloudbrain.GetJob(jobID) | |||
| jobResult, err := cloudbrain.GetJob(job.JobID) | |||
| if err != nil { | |||
| ctx.NotFound(err) | |||
| return | |||
| @@ -84,7 +83,7 @@ func GetCloudbrainTask(ctx *context.APIContext) { | |||
| } | |||
| ctx.JSON(http.StatusOK, map[string]interface{}{ | |||
| "JobID": result.Config.JobID, | |||
| "JobName": result.Config.JobName, | |||
| "JobStatus": result.JobStatus.State, | |||
| "SubState": result.JobStatus.SubState, | |||
| "CreatedTime": time.Unix(result.JobStatus.CreatedTime/1000, 0).Format("2006-01-02 15:04:05"), | |||
| @@ -94,8 +93,8 @@ func GetCloudbrainTask(ctx *context.APIContext) { | |||
| } | |||
| func CloudbrainGetLog(ctx *context.Context) { | |||
| jobID := ctx.Params(":jobid") | |||
| _, err := models.GetCloudbrainByJobID(jobID) | |||
| jobName := ctx.Params(":jobname") | |||
| job, err := models.GetCloudbrainByName(jobName) | |||
| if err != nil { | |||
| log.Error("GetCloudbrainByJobID failed: %v", err, ctx.Data["MsgID"]) | |||
| ctx.ServerError(err.Error(), err) | |||
| @@ -103,8 +102,8 @@ func CloudbrainGetLog(ctx *context.Context) { | |||
| } | |||
| var hits []models.Hits | |||
| result, err := cloudbrain.GetJobLog(jobID) | |||
| if err != nil{ | |||
| result, err := cloudbrain.GetJobLog(job.JobID) | |||
| if err != nil { | |||
| log.Error("GetJobLog failed: %v", err, ctx.Data["MsgID"]) | |||
| ctx.ServerError(err.Error(), err) | |||
| return | |||
| @@ -115,7 +114,7 @@ func CloudbrainGetLog(ctx *context.Context) { | |||
| if len(result.Hits.Hits) >= cloudbrain.LogPageSize { | |||
| for { | |||
| resultNext, err := cloudbrain.GetJobAllLog(result.ScrollID) | |||
| if err != nil{ | |||
| if err != nil { | |||
| log.Error("GetJobAllLog failed: %v", err, ctx.Data["MsgID"]) | |||
| } else { | |||
| for _, hit := range resultNext.Hits.Hits { | |||
| @@ -142,8 +141,8 @@ func CloudbrainGetLog(ctx *context.Context) { | |||
| } | |||
| ctx.JSON(http.StatusOK, map[string]interface{}{ | |||
| "JobID": jobID, | |||
| "Content": content, | |||
| "JobName": jobName, | |||
| "Content": content, | |||
| }) | |||
| return | |||
| @@ -77,6 +77,7 @@ func GetModelArtsNotebook2(ctx *context.APIContext) { | |||
| ctx.JSON(http.StatusOK, map[string]interface{}{ | |||
| "JobID": jobID, | |||
| "JobName": job.JobName, | |||
| "JobStatus": result.Status, | |||
| }) | |||
| @@ -297,7 +297,7 @@ func allProjectsPeroidHeader(ctx *context.Context) map[string]string { | |||
| } | |||
| func allProjectsPeroidValues(row int, rs *models.RepoStatistic, ctx *context.Context) map[string]string { | |||
| return map[string]string{getCellName("A", row): strconv.FormatInt(rs.RepoID, 10), getCellName("B", row): rs.Name, getCellName("C", row): rs.OwnerName, getCellName("D", row): getIsPrivateDisplay(rs.IsPrivate, ctx), getCellName("E", row): strconv.FormatFloat(rs.RadarTotal, 'f', 2, 64), | |||
| return map[string]string{getCellName("A", row): strconv.FormatInt(rs.RepoID, 10), getCellName("B", row): rs.DisplayName(), getCellName("C", row): rs.OwnerName, getCellName("D", row): getIsPrivateDisplay(rs.IsPrivate, ctx), getCellName("E", row): strconv.FormatFloat(rs.RadarTotal, 'f', 2, 64), | |||
| getCellName("F", row): strconv.FormatInt(rs.NumVisits, 10), getCellName("G", row): strconv.FormatInt(rs.NumDownloads, 10), getCellName("H", row): strconv.FormatInt(rs.NumPulls, 10), getCellName("I", row): strconv.FormatInt(rs.NumCommits, 10), | |||
| getCellName("J", row): strconv.FormatInt(rs.NumWatches, 10), getCellName("K", row): strconv.FormatInt(rs.NumStars, 10), getCellName("L", row): strconv.FormatInt(rs.NumForks, 10), getCellName("M", row): strconv.FormatInt(rs.NumIssues, 10), | |||
| getCellName("N", row): strconv.FormatInt(rs.NumClosedIssues, 10), getCellName("O", row): strconv.FormatInt(rs.NumContributor, 10), | |||
| @@ -317,7 +317,7 @@ func allProjectsOpenIHeader() map[string]string { | |||
| func allProjectsOpenIValues(row int, rs *models.RepoStatistic, ctx *context.Context) map[string]string { | |||
| return map[string]string{getCellName("A", row): strconv.FormatInt(rs.RepoID, 10), getCellName("B", row): rs.Name, getCellName("C", row): rs.OwnerName, getCellName("D", row): getIsPrivateDisplay(rs.IsPrivate, ctx), getCellName("E", row): strconv.FormatFloat(rs.RadarTotal, 'f', 2, 64), | |||
| return map[string]string{getCellName("A", row): strconv.FormatInt(rs.RepoID, 10), getCellName("B", row): rs.DisplayName(), getCellName("C", row): rs.OwnerName, getCellName("D", row): getIsPrivateDisplay(rs.IsPrivate, ctx), getCellName("E", row): strconv.FormatFloat(rs.RadarTotal, 'f', 2, 64), | |||
| getCellName("F", row): strconv.FormatFloat(rs.Impact, 'f', 2, 64), getCellName("G", row): strconv.FormatFloat(rs.Completeness, 'f', 2, 64), getCellName("H", row): strconv.FormatFloat(rs.Liveness, 'f', 2, 64), getCellName("I", row): strconv.FormatFloat(rs.ProjectHealth, 'f', 2, 64), getCellName("J", row): strconv.FormatFloat(rs.TeamHealth, 'f', 2, 64), getCellName("K", row): strconv.FormatFloat(rs.Growth, 'f', 2, 64), | |||
| getCellName("L", row): strconv.FormatInt(rs.NumWatches, 10), getCellName("M", row): strconv.FormatInt(rs.NumStars, 10), getCellName("N", row): strconv.FormatInt(rs.NumForks, 10), getCellName("O", row): strconv.FormatInt(rs.NumDownloads, 10), | |||
| @@ -466,10 +466,10 @@ func generateCountSql(beginTime time.Time, endTime time.Time, latestDate string, | |||
| countSql := "SELECT count(*) FROM " + | |||
| "(SELECT repo_id FROM repo_statistic where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) + | |||
| " and created_unix<" + strconv.FormatInt(endTime.Unix(), 10) + " group by repo_id) A," + | |||
| "(SELECT repo_id,name,is_private,radar_total from public.repo_statistic where date='" + latestDate + "') B" + | |||
| "(SELECT repo_id,name,alias,is_private,radar_total from public.repo_statistic where date='" + latestDate + "') B" + | |||
| " where A.repo_id=B.repo_id" | |||
| if q != "" { | |||
| countSql = countSql + " and LOWER(B.name) like '%" + strings.ToLower(q) + "%'" | |||
| countSql = countSql + " and LOWER(B.alias) like '%" + strings.ToLower(q) + "%'" | |||
| } | |||
| return countSql | |||
| } | |||
| @@ -482,22 +482,22 @@ func generateOpenICountSql(latestDate string) string { | |||
| } | |||
| func generateTypeAllSql(beginTime time.Time, endTime time.Time, latestDate string, q string, orderBy string, page int, pageSize int) string { | |||
| sql := "SELECT A.repo_id,name,owner_name,is_private,radar_total,num_watches,num_visits,num_downloads,num_pulls,num_commits,num_stars,num_forks,num_issues,num_closed_issues,num_contributor FROM " + | |||
| sql := "SELECT A.repo_id,name,alias,owner_name,is_private,radar_total,num_watches,num_visits,num_downloads,num_pulls,num_commits,num_stars,num_forks,num_issues,num_closed_issues,num_contributor FROM " + | |||
| "(SELECT repo_id,sum(num_visits) as num_visits " + | |||
| " FROM repo_statistic where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) + | |||
| " and created_unix<" + strconv.FormatInt(endTime.Unix(), 10) + " group by repo_id) A," + | |||
| "(SELECT repo_id,name,owner_name,is_private,radar_total,num_watches,num_downloads,num_pulls,num_commits,num_stars,num_forks,num_issues,num_closed_issues,num_contributor from public.repo_statistic where date='" + latestDate + "') B" + | |||
| "(SELECT repo_id,name,alias,owner_name,is_private,radar_total,num_watches,num_downloads,num_pulls,num_commits,num_stars,num_forks,num_issues,num_closed_issues,num_contributor from public.repo_statistic where date='" + latestDate + "') B" + | |||
| " where A.repo_id=B.repo_id" | |||
| if q != "" { | |||
| sql = sql + " and LOWER(name) like '%" + strings.ToLower(q) + "%'" | |||
| sql = sql + " and LOWER(alias) like '%" + strings.ToLower(q) + "%'" | |||
| } | |||
| sql = sql + " order by " + orderBy + " desc,repo_id" + " limit " + strconv.Itoa(pageSize) + " offset " + strconv.Itoa((page-1)*pageSize) | |||
| return sql | |||
| } | |||
| func generateTypeAllOpenISql(latestDate string, page int, pageSize int) string { | |||
| sql := "SELECT id, repo_id, date, num_watches, num_stars, num_forks, num_downloads, num_comments, num_visits, num_closed_issues, num_versions, num_dev_months, repo_size, dataset_size, num_models, num_wiki_views, num_commits, num_issues, num_pulls, issue_fixed_rate, num_contributor, num_key_contributor, num_contributors_growth, num_commits_growth, num_commit_lines_growth, num_issues_growth, num_comments_growth, impact, completeness, liveness, project_health, team_health, growth, radar_total, name, is_private, owner_name FROM " + | |||
| sql := "SELECT id, repo_id, date, num_watches, num_stars, num_forks, num_downloads, num_comments, num_visits, num_closed_issues, num_versions, num_dev_months, repo_size, dataset_size, num_models, num_wiki_views, num_commits, num_issues, num_pulls, issue_fixed_rate, num_contributor, num_key_contributor, num_contributors_growth, num_commits_growth, num_commit_lines_growth, num_issues_growth, num_comments_growth, impact, completeness, liveness, project_health, team_health, growth, radar_total, name,alias, is_private, owner_name FROM " + | |||
| " public.repo_statistic where date='" + latestDate + "'" | |||
| sql = sql + " order by radar_total desc,repo_id" + " limit " + strconv.Itoa(pageSize) + " offset " + strconv.Itoa((page-1)*pageSize) | |||
| @@ -506,14 +506,14 @@ func generateTypeAllOpenISql(latestDate string, page int, pageSize int) string { | |||
| func generatePageSql(beginTime time.Time, endTime time.Time, latestDate string, q string, orderBy string, page int, pageSize int) string { | |||
| sql := "SELECT A.repo_id,name,owner_name,is_private,radar_total,num_watches,num_visits,num_downloads,num_pulls,num_commits,num_stars,num_forks,num_issues,num_closed_issues,num_contributor FROM " + | |||
| sql := "SELECT A.repo_id,name,alias,owner_name,is_private,radar_total,num_watches,num_visits,num_downloads,num_pulls,num_commits,num_stars,num_forks,num_issues,num_closed_issues,num_contributor FROM " + | |||
| "(SELECT repo_id,sum(num_watches_added) as num_watches,sum(num_visits) as num_visits, sum(num_downloads_added) as num_downloads,sum(num_pulls_added) as num_pulls,sum(num_commits_added) as num_commits,sum(num_stars_added) as num_stars,sum(num_forks_added) num_forks,sum(num_issues_added) as num_issues,sum(num_closed_issues_added) as num_closed_issues,sum(num_contributor_added) as num_contributor " + | |||
| " FROM repo_statistic where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) + | |||
| " and created_unix<" + strconv.FormatInt(endTime.Unix(), 10) + " group by repo_id) A," + | |||
| "(SELECT repo_id,name,owner_name,is_private,radar_total from public.repo_statistic where date='" + latestDate + "') B" + | |||
| "(SELECT repo_id,name,alias,owner_name,is_private,radar_total from public.repo_statistic where date='" + latestDate + "') B" + | |||
| " where A.repo_id=B.repo_id" | |||
| if q != "" { | |||
| sql = sql + " and LOWER(B.name) like '%" + strings.ToLower(q) + "%'" | |||
| sql = sql + " and LOWER(B.alias) like '%" + strings.ToLower(q) + "%'" | |||
| } | |||
| sql = sql + " order by " + orderBy + " desc,A.repo_id" + " limit " + strconv.Itoa(pageSize) + " offset " + strconv.Itoa((page-1)*pageSize) | |||
| return sql | |||
| @@ -38,6 +38,7 @@ const ( | |||
| tplExploreCode base.TplName = "explore/code" | |||
| tplExploreImages base.TplName = "explore/images" | |||
| tplExploreExploreDataAnalysis base.TplName = "explore/data_analysis" | |||
| tplHomeTerm base.TplName = "terms" | |||
| ) | |||
| // Home render home page | |||
| @@ -596,3 +597,7 @@ func RecommendRepoFromPromote(ctx *context.Context) { | |||
| ctx.JSON(200, result) | |||
| } | |||
| } | |||
| func HomeTerm(ctx *context.Context) { | |||
| ctx.HTML(200, tplHomeTerm) | |||
| } | |||
| @@ -12,6 +12,7 @@ import ( | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/context" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/notification" | |||
| "code.gitea.io/gitea/modules/setting" | |||
| "code.gitea.io/gitea/modules/storage" | |||
| uuid "github.com/satori/go.uuid" | |||
| @@ -113,7 +114,7 @@ func saveModelByParameters(jobId string, versionName string, name string, versio | |||
| models.UpdateRepositoryUnits(ctx.Repo.Repository, units, deleteUnitTypes) | |||
| log.Info("save model end.") | |||
| notification.NotifyOtherTask(ctx.User, ctx.Repo.Repository, id, name, models.ActionCreateNewModelTask) | |||
| return nil | |||
| } | |||
| @@ -20,11 +20,11 @@ import ( | |||
| "code.gitea.io/gitea/modules/labelmsg" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/minio_ext" | |||
| "code.gitea.io/gitea/modules/notification" | |||
| "code.gitea.io/gitea/modules/setting" | |||
| "code.gitea.io/gitea/modules/storage" | |||
| "code.gitea.io/gitea/modules/upload" | |||
| "code.gitea.io/gitea/modules/worker" | |||
| gouuid "github.com/satori/go.uuid" | |||
| ) | |||
| @@ -845,6 +845,9 @@ func CompleteMultipart(ctx *context.Context) { | |||
| ctx.Error(500, fmt.Sprintf("InsertAttachment: %v", err)) | |||
| return | |||
| } | |||
| dataset, _ := models.GetDatasetByID(attachment.DatasetID) | |||
| repository, _ := models.GetRepositoryByID(dataset.RepoID) | |||
| notification.NotifyOtherTask(ctx.User, repository, fmt.Sprint(attachment.Type), attachment.Name, models.ActionUploadAttachment) | |||
| if attachment.DatasetID != 0 { | |||
| if isCanDecompress(attachment.Name) { | |||
| @@ -865,7 +868,6 @@ func CompleteMultipart(ctx *context.Context) { | |||
| labelmsg.SendDecompressAttachToLabelOBS(string(attachjson)) | |||
| } | |||
| } else { | |||
| dataset, _ := models.GetDatasetByID(attachment.DatasetID) | |||
| var labelMap map[string]string | |||
| labelMap = make(map[string]string) | |||
| labelMap["UUID"] = uuid | |||
| @@ -350,18 +350,15 @@ func CloudBrainShow(ctx *context.Context) { | |||
| func cloudBrainShow(ctx *context.Context, tpName base.TplName) { | |||
| ctx.Data["PageIsCloudBrain"] = true | |||
| var jobID = ctx.Params(":jobid") | |||
| task, err := models.GetCloudbrainByJobID(jobID) | |||
| var jobName = ctx.Params(":jobname") | |||
| task, err := models.GetCloudbrainByName(jobName) | |||
| if err != nil { | |||
| ctx.Data["error"] = err.Error() | |||
| } | |||
| result, err := cloudbrain.GetJob(jobID) | |||
| result, err := cloudbrain.GetJob(task.JobID) | |||
| if err != nil { | |||
| ctx.Data["error"] = err.Error() | |||
| } | |||
| if result != nil { | |||
| jobRes, _ := models.ConvertToJobResultPayload(result.Payload) | |||
| jobRes.Resource.Memory = strings.ReplaceAll(jobRes.Resource.Memory, "Mi", "MB") | |||
| @@ -369,6 +366,7 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName) { | |||
| ctx.Data["resource_spec"] = spec | |||
| taskRoles := jobRes.TaskRoles | |||
| if jobRes.JobStatus.State != string(models.JobFailed) { | |||
| taskRes, _ := models.ConvertToTaskPod(taskRoles[cloudbrain.SubTaskName].(map[string]interface{})) | |||
| ctx.Data["taskRes"] = taskRes | |||
| task.Status = taskRes.TaskStatuses[0].State | |||
| @@ -422,7 +420,7 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName) { | |||
| ctx.Data["duration"] = util.AddZero(duration/3600000) + ":" + util.AddZero(duration%3600000/60000) + ":" + util.AddZero(duration%60000/1000) | |||
| ctx.Data["task"] = task | |||
| ctx.Data["jobID"] = jobID | |||
| // ctx.Data["jobID"] = task.JobID | |||
| ctx.Data["jobName"] = task.JobName | |||
| version_list_task := make([]*models.Cloudbrain, 0) | |||
| version_list_task = append(version_list_task, task) | |||
| @@ -582,6 +580,7 @@ func logErrorAndUpdateJobStatus(err error, taskInfo *models.Cloudbrain) { | |||
| } | |||
| func CloudBrainDel(ctx *context.Context) { | |||
| var listType = ctx.Query("debugListType") | |||
| if err := deleteCloudbrainJob(ctx); err != nil { | |||
| log.Error("deleteCloudbrainJob failed: %v", err, ctx.Data["msgID"]) | |||
| ctx.ServerError(err.Error(), err) | |||
| @@ -1104,6 +1103,9 @@ func GetChildTypes(ctx *context.Context) { | |||
| } | |||
| func CloudBrainBenchmarkNew(ctx *context.Context) { | |||
| ctx.Data["description"] = "" | |||
| ctx.Data["benchmarkTypeID"] = -1 | |||
| ctx.Data["benchmark_child_types_id_hidden"] = -1 | |||
| err := cloudBrainNewDataPrepare(ctx) | |||
| if err != nil { | |||
| ctx.ServerError("get new cloudbrain info failed", err) | |||
| @@ -1206,6 +1208,9 @@ func CloudBrainBenchmarkCreate(ctx *context.Context, form auth.CreateCloudBrainF | |||
| benchmarkTypeID := form.BenchmarkTypeID | |||
| benchmarkChildTypeID := form.BenchmarkChildTypeID | |||
| ctx.Data["description"] = form.Description | |||
| ctx.Data["benchmarkTypeID"] = benchmarkTypeID | |||
| ctx.Data["benchmark_child_types_id_hidden"] = benchmarkChildTypeID | |||
| if !jobNamePattern.MatchString(jobName) { | |||
| cloudBrainNewDataPrepare(ctx) | |||
| ctx.RenderWithErr(ctx.Tr("repo.cloudbrain_jobname_err"), tplCloudBrainBenchmarkNew, &form) | |||
| @@ -28,7 +28,8 @@ func ServeData(ctx *context.Context, name string, reader io.Reader) error { | |||
| buf = buf[:n] | |||
| } | |||
| ctx.Resp.Header().Set("Cache-Control", "public,max-age=86400") | |||
| //ctx.Resp.Header().Set("Cache-Control", "public,max-age=86400") | |||
| ctx.Resp.Header().Set("Cache-Control", "max-age=0") | |||
| name = path.Base(name) | |||
| // Google Chrome dislike commas in filenames, so let's change it to a space | |||
| @@ -103,8 +103,13 @@ func MustEnableModelArts(ctx *context.Context) { | |||
| } | |||
| func NotebookNew(ctx *context.Context) { | |||
| ctx.Data["PageIsCloudBrain"] = true | |||
| notebookNewDataPrepare(ctx) | |||
| ctx.HTML(200, tplModelArtsNotebookNew) | |||
| } | |||
| func notebookNewDataPrepare(ctx *context.Context) error { | |||
| ctx.Data["PageIsCloudBrain"] = true | |||
| t := time.Now() | |||
| var jobName = jobNamePrefixValid(cutString(ctx.User.Name, 5)) + t.Format("2006010215") + strconv.Itoa(int(t.Unix()))[5:] | |||
| ctx.Data["job_name"] = jobName | |||
| @@ -112,26 +117,14 @@ func NotebookNew(ctx *context.Context) { | |||
| attachs, err := models.GetModelArtsUserAttachments(ctx.User.ID) | |||
| if err != nil { | |||
| ctx.ServerError("GetAllUserAttachments failed:", err) | |||
| return | |||
| return err | |||
| } | |||
| ctx.Data["attachments"] = attachs | |||
| ctx.Data["dataset_path"] = modelarts.DataSetMountPath | |||
| ctx.Data["env"] = modelarts.NotebookEnv | |||
| ctx.Data["notebook_type"] = modelarts.NotebookType | |||
| if modelarts.FlavorInfos == nil { | |||
| json.Unmarshal([]byte(setting.FlavorInfos), &modelarts.FlavorInfos) | |||
| } | |||
| ctx.Data["flavors"] = modelarts.FlavorInfos.FlavorInfo | |||
| ctx.HTML(200, tplModelArtsNotebookNew) | |||
| } | |||
| func notebookNewDataPrepare(ctx *context.Context) error { | |||
| ctx.Data["PageIsCloudBrain"] = true | |||
| t := time.Now() | |||
| var jobName = jobNamePrefixValid(cutString(ctx.User.Name, 5)) + t.Format("2006010215") + strconv.Itoa(int(t.Unix()))[5:] | |||
| ctx.Data["job_name"] = jobName | |||
| if modelarts.ImageInfos == nil { | |||
| json.Unmarshal([]byte(setting.ImageInfos), &modelarts.ImageInfos) | |||
| } | |||
| ctx.Data["images"] = modelarts.ImageInfos.ImageInfo | |||
| if modelarts.FlavorInfos == nil { | |||
| json.Unmarshal([]byte(setting.FlavorInfos), &modelarts.FlavorInfos) | |||
| @@ -191,8 +184,7 @@ func Notebook2Create(ctx *context.Context, form auth.CreateModelArtsNotebookForm | |||
| uuid := form.Attachment | |||
| description := form.Description | |||
| flavor := form.Flavor | |||
| flavor = "modelarts.bm.910.arm.public.1" | |||
| imageId := form.ImageId | |||
| count, err := models.GetCloudbrainNotebookCountByUserID(ctx.User.ID) | |||
| if err != nil { | |||
| @@ -223,7 +215,7 @@ func Notebook2Create(ctx *context.Context, form auth.CreateModelArtsNotebookForm | |||
| } | |||
| } | |||
| err = modelarts.GenerateNotebook2(ctx, jobName, uuid, description, flavor) | |||
| err = modelarts.GenerateNotebook2(ctx, jobName, uuid, description, flavor, imageId) | |||
| if err != nil { | |||
| log.Error("GenerateNotebook2 failed, %v", err, ctx.Data["MsgID"]) | |||
| notebookNewDataPrepare(ctx) | |||
| @@ -262,12 +254,20 @@ func NotebookShow(ctx *context.Context) { | |||
| result.CreateTime = time.Unix(int64(result.CreateAt/1000), 0).Format("2006-01-02 15:04:05") | |||
| result.LatestUpdateTime = time.Unix(int64(result.UpdateAt/1000), 0).Format("2006-01-02 15:04:05") | |||
| //result.QueuingInfo.BeginTime = time.Unix(int64(result.QueuingInfo.BeginTimestamp/1000), 0).Format("2006-01-02 15:04:05") | |||
| //result.QueuingInfo.EndTime = time.Unix(int64(result.QueuingInfo.EndTimestamp/1000), 0).Format("2006-01-02 15:04:05") | |||
| } | |||
| var datasetDownloadLink string | |||
| if task.Uuid != "" && task.UserID == ctx.User.ID { | |||
| attachment, err := models.GetAttachmentByUUID(task.Uuid) | |||
| if err == nil { | |||
| datasetDownloadLink = attachment.S3DownloadURL() | |||
| } | |||
| } | |||
| ctx.Data["datasetDownloadLink"] = datasetDownloadLink | |||
| ctx.Data["task"] = task | |||
| ctx.Data["jobID"] = jobID | |||
| ctx.Data["jobName"] = task.JobName | |||
| ctx.Data["result"] = result | |||
| ctx.HTML(200, tplModelArtsNotebookShow) | |||
| } | |||
| @@ -387,7 +387,7 @@ func NotebookManage(ctx *context.Context) { | |||
| log.Error("ManageNotebook2(%s) failed:%v", task.JobName, err.Error(), ctx.Data["MsgID"]) | |||
| resultCode = "-1" | |||
| errorMsg = err.Error() | |||
| if strings.Contains(err.Error(), "ModelArts.6404") { | |||
| if strings.Contains(err.Error(), modelarts.NotebookNotFound) { | |||
| errorMsg = "the job's version is too old and can not be restarted" | |||
| } | |||
| break | |||
| @@ -417,6 +417,7 @@ func NotebookManage(ctx *context.Context) { | |||
| func NotebookDel(ctx *context.Context) { | |||
| var jobID = ctx.Params(":jobid") | |||
| var listType = ctx.Query("debugListType") | |||
| task := ctx.Cloudbrain | |||
| if task.Status != string(models.ModelArtsCreateFailed) && task.Status != string(models.ModelArtsStartFailed) && task.Status != string(models.ModelArtsStopped) { | |||
| @@ -428,8 +429,12 @@ func NotebookDel(ctx *context.Context) { | |||
| _, err := modelarts.DelNotebook2(jobID) | |||
| if err != nil { | |||
| log.Error("DelNotebook2(%s) failed:%v", task.JobName, err.Error()) | |||
| ctx.ServerError("DelNotebook2 failed", err) | |||
| return | |||
| if strings.Contains(err.Error(), modelarts.NotebookNotFound) { | |||
| log.Info("old notebook version") | |||
| } else { | |||
| ctx.ServerError("DelNotebook2 failed", err) | |||
| return | |||
| } | |||
| } | |||
| err = models.DeleteJob(task) | |||
| @@ -1452,6 +1457,7 @@ func TrainJobShow(ctx *context.Context) { | |||
| ctx.Data["jobName"] = VersionListTasks[0].JobName | |||
| ctx.Data["version_list_task"] = VersionListTasks | |||
| ctx.Data["version_list_count"] = VersionListCount | |||
| ctx.Data["canDownload"] = cloudbrain.CanDeleteJob(ctx, &VersionListTasks[0].Cloudbrain) | |||
| ctx.HTML(http.StatusOK, tplModelArtsTrainJobShow) | |||
| } | |||
| @@ -2056,6 +2062,7 @@ func InferenceJobShow(ctx *context.Context) { | |||
| ctx.Data["jobID"] = jobID | |||
| ctx.Data["jobName"] = task.JobName | |||
| ctx.Data["task"] = task | |||
| ctx.Data["canDownload"] = cloudbrain.CanDeleteJob(ctx, task) | |||
| tempUids := []int64{} | |||
| tempUids = append(tempUids, task.UserID) | |||
| @@ -107,6 +107,7 @@ func RepoStatisticDaily(date string) { | |||
| RepoID: repo.ID, | |||
| Date: date, | |||
| Name: repo.Name, | |||
| Alias: repo.Alias, | |||
| IsPrivate: repo.IsPrivate, | |||
| IsMirror: repo.IsMirror, | |||
| OwnerName: repo.OwnerName, | |||
| @@ -282,7 +283,7 @@ func RepoStatisticDaily(date string) { | |||
| } | |||
| func getDistinctProjectName(repo *models.Repository) string { | |||
| return repo.OwnerName + "/" + repo.Name | |||
| return repo.OwnerName + "/" + repo.Alias | |||
| } | |||
| func getDatasetSize(repo *models.Repository) (int64, error) { | |||
| @@ -63,11 +63,13 @@ func queryUserDataPage(ctx *context.Context, tableName string, queryObj interfac | |||
| _, count := models.QueryUserStaticDataByTableName(1, 1, tableName, queryObj, userName) | |||
| var indexTotal int64 | |||
| indexTotal = 0 | |||
| row := 1 | |||
| for { | |||
| re, _ := models.QueryUserStaticDataByTableName(int(indexTotal), PAGE_SIZE, tableName, queryObj, "") | |||
| log.Info("return count=" + fmt.Sprint(count)) | |||
| for i, userRecord := range re { | |||
| rows := fmt.Sprint(i + 2) | |||
| for _, userRecord := range re { | |||
| row++ | |||
| rows := fmt.Sprint(row) | |||
| xlsx.SetCellValue(sheetName, "A"+rows, userRecord.ID) | |||
| xlsx.SetCellValue(sheetName, "B"+rows, userRecord.Name) | |||
| xlsx.SetCellValue(sheetName, "C"+rows, userRecord.CodeMergeCount) | |||
| @@ -319,6 +319,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| m.Get("/action/notification", routers.ActionNotification) | |||
| m.Get("/recommend/org", routers.RecommendOrgFromPromote) | |||
| m.Get("/recommend/repo", routers.RecommendRepoFromPromote) | |||
| m.Get("/home/term", routers.HomeTerm) | |||
| m.Group("/explore", func() { | |||
| m.Get("", func(ctx *context.Context) { | |||
| ctx.Redirect(setting.AppSubURL + "/explore/repos") | |||
| @@ -978,8 +979,10 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| }, context.RepoRef()) | |||
| m.Group("/cloudbrain", func() { | |||
| m.Group("/:jobid", func() { | |||
| m.Group("/:jobname", func() { | |||
| m.Get("", reqRepoCloudBrainReader, repo.CloudBrainShow) | |||
| }) | |||
| m.Group("/:jobid", func() { | |||
| m.Get("/debug", cloudbrain.AdminOrJobCreaterRight, repo.CloudBrainDebug) | |||
| m.Post("/commit_image", cloudbrain.AdminOrJobCreaterRight, bindIgnErr(auth.CommitImageCloudBrainForm{}), repo.CloudBrainCommitImage) | |||
| m.Post("/stop", cloudbrain.AdminOrOwnerOrJobCreaterRight, repo.CloudBrainStop) | |||
| @@ -994,8 +997,10 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| m.Group("/benchmark", func() { | |||
| m.Get("", reqRepoCloudBrainReader, repo.CloudBrainBenchmarkIndex) | |||
| m.Group("/:jobid", func() { | |||
| m.Group("/:jobname", func() { | |||
| m.Get("", reqRepoCloudBrainReader, repo.CloudBrainBenchMarkShow) | |||
| }) | |||
| m.Group("/:jobid", func() { | |||
| m.Post("/stop", cloudbrain.AdminOrOwnerOrJobCreaterRight, repo.CloudBrainStop) | |||
| m.Post("/del", cloudbrain.AdminOrOwnerOrJobCreaterRight, repo.BenchmarkDel) | |||
| m.Get("/rate", reqRepoCloudBrainReader, repo.GetRate) | |||
| @@ -132,7 +132,7 @@ func getNotifications(c *context.Context) { | |||
| } | |||
| c.Data["Title"] = c.Tr("notifications") | |||
| c.Data["Keyword"] = keyword | |||
| //c.Data["Keyword"] = keyword | |||
| c.Data["Status"] = status | |||
| c.Data["Notifications"] = notifications | |||
| @@ -10,7 +10,7 @@ import ( | |||
| "github.com/elliotchance/orderedmap" | |||
| ) | |||
| var opTypes = []int{1, 2, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 22, 23} | |||
| var opTypes = []int{1, 2, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 22, 23, 24, 25, 26, 27, 28, 29, 30} | |||
| type ClientsManager struct { | |||
| Clients *orderedmap.OrderedMap | |||
| @@ -8,6 +8,8 @@ | |||
| <a href="https://openi.org.cn/html/Club/2019/0227/14.html" class="item">{{.i18n.Tr "custom.foot.council"}}</a> | |||
| <a href="https://openi.org.cn/html/Club/2019/0227/14.html" class="item">{{.i18n.Tr "custom.foot.technical_committee"}}</a> | |||
| <a href="https://openi.org.cn/html/Club/2019/0228/17.html" class="item">{{.i18n.Tr "custom.foot.join"}}</a> | |||
| <a href="{{AppSubUrl}}/home/term/" class="item">{{.i18n.Tr "custom.foot.agreement"}}</a> | |||
| </div> | |||
| <div class="column ui vertical text menu"> | |||
| <div class="header item">{{.i18n.Tr "custom.foot.news"}}</div> | |||
| @@ -20,7 +20,7 @@ | |||
| <div id="homenews" class="ui container"> | |||
| <p>* {{.page_only_dynamic}}</p> | |||
| <div class="ui grid"> | |||
| <div class="twelve wide tablet ten wide computer column homenews"> | |||
| <div class="sixteen wide mobile twelve wide tablet ten wide computer column homenews"> | |||
| <div class="newslist"> | |||
| <div class="ui mini aligned list swiper-wrapper" id="newmessage"> | |||
| @@ -42,7 +42,11 @@ | |||
| <a href="{{AppSubUrl}}/explore/organizations" class="circular ui primary basic button">{{.page_recommend_org_more}} <i class="arrow circle right icon"></i></a> | |||
| </div> | |||
| <div class="sixteen wide tablet twelve wide computer column"> | |||
| <div class="ui stackable three column grid homeorg-list" id="recommendorg"> | |||
| <div class="homeorg-list"> | |||
| <div class="swiper-wrapper" id="recommendorg"> | |||
| </div> | |||
| <div class="swiper-pagination"></div> | |||
| </div> | |||
| </div> | |||
| @@ -78,7 +82,7 @@ | |||
| <h2>{{.page_dev_env}}</h2> | |||
| <p><span class="ui text grey">{{.page_dev_env_desc}}</p> | |||
| </div> | |||
| <div class="ui four stackable cards"> | |||
| <div class="ui four doubling cards"> | |||
| <div class="card"> | |||
| <div class="image"> | |||
| <img src="/img/i-pic-01.svg"> | |||
| @@ -158,4 +162,4 @@ | |||
| <script src="/home/home.js?v={{MD5 AppVer}}" type="text/javascript"></script> | |||
| {{template "base/footer" .}} | |||
| {{template "base/footer" .}} | |||
| @@ -67,8 +67,20 @@ | |||
| <div class="item"> | |||
| <a href="{{$.OrgLink}}/teams/{{.LowerName}}"><strong class="team-name">{{.Name}}</strong></a> | |||
| <p class="text grey"> | |||
| <a href="{{$.OrgLink}}/teams/{{.LowerName}}"><strong>{{.NumMembers}}</strong> {{$.i18n.Tr "org.lower_members"}}</a> · | |||
| <a href="{{$.OrgLink}}/teams/{{.LowerName}}/repositories"><strong>{{.NumRepos}}</strong> {{$.i18n.Tr "org.lower_repositories"}}</a> | |||
| <a href="{{$.OrgLink}}/teams/{{.LowerName}}"><strong>{{.NumMembers}}</strong> | |||
| {{if le .NumMembers 1}} | |||
| {{$.i18n.Tr "org.lower_member"}} | |||
| {{else}} | |||
| {{$.i18n.Tr "org.lower_members"}} | |||
| {{end}} | |||
| </a> · | |||
| <a href="{{$.OrgLink}}/teams/{{.LowerName}}/repositories"><strong>{{.NumRepos}}</strong> | |||
| {{if le .NumRepos 1}} | |||
| {{$.i18n.Tr "org.lower_repository"}} | |||
| {{else}} | |||
| {{$.i18n.Tr "org.lower_repositories"}} | |||
| {{end}} | |||
| </a> | |||
| </p> | |||
| </div> | |||
| {{end}} | |||
| @@ -221,8 +221,20 @@ | |||
| <div style="margin-top: 10px;"> | |||
| <a href="{{$.OrgLink}}/teams/{{.LowerName}}"><strong class="team-name">{{.Name}}</strong></a> | |||
| <p class="text grey"> | |||
| <a href="{{$.OrgLink}}/teams/{{.LowerName}}"><strong>{{.NumMembers}}</strong> {{$.i18n.Tr "org.lower_members"}}</a> · | |||
| <a href="{{$.OrgLink}}/teams/{{.LowerName}}/repositories"><strong>{{.NumRepos}}</strong> {{$.i18n.Tr "org.lower_repositories"}}</a> | |||
| <a href="{{$.OrgLink}}/teams/{{.LowerName}}"><strong>{{.NumMembers}}</strong> | |||
| {{if le .NumMembers 1}} | |||
| {{$.i18n.Tr "org.lower_member"}} | |||
| {{else}} | |||
| {{$.i18n.Tr "org.lower_members"}} | |||
| {{end}} | |||
| </a> · | |||
| <a href="{{$.OrgLink}}/teams/{{.LowerName}}/repositories"><strong>{{.NumRepos}}</strong> | |||
| {{if le .NumRepos 1}} | |||
| {{$.i18n.Tr "org.lower_repository"}} | |||
| {{else}} | |||
| {{$.i18n.Tr "org.lower_repositories"}} | |||
| {{end}} | |||
| </a> | |||
| </p> | |||
| </div> | |||
| {{end}} | |||
| @@ -70,11 +70,11 @@ | |||
| <div style="width: 100%;margin:15px 0;"> | |||
| {{if .tags}} | |||
| <span class="header"> | |||
| 精选项目 | |||
| {{.i18n.Tr "org.selected_project"}} | |||
| </span> | |||
| <!-- {{.IsOrganizationOwner}} --> | |||
| {{if .IsOrganizationOwner}} | |||
| <a class="text-right" id="model" onclick="showcreate()" >{{svg "octicon-gear" 16}}自定义</a> | |||
| <a class="text-right" id="model" onclick="showcreate()" >{{svg "octicon-gear" 16}}{{.i18n.Tr "org.customize"}}</a> | |||
| {{end}} | |||
| {{end}} | |||
| @@ -137,10 +137,10 @@ | |||
| <div class="ui modal"> | |||
| <div class="header" style="padding: 1rem;background-color: rgba(240, 240, 240, 100);"> | |||
| <h4 id="model_header">自定义精选项目</h4> | |||
| <h4 id="model_header">{{.i18n.Tr "org.custom_select_projects"}}</h4> | |||
| </div> | |||
| <div class="content content-padding" style="color: black;"> | |||
| <p>最多可选9个公开项目</p> | |||
| <p>{{.i18n.Tr "org.max_selectedPro"}}</p> | |||
| <div class="ui search" > | |||
| <div class="ui input" style="width: 100%;"> | |||
| <input type="text" id = 'search_selectPro' placeholder="Search ..." value = '' oninput="search()"> | |||
| @@ -223,12 +223,12 @@ | |||
| function saveSeletedPro(typeTag){ | |||
| var saveData=[]; | |||
| $('input[name="select_pro_name"]:checked').each(function(){ | |||
| console.log('值',this.dataset.repoid) | |||
| // console.log('值',this.dataset.repoid) | |||
| saveData.push(parseInt(this.dataset.repoid)); | |||
| }) | |||
| if(saveData.length>9){ | |||
| alert("最多可选9个,保存失败") | |||
| alert("{{.i18n.Tr "org.save_fail_tips"}}") | |||
| return | |||
| } | |||
| // saveData = getSelecteDataID(); | |||
| @@ -242,7 +242,7 @@ | |||
| data:JSON.stringify({'repoList':saveData | |||
| }), | |||
| success:function(res){ | |||
| console.log('保存成功'); | |||
| // console.log('保存成功'); | |||
| location.reload() | |||
| } | |||
| @@ -270,15 +270,15 @@ | |||
| filterData.push(data[i]) | |||
| } | |||
| } | |||
| console.log("选中的值:",selectedData) | |||
| console.log("筛选包括选中的值:",filterData) | |||
| // 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) | |||
| // console.log("筛选后不包括选中的值:",filterData) | |||
| $("#org_list").empty() | |||
| if(searchValue!=""){ | |||
| if (filterData.length!=0){ | |||
| @@ -307,7 +307,7 @@ | |||
| num++ | |||
| if(num>9){ | |||
| document.getElementById(id).checked=false | |||
| alert("选择超过9个,请重新选择!") | |||
| alert("{{.i18n.Tr "org.select_again"}}") | |||
| return | |||
| } | |||
| } | |||
| @@ -315,7 +315,8 @@ | |||
| } | |||
| var show_num = 9-num; | |||
| document.getElementById("recommend").innerHTML="还能推荐"+show_num+"个" | |||
| let rec = "{{.i18n.Tr "org.recommend_remain_pro"}}" | |||
| document.getElementById("recommend").innerHTML=rec +" : "+ show_num | |||
| } | |||
| @@ -44,7 +44,19 @@ | |||
| {{end}} | |||
| </div> | |||
| <div class="ui bottom attached header"> | |||
| <p class="team-meta">{{.NumMembers}} {{$.i18n.Tr "org.lower_members"}} · {{.NumRepos}} {{$.i18n.Tr "org.lower_repositories"}}</p> | |||
| <p class="team-meta">{{.NumMembers}} | |||
| {{if le .NumMembers 1}} | |||
| {{$.i18n.Tr "org.lower_member"}} | |||
| {{else}} | |||
| {{$.i18n.Tr "org.lower_members"}} | |||
| {{end}} | |||
| · {{.NumRepos}} | |||
| {{if le .NumRepos 1}} | |||
| {{$.i18n.Tr "org.lower_repository"}} | |||
| {{else}} | |||
| {{$.i18n.Tr "org.lower_repositories"}} | |||
| {{end}} | |||
| </p> | |||
| </div> | |||
| </div> | |||
| {{end}} | |||
| @@ -36,7 +36,19 @@ | |||
| {{end}} | |||
| </div> | |||
| <div class="ui bottom attached header"> | |||
| <p class="team-meta">{{.NumMembers}} {{$.i18n.Tr "org.lower_members"}} · {{.NumRepos}} {{$.i18n.Tr "org.lower_repositories"}}</p> | |||
| <p class="team-meta">{{.NumMembers}} | |||
| {{if le .NumMembers 1}} | |||
| {{$.i18n.Tr "org.lower_member"}} | |||
| {{else}} | |||
| {{$.i18n.Tr "org.lower_members"}} | |||
| {{end}} | |||
| · {{.NumRepos}} | |||
| {{if le .NumRepos 1}} | |||
| {{$.i18n.Tr "org.lower_repository"}} | |||
| {{else}} | |||
| {{$.i18n.Tr "org.lower_repositories"}} | |||
| {{end}} | |||
| </p> | |||
| </div> | |||
| </div> | |||
| {{end}} | |||
| @@ -99,8 +99,7 @@ | |||
| <!-- 任务名 --> | |||
| <div class="three wide column padding0"> | |||
| <a class="title" href="{{$.Link}}/{{.JobID}}" title="{{.JobName}}" style="font-size: 14px;"> | |||
| <a class="title" href="{{$.Link}}/{{.JobName}}" title="{{.JobName}}" style="font-size: 14px;"> | |||
| <span class="fitted" style="width: 90%;vertical-align: middle;">{{.JobName}}</span> | |||
| </a> | |||
| </div> | |||
| @@ -83,7 +83,7 @@ | |||
| </div> | |||
| <div class="unite min_title inline field"> | |||
| <label style="font-weight: normal;" for="description">{{.i18n.Tr "repo.modelarts.train_job.description"}} </label> | |||
| <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="254" 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, 255)"></textarea> | |||
| <textarea style="width: 80%;" id="description" name="description" rows="3" maxlength="254" 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, 255)">{{.description}}</textarea> | |||
| </div> | |||
| <div class="required unite min_title inline field"> | |||
| @@ -102,11 +102,16 @@ | |||
| <span> </span> | |||
| <select class="ui fluid selection search dropdown" id="benchmark_types_id" name="benchmark_types_id" > | |||
| {{range .benchmark_types}} | |||
| <option value="{{.Id}}">{{.First}}</option> | |||
| {{if eq .Id $.benchmarkTypeID}} | |||
| <option value="{{.Id}}" selected="true">{{.First}}</option> | |||
| {{else}} | |||
| <option value="{{.Id}}">{{.First}}</option> | |||
| {{end}} | |||
| {{end}} | |||
| </select> | |||
| </div> | |||
| <div class="eight wide field" id="engine_name"> | |||
| <input type="hidden" id="benchmark_child_types_id_hidden" name="benchmark_child_types_id_hidden" value="{{.benchmark_child_types_id_hidden}}"> | |||
| <label style="font-weight: normal;white-space: nowrap;">{{.i18n.Tr "repo.cloudbrain.benchmark.evaluate_child_type"}}</label> | |||
| <select class="ui fluid selection dropdown nowrap" id="benchmark_child_types_id" style='width: 100%;' name="benchmark_child_types_id"> | |||
| </select> | |||
| @@ -182,11 +187,16 @@ | |||
| function setChildType(){ | |||
| let type_id = $('#benchmark_types_id').val(); | |||
| let child_selected_id = $('#benchmark_child_types_id_hidden').val(); | |||
| $.get(`${repolink}/cloudbrain/benchmark/get_child_types?benchmark_type_id=${type_id}`, (data) => { | |||
| const n_length = data['child_types'].length | |||
| let html='' | |||
| for (let i=0;i<n_length;i++){ | |||
| html += `<option value="${data['child_types'][i].id}">${data['child_types'][i].value}</option>`; | |||
| if(child_selected_id == data['child_types'][i].id){ | |||
| html += `<option value="${data['child_types'][i].id}" selected="true">${data['child_types'][i].value}</option>`; | |||
| }else{ | |||
| html += `<option value="${data['child_types'][i].id}">${data['child_types'][i].value}</option>`; | |||
| } | |||
| } | |||
| document.getElementById("benchmark_child_types_id").innerHTML=html; | |||
| }) | |||
| @@ -188,6 +188,7 @@ td, th { | |||
| </h4> | |||
| {{range $k ,$v := .version_list_task}} | |||
| <div class="ui accordion border-according" id="accordion{{.VersionName}}" data-repopath="{{$.RepoRelPath}}" data-jobid="{{.JobID}}" data-version="{{.VersionName}}"> | |||
| <input type="hidden" id="jobId_input" name="jobId_input" value="{{.JobID}}"> | |||
| <div class="{{if eq $k 0}}active{{end}} title padding0"> | |||
| <div class="according-panel-heading"> | |||
| <div class="accordion-panel-title"> | |||
| @@ -432,19 +433,18 @@ td, th { | |||
| let userName | |||
| let repoPath | |||
| let jobID | |||
| let jobName | |||
| $(document).ready(function(){ | |||
| let url = window.location.href; | |||
| let urlArr = url.split('/') | |||
| userName = urlArr.slice(-5)[0] | |||
| repoPath = urlArr.slice(-4)[0] | |||
| jobID = urlArr.slice(-1)[0] | |||
| jobName = urlArr.slice(-1)[0] | |||
| }) | |||
| function loadLog(version_name){ | |||
| document.getElementById("mask").style.display = "block" | |||
| $.get(`/api/v1/repos/${userName}/${repoPath}/cloudbrain/${jobID}/log?version_name=${version_name}&lines=50&order=asc`, (data) => { | |||
| $.get(`/api/v1/repos/${userName}/${repoPath}/cloudbrain/${jobName}/log?version_name=${version_name}&lines=50&order=asc`, (data) => { | |||
| $('input[name=end_line]').val(data.EndLine) | |||
| $('input[name=start_line]').val(data.StartLine) | |||
| $(`#log_file${version_name}`).text(data.Content) | |||
| @@ -121,8 +121,8 @@ | |||
| </div> | |||
| <a style="margin-left: 0.5rem;" id="manage_topic"> | |||
| {{if and .Permission.IsAdmin (not .Repository.IsArchived)}}<i style="cursor: pointer;" class="plus square outline icon"></i>{{end}} | |||
| {{.i18n.Tr "repo.issues.new.add_labels_title"}} | |||
| {{if and .Permission.IsAdmin (not .Repository.IsArchived)}}<i style="cursor: pointer;" class="plus square outline icon"></i>{{.i18n.Tr "repo.issues.new.add_labels_title"}}{{end}} | |||
| </a> | |||
| <div id="topic_edit" class="vue_menu" style="display:none;"> | |||
| @@ -14,7 +14,7 @@ | |||
| <div class="eight wide column right aligned"> | |||
| <div class="ui left mini icon buttons"> | |||
| <span class="ui basic button text left" data-tooltip='{{$.i18n.Tr "dataset.download_count"}}' data-position="bottom right" style="width: 60px; padding-left: 0;">{{svg "octicon-flame" 16}} {{(.DownloadCount | PrettyNumber)}}</span> | |||
| <span class="ui basic basic button clipboard" data-clipboard-text="{{.DownloadURL}}" data-tooltip='{{$.i18n.Tr "dataset.copy_url"}}' data-clipboard-action="copy"{{if ne $.Type 0}} style="display:none;"{{end}}>{{svg "octicon-file" 16}}</span> | |||
| <span class="ui basic basic button clipboard" data-clipboard-text="{{.DownloadURL}}" data-tooltip='{{$.i18n.Tr "dataset.copy_url"}}' data-clipboard-action="copy">{{svg "octicon-file" 16}}</span> | |||
| <span class="ui basic basic button clipboard" data-clipboard-text="{{.FileChunk.Md5}}" data-tooltip='{{$.i18n.Tr "dataset.copy_md5"}}' data-clipboard-action="copy">{{svg "octicon-file-binary" 16}}</span> | |||
| </div> | |||
| {{if eq .DecompressState 1}} | |||
| @@ -11,9 +11,8 @@ | |||
| {{template "repo/header" .}} | |||
| <script> | |||
| $(document).ready(function() { | |||
| url = window.location.href | |||
| type = url.split('?type=')[1] | |||
| if (type == 0){ | |||
| const params = new URLSearchParams(window.location.search); | |||
| if (params.get('type') == 0){ | |||
| $('.contorl_component').attr("id", 'minioUploader') | |||
| }else{ | |||
| $('.contorl_component').attr("id", 'obsUploader') | |||
| @@ -287,7 +287,7 @@ | |||
| <div class="row"> | |||
| <!-- 任务名 --> | |||
| <div class="four wide column"> | |||
| <a class="title" href='{{if eq .ComputeResource "CPU/GPU"}}{{$.RepoLink}}/cloudbrain{{else}}{{$.RepoLink}}/modelarts/notebook{{end}}/{{.JobID}}' title="{{.JobName}}" style="font-size: 14px;"> | |||
| <a class="title" href='{{if eq .ComputeResource "CPU/GPU"}}{{$.RepoLink}}/cloudbrain/{{.JobName}}{{else}}{{$.RepoLink}}/modelarts/notebook/{{.JobID}}{{end}}' title="{{.JobName}}" style="font-size: 14px;"> | |||
| <span class="fitted text_over" style="width: 90%;vertical-align: middle;">{{.JobName}}</span> | |||
| </a> | |||
| </div> | |||
| @@ -360,7 +360,7 @@ | |||
| </form> | |||
| <!-- 删除 --> | |||
| <form id="delForm-{{.JobID}}" action="{{if eq .ComputeResource "CPU/GPU"}}{{$.RepoLink}}/cloudbrain{{else}}{{$.RepoLink}}/modelarts/notebook{{end}}/{{.JobID}}/del" method="post"> | |||
| <input type="hidden" name="debugListType" value="all"> | |||
| <input type="hidden" name="debugListType" value="{{$.ListType}}"> | |||
| {{$.CsrfTokenHtml}} | |||
| {{if .CanDel}} | |||
| <a id="ai-delete-{{.JobID}}" class='ui basic ai_delete {{if eq .Status "STOPPED" "FAILED" "START_FAILED"}}blue {{else}}disabled {{end}}button' style="border-radius: .28571429rem;"> | |||
| @@ -482,7 +482,8 @@ | |||
| const {AppSubUrl, StaticUrlPrefix, csrf} = window.config; | |||
| let url={{.RepoLink}} | |||
| let getParam=getQueryVariable('debugListType') | |||
| let dropdownValue = getParam==='all'||getParam==='' ? '全部' : getParam | |||
| let dropdownValue = ['all','',false].includes(getParam)? '全部' : getParam | |||
| localStorage.setItem('all',location.href) | |||
| function getQueryVariable(variable) | |||
| { | |||
| @@ -255,9 +255,9 @@ | |||
| {{end}} | |||
| </div> | |||
| <div class="ui six wide tablet four wide computer column"> | |||
| <div id="repo-desc"> | |||
| <h4 id="about-desc" class="ui header">简介</h4> | |||
| <input type="hidden" id="edit-alias" value="{{.Repository.Alias}}"> | |||
| <div id="repo-desc" data-IsAdmin= "{{.Permission.IsAdmin}}" data-IsArchived="{{.Repository.IsArchived}}" > | |||
| <h4 id="about-desc" class="ui header">简介</h4> | |||
| <input type="hidden" id="edit-alias" value="{{.Repository.Alias}}"> | |||
| <p> | |||
| {{if .Repository.DescriptionHTML}} | |||
| <span class="description" style="word-break:break-all">{{.Repository.DescriptionHTML}}</span> | |||
| @@ -469,13 +469,13 @@ td, th { | |||
| </div> | |||
| {{template "base/footer" .}} | |||
| <script> | |||
| console.log({{.task}}) | |||
| $(document).ready(function(){ | |||
| $('.secondary.menu .item').tab(); | |||
| }); | |||
| let userName | |||
| let repoPath | |||
| let jobID | |||
| let downlaodFlag = {{$.canDownload }} | |||
| $(document).ready(function(){ | |||
| let url = window.location.href; | |||
| let urlArr = url.split('/') | |||
| @@ -621,7 +621,12 @@ function renderDir(data,version_name){ | |||
| html += `<a onclick="loadModelFile('${version_name}','${data.Dirs[i].ParenDir}','${data.Dirs[i].FileName}','folder')">` | |||
| html += "<span class='fitted'><i class='folder icon' width='16' height='16' aria-hidden='true'></i>" + data.Dirs[i].FileName + "</span>" | |||
| }else{ | |||
| html += `<a href="${location.href}/result_download?version_name=${version_name}&file_name=${data.Dirs[i].FileName}&parent_dir=${data.Dirs[i].ParenDir}">` | |||
| if(downlaodFlag){ | |||
| html += `<a href="${location.href}/result_download?version_name=${version_name}&file_name=${data.Dirs[i].FileName}&parent_dir=${data.Dirs[i].ParenDir}">` | |||
| } | |||
| else{ | |||
| html += `<a class="disabled">` | |||
| } | |||
| html += "<span class='fitted'><i class='file icon' width='16' height='16' aria-hidden='true'></i>" + data.Dirs[i].FileName + "</span>" | |||
| } | |||
| html += '</a>' | |||
| @@ -51,7 +51,16 @@ | |||
| <input name="job_name" id="cloudbrain_job_name" placeholder="任务名称" value="{{.job_name}}" tabindex="3" autofocus required maxlength="255" onkeyup="this.value=this.value.replace(/[, ]/g,'')"> | |||
| </div> | |||
| <!-- <div class="inline field"> | |||
| <div class="inline required field"> | |||
| <label>镜像</label> | |||
| <select id="cloudbrain_image" class="ui search dropdown" placeholder="选择镜像" style='width:385px' name="image_id"> | |||
| {{range .images}} | |||
| <option name="image_id" value="{{.Id}}">{{.Value}}</option> | |||
| {{end}} | |||
| </select> | |||
| </div> | |||
| <div class="inline field"> | |||
| <label>数据集</label> | |||
| <input type="text" list="cloudbrain_dataset" placeholder="选择数据集" name="" id="answerInput" autofocus maxlength="36"> | |||
| <datalist id="cloudbrain_dataset" class="ui search" style='width:385px' name="attachment"> | |||
| @@ -62,7 +71,7 @@ | |||
| <input type="hidden" name="attachment" id="answerInput-hidden"> | |||
| </div> | |||
| <div class="inline required field"> | |||
| <!--<div class="inline required field"> | |||
| <label>工作环境</label> | |||
| <input name="de" id="cloudbrain_de" value="{{.env}}" tabindex="3" disabled autofocus required maxlength="255" readonly="readonly"> | |||
| </div> | |||
| @@ -27,7 +27,7 @@ | |||
| {{end}} | |||
| </div> | |||
| <div class="ui green segment"> | |||
| <p>任务结果:</p> | |||
| <p>任务详情:</p> | |||
| {{with .result}} | |||
| <table class="ui celled striped table"> | |||
| <tbody> | |||
| @@ -35,6 +35,14 @@ | |||
| <td class="four wide"> 状态 </td> | |||
| <td> {{.Status}} </td> | |||
| </tr> | |||
| <tr> | |||
| <td> 镜像名称 </td> | |||
| <td>{{$.task.Image}}</td> | |||
| </tr> | |||
| <tr> | |||
| <td> 数据集下载地址 </td> | |||
| <td style="max-width: 480px; word-wrap:break-word">{{$.datasetDownloadLink}}</td> | |||
| </tr> | |||
| <tr> | |||
| <td> 开始时间 </td> | |||
| <td>{{.CreateTime}}</td> | |||
| @@ -533,6 +533,7 @@ td, th { | |||
| let userName | |||
| let repoPath | |||
| let jobID | |||
| let downlaodFlag = {{$.canDownload }} | |||
| $(document).ready(function(){ | |||
| let url = window.location.href; | |||
| let urlArr = url.split('/') | |||
| @@ -788,7 +789,12 @@ td, th { | |||
| html += `<a onclick="loadModelFile('${version_name}','${data.Dirs[i].ParenDir}','${data.Dirs[i].FileName}','folder')">` | |||
| html += "<span class='fitted'><i class='folder icon' width='16' height='16' aria-hidden='true'></i>" + data.Dirs[i].FileName + "</span>" | |||
| }else{ | |||
| html += `<a href="${location.href}/model_download?version_name=${version_name}&file_name=${data.Dirs[i].FileName}&parent_dir=${data.Dirs[i].ParenDir}">` | |||
| if(downlaodFlag){ | |||
| html += `<a href="${location.href}/model_download?version_name=${version_name}&file_name=${data.Dirs[i].FileName}&parent_dir=${data.Dirs[i].ParenDir}">` | |||
| } | |||
| else{ | |||
| html += `<a class="disabled">` | |||
| } | |||
| html += "<span class='fitted'><i class='file icon' width='16' height='16' aria-hidden='true'></i>" + data.Dirs[i].FileName + "</span>" | |||
| } | |||
| html += '</a>' | |||
| @@ -0,0 +1,70 @@ | |||
| {{template "base/head_home" .}} | |||
| <div class="ui container"> | |||
| <h1 class="ui center am-pt-30 am-pb-20">OpenI启智社区AI协作平台使用协议</h1> | |||
| <div class="ui divider am-pb-10"></div> | |||
| <p> | |||
| OpenI启智社区AI协作平台作为新一代人工智能领域开源开放开发协作平台,不仅为用户提供代码托管与数据集管理等服务,同时提供开发者所需的计算算力资源,一个良好的开发环境对用户、组织和项目都尤为重要。 | |||
| </p> | |||
| <p> | |||
| 为了保障用户权益,维护平台正常秩序,实现平台规范化运营,给开发者提供一个良好的开发环境,您不得在本平台进行恶意攻击、挖矿等任何违法或扰乱平台秩序的行为。<strong>一经发现,平台有权变更、暂停或终止您对平台服务的使用而无须事先声明,包括但不限于限制您使用平台服务的次数与资源、账号永久封闭等。</strong> | |||
| </p> | |||
| <h2> | |||
| AI协作平台使用协议及违规处罚 | |||
| </h2> | |||
| <p> | |||
| 1. 您需保证对平台服务的使用不违反国家各项法律法规的规定,且不侵害任何第三方权益,如因此造成任何后果及损失,由您自行承担全部责任。 | |||
| </p> | |||
| <p> | |||
| <strong>2. 禁止行为</strong> | |||
| </p> | |||
| <p> | |||
| 您充分理解并同意,您在使用平台服务时,应当遵守所有中华人民共和国的法律、法规、规章制度、规范、政策、行政命令、强制标准及行业标准等(统称为“法律法规”)。除非法律法规允许且启智社区事先书面许可,您不得从事以下活动,也不得同意、授权或指示任何第三人从事包括但不限于以下内容的活动: | |||
| <br> | |||
| (1) 对平台服务进行挖矿、逆向工程、反编辑等恶意行为损坏平台服务相关内容与数据,或不正当手段获取原始数据和其他数据等;<br> | |||
| (2) 对平台服务或者平台服务运行过程中释放出的任何数据或其他数据及平台服务运行过程中的交互数据进行复制、更改、修改等操作,包括但不限于使用插件、外挂或非经授权的第三方工具或服务接入平台服务和相关系统; | |||
| <br> | |||
| (3) 宣扬或提供关于非法行为的说明信息、宣扬针对任何团体或个人的人身伤害或传播任何病毒、蠕虫、缺陷、特洛伊木马或其他具有破坏性的内容等;<br> | |||
| (4) 删除本平台服务中包含的任何版权声明、商标声明或其他所有权声明;包括但不限于任何有损本平台一切相关知识产权的行为;<br> | |||
| (5) 创造任何网站或应用程序以重现或复制平台服务或本平台。 | |||
| </p> | |||
| <p> | |||
| <strong>3. 遵守法律规范</strong> | |||
| </p> | |||
| <p> | |||
| 您不得利用平台服务上传、上载、发布、发表、传播任何违法内容,包括但不限于您制作、复制、发布、传播下列信息: | |||
| </p> | |||
| <p> | |||
| (1)煽动抗拒、破坏宪法和法律、行政法规实施<br> | |||
| (2)煽动颠覆国家政权,推翻社会主义制度<br> | |||
| (3)煽动分裂国家、破坏国家统一<br> | |||
| (4)煽动民族仇恨、民族歧视、破坏民族团结<br> | |||
| (5)捏造或者歪曲事实、散布谣言,扰乱社会秩序<br> | |||
| (6)宣扬封建迷信、淫秽、色情、赌博、暴力、教唆犯罪<br> | |||
| (7)公然侮辱他人或者捏造事实诽谤他人<br> | |||
| (8)损害国家机关信誉或有损国家领导人荣誉<br> | |||
| (9)其他违反宪法和法律、行政法规<br> | |||
| (10)含有虚假、有害、胁迫、侵害他人隐私、骚扰、侵害、中伤、粗俗、猥亵或其他道德上令人反感的内容<br> | |||
| (11)含有中国法律、法规、规章、条例以及任何具有法律效力之规范所限制或禁止的其他内容 | |||
| </p> | |||
| <p> | |||
| 一经发现,平台将按照国家有关规定,及时删除网站中含有上述内容的地址、目录,并保留原始记录,在二十四小时之内向公安机关报告。 | |||
| </p> | |||
| <p> | |||
| <strong>4. 保障网络信息安全</strong> | |||
| </p> | |||
| <p> | |||
| 您不得利用平台服务从事以下危害计算机网络信息安全的活动:<br> | |||
| (1) 未经允许,进入计算机信息网络或者使用计算机信息网络资源的;<br> | |||
| (2) 未经允许,对计算机信息网络功能进行删除、修改或者增加的;<br> | |||
| (3) 未经允许,对进入计算机信息网络中存储、处理或者传输的数据和应用程序进行删除、修改或者增加的;<br> | |||
| (4) 故意制作、传播计算机病毒等破坏性程序的;<br> | |||
| (5) 其他危害计算机信息网络安全的行为。 | |||
| </p> | |||
| <p> | |||
| 5. 您充分理解并同意,您对自己使用平台服务的一切行为及由此产生的一切结果负责,包括但不限于您所发表的任何内容、提供的任何服务以及由此产生的任何后果。您应对平台服务的内容应自行判断并决定是否使用,并承担因使用平台服务及其相关内容而引起的所有风险,包括因对平台服务及其内容的真实性、完整性、准确性、及时性及实用性的依赖而产生的风险。平台不对此提供任何担保和保证,不对因前述风险而导致的任何后果或损失对您承担责任。 | |||
| </p> | |||
| <p> | |||
| <strong>如果您违反了法律法规或本协议,OpenI启智社区有权依据合理判断对违反法律法规或本协议的行为作出处理,并保留对该违反行为采取法律所能提供的所有补救手段的权利。OpenI启智社区有权对违反法律法规及本协议的任何用户调查并采取适当的法律行动,包括但不限于民事诉讼等。OpenI启智社区有权根据违法违规行为的严重程度,将上述违法违规行为的线索和您的个人信息报告司法机关或其他执法机关,并配合司法机关或其他执法机关进行的调查、听证、起诉等。您应当自行承担由此产生的任何法律责任。</strong> | |||
| </p> | |||
| </div> | |||
| {{template "base/footer" .}} | |||
| @@ -69,7 +69,21 @@ | |||
| {{$.i18n.Tr "action.reject_pull_request" .GetRepoLink $index .ShortRepoFullDisplayName | Str2html}} | |||
| {{else if eq .GetOpType 23}} | |||
| {{ $index := index .GetIssueInfos 0}} | |||
| {{$.i18n.Tr "action.comment_pull" .GetRepoLink $index .ShortRepoFullDisplayName | Str2html}} | |||
| {{$.i18n.Tr "action.comment_pull" .GetRepoLink $index .ShortRepoPath | Str2html}} | |||
| {{else if eq .GetOpType 24}} | |||
| {{$.i18n.Tr "action.upload_dataset" .GetRepoLink .Content .RefName | Str2html}} | |||
| {{else if eq .GetOpType 25}} | |||
| {{$.i18n.Tr "action.task_gpudebugjob" .GetRepoLink .RefName .RefName | Str2html}} | |||
| {{else if eq .GetOpType 26}} | |||
| {{$.i18n.Tr "action.task_npudebugjob" .GetRepoLink .Content .RefName | Str2html}} | |||
| {{else if eq .GetOpType 27}} | |||
| {{$.i18n.Tr "action.task_trainjob" .GetRepoLink .Content .RefName | Str2html}} | |||
| {{else if eq .GetOpType 28}} | |||
| {{$.i18n.Tr "action.task_inferencejob" .GetRepoLink .Content .RefName | Str2html}} | |||
| {{else if eq .GetOpType 29}} | |||
| {{$.i18n.Tr "action.task_benchmark" .GetRepoLink .RefName .RefName | Str2html}} | |||
| {{else if eq .GetOpType 30}} | |||
| {{$.i18n.Tr "action.task_createmodel" .GetRepoLink .RefName .RefName | Str2html}} | |||
| {{end}} | |||
| </p> | |||
| {{if or (eq .GetOpType 5) (eq .GetOpType 18)}} | |||
| @@ -101,7 +115,23 @@ | |||
| </div> | |||
| </div> | |||
| <div class="ui two wide right aligned column"> | |||
| <span class="text grey">{{svg (printf "octicon-%s" (ActionIcon .GetOpType)) 32}}</span> | |||
| {{if eq .GetOpType 24}} | |||
| <span class="text grey"><i class="ri-uninstall-line icon big"></i></span> | |||
| {{else if eq .GetOpType 25}} | |||
| <span class="text grey"><i class="ri-voice-recognition-line icon big"></i></span> | |||
| {{else if eq .GetOpType 26}} | |||
| <span class="text grey"><i class="ri-voice-recognition-line icon big"></i></span> | |||
| {{else if eq .GetOpType 27}} | |||
| <span class="text grey"><i class="ri-character-recognition-line icon big"></i></span> | |||
| {{else if eq .GetOpType 28}} | |||
| <span class="text grey"><i class="ri-haze-2-line icon big"></i></span> | |||
| {{else if eq .GetOpType 29}} | |||
| <span class="text grey"><i class="ri-vip-crown-line icon big"></i></span> | |||
| {{else if eq .GetOpType 30}} | |||
| <span class="text grey"><i class="ri-picture-in-picture-exit-line icon big"></i></span> | |||
| {{else}} | |||
| <span class="text grey">{{svg (printf "octicon-%s" (ActionIcon .GetOpType)) 32}}</span> | |||
| {{end}} | |||
| </div> | |||
| </div> | |||
| <div class="ui divider"></div> | |||
| @@ -1,7 +1,7 @@ | |||
| <template> | |||
| <div> | |||
| <h4 id="about-desc" class="ui header desc-home">简介 | |||
| <a class="edit-icon" href="javascript:void(0)" @click="editClick"> | |||
| <a class="edit-icon" v-if="IsPermit" id ="editBtn" href="javascript:void(0)" @click="editClick" > | |||
| <i class="gray edit outline icon" style="margin-right: 0;"></i> | |||
| </a> | |||
| </h4> | |||
| @@ -52,7 +52,8 @@ export default { | |||
| desc: '', | |||
| index_web: '', | |||
| repo_name_name: '', | |||
| alias:'' | |||
| alias:'', | |||
| IsPermit:false | |||
| }, | |||
| // rule1:[{min:3,max:5,message:'1',trigger:"blur"}], | |||
| rule: { | |||
| @@ -63,8 +64,18 @@ export default { | |||
| }; | |||
| }, | |||
| methods: { | |||
| getIsSigned(){ | |||
| var isadmin= document.getElementById("repo-desc").dataset.isadmin; | |||
| var isarchived=document.getElementById("repo-desc").dataset.isarchived; | |||
| // console.log("IsSigned:",this.IsSigned) | |||
| if ((isadmin==true || isadmin=="true")&& (isarchived==false || isarchived=="false")){ | |||
| this.IsPermit=true; | |||
| } | |||
| }, | |||
| editClick() { | |||
| this.editDataDialog = true; | |||
| if (this.IsPermit){ | |||
| this.editDataDialog = true; | |||
| } | |||
| }, | |||
| getDesc() { | |||
| const el = $('span.description').text(); | |||
| @@ -121,6 +132,7 @@ export default { | |||
| } | |||
| }, | |||
| mounted() { | |||
| this.getIsSigned(); | |||
| this.getUrl(); | |||
| this.getRepoName(); | |||
| this.getDesc(); | |||
| @@ -135,7 +147,7 @@ export default { | |||
| } | |||
| }, | |||
| created() { | |||
| this.getIsSigned(); | |||
| } | |||
| }; | |||
| @@ -81,7 +81,7 @@ export default { | |||
| dictInvalidFileType: this.dropzoneParams.data('invalid-input-type'), | |||
| dictFileTooBig: this.dropzoneParams.data('file-too-big'), | |||
| dictRemoveFile: this.dropzoneParams.data('remove-file'), | |||
| previewTemplate | |||
| // previewTemplate | |||
| }); | |||
| dropzoneUploader.on('addedfile', (file) => { | |||
| setTimeout(() => { | |||
| @@ -82,7 +82,7 @@ export default { | |||
| dictInvalidFileType: this.dropzoneParams.data('invalid-input-type'), | |||
| dictFileTooBig: this.dropzoneParams.data('file-too-big'), | |||
| dictRemoveFile: this.dropzoneParams.data('remove-file'), | |||
| previewTemplate | |||
| // previewTemplate | |||
| }); | |||
| dropzoneUploader.on('addedfile', (file) => { | |||
| setTimeout(() => { | |||
| @@ -58,15 +58,22 @@ | |||
| stripe | |||
| > | |||
| </el-table-column> | |||
| <el-table-column | |||
| label="项目名称中文" | |||
| align="left" | |||
| prop="name" | |||
| v-if='0' | |||
| > | |||
| </el-table-column> | |||
| <el-table-column | |||
| label="项目名称" | |||
| width="125px" | |||
| align="left" | |||
| prop="name" | |||
| prop="alias" | |||
| style="color:#0366D6;font-family: Roboto" | |||
| > | |||
| <template slot-scope="scope"> | |||
| <a @click=goToDetailPage(scope.row.repo_id,scope.row.name,scope.row.ownerName)>{{scope.row.name}} </a> | |||
| <a @click=goToDetailPage(scope.row.repo_id,scope.row.name,scope.row.ownerName,scope.row.alias)>{{scope.row.alias}} </a> | |||
| </template> | |||
| </el-table-column> | |||
| <el-table-column | |||
| @@ -160,7 +167,7 @@ | |||
| </div> | |||
| <div id ="pro_detail" style="display:none;width: 100%;"> | |||
| <div style="margin-top: 10px;"> | |||
| <a class="pro_item" :href="'../../../'+this.ownerName+'/'+this.pro_name">{{this.ownerName}} / {{this.pro_name}}</a> <span class="update_time">数据更新时间:</span><span style="font-size: 12px;">{{tableDataIDTotal.lastUpdatedTime}} / 从{{tableDataIDTotal.recordBeginTime}}开始统计</span> | |||
| <a class="pro_item" :href="'../../../'+this.ownerName+'/'+this.pro_name">{{this.ownerName}} / {{this.alias}}</a> <span class="update_time">数据更新时间:</span><span style="font-size: 12px;">{{tableDataIDTotal.lastUpdatedTime}} / 从{{tableDataIDTotal.recordBeginTime}}开始统计</span> | |||
| </div> | |||
| <div style="margin-top: 10px;"> | |||
| 项目描述:{{tableDataIDTotal.description | discriptionFun}} | |||
| @@ -388,6 +395,7 @@ | |||
| create_time_pro: '', | |||
| dynamic_pro:7, | |||
| pro_name:'', | |||
| alias:'', | |||
| pro_id:'', | |||
| ownerName:'', | |||
| radarOpenI:'', | |||
| @@ -445,7 +453,7 @@ | |||
| startDate = this.comparedate(tmp,this.recordBeginTime) | |||
| console.log("comparedate:"+startDate) | |||
| saveFileName = this.pro_name+"_"+startDate+'_'+endDate | |||
| saveFileName = this.alias+"_"+startDate+'_'+endDate | |||
| }else{ | |||
| switch(this.paramsID.type){ | |||
| case "yesterday":{ | |||
| @@ -453,7 +461,7 @@ | |||
| startDate = this.comparedate(yesterday_tmp,this.recordBeginTime) | |||
| endDate = startDate | |||
| saveFileName = this.pro_name+"_"+startDate+'_'+ endDate | |||
| saveFileName = this.alias+"_"+startDate+'_'+ endDate | |||
| break | |||
| } | |||
| case "current_week":{ | |||
| @@ -465,7 +473,7 @@ | |||
| endDate = yesterday | |||
| saveFileName = this.pro_name+"_"+startDate+'_'+ endDate | |||
| saveFileName = this.alias+"_"+startDate+'_'+ endDate | |||
| break | |||
| } | |||
| case "current_month":{ | |||
| @@ -475,7 +483,7 @@ | |||
| endDate = yesterday | |||
| saveFileName = this.pro_name+"_"+startDate+'_'+ endDate | |||
| saveFileName = this.alias+"_"+startDate+'_'+ endDate | |||
| break | |||
| } | |||
| case "last_month":{ | |||
| @@ -495,7 +503,7 @@ | |||
| var days = (monthEndDate - monthStartDate) / (1000 * 60 * 60 * 24) | |||
| endDate=this.saveFormatDate(lastYear, lastMonth+1, days); //月份从0开始,所以+1保存月份 | |||
| saveFileName = this.pro_name+"_"+startDate+'_'+ endDate | |||
| saveFileName = this.alias+"_"+startDate+'_'+ endDate | |||
| break | |||
| } | |||
| case "monthly":{ | |||
| @@ -504,7 +512,7 @@ | |||
| startDate = this.comparedate(startDate,this.recordBeginTime) | |||
| endDate = yesterday | |||
| saveFileName = this.pro_name+"_"+startDate+'_'+ endDate | |||
| saveFileName = this.alias+"_"+startDate+'_'+ endDate | |||
| break | |||
| } | |||
| case "current_year":{ | |||
| @@ -512,14 +520,14 @@ | |||
| startDate = this.comparedate(startDate,this.recordBeginTime) | |||
| endDate = yesterday | |||
| saveFileName = this.pro_name+"_"+startDate+'_'+ endDate | |||
| saveFileName = this.alias+"_"+startDate+'_'+ endDate | |||
| break | |||
| } | |||
| case "all":{ | |||
| console.log("e:"+today) | |||
| startDate = 'all' | |||
| endDate = yesterday | |||
| saveFileName = this.pro_name+'_所有' | |||
| saveFileName = this.alias+'_所有' | |||
| break | |||
| } | |||
| } | |||
| @@ -641,7 +649,7 @@ | |||
| this.tableData = res.data.pageRecords | |||
| this.totalPage=res.data.totalPage | |||
| this.totalNum = res.data.totalCount//this.totalPage*this.params.pagesize | |||
| console.log("this.totalPage:"+this.totalPage) | |||
| // console.log("this.totalPage:"+this.totalPage) | |||
| }) | |||
| }, | |||
| @@ -652,13 +660,14 @@ | |||
| this.getAllProList(this.params.type, this.dynamic) | |||
| }, | |||
| goToDetailPage(pro_id,pro_name,ownerName){ | |||
| goToDetailPage(pro_id,pro_name,ownerName,alias){ | |||
| this.currentPage=1 | |||
| document.getElementById("pro_main").style.display="none"; | |||
| document.getElementById("pro_detail").style.display="block"; | |||
| console.log(pro_id) | |||
| console.log(pro_name) | |||
| // console.log(pro_id) | |||
| // console.log(pro_name) | |||
| this.pro_name=pro_name; | |||
| this.alias=alias; | |||
| this.pro_id=pro_id; | |||
| this.ownerName=ownerName | |||
| this.getOneProData(pro_id); | |||