aboutsummaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
authorDenys Konovalov <kontakt@denyskon.de>2024-03-04 03:56:52 +0100
committerGitHub <noreply@github.com>2024-03-04 02:56:52 +0000
commitfe6792dff3d167e87b0c4476f7e7a7ce15742855 (patch)
tree9511f5bdbeba0f94189f9e173f83c116645a37bc /models
parent8553b4600e3035b6f6ad6907c37cebd013fa4d64 (diff)
downloadgitea-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.yml7
-rw-r--r--models/repo/repo.go5
-rw-r--r--models/repo/repo_unit.go56
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 {