diff options
author | Denys Konovalov <kontakt@denyskon.de> | 2024-03-04 03:56:52 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-04 02:56:52 +0000 |
commit | fe6792dff3d167e87b0c4476f7e7a7ce15742855 (patch) | |
tree | 9511f5bdbeba0f94189f9e173f83c116645a37bc /models | |
parent | 8553b4600e3035b6f6ad6907c37cebd013fa4d64 (diff) | |
download | gitea-fe6792dff3d167e87b0c4476f7e7a7ce15742855.tar.gz gitea-fe6792dff3d167e87b0c4476f7e7a7ce15742855.zip |
Enable/disable owner and repo projects independently (#28805)
Part of #23318
Add menu in repo settings to allow for repo admin to decide not just if
projects are enabled or disabled per repo, but also which kind of
projects (repo-level/owner-level) are enabled. If repo projects
disabled, don't show the projects tab.
![grafik](https://github.com/go-gitea/gitea/assets/47871822/b9b43fb4-824b-47f9-b8e2-12004313647c)
---------
Co-authored-by: delvh <dev.lh@web.de>
Diffstat (limited to 'models')
-rw-r--r-- | models/fixtures/repo_unit.yml | 7 | ||||
-rw-r--r-- | models/repo/repo.go | 5 | ||||
-rw-r--r-- | models/repo/repo_unit.go | 56 |
3 files changed, 61 insertions, 7 deletions
diff --git a/models/fixtures/repo_unit.yml b/models/fixtures/repo_unit.yml index 4b26674990..6714294e2b 100644 --- a/models/fixtures/repo_unit.yml +++ b/models/fixtures/repo_unit.yml @@ -520,6 +520,7 @@ id: 75 repo_id: 1 type: 8 + config: "{\"ProjectsMode\":\"all\"}" created_unix: 946684810 - @@ -651,12 +652,6 @@ created_unix: 946684810 - - id: 98 - repo_id: 1 - type: 8 - created_unix: 946684810 - -- id: 99 repo_id: 1 type: 9 diff --git a/models/repo/repo.go b/models/repo/repo.go index 5ce3ecb58a..ad2e21b66b 100644 --- a/models/repo/repo.go +++ b/models/repo/repo.go @@ -411,6 +411,11 @@ func (repo *Repository) MustGetUnit(ctx context.Context, tp unit.Type) *RepoUnit Type: tp, Config: new(ActionsConfig), } + } else if tp == unit.TypeProjects { + return &RepoUnit{ + Type: tp, + Config: new(ProjectsConfig), + } } return &RepoUnit{ diff --git a/models/repo/repo_unit.go b/models/repo/repo_unit.go index 31a2a2e248..6b9dde7faf 100644 --- a/models/repo/repo_unit.go +++ b/models/repo/repo_unit.go @@ -202,6 +202,53 @@ func (cfg *ActionsConfig) ToDB() ([]byte, error) { return json.Marshal(cfg) } +// ProjectsMode represents the projects enabled for a repository +type ProjectsMode string + +const ( + // ProjectsModeRepo allows only repo-level projects + ProjectsModeRepo ProjectsMode = "repo" + // ProjectsModeOwner allows only owner-level projects + ProjectsModeOwner ProjectsMode = "owner" + // ProjectsModeAll allows both kinds of projects + ProjectsModeAll ProjectsMode = "all" + // ProjectsModeNone doesn't allow projects + ProjectsModeNone ProjectsMode = "none" +) + +// ProjectsConfig describes projects config +type ProjectsConfig struct { + ProjectsMode ProjectsMode +} + +// FromDB fills up a ProjectsConfig from serialized format. +func (cfg *ProjectsConfig) FromDB(bs []byte) error { + return json.UnmarshalHandleDoubleEncode(bs, &cfg) +} + +// ToDB exports a ProjectsConfig to a serialized format. +func (cfg *ProjectsConfig) ToDB() ([]byte, error) { + return json.Marshal(cfg) +} + +func (cfg *ProjectsConfig) GetProjectsMode() ProjectsMode { + if cfg.ProjectsMode != "" { + return cfg.ProjectsMode + } + + return ProjectsModeNone +} + +func (cfg *ProjectsConfig) IsProjectsAllowed(m ProjectsMode) bool { + projectsMode := cfg.GetProjectsMode() + + if m == ProjectsModeNone { + return true + } + + return projectsMode == m || projectsMode == ProjectsModeAll +} + // BeforeSet is invoked from XORM before setting the value of a field of this object. func (r *RepoUnit) BeforeSet(colName string, val xorm.Cell) { switch colName { @@ -217,7 +264,9 @@ func (r *RepoUnit) BeforeSet(colName string, val xorm.Cell) { r.Config = new(IssuesConfig) case unit.TypeActions: r.Config = new(ActionsConfig) - case unit.TypeCode, unit.TypeReleases, unit.TypeWiki, unit.TypeProjects, unit.TypePackages: + case unit.TypeProjects: + r.Config = new(ProjectsConfig) + case unit.TypeCode, unit.TypeReleases, unit.TypeWiki, unit.TypePackages: fallthrough default: r.Config = new(UnitConfig) @@ -265,6 +314,11 @@ func (r *RepoUnit) ActionsConfig() *ActionsConfig { return r.Config.(*ActionsConfig) } +// ProjectsConfig returns config for unit.ProjectsConfig +func (r *RepoUnit) ProjectsConfig() *ProjectsConfig { + return r.Config.(*ProjectsConfig) +} + func getUnitsByRepoID(ctx context.Context, repoID int64) (units []*RepoUnit, err error) { var tmpUnits []*RepoUnit if err := db.GetEngine(ctx).Where("repo_id = ?", repoID).Find(&tmpUnits); err != nil { |