diff --git a/models/error.go b/models/error.go index 9d1c68658..46917e15e 100755 --- a/models/error.go +++ b/models/error.go @@ -1999,3 +1999,16 @@ func IsErrJobNotExist(err error) bool { func (err ErrJobNotExist) Error() string { return fmt.Sprintf("the job does not exist") } + +type ErrTagNotExist struct { + TagID int64 +} + +func (err ErrTagNotExist) Error() string { + return fmt.Sprintf("the tag does not exist") +} + +func IsErrTagNotExist(err error) bool { + _, ok := err.(ErrTagNotExist) + return ok +} diff --git a/models/models.go b/models/models.go index e8a71bbd8..a72ebe5db 100755 --- a/models/models.go +++ b/models/models.go @@ -134,6 +134,8 @@ func init() { new(BlockChain), new(RecommendOrg), new(AiModelManage), + new(OfficialTag), + new(OfficialTagRepos), ) tablesStatistic = append(tablesStatistic, diff --git a/models/repo_tag.go b/models/repo_tag.go new file mode 100644 index 000000000..c8e675d75 --- /dev/null +++ b/models/repo_tag.go @@ -0,0 +1,165 @@ +package models + +import ( + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/timeutil" + "fmt" +) + +const DefaultOrgTagLimit = -1 + +type OfficialTag struct { + ID int64 `xorm:"pk autoincr"` + Name string `xorm:"NOT NULL"` + Code string `xorm:"NOT NULL"` + Limit int `xorm:"NOT NULL default(-1)"` + Status int `xorm:"NOT NULL default(0)"` + CreatedUnix timeutil.TimeStamp `xorm:"created"` + UpdatedUnix timeutil.TimeStamp `xorm:"updated"` +} + +type OfficialTagRepos struct { + ID int64 `xorm:"pk autoincr"` + OrgID int64 `xorm:"NOT NULL INDEX"` + TagID int64 `xorm:"NOT NULL"` + RepoID int64 `xorm:"NOT NULL INDEX"` + CreatedUnix timeutil.TimeStamp `xorm:"created"` + UpdatedUnix timeutil.TimeStamp `xorm:"updated"` +} + +type TagReposBrief struct { + RepoID int64 + RepoName string + TagID int64 +} + +type TagReposSelected struct { + RepoID int64 + RepoName string + Selected bool +} + +type TagsDetail struct { + TagId int64 + TagName string + TagLimit int + RepoList []Repository +} + +func GetTagByID(id int64) (*OfficialTag, error) { + r := &OfficialTag{ + ID: id, + } + has, err := x.Get(r) + if err != nil { + return nil, err + } else if !has { + return nil, ErrTagNotExist{0} + } + return r, nil +} + +func UpdateTagReposByID(tagID, orgID int64, repoIdList []int64) error { + sess := x.NewSession() + defer sess.Close() + + if err := sess.Begin(); err != nil { + return fmt.Errorf("UpdateTagReposByID[tagId: %d, orgID: %d,error:%v", tagID, orgID, err) + } + //delete old tag repos + r := &OfficialTagRepos{ + TagID: tagID, + OrgID: orgID, + } + _, err := sess.Delete(r) + if err != nil { + return err + } + + if len(repoIdList) == 0 { + return sess.Commit() + } + + //add new tag repos + data := make([]*OfficialTagRepos, 0) + for _, repoId := range repoIdList { + data = append(data, &OfficialTagRepos{ + OrgID: orgID, + TagID: tagID, + RepoID: repoId, + }) + } + _, err = sess.Insert(&data) + if err != nil { + sess.Rollback() + return err + } + return sess.Commit() +} + +func GetTagRepos(tagID, orgID int64) ([]TagReposSelected, error) { + t := make([]TagReposBrief, 0) + const SQLCmd = "select t1.id as repo_id,t1.name as repo_name,t2.id as tag_id from repository t1 left join official_tag_repos t2 on (t1.id = t2.repo_id and t2.tag_id = ?) where t1.owner_id = ? and t1.is_private = false order by t1.updated_unix desc" + + if err := x.SQL(SQLCmd, tagID, orgID).Find(&t); err != nil { + return nil, err + } + r := make([]TagReposSelected, 0) + for _, v := range t { + selected := false + if v.TagID > 0 { + selected = true + } + r = append(r, TagReposSelected{ + RepoID: v.RepoID, + RepoName: v.RepoName, + Selected: selected, + }) + } + return r, nil +} + +func GetAllOfficialTagRepos(orgID int64, isOwner bool) ([]TagsDetail, error) { + result := make([]TagsDetail, 0) + tags, err := GetAllOfficialTags() + if err != nil { + return nil, err + } + for _, tag := range tags { + repos, err := GetOfficialTagDetail(orgID, tag.ID) + if err != nil { + return nil, err + } + if len(repos) == 0 && !isOwner { + continue + } + result = append(result, TagsDetail{ + TagId: tag.ID, + TagName: tag.Name, + TagLimit: tag.Limit, + RepoList: repos, + }) + } + return result, nil +} + +func GetOfficialTagDetail(orgID, tagId int64) ([]Repository, error) { + t := make([]Repository, 0) + const SQLCmd = "select t2.* from official_tag_repos t1 inner join repository t2 on t1.repo_id = t2.id where t1.org_id = ? and t1.tag_id=? order by t2.updated_unix desc" + + if err := x.SQL(SQLCmd, orgID, tagId).Find(&t); err != nil { + return nil, err + } + return t, nil +} + +func GetAllOfficialTags() ([]OfficialTag, error) { + //todo redis? + o := make([]OfficialTag, 0) + err := x.Where("status = ?", 0).Find(&o) + if err != nil { + log.Error("GetAllOfficialTags error,%v", err) + return nil, err + } + return o, nil +} diff --git a/modules/auth/org.go b/modules/auth/org.go index 20e2b0999..9642e1ce6 100644 --- a/modules/auth/org.go +++ b/modules/auth/org.go @@ -70,3 +70,7 @@ type CreateTeamForm struct { func (f *CreateTeamForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } + +type SubmitReposOfTagForm struct { + RepoList []int64 +} diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index b58021ea2..35f0a98bf 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -222,6 +222,7 @@ contributors = Contributors [explore] repos = Repositories +select_repos = Select the project users = Users organizations = Organizations images = CloudImages @@ -234,6 +235,8 @@ org_no_results = No matching organizations found. code_no_results = No source code matching your search term found. code_search_results = Search results for '%s' code_last_indexed_at = Last indexed %s +save=save +cancel=cancel [auth] create_new_account = Register Account @@ -900,6 +903,8 @@ model.manage.F1 = F1 model.manage.Precision = Precision model.manage.Recall = Recall model.manage.sava_model = Sava Model +model.manage.model_manage = ModelManage +model.manage.model_accuracy = Model Accuracy template.items = Template Items template.git_content = Git Content (Default Branch) diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 7c821824d..0389471c2 100755 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -224,6 +224,7 @@ contributors=贡献者 [explore] repos=项目 +select_repos=精选项目 users=用户 organizations=组织 images = 云脑镜像 @@ -238,6 +239,8 @@ org_no_results=未找到匹配的组织。 code_no_results=未找到与搜索字词匹配的源代码。 code_search_results=“%s” 的搜索结果是 code_last_indexed_at=最后索引于 %s +save=保存 +cancel=取消 [auth] create_new_account=注册帐号 @@ -910,6 +913,8 @@ model.manage.F1 = F1值 model.manage.Precision = 精确率 model.manage.Recall = 召回率 model.manage.sava_model = 保存模型 +model.manage.model_manage = 模型管理 +model.manage.model_accuracy = 模型精度 template.items=模板选项 template.git_content=Git数据(默认分支) diff --git a/routers/org/home.go b/routers/org/home.go index b11c179c1..df600d96d 100755 --- a/routers/org/home.go +++ b/routers/org/home.go @@ -130,5 +130,13 @@ func Home(ctx *context.Context) { pager.SetDefaultParams(ctx) ctx.Data["Page"] = pager + //find org tag info + tags, err := models.GetAllOfficialTagRepos(org.ID, ctx.Org.IsOwner) + if err != nil { + ctx.ServerError("GetAllOfficialTagRepos", err) + return + } + + ctx.Data["tags"] = tags ctx.HTML(200, tplOrgHome) } diff --git a/routers/org/tag.go b/routers/org/tag.go new file mode 100644 index 000000000..650d4690c --- /dev/null +++ b/routers/org/tag.go @@ -0,0 +1,98 @@ +// Copyright 2014 The Gogs Authors. All rights reserved. +// Copyright 2020 The Gitea Authors. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package org + +import ( + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/auth" + "code.gitea.io/gitea/modules/context" + "errors" + "strconv" +) + +// SubmitTags submit repos of org tag +func SubmitTags(ctx *context.Context, form auth.SubmitReposOfTagForm) { + org, tag := getOrgAndTagFromContext(ctx) + if ctx.Written() { + return + } + + err := models.UpdateTagReposByID(tag.ID, org.ID, form.RepoList) + if err != nil { + ctx.ServerError("UpdateTagReposByID", err) + return + } + + ctx.JSON(200, map[string]interface{}{ + "code": "00", + "msg": "success", + }) +} + +// GetTagRepos get repos under org tag +func GetTagRepos(ctx *context.Context) { + org, tag := getOrgAndTagFromContext(ctx) + if ctx.Written() { + return + } + + r, err := models.GetTagRepos(tag.ID, org.ID) + if err != nil { + ctx.ServerError("GetTagRepos", err) + return + } + + ctx.JSON(200, map[string]interface{}{ + "code": "00", + "msg": "success", + "data": r, + }) +} + +// getDashboardContextUser finds out dashboard is viewing as which context user. +func getOrgAndTagFromContext(ctx *context.Context) (*models.User, *models.OfficialTag) { + + var org *models.User + var tag *models.OfficialTag + var err error + + orgName := ctx.Params(":org") + + if len(orgName) > 0 { + // Organization. + org, err = models.GetUserByName(orgName) + if err != nil { + if models.IsErrUserNotExist(err) { + ctx.NotFound("GetUserByName", err) + } else { + ctx.ServerError("GetUserByName", err) + } + return nil, nil + } + if !org.IsOrganization() { + ctx.ServerError("GetUserByName", errors.New("it is not an organization")) + return nil, nil + } + } + + tagIdStr := ctx.Query("tagId") + if len(tagIdStr) == 0 { + ctx.ServerError("GetTagInfo", errors.New("tag is not exist")) + return nil, nil + } + tagId, _ := strconv.ParseInt(tagIdStr, 10, 32) + tag, err = models.GetTagByID(tagId) + if err != nil { + if models.IsErrTagNotExist(err) { + ctx.NotFound("GetTagInfo", err) + } else { + ctx.ServerError("GetTagInfo", err) + } + return nil, nil + } + + return org, tag +} diff --git a/routers/routes/routes.go b/routers/routes/routes.go index ad1ce4f33..95931c723 100755 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -627,6 +627,10 @@ func RegisterRoutes(m *macaron.Macaron) { m.Group("/org", func() { m.Group("/:org", func() { m.Get("/members", org.Members) + m.Group("/org_tag", func() { + m.Get("/repo_list", org.GetTagRepos) + m.Post("/repo_submit", bindIgnErr(auth.SubmitReposOfTagForm{}), org.SubmitTags) + }) }, context.OrgAssignment()) }) m.Group("/org", func() { diff --git a/templates/org/home.tmpl b/templates/org/home.tmpl index 7e9970d2b..e03c28a9e 100755 --- a/templates/org/home.tmpl +++ b/templates/org/home.tmpl @@ -20,10 +20,11 @@
对多可选9个公开项目
+| 准确率 | +{{$.i18n.Tr "repo.model.manage.Accuracy"}} | |
| 精确率 | +{{$.i18n.Tr "repo.model.manage.Precision"}} | |
| 召回率 | +{{$.i18n.Tr "repo.model.manage.Recall"}} |