move team unittypes to new team_unit table
This commit is contained in:
parent
8ea95f6e1b
commit
a122731c0b
|
|
@ -6,7 +6,6 @@
|
|||
authorize: 4 # owner
|
||||
num_repos: 3
|
||||
num_members: 1
|
||||
unit_types: '[1,2,3,4,5,6,7]'
|
||||
|
||||
-
|
||||
id: 2
|
||||
|
|
@ -16,7 +15,6 @@
|
|||
authorize: 2 # write
|
||||
num_repos: 1
|
||||
num_members: 2
|
||||
unit_types: '[1,2,3,4,5,6,7]'
|
||||
|
||||
-
|
||||
id: 3
|
||||
|
|
@ -26,7 +24,6 @@
|
|||
authorize: 4 # owner
|
||||
num_repos: 0
|
||||
num_members: 1
|
||||
unit_types: '[1,2,3,4,5,6,7]'
|
||||
|
||||
-
|
||||
id: 4
|
||||
|
|
@ -36,7 +33,6 @@
|
|||
authorize: 4 # owner
|
||||
num_repos: 0
|
||||
num_members: 1
|
||||
unit_types: '[1,2,3,4,5,6,7]'
|
||||
|
||||
-
|
||||
id: 5
|
||||
|
|
@ -46,7 +42,6 @@
|
|||
authorize: 4 # owner
|
||||
num_repos: 2
|
||||
num_members: 2
|
||||
unit_types: '[1,2,3,4,5,6,7]'
|
||||
|
||||
-
|
||||
id: 6
|
||||
|
|
@ -56,4 +51,3 @@
|
|||
authorize: 4 # owner
|
||||
num_repos: 2
|
||||
num_members: 1
|
||||
unit_types: '[1,2,3,4,5,6,7]'
|
||||
|
|
|
|||
209
models/fixtures/team_unit.yml
Normal file
209
models/fixtures/team_unit.yml
Normal file
|
|
@ -0,0 +1,209 @@
|
|||
-
|
||||
id: 1
|
||||
team_id: 1
|
||||
type: 1
|
||||
|
||||
-
|
||||
id: 2
|
||||
team_id: 1
|
||||
type: 2
|
||||
|
||||
-
|
||||
id: 3
|
||||
team_id: 1
|
||||
type: 3
|
||||
|
||||
-
|
||||
id: 4
|
||||
team_id: 1
|
||||
type: 4
|
||||
|
||||
-
|
||||
id: 5
|
||||
team_id: 1
|
||||
type: 5
|
||||
|
||||
-
|
||||
id: 6
|
||||
team_id: 1
|
||||
type: 6
|
||||
|
||||
-
|
||||
id: 7
|
||||
team_id: 1
|
||||
type: 7
|
||||
|
||||
-
|
||||
id: 8
|
||||
team_id: 2
|
||||
type: 1
|
||||
|
||||
-
|
||||
id: 9
|
||||
team_id: 2
|
||||
type: 2
|
||||
|
||||
-
|
||||
id: 10
|
||||
team_id: 2
|
||||
type: 3
|
||||
|
||||
-
|
||||
id: 11
|
||||
team_id: 2
|
||||
type: 4
|
||||
|
||||
-
|
||||
id: 12
|
||||
team_id: 2
|
||||
type: 5
|
||||
|
||||
-
|
||||
id: 13
|
||||
team_id: 2
|
||||
type: 6
|
||||
|
||||
-
|
||||
id: 14
|
||||
team_id: 2
|
||||
type: 7
|
||||
|
||||
-
|
||||
id: 15
|
||||
team_id: 3
|
||||
type: 1
|
||||
|
||||
-
|
||||
id: 16
|
||||
team_id: 3
|
||||
type: 2
|
||||
|
||||
-
|
||||
id: 17
|
||||
team_id: 3
|
||||
type: 3
|
||||
|
||||
-
|
||||
id: 18
|
||||
team_id: 3
|
||||
type: 4
|
||||
|
||||
-
|
||||
id: 19
|
||||
team_id: 3
|
||||
type: 5
|
||||
|
||||
-
|
||||
id: 20
|
||||
team_id: 3
|
||||
type: 6
|
||||
|
||||
-
|
||||
id: 21
|
||||
team_id: 3
|
||||
type: 7
|
||||
|
||||
-
|
||||
id: 22
|
||||
team_id: 4
|
||||
type: 1
|
||||
|
||||
-
|
||||
id: 23
|
||||
team_id: 4
|
||||
type: 2
|
||||
|
||||
-
|
||||
id: 24
|
||||
team_id: 4
|
||||
type: 3
|
||||
|
||||
-
|
||||
id: 25
|
||||
team_id: 4
|
||||
type: 4
|
||||
|
||||
-
|
||||
id: 26
|
||||
team_id: 4
|
||||
type: 5
|
||||
|
||||
-
|
||||
id: 27
|
||||
team_id: 4
|
||||
type: 6
|
||||
|
||||
-
|
||||
id: 28
|
||||
team_id: 4
|
||||
type: 7
|
||||
|
||||
-
|
||||
id: 29
|
||||
team_id: 5
|
||||
type: 1
|
||||
|
||||
-
|
||||
id: 30
|
||||
team_id: 5
|
||||
type: 2
|
||||
|
||||
-
|
||||
id: 31
|
||||
team_id: 5
|
||||
type: 3
|
||||
|
||||
-
|
||||
id: 32
|
||||
team_id: 5
|
||||
type: 4
|
||||
|
||||
-
|
||||
id: 33
|
||||
team_id: 5
|
||||
type: 5
|
||||
|
||||
-
|
||||
id: 34
|
||||
team_id: 5
|
||||
type: 6
|
||||
|
||||
-
|
||||
id: 35
|
||||
team_id: 5
|
||||
type: 7
|
||||
|
||||
-
|
||||
id: 36
|
||||
team_id: 6
|
||||
type: 1
|
||||
|
||||
-
|
||||
id: 37
|
||||
team_id: 6
|
||||
type: 2
|
||||
|
||||
-
|
||||
id: 38
|
||||
team_id: 6
|
||||
type: 3
|
||||
|
||||
-
|
||||
id: 39
|
||||
team_id: 6
|
||||
type: 4
|
||||
|
||||
-
|
||||
id: 40
|
||||
team_id: 6
|
||||
type: 5
|
||||
|
||||
-
|
||||
id: 41
|
||||
team_id: 6
|
||||
type: 6
|
||||
|
||||
-
|
||||
id: 42
|
||||
team_id: 6
|
||||
type: 7
|
||||
|
|
@ -190,6 +190,8 @@ var migrations = []Migration{
|
|||
NewMigration("remove stale watches", removeStaleWatches),
|
||||
// v68 -> V69
|
||||
NewMigration("Reformat and remove incorrect topics", reformatAndRemoveIncorrectTopics),
|
||||
// v69 -> v70
|
||||
NewMigration("move team units to team_unit table", moveTeamUnitsToTeamUnitTable),
|
||||
}
|
||||
|
||||
// Migrate database to current version
|
||||
|
|
|
|||
|
|
@ -25,10 +25,15 @@ func removeCommitsUnitType(x *xorm.Engine) (err error) {
|
|||
Created time.Time `xorm:"-"`
|
||||
}
|
||||
|
||||
type Team struct {
|
||||
ID int64
|
||||
UnitTypes []int `xorm:"json"`
|
||||
}
|
||||
|
||||
// Update team unit types
|
||||
const batchSize = 100
|
||||
for start := 0; ; start += batchSize {
|
||||
teams := make([]*models.Team, 0, batchSize)
|
||||
teams := make([]*Team, 0, batchSize)
|
||||
if err := x.Limit(batchSize, start).Find(&teams); err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
@ -36,7 +41,7 @@ func removeCommitsUnitType(x *xorm.Engine) (err error) {
|
|||
break
|
||||
}
|
||||
for _, team := range teams {
|
||||
ut := make([]models.UnitType, 0, len(team.UnitTypes))
|
||||
ut := make([]int, 0, len(team.UnitTypes))
|
||||
for _, u := range team.UnitTypes {
|
||||
if u < V16UnitTypeCommits {
|
||||
ut = append(ut, u)
|
||||
|
|
|
|||
78
models/migrations/v69.go
Normal file
78
models/migrations/v69.go
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
// Copyright 2018 The Gitea Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package migrations
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/go-xorm/xorm"
|
||||
)
|
||||
|
||||
func moveTeamUnitsToTeamUnitTable(x *xorm.Engine) error {
|
||||
// Team see models/team.go
|
||||
type Team struct {
|
||||
ID int64
|
||||
OrgID int64
|
||||
UnitTypes []int `xorm:"json"`
|
||||
}
|
||||
|
||||
// TeamUnit see models/org_team.go
|
||||
type TeamUnit struct {
|
||||
ID int64 `xorm:"pk autoincr"`
|
||||
TeamID int64 `xorm:"INDEX(s)"`
|
||||
Type int `xorm:"INDEX(s)"`
|
||||
}
|
||||
|
||||
if err := x.Sync2(new(TeamUnit)); err != nil {
|
||||
return fmt.Errorf("Sync2: %v", err)
|
||||
}
|
||||
|
||||
sess := x.NewSession()
|
||||
defer sess.Close()
|
||||
|
||||
if err := sess.Begin(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Update team unit types
|
||||
const batchSize = 100
|
||||
for start := 0; ; start += batchSize {
|
||||
teams := make([]*Team, 0, batchSize)
|
||||
if err := x.Limit(batchSize, start).Find(&teams); err != nil {
|
||||
return err
|
||||
}
|
||||
if len(teams) == 0 {
|
||||
break
|
||||
}
|
||||
|
||||
for _, team := range teams {
|
||||
var unitTypes []int
|
||||
if len(team.UnitTypes) == 0 {
|
||||
unitTypes = allUnitTypes
|
||||
} else {
|
||||
unitTypes = team.UnitTypes
|
||||
}
|
||||
|
||||
// insert units for team
|
||||
var units = make([]TeamUnit, 0, len(unitTypes))
|
||||
for _, tp := range unitTypes {
|
||||
units = append(units, TeamUnit{
|
||||
TeamID: team.ID,
|
||||
Type: tp,
|
||||
})
|
||||
}
|
||||
|
||||
if _, err := sess.Insert(&units); err != nil {
|
||||
return fmt.Errorf("Insert team units: %v", err)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if err := dropTableColumns(sess, "team", "unit_types"); err != nil {
|
||||
return err
|
||||
}
|
||||
return sess.Commit()
|
||||
}
|
||||
|
|
@ -122,6 +122,7 @@ func init() {
|
|||
new(Reaction),
|
||||
new(IssueAssignees),
|
||||
new(U2FRegistration),
|
||||
new(TeamUnit),
|
||||
)
|
||||
|
||||
gonicNames := []string{"SSL", "UID"}
|
||||
|
|
|
|||
|
|
@ -154,12 +154,25 @@ func CreateOrganization(org, owner *User) (err error) {
|
|||
Name: ownerTeamName,
|
||||
Authorize: AccessModeOwner,
|
||||
NumMembers: 1,
|
||||
UnitTypes: allRepUnitTypes,
|
||||
}
|
||||
if _, err = sess.Insert(t); err != nil {
|
||||
return fmt.Errorf("insert owner team: %v", err)
|
||||
}
|
||||
|
||||
// insert units for team
|
||||
var units = make([]TeamUnit, 0, len(allRepUnitTypes))
|
||||
for _, tp := range allRepUnitTypes {
|
||||
units = append(units, TeamUnit{
|
||||
TeamID: t.ID,
|
||||
Type: tp,
|
||||
})
|
||||
}
|
||||
|
||||
if _, err = sess.Insert(&units); err != nil {
|
||||
sess.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err = sess.Insert(&TeamUser{
|
||||
UID: owner.ID,
|
||||
OrgID: org.ID,
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
// Copyright 2018 The Gitea Authors. All rights reserved.
|
||||
// Copyright 2016 The Gogs Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
|
@ -10,7 +11,6 @@ import (
|
|||
"strings"
|
||||
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
|
||||
"github.com/go-xorm/xorm"
|
||||
)
|
||||
|
||||
|
|
@ -28,15 +28,16 @@ type Team struct {
|
|||
Members []*User `xorm:"-"`
|
||||
NumRepos int
|
||||
NumMembers int
|
||||
UnitTypes []UnitType `xorm:"json"`
|
||||
Units []*TeamUnit `xorm:"-"`
|
||||
}
|
||||
|
||||
// GetUnitTypes returns unit types the team owned, empty means all the unit types
|
||||
func (t *Team) GetUnitTypes() []UnitType {
|
||||
if len(t.UnitTypes) == 0 {
|
||||
return allRepUnitTypes
|
||||
func (t *Team) getUnits(e Engine) (err error) {
|
||||
if t.Units != nil {
|
||||
return nil
|
||||
}
|
||||
return t.UnitTypes
|
||||
|
||||
t.Units, err = getUnitsByTeamID(e, t.ID)
|
||||
return err
|
||||
}
|
||||
|
||||
// HasWriteAccess returns true if team has at least write level access mode.
|
||||
|
|
@ -214,11 +215,12 @@ func (t *Team) RemoveRepository(repoID int64) error {
|
|||
|
||||
// UnitEnabled returns if the team has the given unit type enabled
|
||||
func (t *Team) UnitEnabled(tp UnitType) bool {
|
||||
if len(t.UnitTypes) == 0 {
|
||||
return true
|
||||
if err := t.getUnits(x); err != nil {
|
||||
log.Warn("Error loading repository (ID: %d) units: %s", t.ID, err.Error())
|
||||
}
|
||||
for _, u := range t.UnitTypes {
|
||||
if u == tp {
|
||||
|
||||
for _, unit := range t.Units {
|
||||
if unit.Type == tp {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
|
@ -275,6 +277,17 @@ func NewTeam(t *Team) (err error) {
|
|||
return err
|
||||
}
|
||||
|
||||
// insert units for team
|
||||
if len(t.Units) > 0 {
|
||||
for _, unit := range t.Units {
|
||||
unit.TeamID = t.ID
|
||||
}
|
||||
if _, err = sess.Insert(&t.Units); err != nil {
|
||||
sess.Rollback()
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// Update organization number of teams.
|
||||
if _, err = sess.Exec("UPDATE `user` SET num_teams=num_teams+1 WHERE id = ?", t.OrgID); err != nil {
|
||||
sess.Rollback()
|
||||
|
|
@ -695,3 +708,46 @@ func GetTeamsWithAccessToRepo(orgID, repoID int64, mode AccessMode) ([]*Team, er
|
|||
And("team_repo.repo_id = ?", repoID).
|
||||
Find(&teams)
|
||||
}
|
||||
|
||||
// ___________ ____ ___ .__ __
|
||||
// \__ ___/___ _____ _____ | | \____ |__|/ |_
|
||||
// | |_/ __ \\__ \ / \| | / \| \ __\
|
||||
// | |\ ___/ / __ \| Y Y \ | / | \ || |
|
||||
// |____| \___ >____ /__|_| /______/|___| /__||__|
|
||||
// \/ \/ \/ \/
|
||||
|
||||
// TeamUnit describes all units of a repository
|
||||
type TeamUnit struct {
|
||||
ID int64 `xorm:"pk autoincr"`
|
||||
TeamID int64 `xorm:"INDEX(s)"`
|
||||
Type UnitType `xorm:"INDEX(s)"`
|
||||
}
|
||||
|
||||
// Unit returns Unit
|
||||
func (t *TeamUnit) Unit() Unit {
|
||||
return Units[t.Type]
|
||||
}
|
||||
|
||||
func getUnitsByTeamID(e Engine, teamID int64) (units []*TeamUnit, err error) {
|
||||
return units, e.Where("team_id = ?", teamID).Find(&units)
|
||||
}
|
||||
|
||||
// UpdateTeamUnits updates a teams's units
|
||||
func UpdateTeamUnits(team *Team, units []TeamUnit) (err error) {
|
||||
sess := x.NewSession()
|
||||
defer sess.Close()
|
||||
if err = sess.Begin(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err = sess.Where("team_id = ?", team.ID).Delete(new(TeamUnit)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err = sess.Insert(units); err != nil {
|
||||
sess.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
return sess.Commit()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -365,22 +365,14 @@ func (repo *Repository) getUnitsByUserID(e Engine, userID int64, isAdmin bool) (
|
|||
return err
|
||||
}
|
||||
|
||||
var allTypes = make(map[UnitType]struct{}, len(allRepUnitTypes))
|
||||
for _, team := range teams {
|
||||
// Administrators can not be limited
|
||||
if team.Authorize >= AccessModeAdmin {
|
||||
return nil
|
||||
}
|
||||
for _, unitType := range team.UnitTypes {
|
||||
allTypes[unitType] = struct{}{}
|
||||
}
|
||||
}
|
||||
|
||||
// unique
|
||||
var newRepoUnits = make([]*RepoUnit, 0, len(repo.Units))
|
||||
for _, u := range repo.Units {
|
||||
if _, ok := allTypes[u.Type]; ok {
|
||||
newRepoUnits = append(newRepoUnits, u)
|
||||
for _, team := range teams {
|
||||
if team.UnitEnabled(u.Type) {
|
||||
newRepoUnits = append(newRepoUnits, u)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -182,7 +182,13 @@ func NewTeamPost(ctx *context.Context, form auth.CreateTeamForm) {
|
|||
Authorize: models.ParseAccessMode(form.Permission),
|
||||
}
|
||||
if t.Authorize < models.AccessModeAdmin {
|
||||
t.UnitTypes = form.Units
|
||||
var units = make([]*models.TeamUnit, 0, len(form.Units))
|
||||
for _, tp := range form.Units {
|
||||
units = append(units, &models.TeamUnit{
|
||||
Type: tp,
|
||||
})
|
||||
}
|
||||
t.Units = units
|
||||
}
|
||||
|
||||
ctx.Data["Team"] = t
|
||||
|
|
@ -264,9 +270,16 @@ func EditTeamPost(ctx *context.Context, form auth.CreateTeamForm) {
|
|||
}
|
||||
t.Description = form.Description
|
||||
if t.Authorize < models.AccessModeAdmin {
|
||||
t.UnitTypes = form.Units
|
||||
var units = make([]models.TeamUnit, 0, len(form.Units))
|
||||
for _, tp := range form.Units {
|
||||
units = append(units, models.TeamUnit{
|
||||
TeamID: t.ID,
|
||||
Type: tp,
|
||||
})
|
||||
}
|
||||
models.UpdateTeamUnits(t, units)
|
||||
} else {
|
||||
t.UnitTypes = nil
|
||||
models.UpdateTeamUnits(t, nil)
|
||||
}
|
||||
|
||||
if ctx.HasError() {
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@
|
|||
{{range $t, $unit := $.Units}}
|
||||
<div class="field">
|
||||
<div class="ui toggle checkbox">
|
||||
<input type="checkbox" class="hidden" name="units" value="{{$unit.Type}}"{{if $.Team.UnitEnabled $unit.Type}} checked{{end}}>
|
||||
<input type="checkbox" class="hidden" name="units" value="{{$unit.Type}}"{{if or (eq $.Team.ID 0) ($.Team.UnitEnabled $unit.Type)}} checked{{end}}>
|
||||
<label>{{$.i18n.Tr $unit.NameKey}}</label>
|
||||
<span class="help">{{$.i18n.Tr $unit.DescKey}}</span>
|
||||
</div>
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user