8ffb9c6fb1
On creation of an empty project (no template) a default board will be created instead of falling back to the uneditable pseudo-board. Every project now has to have exactly one default boards. As a consequence, you cannot unset a board as default, instead you have to set another board as default. Existing projects will be modified using a cron job, additionally this check will run every midnight by default. Deleting the default board is not allowed, you have to set another board as default to do it. Fixes #29873 Fixes #14679 along the way Fixes #29853 Co-authored-by: delvh <dev.lh@web.de> (cherry picked from commit e5160185ed65fd1c2bcb2fc7dc7e0b5514ddb299) Conflicts: options/locale/locale_en-US.ini trivial conflict because Forgejo strings do not have surrounding double quotes
85 lines
1.9 KiB
Go
85 lines
1.9 KiB
Go
// Copyright 2024 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package v1_22 //nolint
|
|
|
|
import (
|
|
"code.gitea.io/gitea/models/project"
|
|
"code.gitea.io/gitea/modules/setting"
|
|
|
|
"xorm.io/builder"
|
|
"xorm.io/xorm"
|
|
)
|
|
|
|
// CheckProjectColumnsConsistency ensures there is exactly one default board per project present
|
|
func CheckProjectColumnsConsistency(x *xorm.Engine) error {
|
|
sess := x.NewSession()
|
|
defer sess.Close()
|
|
|
|
if err := sess.Begin(); err != nil {
|
|
return err
|
|
}
|
|
|
|
limit := setting.Database.IterateBufferSize
|
|
if limit <= 0 {
|
|
limit = 50
|
|
}
|
|
|
|
start := 0
|
|
|
|
for {
|
|
var projects []project.Project
|
|
if err := sess.SQL("SELECT DISTINCT `p`.`id`, `p`.`creator_id` FROM `project` `p` WHERE (SELECT COUNT(*) FROM `project_board` `pb` WHERE `pb`.`project_id` = `p`.`id` AND `pb`.`default` = ?) != 1", true).
|
|
Limit(limit, start).
|
|
Find(&projects); err != nil {
|
|
return err
|
|
}
|
|
|
|
if len(projects) == 0 {
|
|
break
|
|
}
|
|
start += len(projects)
|
|
|
|
for _, p := range projects {
|
|
var boards []project.Board
|
|
if err := sess.Where("project_id=? AND `default` = ?", p.ID, true).OrderBy("sorting").Find(&boards); err != nil {
|
|
return err
|
|
}
|
|
|
|
if len(boards) == 0 {
|
|
if _, err := sess.Insert(project.Board{
|
|
ProjectID: p.ID,
|
|
Default: true,
|
|
Title: "Uncategorized",
|
|
CreatorID: p.CreatorID,
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
continue
|
|
}
|
|
|
|
var boardsToUpdate []int64
|
|
for id, b := range boards {
|
|
if id > 0 {
|
|
boardsToUpdate = append(boardsToUpdate, b.ID)
|
|
}
|
|
}
|
|
|
|
if _, err := sess.Where(builder.Eq{"project_id": p.ID}.And(builder.In("id", boardsToUpdate))).
|
|
Cols("`default`").Update(&project.Board{Default: false}); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if start%1000 == 0 {
|
|
if err := sess.Commit(); err != nil {
|
|
return err
|
|
}
|
|
if err := sess.Begin(); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
|
|
return sess.Commit()
|
|
}
|