diff --git a/models/attachment.go b/models/attachment.go
index bb99ba467..6fb98a07d 100755
--- a/models/attachment.go
+++ b/models/attachment.go
@@ -82,6 +82,7 @@ type AttachmentsOptions struct {
NeedRepoInfo bool
Keyword string
RecommendOnly bool
+ UserId int64
}
func (a *Attachment) AfterUpdate() {
diff --git a/models/cloudbrain.go b/models/cloudbrain.go
index 1629acfeb..4b4c2c099 100755
--- a/models/cloudbrain.go
+++ b/models/cloudbrain.go
@@ -24,6 +24,7 @@ type ModelArtsJobStatus string
const (
TypeCloudBrainOne int = iota
TypeCloudBrainTwo
+ TypeIntelligentNet
TypeCloudBrainAll = -1
)
@@ -328,6 +329,11 @@ type CloudbrainsOptions struct {
JobTypeNot bool
NeedRepoInfo bool
RepoIDList []int64
+ BeginTime time.Time
+ EndTime time.Time
+ ComputeResource string
+ BeginTimeUnix int64
+ EndTimeUnix int64
}
type TaskPod struct {
@@ -1183,6 +1189,11 @@ func Cloudbrains(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int64, error) {
builder.Eq{"cloudbrain.job_id": opts.JobID},
)
}
+ if (opts.ComputeResource) != "" {
+ cond = cond.And(
+ builder.Eq{"cloudbrain.compute_resource": opts.ComputeResource},
+ )
+ }
if (opts.Type) >= 0 {
cond = cond.And(
@@ -1318,6 +1329,9 @@ func QueryModelTrainJobList(repoId int64) ([]*CloudbrainInfo, int, error) {
cond = cond.And(
builder.Eq{"job_type": "TRAIN"},
)
+ cond = cond.And(
+ builder.In("type", 0, 1),
+ )
cloudbrains := make([]*CloudbrainInfo, 0)
if err := sess.Select("job_id,display_job_name").Table(&Cloudbrain{}).Where(cond).OrderBy("created_unix DESC").
@@ -1504,6 +1518,11 @@ func UpdateJob(job *Cloudbrain) error {
return updateJob(x, job)
}
+func UpdateJobDurationWithDeleted(job *Cloudbrain) error {
+ _, err := x.Exec("update cloudbrain set start_time=?, end_time=?,train_job_duration=?,duration=? where id=?", job.StartTime, job.EndTime, job.TrainJobDuration, job.Duration, job.ID)
+ return err
+}
+
func updateJob(e Engine, job *Cloudbrain) error {
_, err := e.ID(job.ID).AllCols().Update(job)
return err
@@ -1574,6 +1593,10 @@ func GetStoppedJobWithNoDurationJob() ([]*Cloudbrain, error) {
Limit(100).
Find(&cloudbrains)
}
+func GetStoppedJobWithNoStartTimeEndTime() ([]*Cloudbrain, error) {
+ cloudbrains := make([]*Cloudbrain, 0)
+ return cloudbrains, x.SQL("select * from cloudbrain where status in (?,?,?,?,?,?,?) and (start_time is null or end_time is null) limit 100", ModelArtsTrainJobCompleted, ModelArtsTrainJobFailed, ModelArtsTrainJobKilled, ModelArtsStopped, JobStopped, JobFailed, JobSucceeded).Find(&cloudbrains)
+}
func GetCloudbrainCountByUserID(userID int64, jobType string) (int, error) {
count, err := x.In("status", JobWaiting, JobRunning).And("job_type = ? and user_id = ? and type = ?", jobType, userID, TypeCloudBrainOne).Count(new(Cloudbrain))
@@ -1650,13 +1673,80 @@ func RestartCloudbrain(old *Cloudbrain, new *Cloudbrain) (err error) {
func CloudbrainAll(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int64, error) {
sess := x.NewSession()
defer sess.Close()
+
var cond = builder.NewCond()
+ if opts.RepoID > 0 {
+ cond = cond.And(
+ builder.Eq{"cloudbrain.repo_id": opts.RepoID},
+ )
+ }
+
+ if opts.UserID > 0 {
+ cond = cond.And(
+ builder.Eq{"cloudbrain.user_id": opts.UserID},
+ )
+ }
+
+ if (opts.JobID) != "" {
+ cond = cond.And(
+ builder.Eq{"cloudbrain.job_id": opts.JobID},
+ )
+ }
+ if (opts.ComputeResource) != "" {
+ cond = cond.And(
+ builder.Eq{"cloudbrain.compute_resource": opts.ComputeResource},
+ )
+ }
+
if (opts.Type) >= 0 {
cond = cond.And(
builder.Eq{"cloudbrain.type": opts.Type},
)
}
+ if len(opts.JobTypes) > 0 {
+ if opts.JobTypeNot {
+ cond = cond.And(
+ builder.NotIn("cloudbrain.job_type", opts.JobTypes),
+ )
+ } else {
+ cond = cond.And(
+ builder.In("cloudbrain.job_type", opts.JobTypes),
+ )
+ }
+ }
+
+ if (opts.IsLatestVersion) != "" {
+ cond = cond.And(builder.Or(builder.And(builder.Eq{"cloudbrain.is_latest_version": opts.IsLatestVersion}, builder.Eq{"cloudbrain.job_type": "TRAIN"}), builder.Neq{"cloudbrain.job_type": "TRAIN"}))
+ }
+
+ if len(opts.CloudbrainIDs) > 0 {
+ cond = cond.And(builder.In("cloudbrain.id", opts.CloudbrainIDs))
+ }
+
+ if len(opts.JobStatus) > 0 {
+ if opts.JobStatusNot {
+ cond = cond.And(
+ builder.NotIn("cloudbrain.status", opts.JobStatus),
+ )
+ } else {
+ cond = cond.And(
+ builder.In("cloudbrain.status", opts.JobStatus),
+ )
+ }
+ }
+ if len(opts.RepoIDList) > 0 {
+ cond = cond.And(
+ builder.In("cloudbrain.repo_id", opts.RepoIDList),
+ )
+
+ }
+ if opts.BeginTimeUnix > 0 && opts.EndTimeUnix > 0 {
+ cond = cond.And(
+ builder.And(builder.Gte{"cloudbrain.created_unix": opts.BeginTimeUnix}, builder.Lte{"cloudbrain.created_unix": opts.EndTimeUnix}),
+ )
+ }
+
var count int64
var err error
condition := "cloudbrain.user_id = `user`.id"
@@ -1708,3 +1798,44 @@ func CloudbrainAll(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int64, error) {
return cloudbrains, count, nil
}
+func CloudbrainAllStatic(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int64, error) {
+ sess := x.NewSession()
+ defer sess.Close()
+
+ var cond = builder.NewCond()
+
+ if (opts.Type) >= 0 {
+ cond = cond.And(
+ builder.Eq{"cloudbrain.type": opts.Type},
+ )
+ }
+ if opts.BeginTimeUnix > 0 && opts.EndTimeUnix > 0 {
+ cond = cond.And(
+ builder.And(builder.Gte{"cloudbrain.created_unix": opts.BeginTimeUnix}, builder.Lte{"cloudbrain.created_unix": opts.EndTimeUnix}),
+ )
+ }
+ var count int64
+ var err error
+ count, err = sess.Unscoped().Where(cond).Count(new(Cloudbrain))
+
+ if err != nil {
+ return nil, 0, fmt.Errorf("Count: %v", err)
+ }
+
+ if opts.Page >= 0 && opts.PageSize > 0 {
+ var start int
+ if opts.Page == 0 {
+ start = 0
+ } else {
+ start = (opts.Page - 1) * opts.PageSize
+ }
+ sess.Limit(opts.PageSize, start)
+ }
+ sess.OrderBy("cloudbrain.created_unix DESC")
+ cloudbrains := make([]*CloudbrainInfo, 0, setting.UI.IssuePagingNum)
+ if err := sess.Cols("status", "type", "job_type", "train_job_duration", "duration", "compute_resource", "created_unix", "start_time", "end_time").Table(&Cloudbrain{}).Unscoped().Where(cond).
+ Find(&cloudbrains); err != nil {
+ return nil, 0, fmt.Errorf("Find: %v", err)
+ }
+ return cloudbrains, count, nil
+}
diff --git a/models/cloudbrain_static.go b/models/cloudbrain_static.go
index 31f66d4fc..03cd7d2bc 100644
--- a/models/cloudbrain_static.go
+++ b/models/cloudbrain_static.go
@@ -1,6 +1,191 @@
package models
-import "code.gitea.io/gitea/modules/log"
+import (
+ "strconv"
+ "time"
+
+ "code.gitea.io/gitea/modules/log"
+ "code.gitea.io/gitea/modules/timeutil"
+ "code.gitea.io/gitea/modules/util"
+ "xorm.io/builder"
+)
+
+type TaskDetail struct {
+ ID int64 `json:"ID"`
+ JobID string `json:"JobID"`
+ JobName string `json:"JobName"`
+ DisplayJobName string `json:"DisplayJobName"`
+ Status string `json:"Status"`
+ JobType string `json:"JobType"`
+ CreatedUnix timeutil.TimeStamp `json:"CreatedUnix"`
+ WaitTime string `json:"WaitTime"`
+ RunTime string `json:"RunTime"`
+ StartTime timeutil.TimeStamp `json:"StartTime"`
+ EndTime timeutil.TimeStamp `json:"EndTime"`
+ ComputeResource string `json:"ComputeResource"`
+ Type int `json:"Type"`
+ UserName string `json:"UserName"`
+ RepoName string `json:"RepoName"`
+ RepoAlias string `json:"RepoAlias"`
+ RepoID int64 `json:"RepoID"`
+ IsDelete bool `json:"IsDelete"`
+}
+
+func GetDebugOnePeriodCount(beginTime time.Time, endTime time.Time) (int64, error) {
+ countSql := "SELECT count(*) FROM " +
+ "public.cloudbrain where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) +
+ " and created_unix<" + strconv.FormatInt(endTime.Unix(), 10) +
+ " and job_type ='" + string(JobTypeDebug) + "'" +
+ " and type='" + strconv.Itoa(TypeCloudBrainOne) + "'"
+
+ return x.SQL(countSql).Count()
+}
+func GetDebugOnePeriodDuration(beginTime time.Time, endTime time.Time) (int64, error) {
+ total, err := x.Where("created_unix >= ? And created_unix < ? And job_type = ? And type = ? ", strconv.FormatInt(beginTime.Unix(), 10), strconv.FormatInt(endTime.Unix(), 10), JobTypeDebug, TypeCloudBrainOne).SumInt(&Cloudbrain{}, "duration")
+ if err != nil {
+ return 0, err
+ }
+
+ return total, nil
+}
+
+func GetTrainOnePeriodCount(beginTime time.Time, endTime time.Time) (int64, error) {
+ countSql := "SELECT count(*) FROM " +
+ "public.cloudbrain where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) +
+ " and created_unix<" + strconv.FormatInt(endTime.Unix(), 10) +
+ " and job_type ='" + string(JobTypeTrain) + "'" +
+ " and type='" + strconv.Itoa(TypeCloudBrainOne) + "'"
+
+ return x.SQL(countSql).Count()
+}
+func GetTrainOnePeriodDuration(beginTime time.Time, endTime time.Time) (int64, error) {
+ total, err := x.Where("created_unix >= ? And created_unix < ? And job_type = ? And type = ? ", strconv.FormatInt(beginTime.Unix(), 10), strconv.FormatInt(endTime.Unix(), 10), JobTypeTrain, TypeCloudBrainOne).SumInt(&Cloudbrain{}, "duration")
+ if err != nil {
+ return 0, err
+ }
+
+ return total, nil
+}
+
+func GetBenchmarkOnePeriodCount(beginTime time.Time, endTime time.Time) (int64, error) {
+ countSql := "SELECT count(*) FROM " +
+ "public.cloudbrain where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) +
+ " and created_unix<" + strconv.FormatInt(endTime.Unix(), 10) +
+ " and job_type ='" + string(JobTypeBenchmark) + "'" +
+ " and type='" + strconv.Itoa(TypeCloudBrainOne) + "'"
+ return x.SQL(countSql).Count()
+}
+func GetBenchmarkOnePeriodDuration(beginTime time.Time, endTime time.Time) (int64, error) {
+ total, err := x.Where("created_unix >= ? And created_unix < ? And job_type = ? And type = ? ", strconv.FormatInt(beginTime.Unix(), 10), strconv.FormatInt(endTime.Unix(), 10), JobTypeBenchmark, TypeCloudBrainOne).SumInt(&Cloudbrain{}, "duration")
+ if err != nil {
+ return 0, err
+ }
+
+ return total, nil
+}
+func GetDebugTwoPeriodCount(beginTime time.Time, endTime time.Time) (int64, error) {
+ countSql := "SELECT count(*) FROM " +
+ "public.cloudbrain where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) +
+ " and created_unix<" + strconv.FormatInt(endTime.Unix(), 10) +
+ " and job_type ='" + string(JobTypeDebug) + "'" +
+ " and type='" + strconv.Itoa(TypeCloudBrainTwo) + "'"
+ return x.SQL(countSql).Count()
+}
+func GetDebugTwoPeriodDuration(beginTime time.Time, endTime time.Time) (int64, error) {
+ total, err := x.Where("created_unix >= ? And created_unix < ? And job_type = ? And type = ? ", strconv.FormatInt(beginTime.Unix(), 10), strconv.FormatInt(endTime.Unix(), 10), JobTypeDebug, TypeCloudBrainTwo).SumInt(&Cloudbrain{}, "duration")
+ if err != nil {
+ return 0, err
+ }
+ return total, nil
+}
+func GetTrainTwoPeriodCount(beginTime time.Time, endTime time.Time) (int64, error) {
+ countSql := "SELECT count(*) FROM " +
+ "public.cloudbrain where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) +
+ " and created_unix<" + strconv.FormatInt(endTime.Unix(), 10) +
+ " and job_type ='" + string(JobTypeTrain) + "'" +
+ " and type='" + strconv.Itoa(TypeCloudBrainTwo) + "'"
+ return x.SQL(countSql).Count()
+}
+func GetTrainTwoPeriodDuration(beginTime time.Time, endTime time.Time) (int64, error) {
+ total, err := x.Where("created_unix >= ? And created_unix < ? And job_type = ? And type = ? ", strconv.FormatInt(beginTime.Unix(), 10), strconv.FormatInt(endTime.Unix(), 10), JobTypeTrain, TypeCloudBrainTwo).SumInt(&Cloudbrain{}, "duration")
+ if err != nil {
+ return 0, err
+ }
+ return total, nil
+}
+func GetInferenceTwoPeriodCount(beginTime time.Time, endTime time.Time) (int64, error) {
+ countSql := "SELECT count(*) FROM " +
+ "public.cloudbrain where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) +
+ " and created_unix<" + strconv.FormatInt(endTime.Unix(), 10) +
+ " and job_type ='" + string(JobTypeInference) + "'" +
+ " and type='" + strconv.Itoa(TypeCloudBrainTwo) + "'"
+ return x.SQL(countSql).Count()
+}
+func GetInferenceTwoPeriodDuration(beginTime time.Time, endTime time.Time) (int64, error) {
+ total, err := x.Where("created_unix >= ? And created_unix < ? And job_type = ? And type = ? ", strconv.FormatInt(beginTime.Unix(), 10), strconv.FormatInt(endTime.Unix(), 10), JobTypeInference, TypeCloudBrainTwo).SumInt(&Cloudbrain{}, "duration")
+ if err != nil {
+ return 0, err
+ }
+ return total, nil
+}
+
+func GetCloudBrainOnePeriodCount(beginTime time.Time, endTime time.Time) (int64, error) {
+ countSql := "SELECT count(*) FROM " +
+ "public.cloudbrain where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) +
+ " and created_unix<" + strconv.FormatInt(endTime.Unix(), 10) +
+ " and type='" + strconv.Itoa(TypeCloudBrainOne) + "'"
+ return x.SQL(countSql).Count()
+}
+func GetCloudBrainOnePeriodDuration(beginTime time.Time, endTime time.Time) (int64, error) {
+ total, err := x.Where("created_unix >= ? And created_unix < ? And type = ? ", strconv.FormatInt(beginTime.Unix(), 10), strconv.FormatInt(endTime.Unix(), 10), TypeCloudBrainOne).SumInt(&Cloudbrain{}, "duration")
+ if err != nil {
+ return 0, err
+ }
+ return total, nil
+}
+func GetCloudBrainTwoPeriodCount(beginTime time.Time, endTime time.Time) (int64, error) {
+ countSql := "SELECT count(*) FROM " +
+ "public.cloudbrain where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) +
+ " and created_unix<" + strconv.FormatInt(endTime.Unix(), 10) +
+ " and type='" + strconv.Itoa(TypeCloudBrainTwo) + "'"
+ return x.SQL(countSql).Count()
+}
+func GetCloudBrainTwoPeriodDuration(beginTime time.Time, endTime time.Time) (int64, error) {
+ total, err := x.Where("created_unix >= ? And created_unix < ? And type = ? ", strconv.FormatInt(beginTime.Unix(), 10), strconv.FormatInt(endTime.Unix(), 10), TypeCloudBrainTwo).SumInt(&Cloudbrain{}, "duration")
+ if err != nil {
+ return 0, err
+ }
+ return total, nil
+}
+
+func GetTodayCreatorCount(beginTime time.Time, endTime time.Time) (int64, error) {
+ countSql := "SELECT count(distinct user_id) FROM " +
+ "public.cloudbrain where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) +
+ " and created_unix<" + strconv.FormatInt(endTime.Unix(), 10)
+ return x.SQL(countSql).Count()
+}
+func GetTodayCloudbrainCount(beginTime time.Time, endTime time.Time) (int64, error) {
+ countSql := "SELECT count FROM " +
+ "public.cloudbrain where created_unix >=" + strconv.FormatInt(beginTime.Unix(), 10) +
+ " and created_unix<=" + strconv.FormatInt(endTime.Unix(), 10)
+ return x.SQL(countSql).Count()
+}
+func GetCreatorCount() (int64, error) {
+ countSql := "SELECT count(distinct user_id) FROM public.cloudbrain"
+ return x.SQL(countSql).Count()
+}
+
+func GetRecordBeginTime() ([]*CloudbrainInfo, error) {
+ sess := x.NewSession()
+ defer sess.Close()
+ sess.OrderBy("cloudbrain.id ASC limit 1")
+ cloudbrains := make([]*CloudbrainInfo, 0)
+ if err := sess.Table(&Cloudbrain{}).Unscoped().
+ Find(&cloudbrains); err != nil {
+ log.Info("find error.")
+ }
+ return cloudbrains, nil
+}
func GetAllStatusCloudBrain() map[string]int {
sess := x.NewSession()
@@ -20,3 +205,87 @@ func GetAllStatusCloudBrain() map[string]int {
}
return cloudBrainStatusResult
}
+
+func GetWaittingTop() ([]*CloudbrainInfo, error) {
+ sess := x.NewSession()
+ defer sess.Close()
+ var cond = builder.NewCond()
+ cond = cond.And(
+ builder.Eq{"cloudbrain.status": string(JobWaiting)},
+ )
+ sess.OrderBy("cloudbrain.created_unix ASC limit 10")
+ cloudbrains := make([]*CloudbrainInfo, 0, 10)
+ if err := sess.Table(&Cloudbrain{}).Where(cond).
+ Find(&cloudbrains); err != nil {
+ log.Info("find error.")
+ }
+ return cloudbrains, nil
+}
+func GetRunningTop() ([]*CloudbrainInfo, error) {
+ sess := x.NewSession()
+ defer sess.Close()
+ var cond = builder.NewCond()
+ cond = cond.And(
+ builder.Eq{"cloudbrain.status": string(JobRunning)},
+ )
+ sess.OrderBy("cloudbrain.duration DESC limit 10")
+ cloudbrains := make([]*CloudbrainInfo, 0, 10)
+ if err := sess.Table(&Cloudbrain{}).Where(cond).
+ Find(&cloudbrains); err != nil {
+ log.Info("find error.")
+ }
+ return cloudbrains, nil
+}
+
+func getCreatePeriodCount(dateBeginTime string, dateEndTime string, hourBeginTime string, hourEndTime string) (int64, error) {
+ countSql := "SELECT count(*) FROM " +
+ "public.cloudbrain where to_char(to_timestamp(created_unix), 'YYYY-MM-DD') >= '" + dateBeginTime +
+ "' and to_char(to_timestamp(created_unix), 'YYYY-MM-DD') < '" + dateEndTime +
+ "' and to_char(to_timestamp(created_unix), 'HH24:MI:SS') >= '" + hourBeginTime +
+ "' and to_char(to_timestamp(created_unix), 'HH24:MI:SS') < '" + hourEndTime + "'"
+ return x.SQL(countSql).Count()
+}
+
+//SELECT * FROM xxx WHERE NOT ((endTime < hourBeginTime) OR (startTime > hourEndTime))
+func getRunPeriodCount(dateBeginTime string, dateEndTime string, hourBeginTime string, hourEndTime string) (int64, error) {
+ countSql := "SELECT count(*) FROM " +
+ "public.cloudbrain where not ((to_char(to_timestamp(start_time), ' HH24:MI:SS') > '" + hourEndTime +
+ "') or (to_char(to_timestamp(end_time), 'HH24:MI:SS') < '" + hourBeginTime + "'))" +
+ " and (to_char(to_timestamp(start_time), 'YYYY-MM-DD') >= '" + dateBeginTime +
+ "' and to_char(to_timestamp(start_time), 'YYYY-MM-DD') < '" + dateEndTime + "')"
+ return x.SQL(countSql).Count()
+
+}
+
+func GetCreateHourPeriodCount(dateBeginTime string, dateEndTime string) (map[string]interface{}, error) {
+ //0 to 23 for each hour,
+ dateHourMap := make(map[string]interface{})
+ var slice = []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}
+ for key, value := range slice {
+ hourBeginHour := util.AddZero(value) + ":00:00"
+ hourEndHour := util.AddZero(value+1) + ":00:00"
+ cout, err := getCreatePeriodCount(dateBeginTime, dateEndTime, hourBeginHour, hourEndHour)
+ if err != nil {
+ log.Error("Can not query getCreatePeriodCount.", err)
+ return nil, nil
+ }
+ dateHourMap[strconv.Itoa(key)] = cout
+ }
+ return dateHourMap, nil
+}
+
+func GetRunHourPeriodCount(dateBeginTime string, dateEndTime string) (map[string]interface{}, error) {
+ dateHourMap := make(map[string]interface{})
+ var slice = []int64{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}
+ for key, value := range slice {
+ hourBeginHour := util.AddZero(value) + ":00:00"
+ hourEndHour := util.AddZero(value+1) + ":00:00"
+ cout, err := getRunPeriodCount(dateBeginTime, dateEndTime, hourBeginHour, hourEndHour)
+ if err != nil {
+ log.Error("Can not query getRunPeriodCount.", err)
+ return nil, nil
+ }
+ dateHourMap[strconv.Itoa(key)] = cout
+ }
+ return dateHourMap, nil
+}
diff --git a/models/dataset.go b/models/dataset.go
index 726a5010f..b7186ac0b 100755
--- a/models/dataset.go
+++ b/models/dataset.go
@@ -107,6 +107,7 @@ type SearchDatasetOptions struct {
Category string
Task string
License string
+ DatasetIDs []int64
ListOptions
SearchOrderBy
IsOwner bool
@@ -177,6 +178,12 @@ func SearchDatasetCondition(opts *SearchDatasetOptions) builder.Cond {
}
}
+ if len(opts.DatasetIDs) > 0 {
+ subCon := builder.NewCond()
+ subCon = subCon.And(builder.In("dataset.id", opts.DatasetIDs))
+ cond = cond.Or(subCon)
+ }
+
return cond
}
@@ -447,3 +454,11 @@ func IncreaseDownloadCount(datasetID int64) error {
return nil
}
+
+func GetCollaboratorDatasetIdsByUserID(userID int64) []int64 {
+ var datasets []int64
+ _ = x.Table("dataset").Join("INNER", "collaboration", "dataset.repo_id = collaboration.repo_id and collaboration.mode>0 and collaboration.user_id=?", userID).
+ Cols("dataset.id").Find(&datasets)
+ return datasets
+
+}
diff --git a/models/user.go b/models/user.go
index 7d4c8ce34..dd5a6f1d2 100755
--- a/models/user.go
+++ b/models/user.go
@@ -6,7 +6,6 @@
package models
import (
- "code.gitea.io/gitea/modules/blockchain"
"container/list"
"context"
"crypto/md5"
@@ -25,6 +24,8 @@ import (
"time"
"unicode/utf8"
+ "code.gitea.io/gitea/modules/blockchain"
+
"code.gitea.io/gitea/modules/avatar"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/generate"
@@ -1498,6 +1499,17 @@ func GetUsersByIDs(ids []int64) (UserList, error) {
return ous, err
}
+func GetUsersByNames(names []string) (UserList, error) {
+ ous := make([]*User, 0, len(names))
+ if len(names) == 0 {
+ return ous, nil
+ }
+ err := x.In("name", names).
+ Asc("name").
+ Find(&ous)
+ return ous, err
+}
+
// GetUserIDsByNames returns a slice of ids corresponds to names.
func GetUserIDsByNames(names []string, ignoreNonExistent bool) ([]int64, error) {
ids := make([]int64, 0, len(names))
diff --git a/modules/cloudbrain/cloudbrain.go b/modules/cloudbrain/cloudbrain.go
index a71389741..8fb13ca4c 100755
--- a/modules/cloudbrain/cloudbrain.go
+++ b/modules/cloudbrain/cloudbrain.go
@@ -187,7 +187,7 @@ func AdminOrImageCreaterRight(ctx *context.Context) {
}
-func GenerateTask(ctx *context.Context, displayJobName, jobName, image, command, uuid, codePath, modelPath, benchmarkPath, snn4imagenetPath, brainScorePath, jobType, gpuQueue, description, branchName, bootFile, params string, benchmarkTypeID, benchmarkChildTypeID, resourceSpecId int) error {
+func GenerateTask(ctx *context.Context, displayJobName, jobName, image, command, uuid, codePath, modelPath, benchmarkPath, snn4imagenetPath, brainScorePath, jobType, gpuQueue, description, branchName, bootFile, params, commitID string, benchmarkTypeID, benchmarkChildTypeID, resourceSpecId int) error {
dataActualPath := setting.Attachment.Minio.RealPath +
setting.Attachment.Minio.Bucket + "/" +
@@ -336,6 +336,7 @@ func GenerateTask(ctx *context.Context, displayJobName, jobName, image, command,
Parameters: params,
CreatedUnix: createTime,
UpdatedUnix: createTime,
+ CommitID: commitID,
})
if err != nil {
diff --git a/modules/modelarts/resty.go b/modules/modelarts/resty.go
index 961e02538..6a2803cb1 100755
--- a/modules/modelarts/resty.go
+++ b/modules/modelarts/resty.go
@@ -1131,7 +1131,7 @@ sendjob:
res, err := client.R().
SetAuthToken(TOKEN).
SetResult(&result).
- Get(HOST + "/v1/" + setting.ProjectID + urlTrainJob + "/" + jobID + "/versions/" + versionID + "/pod/" + podName + "/metric-statistic")
+ Get(HOST + "/v1/" + setting.ProjectID + urlTrainJob + "/" + jobID + "/versions/" + versionID + "/pod/" + podName + "/metric-statistic?statistic_type=each")
if err != nil {
return nil, fmt.Errorf("resty GetTrainJobMetricStatistic: %v", err)
diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini
index ec5b17cb1..c6f42ddf5 100755
--- a/options/locale/locale_zh-CN.ini
+++ b/options/locale/locale_zh-CN.ini
@@ -1020,13 +1020,16 @@ balance.total_view=余额总览
balance.available=可用余额:
cloudbrain1=云脑1
cloudbrain2=云脑2
+intelligent_net=智算网络
cloudbrain_selection=云脑选择
cloudbrain_platform_selection=选择您准备使用的云脑平台:
confirm_choice=确定
cloudbran1_tips=只有zip格式的数据集才能发起云脑任务
cloudbrain_creator=创建者
+cloudbrain_type=支撑算力
+cloudbrain_untype=未知支撑算力
cloudbrain_task=任务名称
-cloudbrain_task_type=任务类型
+cloudbrain_task_type=云脑任务类型
cloudbrain_task_name=云脑侧任务名称
cloudbrain_operate=操作
cloudbrain_status_createtime=状态/创建时间
@@ -1060,6 +1063,7 @@ computing.success=加入成功
modelarts.status=状态
modelarts.createtime=创建时间
+modelarts.deletetime=删除时间
modelarts.version_nums=版本数
modelarts.version=版本
modelarts.computing_resources=计算资源
@@ -1090,8 +1094,8 @@ modelarts.train_job.job_status=任务状态
modelarts.train_job.job_name=任务名称
modelarts.train_job.version=任务版本
modelarts.train_job.start_time=开始运行时间
-modelarts.train_job.end_time=运行结束时间
-modelarts.train_job.wait_time=等待时间
+modelarts.train_job.end_time=结束运行时间
+modelarts.train_job.wait_time=等待时长
modelarts.train_job.dura_time=运行时长
modelarts.train_job.description=任务描述
modelarts.train_job.parameter_setting=参数设置
@@ -1416,7 +1420,7 @@ issues.label_templates.helper=选择标签模板
issues.label_templates.use=使用标签集
issues.label_templates.fail_to_load_file=加载标签模板文件 '%s' 时发生错误:%v
issues.add_label_at=添加了标签
%s
%s
-issues.remove_label_at=删除了 %s
label %s 标签
+issues.remove_label_at=删除了标签 %s
%s
issues.add_milestone_at=` %[2]s 添加了里程碑 %[1]s`
issues.change_milestone_at=`%[3]s 修改了里程碑从 %[1]s 到 %[2]s`
issues.remove_milestone_at=`%[2]s 删除了里程碑 %[1]s`
diff --git a/public/home/home.js b/public/home/home.js
index 9754de0cb..7343dba0b 100755
--- a/public/home/home.js
+++ b/public/home/home.js
@@ -217,9 +217,9 @@ function refresh3DInfo(record){
//console.log("cloudbrain two line length=" + lines.length);
var span = $('.rotation3D__line').find("span")[1];
//console.log(span);
- span.innerText =record.RefName;
- //$('.rotation3D__line').find("span").eq(1).text(record.RefName)
- //lines[1].find("span").text(record.RefName);
+ if(span != null){
+ span.innerText =record.RefName;
+ }
}
}
@@ -452,48 +452,12 @@ function queryRecommendData(){
displayOrg(json.org);
displayRepo(json.repo);
displayActivity(json.image);
- displayCloudBrain(json.cloudbrain)
},
error:function(response) {
}
});
-
- // $.ajax({
- // type:"GET",
- // url:"/recommend/repo",
- // headers: {
- // authorization:token,
- // },
- // dataType:"json",
- // async:false,
- // success:function(json){
- // displayRepo(json);
- // },
- // error:function(response) {
- // }
- // });
-
- // $.ajax({
- // type:"GET",
- // url:"/recommend/imageinfo",
- // headers: {
- // authorization:token,
- // },
- // dataType:"json",
- // async:false,
- // success:function(json){
- // displayActivity(json);
- // },
- // error:function(response) {
- // }
- // });
}
-function displayCloudBrain(json){
- $('#completed_task').text(json.completed_task);
- $('#running_task').text(json.running_task);
- $('#wait_task').text(json.wait_task);
-}
function displayActivity(json){
var activityDiv = document.getElementById("recommendactivity");
diff --git a/public/home/search.js b/public/home/search.js
index 2fac95358..f9e815da3 100644
--- a/public/home/search.js
+++ b/public/home/search.js
@@ -1,1312 +1,1722 @@
var token;
-if(isEmpty(token)){
- var meta = $("meta[name=_uid]");
- if(!isEmpty(meta)){
- token = meta.attr("content");
- console.log("token is uid:" + token);
- }
+if (isEmpty(token)) {
+ var meta = $("meta[name=_uid]");
+ if (!isEmpty(meta)) {
+ token = meta.attr("content");
+ }
}
-var html =document.documentElement;
-var lang = html.attributes["lang"]
+var html = document.documentElement;
+var lang = html.attributes["lang"];
var isZh = true;
-if(lang != null && lang.nodeValue =="en-US" ){
- console.log("the language is " + lang.nodeValue);
- isZh=false;
-}else{
- console.log("default lang=zh");
+if (lang != null && lang.nodeValue == "en-US") {
+ isZh = false;
+} else {
}
-function isEmpty(str){
- if(typeof str == "undefined" || str == null || str == ""){
- return true;
- }
- return false;
+function isEmpty(str) {
+ if (typeof str == "undefined" || str == null || str == "") {
+ return true;
+ }
+ return false;
}
-var itemType={
- "1":"repository",
- "2":"issue",
- "3":"user",
- "4":"org",
- "5":"dataset",
- "6":"pr"
+var itemType = {
+ 1: "repository",
+ 2: "issue",
+ 3: "user",
+ 4: "org",
+ 5: "dataset",
+ 6: "pr",
};
-var sortBy={
- "10":"default",
- "11":"updated_unix.keyword",
- "12":"num_watches",
- "13":"num_stars",
- "14":"num_forks",
- "20":"default",
- "21":"updated_unix.keyword",
- "30":"default",
- "31":"name.keyword",
- "32":"name.keyword",
- "33":"created_unix.keyword",
- "34":"created_unix.keyword",
- "40":"default",
- "41":"name.keyword",
- "42":"name.keyword",
- "43":"created_unix.keyword",
- "44":"created_unix.keyword",
- "50":"default",
- "51":"download_times",
- "60":"default",
- "61":"updated_unix.keyword"
+var sortBy = {
+ 10: "default",
+ 11: "updated_unix.keyword",
+ 12: "num_watches",
+ 13: "num_stars",
+ 14: "num_forks",
+ 20: "default",
+ 21: "updated_unix.keyword",
+ 30: "default",
+ 31: "name.keyword",
+ 32: "name.keyword",
+ 33: "created_unix.keyword",
+ 34: "created_unix.keyword",
+ 40: "default",
+ 41: "name.keyword",
+ 42: "name.keyword",
+ 43: "created_unix.keyword",
+ 44: "created_unix.keyword",
+ 50: "default",
+ 51: "download_times",
+ 60: "default",
+ 61: "updated_unix.keyword",
};
-var sortAscending={
- "10":"false",
- "11":"false",
- "12":"false",
- "13":"false",
- "14":"false",
- "20":"false",
- "21":"false",
- "30":"false",
- "31":"true",
- "32":"false",
- "33":"false",
- "34":"true",
- "40":"false",
- "41":"true",
- "42":"false",
- "43":"false",
- "44":"true",
- "50":"false",
- "51":"false",
- "60":"false",
- "61":"false"
+var sortAscending = {
+ 10: "false",
+ 11: "false",
+ 12: "false",
+ 13: "false",
+ 14: "false",
+ 20: "false",
+ 21: "false",
+ 30: "false",
+ 31: "true",
+ 32: "false",
+ 33: "false",
+ 34: "true",
+ 40: "false",
+ 41: "true",
+ 42: "false",
+ 43: "false",
+ 44: "true",
+ 50: "false",
+ 51: "false",
+ 60: "false",
+ 61: "false",
};
var currentPage = 1;
var pageSize = 15;
-var currentSearchTableName ="repository";
-var currentSearchKeyword="";
-var currentSearchSortBy="";
-var currentSearchAscending="false";
-var OnlySearchLabel=false;
-var startIndex =1;
+var currentSearchTableName = "repository";
+var currentSearchKeyword = "";
+var currentSearchSortBy = "";
+var currentSearchAscending = "false";
+var OnlySearchLabel = false;
+var startIndex = 1;
var endIndex = 5;
var totalPage = 1;
var totalNum = 0;
var privateTotal = 0;
-function initPageInfo(){
- currentPage = 1;
- startIndex =1;
- endIndex = 5;
+function initPageInfo() {
+ currentPage = 1;
+ startIndex = 1;
+ endIndex = 5;
}
-function searchItem(type,sortType){
- console.log("enter item 2.");
- if(OnlySearchLabel){
- doSearchLabel(currentSearchTableName,currentSearchKeyword,sortBy[sortType],sortAscending[sortType])
- }else{
- currentSearchKeyword = document.getElementById("keyword_input").value;
- if(!isEmpty(currentSearchKeyword)){
- initPageInfo();
- currentSearchTableName = itemType[type];
- currentSearchSortBy = sortBy[sortType];
- currentSearchAscending = sortAscending[sortType];
- OnlySearchLabel =false;
- page(currentPage);
- }else{
- emptySearch();
- }
- }
-}
-
-
-
-function search(){
- console.log("enter here 1.");
+function searchItem(type, sortType) {
+ if (OnlySearchLabel) {
+ doSearchLabel(
+ currentSearchTableName,
+ currentSearchKeyword,
+ sortBy[sortType],
+ sortAscending[sortType]
+ );
+ } else {
currentSearchKeyword = document.getElementById("keyword_input").value;
- if(!isEmpty(currentSearchKeyword)){
- currentSearchKeyword = currentSearchKeyword.trim();
- }
- if(!isEmpty(currentSearchKeyword)){
- doSpcifySearch(currentSearchTableName,currentSearchKeyword,sortBy[10],"false");
- }else{
- emptySearch();
+ if (!isEmpty(currentSearchKeyword)) {
+ initPageInfo();
+ currentSearchTableName = itemType[type];
+ currentSearchSortBy = sortBy[sortType];
+ currentSearchAscending = sortAscending[sortType];
+ OnlySearchLabel = false;
+ page(currentPage);
+ } else {
+ emptySearch();
}
+ }
}
-function emptySearch(){
- initDiv(false);
- initPageInfo();
- $('#searchForm').addClass("hiddenSearch");
- document.getElementById("find_id").innerHTML=getLabel(isZh,"search_empty");
- $('#find_title').html("");
- document.getElementById("sort_type").innerHTML="";
- document.getElementById("child_search_item").innerHTML="";
- document.getElementById("page_menu").innerHTML="";
- $('#repo_total').text("");
- $('#pr_total').text("");
- $('#issue_total').text("");
- $('#dataset_total').text("");
- $('#user_total').text("");
- $('#org_total').text("");
- setActivate(null);
+function search() {
+ currentSearchKeyword = document.getElementById("keyword_input").value;
+ if (!isEmpty(currentSearchKeyword)) {
+ currentSearchKeyword = currentSearchKeyword.trim();
+ }
+ if (!isEmpty(currentSearchKeyword)) {
+ doSpcifySearch(
+ currentSearchTableName,
+ currentSearchKeyword,
+ sortBy[10],
+ "false"
+ );
+ } else {
+ emptySearch();
+ }
}
-function initDiv(isSearchLabel=false){
- if(isSearchLabel){
- document.getElementById("search_div").style.display="none";
- document.getElementById("search_label_div").style.display="block";
- document.getElementById("dataset_item").style.display="none";
- document.getElementById("issue_item").style.display="none";
- document.getElementById("pr_item").style.display="none";
- document.getElementById("user_item").style.display="none";
- document.getElementById("org_item").style.display="none";
- document.getElementById("find_id").innerHTML="";
- }else{
- document.getElementById("search_div").style.display="block";
- document.getElementById("search_label_div").style.display="none";
- document.getElementById("dataset_item").style.display="block";
- document.getElementById("issue_item").style.display="block";
- document.getElementById("pr_item").style.display="block";
- document.getElementById("user_item").style.display="block";
- document.getElementById("org_item").style.display="block";
- document.getElementById("find_id").innerHTML=getLabel(isZh,"search_finded");
- }
+function emptySearch() {
+ initDiv(false);
+ initPageInfo();
+ $("#searchForm").addClass("hiddenSearch");
+ document.getElementById("find_id").innerHTML = getLabel(isZh, "search_empty");
+ $("#find_title").html("");
+ document.getElementById("sort_type").innerHTML = "";
+ document.getElementById("child_search_item").innerHTML = "";
+ document.getElementById("page_menu").innerHTML = "";
+ $("#repo_total").text("");
+ $("#pr_total").text("");
+ $("#issue_total").text("");
+ $("#dataset_total").text("");
+ $("#user_total").text("");
+ $("#org_total").text("");
+ setActivate(null);
}
-function doSpcifySearch(tableName,keyword,sortBy="",ascending="false"){
- initDiv(false);
- $('#searchForm').addClass("hiddenSearch");
- document.getElementById("find_id").innerHTML=getLabel(isZh,"search_finded");
- currentSearchKeyword = keyword;
- initPageInfo();
- currentSearchTableName = tableName;
- currentSearchSortBy = sortBy;
- currentSearchAscending = ascending;
- OnlySearchLabel =false;
-
- page(currentPage);
-
- if(currentSearchTableName != "repository"){
- doSearch("repository",currentSearchKeyword,1,pageSize,true,"",false);
- }
- if(currentSearchTableName != "issue"){
- doSearch("issue",currentSearchKeyword,1,pageSize,true,"",false);
- }
- if(currentSearchTableName != "user"){
- doSearch("user",currentSearchKeyword,1,pageSize,true,"",false);
- }
- if(currentSearchTableName != "org"){
- doSearch("org",currentSearchKeyword,1,pageSize,true,"",false);
- }
- if(currentSearchTableName != "dataset"){
- doSearch("dataset",currentSearchKeyword,1,pageSize,true,"",false);
- }
- if(currentSearchTableName != "pr"){
- doSearch("pr",currentSearchKeyword,1,pageSize,true,"",false);
- }
+function initDiv(isSearchLabel = false) {
+ if (isSearchLabel) {
+ document.getElementById("search_div").style.display = "none";
+ document.getElementById("search_label_div").style.display = "block";
+ document.getElementById("dataset_item").style.display = "none";
+ document.getElementById("issue_item").style.display = "none";
+ document.getElementById("pr_item").style.display = "none";
+ document.getElementById("user_item").style.display = "none";
+ document.getElementById("org_item").style.display = "none";
+ document.getElementById("find_id").innerHTML = "";
+ } else {
+ document.getElementById("search_div").style.display = "block";
+ document.getElementById("search_label_div").style.display = "none";
+ document.getElementById("dataset_item").style.display = "block";
+ document.getElementById("issue_item").style.display = "block";
+ document.getElementById("pr_item").style.display = "block";
+ document.getElementById("user_item").style.display = "block";
+ document.getElementById("org_item").style.display = "block";
+ document.getElementById("find_id").innerHTML = getLabel(
+ isZh,
+ "search_finded"
+ );
+ }
}
-function doSearchLabel(tableName,keyword,sortBy="",ascending="false"){
- initDiv(true);
- //document.getElementById("search_div").style.display="none";
- //document.getElementById("search_label_div").style.display="block";
- document.getElementById("search_label_div").innerHTML="#" + keyword + "
";
-
- currentSearchKeyword = keyword;
- initPageInfo();
- currentSearchTableName = tableName;
- currentSearchSortBy = sortBy;
- currentSearchAscending = ascending;
- OnlySearchLabel =true;
-
- page(currentPage);
+function doSpcifySearch(tableName, keyword, sortBy = "", ascending = "false") {
+ initDiv(false);
+ $("#searchForm").addClass("hiddenSearch");
+ document.getElementById("find_id").innerHTML = getLabel(
+ isZh,
+ "search_finded"
+ );
+ currentSearchKeyword = keyword;
+ initPageInfo();
+ currentSearchTableName = tableName;
+ currentSearchSortBy = sortBy;
+ currentSearchAscending = ascending;
+ OnlySearchLabel = false;
+
+ page(currentPage);
+
+ if (currentSearchTableName != "repository") {
+ doSearch("repository", currentSearchKeyword, 1, pageSize, true, "", false);
+ }
+ if (currentSearchTableName != "issue") {
+ doSearch("issue", currentSearchKeyword, 1, pageSize, true, "", false);
+ }
+ if (currentSearchTableName != "user") {
+ doSearch("user", currentSearchKeyword, 1, pageSize, true, "", false);
+ }
+ if (currentSearchTableName != "org") {
+ doSearch("org", currentSearchKeyword, 1, pageSize, true, "", false);
+ }
+ if (currentSearchTableName != "dataset") {
+ doSearch("dataset", currentSearchKeyword, 1, pageSize, true, "", false);
+ }
+ if (currentSearchTableName != "pr") {
+ doSearch("pr", currentSearchKeyword, 1, pageSize, true, "", false);
+ }
}
-function searchLabel(tableName,keyword,sortBy="",ascending="false"){
+function doSearchLabel(tableName, keyword, sortBy = "", ascending = "false") {
+ initDiv(true);
+ //document.getElementById("search_div").style.display="none";
+ //document.getElementById("search_label_div").style.display="block";
+ document.getElementById("search_label_div").innerHTML =
+ '#' + keyword + "
";
+
+ currentSearchKeyword = keyword;
+ initPageInfo();
+ currentSearchTableName = tableName;
+ currentSearchSortBy = sortBy;
+ currentSearchAscending = ascending;
+ OnlySearchLabel = true;
+
+ page(currentPage);
+}
- sessionStorage.setItem("keyword",keyword);
- sessionStorage.setItem("tableName",tableName);
- sessionStorage.setItem("searchLabel",true);
- sessionStorage.setItem("sortBy",sortBy);
- sessionStorage.setItem("ascending",ascending);
- console.log("enter label search.");
- window.open("/all/search/");
+function searchLabel(tableName, keyword, sortBy = "", ascending = "false") {
+ sessionStorage.setItem("keyword", keyword);
+ sessionStorage.setItem("tableName", tableName);
+ sessionStorage.setItem("searchLabel", true);
+ sessionStorage.setItem("sortBy", sortBy);
+ sessionStorage.setItem("ascending", ascending);
+ window.open("/all/search/");
}
-function doSearch(tableName,keyword,page,pageSize=15,onlyReturnNum=true,sortBy="",OnlySearchLabel=false){
- var language = "zh-CN";
- if(!isZh){
- language="en-US";
- }
- $.ajax({
- type:"GET",
- url:"/all/dosearch/",
- headers: {
- authorization:token,
- },
- dataType:"json",
- data:{
- 'TableName': tableName,
- 'Key': keyword,
- 'Page': page,
- 'PageSize': pageSize,
- 'OnlyReturnNum':onlyReturnNum,
- 'SortBy':sortBy,
- 'OnlySearchLabel':OnlySearchLabel,
- 'Ascending':currentSearchAscending,
- 'WebTotal':totalNum,
- 'PrivateTotal':privateTotal,
- 'language':language
- },
- async:true,
- success:function(json){
- console.log("tableName=" + tableName);
- console.log(json);
- displayResult(tableName,page,json,onlyReturnNum,keyword);
- },
- error:function(response) {
- console.log(response);
- }
- });
+function doSearch(
+ tableName,
+ keyword,
+ page,
+ pageSize = 15,
+ onlyReturnNum = true,
+ sortBy = "",
+ OnlySearchLabel = false
+) {
+ var language = "zh-CN";
+ if (!isZh) {
+ language = "en-US";
+ }
+ $.ajax({
+ type: "GET",
+ url: "/all/dosearch/",
+ headers: {
+ authorization: token,
+ },
+ dataType: "json",
+ data: {
+ TableName: tableName,
+ Key: keyword,
+ Page: page,
+ PageSize: pageSize,
+ OnlyReturnNum: onlyReturnNum,
+ SortBy: sortBy,
+ OnlySearchLabel: OnlySearchLabel,
+ Ascending: currentSearchAscending,
+ WebTotal: totalNum,
+ PrivateTotal: privateTotal,
+ language: language,
+ },
+ async: true,
+ success: function (json) {
+ displayResult(tableName, page, json, onlyReturnNum, keyword);
+ },
+ error: function (response) {},
+ });
}
-function displayResult(tableName,page,jsonResult,onlyReturnNum,keyword){
- if(tableName == "repository") {
- displayRepoResult(page,jsonResult,onlyReturnNum,keyword);
- } else if (tableName == "issue") {
- displayIssueResult(page,jsonResult,onlyReturnNum,keyword);
- } else if (tableName == "user") {
- displayUserResult(page,jsonResult,onlyReturnNum,keyword);
- } else if (tableName == "org") {
- displayOrgResult(page,jsonResult,onlyReturnNum,keyword);
- } else if (tableName == "dataset") {
- displayDataSetResult(page,jsonResult,onlyReturnNum,keyword);
- } else if (tableName == "pr") {
- displayPrResult(page,jsonResult,onlyReturnNum,keyword);
- }
- if(!onlyReturnNum){
- console.log("set total num." + tableName);
- totalPage =Math.ceil(jsonResult.Total/pageSize);
- totalNum = jsonResult.Total;
- privateTotal = jsonResult.PrivateTotal;
- setPage(page);
- }
-
+function displayResult(tableName, page, jsonResult, onlyReturnNum, keyword) {
+ if (tableName == "repository") {
+ displayRepoResult(page, jsonResult, onlyReturnNum, keyword);
+ } else if (tableName == "issue") {
+ displayIssueResult(page, jsonResult, onlyReturnNum, keyword);
+ } else if (tableName == "user") {
+ displayUserResult(page, jsonResult, onlyReturnNum, keyword);
+ } else if (tableName == "org") {
+ displayOrgResult(page, jsonResult, onlyReturnNum, keyword);
+ } else if (tableName == "dataset") {
+ displayDataSetResult(page, jsonResult, onlyReturnNum, keyword);
+ } else if (tableName == "pr") {
+ displayPrResult(page, jsonResult, onlyReturnNum, keyword);
+ }
+ if (!onlyReturnNum) {
+ totalPage = Math.ceil(jsonResult.Total / pageSize);
+ totalNum = jsonResult.Total;
+ privateTotal = jsonResult.PrivateTotal;
+ setPage(page);
+ }
}
-function displayPrResult(page,jsonResult,onlyReturnNum,keyword){
- var data = jsonResult.Result;
- var total = jsonResult.Total;
- $('#pr_total').text(total);
- if(!onlyReturnNum){
- setActivate("pr_item");
- //$('#keyword_desc').text(keyword);
- //$('#obj_desc').text(getLabel(isZh,"search_pr"));
- //$('#child_total').text(total);
- $('#find_title').html(getLabel(isZh,"find_title").replace('{keyword}',keyword).replace('{tablename}',getLabel(isZh,"search_pr")).replace('{total}',total));
-
- setIssueOrPrInnerHtml(data,"pulls");
- }
+function displayPrResult(page, jsonResult, onlyReturnNum, keyword) {
+ var data = jsonResult.Result;
+ var total = jsonResult.Total;
+ $("#pr_total").text(total);
+ if (!onlyReturnNum) {
+ setActivate("pr_item");
+ //$('#keyword_desc').text(keyword);
+ //$('#obj_desc').text(getLabel(isZh,"search_pr"));
+ //$('#child_total').text(total);
+ $("#find_title").html(
+ getLabel(isZh, "find_title")
+ .replace("{keyword}", keyword)
+ .replace("{tablename}", getLabel(isZh, "search_pr"))
+ .replace("{total}", total)
+ );
+
+ setIssueOrPrInnerHtml(data, "pulls");
+ }
}
-var categoryDesc={
- "computer_vision":"计算机视觉",
- "natural_language_processing":"自然语言处理",
- "speech_processing":"语音处理",
- "computer_vision_natural_language_processing":"计算机视觉、自然语言处理"
+var categoryDesc = {
+ computer_vision: "计算机视觉",
+ natural_language_processing: "自然语言处理",
+ speech_processing: "语音处理",
+ computer_vision_natural_language_processing: "计算机视觉、自然语言处理",
};
-var categoryENDesc={
- "computer_vision":"computer vision",
- "natural_language_processing":"natural language processing",
- "speech_processing":"speech processing",
- "computer_vision_natural_language_processing":"computer vision and natural language processing"
+var categoryENDesc = {
+ computer_vision: "computer vision",
+ natural_language_processing: "natural language processing",
+ speech_processing: "speech processing",
+ computer_vision_natural_language_processing:
+ "computer vision and natural language processing",
};
-var taskDesc={
- "machine_translation":"机器翻译",
- "question_answering_system":"问答系统",
- "information_retrieval":"信息检索",
- "knowledge_graph":"知识图谱",
- "text_annotation":"文本标注",
- "text_categorization":"文本分类",
- "emotion_analysis":"情感分析",
- "language_modeling":"语言建模",
- "speech_recognition":"语音识别",
- "automatic_digest":"自动文摘",
- "information_extraction":"信息抽取",
- "description_generation":"说明生成",
- "image_classification":"图像分类",
- "face_recognition":"人脸识别",
- "image_search":"图像搜索",
- "target_detection":"目标检测",
- "image_description_generation":"图像描述生成",
- "vehicle_license_plate_recognition":"车辆车牌识别",
- "medical_image_analysis":"医学图像分析",
- "unmanned":"无人驾驶",
- "unmanned_security":"无人安防",
- "drone":"无人机",
- "vr_ar":"VR/AR",
- "2_d_vision":"2-D视觉",
- "2_5_d_vision":"2.5-D视觉",
- "3_d_reconstruction":"3D重构",
- "image_processing":"图像处理",
- "video_processing":"视频处理",
- "visual_input_system":"视觉输入系统",
- "speech_coding":"语音编码",
- "speech_enhancement":"语音增强",
- "speech_recognition":"语音识别",
- "speech_synthesis":"语音合成"
+var taskDesc = {
+ machine_translation: "机器翻译",
+ question_answering_system: "问答系统",
+ information_retrieval: "信息检索",
+ knowledge_graph: "知识图谱",
+ text_annotation: "文本标注",
+ text_categorization: "文本分类",
+ emotion_analysis: "情感分析",
+ language_modeling: "语言建模",
+ speech_recognition: "语音识别",
+ automatic_digest: "自动文摘",
+ information_extraction: "信息抽取",
+ description_generation: "说明生成",
+ image_classification: "图像分类",
+ face_recognition: "人脸识别",
+ image_search: "图像搜索",
+ target_detection: "目标检测",
+ image_description_generation: "图像描述生成",
+ vehicle_license_plate_recognition: "车辆车牌识别",
+ medical_image_analysis: "医学图像分析",
+ unmanned: "无人驾驶",
+ unmanned_security: "无人安防",
+ drone: "无人机",
+ vr_ar: "VR/AR",
+ "2_d_vision": "2-D视觉",
+ "2_5_d_vision": "2.5-D视觉",
+ "3_d_reconstruction": "3D重构",
+ image_processing: "图像处理",
+ video_processing: "视频处理",
+ visual_input_system: "视觉输入系统",
+ speech_coding: "语音编码",
+ speech_enhancement: "语音增强",
+ speech_recognition: "语音识别",
+ speech_synthesis: "语音合成",
};
-var taskENDesc={
- "machine_translation":"machine translation",
- "question_answering_system":"question answering system",
- "information_retrieval":"information retrieval",
- "knowledge_graph":"knowledge graph",
- "text_annotation":"text annotation",
- "text_categorization":"text categorization",
- "emotion_analysis":"emotion analysis",
- "language_modeling":"language modeling",
- "speech_recognition":"speech recognition",
- "automatic_digest":"automatic digest",
- "information_extraction":"information extraction",
- "description_generation":"description generation",
- "image_classification":"image classification",
- "face_recognition":"face recognition",
- "image_search":"image search",
- "target_detection":"target detection",
- "image_description_generation":"image description generation",
- "vehicle_license_plate_recognition":"vehicle license plate recognition",
- "medical_image_analysis":"medical image analysis",
- "unmanned":"unmanned",
- "unmanned_security":"unmanned security",
- "drone":"drone",
- "vr_ar":"VR/AR",
- "2_d_vision":"2.D vision",
- "2.5_d_vision":"2.5D vision",
- "3_d_reconstruction":"3Dreconstruction",
- "image_processing":"image processing",
- "video_processing":"video processing",
- "visual_input_system":"visual input system",
- "speech_coding":"speech coding",
- "speech_enhancement":"speech enhancement",
- "speech_recognition":"speech recognition",
- "speech_synthesis":"speech synthesis"
+var taskENDesc = {
+ machine_translation: "machine translation",
+ question_answering_system: "question answering system",
+ information_retrieval: "information retrieval",
+ knowledge_graph: "knowledge graph",
+ text_annotation: "text annotation",
+ text_categorization: "text categorization",
+ emotion_analysis: "emotion analysis",
+ language_modeling: "language modeling",
+ speech_recognition: "speech recognition",
+ automatic_digest: "automatic digest",
+ information_extraction: "information extraction",
+ description_generation: "description generation",
+ image_classification: "image classification",
+ face_recognition: "face recognition",
+ image_search: "image search",
+ target_detection: "target detection",
+ image_description_generation: "image description generation",
+ vehicle_license_plate_recognition: "vehicle license plate recognition",
+ medical_image_analysis: "medical image analysis",
+ unmanned: "unmanned",
+ unmanned_security: "unmanned security",
+ drone: "drone",
+ vr_ar: "VR/AR",
+ "2_d_vision": "2.D vision",
+ "2.5_d_vision": "2.5D vision",
+ "3_d_reconstruction": "3Dreconstruction",
+ image_processing: "image processing",
+ video_processing: "video processing",
+ visual_input_system: "visual input system",
+ speech_coding: "speech coding",
+ speech_enhancement: "speech enhancement",
+ speech_recognition: "speech recognition",
+ speech_synthesis: "speech synthesis",
};
-function getCategoryDesc(isZh,key){
- var re = key;
- if(isZh){
- re = categoryDesc[key];
- }else{
- re = categoryENDesc[key];
- }
- if(isEmpty(re)){
- return key;
- }
- return re;
+function getCategoryDesc(isZh, key) {
+ var re = key;
+ if (isZh) {
+ re = categoryDesc[key];
+ } else {
+ re = categoryENDesc[key];
+ }
+ if (isEmpty(re)) {
+ return key;
+ }
+ return re;
}
-function getTaskDesc(isZh,key){
- var re = key;
- if(isZh){
- re = taskDesc[key];
- }else{
- re = taskENDesc[key];
- }
- if(isEmpty(re)){
- return key;
- }
- return re;
+function getTaskDesc(isZh, key) {
+ var re = key;
+ if (isZh) {
+ re = taskDesc[key];
+ } else {
+ re = taskENDesc[key];
+ }
+ if (isEmpty(re)) {
+ return key;
+ }
+ return re;
}
-function getActiveItem(sort_type){
- console.log("currentSearchSortBy=" + currentSearchSortBy + " sort_type=" + sortBy[sort_type]);
- if(currentSearchSortBy == sortBy[sort_type] && currentSearchAscending == sortAscending[sort_type]){
- return "active ";
- }else{
- return "";
- }
+function getActiveItem(sort_type) {
+ if (
+ currentSearchSortBy == sortBy[sort_type] &&
+ currentSearchAscending == sortAscending[sort_type]
+ ) {
+ return "active ";
+ } else {
+ return "";
+ }
}
-function displayDataSetResult(page,jsonResult,onlyReturnNum,keyword){
- var data = jsonResult.Result;
- var total = jsonResult.Total;
- $('#dataset_total').text(total);
- if(!onlyReturnNum){
- setActivate("dataset_item");
- //$('#keyword_desc').text(keyword);
- //$('#obj_desc').text(getLabel(isZh,"search_dataset"));
- //$('#child_total').text(total);
- $('#find_title').html(getLabel(isZh,"find_title").replace('{keyword}',keyword).replace('{tablename}',getLabel(isZh,"search_dataset")).replace('{total}',total));
-
- var sortHtml = "";
- sortHtml +="";
- sortHtml +="";
- document.getElementById("sort_type").innerHTML=sortHtml;
-
- var html = "";
- var currentTime = new Date().getTime();
- for(var i = 0; i < data.length;i++){
- var recordMap = data[i];
- html += "";
- html += "
";
- html += "
" ;
- if(!isEmpty(recordMap["category"])){
- html += " " + getCategoryDesc(isZh,recordMap["category"]) + "";
- }
- if(!isEmpty(recordMap["task"])){
- html += " " + getTaskDesc(isZh,recordMap["task"]) + "";
- }
- html += " " +recordMap["download_times"] + " ";
- html +="
";
- html += "
";
- html += "
";
- html += "
" + recordMap["description"] + "
";
- if(!isEmpty(recordMap["file_name"])){
- html += "
" + recordMap["file_name"] + "
";
- }
- html +="
";
- html +=" "+ getLabel(isZh,"search_lasted_update") + " " + recordMap["updated_html"];
- html +="
";
- html +="
";
- html +="
";
- html +="
";
- }
- document.getElementById("child_search_item").innerHTML=html;
- }
-}
+function displayDataSetResult(page, jsonResult, onlyReturnNum, keyword) {
+ var data = jsonResult.Result;
+ var total = jsonResult.Total;
+ $("#dataset_total").text(total);
+ if (!onlyReturnNum) {
+ setActivate("dataset_item");
+ //$('#keyword_desc').text(keyword);
+ //$('#obj_desc').text(getLabel(isZh,"search_dataset"));
+ //$('#child_total').text(total);
+ $("#find_title").html(
+ getLabel(isZh, "find_title")
+ .replace("{keyword}", keyword)
+ .replace("{tablename}", getLabel(isZh, "search_dataset"))
+ .replace("{total}", total)
+ );
-function displayOrgResult(page,jsonResult,onlyReturnNum,keyword){
- var data = jsonResult.Result;
- var total = jsonResult.Total;
- $('#org_total').text(total);
- if(!onlyReturnNum){
- setActivate("org_item");
- //$('#keyword_desc').text(keyword);
- //$('#obj_desc').text(getLabel(isZh,"search_org"));
- //$('#child_total').text(total);
- $('#find_title').html(getLabel(isZh,"find_title").replace('{keyword}',keyword).replace('{tablename}',getLabel(isZh,"search_org")).replace('{total}',total));
-
- var sortHtml = "";
- sortHtml +="";
- sortHtml +="";
- sortHtml +="";
- sortHtml +="";
- sortHtml +="";
- document.getElementById("sort_type").innerHTML=sortHtml;
-
- var html = "";
- var currentTime = new Date().getTime();
- for(var i = 0; i < data.length;i++){
- var recordMap = data[i];
- html += "";
- html += "

";
- html += "
";
- html += "
";
- html += "
";
- html += "
" + recordMap["description"] + "
";
- html +="
";
- if(!isEmpty(recordMap["location"]) && recordMap["location"] != "null"){
- html +=" " + recordMap["location"];
- }
- html +=" ";
- if(!isEmpty(recordMap["website"]) && recordMap["website"] != "null"){
- html +=" " + "" + recordMap["website"] + "";
- }
- html +=" "+ getLabel(isZh,"search_add_by") + " ";
- html += recordMap["add_time"]
- html +="
";
- html +="
";
- html +="
";
- html +="
";
- }
- document.getElementById("child_search_item").innerHTML=html;
- }
-}
-var monthDisplay=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Spt","Oct","Nov","Dec");
-function displayUserResult(page,jsonResult,onlyReturnNum,keyword){
- var data = jsonResult.Result;
- var total = jsonResult.Total;
- $('#user_total').text(total);
- if(!onlyReturnNum){
- setActivate("user_item");
- //$('#keyword_desc').text(keyword);
- //$('#obj_desc').text(getLabel(isZh,"search_user"));
- //$('#child_total').text(total);
-
- $('#find_title').html(getLabel(isZh,"find_title").replace('{keyword}',keyword).replace('{tablename}',getLabel(isZh,"search_user")).replace('{total}',total));
-
- var sortHtml = "";//equal user sort by
- sortHtml +="";
- sortHtml +="";
- sortHtml +="";
- sortHtml +="";
- sortHtml +="";
-
- document.getElementById("sort_type").innerHTML=sortHtml;
-
- var html = "";
- var currentTime = new Date().getTime();
- for(var i = 0; i < data.length;i++){
- var recordMap = data[i];
- html += "";
- html += "

";
- html += "
";
- html += "
";
- html += "
";
- html += "
" + recordMap["description"] + "
";
- html +="
";
- if(!isEmpty(recordMap["email"]) && recordMap["email"] != "null"){
- html +=" " + recordMap["email"] + "";
- }
- html +=" "+ getLabel(isZh,"search_add_by") + " ";
- html += recordMap["add_time"]
- html +="
";
- html +="
";
- html +="
";
- html +="
";
- }
- document.getElementById("child_search_item").innerHTML=html;
+ var sortHtml = "";
+ sortHtml +=
+ '";
+ sortHtml +=
+ '";
+ document.getElementById("sort_type").innerHTML = sortHtml;
+
+ var html = "";
+ var currentTime = new Date().getTime();
+ for (var i = 0; i < data.length; i++) {
+ var recordMap = data[i];
+ html += '';
+ html += '
';
+ html += '
';
+ if (!isEmpty(recordMap["category"])) {
+ html +=
+ ' ' +
+ getCategoryDesc(isZh, recordMap["category"]) +
+ "";
+ }
+ if (!isEmpty(recordMap["task"])) {
+ html +=
+ ' ' +
+ getTaskDesc(isZh, recordMap["task"]) +
+ "";
+ }
+ html +=
+ ' ' +
+ recordMap["download_times"] +
+ " ";
+ html += "
";
+ html += ' ";
+ html += '
';
+ html +=
+ '
' + recordMap["description"] + "
";
+ if (!isEmpty(recordMap["file_name"])) {
+ html +=
+ '
' + recordMap["file_name"] + "
";
+ }
+ html += '
';
+ html +=
+ ' ' +
+ getLabel(isZh, "search_lasted_update") +
+ " " +
+ recordMap["updated_html"];
+ html += "
";
+ html += "
";
+ html += "
";
+ html += "
";
}
+ document.getElementById("child_search_item").innerHTML = html;
+ }
}
-function setIssueOrPrInnerHtml(data,path){
+function displayOrgResult(page, jsonResult, onlyReturnNum, keyword) {
+ var data = jsonResult.Result;
+ var total = jsonResult.Total;
+ $("#org_total").text(total);
+ if (!onlyReturnNum) {
+ setActivate("org_item");
+ //$('#keyword_desc').text(keyword);
+ //$('#obj_desc').text(getLabel(isZh,"search_org"));
+ //$('#child_total').text(total);
+ $("#find_title").html(
+ getLabel(isZh, "find_title")
+ .replace("{keyword}", keyword)
+ .replace("{tablename}", getLabel(isZh, "search_org"))
+ .replace("{total}", total)
+ );
+
var sortHtml = "";
- if(path =="issues"){
- sortHtml +="";
- sortHtml +="";
- }else{
- sortHtml +="";
- sortHtml +="";
- }
-
- document.getElementById("sort_type").innerHTML=sortHtml;
+ sortHtml +=
+ '";
+ sortHtml +=
+ '";
+ sortHtml +=
+ '";
+ sortHtml +=
+ '";
+ sortHtml +=
+ '";
+ document.getElementById("sort_type").innerHTML = sortHtml;
var html = "";
var currentTime = new Date().getTime();
- for(var i = 0; i < data.length;i++){
- var recordMap = data[i];
- html += "";
- html += "
";
- html += "
";
- html += "
";
- html += "
" + recordMap["content"] + "
";
- html +="
";
- html +=" ";
- html +=" " + addBlank(recordMap["repoUrl"]) +" #" + recordMap["index"] + " ";
- html +=" ";
- if(recordMap["is_closed"] != null && (!(recordMap["is_closed"]) || recordMap["is_closed"]=="f")){
- html += getLabel(isZh,"search_open");
- }else{
- html += getLabel(isZh,"search_closed");
- }
- html +=" " + recordMap["num_comments"];
-
- html +=" "+ getLabel(isZh,"search_lasted_update") + " "+ recordMap["updated_html"];
-
- html +="
";
- html +="
";
- html +="
";
- html +="
";
+ for (var i = 0; i < data.length; i++) {
+ var recordMap = data[i];
+ html += '';
+ html +=
+ '

';
+ html += '
';
+ html += ' ";
+ html += '
';
+ html +=
+ '
' + recordMap["description"] + "
";
+ html += '
';
+ if (!isEmpty(recordMap["location"]) && recordMap["location"] != "null") {
+ html +=
+ ' ' +
+ recordMap["location"];
+ }
+ html += ' ';
+ if (!isEmpty(recordMap["website"]) && recordMap["website"] != "null") {
+ html +=
+ ' ' +
+ '' +
+ recordMap["website"] +
+ "";
+ }
+ html +=
+ ' ' +
+ getLabel(isZh, "search_add_by") +
+ " ";
+ html += recordMap["add_time"];
+ html += "
";
+ html += "
";
+ html += "
";
+ html += "
";
}
- document.getElementById("child_search_item").innerHTML=html;
+ document.getElementById("child_search_item").innerHTML = html;
+ }
}
+var monthDisplay = new Array(
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Spt",
+ "Oct",
+ "Nov",
+ "Dec"
+);
+function displayUserResult(page, jsonResult, onlyReturnNum, keyword) {
+ var data = jsonResult.Result;
+ var total = jsonResult.Total;
+ $("#user_total").text(total);
+ if (!onlyReturnNum) {
+ setActivate("user_item");
+ //$('#keyword_desc').text(keyword);
+ //$('#obj_desc').text(getLabel(isZh,"search_user"));
+ //$('#child_total').text(total);
+
+ $("#find_title").html(
+ getLabel(isZh, "find_title")
+ .replace("{keyword}", keyword)
+ .replace("{tablename}", getLabel(isZh, "search_user"))
+ .replace("{total}", total)
+ );
+
+ var sortHtml = ""; //equal user sort by
+ sortHtml +=
+ '";
+ sortHtml +=
+ '";
+ sortHtml +=
+ '";
+ sortHtml +=
+ '";
+ sortHtml +=
+ '";
+
+ document.getElementById("sort_type").innerHTML = sortHtml;
-function addBlank(url){
- if(url == null){
- return url;
- }
- var tmps = url.split("/");
- if(tmps.length == 2){
- return tmps[0] + " / " + tmps[1];
- }
- return url;
+ var html = "";
+ var currentTime = new Date().getTime();
+ for (var i = 0; i < data.length; i++) {
+ var recordMap = data[i];
+ html += '';
+ html +=
+ '

';
+ html += '
';
+ html += ' ";
+ html += '
';
+ html +=
+ '
' + recordMap["description"] + "
";
+ html += '
';
+ if (!isEmpty(recordMap["email"]) && recordMap["email"] != "null") {
+ html +=
+ ' ' +
+ recordMap["email"] +
+ "";
+ }
+ html +=
+ ' ' +
+ getLabel(isZh, "search_add_by") +
+ " ";
+ html += recordMap["add_time"];
+ html += "
";
+ html += "
";
+ html += "
";
+ html += "
";
+ }
+ document.getElementById("child_search_item").innerHTML = html;
+ }
}
-function displayIssueResult(page,jsonResult,onlyReturnNum,keyword){
- var data = jsonResult.Result;
- var total = jsonResult.Total;
- $('#issue_total').text(total);
- if(!onlyReturnNum){
- setActivate("issue_item");
- //$('#keyword_desc').text(keyword);
- //$('#obj_desc').text(getLabel(isZh,"search_issue"));
- //$('#child_total').text(total);
- $('#find_title').html(getLabel(isZh,"find_title").replace('{keyword}',keyword).replace('{tablename}',getLabel(isZh,"search_issue")).replace('{total}',total));
-
- setIssueOrPrInnerHtml(data,"issues");
+function setIssueOrPrInnerHtml(data, path) {
+ var sortHtml = "";
+ if (path == "issues") {
+ sortHtml +=
+ '";
+ sortHtml +=
+ '";
+ } else {
+ sortHtml +=
+ '";
+ sortHtml +=
+ '";
+ }
+
+ document.getElementById("sort_type").innerHTML = sortHtml;
+
+ var html = "";
+ var currentTime = new Date().getTime();
+ for (var i = 0; i < data.length; i++) {
+ var recordMap = data[i];
+ html += '';
+ html += '
';
+ html += ' ";
+ html += '
';
+ html += '
' + recordMap["content"] + "
";
+ html += '
';
+ html += ' ';
+ html +=
+ ' ' +
+ addBlank(recordMap["repoUrl"]) +
+ " #" +
+ recordMap["index"] +
+ " ";
+ html += ' ';
+ if (
+ recordMap["is_closed"] != null &&
+ (!recordMap["is_closed"] || recordMap["is_closed"] == "f")
+ ) {
+ html += getLabel(isZh, "search_open");
+ } else {
+ html += getLabel(isZh, "search_closed");
}
+ html +=
+ ' ' +
+ recordMap["num_comments"];
+
+ html +=
+ ' ' +
+ getLabel(isZh, "search_lasted_update") +
+ " " +
+ recordMap["updated_html"];
+
+ html += "
";
+ html += "
";
+ html += "
";
+ html += "
";
+ }
+ document.getElementById("child_search_item").innerHTML = html;
}
-function setActivate(name){
- $('#repo_item').removeClass("active");
- $('#user_item').removeClass("active");
- $('#issue_item').removeClass("active");
- $('#dataset_item').removeClass("active");
- $('#org_item').removeClass("active");
- $('#pr_item').removeClass("active");
- if(name==null){
- return;
- }
- var tmp = "#" + name;
- $(tmp).addClass("active");
+function addBlank(url) {
+ if (url == null) {
+ return url;
+ }
+ var tmps = url.split("/");
+ if (tmps.length == 2) {
+ return tmps[0] + " / " + tmps[1];
+ }
+ return url;
}
-function displayRepoResult(page,jsonResult,onlyReturnNum,keyword){
- var data = jsonResult.Result;
- var total = jsonResult.Total;
- $('#repo_total').text(total);
-
- if(!onlyReturnNum){
- setActivate("repo_item");
- // $('#keyword_desc').text(keyword);
- //$('#obj_desc').text(getLabel(isZh,"search_repo"));
- //$('#child_total').text(total);
- $('#find_title').html(getLabel(isZh,"find_title").replace('{keyword}',keyword).replace('{tablename}',getLabel(isZh,"search_repo")).replace('{total}',total));
-
- var sortHtml = "";
- sortHtml +="";
- sortHtml +="";
- sortHtml +="";
- sortHtml +="";
- sortHtml +="";
-
- document.getElementById("sort_type").innerHTML=sortHtml;
-
- var html = "";
- var currentTime = new Date().getTime();
- for(var i = 0; i < data.length;i++){
- var recordMap = data[i];
- html += "";
- if(!isEmpty(recordMap['avatar'])){
- html += "

";
- }
- html += "
";
- html += "
";
- html += "
";
- html += "
" + recordMap["description"] + "
";
- html += "
";
- if(!isEmpty(recordMap["topics"]) && recordMap["topics"] !="null"){
- for(var j = 0; j < recordMap["topics"].length;j++){
- //function searchLabel(tableName,keyword,sortBy="",ascending=false)
- html +="
"+ recordMap["hightTopics"][j] + "
";
- }
- }
- html +="
";
- html +="
";
- html +=" " + recordMap["num_watches"] + " " + recordMap["num_stars"] + " " + recordMap["num_forks"] +" ";
- html +=" "+ getLabel(isZh,"search_lasted_update") + " " + recordMap["updated_html"];
- if(!isEmpty(recordMap["lang"])){
- var lang = recordMap["lang"]
- var tmpLang = recordMap["lang"].split(",");
- if(tmpLang.length>0){
- lang = tmpLang[0]
- }
- var backColor = "#3572A5";
- if(LanguagesColor[lang] != null){
- backColor = LanguagesColor[lang];
- }
- html +=" " + lang + "";
- }
- html +="
";
- html +="
";
- html +="
";
- html +="
";
- }
+function displayIssueResult(page, jsonResult, onlyReturnNum, keyword) {
+ var data = jsonResult.Result;
+ var total = jsonResult.Total;
+ $("#issue_total").text(total);
+ if (!onlyReturnNum) {
+ setActivate("issue_item");
+ //$('#keyword_desc').text(keyword);
+ //$('#obj_desc').text(getLabel(isZh,"search_issue"));
+ //$('#child_total').text(total);
+ $("#find_title").html(
+ getLabel(isZh, "find_title")
+ .replace("{keyword}", keyword)
+ .replace("{tablename}", getLabel(isZh, "search_issue"))
+ .replace("{total}", total)
+ );
+
+ setIssueOrPrInnerHtml(data, "issues");
+ }
+}
- document.getElementById("child_search_item").innerHTML=html;
- }
+function setActivate(name) {
+ $("#repo_item").removeClass("active");
+ $("#user_item").removeClass("active");
+ $("#issue_item").removeClass("active");
+ $("#dataset_item").removeClass("active");
+ $("#org_item").removeClass("active");
+ $("#pr_item").removeClass("active");
+ if (name == null) {
+ return;
+ }
+ var tmp = "#" + name;
+ $(tmp).addClass("active");
}
-function getTime(UpdatedUnix,currentTime){
- UpdatedUnix = UpdatedUnix;
- currentTime = currentTime / 1000;
- var timeEscSecond = currentTime - UpdatedUnix;
- if( timeEscSecond < 0){
- timeEscSecond = 1;
+function LetterAvatar(name, size, color) {
+ name = name || "";
+ size = size || 60;
+ var colours = [
+ "#1abc9c",
+ "#2ecc71",
+ "#3498db",
+ "#9b59b6",
+ "#34495e",
+ "#16a085",
+ "#27ae60",
+ "#2980b9",
+ "#8e44ad",
+ "#2c3e50",
+ "#f1c40f",
+ "#e67e22",
+ "#e74c3c",
+ "#00bcd4",
+ "#95a5a6",
+ "#f39c12",
+ "#d35400",
+ "#c0392b",
+ "#bdc3c7",
+ "#7f8c8d",
+ ],
+ nameSplit = String(name).split(" "),
+ initials,
+ charIndex,
+ colourIndex,
+ canvas,
+ context,
+ dataURI;
+ if (nameSplit.length == 1) {
+ initials = nameSplit[0] ? nameSplit[0].charAt(0) : "?";
+ } else {
+ initials = nameSplit[0].charAt(0) + nameSplit[1].charAt(0);
+ }
+ if (w.devicePixelRatio) {
+ size = size * w.devicePixelRatio;
+ }
+
+ charIndex = (initials == "?" ? 72 : initials.charCodeAt(0)) - 64;
+ colourIndex = charIndex % 20;
+ canvas = d.createElement("canvas");
+ canvas.width = size;
+ canvas.height = size;
+ context = canvas.getContext("2d");
+
+ context.fillStyle = color ? color : colours[colourIndex - 1];
+ context.fillRect(0, 0, canvas.width, canvas.height);
+ context.font = Math.round(canvas.width / 2) + "px 'Microsoft Yahei'";
+ context.textAlign = "center";
+ context.fillStyle = "#FFF";
+ context.fillText(initials, size / 2, size / 1.5);
+ dataURI = canvas.toDataURL();
+ canvas = null;
+ return dataURI;
+}
+LetterAvatar.transform = function () {
+ Array.prototype.forEach.call(
+ d.querySelectorAll("img[avatar]"),
+ function (img, name, color) {
+ name = img.getAttribute("avatar");
+ color = img.getAttribute("color");
+ img.src = LetterAvatar(name, img.getAttribute("width"), color);
+ img.removeAttribute("avatar");
+ img.setAttribute("alt", name);
}
- console.log("currentTime=" + currentTime + " updateUnix=" + UpdatedUnix);
-
- var hours= Math.floor(timeEscSecond / 3600);
- //计算相差分钟数
- var leave2 = Math.floor(timeEscSecond % (3600)); //计算小时数后剩余的秒数
- var minutes= Math.floor(leave2 / 60);//计算相差分钟数
-
- var leave3=Math.floor(leave2 % 60); //计算分钟数后剩余的秒数
- var seconds= leave3;
-
- if(hours == 0 && minutes == 0){
- return seconds + getRepoOrOrg(6,isZh);
- }else{
- if(hours > 0){
- if(hours >= 24){
- var days = Math.ceil(hours/24)
- if (days >= 30 && days <365){
- return Math.ceil(days/30) + getRepoOrOrg(8,isZh);
- }else if(days >= 365){
- return Math.ceil(days/365) + getRepoOrOrg(9,isZh);
- }
- return Math.ceil(hours/24) + getRepoOrOrg(7,isZh);
- }else{
- return hours + getRepoOrOrg(4,isZh);
- }
- }else{
- return minutes + getRepoOrOrg(5,isZh);
+ );
+};
+
+function displayRepoResult(page, jsonResult, onlyReturnNum, keyword) {
+ var data = jsonResult.Result;
+ var total = jsonResult.Total;
+ $("#repo_total").text(total);
+
+ if (!onlyReturnNum) {
+ setActivate("repo_item");
+ // $('#keyword_desc').text(keyword);
+ //$('#obj_desc').text(getLabel(isZh,"search_repo"));
+ //$('#child_total').text(total);
+ $("#find_title").html(
+ getLabel(isZh, "find_title")
+ .replace("{keyword}", keyword)
+ .replace("{tablename}", getLabel(isZh, "search_repo"))
+ .replace("{total}", total)
+ );
+
+ var sortHtml = "";
+ sortHtml +=
+ '";
+ sortHtml +=
+ '";
+ sortHtml +=
+ '";
+ sortHtml +=
+ '";
+ sortHtml +=
+ '";
+
+ document.getElementById("sort_type").innerHTML = sortHtml;
+
+ var html = "";
+ var currentTime = new Date().getTime();
+ for (var i = 0; i < data.length; i++) {
+ var recordMap = data[i];
+ html += '';
+ if (recordMap["avatar"]) {
+ html += `

`;
+ } else {
+ html += `
![]()
`;
+ }
+
+ html += '
';
+ html += ' ";
+ html += '
';
+ html +=
+ '
' + recordMap["description"] + "
";
+ html += '
";
+ html += '
';
+ html +=
+ ' ' +
+ recordMap["num_watches"] +
+ ' ' +
+ recordMap["num_stars"] +
+ ' ' +
+ recordMap["num_forks"] +
+ " ";
+ html +=
+ " " +
+ getLabel(isZh, "search_lasted_update") +
+ " " +
+ recordMap["updated_html"];
+ if (!isEmpty(recordMap["lang"])) {
+ var lang = recordMap["lang"];
+ var tmpLang = recordMap["lang"].split(",");
+ if (tmpLang.length > 0) {
+ lang = tmpLang[0];
+ }
+ var backColor = "#3572A5";
+ if (LanguagesColor[lang] != null) {
+ backColor = LanguagesColor[lang];
}
+ html +=
+ ' ' +
+ lang +
+ "";
+ }
+ html += "
";
+ html += "
";
+ html += "
";
+ html += "
";
}
+
+ document.getElementById("child_search_item").innerHTML = html;
+ LetterAvatar.transform();
+ }
}
-function getRepoOrOrg(key,isZhLang){
- if(isZhLang){
- return repoAndOrgZH[key];
- }else{
- return repoAndOrgEN[key];
+function getTime(UpdatedUnix, currentTime) {
+ UpdatedUnix = UpdatedUnix;
+ currentTime = currentTime / 1000;
+ var timeEscSecond = currentTime - UpdatedUnix;
+ if (timeEscSecond < 0) {
+ timeEscSecond = 1;
+ }
+
+ var hours = Math.floor(timeEscSecond / 3600);
+ //计算相差分钟数
+ var leave2 = Math.floor(timeEscSecond % 3600); //计算小时数后剩余的秒数
+ var minutes = Math.floor(leave2 / 60); //计算相差分钟数
+
+ var leave3 = Math.floor(leave2 % 60); //计算分钟数后剩余的秒数
+ var seconds = leave3;
+
+ if (hours == 0 && minutes == 0) {
+ return seconds + getRepoOrOrg(6, isZh);
+ } else {
+ if (hours > 0) {
+ if (hours >= 24) {
+ var days = Math.ceil(hours / 24);
+ if (days >= 30 && days < 365) {
+ return Math.ceil(days / 30) + getRepoOrOrg(8, isZh);
+ } else if (days >= 365) {
+ return Math.ceil(days / 365) + getRepoOrOrg(9, isZh);
+ }
+ return Math.ceil(hours / 24) + getRepoOrOrg(7, isZh);
+ } else {
+ return hours + getRepoOrOrg(4, isZh);
+ }
+ } else {
+ return minutes + getRepoOrOrg(5, isZh);
}
+ }
}
-var repoAndOrgZH={
- "1":"项目",
- "2":"成员",
- "3":"团队",
- "4":"小时前",
- "5":"分钟前",
- "6":"秒前",
- "7":"天前",
- "8":"个月前",
- "9":"年前"
-};
+function getRepoOrOrg(key, isZhLang) {
+ if (isZhLang) {
+ return repoAndOrgZH[key];
+ } else {
+ return repoAndOrgEN[key];
+ }
+}
-var repoAndOrgEN={
- "1":"repository",
- "2":"Members ",
- "3":"Teams",
- "4":" hours ago",
- "5":" minutes ago",
- "6":" seconds ago",
- "7":" day ago",
- "8":" month ago",
- "9":" year ago"
+var repoAndOrgZH = {
+ 1: "项目",
+ 2: "成员",
+ 3: "团队",
+ 4: "小时前",
+ 5: "分钟前",
+ 6: "秒前",
+ 7: "天前",
+ 8: "个月前",
+ 9: "年前",
};
+var repoAndOrgEN = {
+ 1: "repository",
+ 2: "Members ",
+ 3: "Teams",
+ 4: " hours ago",
+ 5: " minutes ago",
+ 6: " seconds ago",
+ 7: " day ago",
+ 8: " month ago",
+ 9: " year ago",
+};
+function page(current) {
+ currentPage = current;
+
+ doSearch(
+ currentSearchTableName,
+ currentSearchKeyword,
+ current,
+ pageSize,
+ false,
+ currentSearchSortBy,
+ OnlySearchLabel
+ );
+}
+function nextPage() {
+ currentPage = currentPage + 1;
+ page(currentPage);
+}
-function page(current){
-
- currentPage=current;
-
- doSearch(currentSearchTableName,currentSearchKeyword,current,pageSize,false,currentSearchSortBy,OnlySearchLabel);
- }
-
- function nextPage(){
- currentPage = currentPage+1;
- console.log("currentPage=" + currentPage);
-
+function prePage() {
+ if (currentPage > 1) {
+ currentPage = currentPage - 1;
page(currentPage);
}
-
- function prePage(){
- console.log("currentPage=" + currentPage);
- if(currentPage > 1){
- currentPage = currentPage-1;
- console.log("currentPage=" + (currentPage));
- page(currentPage);
- }
- }
+}
-function getXPosition(e){
- var x=e.offsetLeft;
- while(e=e.offsetParent)
- {
- x+=e.offsetLeft;
- }
- return x+20;//-260防止屏幕超出
+function getXPosition(e) {
+ var x = e.offsetLeft;
+ while ((e = e.offsetParent)) {
+ x += e.offsetLeft;
+ }
+ return x + 20; //-260防止屏幕超出
}
//获取y坐标
-function getYPosition(e){
- var y=e.offsetTop;
- while(e=e.offsetParent)
- {
- y+=e.offsetTop;
- }
- return y+20;//80为input高度
+function getYPosition(e) {
+ var y = e.offsetTop;
+ while ((e = e.offsetParent)) {
+ y += e.offsetTop;
+ }
+ return y + 20; //80为input高度
}
+function goPage(event) {
+ var inputpage = document.getElementById("inputpage_div");
+ var left = getXPosition(event.target);
+ var top = getYPosition(event.target);
+ var goNum = $("#inputpage").val();
+ if (goNum <= 0) {
+ showTip(getLabel(isZh, "search_input_large_0"), "warning", left + 5, top);
+ } else if (goNum <= totalPage) {
+ page(parseInt(goNum, 10));
+ } else {
+ showTip(getLabel(isZh, "search_input_maxed"), "warning", left + 5, top);
+ }
+}
- function goPage(event){
-
- var inputpage = document.getElementById("inputpage_div")
- var left = getXPosition(event.target);
- var top = getYPosition(event.target);
- var goNum = $('#inputpage').val();
- if (goNum<=0){
- showTip(getLabel(isZh,"search_input_large_0"),"warning",left+5,top);
- }
- else if(goNum<=totalPage){
- page(parseInt(goNum,10));
- }
- else{
- showTip(getLabel(isZh,"search_input_maxed"),"warning",left+5,top);
- }
+function showTip(tip, type, left, top) {
+ var $tip = $("#tipmsg");
+ var tipmsg = document.getElementById("tipmsg");
+ var style =
+ "z-index:10024;top:" +
+ top +
+ "px;left:" +
+ left +
+ "px;position:absolute;width:200px;height:60px;vertical-align:middle;";
+ tipmsg.style = style;
+ var html = "" + tip + "
";
+ $tip
+ .stop(true)
+ .prop("class", "alert alert-" + type)
+ .html(html)
+ .fadeIn(500)
+ .delay(2000)
+ .fadeOut(500);
+}
+
+function setPage(currentPage) {
+ var html = "";
+ startIndex = currentPage - 1;
+ if (startIndex < 1) {
+ startIndex = 1;
+ }
+ endIndex = currentPage + 2;
+ if (endIndex >= totalPage) {
+ endIndex = totalPage;
+ }
+ html +=
+ '' +
+ getLabel(isZh, "search_input_total") +
+ " " +
+ totalNum +
+ " " +
+ getLabel(isZh, "search_srtip") +
+ "";
+ if (currentPage > 1) {
+ html +=
+ '' +
+ getLabel(isZh, "search_home_page") +
+ "";
+ html +=
+ '';
+ } else {
+ html +=
+ '' +
+ getLabel(isZh, "search_home_page") +
+ "";
+ html +=
+ '';
}
- function showTip(tip, type,left,top) {
- var $tip = $('#tipmsg');
- var tipmsg = document.getElementById("tipmsg")
- var style="z-index:10024;top:" + top + "px;left:" + left + "px;position:absolute;width:200px;height:60px;vertical-align:middle;";
- console.log(style);
- tipmsg.style = style;
- var html ="" + tip + "
"
- $tip.stop(true).prop('class', 'alert alert-' + type).html(html).fadeIn(500).delay(2000).fadeOut(500);
- }
-
- function setPage(currentPage){
- console.log("totalPage=" + totalPage);
- var html ="";
- console.log("currentPage=" + currentPage);
- console.log("privateTotal=" + privateTotal);
- startIndex = currentPage -1;
- if(startIndex < 1){
- startIndex = 1;
- }
- endIndex = currentPage + 2;
- if(endIndex >= totalPage){
- endIndex = totalPage;
+ for (var i = startIndex; i <= endIndex; i++) {
+ var page_i = i;
+ if (page_i > totalPage) {
+ break;
}
- html += "" + getLabel(isZh,"search_input_total") + " " + totalNum + " " + getLabel(isZh,"search_srtip") + ""
- if(currentPage > 1){
- html += "" + getLabel(isZh,"search_home_page") + "";
- html += "";
- }else{
- html += "" + getLabel(isZh,"search_home_page") + "";
- html += "";
- }
-
- for(var i=startIndex; i <= endIndex; i++){
- var page_i = i;
- if(page_i > totalPage){
- break;
- }
- if( page_i == currentPage){
- html += "" + page_i + "";
- }else{
- html += "" + page_i + "";
- }
- }
-
- if (endIndex < totalPage-1){
- html += "...";
- html += "" + totalPage + "";
+ if (page_i == currentPage) {
+ html +=
+ '' +
+ page_i +
+ "";
+ } else {
+ html +=
+ '' +
+ page_i +
+ "";
}
+ }
- if(currentPage >=totalPage){
- html += "";
- html += "" + getLabel(isZh,"search_last_page") + "";
- }else{
- html += "";
- html += "" + getLabel(isZh,"search_last_page") + "";
- }
+ if (endIndex < totalPage - 1) {
+ html += "...";
+ html +=
+ '' +
+ totalPage +
+ "";
+ }
- html +=" " + getLabel(isZh,"search_go_to") + "
" + getLabel(isZh,"search_go_page") + "
";
- console.log("html=" + html)
- document.getElementById("page_menu").innerHTML=html;
- $('#inputpage').on('keypress',function(event){
- if(event.keyCode == 13){
- goPage(event);
- }
- });
+ if (currentPage >= totalPage) {
+ html +=
+ '';
+ html +=
+ '' +
+ getLabel(isZh, "search_last_page") +
+ "";
+ } else {
+ html +=
+ '';
+ html +=
+ '' +
+ getLabel(isZh, "search_last_page") +
+ "";
}
-$('#keyword_input').on('keypress',function(event){
- if(event.keyCode == 13){
- search();
+ html +=
+ ' ' +
+ getLabel(isZh, "search_go_to") +
+ '
' +
+ getLabel(isZh, "search_go_page") +
+ "
";
+ document.getElementById("page_menu").innerHTML = html;
+ $("#inputpage").on("keypress", function (event) {
+ if (event.keyCode == 13) {
+ goPage(event);
}
-});
-
-
-
+ });
+}
+$("#keyword_input").on("keypress", function (event) {
+ if (event.keyCode == 13) {
+ search();
+ }
+});
var LanguagesColor = {
- "1C Enterprise": "#814CCC",
- "ABAP": "#E8274B",
- "AGS Script": "#B9D9FF",
- "AMPL": "#E6EFBB",
- "ANTLR": "#9DC3FF",
- "API Blueprint": "#2ACCA8",
- "APL": "#5A8164",
- "ASP": "#6a40fd",
- "ATS": "#1ac620",
- "ActionScript": "#882B0F",
- "Ada": "#02f88c",
- "Agda": "#315665",
- "Alloy": "#64C800",
- "AngelScript": "#C7D7DC",
- "AppleScript": "#101F1F",
- "Arc": "#aa2afe",
- "AspectJ": "#a957b0",
- "Assembly": "#6E4C13",
- "Asymptote": "#4a0c0c",
- "AutoHotkey": "#6594b9",
- "AutoIt": "#1C3552",
- "Ballerina": "#FF5000",
- "Batchfile": "#C1F12E",
- "BlitzMax": "#cd6400",
- "Boo": "#d4bec1",
- "Brainfuck": "#2F2530",
- "C": "#555555",
- "C#": "#178600",
- "C++": "#f34b7d",
- "CSS": "#563d7c",
- "Ceylon": "#dfa535",
- "Chapel": "#8dc63f",
- "Cirru": "#ccccff",
- "Clarion": "#db901e",
- "Clean": "#3F85AF",
- "Click": "#E4E6F3",
- "Clojure": "#db5855",
- "CoffeeScript": "#244776",
- "ColdFusion": "#ed2cd6",
- "Common Lisp": "#3fb68b",
- "Common Workflow Language": "#B5314C",
- "Component Pascal": "#B0CE4E",
- "Crystal": "#000100",
- "Cuda": "#3A4E3A",
- "D": "#ba595e",
- "DM": "#447265",
- "Dart": "#00B4AB",
- "DataWeave": "#003a52",
- "Dhall": "#dfafff",
- "Dockerfile": "#384d54",
- "Dogescript": "#cca760",
- "Dylan": "#6c616e",
- "E": "#ccce35",
- "ECL": "#8a1267",
- "EQ": "#a78649",
- "Eiffel": "#946d57",
- "Elixir": "#6e4a7e",
- "Elm": "#60B5CC",
- "Emacs Lisp": "#c065db",
- "EmberScript": "#FFF4F3",
- "Erlang": "#B83998",
- "F#": "#b845fc",
- "F*": "#572e30",
- "FLUX": "#88ccff",
- "Factor": "#636746",
- "Fancy": "#7b9db4",
- "Fantom": "#14253c",
- "Faust": "#c37240",
- "Forth": "#341708",
- "Fortran": "#4d41b1",
- "FreeMarker": "#0050b2",
- "Frege": "#00cafe",
- "G-code": "#D08CF2",
- "GAML": "#FFC766",
- "GDScript": "#355570",
- "Game Maker Language": "#71b417",
- "Genie": "#fb855d",
- "Gherkin": "#5B2063",
- "Glyph": "#c1ac7f",
- "Gnuplot": "#f0a9f0",
- "Go": "#00ADD8",
- "Golo": "#88562A",
- "Gosu": "#82937f",
- "Grammatical Framework": "#79aa7a",
- "Groovy": "#e69f56",
- "HTML": "#e34c26",
- "Hack": "#878787",
- "Harbour": "#0e60e3",
- "Haskell": "#5e5086",
- "Haxe": "#df7900",
- "HiveQL": "#dce200",
- "HolyC": "#ffefaf",
- "Hy": "#7790B2",
- "IDL": "#a3522f",
- "IGOR Pro": "#0000cc",
- "Idris": "#b30000",
- "Io": "#a9188d",
- "Ioke": "#078193",
- "Isabelle": "#FEFE00",
- "J": "#9EEDFF",
- "JSONiq": "#40d47e",
- "Java": "#b07219",
- "JavaScript": "#f1e05a",
- "Jolie": "#843179",
- "Jsonnet": "#0064bd",
- "Julia": "#a270ba",
- "Jupyter Notebook": "#DA5B0B",
- "KRL": "#28430A",
- "Kotlin": "#F18E33",
- "LFE": "#4C3023",
- "LLVM": "#185619",
- "LOLCODE": "#cc9900",
- "LSL": "#3d9970",
- "Lasso": "#999999",
- "Lex": "#DBCA00",
- "LiveScript": "#499886",
- "LookML": "#652B81",
- "Lua": "#000080",
- "MATLAB": "#e16737",
- "MAXScript": "#00a6a6",
- "MLIR": "#5EC8DB",
- "MQL4": "#62A8D6",
- "MQL5": "#4A76B8",
- "MTML": "#b7e1f4",
- "Makefile": "#427819",
- "Mask": "#f97732",
- "Max": "#c4a79c",
- "Mercury": "#ff2b2b",
- "Meson": "#007800",
- "Metal": "#8f14e9",
- "Mirah": "#c7a938",
- "Modula-3": "#223388",
- "NCL": "#28431f",
- "Nearley": "#990000",
- "Nemerle": "#3d3c6e",
- "NetLinx": "#0aa0ff",
- "NetLinx+ERB": "#747faa",
- "NetLogo": "#ff6375",
- "NewLisp": "#87AED7",
- "Nextflow": "#3ac486",
- "Nim": "#37775b",
- "Nit": "#009917",
- "Nix": "#7e7eff",
- "Nu": "#c9df40",
- "OCaml": "#3be133",
- "ObjectScript": "#424893",
- "Objective-C": "#438eff",
- "Objective-C++": "#6866fb",
- "Objective-J": "#ff0c5a",
- "Odin": "#60AFFE",
- "Omgrofl": "#cabbff",
- "Opal": "#f7ede0",
- "OpenQASM": "#AA70FF",
- "Oxygene": "#cdd0e3",
- "Oz": "#fab738",
- "P4": "#7055b5",
- "PHP": "#4F5D95",
- "PLSQL": "#dad8d8",
- "Pan": "#cc0000",
- "Papyrus": "#6600cc",
- "Parrot": "#f3ca0a",
- "Pascal": "#E3F171",
- "Pawn": "#dbb284",
- "Pep8": "#C76F5B",
- "Perl": "#0298c3",
- "PigLatin": "#fcd7de",
- "Pike": "#005390",
- "PogoScript": "#d80074",
- "PostScript": "#da291c",
- "PowerBuilder": "#8f0f8d",
- "PowerShell": "#012456",
- "Processing": "#0096D8",
- "Prolog": "#74283c",
- "Propeller Spin": "#7fa2a7",
- "Puppet": "#302B6D",
- "PureBasic": "#5a6986",
- "PureScript": "#1D222D",
- "Python": "#3572A5",
- "QML": "#44a51c",
- "Quake": "#882233",
- "R": "#198CE7",
- "RAML": "#77d9fb",
- "RUNOFF": "#665a4e",
- "Racket": "#3c5caa",
- "Ragel": "#9d5200",
- "Raku": "#0000fb",
- "Rascal": "#fffaa0",
- "Reason": "#ff5847",
- "Rebol": "#358a5b",
- "Red": "#f50000",
- "Ren'Py": "#ff7f7f",
- "Ring": "#2D54CB",
- "Riot": "#A71E49",
- "Roff": "#ecdebe",
- "Rouge": "#cc0088",
- "Ruby": "#701516",
- "Rust": "#dea584",
- "SAS": "#B34936",
- "SQF": "#3F3F3F",
- "SRecode Template": "#348a34",
- "SaltStack": "#646464",
- "Scala": "#c22d40",
- "Scheme": "#1e4aec",
- "Self": "#0579aa",
- "Shell": "#89e051",
- "Shen": "#120F14",
- "Slash": "#007eff",
- "Slice": "#003fa2",
- "SmPL": "#c94949",
- "Smalltalk": "#596706",
- "Solidity": "#AA6746",
- "SourcePawn": "#5c7611",
- "Squirrel": "#800000",
- "Stan": "#b2011d",
- "Standard ML": "#dc566d",
- "Starlark": "#76d275",
- "SuperCollider": "#46390b",
- "Swift": "#ffac45",
- "SystemVerilog": "#DAE1C2",
- "TI Program": "#A0AA87",
- "Tcl": "#e4cc98",
- "TeX": "#3D6117",
- "Terra": "#00004c",
- "Turing": "#cf142b",
- "TypeScript": "#2b7489",
- "UnrealScript": "#a54c4d",
- "V": "#5d87bd",
- "VBA": "#867db1",
- "VBScript": "#15dcdc",
- "VCL": "#148AA8",
- "VHDL": "#adb2cb",
- "Vala": "#fbe5cd",
- "Verilog": "#b2b7f8",
- "Vim script": "#199f4b",
- "Visual Basic .NET": "#945db7",
- "Volt": "#1F1F1F",
- "Vue": "#2c3e50",
- "WebAssembly": "#04133b",
- "Wollok": "#a23738",
- "X10": "#4B6BEF",
- "XC": "#99DA07",
- "XQuery": "#5232e7",
- "XSLT": "#EB8CEB",
- "YARA": "#220000",
- "YASnippet": "#32AB90",
- "Yacc": "#4B6C4B",
- "ZAP": "#0d665e",
- "ZIL": "#dc75e5",
- "ZenScript": "#00BCD1",
- "Zephir": "#118f9e",
- "Zig": "#ec915c",
- "eC": "#913960",
- "mIRC Script": "#926059",
- "mcfunction": "#E22837",
- "nesC": "#94B0C7",
- "ooc": "#b0b77e",
- "q": "#0040cd",
- "sed": "#64b970",
- "wdl": "#42f1f4",
- "wisp": "#7582D1",
- "xBase": "#403a40",
-}
+ "1C Enterprise": "#814CCC",
+ ABAP: "#E8274B",
+ "AGS Script": "#B9D9FF",
+ AMPL: "#E6EFBB",
+ ANTLR: "#9DC3FF",
+ "API Blueprint": "#2ACCA8",
+ APL: "#5A8164",
+ ASP: "#6a40fd",
+ ATS: "#1ac620",
+ ActionScript: "#882B0F",
+ Ada: "#02f88c",
+ Agda: "#315665",
+ Alloy: "#64C800",
+ AngelScript: "#C7D7DC",
+ AppleScript: "#101F1F",
+ Arc: "#aa2afe",
+ AspectJ: "#a957b0",
+ Assembly: "#6E4C13",
+ Asymptote: "#4a0c0c",
+ AutoHotkey: "#6594b9",
+ AutoIt: "#1C3552",
+ Ballerina: "#FF5000",
+ Batchfile: "#C1F12E",
+ BlitzMax: "#cd6400",
+ Boo: "#d4bec1",
+ Brainfuck: "#2F2530",
+ C: "#555555",
+ "C#": "#178600",
+ "C++": "#f34b7d",
+ CSS: "#563d7c",
+ Ceylon: "#dfa535",
+ Chapel: "#8dc63f",
+ Cirru: "#ccccff",
+ Clarion: "#db901e",
+ Clean: "#3F85AF",
+ Click: "#E4E6F3",
+ Clojure: "#db5855",
+ CoffeeScript: "#244776",
+ ColdFusion: "#ed2cd6",
+ "Common Lisp": "#3fb68b",
+ "Common Workflow Language": "#B5314C",
+ "Component Pascal": "#B0CE4E",
+ Crystal: "#000100",
+ Cuda: "#3A4E3A",
+ D: "#ba595e",
+ DM: "#447265",
+ Dart: "#00B4AB",
+ DataWeave: "#003a52",
+ Dhall: "#dfafff",
+ Dockerfile: "#384d54",
+ Dogescript: "#cca760",
+ Dylan: "#6c616e",
+ E: "#ccce35",
+ ECL: "#8a1267",
+ EQ: "#a78649",
+ Eiffel: "#946d57",
+ Elixir: "#6e4a7e",
+ Elm: "#60B5CC",
+ "Emacs Lisp": "#c065db",
+ EmberScript: "#FFF4F3",
+ Erlang: "#B83998",
+ "F#": "#b845fc",
+ "F*": "#572e30",
+ FLUX: "#88ccff",
+ Factor: "#636746",
+ Fancy: "#7b9db4",
+ Fantom: "#14253c",
+ Faust: "#c37240",
+ Forth: "#341708",
+ Fortran: "#4d41b1",
+ FreeMarker: "#0050b2",
+ Frege: "#00cafe",
+ "G-code": "#D08CF2",
+ GAML: "#FFC766",
+ GDScript: "#355570",
+ "Game Maker Language": "#71b417",
+ Genie: "#fb855d",
+ Gherkin: "#5B2063",
+ Glyph: "#c1ac7f",
+ Gnuplot: "#f0a9f0",
+ Go: "#00ADD8",
+ Golo: "#88562A",
+ Gosu: "#82937f",
+ "Grammatical Framework": "#79aa7a",
+ Groovy: "#e69f56",
+ HTML: "#e34c26",
+ Hack: "#878787",
+ Harbour: "#0e60e3",
+ Haskell: "#5e5086",
+ Haxe: "#df7900",
+ HiveQL: "#dce200",
+ HolyC: "#ffefaf",
+ Hy: "#7790B2",
+ IDL: "#a3522f",
+ "IGOR Pro": "#0000cc",
+ Idris: "#b30000",
+ Io: "#a9188d",
+ Ioke: "#078193",
+ Isabelle: "#FEFE00",
+ J: "#9EEDFF",
+ JSONiq: "#40d47e",
+ Java: "#b07219",
+ JavaScript: "#f1e05a",
+ Jolie: "#843179",
+ Jsonnet: "#0064bd",
+ Julia: "#a270ba",
+ "Jupyter Notebook": "#DA5B0B",
+ KRL: "#28430A",
+ Kotlin: "#F18E33",
+ LFE: "#4C3023",
+ LLVM: "#185619",
+ LOLCODE: "#cc9900",
+ LSL: "#3d9970",
+ Lasso: "#999999",
+ Lex: "#DBCA00",
+ LiveScript: "#499886",
+ LookML: "#652B81",
+ Lua: "#000080",
+ MATLAB: "#e16737",
+ MAXScript: "#00a6a6",
+ MLIR: "#5EC8DB",
+ MQL4: "#62A8D6",
+ MQL5: "#4A76B8",
+ MTML: "#b7e1f4",
+ Makefile: "#427819",
+ Mask: "#f97732",
+ Max: "#c4a79c",
+ Mercury: "#ff2b2b",
+ Meson: "#007800",
+ Metal: "#8f14e9",
+ Mirah: "#c7a938",
+ "Modula-3": "#223388",
+ NCL: "#28431f",
+ Nearley: "#990000",
+ Nemerle: "#3d3c6e",
+ NetLinx: "#0aa0ff",
+ "NetLinx+ERB": "#747faa",
+ NetLogo: "#ff6375",
+ NewLisp: "#87AED7",
+ Nextflow: "#3ac486",
+ Nim: "#37775b",
+ Nit: "#009917",
+ Nix: "#7e7eff",
+ Nu: "#c9df40",
+ OCaml: "#3be133",
+ ObjectScript: "#424893",
+ "Objective-C": "#438eff",
+ "Objective-C++": "#6866fb",
+ "Objective-J": "#ff0c5a",
+ Odin: "#60AFFE",
+ Omgrofl: "#cabbff",
+ Opal: "#f7ede0",
+ OpenQASM: "#AA70FF",
+ Oxygene: "#cdd0e3",
+ Oz: "#fab738",
+ P4: "#7055b5",
+ PHP: "#4F5D95",
+ PLSQL: "#dad8d8",
+ Pan: "#cc0000",
+ Papyrus: "#6600cc",
+ Parrot: "#f3ca0a",
+ Pascal: "#E3F171",
+ Pawn: "#dbb284",
+ Pep8: "#C76F5B",
+ Perl: "#0298c3",
+ PigLatin: "#fcd7de",
+ Pike: "#005390",
+ PogoScript: "#d80074",
+ PostScript: "#da291c",
+ PowerBuilder: "#8f0f8d",
+ PowerShell: "#012456",
+ Processing: "#0096D8",
+ Prolog: "#74283c",
+ "Propeller Spin": "#7fa2a7",
+ Puppet: "#302B6D",
+ PureBasic: "#5a6986",
+ PureScript: "#1D222D",
+ Python: "#3572A5",
+ QML: "#44a51c",
+ Quake: "#882233",
+ R: "#198CE7",
+ RAML: "#77d9fb",
+ RUNOFF: "#665a4e",
+ Racket: "#3c5caa",
+ Ragel: "#9d5200",
+ Raku: "#0000fb",
+ Rascal: "#fffaa0",
+ Reason: "#ff5847",
+ Rebol: "#358a5b",
+ Red: "#f50000",
+ "Ren'Py": "#ff7f7f",
+ Ring: "#2D54CB",
+ Riot: "#A71E49",
+ Roff: "#ecdebe",
+ Rouge: "#cc0088",
+ Ruby: "#701516",
+ Rust: "#dea584",
+ SAS: "#B34936",
+ SQF: "#3F3F3F",
+ "SRecode Template": "#348a34",
+ SaltStack: "#646464",
+ Scala: "#c22d40",
+ Scheme: "#1e4aec",
+ Self: "#0579aa",
+ Shell: "#89e051",
+ Shen: "#120F14",
+ Slash: "#007eff",
+ Slice: "#003fa2",
+ SmPL: "#c94949",
+ Smalltalk: "#596706",
+ Solidity: "#AA6746",
+ SourcePawn: "#5c7611",
+ Squirrel: "#800000",
+ Stan: "#b2011d",
+ "Standard ML": "#dc566d",
+ Starlark: "#76d275",
+ SuperCollider: "#46390b",
+ Swift: "#ffac45",
+ SystemVerilog: "#DAE1C2",
+ "TI Program": "#A0AA87",
+ Tcl: "#e4cc98",
+ TeX: "#3D6117",
+ Terra: "#00004c",
+ Turing: "#cf142b",
+ TypeScript: "#2b7489",
+ UnrealScript: "#a54c4d",
+ V: "#5d87bd",
+ VBA: "#867db1",
+ VBScript: "#15dcdc",
+ VCL: "#148AA8",
+ VHDL: "#adb2cb",
+ Vala: "#fbe5cd",
+ Verilog: "#b2b7f8",
+ "Vim script": "#199f4b",
+ "Visual Basic .NET": "#945db7",
+ Volt: "#1F1F1F",
+ Vue: "#2c3e50",
+ WebAssembly: "#04133b",
+ Wollok: "#a23738",
+ X10: "#4B6BEF",
+ XC: "#99DA07",
+ XQuery: "#5232e7",
+ XSLT: "#EB8CEB",
+ YARA: "#220000",
+ YASnippet: "#32AB90",
+ Yacc: "#4B6C4B",
+ ZAP: "#0d665e",
+ ZIL: "#dc75e5",
+ ZenScript: "#00BCD1",
+ Zephir: "#118f9e",
+ Zig: "#ec915c",
+ eC: "#913960",
+ "mIRC Script": "#926059",
+ mcfunction: "#E22837",
+ nesC: "#94B0C7",
+ ooc: "#b0b77e",
+ q: "#0040cd",
+ sed: "#64b970",
+ wdl: "#42f1f4",
+ wisp: "#7582D1",
+ xBase: "#403a40",
+};
-function getLabel(isZh,key){
- if(isZh){
- return zhCN[key]
- }else{
- return esUN[key]
- }
+function getLabel(isZh, key) {
+ if (isZh) {
+ return zhCN[key];
+ } else {
+ return esUN[key];
+ }
}
-var zhCN={
- "search":"搜索",
- "search_repo":"项目",
- "search_dataset":"数据集",
- "search_issue":"任务",
- "search_pr":"合并请求",
- "search_user":"用户",
- "search_org":"组织",
- "search_finded":"找到",
- "search_matched":"最佳匹配",
- "search_matched_download":"下载次数",
- "search_lasted_update":"最后更新于",
- "search_letter_asc":"字母顺序排序",
- "search_letter_desc":"字母逆序排序",
- "search_lasted_create":"最近创建",
- "search_early_create":"最早创建",
- "search_add_by":"加入于",
- "search_lasted":"最近更新",
- "search_open":"开启中",
- "search_closed":"已关闭",
- "search_watched":"关注数",
- "search_star":"点赞数",
- "search_fork":"Fork数",
- "search_input_large_0":"请输入大于0的数值。",
- "search_input_maxed":"不能超出总页数。",
- "search_input_total":"共",
- "search_srtip":"条",
- "search_home_page":"首页",
- "search_last_page":"末页",
- "search_go_to":"前往",
- "search_go_page":"页",
- "find_title":"“{keyword}”相关{tablename}约为{total}个",
- "search_empty":"请输入任意关键字开始搜索。"
- }
-
- var esUN={
- "search":"Search",
- "search_repo":"Repository",
- "search_dataset":"DataSet",
- "search_issue":"Issue",
- "search_pr":"Pull Request",
- "search_user":"User",
- "search_org":"Organization",
- "search_finded":"Find",
- "search_matched":"Best Match",
- "search_matched_download":"Most downloads",
- "search_lasted_update":"Updated ",
- "search_letter_asc":"Alphabetically",
- "search_letter_desc":"Reverse alphabetically",
- "search_lasted_create":"Recently created",
- "search_early_create":"First created",
- "search_add_by":"Joined on",
- "search_lasted":"Recently updated",
- "search_open":"Open",
- "search_closed":"Closed",
- "search_watched":"Watches",
- "search_star":"Stars",
- "search_fork":"Forks",
- "search_input_large_0":"Please enter a value greater than 0.",
- "search_input_maxed":"Cannot exceed total pages.",
- "search_input_total":"Total",
- "search_srtip":"",
- "search_home_page":"First",
- "search_last_page":"Last",
- "search_go_to":"Go",
- "search_go_page":"Page",
- "find_title":" {total} \"{keyword}\" related {tablename}",
- "search_empty":"Please enter any keyword to start the search."
- }
- initDiv(false);
- document.onreadystatechange = function() {
- if (document.readyState === "complete") {
- var tmpSearchLabel = sessionStorage.getItem("searchLabel");
- console.log("tmpSearchLabel=" + tmpSearchLabel);
- if(tmpSearchLabel){
- console.log("search label....");
- sessionStorage.removeItem("searchLabel");
- doSearchLabel(sessionStorage.getItem("tableName"),sessionStorage.getItem("keyword"),sessionStorage.getItem("sortBy"),sessionStorage.getItem("ascending"));
- }else{
- var specifySearch = sessionStorage.getItem("specifySearch");
- if(specifySearch){
- sessionStorage.removeItem("specifySearch");
- console.log("search sepcial keyword=...." + sessionStorage.getItem("keyword"));
- document.getElementById("keyword_input").value = sessionStorage.getItem("keyword");
- doSpcifySearch(sessionStorage.getItem("tableName"),sessionStorage.getItem("keyword"),sessionStorage.getItem("sortBy"),sessionStorage.getItem("ascending"));
- }else{
- console.log("normal search....");
- search();
- }
-
- }
- }
- }
+var zhCN = {
+ search: "搜索",
+ search_repo: "项目",
+ search_dataset: "数据集",
+ search_issue: "任务",
+ search_pr: "合并请求",
+ search_user: "用户",
+ search_org: "组织",
+ search_finded: "找到",
+ search_matched: "最佳匹配",
+ search_matched_download: "下载次数",
+ search_lasted_update: "最后更新于",
+ search_letter_asc: "字母顺序排序",
+ search_letter_desc: "字母逆序排序",
+ search_lasted_create: "最近创建",
+ search_early_create: "最早创建",
+ search_add_by: "加入于",
+ search_lasted: "最近更新",
+ search_open: "开启中",
+ search_closed: "已关闭",
+ search_watched: "关注数",
+ search_star: "点赞数",
+ search_fork: "Fork数",
+ search_input_large_0: "请输入大于0的数值。",
+ search_input_maxed: "不能超出总页数。",
+ search_input_total: "共",
+ search_srtip: "条",
+ search_home_page: "首页",
+ search_last_page: "末页",
+ search_go_to: "前往",
+ search_go_page: "页",
+ find_title:
+ '“{keyword}”相关{tablename}约为{total}个',
+ search_empty: "请输入任意关键字开始搜索。",
+};
-
+var esUN = {
+ search: "Search",
+ search_repo: "Repository",
+ search_dataset: "DataSet",
+ search_issue: "Issue",
+ search_pr: "Pull Request",
+ search_user: "User",
+ search_org: "Organization",
+ search_finded: "Find",
+ search_matched: "Best Match",
+ search_matched_download: "Most downloads",
+ search_lasted_update: "Updated ",
+ search_letter_asc: "Alphabetically",
+ search_letter_desc: "Reverse alphabetically",
+ search_lasted_create: "Recently created",
+ search_early_create: "First created",
+ search_add_by: "Joined on",
+ search_lasted: "Recently updated",
+ search_open: "Open",
+ search_closed: "Closed",
+ search_watched: "Watches",
+ search_star: "Stars",
+ search_fork: "Forks",
+ search_input_large_0: "Please enter a value greater than 0.",
+ search_input_maxed: "Cannot exceed total pages.",
+ search_input_total: "Total",
+ search_srtip: "",
+ search_home_page: "First",
+ search_last_page: "Last",
+ search_go_to: "Go",
+ search_go_page: "Page",
+ find_title:
+ ' {total} "{keyword}" related {tablename}',
+ search_empty:
+ "Please enter any keyword to start the search.",
+};
+initDiv(false);
+document.onreadystatechange = function () {
+ if (document.readyState === "complete") {
+ var tmpSearchLabel = sessionStorage.getItem("searchLabel");
+ if (tmpSearchLabel) {
+ sessionStorage.removeItem("searchLabel");
+ doSearchLabel(
+ sessionStorage.getItem("tableName"),
+ sessionStorage.getItem("keyword"),
+ sessionStorage.getItem("sortBy"),
+ sessionStorage.getItem("ascending")
+ );
+ } else {
+ var specifySearch = sessionStorage.getItem("specifySearch");
+ if (specifySearch) {
+ sessionStorage.removeItem("specifySearch");
+ document.getElementById("keyword_input").value =
+ sessionStorage.getItem("keyword");
+ doSpcifySearch(
+ sessionStorage.getItem("tableName"),
+ sessionStorage.getItem("keyword"),
+ sessionStorage.getItem("sortBy"),
+ sessionStorage.getItem("ascending")
+ );
+ } else {
+ search();
+ }
+ }
+ }
+};
diff --git a/public/self/js/notebook/es5-shim.min.js b/public/self/js/notebook/es5-shim.min.js
index f301219d9..bd2883959 100644
--- a/public/self/js/notebook/es5-shim.min.js
+++ b/public/self/js/notebook/es5-shim.min.js
@@ -4,4 +4,3 @@
* see https://github.com/es-shims/es5-shim/blob/master/LICENSE
*/
(function(t,r){"use strict";if(typeof define==="function"&&define.amd){define(r)}else if(typeof exports==="object"){module.exports=r()}else{t.returnExports=r()}})(this,function(){var t=Array;var r=t.prototype;var e=Object;var n=e.prototype;var i=Function;var a=i.prototype;var o=String;var f=o.prototype;var u=Number;var l=u.prototype;var s=r.slice;var c=r.splice;var v=r.push;var h=r.unshift;var p=r.concat;var y=r.join;var d=a.call;var g=a.apply;var w=Math.max;var b=Math.min;var T=n.toString;var m=typeof Symbol==="function"&&typeof Symbol.toStringTag==="symbol";var D;var S=Function.prototype.toString,x=/^\s*class /,O=function isES6ClassFn(t){try{var r=S.call(t);var e=r.replace(/\/\/.*\n/g,"");var n=e.replace(/\/\*[.\s\S]*\*\//g,"");var i=n.replace(/\n/gm," ").replace(/ {2}/g," ");return x.test(i)}catch(a){return false}},E=function tryFunctionObject(t){try{if(O(t)){return false}S.call(t);return true}catch(r){return false}},j="[object Function]",I="[object GeneratorFunction]",D=function isCallable(t){if(!t){return false}if(typeof t!=="function"&&typeof t!=="object"){return false}if(m){return E(t)}if(O(t)){return false}var r=T.call(t);return r===j||r===I};var M;var U=RegExp.prototype.exec,$=function tryRegexExec(t){try{U.call(t);return true}catch(r){return false}},F="[object RegExp]";M=function isRegex(t){if(typeof t!=="object"){return false}return m?$(t):T.call(t)===F};var N;var C=String.prototype.valueOf,k=function tryStringObject(t){try{C.call(t);return true}catch(r){return false}},A="[object String]";N=function isString(t){if(typeof t==="string"){return true}if(typeof t!=="object"){return false}return m?k(t):T.call(t)===A};var R=e.defineProperty&&function(){try{var t={};e.defineProperty(t,"x",{enumerable:false,value:t});for(var r in t){return false}return t.x===t}catch(n){return false}}();var P=function(t){var r;if(R){r=function(t,r,n,i){if(!i&&r in t){return}e.defineProperty(t,r,{configurable:true,enumerable:false,writable:true,value:n})}}else{r=function(t,r,e,n){if(!n&&r in t){return}t[r]=e}}return function defineProperties(e,n,i){for(var a in n){if(t.call(n,a)){r(e,a,n[a],i)}}}}(n.hasOwnProperty);var J=function isPrimitive(t){var r=typeof t;return t===null||r!=="object"&&r!=="function"};var Y=u.isNaN||function isActualNaN(t){return t!==t};var z={ToInteger:function ToInteger(t){var r=+t;if(Y(r)){r=0}else if(r!==0&&r!==1/0&&r!==-(1/0)){r=(r>0||-1)*Math.floor(Math.abs(r))}return r},ToPrimitive:function ToPrimitive(t){var r,e,n;if(J(t)){return t}e=t.valueOf;if(D(e)){r=e.call(t);if(J(r)){return r}}n=t.toString;if(D(n)){r=n.call(t);if(J(r)){return r}}throw new TypeError},ToObject:function(t){if(t==null){throw new TypeError("can't convert "+t+" to object")}return e(t)},ToUint32:function ToUint32(t){return t>>>0}};var Z=function Empty(){};P(a,{bind:function bind(t){var r=this;if(!D(r)){throw new TypeError("Function.prototype.bind called on incompatible "+r)}var n=s.call(arguments,1);var a;var o=function(){if(this instanceof a){var i=g.call(r,this,p.call(n,s.call(arguments)));if(e(i)===i){return i}return this}else{return g.call(r,t,p.call(n,s.call(arguments)))}};var f=w(0,r.length-n.length);var u=[];for(var l=0;l0){r[e]=t[e]}return q(r,L(arguments,1))};B=function arraySliceApplyIE(t,r){return q(W(t),r)}}}var K=d.bind(f.slice);var Q=d.bind(f.split);var V=d.bind(f.indexOf);var _=d.bind(v);var tt=d.bind(n.propertyIsEnumerable);var rt=d.bind(r.sort);var et=t.isArray||function isArray(t){return H(t)==="[object Array]"};var nt=[].unshift(0)!==1;P(r,{unshift:function(){h.apply(this,arguments);return this.length}},nt);P(t,{isArray:et});var it=e("a");var at=it[0]!=="a"||!(0 in it);var ot=function properlyBoxed(t){var r=true;var e=true;var n=false;if(t){try{t.call("foo",function(t,e,n){if(typeof n!=="object"){r=false}});t.call([1],function(){"use strict";e=typeof this==="string"},"x")}catch(i){n=true}}return!!t&&!n&&r&&e};P(r,{forEach:function forEach(t){var r=z.ToObject(this);var e=at&&N(this)?Q(this,""):r;var n=-1;var i=z.ToUint32(e.length);var a;if(arguments.length>1){a=arguments[1]}if(!D(t)){throw new TypeError("Array.prototype.forEach callback must be a function")}while(++n1){o=arguments[1]}if(!D(r)){throw new TypeError("Array.prototype.map callback must be a function")}for(var f=0;f1){o=arguments[1]}if(!D(t)){throw new TypeError("Array.prototype.filter callback must be a function")}for(var f=0;f1){i=arguments[1]}if(!D(t)){throw new TypeError("Array.prototype.every callback must be a function")}for(var a=0;a1){i=arguments[1]}if(!D(t)){throw new TypeError("Array.prototype.some callback must be a function")}for(var a=0;a=2){a=arguments[1]}else{do{if(i in e){a=e[i++];break}if(++i>=n){throw new TypeError("reduce of empty array with no initial value")}}while(true)}for(;i=2){i=arguments[1]}else{do{if(a in e){i=e[a--];break}if(--a<0){throw new TypeError("reduceRight of empty array with no initial value")}}while(true)}if(a<0){return i}do{if(a in e){i=t(i,e[a],a,r)}}while(a--);return i}},!ut);var lt=r.indexOf&&[0,1].indexOf(1,2)!==-1;P(r,{indexOf:function indexOf(t){var r=at&&N(this)?Q(this,""):z.ToObject(this);var e=z.ToUint32(r.length);if(e===0){return-1}var n=0;if(arguments.length>1){n=z.ToInteger(arguments[1])}n=n>=0?n:w(0,e+n);for(;n1){n=b(n,z.ToInteger(arguments[1]))}n=n>=0?n:e-Math.abs(n);for(;n>=0;n--){if(n in r&&t===r[n]){return n}}return-1}},st);var ct=function(){var t=[1,2];var r=t.splice();return t.length===2&&et(r)&&r.length===0}();P(r,{splice:function splice(t,r){if(arguments.length===0){return[]}else{return c.apply(this,arguments)}}},!ct);var vt=function(){var t={};r.splice.call(t,0,0,1);return t.length===1}();P(r,{splice:function splice(t,r){if(arguments.length===0){return[]}var e=arguments;this.length=w(z.ToInteger(this.length),0);if(arguments.length>0&&typeof r!=="number"){e=W(arguments);if(e.length<2){_(e,this.length-t)}else{e[1]=z.ToInteger(r)}}return c.apply(this,e)}},!vt);var ht=function(){var r=new t(1e5);r[8]="x";r.splice(1,1);return r.indexOf("x")===7}();var pt=function(){var t=256;var r=[];r[t]="a";r.splice(t+1,0,"b");return r[t]==="a"}();P(r,{splice:function splice(t,r){var e=z.ToObject(this);var n=[];var i=z.ToUint32(e.length);var a=z.ToInteger(t);var f=a<0?w(i+a,0):b(a,i);var u=arguments.length===0?0:arguments.length===1?i-f:b(w(z.ToInteger(r),0),i-f);var l=0;var s;while(ly){delete e[l-1];l-=1}}else if(v>u){l=i-u;while(l>f){s=o(l+u-1);h=o(l+v-1);if(G(e,s)){e[h]=e[s]}else{delete e[h]}l-=1}}l=f;for(var d=0;d=0&&!et(t)&&D(t.callee)};var kt=Nt(arguments)?Nt:Ct;P(e,{keys:function keys(t){var r=D(t);var e=kt(t);var n=t!==null&&typeof t==="object";var i=n&&N(t);if(!n&&!r&&!e){throw new TypeError("Object.keys called on a non-object")}var a=[];var f=Ot&&r;if(i&&Et||e){for(var u=0;u11){return t+1}return t},getMonth:function getMonth(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=Bt(this);var r=Xt(this);if(t<0&&r>11){return 0}return r},getDate:function getDate(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=Bt(this);var r=Xt(this);var e=Lt(this);if(t<0&&r>11){if(r===12){return e}var n=ar(0,t+1);return n-e+1}return e},getUTCFullYear:function getUTCFullYear(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=qt(this);if(t<0&&Kt(this)>11){return t+1}return t},getUTCMonth:function getUTCMonth(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=qt(this);var r=Kt(this);if(t<0&&r>11){return 0}return r},getUTCDate:function getUTCDate(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=qt(this);var r=Kt(this);var e=Qt(this);if(t<0&&r>11){if(r===12){return e}var n=ar(0,t+1);return n-e+1}return e}},Jt);P(Date.prototype,{toUTCString:function toUTCString(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=Vt(this);var r=Qt(this);var e=Kt(this);var n=qt(this);var i=_t(this);var a=tr(this);var o=rr(this);return nr[t]+", "+(r<10?"0"+r:r)+" "+ir[e]+" "+n+" "+(i<10?"0"+i:i)+":"+(a<10?"0"+a:a)+":"+(o<10?"0"+o:o)+" GMT"}},Jt||Zt);P(Date.prototype,{toDateString:function toDateString(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=this.getDay();var r=this.getDate();var e=this.getMonth();var n=this.getFullYear();return nr[t]+" "+ir[e]+" "+(r<10?"0"+r:r)+" "+n}},Jt||Gt);if(Jt||Ht){Date.prototype.toString=function toString(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=this.getDay();var r=this.getDate();var e=this.getMonth();var n=this.getFullYear();var i=this.getHours();var a=this.getMinutes();var o=this.getSeconds();var f=this.getTimezoneOffset();var u=Math.floor(Math.abs(f)/60);var l=Math.floor(Math.abs(f)%60);return nr[t]+" "+ir[e]+" "+(r<10?"0"+r:r)+" "+n+" "+(i<10?"0"+i:i)+":"+(a<10?"0"+a:a)+":"+(o<10?"0"+o:o)+" GMT"+(f>0?"-":"+")+(u<10?"0"+u:u)+(l<10?"0"+l:l)};if(R){e.defineProperty(Date.prototype,"toString",{configurable:true,enumerable:false,writable:true})}}var or=-621987552e5;var fr="-000001";var ur=Date.prototype.toISOString&&new Date(or).toISOString().indexOf(fr)===-1;var lr=Date.prototype.toISOString&&new Date(-1).toISOString()!=="1969-12-31T23:59:59.999Z";var sr=d.bind(Date.prototype.getTime);P(Date.prototype,{toISOString:function toISOString(){if(!isFinite(this)||!isFinite(sr(this))){throw new RangeError("Date.prototype.toISOString called on non-finite value.")}var t=qt(this);var r=Kt(this);t+=Math.floor(r/12);r=(r%12+12)%12;var e=[r+1,Qt(this),_t(this),tr(this),rr(this)];t=(t<0?"-":t>9999?"+":"")+K("00000"+Math.abs(t),0<=t&&t<=9999?-4:-6);for(var n=0;n=7&&l>yr){var p=Math.floor(l/yr)*yr;var y=Math.floor(p/1e3);v+=y;h-=y*1e3}c=s===1&&o(e)===e?new t(r.parse(e)):s>=7?new t(e,n,i,a,f,v,h):s>=6?new t(e,n,i,a,f,v):s>=5?new t(e,n,i,a,f):s>=4?new t(e,n,i,a):s>=3?new t(e,n,i):s>=2?new t(e,n):s>=1?new t(e instanceof t?+e:e):new t}else{c=t.apply(this,arguments)}if(!J(c)){P(c,{constructor:r},true)}return c};var e=new RegExp("^"+"(\\d{4}|[+-]\\d{6})"+"(?:-(\\d{2})"+"(?:-(\\d{2})"+"(?:"+"T(\\d{2})"+":(\\d{2})"+"(?:"+":(\\d{2})"+"(?:(\\.\\d{1,}))?"+")?"+"("+"Z|"+"(?:"+"([-+])"+"(\\d{2})"+":(\\d{2})"+")"+")?)?)?)?"+"$");var n=[0,31,59,90,120,151,181,212,243,273,304,334,365];var i=function dayFromMonth(t,r){var e=r>1?1:0;return n[r]+Math.floor((t-1969+e)/4)-Math.floor((t-1901+e)/100)+Math.floor((t-1601+e)/400)+365*(t-1970)};var a=function toUTC(r){var e=0;var n=r;if(dr&&n>yr){var i=Math.floor(n/yr)*yr;var a=Math.floor(i/1e3);e+=a;n-=a*1e3}return u(new t(1970,0,1,0,0,e,n))};for(var f in t){if(G(t,f)){r[f]=t[f]}}P(r,{now:t.now,UTC:t.UTC},true);r.prototype=t.prototype;P(r.prototype,{constructor:r},true);var l=function parse(r){var n=e.exec(r);if(n){var o=u(n[1]),f=u(n[2]||1)-1,l=u(n[3]||1)-1,s=u(n[4]||0),c=u(n[5]||0),v=u(n[6]||0),h=Math.floor(u(n[7]||0)*1e3),p=Boolean(n[4]&&!n[8]),y=n[9]==="-"?1:-1,d=u(n[10]||0),g=u(n[11]||0),w;var b=c>0||v>0||h>0;if(s<(b?24:25)&&c<60&&v<60&&h<1e3&&f>-1&&f<12&&d<24&&g<60&&l>-1&&l=0){e+=wr.data[r];wr.data[r]=Math.floor(e/t);e=e%t*wr.base}},numToString:function numToString(){var t=wr.size;var r="";while(--t>=0){if(r!==""||t===0||wr.data[t]!==0){var e=o(wr.data[t]);if(r===""){r=e}else{r+=K("0000000",0,7-e.length)+e}}}return r},pow:function pow(t,r,e){return r===0?e:r%2===1?pow(t,r-1,e*t):pow(t*t,r/2,e)},log:function log(t){var r=0;var e=t;while(e>=4096){r+=12;e/=4096}while(e>=2){r+=1;e/=2}return r}};var br=function toFixed(t){var r,e,n,i,a,f,l,s;r=u(t);r=Y(r)?0:Math.floor(r);if(r<0||r>20){throw new RangeError("Number.toFixed called with invalid number of decimals")}e=u(this);if(Y(e)){return"NaN"}if(e<=-1e21||e>=1e21){return o(e)}n="";if(e<0){n="-";e=-e}i="0";if(e>1e-21){a=wr.log(e*wr.pow(2,69,1))-69;f=a<0?e*wr.pow(2,-a,1):e/wr.pow(2,a,1);f*=4503599627370496;a=52-a;if(a>0){wr.multiply(0,f);l=r;while(l>=7){wr.multiply(1e7,0);l-=7}wr.multiply(wr.pow(10,l,1),0);l=a-1;while(l>=23){wr.divide(1<<23);l-=23}wr.divide(1<0){s=i.length;if(s<=r){i=n+K("0.0000000000000000000",0,r-s+2)+i}else{i=n+K(i,0,s-r)+"."+K(i,s-r)}}else{i=n+i}return i};P(l,{toFixed:br},gr);var Tr=function(){try{return 1..toPrecision(undefined)==="1"}catch(t){return true}}();var mr=l.toPrecision;P(l,{toPrecision:function toPrecision(t){return typeof t==="undefined"?mr.call(this):mr.call(this,t)}},Tr);if("ab".split(/(?:ab)*/).length!==2||".".split(/(.?)(.?)/).length!==4||"tesst".split(/(s)*/)[1]==="t"||"test".split(/(?:)/,-1).length!==4||"".split(/.?/).length||".".split(/()()/).length>1){(function(){var t=typeof/()??/.exec("")[1]==="undefined";var r=Math.pow(2,32)-1;f.split=function(e,n){var i=String(this);if(typeof e==="undefined"&&n===0){return[]}if(!M(e)){return Q(this,e,n)}var a=[];var o=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),f=0,u,l,s,c;var h=new RegExp(e.source,o+"g");if(!t){u=new RegExp("^"+h.source+"$(?!\\s)",o)}var p=typeof n==="undefined"?r:z.ToUint32(n);l=h.exec(i);while(l){s=l.index+l[0].length;if(s>f){_(a,K(i,f,l.index));if(!t&&l.length>1){l[0].replace(u,function(){for(var t=1;t1&&l.index=p){break}}if(h.lastIndex===l.index){h.lastIndex++}l=h.exec(i)}if(f===i.length){if(c||!h.test("")){_(a,"")}}else{_(a,K(i,f))}return a.length>p?W(a,0,p):a}})()}else if("0".split(void 0,0).length){f.split=function split(t,r){if(typeof t==="undefined"&&r===0){return[]}return Q(this,t,r)}}var Dr=f.replace;var Sr=function(){var t=[];"x".replace(/x(.)?/g,function(r,e){_(t,e)});return t.length===1&&typeof t[0]==="undefined"}();if(!Sr){f.replace=function replace(t,r){var e=D(r);var n=M(t)&&/\)[*?]/.test(t.source);if(!e||!n){return Dr.call(this,t,r)}else{var i=function(e){var n=arguments.length;var i=t.lastIndex;t.lastIndex=0;var a=t.exec(e)||[];t.lastIndex=i;_(a,arguments[n-2],arguments[n-1]);return r.apply(this,a)};return Dr.call(this,t,i)}}}var xr=f.substr;var Or="".substr&&"0b".substr(-1)!=="b";P(f,{substr:function substr(t,r){var e=t;if(t<0){e=w(this.length+t,0)}return xr.call(this,e,r)}},Or);var Er="\t\n\x0B\f\r \xa0\u1680\u180e\u2000\u2001\u2002\u2003"+"\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028"+"\u2029\ufeff";var jr="\u200b";var Ir="["+Er+"]";var Mr=new RegExp("^"+Ir+Ir+"*");var Ur=new RegExp(Ir+Ir+"*$");var $r=f.trim&&(Er.trim()||!jr.trim());P(f,{trim:function trim(){if(typeof this==="undefined"||this===null){throw new TypeError("can't convert "+this+" to object")}return o(this).replace(Mr,"").replace(Ur,"")}},$r);var Fr=d.bind(String.prototype.trim);var Nr=f.lastIndexOf&&"abc\u3042\u3044".lastIndexOf("\u3042\u3044",2)!==-1;P(f,{lastIndexOf:function lastIndexOf(t){if(typeof this==="undefined"||this===null){throw new TypeError("can't convert "+this+" to object")}var r=o(this);var e=o(t);var n=arguments.length>1?u(arguments[1]):NaN;var i=Y(n)?Infinity:z.ToInteger(n);var a=b(w(i,0),r.length);var f=e.length;var l=a+f;while(l>0){l=w(0,l-f);var s=V(K(r,l,a+f),e);if(s!==-1){return l+s}}return-1}},Nr);var Cr=f.lastIndexOf;P(f,{lastIndexOf:function lastIndexOf(t){return Cr.apply(this,arguments)}},f.lastIndexOf.length!==1);if(parseInt(Er+"08")!==8||parseInt(Er+"0x16")!==22){parseInt=function(t){var r=/^[-+]?0[xX]/;return function parseInt(e,n){if(typeof e==="symbol"){""+e}var i=Fr(String(e));var a=u(n)||(r.test(i)?16:10);return t(i,a)}}(parseInt)}if(1/parseFloat("-0")!==-Infinity){parseFloat=function(t){return function parseFloat(r){var e=Fr(String(r));var n=t(e);return n===0&&K(e,0,1)==="-"?-0:n}}(parseFloat)}if(String(new RangeError("test"))!=="RangeError: test"){var kr=function toString(){if(typeof this==="undefined"||this===null){throw new TypeError("can't convert "+this+" to object")}var t=this.name;if(typeof t==="undefined"){t="Error"}else if(typeof t!=="string"){t=o(t)}var r=this.message;if(typeof r==="undefined"){r=""}else if(typeof r!=="string"){r=o(r)}if(!t){return r}if(!r){return t}return t+": "+r};Error.prototype.toString=kr}if(R){var Ar=function(t,r){if(tt(t,r)){var e=Object.getOwnPropertyDescriptor(t,r);if(e.configurable){e.enumerable=false;Object.defineProperty(t,r,e)}}};Ar(Error.prototype,"message");if(Error.prototype.message!==""){Error.prototype.message=""}Ar(Error.prototype,"name")}if(String(/a/gim)!=="/a/gim"){var Rr=function toString(){var t="/"+this.source+"/";if(this.global){t+="g"}if(this.ignoreCase){t+="i"}if(this.multiline){t+="m"}return t};RegExp.prototype.toString=Rr}});
-//# sourceMappingURL=es5-shim.map
diff --git a/public/self/js/notebook/purify.min.js b/public/self/js/notebook/purify.min.js
index 8c121b491..30d29f6c2 100644
--- a/public/self/js/notebook/purify.min.js
+++ b/public/self/js/notebook/purify.min.js
@@ -1,3 +1,2 @@
/*! @license DOMPurify | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.2.2/LICENSE */
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).DOMPurify=t()}(this,(function(){"use strict";var e=Object.hasOwnProperty,t=Object.setPrototypeOf,n=Object.isFrozen,r=Object.getPrototypeOf,o=Object.getOwnPropertyDescriptor,i=Object.freeze,a=Object.seal,l=Object.create,c="undefined"!=typeof Reflect&&Reflect,s=c.apply,u=c.construct;s||(s=function(e,t,n){return e.apply(t,n)}),i||(i=function(e){return e}),a||(a=function(e){return e}),u||(u=function(e,t){return new(Function.prototype.bind.apply(e,[null].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t1?n-1:0),o=1;o/gm),U=a(/^data-[\-\w.\u00B7-\uFFFF]/),j=a(/^aria-[\-\w]+$/),P=a(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),B=a(/^(?:\w+script|data):/i),W=a(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),G="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function q(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t0&&void 0!==arguments[0]?arguments[0]:K(),n=function(t){return e(t)};if(n.version="2.2.6",n.removed=[],!t||!t.document||9!==t.document.nodeType)return n.isSupported=!1,n;var r=t.document,o=t.document,a=t.DocumentFragment,l=t.HTMLTemplateElement,c=t.Node,s=t.Element,u=t.NodeFilter,f=t.NamedNodeMap,x=void 0===f?t.NamedNodeMap||t.MozNamedAttrMap:f,Y=t.Text,X=t.Comment,$=t.DOMParser,Z=t.trustedTypes,J=s.prototype,Q=k(J,"cloneNode"),ee=k(J,"nextSibling"),te=k(J,"childNodes"),ne=k(J,"parentNode");if("function"==typeof l){var re=o.createElement("template");re.content&&re.content.ownerDocument&&(o=re.content.ownerDocument)}var oe=V(Z,r),ie=oe&&ze?oe.createHTML(""):"",ae=o,le=ae.implementation,ce=ae.createNodeIterator,se=ae.getElementsByTagName,ue=ae.createDocumentFragment,fe=r.importNode,me={};try{me=S(o).documentMode?o.documentMode:{}}catch(e){}var de={};n.isSupported=le&&void 0!==le.createHTMLDocument&&9!==me;var pe=z,ge=H,he=U,ye=j,ve=B,be=W,Te=P,Ae=null,xe=w({},[].concat(q(R),q(_),q(D),q(N),q(L))),we=null,Se=w({},[].concat(q(M),q(F),q(C),q(I))),ke=null,Re=null,_e=!0,De=!0,Ee=!1,Ne=!1,Oe=!1,Le=!1,Me=!1,Fe=!1,Ce=!1,Ie=!0,ze=!1,He=!0,Ue=!0,je=!1,Pe={},Be=w({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),We=null,Ge=w({},["audio","video","img","source","image","track"]),qe=null,Ke=w({},["alt","class","for","id","label","name","pattern","placeholder","summary","title","value","style","xmlns"]),Ve=null,Ye=o.createElement("form"),Xe=function(e){Ve&&Ve===e||(e&&"object"===(void 0===e?"undefined":G(e))||(e={}),e=S(e),Ae="ALLOWED_TAGS"in e?w({},e.ALLOWED_TAGS):xe,we="ALLOWED_ATTR"in e?w({},e.ALLOWED_ATTR):Se,qe="ADD_URI_SAFE_ATTR"in e?w(S(Ke),e.ADD_URI_SAFE_ATTR):Ke,We="ADD_DATA_URI_TAGS"in e?w(S(Ge),e.ADD_DATA_URI_TAGS):Ge,ke="FORBID_TAGS"in e?w({},e.FORBID_TAGS):{},Re="FORBID_ATTR"in e?w({},e.FORBID_ATTR):{},Pe="USE_PROFILES"in e&&e.USE_PROFILES,_e=!1!==e.ALLOW_ARIA_ATTR,De=!1!==e.ALLOW_DATA_ATTR,Ee=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Ne=e.SAFE_FOR_TEMPLATES||!1,Oe=e.WHOLE_DOCUMENT||!1,Fe=e.RETURN_DOM||!1,Ce=e.RETURN_DOM_FRAGMENT||!1,Ie=!1!==e.RETURN_DOM_IMPORT,ze=e.RETURN_TRUSTED_TYPE||!1,Me=e.FORCE_BODY||!1,He=!1!==e.SANITIZE_DOM,Ue=!1!==e.KEEP_CONTENT,je=e.IN_PLACE||!1,Te=e.ALLOWED_URI_REGEXP||Te,Ne&&(De=!1),Ce&&(Fe=!0),Pe&&(Ae=w({},[].concat(q(L))),we=[],!0===Pe.html&&(w(Ae,R),w(we,M)),!0===Pe.svg&&(w(Ae,_),w(we,F),w(we,I)),!0===Pe.svgFilters&&(w(Ae,D),w(we,F),w(we,I)),!0===Pe.mathMl&&(w(Ae,N),w(we,C),w(we,I))),e.ADD_TAGS&&(Ae===xe&&(Ae=S(Ae)),w(Ae,e.ADD_TAGS)),e.ADD_ATTR&&(we===Se&&(we=S(we)),w(we,e.ADD_ATTR)),e.ADD_URI_SAFE_ATTR&&w(qe,e.ADD_URI_SAFE_ATTR),Ue&&(Ae["#text"]=!0),Oe&&w(Ae,["html","head","body"]),Ae.table&&(w(Ae,["tbody"]),delete ke.tbody),i&&i(e),Ve=e)},$e=w({},["mi","mo","mn","ms","mtext"]),Ze=w({},["foreignobject","desc","title","annotation-xml"]),Je=w({},_);w(Je,D),w(Je,E);var Qe=w({},N);w(Qe,O);var et="http://www.w3.org/1998/Math/MathML",tt="http://www.w3.org/2000/svg",nt="http://www.w3.org/1999/xhtml",rt=function(e){var t=ne(e);t&&t.tagName||(t={namespaceURI:nt,tagName:"template"});var n=g(e.tagName),r=g(t.tagName);if(e.namespaceURI===tt)return t.namespaceURI===nt?"svg"===n:t.namespaceURI===et?"svg"===n&&("annotation-xml"===r||$e[r]):Boolean(Je[n]);if(e.namespaceURI===et)return t.namespaceURI===nt?"math"===n:t.namespaceURI===tt?"math"===n&&Ze[r]:Boolean(Qe[n]);if(e.namespaceURI===nt){if(t.namespaceURI===tt&&!Ze[r])return!1;if(t.namespaceURI===et&&!$e[r])return!1;var o=w({},["title","style","font","a","script"]);return!Qe[n]&&(o[n]||!Je[n])}return!1},ot=function(e){p(n.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){try{e.outerHTML=ie}catch(t){e.remove()}}},it=function(e,t){try{p(n.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){p(n.removed,{attribute:null,from:t})}t.removeAttribute(e)},at=function(e){var t=void 0,n=void 0;if(Me)e=""+e;else{var r=h(e,/^[\r\n\t ]+/);n=r&&r[0]}var i=oe?oe.createHTML(e):e;try{t=(new $).parseFromString(i,"text/html")}catch(e){}if(!t||!t.documentElement){var a=(t=le.createHTMLDocument("")).body;a.parentNode.removeChild(a.parentNode.firstElementChild),a.outerHTML=i}return e&&n&&t.body.insertBefore(o.createTextNode(n),t.body.childNodes[0]||null),se.call(t,Oe?"html":"body")[0]},lt=function(e){return ce.call(e.ownerDocument||e,e,u.SHOW_ELEMENT|u.SHOW_COMMENT|u.SHOW_TEXT,(function(){return u.FILTER_ACCEPT}),!1)},ct=function(e){return!(e instanceof Y||e instanceof X)&&!("string"==typeof e.nodeName&&"string"==typeof e.textContent&&"function"==typeof e.removeChild&&e.attributes instanceof x&&"function"==typeof e.removeAttribute&&"function"==typeof e.setAttribute&&"string"==typeof e.namespaceURI&&"function"==typeof e.insertBefore)},st=function(e){return"object"===(void 0===c?"undefined":G(c))?e instanceof c:e&&"object"===(void 0===e?"undefined":G(e))&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},ut=function(e,t,r){de[e]&&m(de[e],(function(e){e.call(n,t,r,Ve)}))},ft=function(e){var t=void 0;if(ut("beforeSanitizeElements",e,null),ct(e))return ot(e),!0;if(h(e.nodeName,/[\u0080-\uFFFF]/))return ot(e),!0;var r=g(e.nodeName);if(ut("uponSanitizeElement",e,{tagName:r,allowedTags:Ae}),!st(e.firstElementChild)&&(!st(e.content)||!st(e.content.firstElementChild))&&T(/<[/\w]/g,e.innerHTML)&&T(/<[/\w]/g,e.textContent))return ot(e),!0;if(!Ae[r]||ke[r]){if(Ue&&!Be[r])for(var o=ne(e),i=te(e),a=i.length-1;a>=0;--a)o.insertBefore(Q(i[a],!0),ee(e));return ot(e),!0}return e instanceof s&&!rt(e)?(ot(e),!0):"noscript"!==r&&"noembed"!==r||!T(/<\/no(script|embed)/i,e.innerHTML)?(Ne&&3===e.nodeType&&(t=e.textContent,t=y(t,pe," "),t=y(t,ge," "),e.textContent!==t&&(p(n.removed,{element:e.cloneNode()}),e.textContent=t)),ut("afterSanitizeElements",e,null),!1):(ot(e),!0)},mt=function(e,t,n){if(He&&("id"===t||"name"===t)&&(n in o||n in Ye))return!1;if(De&&T(he,t));else if(_e&&T(ye,t));else{if(!we[t]||Re[t])return!1;if(qe[t]);else if(T(Te,y(n,be,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==v(n,"data:")||!We[e]){if(Ee&&!T(ve,y(n,be,"")));else if(n)return!1}else;}return!0},dt=function(e){var t=void 0,r=void 0,o=void 0,i=void 0;ut("beforeSanitizeAttributes",e,null);var a=e.attributes;if(a){var l={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:we};for(i=a.length;i--;){var c=t=a[i],s=c.name,u=c.namespaceURI;if(r=b(t.value),o=g(s),l.attrName=o,l.attrValue=r,l.keepAttr=!0,l.forceKeepAttr=void 0,ut("uponSanitizeAttribute",e,l),r=l.attrValue,!l.forceKeepAttr&&(it(s,e),l.keepAttr))if(T(/\/>/i,r))it(s,e);else{Ne&&(r=y(r,pe," "),r=y(r,ge," "));var f=e.nodeName.toLowerCase();if(mt(f,o,r))try{u?e.setAttributeNS(u,s,r):e.setAttribute(s,r),d(n.removed)}catch(e){}}}ut("afterSanitizeAttributes",e,null)}},pt=function e(t){var n=void 0,r=lt(t);for(ut("beforeSanitizeShadowDOM",t,null);n=r.nextNode();)ut("uponSanitizeShadowNode",n,null),ft(n)||(n.content instanceof a&&e(n.content),dt(n));ut("afterSanitizeShadowDOM",t,null)};return n.sanitize=function(e,o){var i=void 0,l=void 0,s=void 0,u=void 0,f=void 0;if(e||(e="\x3c!--\x3e"),"string"!=typeof e&&!st(e)){if("function"!=typeof e.toString)throw A("toString is not a function");if("string"!=typeof(e=e.toString()))throw A("dirty is not a string, aborting")}if(!n.isSupported){if("object"===G(t.toStaticHTML)||"function"==typeof t.toStaticHTML){if("string"==typeof e)return t.toStaticHTML(e);if(st(e))return t.toStaticHTML(e.outerHTML)}return e}if(Le||Xe(o),n.removed=[],"string"==typeof e&&(je=!1),je);else if(e instanceof c)1===(l=(i=at("\x3c!----\x3e")).ownerDocument.importNode(e,!0)).nodeType&&"BODY"===l.nodeName||"HTML"===l.nodeName?i=l:i.appendChild(l);else{if(!Fe&&!Ne&&!Oe&&-1===e.indexOf("<"))return oe&&ze?oe.createHTML(e):e;if(!(i=at(e)))return Fe?null:ie}i&&Me&&ot(i.firstChild);for(var m=lt(je?e:i);s=m.nextNode();)3===s.nodeType&&s===u||ft(s)||(s.content instanceof a&&pt(s.content),dt(s),u=s);if(u=null,je)return e;if(Fe){if(Ce)for(f=ue.call(i.ownerDocument);i.firstChild;)f.appendChild(i.firstChild);else f=i;return Ie&&(f=fe.call(r,f,!0)),f}var d=Oe?i.outerHTML:i.innerHTML;return Ne&&(d=y(d,pe," "),d=y(d,ge," ")),oe&&ze?oe.createHTML(d):d},n.setConfig=function(e){Xe(e),Le=!0},n.clearConfig=function(){Ve=null,Le=!1},n.isValidAttribute=function(e,t,n){Ve||Xe({});var r=g(e),o=g(t);return mt(r,o,n)},n.addHook=function(e,t){"function"==typeof t&&(de[e]=de[e]||[],p(de[e],t))},n.removeHook=function(e){de[e]&&d(de[e])},n.removeHooks=function(e){de[e]&&(de[e]=[])},n.removeAllHooks=function(){de={}},n}()}));
-//# sourceMappingURL=purify.min.js.map
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go
index 49babf690..963bf2cee 100755
--- a/routers/api/v1/api.go
+++ b/routers/api/v1/api.go
@@ -574,9 +574,18 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Group("/cloudbrainboard", func() {
m.Get("/downloadAll", repo.DownloadCloudBrainBoard)
m.Group("/cloudbrain", func() {
+ m.Get("/overview", repo.GetAllCloudbrainsOverview)
+ m.Get("/distribution", repo.GetAllCloudbrainsPeriodDistribution)
+ m.Get("/trend", repo.GetAllCloudbrainsTrend)
+ m.Get("/trend_detail_data", repo.GetAllCloudbrainsTrendDetail)
m.Get("/status_analysis", repo.GetCloudbrainsStatusAnalysis)
+ m.Get("/detail_data", repo.GetCloudbrainsDetailData)
+ m.Get("/hours_data", repo.GetCloudbrainsCreateHoursData)
+ m.Get("/waitting_top_data", repo.GetWaittingTop)
+ m.Get("/running_top_data", repo.GetRunningTop)
})
}, operationReq)
+
// Users
m.Group("/users", func() {
m.Get("/search", user.Search)
diff --git a/routers/api/v1/repo/cloudbrain_dashboard.go b/routers/api/v1/repo/cloudbrain_dashboard.go
index 0710a21e4..f102a0f05 100644
--- a/routers/api/v1/repo/cloudbrain_dashboard.go
+++ b/routers/api/v1/repo/cloudbrain_dashboard.go
@@ -1,8 +1,10 @@
package repo
import (
+ "fmt"
"net/http"
"net/url"
+ "strings"
"time"
"code.gitea.io/gitea/models"
@@ -11,6 +13,19 @@ import (
"github.com/360EntSecGroup-Skylar/excelize/v2"
)
+type DateCloudbrainNum struct {
+ Date string `json:"date"`
+ CloudOneJobTypeRes map[string]int `json:"cloudOneJobTypeRes"`
+ CloudTwoJobTypeRes map[string]int `json:"cloudTwoJobTypeRes"`
+ IntelligentNetJobTypeRes map[string]int `json:"intelligentNetJobTypeRes"`
+ CloudBrainPeriodNum map[int]int `json:"cloudBrainPeriodNum"`
+ CloudBrainComputeResource map[string]int `json:"cloudBrainComputeResource"`
+}
+type DateCloudbrainInfo struct {
+ Date string `json:"date"`
+ CloudBrainPeriodNum map[int]int `json:"cloudBrainPeriodNum"`
+ CloudBrainComputeResource map[string]int `json:"cloudBrainComputeResource"`
+}
type CloudbrainsStatusAnalysis struct {
JobWaitingCount int64 `json:"jobWaitingCount"`
JobRunningCount int64 `json:"jobRunningCount"`
@@ -21,6 +36,1126 @@ type CloudbrainsStatusAnalysis struct {
JobInitCount int64 `json:"jobInitCount"`
}
+func GetAllCloudbrainsOverview(ctx *context.Context) {
+ recordCloudbrain, err := models.GetRecordBeginTime()
+ if err != nil {
+ log.Error("Can not get recordCloudbrain", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
+ return
+ }
+ recordBeginTime := recordCloudbrain[0].Cloudbrain.CreatedUnix
+ now := time.Now()
+ beginTime := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
+ endTime := now
+ todayCreatorCount, err := models.GetTodayCreatorCount(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query todayCreatorCount.", err)
+ return
+ }
+ creatorCount, err := models.GetCreatorCount()
+ if err != nil {
+ log.Error("Can not query creatorCount.", err)
+ return
+ }
+ todayStatusResult := make(map[string]int)
+ cloudBrainNum := make(map[int]int)
+ cloudBrainOneDuration := int64(0)
+ cloudBrainTwoDuration := int64(0)
+ intelligentNetDuration := int64(0)
+ todayNewJobCount := 0
+ page := 1
+ pagesize := 1000
+ count := pagesize
+ for count == pagesize && count != 0 {
+ cloudbrains, _, err := models.CloudbrainAllStatic(&models.CloudbrainsOptions{
+ ListOptions: models.ListOptions{
+ Page: page,
+ PageSize: pagesize,
+ },
+ Type: models.TypeCloudBrainAll,
+ BeginTimeUnix: int64(recordBeginTime),
+ EndTimeUnix: endTime.Unix(),
+ })
+ if err != nil {
+ ctx.ServerError("Get cloudbrains failed:", err)
+ return
+ }
+
+ for _, cloudbrain := range cloudbrains {
+ if int64(cloudbrain.Cloudbrain.CreatedUnix) >= beginTime.Unix() && int64(cloudbrain.Cloudbrain.CreatedUnix) < endTime.Unix() {
+ todayNewJobCount += 1
+ if _, ok := todayStatusResult[cloudbrain.Status]; !ok {
+ todayStatusResult[cloudbrain.Status] = 1
+ } else {
+ todayStatusResult[cloudbrain.Status] += 1
+ }
+ }
+
+ if _, ok := cloudBrainNum[cloudbrain.Cloudbrain.Type]; !ok {
+ cloudBrainNum[cloudbrain.Cloudbrain.Type] = 1
+ } else {
+ cloudBrainNum[cloudbrain.Cloudbrain.Type] += 1
+ }
+
+ if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainOne {
+ cloudBrainOneDuration = cloudBrainOneDuration + cloudbrain.Cloudbrain.Duration
+ }
+ if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainTwo {
+ cloudBrainTwoDuration = cloudBrainTwoDuration + cloudbrain.Cloudbrain.Duration
+ }
+ if cloudbrain.Cloudbrain.Type == models.TypeIntelligentNet {
+ intelligentNetDuration = intelligentNetDuration + cloudbrain.Cloudbrain.Duration
+ }
+
+ }
+ count = len(cloudbrains)
+ page += 1
+ }
+
+ statusNameList := []string{string(models.ModelArtsTrainJobCompleted), string(models.JobFailed), string(models.ModelArtsTrainJobInit),
+ string(models.JobRunning), string(models.ModelArtsStartFailed), string(models.JobStopped), string(models.JobSucceeded),
+ string(models.JobWaiting), string(models.ModelArtsTrainJobKilled)}
+ for _, v := range statusNameList {
+ if _, ok := todayStatusResult[v]; !ok {
+ todayStatusResult[v] = 0
+ }
+ }
+
+ cloudBrainTypeList := []int{0, 1, 2}
+ for _, v := range cloudBrainTypeList {
+ if _, ok := cloudBrainNum[v]; !ok {
+ cloudBrainNum[v] = 0
+ }
+ }
+
+ todayRunningCount := todayStatusResult[string(models.JobRunning)]
+ todayCompletedCount := todayStatusResult[string(models.ModelArtsTrainJobCompleted)] + todayStatusResult[string(models.JobFailed)] +
+ todayStatusResult[string(models.ModelArtsStartFailed)] + todayStatusResult[string(models.JobStopped)] + todayStatusResult[string(models.JobSucceeded)] + todayStatusResult[string(models.ModelArtsTrainJobKilled)]
+ todayWaitingCount := todayStatusResult[string(models.ModelArtsTrainJobInit)] + todayStatusResult[string(models.JobWaiting)]
+
+ ctx.JSON(http.StatusOK, map[string]interface{}{
+ "recordBeginTime": recordBeginTime,
+ "updateTime": now.Unix(),
+ "cloudBrainNum": cloudBrainNum,
+ "cloudBrainOneDuration": cloudBrainOneDuration,
+ "cloudBrainTwoDuration": cloudBrainTwoDuration,
+ "intelligentNetDuration": intelligentNetDuration,
+ "todayCreatorCount": todayCreatorCount,
+ "creatorCount": creatorCount,
+ "todayRunningCount": todayRunningCount,
+ "todayCompletedCount": todayCompletedCount,
+ "todayWaitingCount": todayWaitingCount,
+ "todayNewJobCount": todayNewJobCount,
+ })
+}
+
+func GetAllCloudbrainsTrend(ctx *context.Context) {
+
+ queryType := ctx.QueryTrim("type")
+ now := time.Now()
+
+ beginTimeStr := ctx.QueryTrim("beginTime")
+ endTimeStr := ctx.QueryTrim("endTime")
+ var beginTime time.Time
+ var endTime time.Time
+ dateCloudbrainNum := make([]DateCloudbrainNum, 0)
+ var err error
+ if queryType != "" {
+ if queryType == "all" {
+ recordCloudbrain, err := models.GetRecordBeginTime()
+ if err != nil {
+ log.Error("Can not get recordCloudbrain", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
+ return
+ }
+ brainRecordBeginTime := recordCloudbrain[0].Cloudbrain.CreatedUnix.AsTime()
+ beginTime = brainRecordBeginTime
+ endTime = now
+ dateCloudbrainNum, err = getMonthCloudbrainNum(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getMonthCloudbrainNum.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getMonthCloudbrainNum_get_error"))
+ return
+ }
+ } else if queryType == "today" {
+ beginTime = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
+ // endTimeTemp = now
+ endTime = beginTime.AddDate(0, 0, 1)
+ dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getDayCloudbrainNum.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
+ return
+ }
+ } else if queryType == "yesterday" {
+ beginTime = now.AddDate(0, 0, -1)
+ beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
+ endTime = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
+ dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getDayCloudbrainNum.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
+ return
+ }
+ } else if queryType == "last_7day" {
+ beginTime = now.AddDate(0, 0, -6)
+ beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
+ endTime = now
+ dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getDayCloudbrainNum.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
+ return
+ }
+ } else if queryType == "last_30day" {
+ beginTime = now.AddDate(0, 0, -29)
+ beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
+ endTime = now
+ dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getDayCloudbrainNum.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
+ return
+ }
+ } else if queryType == "current_month" {
+ endTime = now
+ beginTime = time.Date(endTime.Year(), endTime.Month(), 1, 0, 0, 0, 0, now.Location())
+ dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getDayCloudbrainNum.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
+ return
+ }
+ } else if queryType == "current_year" {
+ endTime = now
+ beginTime = time.Date(endTime.Year(), 1, 1, 0, 0, 0, 0, now.Location())
+ // endTimeTemp = beginTime.AddDate(0, 1, 0)
+ dateCloudbrainNum, err = getMonthCloudbrainNum(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getMonthCloudbrainNum.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getMonthCloudbrainNum_get_error"))
+ return
+ }
+ } else if queryType == "last_month" {
+
+ lastMonthTime := now.AddDate(0, -1, 0)
+ beginTime = time.Date(lastMonthTime.Year(), lastMonthTime.Month(), 1, 0, 0, 0, 0, now.Location())
+ endTime = time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location())
+ dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getDayCloudbrainNum.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
+ return
+ }
+ }
+
+ } else {
+ if beginTimeStr == "" || endTimeStr == "" {
+ //如果查询类型和开始时间结束时间都未设置,按queryType=all处理
+ recordCloudbrain, err := models.GetRecordBeginTime()
+ if err != nil {
+ log.Error("Can not get recordCloudbrain", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
+ return
+ }
+ brainRecordBeginTime := recordCloudbrain[0].Cloudbrain.CreatedUnix.AsTime()
+ beginTime = brainRecordBeginTime
+ endTime = now
+ dateCloudbrainNum, err = getMonthCloudbrainNum(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getMonthCloudbrainNum.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getMonthCloudbrainNum_get_error"))
+ return
+ }
+ } else {
+ beginTime, err = time.ParseInLocation("2006-01-02", beginTimeStr, time.Local)
+ if err != nil {
+ log.Error("Can not ParseInLocation.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("ParseInLocation_get_error"))
+ return
+ }
+ endTime, err = time.ParseInLocation("2006-01-02", endTimeStr, time.Local)
+ if err != nil {
+ log.Error("Can not ParseInLocation.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("ParseInLocation_get_error"))
+ return
+ }
+ if endTime.After(time.Now()) {
+ endTime = time.Now()
+ }
+ dateCloudbrainNum, err = getDayCloudbrainNum(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getDayCloudbrainNum.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainNum_get_error"))
+ return
+ }
+ }
+
+ }
+ ctx.JSON(http.StatusOK, map[string]interface{}{
+ "timeCloudbrainNum": dateCloudbrainNum,
+ })
+
+}
+func GetAllCloudbrainsTrendDetail(ctx *context.Context) {
+ queryType := ctx.QueryTrim("type")
+ now := time.Now()
+
+ beginTimeStr := ctx.QueryTrim("beginTime")
+ endTimeStr := ctx.QueryTrim("endTime")
+ var beginTime time.Time
+ var endTime time.Time
+ var endTimeTemp time.Time
+ dayCloudbrainInfo := make([]DateCloudbrainInfo, 0)
+ var err error
+ var count int
+ if queryType != "" {
+ if queryType == "all" {
+ recordCloudbrain, err := models.GetRecordBeginTime()
+ if err != nil {
+ log.Error("Can not get recordCloudbrain", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
+ return
+ }
+ brainRecordBeginTime := recordCloudbrain[0].Cloudbrain.CreatedUnix.AsTime()
+ beginTime = brainRecordBeginTime
+ endTime = now
+ dayCloudbrainInfo, count, err = getMonthCloudbrainInfo(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getDayCloudbrainInfo.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
+ return
+ }
+ } else if queryType == "today" {
+ beginTime = now.AddDate(0, 0, 0)
+ beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
+ endTime = now
+ dayCloudbrainInfo, count, err = getDayCloudbrainInfo(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getDayCloudbrainInfo.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
+ return
+ }
+
+ } else if queryType == "yesterday" {
+ beginTime = now.AddDate(0, 0, -1)
+ beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
+ endTime = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
+ dayCloudbrainInfo, count, err = getDayCloudbrainInfo(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getDayCloudbrainInfo.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
+ return
+ }
+
+ } else if queryType == "last_7day" {
+ beginTime = now.AddDate(0, 0, -6)
+ beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
+ endTime = now
+ endTimeTemp = time.Date(endTimeTemp.Year(), endTimeTemp.Month(), endTimeTemp.Day(), 0, 0, 0, 0, now.Location())
+ dayCloudbrainInfo, count, err = getDayCloudbrainInfo(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getDayCloudbrainInfo.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
+ return
+ }
+ } else if queryType == "last_30day" {
+ beginTime = now.AddDate(0, 0, -29)
+ beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
+ endTime = now
+ dayCloudbrainInfo, count, err = getDayCloudbrainInfo(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getDayCloudbrainInfo.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
+ return
+ }
+ } else if queryType == "current_month" {
+ endTime = now
+ beginTime = time.Date(endTime.Year(), endTime.Month(), 1, 0, 0, 0, 0, now.Location())
+ dayCloudbrainInfo, count, err = getDayCloudbrainInfo(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getDayCloudbrainInfo.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
+ return
+ }
+
+ } else if queryType == "current_year" {
+ endTime = now
+ beginTime = time.Date(endTime.Year(), 1, 1, 0, 0, 0, 0, now.Location())
+ dayCloudbrainInfo, count, err = getMonthCloudbrainInfo(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getDayCloudbrainInfo.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
+ return
+ }
+
+ } else if queryType == "last_month" {
+
+ lastMonthTime := now.AddDate(0, -1, 0)
+ beginTime = time.Date(lastMonthTime.Year(), lastMonthTime.Month(), 1, 0, 0, 0, 0, now.Location())
+ endTime = time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location())
+ dayCloudbrainInfo, count, err = getDayCloudbrainInfo(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getDayCloudbrainInfo.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
+ return
+ }
+
+ }
+
+ } else {
+ if beginTimeStr == "" || endTimeStr == "" {
+ //如果查询类型和开始时间结束时间都未设置,按queryType=all处理
+ recordCloudbrain, err := models.GetRecordBeginTime()
+ if err != nil {
+ log.Error("Can not get recordCloudbrain", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
+ return
+ }
+ brainRecordBeginTime := recordCloudbrain[0].Cloudbrain.CreatedUnix.AsTime()
+ beginTime = brainRecordBeginTime
+ endTime = now
+ dayCloudbrainInfo, count, err = getMonthCloudbrainInfo(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getDayCloudbrainInfo.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
+ return
+ }
+ } else {
+ beginTime, err = time.ParseInLocation("2006-01-02", beginTimeStr, time.Local)
+ if err != nil {
+ log.Error("Can not ParseInLocation.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("ParseInLocation_get_error"))
+ return
+ }
+ endTime, err = time.ParseInLocation("2006-01-02", endTimeStr, time.Local)
+ if err != nil {
+ log.Error("Can not ParseInLocation.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("ParseInLocation_get_error"))
+ return
+ }
+ if endTime.After(time.Now()) {
+ endTime = time.Now()
+ }
+ endTimeTemp = beginTime.AddDate(0, 0, 1)
+ dayCloudbrainInfo, count, err = getDayCloudbrainInfo(beginTime, endTime)
+ if err != nil {
+ log.Error("Can not query getDayCloudbrainInfo.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("getDayCloudbrainInfo_get_error"))
+ return
+ }
+ }
+
+ }
+
+ page := ctx.QueryInt("page")
+ if page <= 0 {
+ page = 1
+ }
+ pagesize := ctx.QueryInt("pagesize")
+ if pagesize <= 0 {
+ pagesize = 5
+ }
+ pageDateCloudbrainInfo := getPageDateCloudbrainInfo(dayCloudbrainInfo, page, pagesize)
+
+ ctx.JSON(http.StatusOK, map[string]interface{}{
+ "totalCount": count,
+ "timeCloudbrainInfo": pageDateCloudbrainInfo,
+ })
+
+}
+func getPageDateCloudbrainInfo(dateCloudbrainInfo []DateCloudbrainInfo, page int, pagesize int) []DateCloudbrainInfo {
+ begin := (page - 1) * pagesize
+ end := (page) * pagesize
+
+ if begin > len(dateCloudbrainInfo)-1 {
+ return nil
+ }
+ if end > len(dateCloudbrainInfo)-1 {
+ return dateCloudbrainInfo[begin:]
+ } else {
+ return dateCloudbrainInfo[begin:end]
+ }
+
+}
+
+func GetAllCloudbrainsPeriodDistribution(ctx *context.Context) {
+ queryType := ctx.QueryTrim("type")
+ beginTimeStr := ctx.QueryTrim("beginTime")
+ endTimeStr := ctx.QueryTrim("endTime")
+ recordCloudbrain, err := models.GetRecordBeginTime()
+ if err != nil {
+ log.Error("Can not get record begin time", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
+ return
+ }
+ recordBeginTime := time.Unix(int64(recordCloudbrain[0].Cloudbrain.CreatedUnix), 0)
+ beginTime, endTime, err := getCloudbrainTimePeroid(ctx, recordBeginTime)
+ if err != nil {
+ log.Error("Parameter is wrong", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("repo.parameter_is_wrong"))
+ return
+ }
+ cloudOneJobTypeRes := make(map[string]int)
+ cloudTwoJobTypeRes := make(map[string]int)
+ intelligentNetJobTypeRes := make(map[string]int)
+ cloudBrainPeriodNum := make(map[int]int)
+ cloudBrainComputeResource := make(map[string]int)
+ beginTimeTemp := beginTime.Unix()
+ if queryType == "all" || (queryType == "" && (beginTimeStr == "" || endTimeStr == "")) {
+ beginTimeTemp = int64(recordCloudbrain[0].Cloudbrain.CreatedUnix)
+ }
+
+ page := 1
+ pagesize := 1000
+ count := pagesize
+ //Each time a maximum of 1000 pieces of data are detected to the memory, batch processing
+ for count == pagesize && count != 0 {
+ cloudbrains, _, err := models.CloudbrainAllStatic(&models.CloudbrainsOptions{
+ ListOptions: models.ListOptions{
+ Page: page,
+ PageSize: pagesize,
+ },
+ Type: models.TypeCloudBrainAll,
+ BeginTimeUnix: beginTimeTemp,
+ EndTimeUnix: endTime.Unix(),
+ })
+ if err != nil {
+ ctx.ServerError("Get cloudbrains failed:", err)
+ return
+ }
+
+ for _, cloudbrain := range cloudbrains {
+ if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainOne {
+ if _, ok := cloudOneJobTypeRes[cloudbrain.JobType]; !ok {
+ cloudOneJobTypeRes[cloudbrain.JobType] = 1
+ } else {
+ cloudOneJobTypeRes[cloudbrain.JobType] += 1
+ }
+ }
+ if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainTwo {
+ if _, ok := cloudTwoJobTypeRes[cloudbrain.JobType]; !ok {
+ cloudTwoJobTypeRes[cloudbrain.JobType] = 1
+ } else {
+ cloudTwoJobTypeRes[cloudbrain.JobType] += 1
+ }
+ }
+ if cloudbrain.Cloudbrain.Type == models.TypeIntelligentNet {
+ if _, ok := intelligentNetJobTypeRes[cloudbrain.JobType]; !ok {
+ intelligentNetJobTypeRes[cloudbrain.JobType] = 1
+ } else {
+ intelligentNetJobTypeRes[cloudbrain.JobType] += 1
+ }
+ }
+
+ if _, ok := cloudBrainPeriodNum[cloudbrain.Cloudbrain.Type]; !ok {
+ cloudBrainPeriodNum[cloudbrain.Cloudbrain.Type] = 1
+ } else {
+ cloudBrainPeriodNum[cloudbrain.Cloudbrain.Type] += 1
+ }
+
+ if _, ok := cloudBrainComputeResource[cloudbrain.Cloudbrain.ComputeResource]; !ok {
+ cloudBrainComputeResource[cloudbrain.Cloudbrain.ComputeResource] = 1
+ } else {
+ cloudBrainComputeResource[cloudbrain.Cloudbrain.ComputeResource] += 1
+ }
+ }
+ count = len(cloudbrains)
+ page += 1
+ }
+
+ jobTypeList := []string{string(models.JobTypeDebug), string(models.JobTypeTrain), string(models.JobTypeInference), string(models.JobTypeBenchmark),
+ string(models.JobTypeBrainScore), string(models.JobTypeSnn4imagenet)}
+ for _, v := range jobTypeList {
+ if _, ok := cloudOneJobTypeRes[v]; !ok {
+ cloudOneJobTypeRes[v] = 0
+ }
+ if _, ok := cloudTwoJobTypeRes[v]; !ok {
+ cloudTwoJobTypeRes[v] = 0
+ }
+ if _, ok := intelligentNetJobTypeRes[v]; !ok {
+ intelligentNetJobTypeRes[v] = 0
+ }
+ }
+ cloudBrainTypeList := []int{0, 1, 2}
+ for _, v := range cloudBrainTypeList {
+ if _, ok := cloudBrainPeriodNum[v]; !ok {
+ cloudBrainPeriodNum[v] = 0
+ }
+ }
+
+ ComputeResourceList := []string{"CPU/GPU", "NPU"}
+ for _, v := range ComputeResourceList {
+ if _, ok := cloudBrainComputeResource[v]; !ok {
+ cloudBrainComputeResource[v] = 0
+ }
+ }
+
+ cloudOneJobTypeRes["EVALUATION"] = cloudOneJobTypeRes[string(models.JobTypeBenchmark)] + cloudOneJobTypeRes[string(models.JobTypeSnn4imagenet)] + cloudOneJobTypeRes[string(models.JobTypeBrainScore)]
+ cloudTwoJobTypeRes["EVALUATION"] = cloudTwoJobTypeRes[string(models.JobTypeBenchmark)] + cloudTwoJobTypeRes[string(models.JobTypeSnn4imagenet)] + cloudTwoJobTypeRes[string(models.JobTypeBrainScore)]
+ intelligentNetJobTypeRes["EVALUATION"] = intelligentNetJobTypeRes[string(models.JobTypeBenchmark)] + intelligentNetJobTypeRes[string(models.JobTypeSnn4imagenet)] + intelligentNetJobTypeRes[string(models.JobTypeBrainScore)]
+ ctx.JSON(http.StatusOK, map[string]interface{}{
+ "cloudOneJobTypeRes": cloudOneJobTypeRes,
+ "cloudTwoJobTypeRes": cloudTwoJobTypeRes,
+ "intelligentNetJobTypeRes": intelligentNetJobTypeRes,
+ "cloudBrainPeriodNum": cloudBrainPeriodNum,
+ "cloudBrainComputeResource": cloudBrainComputeResource,
+ })
+}
+
+func GetCloudbrainsStatusAnalysis(ctx *context.Context) {
+ recordCloudbrain, err := models.GetRecordBeginTime()
+ if err != nil {
+ log.Error("Can not get recordCloudbrain", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
+ return
+ }
+ recordBeginTime := recordCloudbrain[0].Cloudbrain.CreatedUnix
+ endTime := time.Now()
+ cloudBrainStatusResult := make(map[string]int)
+ cloudBrainStatusAnalysis := make(map[string]int)
+ totalCount := 0
+
+ page := 1
+ pagesize := 1000
+ count := pagesize
+ for count == pagesize && count != 0 {
+ cloudbrains, _, err := models.CloudbrainAllStatic(&models.CloudbrainsOptions{
+ ListOptions: models.ListOptions{
+ Page: page,
+ PageSize: pagesize,
+ },
+ Type: models.TypeCloudBrainAll,
+ BeginTimeUnix: int64(recordBeginTime),
+ EndTimeUnix: endTime.Unix(),
+ })
+ if err != nil {
+ ctx.ServerError("Get cloudbrains failed:", err)
+ return
+ }
+ for _, cloudbrain := range cloudbrains {
+ if _, ok := cloudBrainStatusResult[cloudbrain.Status]; !ok {
+ cloudBrainStatusResult[cloudbrain.Status] = 1
+ } else {
+ cloudBrainStatusResult[cloudbrain.Status] += 1
+ }
+ }
+ count = len(cloudbrains)
+ totalCount = totalCount + count
+ page += 1
+ }
+
+ var jobStatuses []string
+ jobStatuses = append(jobStatuses, string(models.ModelArtsTrainJobWaiting), string(models.ModelArtsTrainJobFailed), string(models.ModelArtsRunning), string(models.ModelArtsTrainJobCompleted),
+ string(models.ModelArtsStarting), string(models.ModelArtsRestarting), string(models.ModelArtsStartFailed),
+ string(models.ModelArtsStopping), string(models.ModelArtsStopped), string(models.JobSucceeded))
+ jobStatusesCount := 0
+ for _, v := range jobStatuses {
+ if _, ok := cloudBrainStatusResult[v]; !ok {
+ cloudBrainStatusAnalysis[v] = 0
+ } else {
+ cloudBrainStatusAnalysis[v] = cloudBrainStatusResult[v]
+ }
+ jobStatusesCount = jobStatusesCount + cloudBrainStatusResult[v]
+ }
+ cloudBrainStatusAnalysis["OTHER"] = totalCount - jobStatusesCount
+
+ ctx.JSON(http.StatusOK, map[string]interface{}{
+ "cloudBrainStatusResult": cloudBrainStatusAnalysis,
+ })
+}
+
+func GetCloudbrainsDetailData(ctx *context.Context) {
+ recordCloudbrain, err := models.GetRecordBeginTime()
+ if err != nil {
+ log.Error("Can not get recordCloudbrain", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
+ return
+ }
+ recordBeginTime := recordCloudbrain[0].Cloudbrain.CreatedUnix
+ endTime := time.Now()
+ listType := ctx.Query("listType")
+ jobType := ctx.Query("jobType")
+ jobStatus := ctx.Query("jobStatus")
+ cloudBrainType := ctx.QueryInt("Type")
+
+ page := ctx.QueryInt("page")
+ pageSize := ctx.QueryInt("pagesize")
+ if page <= 0 {
+ page = 1
+ }
+ if pageSize <= 0 {
+ pageSize = 10
+ }
+ var jobTypes []string
+ jobTypeNot := false
+ if jobType == string(models.JobTypeBenchmark) {
+ jobTypes = append(jobTypes, string(models.JobTypeBenchmark), string(models.JobTypeBrainScore), string(models.JobTypeSnn4imagenet))
+ } else if jobType != "all" && jobType != "" {
+ jobTypes = append(jobTypes, jobType)
+ }
+
+ var jobStatuses []string
+ jobStatusNot := false
+ if jobStatus == "other" {
+ jobStatusNot = true
+ jobStatuses = append(jobStatuses, string(models.ModelArtsTrainJobWaiting), string(models.ModelArtsTrainJobFailed), string(models.ModelArtsRunning), string(models.ModelArtsTrainJobCompleted),
+ string(models.ModelArtsStarting), string(models.ModelArtsRestarting), string(models.ModelArtsStartFailed),
+ string(models.ModelArtsStopping), string(models.ModelArtsStopped), string(models.JobSucceeded))
+ } else if jobStatus != "all" && jobStatus != "" {
+ jobStatuses = append(jobStatuses, jobStatus)
+ }
+
+ keyword := strings.Trim(ctx.Query("q"), " ")
+
+ ciTasks, count, err := models.CloudbrainAll(&models.CloudbrainsOptions{
+ ListOptions: models.ListOptions{
+ Page: page,
+ PageSize: pageSize,
+ },
+ Keyword: keyword,
+ Type: cloudBrainType,
+ ComputeResource: listType,
+ JobTypeNot: jobTypeNot,
+ JobStatusNot: jobStatusNot,
+ JobStatus: jobStatuses,
+ JobTypes: jobTypes,
+ NeedRepoInfo: true,
+ BeginTimeUnix: int64(recordBeginTime),
+ EndTimeUnix: endTime.Unix(),
+ })
+ if err != nil {
+ ctx.ServerError("Get job failed:", err)
+ return
+ }
+ nilTime := time.Time{}
+ tasks := []models.TaskDetail{}
+ for i, task := range ciTasks {
+ ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource
+
+ var taskDetail models.TaskDetail
+ taskDetail.ID = ciTasks[i].Cloudbrain.ID
+ taskDetail.JobName = ciTasks[i].JobName
+ taskDetail.DisplayJobName = ciTasks[i].DisplayJobName
+ taskDetail.Status = ciTasks[i].Status
+ taskDetail.JobType = ciTasks[i].JobType
+ taskDetail.CreatedUnix = ciTasks[i].Cloudbrain.CreatedUnix
+ taskDetail.RunTime = ciTasks[i].Cloudbrain.TrainJobDuration
+ taskDetail.StartTime = ciTasks[i].StartTime
+ taskDetail.EndTime = ciTasks[i].EndTime
+ taskDetail.ComputeResource = ciTasks[i].ComputeResource
+ taskDetail.Type = ciTasks[i].Cloudbrain.Type
+ taskDetail.UserName = ciTasks[i].User.Name
+ taskDetail.RepoID = ciTasks[i].RepoID
+ if ciTasks[i].Repo != nil {
+ taskDetail.RepoName = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Name
+ taskDetail.RepoAlias = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Alias
+ }
+ if ciTasks[i].Cloudbrain.Status == string(models.JobWaiting) {
+ WaitTimeInt := time.Now().Unix() - ciTasks[i].Cloudbrain.CreatedUnix.AsTime().Unix()
+ taskDetail.WaitTime = models.ConvertDurationToStr(WaitTimeInt)
+ if WaitTimeInt < 0 {
+ taskDetail.WaitTime = "00:00:00"
+ }
+ } else if ciTasks[i].Cloudbrain.Status == string(models.JobStopped) && ciTasks[i].Cloudbrain.StartTime.AsTime().Unix() == 0 {
+ WaitTimeInt := ciTasks[i].Cloudbrain.EndTime.AsTime().Unix() - ciTasks[i].Cloudbrain.CreatedUnix.AsTime().Unix()
+ taskDetail.WaitTime = models.ConvertDurationToStr(WaitTimeInt)
+ if WaitTimeInt < 0 {
+ taskDetail.WaitTime = "00:00:00"
+
+ }
+ } else {
+ WaitTimeInt := ciTasks[i].Cloudbrain.StartTime.AsTime().Unix() - ciTasks[i].Cloudbrain.CreatedUnix.AsTime().Unix()
+ taskDetail.WaitTime = models.ConvertDurationToStr(WaitTimeInt)
+ if WaitTimeInt < 0 {
+ taskDetail.WaitTime = "00:00:00"
+ }
+ }
+
+ if ciTasks[i].Cloudbrain.Type == models.TypeCloudBrainTwo || (ciTasks[i].Cloudbrain.Type == models.TypeCloudBrainOne && ciTasks[i].Cloudbrain.JobType == "TRAIN") {
+ taskDetail.JobID = ciTasks[i].Cloudbrain.JobID
+ }
+
+ if ciTasks[i].Cloudbrain.DeletedAt != nilTime {
+ taskDetail.IsDelete = true
+ } else {
+ taskDetail.IsDelete = false
+ }
+ tasks = append(tasks, taskDetail)
+ }
+
+ pager := context.NewPagination(int(count), pageSize, page, getTotalPage(count, pageSize))
+ pager.SetDefaultParams(ctx)
+ pager.AddParam(ctx, "listType", "ListType")
+
+ ctx.JSON(http.StatusOK, map[string]interface{}{
+ "Title": ctx.Tr("kanban.cloudBrains"),
+ "Tasks": tasks,
+ "Keyword": keyword,
+ "pager": pager,
+ "count": count,
+ })
+}
+
+func GetCloudbrainsCreateHoursData(ctx *context.Context) {
+ recordCloudbrain, err := models.GetRecordBeginTime()
+ if err != nil {
+ log.Error("Can not get record begin time", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
+ return
+ }
+ recordBeginTime := time.Unix(int64(recordCloudbrain[0].Cloudbrain.CreatedUnix), 0)
+ // recordBeginTime, _ := time.Parse("2006-01-02 15:04:05", recordTime)
+ now := time.Now()
+ queryType := ctx.QueryTrim("type")
+ beginTimeStr := ctx.QueryTrim("beginTime")
+ endTimeStr := ctx.QueryTrim("endTime")
+ var beginTime time.Time
+ var endTime time.Time
+ createHourPeriodCount := make(map[string]interface{})
+ if queryType != "" {
+ if queryType == "all" {
+ beginTime = recordBeginTime
+ endTime = now.AddDate(0, 0, 1)
+ endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
+ } else if queryType == "today" {
+ beginTime = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
+ endTime = now.AddDate(0, 0, 1)
+ } else if queryType == "yesterday" {
+ beginTime = now.AddDate(0, 0, -1)
+ beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
+ endTime = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
+ } else if queryType == "current_week" {
+ beginTime = now.AddDate(0, 0, -int(time.Now().Weekday())+1) //begin from monday
+ endTime = now
+ } else if queryType == "current_month" {
+ beginTime = time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location())
+ endTime = now.AddDate(0, 0, 1)
+ endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
+ } else if queryType == "monthly" {
+ endTime = now
+ beginTime = now.AddDate(0, -1, 0)
+ beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
+ } else if queryType == "current_year" {
+ beginTime = time.Date(now.Year(), 1, 1, 0, 0, 0, 0, now.Location())
+ endTime = now.AddDate(0, 0, 1)
+ endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
+ } else if queryType == "last_month" {
+ lastMonthTime := now.AddDate(0, -1, 0)
+ beginTime = time.Date(lastMonthTime.Year(), lastMonthTime.Month(), 1, 0, 0, 0, 0, now.Location())
+ endTime = time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location())
+ } else if queryType == "last_7day" {
+ beginTime = now.AddDate(0, 0, -6)
+ beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
+ endTime = now.AddDate(0, 0, 1)
+ endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
+ } else if queryType == "last_30day" {
+ beginTime = now.AddDate(0, 0, -29)
+ beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
+ endTime = now.AddDate(0, 0, 1)
+ endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
+ }
+ } else {
+ if beginTimeStr == "" || endTimeStr == "" {
+ //如果查询类型和开始时间结束时间都未设置,按queryType=all处理
+ beginTime = recordBeginTime
+ endTime = now.AddDate(0, 0, 1)
+ endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
+ } else {
+ beginTime, err = time.ParseInLocation("2006-01-02", beginTimeStr, time.Local)
+ if err != nil {
+ log.Error("Can not ParseInLocation.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("ParseInLocation_get_error"))
+ return
+ }
+ endTime, err = time.ParseInLocation("2006-01-02", endTimeStr, time.Local)
+ if err != nil {
+ log.Error("Can not ParseInLocation.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("ParseInLocation_get_error"))
+ return
+ }
+ endTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
+ }
+ }
+ dateBeginTime := beginTime.Format("2006-01-02")
+ dateEndTime := endTime.Format("2006-01-02")
+ createHourPeriodCount, err = models.GetCreateHourPeriodCount(dateBeginTime, dateEndTime)
+ if err != nil {
+ log.Error("Can not query hourPeriodCount.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("hourPeriodCount_get_error"))
+ return
+ }
+
+ runHourPeriodCount, err := models.GetRunHourPeriodCount(dateBeginTime, dateEndTime)
+ if err != nil {
+ log.Error("Can not query runHourPeriodCount.", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("runHourPeriodCount_get_error"))
+ return
+ }
+ ctx.JSON(http.StatusOK, map[string]interface{}{
+ "recordBeginTime": recordCloudbrain[0].Cloudbrain.CreatedUnix,
+ "updateTime": now.Unix(),
+ "createHourPeriodCount": createHourPeriodCount,
+ "runHourPeriodCount": runHourPeriodCount,
+ })
+
+}
+func GetWaittingTop(ctx *context.Context) {
+ ciTasks, err := models.GetWaittingTop()
+ if err != nil {
+ log.Error("Can not get record begin time", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
+ return
+ }
+ tasks := []models.TaskDetail{}
+ for i, task := range ciTasks {
+ ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource
+
+ var taskDetail models.TaskDetail
+ taskDetail.DisplayJobName = ciTasks[i].DisplayJobName
+ taskDetail.UserName = ciTasks[i].User.Name
+ taskDetail.RepoID = ciTasks[i].RepoID
+ if ciTasks[i].Repo != nil {
+ taskDetail.RepoName = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Name
+ }
+ WaitTimeInt := time.Now().Unix() - ciTasks[i].Cloudbrain.CreatedUnix.AsTime().Unix()
+ taskDetail.WaitTime = models.ConvertDurationToStr(WaitTimeInt)
+
+ if WaitTimeInt < 0 {
+ taskDetail.WaitTime = "00:00:00"
+ }
+ tasks = append(tasks, taskDetail)
+ }
+ ctx.JSON(http.StatusOK, map[string]interface{}{
+ "tasks": tasks,
+ })
+}
+func GetRunningTop(ctx *context.Context) {
+ ciTasks, err := models.GetRunningTop()
+ if err != nil {
+ log.Error("Can not get record begin time", err)
+ ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err"))
+ return
+ }
+ tasks := []models.TaskDetail{}
+ for i, task := range ciTasks {
+ ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource
+
+ var taskDetail models.TaskDetail
+ taskDetail.DisplayJobName = ciTasks[i].DisplayJobName
+ taskDetail.RunTime = ciTasks[i].Cloudbrain.TrainJobDuration
+ taskDetail.UserName = ciTasks[i].User.Name
+ taskDetail.RepoID = ciTasks[i].RepoID
+ if ciTasks[i].Repo != nil {
+ taskDetail.RepoName = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Name
+ }
+
+ tasks = append(tasks, taskDetail)
+ }
+ ctx.JSON(http.StatusOK, map[string]interface{}{
+ "tasks": tasks,
+ })
+}
+
+func getCloudbrainCount(beginTime time.Time, endTime time.Time, cloudbrains []*models.CloudbrainInfo) (map[string]int, map[string]int, map[string]int, map[int]int, map[string]int) {
+
+ cloudOneJobTypeRes := make(map[string]int)
+ cloudTwoJobTypeRes := make(map[string]int)
+ intelligentNetJobTypeRes := make(map[string]int)
+ cloudBrainPeriodNum := make(map[int]int)
+ cloudBrainComputeResource := make(map[string]int)
+ for _, cloudbrain := range cloudbrains {
+ if int64(cloudbrain.Cloudbrain.CreatedUnix) >= beginTime.Unix() && int64(cloudbrain.Cloudbrain.CreatedUnix) < endTime.Unix() {
+ if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainOne {
+ if _, ok := cloudOneJobTypeRes[cloudbrain.Cloudbrain.JobType]; !ok {
+ cloudOneJobTypeRes[cloudbrain.Cloudbrain.JobType] = 1
+ } else {
+ cloudOneJobTypeRes[cloudbrain.Cloudbrain.JobType] += 1
+ }
+ }
+ if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainTwo {
+ if _, ok := cloudTwoJobTypeRes[cloudbrain.JobType]; !ok {
+ cloudTwoJobTypeRes[cloudbrain.Cloudbrain.JobType] = 1
+ } else {
+ cloudTwoJobTypeRes[cloudbrain.Cloudbrain.JobType] += 1
+ }
+ }
+
+ if _, ok := cloudBrainPeriodNum[cloudbrain.Cloudbrain.Type]; !ok {
+ cloudBrainPeriodNum[cloudbrain.Cloudbrain.Type] = 1
+ } else {
+ cloudBrainPeriodNum[cloudbrain.Cloudbrain.Type] += 1
+ }
+
+ if _, ok := cloudBrainComputeResource[cloudbrain.Cloudbrain.ComputeResource]; !ok {
+ cloudBrainComputeResource[cloudbrain.Cloudbrain.ComputeResource] = 1
+ } else {
+ cloudBrainComputeResource[cloudbrain.Cloudbrain.ComputeResource] += 1
+ }
+
+ }
+ }
+
+ ComputeResourceList := []string{"CPU/GPU", "NPU"}
+ for _, v := range ComputeResourceList {
+ if _, ok := cloudBrainComputeResource[v]; !ok {
+ cloudBrainComputeResource[v] = 0
+ }
+ }
+
+ jobTypeList := []string{"DEBUG", "BENCHMARK", "INFERENCE", "TRAIN", "SNN4IMAGENET", "BRAINSCORE"}
+ cloudBrainTypeList := []int{0, 1, 2}
+ for _, v := range jobTypeList {
+ if _, ok := cloudOneJobTypeRes[v]; !ok {
+ cloudOneJobTypeRes[v] = 0
+ }
+ if _, ok := cloudTwoJobTypeRes[v]; !ok {
+ cloudTwoJobTypeRes[v] = 0
+ }
+ if _, ok := intelligentNetJobTypeRes[v]; !ok {
+ intelligentNetJobTypeRes[v] = 0
+ }
+ }
+ for _, v := range cloudBrainTypeList {
+ if _, ok := cloudBrainPeriodNum[v]; !ok {
+ cloudBrainPeriodNum[v] = 0
+ }
+ }
+ cloudBrainPeriodNum[-1] = cloudBrainPeriodNum[0] + cloudBrainPeriodNum[1] + cloudBrainPeriodNum[2]
+ return cloudOneJobTypeRes, cloudTwoJobTypeRes, intelligentNetJobTypeRes, cloudBrainPeriodNum, cloudBrainComputeResource
+}
+
+func getDayCloudbrainNum(beginTime time.Time, endTime time.Time) ([]DateCloudbrainNum, error) {
+ var endTimeTemp time.Time
+ endTimeTemp = beginTime.AddDate(0, 0, 1)
+ cloudbrains, _, err := models.CloudbrainAllStatic(&models.CloudbrainsOptions{
+ Type: models.TypeCloudBrainAll,
+ BeginTimeUnix: beginTime.Unix(),
+ EndTimeUnix: endTime.Unix(),
+ })
+ if err != nil {
+ log.Error("Get cloudbrains failed:", err)
+ return nil, err
+ }
+ dayCloudbrainNum := make([]DateCloudbrainNum, 0)
+ for endTimeTemp.Before(endTime) || endTimeTemp.Equal(endTime) {
+ cloudOneJobTypeRes, cloudTwoJobTypeRes, intelligentNetJobTypeRes, cloudBrainPeriodNum, cloudBrainComputeResource := getCloudbrainCount(beginTime, endTimeTemp, cloudbrains)
+ dayCloudbrainNum = append(dayCloudbrainNum, DateCloudbrainNum{
+ Date: beginTime.Format("2006/01/02"),
+ CloudOneJobTypeRes: cloudOneJobTypeRes,
+ CloudTwoJobTypeRes: cloudTwoJobTypeRes,
+ IntelligentNetJobTypeRes: intelligentNetJobTypeRes,
+ CloudBrainPeriodNum: cloudBrainPeriodNum,
+ CloudBrainComputeResource: cloudBrainComputeResource,
+ })
+ if endTime.Before(endTimeTemp.AddDate(0, 0, 1)) && endTimeTemp.Before(endTime) {
+ beginTime = endTimeTemp
+ endTimeTemp = endTime
+ } else {
+ beginTime = endTimeTemp
+ endTimeTemp = beginTime.AddDate(0, 0, 1)
+ }
+ }
+ return dayCloudbrainNum, nil
+}
+func getMonthCloudbrainNum(beginTime time.Time, endTime time.Time) ([]DateCloudbrainNum, error) {
+ var endTimeTemp time.Time
+ now := time.Now()
+ endTimeTemp = beginTime.AddDate(0, 1, 0)
+ endTimeTemp = time.Date(endTimeTemp.Year(), endTimeTemp.Month(), 1, 0, 0, 0, 0, now.Location())
+ monthCloudbrainNum := make([]DateCloudbrainNum, 0)
+ cloudbrains, _, err := models.CloudbrainAllStatic(&models.CloudbrainsOptions{
+ Type: models.TypeCloudBrainAll,
+ BeginTimeUnix: beginTime.Unix(),
+ EndTimeUnix: endTime.Unix(),
+ })
+ if err != nil {
+ log.Error("Getcloudbrains failed:%v", err)
+ return nil, err
+ }
+ for endTimeTemp.Before(endTime) || endTimeTemp.Equal(endTime) {
+ cloudOneJobTypeRes, cloudTwoJobTypeRes, intelligentNetJobTypeRes, cloudBrainPeriodNum, cloudBrainComputeResource := getCloudbrainCount(beginTime, endTimeTemp, cloudbrains)
+ monthCloudbrainNum = append(monthCloudbrainNum, DateCloudbrainNum{
+ Date: beginTime.Format("2006/01"),
+ CloudOneJobTypeRes: cloudOneJobTypeRes,
+ CloudTwoJobTypeRes: cloudTwoJobTypeRes,
+ IntelligentNetJobTypeRes: intelligentNetJobTypeRes,
+ CloudBrainPeriodNum: cloudBrainPeriodNum,
+ CloudBrainComputeResource: cloudBrainComputeResource,
+ })
+ if endTime.Before(endTimeTemp.AddDate(0, 1, 0)) && endTimeTemp.Before(endTime) {
+ beginTime = endTimeTemp
+ endTimeTemp = endTime
+ } else {
+ beginTime = endTimeTemp
+ endTimeTemp = beginTime.AddDate(0, 1, 0)
+ }
+ }
+ return monthCloudbrainNum, nil
+}
+
+func getDayCloudbrainInfo(beginTime time.Time, endTime time.Time) ([]DateCloudbrainInfo, int, error) {
+ now := time.Now()
+ endTimeTemp := time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
+ if endTimeTemp.Equal(endTime) {
+ endTimeTemp = endTimeTemp.AddDate(0, 0, -1)
+ }
+ cloudbrains, _, err := models.CloudbrainAllStatic(&models.CloudbrainsOptions{
+ Type: models.TypeCloudBrainAll,
+ BeginTimeUnix: beginTime.Unix(),
+ EndTimeUnix: endTime.Unix(),
+ })
+ if err != nil {
+ log.Error("Getcloudbrains failed:%v", err)
+ return nil, 0, err
+ }
+ dayCloudbrainInfo := make([]DateCloudbrainInfo, 0)
+ count := 0
+ for beginTime.Before(endTimeTemp) || beginTime.Equal(endTimeTemp) {
+ _, _, _, cloudBrainPeriodNum, cloudBrainComputeResource := getCloudbrainCount(endTimeTemp, endTime, cloudbrains)
+ dayCloudbrainInfo = append(dayCloudbrainInfo, DateCloudbrainInfo{
+ Date: endTimeTemp.Format("2006/01/02"),
+ CloudBrainPeriodNum: cloudBrainPeriodNum,
+ CloudBrainComputeResource: cloudBrainComputeResource,
+ })
+ endTime = endTimeTemp
+ endTimeTemp = endTimeTemp.AddDate(0, 0, -1)
+ count += 1
+ }
+ return dayCloudbrainInfo, count, nil
+}
+
+func getMonthCloudbrainInfo(beginTime time.Time, endTime time.Time) ([]DateCloudbrainInfo, int, error) {
+ now := time.Now()
+ endTimeTemp := time.Date(endTime.Year(), endTime.Month(), 1, 0, 0, 0, 0, now.Location())
+ if endTimeTemp.Equal(endTime) {
+ endTimeTemp = endTimeTemp.AddDate(0, -1, 0)
+ }
+ cloudbrains, _, err := models.CloudbrainAllStatic(&models.CloudbrainsOptions{
+ Type: models.TypeCloudBrainAll,
+ BeginTimeUnix: beginTime.Unix(),
+ EndTimeUnix: endTime.Unix(),
+ })
+ if err != nil {
+ log.Error("Getcloudbrains failed:%v", err)
+ return nil, 0, err
+ }
+ dayCloudbrainInfo := make([]DateCloudbrainInfo, 0)
+ count := 0
+ for beginTime.Before(endTimeTemp) || beginTime.Equal(endTimeTemp) || (endTimeTemp.Before(beginTime) && beginTime.Before(endTime)) {
+ _, _, _, cloudBrainPeriodNum, cloudBrainComputeResource := getCloudbrainCount(endTimeTemp, endTime, cloudbrains)
+ dayCloudbrainInfo = append(dayCloudbrainInfo, DateCloudbrainInfo{
+ Date: endTimeTemp.Format("2006/01"),
+ CloudBrainPeriodNum: cloudBrainPeriodNum,
+ CloudBrainComputeResource: cloudBrainComputeResource,
+ })
+ endTime = endTimeTemp
+ endTimeTemp = endTimeTemp.AddDate(0, -1, 0)
+ count += 1
+ }
+ return dayCloudbrainInfo, count, nil
+}
+
func DownloadCloudBrainBoard(ctx *context.Context) {
page := 1
@@ -44,9 +1179,7 @@ func DownloadCloudBrainBoard(ctx *context.Context) {
ctx.Error(http.StatusBadRequest, ctx.Tr("repo.cloudbrain_query_fail"))
return
}
-
totalPage := getTotalPage(total, pageSize)
-
f := excelize.NewFile()
index := f.NewSheet(cloudBrain)
@@ -89,26 +1222,27 @@ func DownloadCloudBrainBoard(ctx *context.Context) {
f.WriteTo(ctx.Resp)
}
+
func getCloudbrainFileName(baseName string) string {
return baseName + "_" + time.Now().Format(EXCEL_DATE_FORMAT) + ".xlsx"
}
func allCloudbrainHeader(ctx *context.Context) map[string]string {
- return map[string]string{"A1": ctx.Tr("repo.cloudbrain_task"), "B1": ctx.Tr("repo.cloudbrain_task_type"), "C1": ctx.Tr("repo.modelarts.status"),
- "D1": ctx.Tr("repo.modelarts.createtime"), "E1": ctx.Tr("repo.modelarts.train_job.wait_time"), "F1": ctx.Tr("repo.modelarts.train_job.dura_time"),
- "G1": ctx.Tr("repo.modelarts.train_job.start_time"),
- "H1": ctx.Tr("repo.modelarts.train_job.end_time"), "I1": ctx.Tr("repo.modelarts.computing_resources"),
- "J1": ctx.Tr("repo.cloudbrain_creator"), "K1": ctx.Tr("repo.repo_name"), "L1": ctx.Tr("repo.cloudbrain_task_name")}
+ return map[string]string{"A1": ctx.Tr("repo.cloudbrain_task"), "B1": ctx.Tr("repo.cloudbrain_type"), "C1": ctx.Tr("repo.modelarts.status"), "D1": ctx.Tr("repo.cloudbrain_task_type"),
+ "E1": ctx.Tr("repo.modelarts.createtime"), "F1": ctx.Tr("repo.modelarts.train_job.wait_time"), "G1": ctx.Tr("repo.modelarts.train_job.dura_time"),
+ "H1": ctx.Tr("repo.modelarts.train_job.start_time"),
+ "I1": ctx.Tr("repo.modelarts.train_job.end_time"), "J1": ctx.Tr("repo.modelarts.computing_resources"),
+ "K1": ctx.Tr("repo.cloudbrain_creator"), "L1": ctx.Tr("repo.repo_name"), "M1": ctx.Tr("repo.cloudbrain_task_name"), "N1": ctx.Tr("repo.modelarts.deletetime")}
}
func allCloudbrainValues(row int, rs *models.CloudbrainInfo, ctx *context.Context) map[string]string {
- return map[string]string{getCellName("A", row): rs.DisplayJobName, getCellName("B", row): rs.JobType, getCellName("C", row): rs.Status,
- getCellName("D", row): time.Unix(int64(rs.Cloudbrain.CreatedUnix), 0).Format(CREATE_TIME_FORMAT), getCellName("E", row): getBrainWaitTime(rs),
- getCellName("F", row): rs.TrainJobDuration, getCellName("G", row): getBrainStartTime(rs),
- getCellName("H", row): getBrainEndTime(rs),
- getCellName("I", row): rs.ComputeResource, getCellName("J", row): rs.Name, getCellName("K", row): getBrainRepo(rs),
- getCellName("L", row): rs.JobName,
+ return map[string]string{getCellName("A", row): rs.DisplayJobName, getCellName("B", row): getCloudbrainType(rs, ctx), getCellName("C", row): rs.Status, getCellName("D", row): rs.JobType,
+ getCellName("E", row): time.Unix(int64(rs.Cloudbrain.CreatedUnix), 0).Format(CREATE_TIME_FORMAT), getCellName("F", row): getBrainWaitTime(rs),
+ getCellName("G", row): rs.TrainJobDuration, getCellName("H", row): getBrainStartTime(rs),
+ getCellName("I", row): getBrainEndTime(rs),
+ getCellName("J", row): rs.ComputeResource, getCellName("K", row): rs.Name, getCellName("L", row): getBrainRepo(rs),
+ getCellName("M", row): rs.JobName, getCellName("N", row): getBrainDeleteTime(rs),
}
}
func getBrainRepo(rs *models.CloudbrainInfo) string {
@@ -136,16 +1270,114 @@ func getBrainEndTime(rs *models.CloudbrainInfo) string {
}
func getBrainWaitTime(rs *models.CloudbrainInfo) string {
- waitTime := rs.Cloudbrain.StartTime - rs.Cloudbrain.CreatedUnix
+ var waitTime int64
+ if rs.Cloudbrain.Status == string(models.JobWaiting) {
+ waitTime = time.Now().Unix() - rs.Cloudbrain.CreatedUnix.AsTime().Unix()
+ } else {
+ waitTime = int64(rs.Cloudbrain.StartTime - rs.Cloudbrain.CreatedUnix)
+ }
if waitTime <= 0 {
- return "0"
+ return "00:00:00"
} else {
- return models.ConvertDurationToStr(int64(waitTime))
+ return models.ConvertDurationToStr(waitTime)
}
}
-func GetCloudbrainsStatusAnalysis(ctx *context.Context) {
- cloudBrainStatusResult := models.GetAllStatusCloudBrain()
- ctx.JSON(http.StatusOK, map[string]interface{}{
- "cloudBrainStatusResult": cloudBrainStatusResult,
- })
+func getCloudbrainType(rs *models.CloudbrainInfo, ctx *context.Context) string {
+ if rs.Cloudbrain.Type == models.TypeCloudBrainOne {
+ return ctx.Tr("repo.cloudbrain1")
+ } else if rs.Cloudbrain.Type == models.TypeCloudBrainTwo {
+ return ctx.Tr("repo.cloudbrain2")
+ } else if rs.Cloudbrain.Type == models.TypeIntelligentNet {
+ return ctx.Tr("repo.intelligent_net")
+ } else {
+ return ctx.Tr("repo.cloudbrain_untype")
+ }
+}
+
+func getBrainDeleteTime(rs *models.CloudbrainInfo) string {
+ nilTime := time.Time{}
+ if rs.Cloudbrain.DeletedAt != nilTime {
+ return rs.Cloudbrain.DeletedAt.Format("2006-01-02 15:04:05")
+ } else {
+ return ""
+ }
+}
+func getCloudbrainTimePeroid(ctx *context.Context, recordBeginTime time.Time) (time.Time, time.Time, error) {
+ queryType := ctx.QueryTrim("type")
+ beginTimeStr := ctx.QueryTrim("beginTime")
+ endTimeStr := ctx.QueryTrim("endTime")
+ now := time.Now()
+
+ var beginTime time.Time
+ var endTime time.Time
+ var err error
+ if queryType != "" {
+
+ if queryType == "all" {
+ beginTime = recordBeginTime
+ endTime = now
+ } else if queryType == "today" {
+ endTime = now
+ beginTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
+ } else if queryType == "yesterday" {
+ endTime = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
+ beginTime = endTime.AddDate(0, 0, -1)
+
+ } else if queryType == "last_7day" {
+ beginTime = now.AddDate(0, 0, -6)
+ beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
+ endTime = now
+ } else if queryType == "last_30day" {
+ beginTime = now.AddDate(0, 0, -29)
+ beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
+ endTime = now
+ } else if queryType == "current_month" {
+ endTime = now
+ beginTime = time.Date(endTime.Year(), endTime.Month(), 1, 0, 0, 0, 0, now.Location())
+ } else if queryType == "monthly" {
+ endTime = now
+ beginTime = now.AddDate(0, -1, 1)
+ beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
+
+ } else if queryType == "current_year" {
+ endTime = now
+ beginTime = time.Date(endTime.Year(), 1, 1, 0, 0, 0, 0, now.Location())
+
+ } else if queryType == "last_month" {
+
+ lastMonthTime := now.AddDate(0, -1, 0)
+ beginTime = time.Date(lastMonthTime.Year(), lastMonthTime.Month(), 1, 0, 0, 0, 0, now.Location())
+ endTime = time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location())
+
+ } else {
+ return now, now, fmt.Errorf("The value of type parameter is wrong.")
+
+ }
+
+ } else {
+ if beginTimeStr == "" || endTimeStr == "" {
+ //如果查询类型和开始时间结束时间都未设置,按queryType=all处理
+ beginTime = recordBeginTime
+ endTime = now
+
+ } else {
+
+ beginTime, err = time.ParseInLocation("2006-01-02", beginTimeStr, time.Local)
+ if err != nil {
+ return now, now, err
+ }
+
+ endTime, err = time.ParseInLocation("2006-01-02", endTimeStr, time.Local)
+ if err != nil {
+ return now, now, err
+ }
+ }
+
+ }
+
+ if beginTime.Before(recordBeginTime) {
+ beginTime = recordBeginTime
+ }
+
+ return beginTime, endTime, nil
}
diff --git a/routers/api/v1/repo/repo_dashbord.go b/routers/api/v1/repo/repo_dashbord.go
index 6d7360053..b19c93371 100644
--- a/routers/api/v1/repo/repo_dashbord.go
+++ b/routers/api/v1/repo/repo_dashbord.go
@@ -192,7 +192,6 @@ func GetProjectsSummaryData(ctx *context.Context) {
}
-
projectSummaryPeriodData := ProjectSummaryPeriodData{
TotalCount: count - 1,
RecordBeginTime: recordBeginTime.Format(DATE_FORMAT),
@@ -203,7 +202,7 @@ func GetProjectsSummaryData(ctx *context.Context) {
}
-func reverse(datas []*ProjectSummaryBaseData ) []*ProjectSummaryBaseData {
+func reverse(datas []*ProjectSummaryBaseData) []*ProjectSummaryBaseData {
for i := 0; i < len(datas)/2; i++ {
j := len(datas) - i - 1
datas[i], datas[j] = datas[j], datas[i]
@@ -211,8 +210,6 @@ func reverse(datas []*ProjectSummaryBaseData ) []*ProjectSummaryBaseData {
return datas
}
-
-
func setStatisticsData(data *ProjectSummaryBaseData, v *models.SummaryStatistic, stats *models.SummaryStatistic) {
data.NumReposAdd = v.NumRepos - stats.NumRepos
data.NumRepoPublicAdd = v.NumRepoPublic - stats.NumRepoPublic
@@ -890,12 +887,19 @@ func getTimePeroid(ctx *context.Context, recordBeginTime time.Time) (time.Time,
if queryType == "all" {
beginTime = recordBeginTimeTemp
endTime = now
- } else if queryType == "yesterday" {
+ } else if queryType == "today" {
endTime = now
beginTime = time.Date(endTime.Year(), endTime.Month(), endTime.Day(), 0, 0, 0, 0, now.Location())
+ } else if queryType == "yesterday" {
+ endTime = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
+ beginTime = endTime.AddDate(0, 0, -1)
- } else if queryType == "current_week" {
- beginTime = now.AddDate(0, 0, -int(time.Now().Weekday())+2) //begin from monday
+ } else if queryType == "last_7day" {
+ beginTime = now.AddDate(0, 0, -7)
+ beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
+ endTime = now
+ } else if queryType == "last_30day" {
+ beginTime = now.AddDate(0, 0, -30)
beginTime = time.Date(beginTime.Year(), beginTime.Month(), beginTime.Day(), 0, 0, 0, 0, now.Location())
endTime = now
} else if queryType == "current_month" {
diff --git a/routers/home.go b/routers/home.go
index e31bed4ff..1ed5faaa8 100755
--- a/routers/home.go
+++ b/routers/home.go
@@ -7,7 +7,6 @@ package routers
import (
"bytes"
- "fmt"
"net/http"
"strconv"
"strings"
@@ -343,6 +342,12 @@ func ExploreDatasets(ctx *context.Context) {
if ctx.User != nil && !ctx.User.IsAdmin {
ownerID = ctx.User.ID
}
+ var datasetsIds []int64
+ if ownerID > 0 {
+
+ datasetsIds = models.GetCollaboratorDatasetIdsByUserID(ownerID)
+ }
+
opts := &models.SearchDatasetOptions{
Keyword: keyword,
IncludePublic: true,
@@ -351,6 +356,7 @@ func ExploreDatasets(ctx *context.Context) {
Task: task,
License: license,
OwnerID: ownerID,
+ DatasetIDs: datasetsIds,
RecommendOnly: ctx.QueryBool("recommend"),
ListOptions: models.ListOptions{
Page: page,
@@ -666,10 +672,19 @@ func getRecommendOrg() ([]map[string]interface{}, error) {
if err != nil {
return nil, err
}
+ names := make([]string, 0)
+ for _, userName := range result {
+ names = append(names, userName)
+ }
+ users, _ := models.GetUsersByNames(names)
+ userMap := make(map[string]*models.User, 0)
+ for _, user := range users {
+ userMap[user.Name] = user
+ }
resultOrg := make([]map[string]interface{}, 0)
for _, userName := range result {
- user, err := models.GetUserByName(userName)
- if err == nil {
+ user := userMap[userName]
+ if user != nil {
userMap := make(map[string]interface{})
userMap["Name"] = user.Name
userMap["Description"] = user.Description
@@ -682,7 +697,7 @@ func getRecommendOrg() ([]map[string]interface{}, error) {
userMap["NumMembers"] = user.NumMembers
resultOrg = append(resultOrg, userMap)
} else {
- log.Info("query user error," + err.Error())
+ log.Info("the user not exist," + userName)
}
}
return resultOrg, nil
@@ -751,15 +766,6 @@ func GetRankUser(index string) ([]map[string]interface{}, error) {
return resultOrg, nil
}
-// func GetImageInfoFromPromote(ctx *context.Context) {
-// imageInfo, err := GetImageInfo()
-// if err != nil {
-// ctx.ServerError("500", err)
-// return
-// }
-// ctx.JSON(200, imageInfo)
-// }
-
func GetUserRankFromPromote(ctx *context.Context) {
index := ctx.Params("index")
resultUserRank, err := GetRankUser(index)
@@ -783,45 +789,15 @@ func RecommendHomeInfo(ctx *context.Context) {
if err != nil {
log.Info("error." + err.Error())
}
- resultCloudBrain, err := getCloudbrainNums()
- if err != nil {
- log.Info("error." + err.Error())
- }
+
mapInterface := make(map[string]interface{})
mapInterface["org"] = resultOrg
mapInterface["repo"] = resultRepo
mapInterface["image"] = resultImage
- mapInterface["cloudbrain"] = resultCloudBrain
+ //mapInterface["cloudbrain"] = resultCloudBrain
ctx.JSON(http.StatusOK, mapInterface)
}
-func getCloudbrainNums() (map[string]string, error) {
- result := make(map[string]string)
- cloudStatusMap := models.GetAllStatusCloudBrain()
- result["completed_task"] = fmt.Sprint(cloudStatusMap["COMPLETED"])
- result["running_task"] = fmt.Sprint(cloudStatusMap["RUNNING"])
- result["wait_task"] = fmt.Sprint(cloudStatusMap["WAITING"])
- return result, nil
-}
-
-// func RecommendOrgFromPromote(ctx *context.Context) {
-// resultOrg, err := GetRecommendOrg()
-// if err != nil {
-// ctx.ServerError("500", err)
-// return
-// }
-// ctx.JSON(200, resultOrg)
-// }
-
-func RecommendRepoFromPromote(ctx *context.Context) {
- result, err := repository.GetRecommendRepoFromPromote("projects")
- if err != nil {
- ctx.ServerError("500", err)
- } else {
- ctx.JSON(200, result)
- }
-}
-
func HomeTerm(ctx *context.Context) {
ctx.HTML(200, tplHomeTerm)
}
diff --git a/routers/repo/ai_model_manage.go b/routers/repo/ai_model_manage.go
index 3ca6cf115..2c24527ce 100644
--- a/routers/repo/ai_model_manage.go
+++ b/routers/repo/ai_model_manage.go
@@ -66,6 +66,14 @@ func saveModelByParameters(jobId string, versionName string, name string, versio
return err
}
} else if cloudType == models.TypeCloudBrainOne {
+ var ResourceSpecs *models.ResourceSpecs
+ json.Unmarshal([]byte(setting.ResourceSpecs), &ResourceSpecs)
+ for _, tmp := range ResourceSpecs.ResourceSpec {
+ if tmp.Id == aiTask.ResourceSpecId {
+ flaverName := ctx.Tr("cloudbrain.gpu_num") + ": " + fmt.Sprint(tmp.GpuNum) + " " + ctx.Tr("cloudbrain.cpu_num") + ": " + fmt.Sprint(tmp.CpuNum) + " " + ctx.Tr("cloudbrain.memory") + "(MB): " + fmt.Sprint(tmp.MemMiB) + " " + ctx.Tr("cloudbrain.shared_memory") + "(MB): " + fmt.Sprint(tmp.ShareMemMiB)
+ aiTask.FlavorName = flaverName
+ }
+ }
modelPath, modelSize, err = downloadModelFromCloudBrainOne(id, aiTask.JobName, "", aiTask.TrainUrl)
if err != nil {
log.Info("download model from CloudBrainOne faild." + err.Error())
@@ -97,7 +105,7 @@ func saveModelByParameters(jobId string, versionName string, name string, versio
UserId: ctx.User.ID,
CodeBranch: aiTask.BranchName,
CodeCommitID: aiTask.CommitID,
- Engine: aiTask.EngineID,
+ Engine: int64(engine),
TrainTaskInfo: string(aiTaskJson),
Accuracy: string(accuracyJson),
}
diff --git a/routers/repo/cloudbrain.go b/routers/repo/cloudbrain.go
index b034d3d12..eb2ddc93b 100755
--- a/routers/repo/cloudbrain.go
+++ b/routers/repo/cloudbrain.go
@@ -283,11 +283,13 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) {
mkModelPath(modelPath)
uploadCodeToMinio(modelPath, jobName, cloudbrain.ModelMountPath+"/")
+ commitID, _ := ctx.Repo.GitRepo.GetBranchCommitID(branchName)
+
err = cloudbrain.GenerateTask(ctx, displayJobName, jobName, image, command, uuid, storage.GetMinioPath(jobName, cloudbrain.CodeMountPath+"/"),
storage.GetMinioPath(jobName, cloudbrain.ModelMountPath+"/"),
storage.GetMinioPath(jobName, cloudbrain.BenchMarkMountPath+"/"), storage.GetMinioPath(jobName, cloudbrain.Snn4imagenetMountPath+"/"),
storage.GetMinioPath(jobName, cloudbrain.BrainScoreMountPath+"/"), jobType, gpuQueue, form.Description, branchName, form.BootFile, form.Params,
- 0, 0, resourceSpecId)
+ commitID, 0, 0, resourceSpecId)
if err != nil {
cloudBrainNewDataPrepare(ctx)
ctx.RenderWithErr(err.Error(), tpl, &form)
@@ -1479,11 +1481,19 @@ func SyncCloudbrainStatus() {
}
func HandleTaskWithNoDuration(ctx *context.Context) {
+ mode := ctx.Query("mode")
log.Info("HandleTaskWithNoDuration start")
count := 0
start := time.Now().Unix()
for {
- cloudBrains, err := models.GetStoppedJobWithNoDurationJob()
+ var cloudBrains []*models.Cloudbrain
+ var err error
+ if mode == "1" {
+ cloudBrains, err = models.GetStoppedJobWithNoStartTimeEndTime()
+ } else {
+ cloudBrains, err = models.GetStoppedJobWithNoDurationJob()
+ }
+
if err != nil {
log.Error("HandleTaskWithNoTrainJobDuration failed:", err.Error())
break
@@ -1558,7 +1568,7 @@ func handleNoDurationTask(cloudBrains []*models.Cloudbrain) {
}
task.Duration = task.EndTime.AsTime().Unix() - task.StartTime.AsTime().Unix()
task.TrainJobDuration = models.ConvertDurationToStr(task.Duration)
- err = models.UpdateJob(task)
+ err = models.UpdateJobDurationWithDeleted(task)
if err != nil {
log.Error("UpdateJob(%s) failed:%v", task.JobName, err)
}
@@ -1583,7 +1593,7 @@ func handleNoDurationTask(cloudBrains []*models.Cloudbrain) {
}
task.CorrectCreateUnix()
task.ComputeAndSetDuration()
- err = models.UpdateJob(task)
+ err = models.UpdateJobDurationWithDeleted(task)
if err != nil {
log.Error("UpdateJob(%s) failed:%v", task.JobName, err)
continue
@@ -1604,7 +1614,7 @@ func handleNoDurationTask(cloudBrains []*models.Cloudbrain) {
task.EndTime = task.StartTime.Add(result.Duration / 1000)
}
task.ComputeAndSetDuration()
- err = models.UpdateJob(task)
+ err = models.UpdateJobDurationWithDeleted(task)
if err != nil {
log.Error("UpdateJob(%s) failed:%v", task.JobName, err)
continue
@@ -1625,7 +1635,7 @@ func updateDefaultDuration(task *models.Cloudbrain) {
task.StartTime = task.CreatedUnix
task.EndTime = task.UpdatedUnix
task.ComputeAndSetDuration()
- err := models.UpdateJob(task)
+ err := models.UpdateJobDurationWithDeleted(task)
if err != nil {
log.Error("UpdateJob(%s) failed:%v", task.JobName, err)
}
@@ -1976,7 +1986,7 @@ func BenchMarkAlgorithmCreate(ctx *context.Context, form auth.CreateCloudBrainFo
storage.GetMinioPath(jobName, cloudbrain.ModelMountPath+"/"),
storage.GetMinioPath(jobName, cloudbrain.BenchMarkMountPath+"/"), storage.GetMinioPath(jobName, cloudbrain.Snn4imagenetMountPath+"/"),
storage.GetMinioPath(jobName, cloudbrain.BrainScoreMountPath+"/"), string(models.JobTypeBenchmark), gpuQueue, form.Description, cloudbrain.DefaultBranchName, "", "",
- benchmarkTypeID, benchmarkChildTypeID, resourceSpecId)
+ "", benchmarkTypeID, benchmarkChildTypeID, resourceSpecId)
if err != nil {
cloudBrainNewDataPrepare(ctx)
ctx.RenderWithErr(err.Error(), tplCloudBrainBenchmarkNew, &form)
@@ -2074,7 +2084,7 @@ func ModelBenchmarkCreate(ctx *context.Context, form auth.CreateCloudBrainForm)
storage.GetMinioPath(jobName, cloudbrain.ModelMountPath+"/"),
storage.GetMinioPath(jobName, cloudbrain.BenchMarkMountPath+"/"), storage.GetMinioPath(jobName, cloudbrain.Snn4imagenetMountPath+"/"),
storage.GetMinioPath(jobName, cloudbrain.BrainScoreMountPath+"/"), jobType, gpuQueue, form.Description, branchName, form.BootFile, form.Params,
- 0, benchmarkChildTypeID, resourceSpecId)
+ "", 0, benchmarkChildTypeID, resourceSpecId)
if err != nil {
cloudBrainNewDataPrepare(ctx)
ctx.RenderWithErr(err.Error(), tpl, &form)
diff --git a/routers/repo/dataset.go b/routers/repo/dataset.go
index 05a89964f..19cd6e6dc 100755
--- a/routers/repo/dataset.go
+++ b/routers/repo/dataset.go
@@ -172,8 +172,8 @@ func DatasetIndex(ctx *context.Context) {
for _, attachment := range pageAttachments {
uploader, _ := models.GetUserByID(attachment.UploaderID)
attachment.Uploader = uploader
- if !strings.HasSuffix(attachment.Name, ".zip") {
- attachment.DecompressState = -1 //非zip文件
+ if !strings.HasSuffix(attachment.Name, ".zip") && !strings.HasSuffix(attachment.Name, ".tar.gz") {
+ attachment.DecompressState = -1 //非压缩文件
}
}
@@ -452,10 +452,11 @@ func PublicDataset(ctx *context.Context) {
}
func MyFavoriteDataset(ctx *context.Context) {
- page := ctx.QueryInt("page")
+ UserId := ctx.User.ID
cloudbrainType := ctx.QueryInt("type")
keyword := strings.Trim(ctx.Query("q"), " ")
- var datasetIDs []int64
+ var NotColDatasetIDs []int64
+ var IsColDatasetIDs []int64
datasetStars, err := models.GetDatasetStarByUser(ctx.User)
if err != nil {
ctx.JSON(http.StatusOK, models.BaseErrorMessage(ctx.Tr("GetDatasetStarByUser failed", err)))
@@ -467,31 +468,82 @@ func MyFavoriteDataset(ctx *context.Context) {
})
return
}
- for i, _ := range datasetStars {
- datasetIDs = append(datasetIDs, datasetStars[i].DatasetID)
+ //If the dataset has been deleted, it will not be counted
+ for _, datasetStar := range datasetStars {
+ IsExist, repo, dataset, err := IsDatasetStarExist(datasetStar)
+ if err != nil {
+ log.Error("IsDatasetStarExist error:", err.Error())
+ }
+ if IsExist {
+ DatasetIsCollaborator := DatasetIsCollaborator(ctx, dataset)
+ if repo.OwnerID == ctx.User.ID || DatasetIsCollaborator {
+ IsColDatasetIDs = append(IsColDatasetIDs, datasetStar.DatasetID)
+ } else {
+ NotColDatasetIDs = append(NotColDatasetIDs, datasetStar.DatasetID)
+ }
+ }
}
- datasets, count, err := models.Attachments(&models.AttachmentsOptions{
- ListOptions: models.ListOptions{
- Page: page,
- PageSize: setting.UI.DatasetPagingNum,
- },
+ NotColDatasets, NotColcount, err := models.Attachments(&models.AttachmentsOptions{
Keyword: keyword,
NeedDatasetIDs: true,
- DatasetIDs: datasetIDs,
+ DatasetIDs: NotColDatasetIDs,
NeedIsPrivate: true,
IsPrivate: false,
Type: cloudbrainType,
JustNeedZipFile: true,
NeedRepoInfo: true,
RecommendOnly: ctx.QueryBool("recommend"),
+ UserId: UserId,
})
if err != nil {
ctx.ServerError("datasets", err)
return
}
+ //If is collaborator, there is no need to determine whether the dataset is private or public
+ IsColDatasets, IsColcount, err := models.Attachments(&models.AttachmentsOptions{
+ Keyword: keyword,
+ NeedDatasetIDs: true,
+ DatasetIDs: IsColDatasetIDs,
+ NeedIsPrivate: false,
+ Type: cloudbrainType,
+ JustNeedZipFile: true,
+ NeedRepoInfo: true,
+ RecommendOnly: ctx.QueryBool("recommend"),
+ UserId: UserId,
+ })
+ if err != nil {
+ ctx.ServerError("datasets", err)
+ return
+ }
+ for _, NotColDataset := range NotColDatasets {
+ IsColDatasets = append(IsColDatasets, NotColDataset)
+ }
+ datasets := IsColDatasets
+ count := NotColcount + IsColcount
+ sort.Slice(datasets, func(i, j int) bool {
+ return datasets[i].Attachment.CreatedUnix > datasets[j].Attachment.CreatedUnix
+ })
- data, err := json.Marshal(datasets)
+ page := ctx.QueryInt("page")
+ if page <= 0 {
+ page = 1
+ }
+ pagesize := ctx.QueryInt("pagesize")
+ if pagesize <= 0 {
+ pagesize = 5
+ }
+ pageDatasetsInfo := getPageDatasets(datasets, page, pagesize)
+ if pageDatasetsInfo == nil {
+ ctx.JSON(200, map[string]string{
+ "result_code": "0",
+ "data": "[]",
+ "count": strconv.FormatInt(count, 10),
+ })
+ return
+ }
+ data, err := json.Marshal(pageDatasetsInfo)
+ log.Info("data:", data)
if err != nil {
log.Error("json.Marshal failed:", err.Error())
ctx.JSON(200, map[string]string{
@@ -508,6 +560,29 @@ func MyFavoriteDataset(ctx *context.Context) {
})
}
+func getPageDatasets(AttachmentInfos []*models.AttachmentInfo, page int, pagesize int) []*models.AttachmentInfo {
+ begin := (page - 1) * pagesize
+ end := (page) * pagesize
+
+ if begin > len(AttachmentInfos)-1 {
+ return nil
+ }
+ if end > len(AttachmentInfos)-1 {
+ return AttachmentInfos[begin:]
+ } else {
+ return AttachmentInfos[begin:end]
+ }
+
+}
+func getTotalPage(total int64, pageSize int) int {
+
+ another := 0
+ if int(total)%pageSize != 0 {
+ another = 1
+ }
+ return int(total)/pageSize + another
+
+}
func GetDatasetStatus(ctx *context.Context) {
@@ -533,3 +608,55 @@ func GetDatasetStatus(ctx *context.Context) {
"AttachmentStatus": fmt.Sprint(attachment.DecompressState),
})
}
+func DatasetIsCollaborator(ctx *context.Context, dataset *models.Dataset) bool {
+ repo, err := models.GetRepositoryByID(dataset.RepoID)
+ if err != nil {
+ log.Error("query repo error:", err.Error())
+ } else {
+ repo.GetOwner()
+ if ctx.User != nil {
+ if repo.Owner.IsOrganization() {
+ org := repo.Owner
+ org.Teams, err = org.GetUserTeams(ctx.User.ID)
+ if err != nil {
+ log.Error("GetUserTeams error:", err.Error())
+ return false
+ }
+ if org.IsUserPartOfOrg(ctx.User.ID) {
+ for _, t := range org.Teams {
+ if t.IsMember(ctx.User.ID) && t.HasRepository(repo.ID) {
+ return true
+ }
+ }
+ isOwner, _ := models.IsOrganizationOwner(repo.OwnerID, ctx.User.ID)
+ if isOwner {
+ return isOwner
+ }
+ return false
+ }
+ }
+
+ isCollaborator, _ := repo.IsCollaborator(ctx.User.ID)
+ if isCollaborator {
+ return true
+ }
+ }
+ }
+
+ return false
+}
+func IsDatasetStarExist(datasetStar *models.DatasetStar) (bool, *models.Repository, *models.Dataset, error) {
+ dataset, err := models.GetDatasetByID(datasetStar.DatasetID)
+ if err != nil {
+ log.Error("query dataset error:", err.Error())
+ return false, nil, nil, err
+ } else {
+ repo, err := models.GetRepositoryByID(dataset.RepoID)
+ if err != nil {
+ log.Error("GetRepositoryByID error:", err.Error())
+ return false, nil, nil, err
+ }
+ return true, repo, dataset, nil
+ }
+
+}
diff --git a/routers/repo/modelarts.go b/routers/repo/modelarts.go
index 44476ab1e..12a5a0623 100755
--- a/routers/repo/modelarts.go
+++ b/routers/repo/modelarts.go
@@ -1407,7 +1407,7 @@ func readDir(dirname string) ([]os.FileInfo, error) {
return nil, err
}
- list, err := f.Readdir(100)
+ list, err := f.Readdir(0)
f.Close()
if err != nil {
//todo: can not upload empty folder
diff --git a/routers/routes/routes.go b/routers/routes/routes.go
index dd0605841..7732ff217 100755
--- a/routers/routes/routes.go
+++ b/routers/routes/routes.go
@@ -331,6 +331,7 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Post("/all/search/", routers.Search)
m.Get("/all/search/", routers.EmptySearch)
m.Get("/all/dosearch/", routers.SearchApi)
+ m.Post("/user/login/kanban", user.SignInPostAPI)
m.Get("/home/term", routers.HomeTerm)
m.Group("/explore", func() {
m.Get("", func(ctx *context.Context) {
@@ -365,6 +366,7 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Group("/user", func() {
m.Get("/login", user.SignIn)
m.Get("/login/cloud_brain", user.SignInCloudBrain)
+
m.Post("/login", bindIgnErr(auth.SignInForm{}), user.SignInPost)
m.Group("", func() {
m.Combo("/login/openid").
diff --git a/routers/search.go b/routers/search.go
index fe1643c80..05074df55 100644
--- a/routers/search.go
+++ b/routers/search.go
@@ -489,7 +489,7 @@ func makeRepoResult(sRes *elastic.SearchResult, Key string, OnlyReturnNum bool,
if recordSource["avatar"] != nil {
avatarstr := recordSource["avatar"].(string)
if len(avatarstr) == 0 {
- record["avatar"] = setting.RepositoryAvatarFallbackImage
+ // record["avatar"] = setting.RepositoryAvatarFallbackImage
} else {
record["avatar"] = setting.AppSubURL + "/repo-avatars/" + avatarstr
}
diff --git a/routers/user/auth.go b/routers/user/auth.go
index a02cf24dc..1edc5a0dd 100755
--- a/routers/user/auth.go
+++ b/routers/user/auth.go
@@ -176,6 +176,41 @@ func SignInCloudBrain(ctx *context.Context) {
ctx.HTML(200, tplSignInCloudBrain)
}
+func SignInPostAPI(ctx *context.Context) {
+ ctx.Data["Title"] = ctx.Tr("sign_in")
+ UserName := ctx.Query("UserName")
+ Password := ctx.Query("Password")
+ log.Info("0000000")
+ orderedOAuth2Names, oauth2Providers, err := models.GetActiveOAuth2Providers()
+ if err != nil {
+ ctx.ServerError("UserSignIn", err)
+ return
+ }
+ ctx.Data["OrderedOAuth2Names"] = orderedOAuth2Names
+ ctx.Data["OAuth2Providers"] = oauth2Providers
+ ctx.Data["Title"] = ctx.Tr("sign_in")
+ ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login"
+ ctx.Data["PageIsSignIn"] = true
+ ctx.Data["PageIsLogin"] = true
+ ctx.Data["IsCourse"] = ctx.QueryBool("course")
+ ctx.Data["EnableSSPI"] = models.IsSSPIEnabled()
+
+ if ctx.HasError() {
+ ctx.HTML(200, tplSignIn)
+ return
+ }
+ u, err := models.UserSignIn(UserName, Password)
+ if err != nil {
+ ctx.ServerError("UserSignIn", err)
+ return
+ }
+ models.SaveLoginInfoToDb(ctx.Req.Request, u)
+ // If this user is enrolled in 2FA, we can't sign the user in just yet.
+ // Instead, redirect them to the 2FA authentication page.
+ //handleSignInFull(ctx, u, form.Remember, false)
+ handleSignInFullNotRedirect(ctx, u, true, false)
+}
+
// SignInPost response for sign in request
func SignInPost(ctx *context.Context, form auth.SignInForm) {
ctx.Data["Title"] = ctx.Tr("sign_in")
@@ -518,6 +553,68 @@ func handleSignIn(ctx *context.Context, u *models.User, remember bool) {
handleSignInFull(ctx, u, remember, true)
}
+func handleSignInFullNotRedirect(ctx *context.Context, u *models.User, remember bool, obeyRedirect bool) string {
+
+ log.Info("enter here.")
+ if remember {
+ days := 86400 * setting.LogInRememberDays
+ ctx.SetCookie(setting.CookieUserName, u.Name, days, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true)
+ ctx.SetSuperSecureCookie(base.EncodeMD5(u.Rands+u.Passwd),
+ setting.CookieRememberName, u.Name, days, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true)
+ }
+
+ _ = ctx.Session.Delete("openid_verified_uri")
+ _ = ctx.Session.Delete("openid_signin_remember")
+ _ = ctx.Session.Delete("openid_determined_email")
+ _ = ctx.Session.Delete("openid_determined_username")
+ _ = ctx.Session.Delete("twofaUid")
+ _ = ctx.Session.Delete("twofaRemember")
+ _ = ctx.Session.Delete("u2fChallenge")
+ _ = ctx.Session.Delete("linkAccount")
+ if err := ctx.Session.Set("uid", u.ID); err != nil {
+ log.Error("Error setting uid %d in session: %v", u.ID, err)
+ }
+ if err := ctx.Session.Set("uname", u.Name); err != nil {
+ log.Error("Error setting uname %s session: %v", u.Name, err)
+ }
+ if err := ctx.Session.Release(); err != nil {
+ log.Error("Unable to store session: %v", err)
+ }
+
+ // If the user does not have a locale set, we save the current one.
+ if len(u.Language) == 0 {
+ if len(ctx.GetCookie("lang")) != 0 {
+ u.Language = ctx.GetCookie("lang")
+ } else {
+ u.Language = ctx.Locale.Language()
+ }
+
+ if err := models.UpdateUserCols(u, "language"); err != nil {
+ log.Error(fmt.Sprintf("Error updating user language [user: %d, locale: %s]", u.ID, u.Language))
+ return setting.AppSubURL + "/dashboard"
+ }
+ } else {
+ // Language setting of the user use the one previously set
+ if len(ctx.GetCookie("lang")) != 0 {
+ u.Language = ctx.GetCookie("lang")
+ }
+ }
+
+ ctx.SetCookie("lang", u.Language, nil, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true)
+
+ // Clear whatever CSRF has right now, force to generate a new one
+ ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubURL, setting.SessionConfig.Domain, setting.SessionConfig.Secure, true)
+
+ // Register last login
+ u.SetLastLogin()
+ if err := models.UpdateUserCols(u, "last_login_unix"); err != nil {
+ ctx.ServerError("UpdateUserCols", err)
+ return setting.AppSubURL + "/dashboard"
+ }
+
+ return setting.AppSubURL + "/dashboard"
+}
+
func handleSignInFull(ctx *context.Context, u *models.User, remember bool, obeyRedirect bool) string {
if remember {
days := 86400 * setting.LogInRememberDays
diff --git a/services/repository/repository.go b/services/repository/repository.go
index 80518b666..6bf4ab283 100644
--- a/services/repository/repository.go
+++ b/services/repository/repository.go
@@ -131,11 +131,6 @@ func GetRecommendRepoFromPromote(filename string) ([]map[string]interface{}, err
repoMap["ID"] = fmt.Sprint(repo.ID)
repoMap["Name"] = repo.Name
repoMap["Alias"] = repo.Alias
- if repo.RepoType == models.RepoCourse {
- //Load creator
- repo.GetCreator()
- repoMap["Creator"] = repo.Creator
- }
repoMap["OwnerName"] = repo.OwnerName
repoMap["NumStars"] = repo.NumStars
diff --git a/templates/explore/datasets.tmpl b/templates/explore/datasets.tmpl
index 0cfe1fd18..327c4fb98 100644
--- a/templates/explore/datasets.tmpl
+++ b/templates/explore/datasets.tmpl
@@ -199,7 +199,7 @@
{{else}}
+ style="display: flex;align-items: center;justify-content: flex-end;cursor: pointer;font-size: 12px;font-weight: normal;flex: 1;margin-left: 1.5rem;">
diff --git a/web_src/js/components/Model.vue b/web_src/js/components/Model.vue
index 801ca8805..ed409c0d2 100644
--- a/web_src/js/components/Model.vue
+++ b/web_src/js/components/Model.vue
@@ -353,7 +353,7 @@ export default {
return "Pytorch";
}else if(model.Engine == 1 || model.Engine == 121){
return "TensorFlow";
- }else if(model.Engine == 2 || model.Engine == 122){
+ }else if(model.Engine == 2 || model.Engine == 122 || model.Engine == 35){
return "MindSpore";
}else{
return "Other"
diff --git a/web_src/js/components/images/selectImages.vue b/web_src/js/components/images/selectImages.vue
index cc706fd86..fad9e9a5d 100644
--- a/web_src/js/components/images/selectImages.vue
+++ b/web_src/js/components/images/selectImages.vue
@@ -5,8 +5,8 @@
-
+ placeholder="选择镜像或输入镜像地址" required>
+
选择镜像
diff --git a/web_src/js/index.js b/web_src/js/index.js
index c7d77bdb4..ef12b4158 100755
--- a/web_src/js/index.js
+++ b/web_src/js/index.js
@@ -5093,8 +5093,9 @@ function initChartsNpu() {
data: []
},
grid: {
- top: '30%',
+ top: '35%',
bottom: '2%',
+ x: '2%',
containLabel: true
},
tooltip: {
@@ -5130,14 +5131,16 @@ function initChartsNpu() {
series: []
};
+ const sortBy = (arr, k) => arr.concat().sort((a, b) => (a[k] > b[k] ? 1 : a[k] < b[k] ? -1 : 0));
$('.metric_chart').click(function (e) {
let versionName = $(this).data('version')
let myCharts = echarts.init(document.getElementById(`metric-${versionName}`))
- $.get(`${window.config.AppSubUrl}/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/metric_statistics?version_name=${versionName}&statistic_type=each`, (res) => {
+ $.get(`${window.config.AppSubUrl}/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/metric_statistics?version_name=${versionName}&statistic_type=each&metrics=`, (res) => {
let filterDta = res.MetricsInfo.filter((item) => {
return !(['recvBytesRate', 'diskWriteRate', 'sendBytesRate', 'diskReadRate'].includes(item.metric))
})
+ filterDta = sortBy(filterDta, "metric")
let legenData = filterDta.map((item) => {
return item.metric
})