]> source.dussan.org Git - gitea.git/commitdiff
Use a standalone struct name for Organization (#17632)
authorLunny Xiao <xiaolunwen@gmail.com>
Fri, 19 Nov 2021 11:41:40 +0000 (19:41 +0800)
committerGitHub <noreply@github.com>
Fri, 19 Nov 2021 11:41:40 +0000 (19:41 +0800)
* Use a standalone struct name for Organization

* recover unnecessary change

* make the code readable

* Fix template failure

* Fix template failure

* Move HasMemberWithUserID to org

* Fix test

* Remove unnecessary user type check

* Fix test

Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
43 files changed:
models/access.go
models/action.go
models/org.go
models/org_team.go
models/org_test.go
models/repo.go
models/repo_test.go
models/repo_transfer.go
models/user.go
models/userlist_test.go
modules/context/api_org.go
modules/context/org.go
modules/convert/convert.go
modules/repository/create_test.go
modules/repository/repo.go
routers/api/v1/admin/org.go
routers/api/v1/org/hook.go
routers/api/v1/org/label.go
routers/api/v1/org/org.go
routers/api/v1/org/team.go
routers/api/v1/repo/fork.go
routers/api/v1/repo/migrate.go
routers/api/v1/repo/repo.go
routers/api/v1/repo/transfer.go
routers/api/v1/user/repo.go
routers/api/v1/utils/hook.go
routers/web/org/home.go
routers/web/org/org.go
routers/web/org/setting.go
routers/web/org/teams.go
routers/web/repo/issue.go
routers/web/repo/issue_label.go
routers/web/repo/pull.go
routers/web/repo/repo.go
routers/web/repo/setting.go
routers/web/repo/setting_protected_branch.go
routers/web/repo/tag.go
routers/web/user/home.go
routers/web/user/oauth.go
services/org/org.go
services/org/org_test.go
services/repository/repository.go
services/user/user.go

index 7bbc04bd4561009fce5859e7a38af2409b1e105c..500bcc1e19094fc3cc97152c7707df2f9a5042eb 100644 (file)
@@ -254,11 +254,12 @@ func (repo *Repository) recalculateTeamAccesses(e db.Engine, ignTeamID int64) (e
                return fmt.Errorf("refreshCollaboratorAccesses: %v", err)
        }
 
-       if err = repo.Owner.loadTeams(e); err != nil {
+       teams, err := OrgFromUser(repo.Owner).loadTeams(e)
+       if err != nil {
                return err
        }
 
-       for _, t := range repo.Owner.Teams {
+       for _, t := range teams {
                if t.ID == ignTeamID {
                        continue
                }
index 80ac3e16f8524878e6ee56f9e778166919483fe5..d790cd6678f5c47d172c1556a7974f474c63a4d6 100644 (file)
@@ -352,7 +352,7 @@ func activityQueryCondition(opts GetFeedsOptions) (builder.Cond, error) {
        // check readable repositories by doer/actor
        if opts.Actor == nil || !opts.Actor.IsAdmin {
                if opts.RequestedUser.IsOrganization() {
-                       env, err := opts.RequestedUser.AccessibleReposEnv(actorID)
+                       env, err := OrgFromUser(opts.RequestedUser).AccessibleReposEnv(actorID)
                        if err != nil {
                                return nil, fmt.Errorf("AccessibleReposEnv: %v", err)
                        }
@@ -366,7 +366,7 @@ func activityQueryCondition(opts GetFeedsOptions) (builder.Cond, error) {
        }
 
        if opts.RequestedTeam != nil {
-               env := opts.RequestedUser.AccessibleTeamReposEnv(opts.RequestedTeam)
+               env := OrgFromUser(opts.RequestedUser).AccessibleTeamReposEnv(opts.RequestedTeam)
                teamRepoIDs, err := env.RepoIDs(1, opts.RequestedUser.NumRepos)
                if err != nil {
                        return nil, fmt.Errorf("GetTeamRepositories: %v", err)
index e0b4d272459cdb05bbf9f7f13265e3f5f35c696b..c79af5c7bba236e68f8a6048d88007c5966f4240 100644 (file)
@@ -21,60 +21,109 @@ import (
        "xorm.io/xorm"
 )
 
+// Organization represents an organization
+type Organization User
+
+// OrgFromUser converts user to organization
+func OrgFromUser(user *User) *Organization {
+       return (*Organization)(user)
+}
+
+// TableName represents the real table name of Organization
+func (Organization) TableName() string {
+       return "user"
+}
+
 // IsOwnedBy returns true if given user is in the owner team.
-func (org *User) IsOwnedBy(uid int64) (bool, error) {
+func (org *Organization) IsOwnedBy(uid int64) (bool, error) {
        return IsOrganizationOwner(org.ID, uid)
 }
 
 // IsOrgMember returns true if given user is member of organization.
-func (org *User) IsOrgMember(uid int64) (bool, error) {
+func (org *Organization) IsOrgMember(uid int64) (bool, error) {
        return IsOrganizationMember(org.ID, uid)
 }
 
 // CanCreateOrgRepo returns true if given user can create repo in organization
-func (org *User) CanCreateOrgRepo(uid int64) (bool, error) {
+func (org *Organization) CanCreateOrgRepo(uid int64) (bool, error) {
        return CanCreateOrgRepo(org.ID, uid)
 }
 
-func (org *User) getTeam(e db.Engine, name string) (*Team, error) {
+func (org *Organization) getTeam(e db.Engine, name string) (*Team, error) {
        return getTeam(e, org.ID, name)
 }
 
 // GetTeam returns named team of organization.
-func (org *User) GetTeam(name string) (*Team, error) {
+func (org *Organization) GetTeam(name string) (*Team, error) {
        return org.getTeam(db.GetEngine(db.DefaultContext), name)
 }
 
-func (org *User) getOwnerTeam(e db.Engine) (*Team, error) {
+func (org *Organization) getOwnerTeam(e db.Engine) (*Team, error) {
        return org.getTeam(e, ownerTeamName)
 }
 
 // GetOwnerTeam returns owner team of organization.
-func (org *User) GetOwnerTeam() (*Team, error) {
+func (org *Organization) GetOwnerTeam() (*Team, error) {
        return org.getOwnerTeam(db.GetEngine(db.DefaultContext))
 }
 
-func (org *User) loadTeams(e db.Engine) error {
-       if org.Teams != nil {
-               return nil
-       }
-       return e.
+func (org *Organization) loadTeams(e db.Engine) ([]*Team, error) {
+       var teams []*Team
+       return teams, e.
                Where("org_id=?", org.ID).
                OrderBy("CASE WHEN name LIKE '" + ownerTeamName + "' THEN '' ELSE name END").
-               Find(&org.Teams)
+               Find(&teams)
 }
 
 // LoadTeams load teams if not loaded.
-func (org *User) LoadTeams() error {
+func (org *Organization) LoadTeams() ([]*Team, error) {
        return org.loadTeams(db.GetEngine(db.DefaultContext))
 }
 
 // GetMembers returns all members of organization.
-func (org *User) GetMembers() (err error) {
-       org.Members, org.MembersIsPublic, err = FindOrgMembers(&FindOrgMembersOpts{
+func (org *Organization) GetMembers() (UserList, map[int64]bool, error) {
+       return FindOrgMembers(&FindOrgMembersOpts{
                OrgID: org.ID,
        })
-       return
+}
+
+// HasMemberWithUserID returns true if user with userID is part of the u organisation.
+func (org *Organization) HasMemberWithUserID(userID int64) bool {
+       return org.hasMemberWithUserID(db.GetEngine(db.DefaultContext), userID)
+}
+
+func (org *Organization) hasMemberWithUserID(e db.Engine, userID int64) bool {
+       isMember, err := isOrganizationMember(e, org.ID, userID)
+       if err != nil {
+               log.Error("IsOrganizationMember: %v", err)
+               return false
+       }
+       return isMember
+}
+
+// AvatarLink returns the full avatar link with http host
+func (org *Organization) AvatarLink() string {
+       return org.AsUser().AvatarLink()
+}
+
+// HTMLURL returns the organization's full link.
+func (org *Organization) HTMLURL() string {
+       return org.AsUser().HTMLURL()
+}
+
+// OrganisationLink returns the organization sub page link.
+func (org *Organization) OrganisationLink() string {
+       return org.AsUser().OrganisationLink()
+}
+
+// ShortName ellipses username to length
+func (org *Organization) ShortName(length int) string {
+       return org.AsUser().ShortName(length)
+}
+
+// HomeLink returns the user or organization home page link.
+func (org *Organization) HomeLink() string {
+       return org.AsUser().HomeLink()
 }
 
 // FindOrgMembersOpts represensts find org members conditions
@@ -115,26 +164,42 @@ func FindOrgMembers(opts *FindOrgMembersOpts) (UserList, map[int64]bool, error)
 }
 
 // AddMember adds new member to organization.
-func (org *User) AddMember(uid int64) error {
+func (org *Organization) AddMember(uid int64) error {
        return AddOrgUser(org.ID, uid)
 }
 
 // RemoveMember removes member from organization.
-func (org *User) RemoveMember(uid int64) error {
+func (org *Organization) RemoveMember(uid int64) error {
        return RemoveOrgUser(org.ID, uid)
 }
 
-func (org *User) removeOrgRepo(e db.Engine, repoID int64) error {
+func (org *Organization) removeOrgRepo(e db.Engine, repoID int64) error {
        return removeOrgRepo(e, org.ID, repoID)
 }
 
 // RemoveOrgRepo removes all team-repository relations of organization.
-func (org *User) RemoveOrgRepo(repoID int64) error {
+func (org *Organization) RemoveOrgRepo(repoID int64) error {
        return org.removeOrgRepo(db.GetEngine(db.DefaultContext), repoID)
 }
 
+// AsUser returns the org as user object
+func (org *Organization) AsUser() *User {
+       return (*User)(org)
+}
+
+// DisplayName returns full name if it's not empty,
+// returns username otherwise.
+func (org *Organization) DisplayName() string {
+       return org.AsUser().DisplayName()
+}
+
+// CustomAvatarRelativePath returns user custom avatar relative path.
+func (org *Organization) CustomAvatarRelativePath() string {
+       return org.Avatar
+}
+
 // CreateOrganization creates record of a new organization.
-func CreateOrganization(org, owner *User) (err error) {
+func CreateOrganization(org *Organization, owner *User) (err error) {
        if !owner.CanCreateOrganization() {
                return ErrUserNotAllowedCreateOrg{}
        }
@@ -176,7 +241,7 @@ func CreateOrganization(org, owner *User) (err error) {
        if err = db.Insert(ctx, org); err != nil {
                return fmt.Errorf("insert organization: %v", err)
        }
-       if err = org.generateRandomAvatar(db.GetEngine(ctx)); err != nil {
+       if err = org.AsUser().generateRandomAvatar(db.GetEngine(ctx)); err != nil {
                return fmt.Errorf("generate random avatar: %v", err)
        }
 
@@ -228,11 +293,11 @@ func CreateOrganization(org, owner *User) (err error) {
 }
 
 // GetOrgByName returns organization by given name.
-func GetOrgByName(name string) (*User, error) {
+func GetOrgByName(name string) (*Organization, error) {
        if len(name) == 0 {
                return nil, ErrOrgNotExist{0, name}
        }
-       u := &User{
+       u := &Organization{
                LowerName: strings.ToLower(name),
                Type:      UserTypeOrganization,
        }
@@ -249,12 +314,16 @@ func GetOrgByName(name string) (*User, error) {
 func CountOrganizations() int64 {
        count, _ := db.GetEngine(db.DefaultContext).
                Where("type=1").
-               Count(new(User))
+               Count(new(Organization))
        return count
 }
 
 // DeleteOrganization deletes models associated to an organization.
-func DeleteOrganization(ctx context.Context, org *User) error {
+func DeleteOrganization(ctx context.Context, org *Organization) error {
+       if org.Type != UserTypeOrganization {
+               return fmt.Errorf("%s is a user not an organization", org.Name)
+       }
+
        e := db.GetEngine(ctx)
 
        if err := deleteBeans(e,
@@ -346,7 +415,7 @@ func CanCreateOrgRepo(orgID, uid int64) (bool, error) {
 }
 
 // GetOrgUserMaxAuthorizeLevel returns highest authorize level of user in an organization
-func (org *User) GetOrgUserMaxAuthorizeLevel(uid int64) (AccessMode, error) {
+func (org *Organization) GetOrgUserMaxAuthorizeLevel(uid int64) (AccessMode, error) {
        var authorize AccessMode
        _, err := db.GetEngine(db.DefaultContext).
                Select("max(team.authorize)").
@@ -372,8 +441,8 @@ func getUsersWhoCanCreateOrgRepo(e db.Engine, orgID int64) ([]*User, error) {
                And("team_user.org_id = ?", orgID).Asc("`user`.name").Find(&users)
 }
 
-func getOrgsByUserID(sess *xorm.Session, userID int64, showAll bool) ([]*User, error) {
-       orgs := make([]*User, 0, 10)
+func getOrgsByUserID(sess *xorm.Session, userID int64, showAll bool) ([]*Organization, error) {
+       orgs := make([]*Organization, 0, 10)
        if !showAll {
                sess.And("`org_user`.is_public=?", true)
        }
@@ -386,14 +455,14 @@ func getOrgsByUserID(sess *xorm.Session, userID int64, showAll bool) ([]*User, e
 
 // GetOrgsByUserID returns a list of organizations that the given user ID
 // has joined.
-func GetOrgsByUserID(userID int64, showAll bool) ([]*User, error) {
+func GetOrgsByUserID(userID int64, showAll bool) ([]*Organization, error) {
        sess := db.NewSession(db.DefaultContext)
        defer sess.Close()
        return getOrgsByUserID(sess, userID, showAll)
 }
 
 // MinimalOrg represents a simple orgnization with only needed columns
-type MinimalOrg = User
+type MinimalOrg = Organization
 
 // GetUserOrgsList returns one user's all orgs list
 func GetUserOrgsList(user *User) ([]*MinimalOrg, error) {
@@ -434,8 +503,8 @@ func GetUserOrgsList(user *User) ([]*MinimalOrg, error) {
                GroupBy(groupByStr)
 
        type OrgCount struct {
-               User     `xorm:"extends"`
-               OrgCount int
+               Organization `xorm:"extends"`
+               OrgCount     int
        }
 
        orgCounts := make([]*OrgCount, 0, 10)
@@ -448,8 +517,8 @@ func GetUserOrgsList(user *User) ([]*MinimalOrg, error) {
 
        orgs := make([]*MinimalOrg, len(orgCounts))
        for i, orgCount := range orgCounts {
-               orgCount.User.NumRepos = orgCount.OrgCount
-               orgs[i] = &orgCount.User
+               orgCount.Organization.NumRepos = orgCount.OrgCount
+               orgs[i] = &orgCount.Organization
        }
 
        return orgs, nil
@@ -481,20 +550,20 @@ func hasOrgOrUserVisible(e db.Engine, orgOrUser, user *User) bool {
                return true
        }
 
-       if (orgOrUser.Visibility == structs.VisibleTypePrivate || user.IsRestricted) && !orgOrUser.hasMemberWithUserID(e, user.ID) {
+       if (orgOrUser.Visibility == structs.VisibleTypePrivate || user.IsRestricted) && !OrgFromUser(orgOrUser).hasMemberWithUserID(e, user.ID) {
                return false
        }
        return true
 }
 
 // HasOrgsVisible tells if the given user can see at least one of the orgs provided
-func HasOrgsVisible(orgs []*User, user *User) bool {
+func HasOrgsVisible(orgs []*Organization, user *User) bool {
        if len(orgs) == 0 {
                return false
        }
 
        for _, org := range orgs {
-               if HasOrgOrUserVisible(org, user) {
+               if HasOrgOrUserVisible(org.AsUser(), user) {
                        return true
                }
        }
@@ -622,9 +691,28 @@ func AddOrgUser(orgID, uid int64) error {
        return sess.Commit()
 }
 
-func removeOrgUser(sess *xorm.Session, orgID, userID int64) error {
+// GetOrgByIDCtx returns the user object by given ID if exists.
+func GetOrgByIDCtx(ctx context.Context, id int64) (*Organization, error) {
+       u := new(Organization)
+       has, err := db.GetEngine(ctx).ID(id).Get(u)
+       if err != nil {
+               return nil, err
+       } else if !has {
+               return nil, ErrUserNotExist{id, "", 0}
+       }
+       return u, nil
+}
+
+// GetOrgByID returns the user object by given ID if exists.
+func GetOrgByID(id int64) (*Organization, error) {
+       return GetOrgByIDCtx(db.DefaultContext, id)
+}
+
+func removeOrgUser(ctx context.Context, orgID, userID int64) error {
        ou := new(OrgUser)
 
+       sess := db.GetEngine(ctx)
+
        has, err := sess.
                Where("uid=?", userID).
                And("org_id=?", orgID).
@@ -635,7 +723,7 @@ func removeOrgUser(sess *xorm.Session, orgID, userID int64) error {
                return nil
        }
 
-       org, err := getUserByID(sess, orgID)
+       org, err := GetOrgByIDCtx(ctx, orgID)
        if err != nil {
                return fmt.Errorf("GetUserByID [%d]: %v", orgID, err)
        }
@@ -694,7 +782,7 @@ func removeOrgUser(sess *xorm.Session, orgID, userID int64) error {
                return err
        }
        for _, t := range teams {
-               if err = removeTeamMember(sess, t, userID); err != nil {
+               if err = removeTeamMember(ctx, t, userID); err != nil {
                        return err
                }
        }
@@ -704,15 +792,15 @@ func removeOrgUser(sess *xorm.Session, orgID, userID int64) error {
 
 // RemoveOrgUser removes user from given organization.
 func RemoveOrgUser(orgID, userID int64) error {
-       sess := db.NewSession(db.DefaultContext)
-       defer sess.Close()
-       if err := sess.Begin(); err != nil {
+       ctx, committer, err := db.TxContext()
+       if err != nil {
                return err
        }
-       if err := removeOrgUser(sess, orgID, userID); err != nil {
+       defer committer.Close()
+       if err := removeOrgUser(ctx, orgID, userID); err != nil {
                return err
        }
-       return sess.Commit()
+       return committer.Commit()
 }
 
 func removeOrgRepo(e db.Engine, orgID, repoID int64) error {
@@ -741,7 +829,7 @@ func removeOrgRepo(e db.Engine, orgID, repoID int64) error {
        return err
 }
 
-func (org *User) getUserTeams(e db.Engine, userID int64, cols ...string) ([]*Team, error) {
+func (org *Organization) getUserTeams(e db.Engine, userID int64, cols ...string) ([]*Team, error) {
        teams := make([]*Team, 0, org.NumTeams)
        return teams, e.
                Where("`team_user`.org_id = ?", org.ID).
@@ -753,7 +841,7 @@ func (org *User) getUserTeams(e db.Engine, userID int64, cols ...string) ([]*Tea
                Find(&teams)
 }
 
-func (org *User) getUserTeamIDs(e db.Engine, userID int64) ([]int64, error) {
+func (org *Organization) getUserTeamIDs(e db.Engine, userID int64) ([]int64, error) {
        teamIDs := make([]int64, 0, org.NumTeams)
        return teamIDs, e.
                Table("team").
@@ -765,18 +853,18 @@ func (org *User) getUserTeamIDs(e db.Engine, userID int64) ([]int64, error) {
 }
 
 // TeamsWithAccessToRepo returns all teams that have given access level to the repository.
-func (org *User) TeamsWithAccessToRepo(repoID int64, mode AccessMode) ([]*Team, error) {
+func (org *Organization) TeamsWithAccessToRepo(repoID int64, mode AccessMode) ([]*Team, error) {
        return GetTeamsWithAccessToRepo(org.ID, repoID, mode)
 }
 
 // GetUserTeamIDs returns of all team IDs of the organization that user is member of.
-func (org *User) GetUserTeamIDs(userID int64) ([]int64, error) {
+func (org *Organization) GetUserTeamIDs(userID int64) ([]int64, error) {
        return org.getUserTeamIDs(db.GetEngine(db.DefaultContext), userID)
 }
 
 // GetUserTeams returns all teams that belong to user,
 // and that the user has joined.
-func (org *User) GetUserTeams(userID int64) ([]*Team, error) {
+func (org *Organization) GetUserTeams(userID int64) ([]*Team, error) {
        return org.getUserTeams(db.GetEngine(db.DefaultContext), userID)
 }
 
@@ -792,7 +880,7 @@ type AccessibleReposEnvironment interface {
 }
 
 type accessibleReposEnv struct {
-       org     *User
+       org     *Organization
        user    *User
        team    *Team
        teamIDs []int64
@@ -803,11 +891,11 @@ type accessibleReposEnv struct {
 
 // AccessibleReposEnv builds an AccessibleReposEnvironment for the repositories in `org`
 // that are accessible to the specified user.
-func (org *User) AccessibleReposEnv(userID int64) (AccessibleReposEnvironment, error) {
+func (org *Organization) AccessibleReposEnv(userID int64) (AccessibleReposEnvironment, error) {
        return org.accessibleReposEnv(db.GetEngine(db.DefaultContext), userID)
 }
 
-func (org *User) accessibleReposEnv(e db.Engine, userID int64) (AccessibleReposEnvironment, error) {
+func (org *Organization) accessibleReposEnv(e db.Engine, userID int64) (AccessibleReposEnvironment, error) {
        var user *User
 
        if userID > 0 {
@@ -833,7 +921,7 @@ func (org *User) accessibleReposEnv(e db.Engine, userID int64) (AccessibleReposE
 
 // AccessibleTeamReposEnv an AccessibleReposEnvironment for the repositories in `org`
 // that are accessible to the specified team.
-func (org *User) AccessibleTeamReposEnv(team *Team) AccessibleReposEnvironment {
+func (org *Organization) AccessibleTeamReposEnv(team *Team) AccessibleReposEnvironment {
        return &accessibleReposEnv{
                org:     org,
                team:    team,
index 10178ec88aee9daea85aea67fc519f8ab59141ce..e3ad23c111c08a0530d84441e073b144a4d060ee 100644 (file)
@@ -6,6 +6,7 @@
 package models
 
 import (
+       "context"
        "errors"
        "fmt"
        "sort"
@@ -17,7 +18,6 @@ import (
        "code.gitea.io/gitea/modules/setting"
 
        "xorm.io/builder"
-       "xorm.io/xorm"
 )
 
 const ownerTeamName = "Owners"
@@ -872,7 +872,8 @@ func AddTeamMember(team *Team, userID int64) error {
        return sess.Commit()
 }
 
-func removeTeamMember(e *xorm.Session, team *Team, userID int64) error {
+func removeTeamMember(ctx context.Context, team *Team, userID int64) error {
+       e := db.GetEngine(ctx)
        isMember, err := isTeamMember(e, team.OrgID, team.ID, userID)
        if err != nil || !isMember {
                return err
@@ -926,7 +927,7 @@ func removeTeamMember(e *xorm.Session, team *Team, userID int64) error {
        }); err != nil {
                return err
        } else if count == 0 {
-               return removeOrgUser(e, team.OrgID, userID)
+               return removeOrgUser(ctx, team.OrgID, userID)
        }
 
        return nil
@@ -934,15 +935,15 @@ func removeTeamMember(e *xorm.Session, team *Team, userID int64) error {
 
 // RemoveTeamMember removes member from given team of given organization.
 func RemoveTeamMember(team *Team, userID int64) error {
-       sess := db.NewSession(db.DefaultContext)
-       defer sess.Close()
-       if err := sess.Begin(); err != nil {
+       ctx, committer, err := db.TxContext()
+       if err != nil {
                return err
        }
-       if err := removeTeamMember(sess, team, userID); err != nil {
+       defer committer.Close()
+       if err := removeTeamMember(ctx, team, userID); err != nil {
                return err
        }
-       return sess.Commit()
+       return committer.Commit()
 }
 
 // IsUserInTeams returns if a user in some teams
index 8580702a06ce591d64fd4d4c11850f05310a6586..10ae87745821577aa0a41a7d11102086f4f8f94a 100644 (file)
@@ -29,7 +29,7 @@ func TestUser_IsOwnedBy(t *testing.T) {
                {2, 2, false}, // user2 is not an organization
                {2, 3, false},
        } {
-               org := unittest.AssertExistsAndLoadBean(t, &User{ID: testCase.OrgID}).(*User)
+               org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: testCase.OrgID}).(*Organization)
                isOwner, err := org.IsOwnedBy(testCase.UserID)
                assert.NoError(t, err)
                assert.Equal(t, testCase.ExpectedOwner, isOwner)
@@ -50,7 +50,7 @@ func TestUser_IsOrgMember(t *testing.T) {
                {2, 2, false}, // user2 is not an organization
                {2, 3, false},
        } {
-               org := unittest.AssertExistsAndLoadBean(t, &User{ID: testCase.OrgID}).(*User)
+               org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: testCase.OrgID}).(*Organization)
                isMember, err := org.IsOrgMember(testCase.UserID)
                assert.NoError(t, err)
                assert.Equal(t, testCase.ExpectedMember, isMember)
@@ -59,7 +59,7 @@ func TestUser_IsOrgMember(t *testing.T) {
 
 func TestUser_GetTeam(t *testing.T) {
        assert.NoError(t, unittest.PrepareTestDatabase())
-       org := unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+       org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
        team, err := org.GetTeam("team1")
        assert.NoError(t, err)
        assert.Equal(t, org.ID, team.OrgID)
@@ -68,56 +68,58 @@ func TestUser_GetTeam(t *testing.T) {
        _, err = org.GetTeam("does not exist")
        assert.True(t, IsErrTeamNotExist(err))
 
-       nonOrg := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
+       nonOrg := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 2}).(*Organization)
        _, err = nonOrg.GetTeam("team")
        assert.True(t, IsErrTeamNotExist(err))
 }
 
 func TestUser_GetOwnerTeam(t *testing.T) {
        assert.NoError(t, unittest.PrepareTestDatabase())
-       org := unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+       org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
        team, err := org.GetOwnerTeam()
        assert.NoError(t, err)
        assert.Equal(t, org.ID, team.OrgID)
 
-       nonOrg := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
+       nonOrg := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 2}).(*Organization)
        _, err = nonOrg.GetOwnerTeam()
        assert.True(t, IsErrTeamNotExist(err))
 }
 
 func TestUser_GetTeams(t *testing.T) {
        assert.NoError(t, unittest.PrepareTestDatabase())
-       org := unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
-       assert.NoError(t, org.LoadTeams())
-       if assert.Len(t, org.Teams, 4) {
-               assert.Equal(t, int64(1), org.Teams[0].ID)
-               assert.Equal(t, int64(2), org.Teams[1].ID)
-               assert.Equal(t, int64(12), org.Teams[2].ID)
-               assert.Equal(t, int64(7), org.Teams[3].ID)
+       org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
+       teams, err := org.LoadTeams()
+       assert.NoError(t, err)
+       if assert.Len(t, teams, 4) {
+               assert.Equal(t, int64(1), teams[0].ID)
+               assert.Equal(t, int64(2), teams[1].ID)
+               assert.Equal(t, int64(12), teams[2].ID)
+               assert.Equal(t, int64(7), teams[3].ID)
        }
 }
 
 func TestUser_GetMembers(t *testing.T) {
        assert.NoError(t, unittest.PrepareTestDatabase())
-       org := unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
-       assert.NoError(t, org.GetMembers())
-       if assert.Len(t, org.Members, 3) {
-               assert.Equal(t, int64(2), org.Members[0].ID)
-               assert.Equal(t, int64(28), org.Members[1].ID)
-               assert.Equal(t, int64(4), org.Members[2].ID)
+       org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
+       members, _, err := org.GetMembers()
+       assert.NoError(t, err)
+       if assert.Len(t, members, 3) {
+               assert.Equal(t, int64(2), members[0].ID)
+               assert.Equal(t, int64(28), members[1].ID)
+               assert.Equal(t, int64(4), members[2].ID)
        }
 }
 
 func TestUser_AddMember(t *testing.T) {
        assert.NoError(t, unittest.PrepareTestDatabase())
-       org := unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+       org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
 
        // add a user that is not a member
        unittest.AssertNotExistsBean(t, &OrgUser{UID: 5, OrgID: 3})
        prevNumMembers := org.NumMembers
        assert.NoError(t, org.AddMember(5))
        unittest.AssertExistsAndLoadBean(t, &OrgUser{UID: 5, OrgID: 3})
-       org = unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+       org = unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
        assert.Equal(t, prevNumMembers+1, org.NumMembers)
 
        // add a user that is already a member
@@ -125,7 +127,7 @@ func TestUser_AddMember(t *testing.T) {
        prevNumMembers = org.NumMembers
        assert.NoError(t, org.AddMember(4))
        unittest.AssertExistsAndLoadBean(t, &OrgUser{UID: 4, OrgID: 3})
-       org = unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+       org = unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
        assert.Equal(t, prevNumMembers, org.NumMembers)
 
        unittest.CheckConsistencyFor(t, &User{})
@@ -133,14 +135,14 @@ func TestUser_AddMember(t *testing.T) {
 
 func TestUser_RemoveMember(t *testing.T) {
        assert.NoError(t, unittest.PrepareTestDatabase())
-       org := unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+       org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
 
        // remove a user that is a member
        unittest.AssertExistsAndLoadBean(t, &OrgUser{UID: 4, OrgID: 3})
        prevNumMembers := org.NumMembers
        assert.NoError(t, org.RemoveMember(4))
        unittest.AssertNotExistsBean(t, &OrgUser{UID: 4, OrgID: 3})
-       org = unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+       org = unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
        assert.Equal(t, prevNumMembers-1, org.NumMembers)
 
        // remove a user that is not a member
@@ -148,7 +150,7 @@ func TestUser_RemoveMember(t *testing.T) {
        prevNumMembers = org.NumMembers
        assert.NoError(t, org.RemoveMember(5))
        unittest.AssertNotExistsBean(t, &OrgUser{UID: 5, OrgID: 3})
-       org = unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+       org = unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
        assert.Equal(t, prevNumMembers, org.NumMembers)
 
        unittest.CheckConsistencyFor(t, &User{}, &Team{})
@@ -156,7 +158,7 @@ func TestUser_RemoveMember(t *testing.T) {
 
 func TestUser_RemoveOrgRepo(t *testing.T) {
        assert.NoError(t, unittest.PrepareTestDatabase())
-       org := unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+       org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
        repo := unittest.AssertExistsAndLoadBean(t, &Repository{OwnerID: org.ID}).(*Repository)
 
        // remove a repo that does belong to org
@@ -183,14 +185,14 @@ func TestCreateOrganization(t *testing.T) {
 
        owner := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
        const newOrgName = "neworg"
-       org := &User{
+       org := &Organization{
                Name: newOrgName,
        }
 
        unittest.AssertNotExistsBean(t, &User{Name: newOrgName, Type: UserTypeOrganization})
        assert.NoError(t, CreateOrganization(org, owner))
        org = unittest.AssertExistsAndLoadBean(t,
-               &User{Name: newOrgName, Type: UserTypeOrganization}).(*User)
+               &Organization{Name: newOrgName, Type: UserTypeOrganization}).(*Organization)
        ownerTeam := unittest.AssertExistsAndLoadBean(t,
                &Team{Name: ownerTeamName, OrgID: org.ID}).(*Team)
        unittest.AssertExistsAndLoadBean(t, &TeamUser{UID: owner.ID, TeamID: ownerTeam.ID})
@@ -203,16 +205,16 @@ func TestCreateOrganization2(t *testing.T) {
 
        owner := unittest.AssertExistsAndLoadBean(t, &User{ID: 5}).(*User)
        const newOrgName = "neworg"
-       org := &User{
+       org := &Organization{
                Name: newOrgName,
        }
 
-       unittest.AssertNotExistsBean(t, &User{Name: newOrgName, Type: UserTypeOrganization})
+       unittest.AssertNotExistsBean(t, &Organization{Name: newOrgName, Type: UserTypeOrganization})
        err := CreateOrganization(org, owner)
        assert.Error(t, err)
        assert.True(t, IsErrUserNotAllowedCreateOrg(err))
-       unittest.AssertNotExistsBean(t, &User{Name: newOrgName, Type: UserTypeOrganization})
-       unittest.CheckConsistencyFor(t, &User{}, &Team{})
+       unittest.AssertNotExistsBean(t, &Organization{Name: newOrgName, Type: UserTypeOrganization})
+       unittest.CheckConsistencyFor(t, &Organization{}, &Team{})
 }
 
 func TestCreateOrganization3(t *testing.T) {
@@ -220,7 +222,7 @@ func TestCreateOrganization3(t *testing.T) {
        assert.NoError(t, unittest.PrepareTestDatabase())
 
        owner := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
-       org := &User{Name: "user3"}                                // should already exist
+       org := &Organization{Name: "user3"}                        // should already exist
        unittest.AssertExistsAndLoadBean(t, &User{Name: org.Name}) // sanity check
        err := CreateOrganization(org, owner)
        assert.Error(t, err)
@@ -233,10 +235,10 @@ func TestCreateOrganization4(t *testing.T) {
        assert.NoError(t, unittest.PrepareTestDatabase())
 
        owner := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
-       err := CreateOrganization(&User{Name: "assets"}, owner)
+       err := CreateOrganization(&Organization{Name: "assets"}, owner)
        assert.Error(t, err)
        assert.True(t, IsErrNameReserved(err))
-       unittest.CheckConsistencyFor(t, &User{}, &Team{})
+       unittest.CheckConsistencyFor(t, &Organization{}, &Team{})
 }
 
 func TestGetOrgByName(t *testing.T) {
@@ -478,7 +480,7 @@ func TestRemoveOrgUser(t *testing.T) {
 
 func TestUser_GetUserTeamIDs(t *testing.T) {
        assert.NoError(t, unittest.PrepareTestDatabase())
-       org := unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+       org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
        testSuccess := func(userID int64, expected []int64) {
                teamIDs, err := org.GetUserTeamIDs(userID)
                assert.NoError(t, err)
@@ -491,7 +493,7 @@ func TestUser_GetUserTeamIDs(t *testing.T) {
 
 func TestAccessibleReposEnv_CountRepos(t *testing.T) {
        assert.NoError(t, unittest.PrepareTestDatabase())
-       org := unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+       org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
        testSuccess := func(userID, expectedCount int64) {
                env, err := org.AccessibleReposEnv(userID)
                assert.NoError(t, err)
@@ -505,7 +507,7 @@ func TestAccessibleReposEnv_CountRepos(t *testing.T) {
 
 func TestAccessibleReposEnv_RepoIDs(t *testing.T) {
        assert.NoError(t, unittest.PrepareTestDatabase())
-       org := unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+       org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
        testSuccess := func(userID, _, pageSize int64, expectedRepoIDs []int64) {
                env, err := org.AccessibleReposEnv(userID)
                assert.NoError(t, err)
@@ -519,7 +521,7 @@ func TestAccessibleReposEnv_RepoIDs(t *testing.T) {
 
 func TestAccessibleReposEnv_Repos(t *testing.T) {
        assert.NoError(t, unittest.PrepareTestDatabase())
-       org := unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+       org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
        testSuccess := func(userID int64, expectedRepoIDs []int64) {
                env, err := org.AccessibleReposEnv(userID)
                assert.NoError(t, err)
@@ -538,7 +540,7 @@ func TestAccessibleReposEnv_Repos(t *testing.T) {
 
 func TestAccessibleReposEnv_MirrorRepos(t *testing.T) {
        assert.NoError(t, unittest.PrepareTestDatabase())
-       org := unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
+       org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
        testSuccess := func(userID int64, expectedRepoIDs []int64) {
                env, err := org.AccessibleReposEnv(userID)
                assert.NoError(t, err)
@@ -561,7 +563,7 @@ func TestHasOrgVisibleTypePublic(t *testing.T) {
        user3 := unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
 
        const newOrgName = "test-org-public"
-       org := &User{
+       org := &Organization{
                Name:       newOrgName,
                Visibility: structs.VisibleTypePublic,
        }
@@ -569,10 +571,10 @@ func TestHasOrgVisibleTypePublic(t *testing.T) {
        unittest.AssertNotExistsBean(t, &User{Name: org.Name, Type: UserTypeOrganization})
        assert.NoError(t, CreateOrganization(org, owner))
        org = unittest.AssertExistsAndLoadBean(t,
-               &User{Name: org.Name, Type: UserTypeOrganization}).(*User)
-       test1 := HasOrgOrUserVisible(org, owner)
-       test2 := HasOrgOrUserVisible(org, user3)
-       test3 := HasOrgOrUserVisible(org, nil)
+               &Organization{Name: org.Name, Type: UserTypeOrganization}).(*Organization)
+       test1 := HasOrgOrUserVisible(org.AsUser(), owner)
+       test2 := HasOrgOrUserVisible(org.AsUser(), user3)
+       test3 := HasOrgOrUserVisible(org.AsUser(), nil)
        assert.True(t, test1) // owner of org
        assert.True(t, test2) // user not a part of org
        assert.True(t, test3) // logged out user
@@ -584,7 +586,7 @@ func TestHasOrgVisibleTypeLimited(t *testing.T) {
        user3 := unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
 
        const newOrgName = "test-org-limited"
-       org := &User{
+       org := &Organization{
                Name:       newOrgName,
                Visibility: structs.VisibleTypeLimited,
        }
@@ -592,10 +594,10 @@ func TestHasOrgVisibleTypeLimited(t *testing.T) {
        unittest.AssertNotExistsBean(t, &User{Name: org.Name, Type: UserTypeOrganization})
        assert.NoError(t, CreateOrganization(org, owner))
        org = unittest.AssertExistsAndLoadBean(t,
-               &User{Name: org.Name, Type: UserTypeOrganization}).(*User)
-       test1 := HasOrgOrUserVisible(org, owner)
-       test2 := HasOrgOrUserVisible(org, user3)
-       test3 := HasOrgOrUserVisible(org, nil)
+               &Organization{Name: org.Name, Type: UserTypeOrganization}).(*Organization)
+       test1 := HasOrgOrUserVisible(org.AsUser(), owner)
+       test2 := HasOrgOrUserVisible(org.AsUser(), user3)
+       test3 := HasOrgOrUserVisible(org.AsUser(), nil)
        assert.True(t, test1)  // owner of org
        assert.True(t, test2)  // user not a part of org
        assert.False(t, test3) // logged out user
@@ -607,7 +609,7 @@ func TestHasOrgVisibleTypePrivate(t *testing.T) {
        user3 := unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
 
        const newOrgName = "test-org-private"
-       org := &User{
+       org := &Organization{
                Name:       newOrgName,
                Visibility: structs.VisibleTypePrivate,
        }
@@ -615,10 +617,10 @@ func TestHasOrgVisibleTypePrivate(t *testing.T) {
        unittest.AssertNotExistsBean(t, &User{Name: org.Name, Type: UserTypeOrganization})
        assert.NoError(t, CreateOrganization(org, owner))
        org = unittest.AssertExistsAndLoadBean(t,
-               &User{Name: org.Name, Type: UserTypeOrganization}).(*User)
-       test1 := HasOrgOrUserVisible(org, owner)
-       test2 := HasOrgOrUserVisible(org, user3)
-       test3 := HasOrgOrUserVisible(org, nil)
+               &Organization{Name: org.Name, Type: UserTypeOrganization}).(*Organization)
+       test1 := HasOrgOrUserVisible(org.AsUser(), owner)
+       test2 := HasOrgOrUserVisible(org.AsUser(), user3)
+       test3 := HasOrgOrUserVisible(org.AsUser(), nil)
        assert.True(t, test1)  // owner of org
        assert.False(t, test2) // user not a part of org
        assert.False(t, test3) // logged out user
index d62b3ec2b4a72c2e14e9e834df18a11692450e85..38775029262b52c7da498f048bdbb963db749a92 100644 (file)
@@ -783,7 +783,7 @@ func (repo *Repository) CanUserDelete(user *User) (bool, error) {
        }
 
        if repo.Owner.IsOrganization() {
-               isOwner, err := repo.Owner.IsOwnedBy(user.ID)
+               isOwner, err := OrgFromUser(repo.Owner).IsOwnedBy(user.ID)
                if err != nil {
                        return false, err
                } else if isOwner {
@@ -1118,10 +1118,11 @@ func CreateRepository(ctx context.Context, doer, u *User, repo *Repository, over
 
        // Give access to all members in teams with access to all repositories.
        if u.IsOrganization() {
-               if err := u.loadTeams(db.GetEngine(ctx)); err != nil {
+               teams, err := OrgFromUser(u).loadTeams(db.GetEngine(ctx))
+               if err != nil {
                        return fmt.Errorf("loadTeams: %v", err)
                }
-               for _, t := range u.Teams {
+               for _, t := range teams {
                        if t.IncludesAllRepositories {
                                if err := t.addRepository(db.GetEngine(ctx), repo); err != nil {
                                        return fmt.Errorf("addRepository: %v", err)
@@ -1444,11 +1445,6 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
        if err != nil {
                return err
        }
-       if org.IsOrganization() {
-               if err = org.loadTeams(sess); err != nil {
-                       return err
-               }
-       }
 
        repo := &Repository{OwnerID: uid}
        has, err := sess.ID(repoID).Get(repo)
@@ -1476,7 +1472,11 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
        }
 
        if org.IsOrganization() {
-               for _, t := range org.Teams {
+               teams, err := OrgFromUser(org).loadTeams(sess)
+               if err != nil {
+                       return err
+               }
+               for _, t := range teams {
                        if !t.hasRepository(sess, repoID) {
                                continue
                        } else if err = t.removeRepository(sess, repo, false); err != nil {
@@ -1790,8 +1790,8 @@ func GetUserMirrorRepositories(userID int64) ([]*Repository, error) {
                Find(&repos)
 }
 
-func getRepositoryCount(e db.Engine, u *User) (int64, error) {
-       return e.Count(&Repository{OwnerID: u.ID})
+func getRepositoryCount(e db.Engine, ownerID int64) (int64, error) {
+       return e.Count(&Repository{OwnerID: ownerID})
 }
 
 func getPublicRepositoryCount(e db.Engine, u *User) (int64, error) {
@@ -1803,8 +1803,8 @@ func getPrivateRepositoryCount(e db.Engine, u *User) (int64, error) {
 }
 
 // GetRepositoryCount returns the total number of repositories of user.
-func GetRepositoryCount(ctx context.Context, u *User) (int64, error) {
-       return getRepositoryCount(db.GetEngine(ctx), u)
+func GetRepositoryCount(ctx context.Context, ownerID int64) (int64, error) {
+       return getRepositoryCount(db.GetEngine(ctx), ownerID)
 }
 
 // GetPublicRepositoryCount returns the total number of public repositories of user.
index e6f4ea1c3fbc2a3fb38e4f2f7eb91cd9b6973962..ec1bcc04879abb502737cd64ba5265672182f81e 100644 (file)
@@ -71,7 +71,7 @@ func TestMetas(t *testing.T) {
 func TestGetRepositoryCount(t *testing.T) {
        assert.NoError(t, unittest.PrepareTestDatabase())
 
-       count, err1 := GetRepositoryCount(db.DefaultContext, &User{ID: int64(10)})
+       count, err1 := GetRepositoryCount(db.DefaultContext, 10)
        privateCount, err2 := GetPrivateRepositoryCount(&User{ID: int64(10)})
        publicCount, err3 := GetPublicRepositoryCount(&User{ID: int64(10)})
        assert.NoError(t, err1)
index 082c3d19dc0415a7fba355345f6c1b93017c43d9..7b766ff4c74c6492014c0d89b2e000840f6f7a9c 100644 (file)
@@ -299,16 +299,17 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) (err e
 
        // Remove old team-repository relations.
        if oldOwner.IsOrganization() {
-               if err := oldOwner.removeOrgRepo(sess, repo.ID); err != nil {
+               if err := OrgFromUser(oldOwner).removeOrgRepo(sess, repo.ID); err != nil {
                        return fmt.Errorf("removeOrgRepo: %v", err)
                }
        }
 
        if newOwner.IsOrganization() {
-               if err := newOwner.loadTeams(sess); err != nil {
+               teams, err := OrgFromUser(newOwner).loadTeams(sess)
+               if err != nil {
                        return fmt.Errorf("LoadTeams: %v", err)
                }
-               for _, t := range newOwner.Teams {
+               for _, t := range teams {
                        if t.IncludesAllRepositories {
                                if err := t.addRepository(sess, repo); err != nil {
                                        return fmt.Errorf("addRepository: %v", err)
index 1bdb435793fe7b8d94b89a6b429e071e98aa756b..db2345cb376647353a58695b8ded4c8521cf8b05 100644 (file)
@@ -161,9 +161,6 @@ type User struct {
        // For organization
        NumTeams                  int
        NumMembers                int
-       Teams                     []*Team             `xorm:"-"`
-       Members                   UserList            `xorm:"-"`
-       MembersIsPublic           map[int64]bool      `xorm:"-"`
        Visibility                structs.VisibleType `xorm:"NOT NULL DEFAULT 0"`
        RepoAdminChangeTeamAccess bool                `xorm:"NOT NULL DEFAULT false"`
 
@@ -516,20 +513,6 @@ func (u *User) IsUserOrgOwner(orgID int64) bool {
        return isOwner
 }
 
-// HasMemberWithUserID returns true if user with userID is part of the u organisation.
-func (u *User) HasMemberWithUserID(userID int64) bool {
-       return u.hasMemberWithUserID(db.GetEngine(db.DefaultContext), userID)
-}
-
-func (u *User) hasMemberWithUserID(e db.Engine, userID int64) bool {
-       isMember, err := isOrganizationMember(e, u.ID, userID)
-       if err != nil {
-               log.Error("IsOrganizationMember: %v", err)
-               return false
-       }
-       return isMember
-}
-
 // IsPublicMember returns true if user public his/her membership in given organization.
 func (u *User) IsPublicMember(orgID int64) bool {
        isMember, err := IsPublicMembership(orgID, u.ID)
index 2b8518c92f2e1f17443cf9ebbae704aef3d5e691..c16a7b6eec498ba5535d37dc0554239fdfc0f741 100644 (file)
@@ -33,10 +33,11 @@ func TestUserListIsPublicMember(t *testing.T) {
 }
 
 func testUserListIsPublicMember(t *testing.T, orgID int64, expected map[int64]bool) {
-       org, err := GetUserByID(orgID)
+       org, err := GetOrgByID(orgID)
        assert.NoError(t, err)
-       assert.NoError(t, org.GetMembers())
-       assert.Equal(t, expected, org.MembersIsPublic)
+       _, membersIsPublic, err := org.GetMembers()
+       assert.NoError(t, err)
+       assert.Equal(t, expected, membersIsPublic)
 }
 
 func TestUserListIsUserOrgOwner(t *testing.T) {
@@ -59,10 +60,11 @@ func TestUserListIsUserOrgOwner(t *testing.T) {
 }
 
 func testUserListIsUserOrgOwner(t *testing.T, orgID int64, expected map[int64]bool) {
-       org, err := GetUserByID(orgID)
+       org, err := GetOrgByID(orgID)
+       assert.NoError(t, err)
+       members, _, err := org.GetMembers()
        assert.NoError(t, err)
-       assert.NoError(t, org.GetMembers())
-       assert.Equal(t, expected, org.Members.IsUserOrgOwner(orgID))
+       assert.Equal(t, expected, members.IsUserOrgOwner(orgID))
 }
 
 func TestUserListIsTwoFaEnrolled(t *testing.T) {
@@ -85,8 +87,9 @@ func TestUserListIsTwoFaEnrolled(t *testing.T) {
 }
 
 func testUserListIsTwoFaEnrolled(t *testing.T, orgID int64, expected map[int64]bool) {
-       org, err := GetUserByID(orgID)
+       org, err := GetOrgByID(orgID)
+       assert.NoError(t, err)
+       members, _, err := org.GetMembers()
        assert.NoError(t, err)
-       assert.NoError(t, org.GetMembers())
-       assert.Equal(t, expected, org.Members.GetTwoFaStatus())
+       assert.Equal(t, expected, members.GetTwoFaStatus())
 }
index 3a2c8c559d0c01911ac12589ce642b750e501625..6d86fa6ed2270b86083c38ce82da5e4ca86e1d0c 100644 (file)
@@ -10,6 +10,6 @@ import (
 
 // APIOrganization contains organization and team
 type APIOrganization struct {
-       Organization *models.User
+       Organization *models.Organization
        Team         *models.Team
 }
index d7257361fd82e94d2dbc502f299ee5bcc1c3c77c..54cc3a9d8c538a0431a081e0d758d22842df4eef 100644 (file)
@@ -18,11 +18,12 @@ type Organization struct {
        IsMember         bool
        IsTeamMember     bool // Is member of team.
        IsTeamAdmin      bool // In owner team or team that has admin permission level.
-       Organization     *models.User
+       Organization     *models.Organization
        OrgLink          string
        CanCreateOrgRepo bool
 
-       Team *models.Team
+       Team  *models.Team
+       Teams []*models.Team
 }
 
 // HandleOrgAssignment handles organization assignment
@@ -49,7 +50,7 @@ func HandleOrgAssignment(ctx *Context, args ...bool) {
        orgName := ctx.Params(":org")
 
        var err error
-       ctx.Org.Organization, err = models.GetUserByName(orgName)
+       ctx.Org.Organization, err = models.GetOrgByName(orgName)
        if err != nil {
                if models.IsErrUserNotExist(err) {
                        redirectUserID, err := user_model.LookupUserRedirect(orgName)
@@ -68,12 +69,6 @@ func HandleOrgAssignment(ctx *Context, args ...bool) {
        org := ctx.Org.Organization
        ctx.Data["Org"] = org
 
-       // Force redirection when username is actually a user.
-       if !org.IsOrganization() {
-               ctx.Redirect(org.HomeLink())
-               return
-       }
-
        // Admin has super access.
        if ctx.IsSigned && ctx.User.IsAdmin {
                ctx.Org.IsOwner = true
@@ -118,18 +113,19 @@ func HandleOrgAssignment(ctx *Context, args ...bool) {
        ctx.Data["IsOrganizationMember"] = ctx.Org.IsMember
        ctx.Data["CanCreateOrgRepo"] = ctx.Org.CanCreateOrgRepo
 
-       ctx.Org.OrgLink = org.OrganisationLink()
+       ctx.Org.OrgLink = org.AsUser().OrganisationLink()
        ctx.Data["OrgLink"] = ctx.Org.OrgLink
 
        // Team.
        if ctx.Org.IsMember {
                if ctx.Org.IsOwner {
-                       if err := org.LoadTeams(); err != nil {
+                       ctx.Org.Teams, err = org.LoadTeams()
+                       if err != nil {
                                ctx.ServerError("LoadTeams", err)
                                return
                        }
                } else {
-                       org.Teams, err = org.GetUserTeams(ctx.User.ID)
+                       ctx.Org.Teams, err = org.GetUserTeams(ctx.User.ID)
                        if err != nil {
                                ctx.ServerError("GetUserTeams", err)
                                return
@@ -140,7 +136,7 @@ func HandleOrgAssignment(ctx *Context, args ...bool) {
        teamName := ctx.Params(":team")
        if len(teamName) > 0 {
                teamExists := false
-               for _, team := range org.Teams {
+               for _, team := range ctx.Org.Teams {
                        if team.LowerName == strings.ToLower(teamName) {
                                teamExists = true
                                ctx.Org.Team = team
index 80d5ffff0593a569ae2dc43f87fde0fa6e45a615..4229e6cc7d8cb584e59b0a0f3f835b775ec29fb2 100644 (file)
@@ -277,10 +277,10 @@ func ToDeployKey(apiLink string, key *models.DeployKey) *api.DeployKey {
 }
 
 // ToOrganization convert models.User to api.Organization
-func ToOrganization(org *models.User) *api.Organization {
+func ToOrganization(org *models.Organization) *api.Organization {
        return &api.Organization{
                ID:                        org.ID,
-               AvatarURL:                 org.AvatarLink(),
+               AvatarURL:                 org.AsUser().AvatarLink(),
                UserName:                  org.Name,
                FullName:                  org.FullName,
                Description:               org.Description,
index 55fc5155881cbeb14be58b2922b9ff695a2a5205..12fc7afeeb3962b39b56bab7ba4dcff1658a94a9 100644 (file)
@@ -36,7 +36,7 @@ func TestIncludesAllRepositoriesTeams(t *testing.T) {
        assert.NoError(t, err, "GetUserByID")
 
        // Create org.
-       org := &models.User{
+       org := &models.Organization{
                Name:       "All_repo",
                IsActive:   true,
                Type:       models.UserTypeOrganization,
@@ -52,7 +52,7 @@ func TestIncludesAllRepositoriesTeams(t *testing.T) {
        // Create repos.
        repoIds := make([]int64, 0)
        for i := 0; i < 3; i++ {
-               r, err := CreateRepository(user, org, models.CreateRepoOptions{Name: fmt.Sprintf("repo-%d", i)})
+               r, err := CreateRepository(user, org.AsUser(), models.CreateRepoOptions{Name: fmt.Sprintf("repo-%d", i)})
                assert.NoError(t, err, "CreateRepository %d", i)
                if r != nil {
                        repoIds = append(repoIds, r.ID)
@@ -114,8 +114,7 @@ func TestIncludesAllRepositoriesTeams(t *testing.T) {
        }
 
        // Create repo and check teams repositories.
-       org.Teams = nil // Reset teams to allow their reloading.
-       r, err := CreateRepository(user, org, models.CreateRepoOptions{Name: "repo-last"})
+       r, err := CreateRepository(user, org.AsUser(), models.CreateRepoOptions{Name: "repo-last"})
        assert.NoError(t, err, "CreateRepository last")
        if r != nil {
                repoIds = append(repoIds, r.ID)
index 871ba617ad20689cbabe4e1fa08284d2dd4b9b37..5eec5a73143d3e27c5c2433f45d1935d252a6cb6 100644 (file)
@@ -50,7 +50,7 @@ func MigrateRepositoryGitData(ctx context.Context, u *models.User, repo *models.
        repoPath := models.RepoPath(u.Name, opts.RepoName)
 
        if u.IsOrganization() {
-               t, err := u.GetOwnerTeam()
+               t, err := models.OrgFromUser(u).GetOwnerTeam()
                if err != nil {
                        return nil, err
                }
index 5da87fa7df1e0a9d64529b8510482176b8acc6cc..2633865d2c1e53541d4bbb18a9612a51d2d26747 100644 (file)
@@ -54,7 +54,7 @@ func CreateOrg(ctx *context.APIContext) {
                visibility = api.VisibilityModes[form.Visibility]
        }
 
-       org := &models.User{
+       org := &models.Organization{
                Name:        form.UserName,
                FullName:    form.FullName,
                Description: form.Description,
@@ -117,7 +117,7 @@ func GetAllOrgs(ctx *context.APIContext) {
        }
        orgs := make([]*api.Organization, len(users))
        for i := range users {
-               orgs[i] = convert.ToOrganization(users[i])
+               orgs[i] = convert.ToOrganization(models.OrgFromUser(users[i]))
        }
 
        ctx.SetLinkHeader(int(maxResults), listOptions.PageSize)
index 6c81616170f1d58f5b6f9d6f32093dd20ee14c50..b9d1fa2f679c4fdc88a774938583e1898bb25fd1 100644 (file)
@@ -59,7 +59,7 @@ func ListHooks(ctx *context.APIContext) {
 
        hooks := make([]*api.Hook, len(orgHooks))
        for i, hook := range orgHooks {
-               hooks[i] = convert.ToHook(ctx.Org.Organization.HomeLink(), hook)
+               hooks[i] = convert.ToHook(ctx.Org.Organization.AsUser().HomeLink(), hook)
        }
 
        ctx.SetTotalCountHeader(count)
@@ -95,7 +95,7 @@ func GetHook(ctx *context.APIContext) {
        if err != nil {
                return
        }
-       ctx.JSON(http.StatusOK, convert.ToHook(org.HomeLink(), hook))
+       ctx.JSON(http.StatusOK, convert.ToHook(org.AsUser().HomeLink(), hook))
 }
 
 // CreateHook create a hook for an organization
index b3752841898d9d088c22e0ec5e578f3572a89d99..7d4c12d3648d0f08be50563eb9cf9d9f3c4e452b 100644 (file)
@@ -56,7 +56,7 @@ func ListLabels(ctx *context.APIContext) {
        }
 
        ctx.SetTotalCountHeader(count)
-       ctx.JSON(http.StatusOK, convert.ToLabelList(labels, nil, ctx.Org.Organization))
+       ctx.JSON(http.StatusOK, convert.ToLabelList(labels, nil, ctx.Org.Organization.AsUser()))
 }
 
 // CreateLabel create a label for a repository
@@ -104,7 +104,7 @@ func CreateLabel(ctx *context.APIContext) {
                return
        }
 
-       ctx.JSON(http.StatusCreated, convert.ToLabel(label, nil, ctx.Org.Organization))
+       ctx.JSON(http.StatusCreated, convert.ToLabel(label, nil, ctx.Org.Organization.AsUser()))
 }
 
 // GetLabel get label by organization and label id
@@ -149,7 +149,7 @@ func GetLabel(ctx *context.APIContext) {
                return
        }
 
-       ctx.JSON(http.StatusOK, convert.ToLabel(label, nil, ctx.Org.Organization))
+       ctx.JSON(http.StatusOK, convert.ToLabel(label, nil, ctx.Org.Organization.AsUser()))
 }
 
 // EditLabel modify a label for an Organization
@@ -214,7 +214,7 @@ func EditLabel(ctx *context.APIContext) {
                return
        }
 
-       ctx.JSON(http.StatusOK, convert.ToLabel(label, nil, ctx.Org.Organization))
+       ctx.JSON(http.StatusOK, convert.ToLabel(label, nil, ctx.Org.Organization.AsUser()))
 }
 
 // DeleteLabel delete a label for an organization
index e82e8552e0828c217790d69c7bda14a960e5dc8f..bbf127f891446331a4d7795138f36343201d3101 100644 (file)
@@ -31,7 +31,7 @@ func listUserOrgs(ctx *context.APIContext, u *models.User) {
        }
 
        maxResults := len(orgs)
-       orgs, _ = util.PaginateSlice(orgs, listOptions.Page, listOptions.PageSize).([]*models.User)
+       orgs, _ = util.PaginateSlice(orgs, listOptions.Page, listOptions.PageSize).([]*models.Organization)
 
        apiOrgs := make([]*api.Organization, len(orgs))
        for i := range orgs {
@@ -141,7 +141,8 @@ func GetUserOrgsPermissions(ctx *context.APIContext) {
                return
        }
 
-       authorizeLevel, err := o.GetOrgUserMaxAuthorizeLevel(u.ID)
+       org := models.OrgFromUser(o)
+       authorizeLevel, err := org.GetOrgUserMaxAuthorizeLevel(u.ID)
        if err != nil {
                ctx.Error(http.StatusInternalServerError, "GetOrgUserAuthorizeLevel", err)
                return
@@ -160,7 +161,7 @@ func GetUserOrgsPermissions(ctx *context.APIContext) {
                op.IsOwner = true
        }
 
-       op.CanCreateRepository, err = o.CanCreateOrgRepo(u.ID)
+       op.CanCreateRepository, err = org.CanCreateOrgRepo(u.ID)
        if err != nil {
                ctx.Error(http.StatusInternalServerError, "CanCreateOrgRepo", err)
                return
@@ -212,7 +213,7 @@ func GetAll(ctx *context.APIContext) {
        }
        orgs := make([]*api.Organization, len(publicOrgs))
        for i := range publicOrgs {
-               orgs[i] = convert.ToOrganization(publicOrgs[i])
+               orgs[i] = convert.ToOrganization(models.OrgFromUser(publicOrgs[i]))
        }
 
        ctx.SetLinkHeader(int(maxResults), listOptions.PageSize)
@@ -252,7 +253,7 @@ func Create(ctx *context.APIContext) {
                visibility = api.VisibilityModes[form.Visibility]
        }
 
-       org := &models.User{
+       org := &models.Organization{
                Name:                      form.UserName,
                FullName:                  form.FullName,
                Description:               form.Description,
@@ -295,7 +296,7 @@ func Get(ctx *context.APIContext) {
        //   "200":
        //     "$ref": "#/responses/Organization"
 
-       if !models.HasOrgOrUserVisible(ctx.Org.Organization, ctx.User) {
+       if !models.HasOrgOrUserVisible(ctx.Org.Organization.AsUser(), ctx.User) {
                ctx.NotFound("HasOrgOrUserVisible", nil)
                return
        }
@@ -337,7 +338,7 @@ func Edit(ctx *context.APIContext) {
        if form.RepoAdminChangeTeamAccess != nil {
                org.RepoAdminChangeTeamAccess = *form.RepoAdminChangeTeamAccess
        }
-       if err := models.UpdateUserCols(org,
+       if err := models.UpdateUserCols(org.AsUser(),
                "full_name", "description", "website", "location",
                "visibility", "repo_admin_change_team_access",
        ); err != nil {
index 0dc1b68aee00eeaf580a4c2d964a93e64ac6d0cf..e78e4878953194e04f14c3ee2a5b6a2bfc632b38 100644 (file)
@@ -102,7 +102,7 @@ func ListUserTeams(ctx *context.APIContext) {
        for i := range teams {
                apiOrg, ok := cache[teams[i].OrgID]
                if !ok {
-                       org, err := models.GetUserByID(teams[i].OrgID)
+                       org, err := models.GetOrgByID(teams[i].OrgID)
                        if err != nil {
                                ctx.Error(http.StatusInternalServerError, "GetUserByID", err)
                                return
index b3504faad9dd1f3b1db9320e2a68ec68e6c89693..45d3c815a7142e73c7611bd04388d38af1bbc56b 100644 (file)
@@ -120,7 +120,7 @@ func CreateFork(ctx *context.APIContext) {
                        ctx.Error(http.StatusForbidden, "isMemberNot", fmt.Sprintf("User is no Member of Organisation '%s'", org.Name))
                        return
                }
-               forker = org
+               forker = org.AsUser()
        }
 
        fork, err := repo_service.ForkRepository(ctx.User, forker, models.ForkRepoOptions{
index 00390dfb5f54de8c67c832ea2f29d0d943a6970c..1880a88367066c02f0759c5eda5145c500313208 100644 (file)
@@ -86,7 +86,7 @@ func Migrate(ctx *context.APIContext) {
 
                if repoOwner.IsOrganization() {
                        // Check ownership of organization.
-                       isOwner, err := repoOwner.IsOwnedBy(ctx.User.ID)
+                       isOwner, err := models.OrgFromUser(repoOwner).IsOwnedBy(ctx.User.ID)
                        if err != nil {
                                ctx.Error(http.StatusInternalServerError, "IsOwnedBy", err)
                                return
index 22f9da614d8814949a845827ef21801c6404be04..872ce228713a01a6bfee1df5f29061b71da7bacc 100644 (file)
@@ -393,7 +393,7 @@ func Generate(ctx *context.APIContext) {
                }
 
                if !ctx.User.IsAdmin {
-                       canCreate, err := ctxUser.CanCreateOrgRepo(ctx.User.ID)
+                       canCreate, err := models.OrgFromUser(ctxUser).CanCreateOrgRepo(ctx.User.ID)
                        if err != nil {
                                ctx.ServerError("CanCreateOrgRepo", err)
                                return
@@ -489,7 +489,7 @@ func CreateOrgRepo(ctx *context.APIContext) {
                return
        }
 
-       if !models.HasOrgOrUserVisible(org, ctx.User) {
+       if !models.HasOrgOrUserVisible(org.AsUser(), ctx.User) {
                ctx.NotFound("HasOrgOrUserVisible", nil)
                return
        }
@@ -504,7 +504,7 @@ func CreateOrgRepo(ctx *context.APIContext) {
                        return
                }
        }
-       CreateUserRepo(ctx, org, *opt)
+       CreateUserRepo(ctx, org.AsUser(), *opt)
 }
 
 // Get one repository
index c13a2e4857360f61e9b959df7b52dd9fb9a9dd15..f16e2bb081fb6b1bdc931cb2c5a4e8f4660431cf 100644 (file)
@@ -64,7 +64,7 @@ func Transfer(ctx *context.APIContext) {
        }
 
        if newOwner.Type == models.UserTypeOrganization {
-               if !ctx.User.IsAdmin && newOwner.Visibility == api.VisibleTypePrivate && !newOwner.HasMemberWithUserID(ctx.User.ID) {
+               if !ctx.User.IsAdmin && newOwner.Visibility == api.VisibleTypePrivate && !models.OrgFromUser(newOwner).HasMemberWithUserID(ctx.User.ID) {
                        // The user shouldn't know about this organization
                        ctx.Error(http.StatusNotFound, "", "The new owner does not exist or cannot be found")
                        return
@@ -78,7 +78,7 @@ func Transfer(ctx *context.APIContext) {
                        return
                }
 
-               org := convert.ToOrganization(newOwner)
+               org := convert.ToOrganization(models.OrgFromUser(newOwner))
                for _, tID := range *opts.TeamIDs {
                        team, err := models.GetTeamByID(tID)
                        if err != nil {
index 5116c17ab2afeaa19ea57eded6fea65483cc9edd..3c9a17a0bef3db8ff77f4f9b350614ad6df9ab32 100644 (file)
@@ -157,5 +157,5 @@ func ListOrgRepos(ctx *context.APIContext) {
        //   "200":
        //     "$ref": "#/responses/RepositoryList"
 
-       listUserRepos(ctx, ctx.Org.Organization, ctx.IsSigned)
+       listUserRepos(ctx, ctx.Org.Organization.AsUser(), ctx.IsSigned)
 }
index aef9b8f4ce4b508a8f01d5e2499a9696c0196d19..1f0a35ce22aa33e8c8658975763779487536a006 100644 (file)
@@ -75,7 +75,7 @@ func AddOrgHook(ctx *context.APIContext, form *api.CreateHookOption) {
        org := ctx.Org.Organization
        hook, ok := addHook(ctx, form, org.ID, 0)
        if ok {
-               ctx.JSON(http.StatusCreated, convert.ToHook(org.HomeLink(), hook))
+               ctx.JSON(http.StatusCreated, convert.ToHook(org.AsUser().HomeLink(), hook))
        }
 }
 
@@ -185,7 +185,7 @@ func EditOrgHook(ctx *context.APIContext, form *api.EditHookOption, hookID int64
        if err != nil {
                return
        }
-       ctx.JSON(http.StatusOK, convert.ToHook(org.HomeLink(), updated))
+       ctx.JSON(http.StatusOK, convert.ToHook(org.AsUser().HomeLink(), updated))
 }
 
 // EditRepoHook edit webhook `w` according to `form`. Writes to `ctx` accordingly
index 89bd12a18f78f0759956938d5a7a24b4185803c1..0752fa12cb93755d21fdadd3e2487e8a92c55e59 100644 (file)
@@ -30,7 +30,7 @@ func Home(ctx *context.Context) {
 
        org := ctx.Org.Organization
 
-       if !models.HasOrgOrUserVisible(org, ctx.User) {
+       if !models.HasOrgOrUserVisible(org.AsUser(), ctx.User) {
                ctx.NotFound("HasOrgOrUserVisible", nil)
                return
        }
@@ -140,7 +140,7 @@ func Home(ctx *context.Context) {
        ctx.Data["Total"] = count
        ctx.Data["MembersTotal"] = membersCount
        ctx.Data["Members"] = members
-       ctx.Data["Teams"] = org.Teams
+       ctx.Data["Teams"] = ctx.Org.Teams
 
        ctx.Data["DisableNewPullMirrors"] = setting.Mirror.DisableNewPull
 
index beba3daca4070fad9528b11f6bf3b5e02af71f7b..6722f8d104c4326b3b56b8959a504f62be82a5cd 100644 (file)
@@ -49,7 +49,7 @@ func CreatePost(ctx *context.Context) {
                return
        }
 
-       org := &models.User{
+       org := &models.Organization{
                Name:                      form.OrgName,
                IsActive:                  true,
                Type:                      models.UserTypeOrganization,
@@ -75,5 +75,5 @@ func CreatePost(ctx *context.Context) {
        }
        log.Trace("Organization created: %s", org.Name)
 
-       ctx.Redirect(org.DashboardLink())
+       ctx.Redirect(org.AsUser().DashboardLink())
 }
index f27cb40838038b0590c7e68bc29490d0c132b396..f05dbd8bc1525de6c934e908ff90008562d095c7 100644 (file)
@@ -68,7 +68,7 @@ func SettingsPost(ctx *context.Context) {
                        ctx.Data["OrgName"] = true
                        ctx.RenderWithErr(ctx.Tr("form.username_been_taken"), tplSettingsOptions, &form)
                        return
-               } else if err = models.ChangeUserName(org, form.Name); err != nil {
+               } else if err = models.ChangeUserName(org.AsUser(), form.Name); err != nil {
                        if err == models.ErrUserNameIllegal {
                                ctx.Data["OrgName"] = true
                                ctx.RenderWithErr(ctx.Tr("form.illegal_username"), tplSettingsOptions, &form)
@@ -100,18 +100,20 @@ func SettingsPost(ctx *context.Context) {
        visibilityChanged := form.Visibility != org.Visibility
        org.Visibility = form.Visibility
 
-       if err := models.UpdateUser(org); err != nil {
+       if err := models.UpdateUser(org.AsUser()); err != nil {
                ctx.ServerError("UpdateUser", err)
                return
        }
 
        // update forks visibility
        if visibilityChanged {
-               if err := org.GetRepositories(db.ListOptions{Page: 1, PageSize: org.NumRepos}); err != nil {
+               repos, _, err := models.GetUserRepositories(&models.SearchRepoOptions{
+                       Actor: org.AsUser(), Private: true, ListOptions: db.ListOptions{Page: 1, PageSize: org.NumRepos}})
+               if err != nil {
                        ctx.ServerError("GetRepositories", err)
                        return
                }
-               for _, repo := range org.Repos {
+               for _, repo := range repos {
                        repo.OwnerName = org.Name
                        if err := models.UpdateRepository(repo, true); err != nil {
                                ctx.ServerError("UpdateRepository", err)
@@ -134,7 +136,7 @@ func SettingsPost(ctx *context.Context) {
 func SettingsAvatar(ctx *context.Context) {
        form := web.GetForm(ctx).(*forms.AvatarForm)
        form.Source = forms.AvatarLocal
-       if err := userSetting.UpdateAvatarSetting(ctx, form, ctx.Org.Organization); err != nil {
+       if err := userSetting.UpdateAvatarSetting(ctx, form, ctx.Org.Organization.AsUser()); err != nil {
                ctx.Flash.Error(err.Error())
        } else {
                ctx.Flash.Success(ctx.Tr("org.settings.update_avatar_success"))
@@ -145,7 +147,7 @@ func SettingsAvatar(ctx *context.Context) {
 
 // SettingsDeleteAvatar response for delete avatar on settings page
 func SettingsDeleteAvatar(ctx *context.Context) {
-       if err := ctx.Org.Organization.DeleteAvatar(); err != nil {
+       if err := ctx.Org.Organization.AsUser().DeleteAvatar(); err != nil {
                ctx.Flash.Error(err.Error())
        }
 
index 28ffac4dd39bdc846fbdedb70e517d9b6f3fee40..ac6a42904a87d0f334017b32a3de16548b7c51cd 100644 (file)
@@ -38,13 +38,13 @@ func Teams(ctx *context.Context) {
        ctx.Data["Title"] = org.FullName
        ctx.Data["PageIsOrgTeams"] = true
 
-       for _, t := range org.Teams {
+       for _, t := range ctx.Org.Teams {
                if err := t.GetMembers(&models.SearchMembersOptions{}); err != nil {
                        ctx.ServerError("GetMembers", err)
                        return
                }
        }
-       ctx.Data["Teams"] = org.Teams
+       ctx.Data["Teams"] = ctx.Org.Teams
 
        ctx.HTML(http.StatusOK, tplTeams)
 }
@@ -158,7 +158,7 @@ func TeamsAction(ctx *context.Context) {
        case "team":
                ctx.Redirect(ctx.Org.OrgLink + "/teams/" + url.PathEscape(ctx.Org.Team.LowerName))
        case "home":
-               ctx.Redirect(ctx.Org.Organization.HomeLink())
+               ctx.Redirect(ctx.Org.Organization.AsUser().HomeLink())
        default:
                ctx.Redirect(ctx.Org.OrgLink + "/teams")
        }
index 95363258e9d554a45f7c59f58964b558ec1dc250..129287b96adde221c42650f68e26753f452405d7 100644 (file)
@@ -2644,13 +2644,15 @@ func handleTeamMentions(ctx *context.Context) {
                return
        }
 
-       isAdmin := false
+       var isAdmin bool
        var err error
+       var teams []*models.Team
+       var org = models.OrgFromUser(ctx.Repo.Owner)
        // Admin has super access.
        if ctx.User.IsAdmin {
                isAdmin = true
        } else {
-               isAdmin, err = ctx.Repo.Owner.IsOwnedBy(ctx.User.ID)
+               isAdmin, err = org.IsOwnedBy(ctx.User.ID)
                if err != nil {
                        ctx.ServerError("IsOwnedBy", err)
                        return
@@ -2658,19 +2660,20 @@ func handleTeamMentions(ctx *context.Context) {
        }
 
        if isAdmin {
-               if err := ctx.Repo.Owner.LoadTeams(); err != nil {
+               teams, err = org.LoadTeams()
+               if err != nil {
                        ctx.ServerError("LoadTeams", err)
                        return
                }
        } else {
-               ctx.Repo.Owner.Teams, err = ctx.Repo.Owner.GetUserTeams(ctx.User.ID)
+               teams, err = org.GetUserTeams(ctx.User.ID)
                if err != nil {
                        ctx.ServerError("GetUserTeams", err)
                        return
                }
        }
 
-       ctx.Data["MentionableTeams"] = ctx.Repo.Owner.Teams
+       ctx.Data["MentionableTeams"] = teams
        ctx.Data["MentionableTeamsOrg"] = ctx.Repo.Owner.Name
        ctx.Data["MentionableTeamsOrgAvatar"] = ctx.Repo.Owner.AvatarLink()
 }
index b97f57175b4cd85e460899a9d766d5a386f99b02..c6fa8c4c8c2c795fc468bbad41f6fa75a5c1ba50 100644 (file)
@@ -88,7 +88,7 @@ func RetrieveLabels(ctx *context.Context) {
                                ctx.ServerError("org.IsOwnedBy", err)
                                return
                        }
-                       ctx.Org.OrgLink = org.OrganisationLink()
+                       ctx.Org.OrgLink = org.AsUser().OrganisationLink()
                        ctx.Data["IsOrganizationOwner"] = ctx.Org.IsOwner
                        ctx.Data["OrganizationLink"] = ctx.Org.OrgLink
                }
index 43372782143464077be5d96575274de469156f37..d5aa480d1f706e680131f826ccebe7cb2032bbd8 100644 (file)
@@ -217,7 +217,7 @@ func ForkPost(ctx *context.Context) {
 
        // Check ownership of organization.
        if ctxUser.IsOrganization() {
-               isOwner, err := ctxUser.IsOwnedBy(ctx.User.ID)
+               isOwner, err := models.OrgFromUser(ctxUser).IsOwnedBy(ctx.User.ID)
                if err != nil {
                        ctx.ServerError("IsOwnedBy", err)
                        return
index 5e15415d6a7d513a841c138d8caab72095a2a573..2d6189824d7783b397b1daca26d1ea44566cad5f 100644 (file)
@@ -94,7 +94,7 @@ func checkContextUser(ctx *context.Context, uid int64) *models.User {
                return nil
        }
        if !ctx.User.IsAdmin {
-               canCreate, err := org.CanCreateOrgRepo(ctx.User.ID)
+               canCreate, err := models.OrgFromUser(org).CanCreateOrgRepo(ctx.User.ID)
                if err != nil {
                        ctx.ServerError("CanCreateOrgRepo", err)
                        return nil
index 641052316c266e0e333dbc7d869799d59c40a882..9b5f635988b7ac878f4531914db32b5f3d704b21 100644 (file)
@@ -588,7 +588,7 @@ func SettingsPost(ctx *context.Context) {
                }
 
                if newOwner.Type == models.UserTypeOrganization {
-                       if !ctx.User.IsAdmin && newOwner.Visibility == structs.VisibleTypePrivate && !newOwner.HasMemberWithUserID(ctx.User.ID) {
+                       if !ctx.User.IsAdmin && newOwner.Visibility == structs.VisibleTypePrivate && !models.OrgFromUser(newOwner).HasMemberWithUserID(ctx.User.ID) {
                                // The user shouldn't know about this organization
                                ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_owner_name"), tplSettingsOptions, nil)
                                return
@@ -879,7 +879,7 @@ func AddTeamPost(ctx *context.Context) {
                return
        }
 
-       team, err := ctx.Repo.Owner.GetTeam(name)
+       team, err := models.OrgFromUser(ctx.Repo.Owner).GetTeam(name)
        if err != nil {
                if models.IsErrTeamNotExist(err) {
                        ctx.Flash.Error(ctx.Tr("form.team_not_exist"))
index 32105b1d43cd98578992427b71b1759322bc48a2..b13dfae6839737aa15fb46e2c419a31b5a78dae7 100644 (file)
@@ -156,7 +156,7 @@ func SettingsProtectedBranch(c *context.Context) {
        }
 
        if c.Repo.Owner.IsOrganization() {
-               teams, err := c.Repo.Owner.TeamsWithAccessToRepo(c.Repo.Repository.ID, models.AccessModeRead)
+               teams, err := models.OrgFromUser(c.Repo.Owner).TeamsWithAccessToRepo(c.Repo.Repository.ID, models.AccessModeRead)
                if err != nil {
                        c.ServerError("Repo.Owner.TeamsWithAccessToRepo", err)
                        return
index b4d268759c7ff5e327856c8ea0afc16c2b2ff022..4383b6214affd020c3052d8436c664bdb2d72732 100644 (file)
@@ -149,7 +149,7 @@ func setTagsContext(ctx *context.Context) error {
        ctx.Data["Users"] = users
 
        if ctx.Repo.Owner.IsOrganization() {
-               teams, err := ctx.Repo.Owner.TeamsWithAccessToRepo(ctx.Repo.Repository.ID, models.AccessModeRead)
+               teams, err := models.OrgFromUser(ctx.Repo.Owner).TeamsWithAccessToRepo(ctx.Repo.Repository.ID, models.AccessModeRead)
                if err != nil {
                        ctx.ServerError("Repo.Owner.TeamsWithAccessToRepo", err)
                        return err
index b9f5d044fa5527ec361899ff74aedd29954d6d7e..c0ecd0c2a0f11ca483393687132d0258ad8fa0be 100644 (file)
@@ -47,8 +47,8 @@ func getDashboardContextUser(ctx *context.Context) *models.User {
        ctxUser := ctx.User
        orgName := ctx.Params(":org")
        if len(orgName) > 0 {
-               ctxUser = ctx.Org.Organization
-               ctx.Data["Teams"] = ctx.Org.Organization.Teams
+               ctxUser = ctx.Org.Organization.AsUser()
+               ctx.Data["Teams"] = ctx.Org.Teams
        }
        ctx.Data["ContextUser"] = ctxUser
 
@@ -97,9 +97,9 @@ func Dashboard(ctx *context.Context) {
        if ctxUser.IsOrganization() {
                var env models.AccessibleReposEnvironment
                if ctx.Org.Team != nil {
-                       env = ctxUser.AccessibleTeamReposEnv(ctx.Org.Team)
+                       env = models.OrgFromUser(ctxUser).AccessibleTeamReposEnv(ctx.Org.Team)
                } else {
-                       env, err = ctxUser.AccessibleReposEnv(ctx.User.ID)
+                       env, err = models.OrgFromUser(ctxUser).AccessibleReposEnv(ctx.User.ID)
                        if err != nil {
                                ctx.ServerError("AccessibleReposEnv", err)
                                return
@@ -756,9 +756,9 @@ func getActiveTeamOrOrgRepoIds(ctxUser *models.User, team *models.Team, unitType
        var env models.AccessibleReposEnvironment
 
        if team != nil {
-               env = ctxUser.AccessibleTeamReposEnv(team)
+               env = models.OrgFromUser(ctxUser).AccessibleTeamReposEnv(team)
        } else {
-               env, err = ctxUser.AccessibleReposEnv(ctxUser.ID)
+               env, err = models.OrgFromUser(ctxUser).AccessibleReposEnv(ctxUser.ID)
                if err != nil {
                        return nil, fmt.Errorf("AccessibleReposEnv: %v", err)
                }
index 3210d033d3c2260d296ed4673debb0b6e6c77e8c..7b1854c52104f339112124277264d2b304a91be3 100644 (file)
@@ -283,11 +283,11 @@ func getOAuthGroupsForUser(user *models.User) ([]string, error) {
        var groups []string
        for _, org := range orgs {
                groups = append(groups, org.Name)
-
-               if err := org.LoadTeams(); err != nil {
+               teams, err := org.LoadTeams()
+               if err != nil {
                        return nil, fmt.Errorf("LoadTeams: %v", err)
                }
-               for _, team := range org.Teams {
+               for _, team := range teams {
                        if team.IsMember(user.ID) {
                                groups = append(groups, org.Name+":"+team.LowerName)
                        }
index cb1f1eca0385fc92ac416822087ceb6633641fab..c2b21d10ac9167809de5c7a5b8bb157da03eea11 100644 (file)
@@ -14,11 +14,7 @@ import (
 )
 
 // DeleteOrganization completely and permanently deletes everything of organization.
-func DeleteOrganization(org *models.User) error {
-       if !org.IsOrganization() {
-               return fmt.Errorf("%s is a user not an organization", org.Name)
-       }
-
+func DeleteOrganization(org *models.Organization) error {
        ctx, commiter, err := db.TxContext()
        if err != nil {
                return err
@@ -26,7 +22,7 @@ func DeleteOrganization(org *models.User) error {
        defer commiter.Close()
 
        // Check ownership of repository.
-       count, err := models.GetRepositoryCount(ctx, org)
+       count, err := models.GetRepositoryCount(ctx, org.ID)
        if err != nil {
                return fmt.Errorf("GetRepositoryCount: %v", err)
        } else if count > 0 {
index 5fec086d10d1af060d5c3b51946b9e1791a5b492..3c620c055be5e9e95767aba0db4a8a76d78ed855 100644 (file)
@@ -20,18 +20,18 @@ func TestMain(m *testing.M) {
 
 func TestDeleteOrganization(t *testing.T) {
        assert.NoError(t, unittest.PrepareTestDatabase())
-       org := unittest.AssertExistsAndLoadBean(t, &models.User{ID: 6}).(*models.User)
+       org := unittest.AssertExistsAndLoadBean(t, &models.Organization{ID: 6}).(*models.Organization)
        assert.NoError(t, DeleteOrganization(org))
-       unittest.AssertNotExistsBean(t, &models.User{ID: 6})
+       unittest.AssertNotExistsBean(t, &models.Organization{ID: 6})
        unittest.AssertNotExistsBean(t, &models.OrgUser{OrgID: 6})
        unittest.AssertNotExistsBean(t, &models.Team{OrgID: 6})
 
-       org = unittest.AssertExistsAndLoadBean(t, &models.User{ID: 3}).(*models.User)
+       org = unittest.AssertExistsAndLoadBean(t, &models.Organization{ID: 3}).(*models.Organization)
        err := DeleteOrganization(org)
        assert.Error(t, err)
        assert.True(t, models.IsErrUserOwnRepos(err))
 
-       user := unittest.AssertExistsAndLoadBean(t, &models.User{ID: 5}).(*models.User)
+       user := unittest.AssertExistsAndLoadBean(t, &models.Organization{ID: 5}).(*models.Organization)
        assert.Error(t, DeleteOrganization(user))
        unittest.CheckConsistencyFor(t, &models.User{}, &models.Team{})
 }
index 98d160c223903da5c5a6ebfd7204dfd61fbe8425..1d390247f1aad8990d71c93ce0e18e1e5ab00c91 100644 (file)
@@ -45,7 +45,7 @@ func DeleteRepository(doer *models.User, repo *models.Repository) error {
 func PushCreateRepo(authUser, owner *models.User, repoName string) (*models.Repository, error) {
        if !authUser.IsAdmin {
                if owner.IsOrganization() {
-                       if ok, err := owner.CanCreateOrgRepo(authUser.ID); err != nil {
+                       if ok, err := models.CanCreateOrgRepo(owner.ID, authUser.ID); err != nil {
                                return nil, err
                        } else if !ok {
                                return nil, fmt.Errorf("cannot push-create repository for org")
index a08e40f86e95ea6e18bf6b0c9b847e74dd3a9294..733cc4a36e88e4899349be4263d050e5990ab22b 100644 (file)
@@ -35,7 +35,7 @@ func DeleteUser(u *models.User) error {
        //      cannot perform delete operation.
 
        // Check ownership of repository.
-       count, err := models.GetRepositoryCount(ctx, u)
+       count, err := models.GetRepositoryCount(ctx, u.ID)
        if err != nil {
                return fmt.Errorf("GetRepositoryCount: %v", err)
        } else if count > 0 {