| @@ -1,7 +1,6 @@ | |||
| package models | |||
| import ( | |||
| "fmt" | |||
| "strconv" | |||
| "time" | |||
| @@ -313,10 +312,6 @@ func InsertCloudbrainDurationStatistic(cloudbrainDurationStatistic *CloudbrainDu | |||
| return xStatistic.Insert(cloudbrainDurationStatistic) | |||
| } | |||
| func GetDurationStatisticByDate(date string, hour int, aiCenterCode string, accCardType string) (*CloudbrainDurationStatistic, error) { | |||
| cb := &CloudbrainDurationStatistic{DayTime: date, HourTime: hour, AiCenterCode: aiCenterCode, AccCardType: accCardType} | |||
| return getDurationStatistic(cb) | |||
| } | |||
| func getDurationStatistic(cb *CloudbrainDurationStatistic) (*CloudbrainDurationStatistic, error) { | |||
| has, err := x.Get(cb) | |||
| if err != nil { | |||
| @@ -327,26 +322,6 @@ func getDurationStatistic(cb *CloudbrainDurationStatistic) (*CloudbrainDurationS | |||
| return cb, nil | |||
| } | |||
| func DeleteCloudbrainDurationStatisticHour(date string, hour int, aiCenterCode string, accCardType string) error { | |||
| sess := xStatistic.NewSession() | |||
| defer sess.Close() | |||
| if err := sess.Begin(); err != nil { | |||
| return fmt.Errorf("Begin: %v", err) | |||
| } | |||
| if _, err := sess.Where("day_time = ? AND hour_time = ? AND ai_center_code = ? AND acc_card_type = ?", date, hour, aiCenterCode, accCardType).Delete(&CloudbrainDurationStatistic{}); err != nil { | |||
| return fmt.Errorf("Delete: %v", err) | |||
| } | |||
| if err := sess.Commit(); err != nil { | |||
| sess.Close() | |||
| return fmt.Errorf("Commit: %v", err) | |||
| } | |||
| sess.Close() | |||
| return nil | |||
| } | |||
| func GetCanUseCardInfo() ([]*ResourceQueue, error) { | |||
| sess := x.NewSession() | |||
| defer sess.Close() | |||
| @@ -402,11 +377,11 @@ func GetDurationRecordUpdateTime() ([]*CloudbrainDurationStatistic, error) { | |||
| return CloudbrainDurationStatistics, nil | |||
| } | |||
| func DeleteCloudbrainDurationStatistic() error { | |||
| func DeleteCloudbrainDurationStatistic(beginTime timeutil.TimeStamp, endTime timeutil.TimeStamp) error { | |||
| sess := xStatistic.NewSession() | |||
| defer sess.Close() | |||
| if _, err := sess.Exec("TRUNCATE TABLE cloudbrain_duration_statistic"); err != nil { | |||
| log.Info("TRUNCATE cloudbrain_duration_statistic error.") | |||
| if _, err := sess.Exec("DELETE FROM cloudbrain_duration_statistic WHERE cloudbrain_duration_statistic.date_time BETWEEN ? AND ?", beginTime, endTime); err != nil { | |||
| log.Info("DELETE cloudbrain_duration_statistic data error.") | |||
| return err | |||
| } | |||
| return nil | |||
| @@ -1279,7 +1279,7 @@ func CreateRepository(ctx DBContext, doer, u *User, repo *Repository, opts ...Cr | |||
| } | |||
| if setting.Service.AutoWatchNewRepos { | |||
| if err = watchRepo(ctx.e, doer.ID, repo.ID, true); err != nil { | |||
| if err = watchRepo(ctx.e, doer.ID, repo.ID, true, ReceiveAllNotification); err != nil { | |||
| return fmt.Errorf("watchRepo: %v", err) | |||
| } | |||
| } | |||
| @@ -24,6 +24,14 @@ const ( | |||
| RepoWatchModeAuto // 3 | |||
| ) | |||
| // NotifyType specifies what kind of watch the user has on a repository | |||
| type NotifyType int8 | |||
| const ( | |||
| RejectAllNotification NotifyType = 0 | |||
| ReceiveAllNotification NotifyType = 9 | |||
| ) | |||
| var ActionChan = make(chan *Action, 200) | |||
| var ActionChan4Task = make(chan Action, 200) | |||
| @@ -34,6 +42,7 @@ type Watch struct { | |||
| RepoID int64 `xorm:"UNIQUE(watch)"` | |||
| Mode RepoWatchMode `xorm:"SMALLINT NOT NULL DEFAULT 1"` | |||
| CreatedUnix int64 `xorm:"created"` | |||
| NotifyType NotifyType `xorm:"SMALLINT NOT NULL DEFAULT 0"` | |||
| } | |||
| // getWatch gets what kind of subscription a user has on a given repository; returns dummy record if none found | |||
| @@ -60,8 +69,20 @@ func IsWatching(userID, repoID int64) bool { | |||
| return err == nil && isWatchMode(watch.Mode) | |||
| } | |||
| // GetWatchNotifyType | |||
| func GetWatchNotifyType(userID, repoID int64) NotifyType { | |||
| watch, err := getWatch(x, userID, repoID) | |||
| if err != nil { | |||
| return RejectAllNotification | |||
| } | |||
| return watch.NotifyType | |||
| } | |||
| func watchRepoMode(e Engine, watch Watch, mode RepoWatchMode) (err error) { | |||
| if watch.Mode == mode { | |||
| if _, err := e.ID(watch.ID).Cols("notify_type").Update(watch); err != nil { | |||
| return err | |||
| } | |||
| return nil | |||
| } | |||
| if mode == RepoWatchModeAuto && (watch.Mode == RepoWatchModeDont || isWatchMode(watch.Mode)) { | |||
| @@ -109,7 +130,7 @@ func WatchRepoMode(userID, repoID int64, mode RepoWatchMode) (err error) { | |||
| return watchRepoMode(x, watch, mode) | |||
| } | |||
| func watchRepo(e Engine, userID, repoID int64, doWatch bool) (err error) { | |||
| func watchRepo(e Engine, userID, repoID int64, doWatch bool, notifyTypes ...NotifyType) (err error) { | |||
| var watch Watch | |||
| if watch, err = getWatch(e, userID, repoID); err != nil { | |||
| return err | |||
| @@ -119,14 +140,19 @@ func watchRepo(e Engine, userID, repoID int64, doWatch bool) (err error) { | |||
| } else if !doWatch { | |||
| err = watchRepoMode(e, watch, RepoWatchModeNone) | |||
| } else { | |||
| notifyType := RejectAllNotification | |||
| if len(notifyTypes) > 0 { | |||
| notifyType = notifyTypes[0] | |||
| } | |||
| watch.NotifyType = notifyType | |||
| err = watchRepoMode(e, watch, RepoWatchModeNormal) | |||
| } | |||
| return err | |||
| } | |||
| // WatchRepo watch or unwatch repository. | |||
| func WatchRepo(userID, repoID int64, watch bool) (err error) { | |||
| return watchRepo(x, userID, repoID, watch) | |||
| func WatchRepo(userID, repoID int64, watch bool, notifyType ...NotifyType) (err error) { | |||
| return watchRepo(x, userID, repoID, watch, notifyType...) | |||
| } | |||
| func getWatchers(e Engine, repoID int64) ([]*Watch, error) { | |||
| @@ -156,6 +182,7 @@ func getRepoWatchersIDs(e Engine, repoID int64) ([]int64, error) { | |||
| return ids, e.Table("watch"). | |||
| Where("watch.repo_id=?", repoID). | |||
| And("watch.mode<>?", RepoWatchModeDont). | |||
| And("watch.notify_type > ?", RejectAllNotification). | |||
| Select("user_id"). | |||
| Find(&ids) | |||
| } | |||
| @@ -474,6 +474,7 @@ func RepoAssignment() macaron.Handler { | |||
| if ctx.IsSigned { | |||
| ctx.Data["IsWatchingRepo"] = models.IsWatching(ctx.User.ID, repo.ID) | |||
| ctx.Data["WatchNotifyType"] = models.GetWatchNotifyType(ctx.User.ID, repo.ID) | |||
| ctx.Data["IsStaringRepo"] = models.IsStaring(ctx.User.ID, repo.ID) | |||
| ctx.Data["IsStaringDataset"] = models.IsDatasetStaringByRepoId(ctx.User.ID, repo.ID) | |||
| @@ -1394,6 +1394,11 @@ star = Star | |||
| fork = Fork | |||
| download_archive = Download Repository | |||
| star_fail=Failed to %s the dataset. | |||
| watched=Watched | |||
| notWatched=Not watched | |||
| un_watch=Unwatch | |||
| watch_all=Watch all | |||
| watch_no_notify=Watch but not notify | |||
| no_desc = No Description | |||
| no_label = No labels | |||
| @@ -1411,6 +1411,11 @@ star=点赞 | |||
| fork=派生 | |||
| download_archive=下载此项目 | |||
| star_fail=%s失败。 | |||
| watched=已关注 | |||
| notWatched=未关注 | |||
| un_watch=不关注 | |||
| watch_all=关注所有动态 | |||
| watch_no_notify=关注但不提醒动态 | |||
| no_desc=暂无描述 | |||
| @@ -123,8 +123,9 @@ func GetOverviewDuration(ctx *context.Context) { | |||
| recordBeginTime := recordCloudbrain[0].Cloudbrain.CreatedUnix | |||
| now := time.Now() | |||
| endTime := now | |||
| // worker_server_num := 1 | |||
| // cardNum := 1 | |||
| var workServerNumber int64 | |||
| var cardNum int64 | |||
| durationAllSum := int64(0) | |||
| cardDuSum := int64(0) | |||
| @@ -138,52 +139,60 @@ func GetOverviewDuration(ctx *context.Context) { | |||
| c2NetDuration := int64(0) | |||
| cDCenterDuration := int64(0) | |||
| cloudbrains, _, err := models.CloudbrainAllStatic(&models.CloudbrainsOptions{ | |||
| Type: models.TypeCloudBrainAll, | |||
| BeginTimeUnix: int64(recordBeginTime), | |||
| EndTimeUnix: endTime.Unix(), | |||
| }) | |||
| if err != nil { | |||
| ctx.ServerError("Get cloudbrains failed:", err) | |||
| return | |||
| } | |||
| models.LoadSpecs4CloudbrainInfo(cloudbrains) | |||
| for _, cloudbrain := range cloudbrains { | |||
| cloudbrain = cloudbrainService.UpdateCloudbrainAiCenter(cloudbrain) | |||
| CardDurationString := repo.GetCloudbrainCardDuration(cloudbrain.Cloudbrain) | |||
| CardDuration := models.ConvertStrToDuration(CardDurationString) | |||
| // if cloudbrain.Cloudbrain.WorkServerNumber >= 1 { | |||
| // worker_server_num = cloudbrain.Cloudbrain.WorkServerNumber | |||
| // } else { | |||
| // worker_server_num = 1 | |||
| // } | |||
| // if cloudbrain.Cloudbrain.Spec == nil { | |||
| // cardNum = 1 | |||
| // } else { | |||
| // cardNum = cloudbrain.Cloudbrain.Spec.AccCardsNum | |||
| // } | |||
| // duration := cloudbrain.Duration | |||
| // duration := cloudbrain.Duration | |||
| duration := models.ConvertStrToDuration(cloudbrain.TrainJobDuration) | |||
| // CardDuration := cloudbrain.Duration * int64(worker_server_num) * int64(cardNum) | |||
| if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainOne { | |||
| cloudBrainOneDuration += duration | |||
| cloudBrainOneCardDuSum += CardDuration | |||
| } else if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainTwo { | |||
| cloudBrainTwoDuration += duration | |||
| cloudBrainTwoCardDuSum += CardDuration | |||
| } else if cloudbrain.Cloudbrain.Type == models.TypeC2Net { | |||
| c2NetDuration += duration | |||
| c2NetCardDuSum += CardDuration | |||
| } else if cloudbrain.Cloudbrain.Type == models.TypeCDCenter { | |||
| cDCenterDuration += duration | |||
| cDNetCardDuSum += CardDuration | |||
| page := 1 | |||
| pagesize := 10000 | |||
| count := pagesize | |||
| // Each time a maximum of 10000 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: int64(recordBeginTime), | |||
| EndTimeUnix: endTime.Unix(), | |||
| }) | |||
| if err != nil { | |||
| ctx.ServerError("Get cloudbrains failed:", err) | |||
| return | |||
| } | |||
| models.LoadSpecs4CloudbrainInfo(cloudbrains) | |||
| for _, cloudbrain := range cloudbrains { | |||
| cloudbrain = cloudbrainService.UpdateCloudbrainAiCenter(cloudbrain) | |||
| if cloudbrain.Cloudbrain.Spec != nil { | |||
| cardNum = int64(cloudbrain.Cloudbrain.Spec.AccCardsNum) | |||
| } else { | |||
| cardNum = 1 | |||
| } | |||
| if cloudbrain.Cloudbrain.WorkServerNumber >= 1 { | |||
| workServerNumber = int64(cloudbrain.Cloudbrain.WorkServerNumber) | |||
| } else { | |||
| workServerNumber = 1 | |||
| } | |||
| duration := models.ConvertStrToDuration(cloudbrain.TrainJobDuration) | |||
| CardDuration := workServerNumber * int64(cardNum) * duration | |||
| if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainOne { | |||
| cloudBrainOneDuration += duration | |||
| cloudBrainOneCardDuSum += CardDuration | |||
| } else if cloudbrain.Cloudbrain.Type == models.TypeCloudBrainTwo { | |||
| cloudBrainTwoDuration += duration | |||
| cloudBrainTwoCardDuSum += CardDuration | |||
| } else if cloudbrain.Cloudbrain.Type == models.TypeC2Net { | |||
| c2NetDuration += duration | |||
| c2NetCardDuSum += CardDuration | |||
| } else if cloudbrain.Cloudbrain.Type == models.TypeCDCenter { | |||
| cDCenterDuration += duration | |||
| cDNetCardDuSum += CardDuration | |||
| } | |||
| durationAllSum += duration | |||
| cardDuSum += CardDuration | |||
| durationAllSum += duration | |||
| cardDuSum += CardDuration | |||
| } | |||
| count = len(cloudbrains) | |||
| page += 1 | |||
| } | |||
| ctx.JSON(http.StatusOK, map[string]interface{}{ | |||
| "cloudBrainOneCardDuSum": cloudBrainOneCardDuSum, | |||
| @@ -8,7 +8,6 @@ import ( | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/context" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/setting" | |||
| "code.gitea.io/gitea/modules/timeutil" | |||
| cloudbrainService "code.gitea.io/gitea/services/cloudbrain" | |||
| ) | |||
| @@ -16,19 +15,23 @@ import ( | |||
| func CloudbrainDurationStatisticHour() { | |||
| var statisticTime time.Time | |||
| var count int64 | |||
| recordBeginTime, _ := time.ParseInLocation("2006-01-02 15:04:05", setting.Grampus.UsageRateBeginTime, time.Local) | |||
| recordDurationUpdateTime, err := models.GetDurationRecordUpdateTime() | |||
| if err != nil { | |||
| log.Error("Can not get GetDurationRecordBeginTime", err) | |||
| return | |||
| } | |||
| if recordDurationUpdateTime == nil { | |||
| statisticTime = recordBeginTime | |||
| } else { | |||
| statisticTime = time.Unix(int64(recordDurationUpdateTime[0].DateTime), 0) | |||
| } | |||
| now := time.Now() | |||
| currentTime := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location()) | |||
| if err == nil && len(recordDurationUpdateTime) > 0 { | |||
| statisticTime = time.Unix(int64(recordDurationUpdateTime[0].DateTime), 0).Add(+1 * time.Hour) | |||
| } else { | |||
| statisticTime = currentTime | |||
| } | |||
| deleteBeginTime := time.Unix(int64(recordDurationUpdateTime[0].DateTime), 0) | |||
| err = models.DeleteCloudbrainDurationStatistic(timeutil.TimeStamp(deleteBeginTime.Unix()), timeutil.TimeStamp(currentTime.Unix())) | |||
| if err != nil { | |||
| log.Error("DeleteCloudbrainDurationStatistic failed", err) | |||
| } | |||
| for statisticTime.Before(currentTime) || statisticTime.Equal(currentTime) { | |||
| countEach := summaryDurationStat(statisticTime) | |||
| @@ -37,13 +40,10 @@ func CloudbrainDurationStatisticHour() { | |||
| } | |||
| log.Info("summaryDurationStat count: %v", count) | |||
| } | |||
| func UpdateDurationStatisticHistoryData() int64 { | |||
| func UpdateDurationStatisticHistoryData(beginTime time.Time, endTime time.Time) int64 { | |||
| var count int64 | |||
| recordBeginTime, _ := time.ParseInLocation("2006-01-02 15:04:05", setting.Grampus.UsageRateBeginTime, time.Local) | |||
| now := time.Now() | |||
| currentTime := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location()) | |||
| statisticTime := recordBeginTime.Add(+1 * time.Hour) | |||
| statisticTime := beginTime | |||
| currentTime := endTime | |||
| for statisticTime.Before(currentTime) || statisticTime.Equal(currentTime) { | |||
| countEach := summaryDurationStat(statisticTime) | |||
| count += countEach | |||
| @@ -107,13 +107,6 @@ func summaryDurationStat(statisticTime time.Time) int64 { | |||
| for cardType, cardDuration := range CardTypes { | |||
| cloudbrainTable := cloudbrainMap[centerCode+"/"+cardType] | |||
| if cloudbrainTable != nil { | |||
| if _, err := models.GetDurationStatisticByDate(dayTime, hourTime, centerCode, cardType); err == nil { | |||
| if err := models.DeleteCloudbrainDurationStatisticHour(dayTime, hourTime, centerCode, cardType); err != nil { | |||
| log.Error("DeleteCloudbrainDurationStatisticHour failed: %v", err.Error()) | |||
| return 0 | |||
| } | |||
| } | |||
| if _, ok := cardsTotalDurationMap[cloudbrainTable.Cluster+"/"+centerCode+"/"+cardType]; !ok { | |||
| cardsTotalDurationMap[cloudbrainTable.Cluster+"/"+centerCode+"/"+cardType] = 0 | |||
| } | |||
| @@ -139,12 +132,6 @@ func summaryDurationStat(statisticTime time.Time) int64 { | |||
| } | |||
| for key, cardsTotalDuration := range cardsTotalDurationMap { | |||
| if _, err := models.GetDurationStatisticByDate(dayTime, hourTime, strings.Split(key, "/")[1], strings.Split(key, "/")[2]); err == nil { | |||
| if err := models.DeleteCloudbrainDurationStatisticHour(dayTime, hourTime, strings.Split(key, "/")[1], strings.Split(key, "/")[2]); err != nil { | |||
| log.Error("DeleteCloudbrainDurationStatisticHour failed: %v", err.Error()) | |||
| return 0 | |||
| } | |||
| } | |||
| cloudbrainDurationStat := models.CloudbrainDurationStatistic{ | |||
| DateTime: dateTime, | |||
| DayTime: dayTime, | |||
| @@ -257,8 +244,22 @@ func getcloudBrainCenterCodeAndCardTypeInfo(ciTasks []*models.CloudbrainInfo, be | |||
| } | |||
| func CloudbrainUpdateHistoryData(ctx *context.Context) { | |||
| err := models.DeleteCloudbrainDurationStatistic() | |||
| count := UpdateDurationStatisticHistoryData() | |||
| beginTimeStr := ctx.QueryTrim("beginTime") | |||
| endTimeStr := ctx.QueryTrim("endTime") | |||
| var count int64 | |||
| var err error | |||
| if beginTimeStr != "" && endTimeStr != "" { | |||
| beginTime, _ := time.ParseInLocation("2006-01-02 15:04:05", beginTimeStr, time.Local) | |||
| endTime, _ := time.ParseInLocation("2006-01-02 15:04:05", endTimeStr, time.Local) | |||
| if time.Now().Before(endTime) { | |||
| endTime = time.Now() | |||
| } | |||
| beginTimeUnix := timeutil.TimeStamp(beginTime.Unix()) | |||
| endTimeUnix := timeutil.TimeStamp(endTime.Unix()) | |||
| err = models.DeleteCloudbrainDurationStatistic(beginTimeUnix, endTimeUnix) | |||
| count = UpdateDurationStatisticHistoryData(beginTime.Add(+1*time.Hour), endTime) | |||
| } | |||
| ctx.JSON(http.StatusOK, map[string]interface{}{ | |||
| "message": 0, | |||
| "count": count, | |||
| @@ -1522,11 +1522,8 @@ func GrampusNotebookDebug(ctx *context.Context) { | |||
| return | |||
| } | |||
| if len(result.JobInfo.Tasks) > 0 { | |||
| if ctx.Cloudbrain.ComputeResource == models.NPUResource { | |||
| ctx.Redirect(result.JobInfo.Tasks[0].Url + "?token=" + result.JobInfo.Tasks[0].Token) | |||
| } else { | |||
| ctx.Redirect("http://192.168.203.154/" + result.JobInfo.Tasks[0].Url + "?token=" + result.JobInfo.Tasks[0].Token) | |||
| } | |||
| ctx.Redirect(result.JobInfo.Tasks[0].Url + "?token=" + result.JobInfo.Tasks[0].Token) | |||
| return | |||
| } | |||
| ctx.NotFound("Can not find the job.", nil) | |||
| @@ -414,7 +414,9 @@ func Action(ctx *context.Context) { | |||
| var err error | |||
| switch ctx.Params(":action") { | |||
| case "watch": | |||
| err = models.WatchRepo(ctx.User.ID, ctx.Repo.Repository.ID, true) | |||
| err = models.WatchRepo(ctx.User.ID, ctx.Repo.Repository.ID, true, models.ReceiveAllNotification) | |||
| case "watch_but_reject": | |||
| err = models.WatchRepo(ctx.User.ID, ctx.Repo.Repository.ID, true, models.RejectAllNotification) | |||
| case "unwatch": | |||
| err = models.WatchRepo(ctx.User.ID, ctx.Repo.Repository.ID, false) | |||
| case "star": | |||
| @@ -167,7 +167,7 @@ | |||
| </tr> | |||
| <tr class="ti-no-ng-animate"> | |||
| <td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||
| 创建人 | |||
| {{$.i18n.Tr "repo.cloudbrain_creator"}} | |||
| </td> | |||
| <td class="ti-text-form-content"> | |||
| @@ -249,6 +249,7 @@ | |||
| <td class="ti-text-form-content"> | |||
| <div class="text-span text-span-w"> | |||
| {{.BranchName}} | |||
| <span style="margin-left:1rem" class="ui label">{{SubStr .CommitID 0 10}}</span> | |||
| </div> | |||
| </td> | |||
| </tr> | |||
| @@ -133,6 +133,7 @@ | |||
| <td class="ti-text-form-content"> | |||
| <div class="text-span text-span-w" id="{{.VersionName}}-code"> | |||
| {{.BranchName}} | |||
| <span style="margin-left:1rem" class="ui label">{{SubStr .CommitID 0 10}}</span> | |||
| </div> | |||
| </td> | |||
| </tr> | |||
| @@ -215,6 +215,7 @@ | |||
| <td class="ti-text-form-content"> | |||
| <div class="text-span text-span-w"> | |||
| {{.BranchName}} | |||
| <span style="margin-left:1rem" class="ui label">{{SubStr .CommitID 0 10}}</span> | |||
| </div> | |||
| </td> | |||
| </tr> | |||
| @@ -233,6 +233,7 @@ | |||
| <td class="ti-text-form-content"> | |||
| <div class="text-span text-span-w"> | |||
| {{.BranchName}} | |||
| <span style="margin-left:1rem" class="ui label">{{SubStr .CommitID 0 10}}</span> | |||
| </div> | |||
| </td> | |||
| </tr> | |||
| @@ -51,6 +51,49 @@ | |||
| </div> | |||
| {{if not .IsBeingCreated}} | |||
| <div class="repo-buttons"> | |||
| <div class="ui labeled button" tabindex="0"> | |||
| <div class="ui compact basic button" onclick="$('.__watch_btn__').dropdown('show')"> | |||
| <i class="icon fa-eye{{if not $.IsWatchingRepo}}-slash{{end}}"></i>{{if $.IsWatchingRepo}}{{$.i18n.Tr "repo.watched"}}{{else}}{{$.i18n.Tr "repo.notWatched"}}{{end}} | |||
| <i class="dropdown icon" style="margin:0 -8px 0 4px"></i> | |||
| <div class="ui dropdown floating __watch_btn__" onclick="event.stopPropagation();"> | |||
| <div class="text" style="display:none;"></div> | |||
| {{$WatchNotifyType := or $.WatchNotifyType 0}} | |||
| <div class="menu" style="margin-left:-64px;"> | |||
| <div class="item {{if not $.IsWatchingRepo}}active selected{{end}}"> | |||
| <form method="post" style="margin: 0;" action="{{$.RepoLink}}/action/unwatch?redirect_to={{$.Link}}"> | |||
| {{$.CsrfTokenHtml}} | |||
| <button type="submit" style="border:none;background:transparent;width:100%;text-align:left;font-weight:inherit;cursor:pointer;"> | |||
| <i class="check icon" style="{{if $.IsWatchingRepo}}opacity:0{{end}}"></i> | |||
| {{$.i18n.Tr "repo.un_watch"}} | |||
| </button> | |||
| </form> | |||
| </div> | |||
| <div class="item {{if and $.IsWatchingRepo (eq $WatchNotifyType 9)}}active selected{{end}}"> | |||
| <form method="post" style="margin: 0;" action="{{$.RepoLink}}/action/watch?redirect_to={{$.Link}}"> | |||
| {{$.CsrfTokenHtml}} | |||
| <button type="submit" style="border:none;background:transparent;width:100%;text-align:left;font-weight:inherit;cursor:pointer;"> | |||
| <i class="check icon" style="{{if not (and $.IsWatchingRepo (eq $WatchNotifyType 9))}}opacity:0{{end}}"></i> | |||
| {{$.i18n.Tr "repo.watch_all"}} | |||
| </button> | |||
| </form> | |||
| </div> | |||
| <div class="item {{if and $.IsWatchingRepo (eq $WatchNotifyType 0)}}active selected{{end}}"> | |||
| <form method="post" style="margin: 0;" action="{{$.RepoLink}}/action/watch_but_reject?redirect_to={{$.Link}}"> | |||
| {{$.CsrfTokenHtml}} | |||
| <button type="submit" style="border:none;background:transparent;width:100%;text-align:left;font-weight:inherit;cursor:pointer;"> | |||
| <i class="check icon" style="{{if not (and $.IsWatchingRepo (eq $WatchNotifyType 0))}}opacity:0{{end}}"></i> | |||
| {{$.i18n.Tr "repo.watch_no_notify"}} | |||
| </button> | |||
| </form> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| <a class="ui basic label" href="{{.Link}}/watchers"> | |||
| {{.NumWatches}} | |||
| </a> | |||
| </div> | |||
| <!-- | |||
| <form method="post" style="margin: 0;" action="{{$.RepoLink}}/action/{{if $.IsWatchingRepo}}un{{end}}watch?redirect_to={{$.Link}}"> | |||
| {{$.CsrfTokenHtml}} | |||
| <div class="ui labeled button" tabindex="0"> | |||
| @@ -61,7 +104,7 @@ | |||
| {{.NumWatches}} | |||
| </a> | |||
| </div> | |||
| </form> | |||
| </form> --> | |||
| <form method="post" style="margin: 0;" action="{{$.RepoLink}}/action/{{if $.IsStaringRepo}}un{{end}}star?redirect_to={{$.Link}}"> | |||
| {{$.CsrfTokenHtml}} | |||
| <div class="ui labeled button" tabindex="0"> | |||
| @@ -233,6 +233,7 @@ | |||
| <td class="ti-text-form-content"> | |||
| <div class="text-span text-span-w"> | |||
| {{.BranchName}} | |||
| <span style="margin-left:1rem" class="ui label">{{SubStr .CommitID 0 10}}</span> | |||
| </div> | |||
| </td> | |||
| </tr> | |||
| @@ -247,6 +247,7 @@ | |||
| <td class="ti-text-form-content"> | |||
| <div class="text-span text-span-w"> | |||
| {{.BranchName}} | |||
| <span style="margin-left:1rem" class="ui label">{{SubStr .CommitID 0 10}}</span> | |||
| </div> | |||
| </td> | |||
| </tr> | |||
| @@ -637,6 +637,7 @@ | |||
| $(`[vfield="Description"]`).text(res['Description'] || '--'); | |||
| $(`[vfield="Parameters"]`).text(res['Parameters'] || '--'); | |||
| $(`[vfield="BranchName"]`).html(res['BranchName'] + '<span style="margin-left:1rem" class="ui label">' + res['CommitID'].slice(0, 10) + '</span>'); | |||
| var imageName = res['Image'] || res['EngineName']; | |||
| $(`[vimagetitle="Image"] span`).hide(); | |||
| @@ -200,7 +200,7 @@ const en = { | |||
| local: 'Local', | |||
| online: 'Online', | |||
| createModel: 'Create Model', | |||
| importLocalModel: 'Import Lacal Model', | |||
| importLocalModel: 'Import Local Model', | |||
| importOnlineModel: 'Import Online Model', | |||
| modifyModelInfo: 'Modify model information', | |||
| addModelFiles: 'Add model files', | |||