diff --git a/models/ai_model_manage.go b/models/ai_model_manage.go index 58c23fb47..f39a67a61 100644 --- a/models/ai_model_manage.go +++ b/models/ai_model_manage.go @@ -33,6 +33,7 @@ type AiModelManage struct { CodeBranch string `xorm:"varchar(400) NULL" json:"codeBranch"` CodeCommitID string `xorm:"NULL" json:"codeCommitID"` UserId int64 `xorm:"NOT NULL" json:"userId"` + IsPrivate bool `xorm:"DEFAULT true" json:"isPrivate"` UserName string `json:"userName"` UserRelAvatarLink string `json:"userRelAvatarLink"` TrainTaskInfo string `xorm:"text NULL" json:"trainTaskInfo"` @@ -40,6 +41,7 @@ type AiModelManage struct { UpdatedUnix timeutil.TimeStamp `xorm:"updated" json:"updatedUnix"` IsCanOper bool `json:"isCanOper"` IsCanDelete bool `json:"isCanDelete"` + IsCanDownload bool `json:"isCanDownload"` } type AiModelConvert struct { @@ -84,8 +86,10 @@ type AiModelQueryOptions struct { SortType string New int // JobStatus CloudbrainStatus - Type int - Status int + Type int + Status int + IsOnlyThisRepo bool + IsQueryPrivate bool } func (a *AiModelConvert) IsGpuTrainTask() bool { @@ -288,15 +292,30 @@ func ModifyModelDescription(id string, description string) error { return nil } -func ModifyLocalModel(id string, name, label, description string, engine int) error { +func ModifyModelPrivate(id string, isPrivate bool) error { var sess *xorm.Session sess = x.ID(id) defer sess.Close() - re, err := sess.Cols("name", "label", "description", "engine").Update(&AiModelManage{ + re, err := sess.Cols("is_private").Update(&AiModelManage{ + IsPrivate: isPrivate, + }) + if err != nil { + return err + } + log.Info("success to update isPrivate from db.re=" + fmt.Sprint((re))) + return nil +} + +func ModifyLocalModel(id string, name, label, description string, engine int, isPrivate bool) error { + var sess *xorm.Session + sess = x.ID(id) + defer sess.Close() + re, err := sess.Cols("name", "label", "description", "engine", "is_private").Update(&AiModelManage{ Description: description, Name: name, Label: label, Engine: int64(engine), + IsPrivate: isPrivate, }) if err != nil { return err @@ -423,7 +442,11 @@ func QueryModel(opts *AiModelQueryOptions) ([]*AiModelManage, int64, error) { builder.Eq{"ai_model_manage.status": opts.Status}, ) } - + if !opts.IsQueryPrivate { + cond = cond.And( + builder.Eq{"ai_model_manage.is_private": false}, + ) + } count, err := sess.Where(cond).Count(new(AiModelManage)) if err != nil { return nil, 0, fmt.Errorf("Count: %v", err) diff --git a/models/user_analysis_for_activity.go b/models/user_analysis_for_activity.go index 2066697d2..99ff990ce 100644 --- a/models/user_analysis_for_activity.go +++ b/models/user_analysis_for_activity.go @@ -449,3 +449,20 @@ func QueryUserLoginInfo(userIds []int64) []*UserLoginLog { return loginList } + +func QueryUserAnnualReport(userId int64) *UserSummaryCurrentYear { + statictisSess := xStatistic.NewSession() + defer statictisSess.Close() + log.Info("userId=" + fmt.Sprint(userId)) + + reList := make([]*UserSummaryCurrentYear, 0) + err := statictisSess.Select("*").Table(new(UserSummaryCurrentYear)).Where("id=" + fmt.Sprint(userId)).Find(&reList) + if err == nil { + if len(reList) > 0 { + return reList[0] + } + } else { + log.Info("error:=" + err.Error()) + } + return nil +} diff --git a/models/user_business_analysis.go b/models/user_business_analysis.go index 394c24825..ca1eb4c7b 100644 --- a/models/user_business_analysis.go +++ b/models/user_business_analysis.go @@ -132,11 +132,17 @@ func makeResultForMonth(allUserInfo []*UserMetrics, count int) []*UserMetrics { if count > 0 { for _, userMetrics := range allUserInfo { dateTime := time.Unix(userMetrics.CountDate, 0) - month := fmt.Sprint(dateTime.Year()) + "-" + fmt.Sprint(int(dateTime.Month())) + mInt := int(dateTime.Month()) + mString := fmt.Sprint(mInt) + if mInt < 10 { + mString = "0" + mString + } + month := fmt.Sprint(dateTime.Year()) + "-" + mString if _, ok := monthMap[month]; !ok { monthUserMetrics := &UserMetrics{ DisplayDate: month, ActivateRegistUser: userMetrics.ActivateRegistUser, + RegistActivityUser: userMetrics.RegistActivityUser, NotActivateRegistUser: userMetrics.NotActivateRegistUser, TotalUser: userMetrics.TotalUser, TotalNotActivateRegistUser: userMetrics.TotalUser - userMetrics.TotalActivateRegistUser, @@ -152,6 +158,7 @@ func makeResultForMonth(allUserInfo []*UserMetrics, count int) []*UserMetrics { value.ActivateRegistUser += userMetrics.ActivateRegistUser value.NotActivateRegistUser += userMetrics.NotActivateRegistUser value.HasActivityUser += userMetrics.HasActivityUser + value.RegistActivityUser += userMetrics.RegistActivityUser value.TotalRegistUser += userMetrics.ActivateRegistUser + userMetrics.NotActivateRegistUser value.ActivateIndex = float64(value.ActivateRegistUser) / float64(value.TotalRegistUser) value.DaysForMonth += 1 @@ -610,7 +617,7 @@ func refreshUserStaticTable(wikiCountMap map[string]int, tableName string, pageS DataDate := currentTimeNow.Format("2006-01-02") + " 00:01" bonusMap := make(map[string]map[string]int) - if tableName == "user_business_analysis_current_year" { + if isUserYearData(tableName) { bonusMap = getBonusMap() log.Info("truncate all data from table:user_summary_current_year ") statictisSess.Exec("TRUNCATE TABLE user_summary_current_year") @@ -712,7 +719,7 @@ func refreshUserStaticTable(wikiCountMap map[string]int, tableName string, pageS userMetrics["TotalHasActivityUser"] = getMapKeyStringValue("TotalHasActivityUser", userMetrics) + 1 } } - if tableName == "user_business_analysis_current_year" { + if isUserYearData(tableName) { //年度数据 subTime := time.Now().UTC().Sub(dateRecordAll.RegistDate.AsTime().UTC()) mostActiveDay := "" @@ -772,6 +779,16 @@ func refreshUserStaticTable(wikiCountMap map[string]int, tableName string, pageS log.Info("refresh data finished.tableName=" + tableName + " total record:" + fmt.Sprint(insertCount)) } +func isUserYearData(tableName string) bool { + if tableName == "user_business_analysis_current_year" { + currentTimeNow := time.Now() + if currentTimeNow.Year() >= 2023 { + return false + } + } + return true +} + func getBonusMap() map[string]map[string]int { bonusMap := make(map[string]map[string]int) url := setting.RecommentRepoAddr + "bonus/record.txt" diff --git a/models/user_invitation.go b/models/user_invitation.go index 2d37bcb23..8a10e71a0 100644 --- a/models/user_invitation.go +++ b/models/user_invitation.go @@ -13,6 +13,7 @@ type Invitation struct { SrcUserID int64 `xorm:"NOT NULL DEFAULT 0"` UserID int64 `xorm:"NOT NULL DEFAULT 0"` Phone string `xorm:"INDEX"` + Email string `xorm:"-"` Avatar string `xorm:"-"` Name string `xorm:"-"` InvitationUserNum int `xorm:"-"` diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index aa6df19de..32510b266 100755 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1306,6 +1306,11 @@ model.manage.select.engine=Select model engine model.manage.modelfile=Model file model.manage.modellabel=Model label model.manage.modeldesc=Model description +model.manage.modelaccess=Model Access +model.manage.modelaccess.public=Public +model.manage.modelaccess.private=Private +model.manage.modelaccess.setpublic=Set Public +model.manage.modelaccess.setprivate=Set Private model.manage.baseinfo=Base Information modelconvert.notcreate=No model conversion task has been created. modelconvert.importfirst1=Please import the diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 319695119..2ad30ca38 100755 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -1319,6 +1319,11 @@ model.manage.select.engine=选择模型框架 model.manage.modelfile=模型文件 model.manage.modellabel=模型标签 model.manage.modeldesc=模型描述 +model.manage.modelaccess=模型权限 +model.manage.modelaccess.public=公开 +model.manage.modelaccess.private=私有 +model.manage.modelaccess.setpublic=设为公开 +model.manage.modelaccess.setprivate=设为私有 model.manage.baseinfo=基本信息 modelconvert.notcreate=未创建过模型转换任务 modelconvert.importfirst1=请您先导入 diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index ea4974c54..2ff279b91 100755 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -610,6 +610,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Get("/query_invitation_yesterday", operationReq, repo_ext.QueryInvitationYesterday) m.Get("/query_invitation_all", operationReq, repo_ext.QueryInvitationAll) m.Get("/query_invitation_userdefine", operationReq, repo_ext.QueryUserDefineInvitationPage) + m.Get("/query_user_annual_report", repo_ext.QueryUserAnnualReport) m.Get("/download_invitation_detail", operationReq, repo_ext.DownloadInvitationDetail) diff --git a/routers/api/v1/repo/modelmanage.go b/routers/api/v1/repo/modelmanage.go index 15260790d..3989ec56c 100644 --- a/routers/api/v1/repo/modelmanage.go +++ b/routers/api/v1/repo/modelmanage.go @@ -45,6 +45,7 @@ func QueryModelById(ctx *context.APIContext) { func QueryModelListForPredict(ctx *context.APIContext) { log.Info("QueryModelListForPredict by api.") + ctx.Context.SetParams("isOnlyThisRepo", "true") routerRepo.QueryModelListForPredict(ctx.Context) } diff --git a/routers/repo/ai_model_convert.go b/routers/repo/ai_model_convert.go index 4ba414bff..dda410def 100644 --- a/routers/repo/ai_model_convert.go +++ b/routers/repo/ai_model_convert.go @@ -620,7 +620,7 @@ func ShowModelConvertInfo(ctx *context.Context) { return } ctx.Data["Name"] = job.Name - ctx.Data["canDownload"] = isOper(ctx, job.UserId) + ctx.Data["canDownload"] = isOperModifyOrDelete(ctx, job.UserId) user, err := models.GetUserByID(job.UserId) if err == nil { job.UserName = user.Name @@ -755,7 +755,7 @@ func GetModelConvertPageData(ctx *context.Context) ([]*models.AiModelConvert, in } userIds := make([]int64, len(modelResult)) for i, model := range modelResult { - model.IsCanOper = isOper(ctx, model.UserId) + model.IsCanOper = isOperModifyOrDelete(ctx, model.UserId) model.IsCanDelete = isCanDelete(ctx, model.UserId) userIds[i] = model.UserId } diff --git a/routers/repo/ai_model_manage.go b/routers/repo/ai_model_manage.go index eb25bd8c2..ecb9edd2d 100644 --- a/routers/repo/ai_model_manage.go +++ b/routers/repo/ai_model_manage.go @@ -93,7 +93,7 @@ func saveModelByParameters(jobId string, versionName string, name string, versio log.Info("accuracyJson=" + string(accuracyJson)) aiTask.ContainerIp = "" aiTaskJson, _ := json.Marshal(aiTask) - + isPrivate := ctx.QueryBool("isPrivate") model := &models.AiModelManage{ ID: id, Version: version, @@ -114,6 +114,7 @@ func saveModelByParameters(jobId string, versionName string, name string, versio TrainTaskInfo: string(aiTaskJson), Accuracy: string(accuracyJson), Status: STATUS_COPY_MODEL, + IsPrivate: isPrivate, } err = models.SaveModelToDb(model) @@ -216,6 +217,7 @@ func SaveLocalModel(ctx *context.Context) { description := ctx.Query("description") engine := ctx.QueryInt("engine") taskType := ctx.QueryInt("type") + isPrivate := ctx.QueryBool("isPrivate") modelActualPath := "" if taskType == models.TypeCloudBrainOne { destKeyNamePrefix := Model_prefix + models.AttachmentRelativePath(id) + "/" @@ -262,6 +264,7 @@ func SaveLocalModel(ctx *context.Context) { TrainTaskInfo: "", Accuracy: "", Status: STATUS_FINISHED, + IsPrivate: isPrivate, } err := models.SaveModelToDb(model) @@ -554,20 +557,6 @@ func deleteModelByID(ctx *context.Context, id string) error { return err } -func QueryModelByParameters(repoId int64, page int) ([]*models.AiModelManage, int64, error) { - - return models.QueryModel(&models.AiModelQueryOptions{ - ListOptions: models.ListOptions{ - Page: page, - PageSize: setting.UI.IssuePagingNum, - }, - RepoID: repoId, - Type: -1, - New: MODEL_LATEST, - Status: -1, - }) -} - func DownloadMultiModelFile(ctx *context.Context) { log.Info("DownloadMultiModelFile start.") id := ctx.Query("id") @@ -578,7 +567,7 @@ func DownloadMultiModelFile(ctx *context.Context) { ctx.ServerError("no such model:", err) return } - if !isOper(ctx, task.UserId) { + if !isCanDownload(ctx, task) { ctx.NotFound(ctx.Req.URL.RequestURI(), nil) return } @@ -806,7 +795,7 @@ func DownloadSingleModelFile(ctx *context.Context) { ctx.ServerError("no such model:", err) return } - if !isOper(ctx, task.UserId) { + if !isCanDownload(ctx, task) { ctx.NotFound(ctx.Req.URL.RequestURI(), nil) return } @@ -874,8 +863,9 @@ func QueryModelById(ctx *context.Context) { id := ctx.Query("id") model, err := models.QueryModelById(id) if err == nil { - model.IsCanOper = isOper(ctx, model.UserId) + model.IsCanOper = isOperModifyOrDelete(ctx, model.UserId) model.IsCanDelete = isCanDelete(ctx, model.UserId) + model.IsCanDownload = isCanDownload(ctx, model) removeIpInfo(model) ctx.JSON(http.StatusOK, model) } else { @@ -891,7 +881,8 @@ func ShowSingleModel(ctx *context.Context) { userIds := make([]int64, len(models)) for i, model := range models { - model.IsCanOper = isOper(ctx, model.UserId) + model.IsCanOper = isOperModifyOrDelete(ctx, model.UserId) + model.IsCanDownload = isCanDownload(ctx, model) model.IsCanDelete = isCanDelete(ctx, model.UserId) userIds[i] = model.UserId } @@ -941,7 +932,8 @@ func ShowOneVersionOtherModel(ctx *context.Context) { userIds := make([]int64, len(aimodels)) for i, model := range aimodels { - model.IsCanOper = isOper(ctx, model.UserId) + model.IsCanOper = isOperModifyOrDelete(ctx, model.UserId) + model.IsCanDownload = isCanDownload(ctx, model) model.IsCanDelete = isCanDelete(ctx, model.UserId) userIds[i] = model.UserId } @@ -964,6 +956,7 @@ func ShowOneVersionOtherModel(ctx *context.Context) { } func SetModelCount(ctx *context.Context) { + isQueryPrivate := isQueryPrivateModel(ctx) repoId := ctx.Repo.Repository.ID Type := -1 _, count, _ := models.QueryModel(&models.AiModelQueryOptions{ @@ -971,10 +964,12 @@ func SetModelCount(ctx *context.Context) { Page: 1, PageSize: 2, }, - RepoID: repoId, - Type: Type, - New: MODEL_LATEST, - Status: -1, + RepoID: repoId, + Type: Type, + New: MODEL_LATEST, + IsOnlyThisRepo: true, + Status: -1, + IsQueryPrivate: isQueryPrivate, }) ctx.Data["MODEL_COUNT"] = count } @@ -1001,27 +996,87 @@ func isQueryRight(ctx *context.Context) bool { } } +func isCanDownload(ctx *context.Context, task *models.AiModelManage) bool { + if ctx.User == nil { + return false + } + isCollaborator, err := ctx.Repo.Repository.IsCollaborator(ctx.User.ID) + if err != nil { + log.Info("query error.") + } + isTeamMember, err := ctx.Repo.Repository.IsInRepoTeam(ctx.User.ID) + if err != nil { + log.Info("query IsInRepoTeam error." + err.Error()) + } + if ctx.User.IsAdmin || ctx.User.ID == task.UserId || isCollaborator || isTeamMember { + return true + } + if ctx.Repo.IsOwner() { + return true + } + if !task.IsPrivate { + return true + } + return false +} + +func isQueryPrivateModel(ctx *context.Context) bool { + if ctx.User == nil { + return false + } + isCollaborator, err := ctx.Repo.Repository.IsCollaborator(ctx.User.ID) + if err != nil { + log.Info("query IsCollaborator error." + err.Error()) + } + isTeamMember, err := ctx.Repo.Repository.IsInRepoTeam(ctx.User.ID) + if err != nil { + log.Info("query IsInRepoTeam error." + err.Error()) + } + if ctx.User.IsAdmin || isCollaborator || isTeamMember { + return true + } + if ctx.Repo.IsOwner() { + return true + } + return false +} + func isCanDelete(ctx *context.Context, modelUserId int64) bool { if ctx.User == nil { return false } - if ctx.User.IsAdmin || ctx.User.ID == modelUserId { + if ctx.User.ID == modelUserId { + return true + } + return isAdminRight(ctx) +} + +func isAdminRight(ctx *context.Context) bool { + if ctx.User.IsAdmin { return true } if ctx.Repo.IsOwner() { return true } + permission, err := models.GetUserRepoPermission(ctx.Repo.Repository, ctx.User) + if err != nil { + log.Error("GetUserRepoPermission failed:%v", err.Error()) + return false + } + if permission.AccessMode >= models.AccessModeAdmin { + return true + } return false } -func isOper(ctx *context.Context, modelUserId int64) bool { +func isOperModifyOrDelete(ctx *context.Context, modelUserId int64) bool { if ctx.User == nil { return false } if ctx.User.IsAdmin || ctx.User.ID == modelUserId { return true } - return false + return isAdminRight(ctx) } func ShowModelPageInfo(ctx *context.Context) { @@ -1038,6 +1093,7 @@ func ShowModelPageInfo(ctx *context.Context) { if pageSize <= 0 { pageSize = setting.UI.IssuePagingNum } + isQueryPrivate := isQueryPrivateModel(ctx) repoId := ctx.Repo.Repository.ID Type := -1 modelResult, count, err := models.QueryModel(&models.AiModelQueryOptions{ @@ -1045,10 +1101,12 @@ func ShowModelPageInfo(ctx *context.Context) { Page: page, PageSize: pageSize, }, - RepoID: repoId, - Type: Type, - New: MODEL_LATEST, - Status: -1, + RepoID: repoId, + Type: Type, + New: MODEL_LATEST, + IsOnlyThisRepo: true, + Status: -1, + IsQueryPrivate: isQueryPrivate, }) if err != nil { ctx.ServerError("Cloudbrain", err) @@ -1057,8 +1115,9 @@ func ShowModelPageInfo(ctx *context.Context) { userIds := make([]int64, len(modelResult)) for i, model := range modelResult { - model.IsCanOper = isOper(ctx, model.UserId) + model.IsCanOper = isOperModifyOrDelete(ctx, model.UserId) model.IsCanDelete = isCanDelete(ctx, model.UserId) + model.IsCanDownload = isCanDownload(ctx, model) userIds[i] = model.UserId } @@ -1089,6 +1148,37 @@ func ModifyModel(id string, description string) error { return err } +func ModifyModelPrivate(ctx *context.Context) { + id := ctx.Query("id") + isPrivate := ctx.QueryBool("isPrivate") + re := map[string]string{ + "code": "-1", + } + task, err := models.QueryModelById(id) + if err != nil || task == nil { + re["msg"] = err.Error() + log.Error("no such model!", err.Error()) + ctx.JSON(200, re) + return + } + if !isOperModifyOrDelete(ctx, task.UserId) { + re["msg"] = "No right to operation." + ctx.JSON(200, re) + return + } + err = models.ModifyModelPrivate(id, isPrivate) + if err == nil { + re["code"] = "0" + ctx.JSON(200, re) + log.Info("modify success.") + } else { + re["msg"] = err.Error() + ctx.JSON(200, re) + log.Info("Failed to modify.id=" + id + " isprivate=" + fmt.Sprint(isPrivate) + " error:" + err.Error()) + } + +} + func ModifyModelInfo(ctx *context.Context) { log.Info("modify model start.") id := ctx.Query("id") @@ -1102,7 +1192,7 @@ func ModifyModelInfo(ctx *context.Context) { ctx.JSON(200, re) return } - if !isOper(ctx, task.UserId) { + if !isOperModifyOrDelete(ctx, task.UserId) { re["msg"] = "No right to operation." ctx.JSON(200, re) return @@ -1112,6 +1202,7 @@ func ModifyModelInfo(ctx *context.Context) { label := ctx.Query("label") description := ctx.Query("description") engine := ctx.QueryInt("engine") + isPrivate := ctx.QueryBool("isPrivate") aimodels := models.QueryModelByName(name, task.RepoId) if aimodels != nil && len(aimodels) > 0 { if len(aimodels) == 1 { @@ -1126,14 +1217,14 @@ func ModifyModelInfo(ctx *context.Context) { return } } - err = models.ModifyLocalModel(id, name, label, description, engine) + err = models.ModifyLocalModel(id, name, label, description, engine, isPrivate) } else { label := ctx.Query("label") description := ctx.Query("description") engine := task.Engine name := task.Name - err = models.ModifyLocalModel(id, name, label, description, int(engine)) + err = models.ModifyLocalModel(id, name, label, description, int(engine), task.IsPrivate) } if err != nil { @@ -1148,15 +1239,27 @@ func ModifyModelInfo(ctx *context.Context) { func QueryModelListForPredict(ctx *context.Context) { repoId := ctx.Repo.Repository.ID + page := ctx.QueryInt("page") + if page <= 0 { + page = -1 + } + pageSize := ctx.QueryInt("pageSize") + if pageSize <= 0 { + pageSize = -1 + } + isQueryPrivate := isQueryPrivateModel(ctx) + //IsOnlyThisRepo := ctx.QueryBool("isOnlyThisRepo") modelResult, count, err := models.QueryModel(&models.AiModelQueryOptions{ ListOptions: models.ListOptions{ - Page: -1, - PageSize: -1, + Page: page, + PageSize: pageSize, }, - RepoID: repoId, - Type: ctx.QueryInt("type"), - New: -1, - Status: 0, + RepoID: repoId, + Type: ctx.QueryInt("type"), + New: -1, + Status: 0, + IsOnlyThisRepo: true, + IsQueryPrivate: isQueryPrivate, }) if err != nil { ctx.ServerError("Cloudbrain", err) @@ -1168,7 +1271,9 @@ func QueryModelListForPredict(ctx *context.Context) { nameMap := make(map[string][]*models.AiModelManage) for _, model := range modelResult { - removeIpInfo(model) + model.TrainTaskInfo = "" + model.Accuracy = "" + //removeIpInfo(model) if _, value := nameMap[model.Name]; !value { models := make([]*models.AiModelManage, 0) models = append(models, model) diff --git a/routers/repo/modelarts.go b/routers/repo/modelarts.go index 828590564..8ae3528f2 100755 --- a/routers/repo/modelarts.go +++ b/routers/repo/modelarts.go @@ -2405,7 +2405,7 @@ func InferenceJobIndex(ctx *context.Context) { tasks[i].ComputeResource = models.NPUResource } } - + isQueryPrivate := isQueryPrivateModel(ctx) repoId := ctx.Repo.Repository.ID Type := -1 _, model_count, _ := models.QueryModel(&models.AiModelQueryOptions{ @@ -2413,10 +2413,12 @@ func InferenceJobIndex(ctx *context.Context) { Page: 1, PageSize: 2, }, - RepoID: repoId, - Type: Type, - New: MODEL_LATEST, - Status: 0, + RepoID: repoId, + Type: Type, + New: MODEL_LATEST, + IsOnlyThisRepo: true, + Status: 0, + IsQueryPrivate: isQueryPrivate, }) ctx.Data["MODEL_COUNT"] = model_count @@ -2485,7 +2487,7 @@ func inferenceJobNewDataPrepare(ctx *context.Context) error { return err } ctx.Data["config_list"] = configList.ParaConfigs - + isQueryPrivate := isQueryPrivateModel(ctx) repoId := ctx.Repo.Repository.ID Type := -1 _, model_count, _ := models.QueryModel(&models.AiModelQueryOptions{ @@ -2493,10 +2495,12 @@ func inferenceJobNewDataPrepare(ctx *context.Context) error { Page: 1, PageSize: 2, }, - RepoID: repoId, - Type: Type, - New: MODEL_LATEST, - Status: 0, + RepoID: repoId, + Type: Type, + New: MODEL_LATEST, + IsOnlyThisRepo: true, + Status: 0, + IsQueryPrivate: isQueryPrivate, }) ctx.Data["MODEL_COUNT"] = model_count ctx.Data["datasetType"] = models.TypeCloudBrainTwo diff --git a/routers/repo/user_data_analysis.go b/routers/repo/user_data_analysis.go index 508addf75..a6de283a4 100755 --- a/routers/repo/user_data_analysis.go +++ b/routers/repo/user_data_analysis.go @@ -907,3 +907,9 @@ func QueryUserLoginInfo(ctx *context.Context) { log.Info("writer exel error." + err.Error()) } } + +func QueryUserAnnualReport(ctx *context.Context) { + log.Info("start to QueryUserAnnualReport ") + result := models.QueryUserAnnualReport(ctx.User.ID) + ctx.JSON(http.StatusOK, result) +} diff --git a/routers/repo/user_invitation.go b/routers/repo/user_invitation.go index a2752a481..6e7207bce 100644 --- a/routers/repo/user_invitation.go +++ b/routers/repo/user_invitation.go @@ -49,9 +49,10 @@ func getInvitationDetailExcelHeader(ctx *context.Context) map[string]string { excelHeader := make([]string, 0) excelHeader = append(excelHeader, ctx.Tr("user.static.id")) excelHeader = append(excelHeader, ctx.Tr("user.static.name")) - excelHeader = append(excelHeader, ctx.Tr("user.static.srcUserId")) + excelHeader = append(excelHeader, ctx.Tr("user.static.email")) excelHeader = append(excelHeader, ctx.Tr("user.static.phone")) excelHeader = append(excelHeader, ctx.Tr("user.static.registdate")) + excelHeader = append(excelHeader, ctx.Tr("user.static.srcUserId")) excelHeaderMap := make(map[string]string, 0) var i byte @@ -92,8 +93,7 @@ func writeInvitationDetailExcel(row int, xlsx *excelize.File, sheetName string, tmp = tmp + 1 xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.Name) tmp = tmp + 1 - - xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.SrcUserID) + xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.Email) tmp = tmp + 1 xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.Phone) @@ -101,7 +101,9 @@ func writeInvitationDetailExcel(row int, xlsx *excelize.File, sheetName string, formatTime := userRecord.CreatedUnix.Format("2006-01-02 15:04:05") xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, formatTime[0:len(formatTime)-3]) + tmp = tmp + 1 + xlsx.SetCellValue(sheetName, getColumn(tmp)+rows, userRecord.SrcUserID) } func DownloadInvitationDetail(ctx *context.Context) { @@ -413,6 +415,7 @@ func queryData(ctx *context.Context, startTime time.Time, endTime time.Time) { invi.Name = tmpUser.Name invi.Phone = tmpUser.PhoneNumber invi.CreatedUnix = tmpUser.CreatedUnix + invi.Email = tmpUser.Email } else { invi.Name = "已注销" } diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 719182e07..546854ef1 100755 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -1264,6 +1264,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Post("/delete_model_convert/:id", repo.DeleteModelConvert) m.Post("/convert_stop/:id", repo.StopModelConvert) m.Put("/modify_model", repo.ModifyModelInfo) + m.Put("/modify_model_status", repo.ModifyModelPrivate) m.Get("/show_model", reqRepoModelManageReader, repo.ShowModelTemplate) m.Get("/convert_model", reqRepoModelManageReader, repo.ConvertModelTemplate) m.Get("/show_model_info", repo.ShowModelInfo) diff --git a/routers/user/Invitation.go b/routers/user/Invitation.go index 8491390b2..0eb8ae2f4 100644 --- a/routers/user/Invitation.go +++ b/routers/user/Invitation.go @@ -63,7 +63,7 @@ func InviationTpl(ctx *context.Context) { ctx.HTML(200, tplInvitation) } -func RegisteUserByInvitaionCode(invitationcode string, newUserId int64, newPhoneNumber string) error { +func RegisteUserByInvitaionCode(invitationcode string, newUserId int64, newPhoneNumber string, email string) error { user := parseInvitaionCode(invitationcode) if user == nil { return errors.New("The invitated user not existed.") @@ -85,6 +85,7 @@ func RegisteUserByInvitaionCode(invitationcode string, newUserId int64, newPhone SrcUserID: user.ID, UserID: newUserId, Phone: newPhoneNumber, + Email: email, } err := models.InsertInvitaion(invitation) diff --git a/routers/user/auth.go b/routers/user/auth.go index 3d74b6ddd..5314571d2 100755 --- a/routers/user/auth.go +++ b/routers/user/auth.go @@ -1368,7 +1368,7 @@ func SignUpPost(ctx *context.Context, cpt *captcha.Captcha, form auth.RegisterFo log.Info("enter here, and form.InvitaionCode =" + invitationCode) if invitationCode != "" { - RegisteUserByInvitaionCode(invitationCode, u.ID, u.PhoneNumber) + RegisteUserByInvitaionCode(invitationCode, u.ID, u.PhoneNumber, u.Email) } err := models.AddEmailAddress(&models.EmailAddress{ diff --git a/templates/repo/cloudbrain/trainjob/show.tmpl b/templates/repo/cloudbrain/trainjob/show.tmpl index 09c0f317d..36136323d 100644 --- a/templates/repo/cloudbrain/trainjob/show.tmpl +++ b/templates/repo/cloudbrain/trainjob/show.tmpl @@ -452,6 +452,23 @@ +
+ + + +
+
+ + +
+
+
+
+ + +
+
+