Browse Source

Finish Teams page

Unknown 10 years ago
parent
commit
e4ea5cf598
11 changed files with 170 additions and 265 deletions
  1. 1 1
      cmd/serve.go
  2. 1 1
      gogs.go
  3. 40 12
      models/org.go
  4. 46 201
      public/css/gogs.css
  5. 16 0
      routers/org/members.go
  6. 2 7
      routers/org/org.go
  7. 41 6
      routers/org/teams.go
  8. 1 1
      routers/repo/repo.go
  9. 1 1
      routers/repo/setting.go
  10. 1 1
      templates/VERSION
  11. 20 34
      templates/org/teams.tmpl

+ 1 - 1
cmd/serve.go

@@ -13,11 +13,11 @@ import (
 	"strings"
 
 	"github.com/codegangsta/cli"
-	"github.com/satori/go.uuid"
 
 	"github.com/gogits/gogs/models"
 	"github.com/gogits/gogs/modules/log"
 	"github.com/gogits/gogs/modules/setting"
+	"github.com/gogits/gogs/modules/uuid"
 )
 
 var CmdServ = cli.Command{

+ 1 - 1
gogs.go

@@ -17,7 +17,7 @@ import (
 	"github.com/gogits/gogs/modules/setting"
 )
 
-const APP_VER = "0.4.5.0628 Alpha"
+const APP_VER = "0.4.5.0629 Alpha"
 
 func init() {
 	runtime.GOMAXPROCS(runtime.NumCPU())

+ 40 - 12
models/org.go

@@ -10,6 +10,16 @@ import (
 	"github.com/gogits/gogs/modules/base"
 )
 
+// IsOrgOwner returns true if given user is in the owner team.
+func (org *User) IsOrgOwner(uid int64) bool {
+	return IsOrganizationOwner(org.Id, uid)
+}
+
+// IsOrgMember returns true if given user is member of organization.
+func (org *User) IsOrgMember(uid int64) bool {
+	return IsOrganizationMember(org.Id, uid)
+}
+
 // GetOwnerTeam returns owner team of organization.
 func (org *User) GetOwnerTeam() (*Team, error) {
 	t := &Team{
@@ -167,6 +177,18 @@ type Team struct {
 	RepoIds     string `xorm:"TEXT"`
 	NumMembers  int
 	NumRepos    int
+	Members     []*User `xorm:"-"`
+}
+
+// IsTeamMember returns true if given user is a member of team.
+func (t *Team) IsMember(uid int64) bool {
+	return IsTeamMember(t.OrgId, t.Id, uid)
+}
+
+// GetMembers returns all members in given team of organization.
+func (t *Team) GetMembers() (err error) {
+	t.Members, err = GetTeamMembers(t.OrgId, t.Id)
+	return err
 }
 
 // NewTeam creates a record of new team.
@@ -205,6 +227,18 @@ type OrgUser struct {
 	NumTeam  int
 }
 
+// IsOrganizationOwner returns true if given user is in the owner team.
+func IsOrganizationOwner(orgId, uid int64) bool {
+	has, _ := x.Where("is_owner=?", true).And("uid=?", uid).And("org_id=?", orgId).Get(new(OrgUser))
+	return has
+}
+
+// IsOrganizationMember returns true if given user is member of organization.
+func IsOrganizationMember(orgId, uid int64) bool {
+	has, _ := x.Where("uid=?", uid).And("org_id=?", orgId).Get(new(OrgUser))
+	return has
+}
+
 // GetOrgUsersByUserId returns all organization-user relations by user ID.
 func GetOrgUsersByUserId(uid int64) ([]*OrgUser, error) {
 	ous := make([]*OrgUser, 0, 10)
@@ -219,18 +253,6 @@ func GetOrgUsersByOrgId(orgId int64) ([]*OrgUser, error) {
 	return ous, err
 }
 
-// IsOrganizationOwner returns true if given user is in the owner team.
-func IsOrganizationOwner(orgId, uid int64) bool {
-	has, _ := x.Where("is_owner=?", true).Get(&OrgUser{Uid: uid, OrgId: orgId})
-	return has
-}
-
-// IsOrganizationMember returns true if given user is member of organization.
-func IsOrganizationMember(orgId, uid int64) bool {
-	has, _ := x.Get(&OrgUser{Uid: uid, OrgId: orgId})
-	return has
-}
-
 // ___________                    ____ ___
 // \__    ___/___ _____    _____ |    |   \______ ___________
 //   |    |_/ __ \\__  \  /     \|    |   /  ___// __ \_  __ \
@@ -246,6 +268,12 @@ type TeamUser struct {
 	TeamId int64
 }
 
+// IsTeamMember returns true if given user is a member of team.
+func IsTeamMember(orgId, teamId, uid int64) bool {
+	has, _ := x.Where("uid=?", uid).And("org_id=?", orgId).And("team_id=?", teamId).Get(new(TeamUser))
+	return has
+}
+
 // GetTeamMembers returns all members in given team of organization.
 func GetTeamMembers(orgId, teamId int64) ([]*User, error) {
 	tus := make([]*TeamUser, 0, 10)

File diff suppressed because it is too large
+ 46 - 201
public/css/gogs.css


+ 16 - 0
routers/org/members.go

@@ -0,0 +1,16 @@
+// Copyright 2014 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.
+
+package org
+
+import (
+	"github.com/go-martini/martini"
+
+	"github.com/gogits/gogs/modules/middleware"
+)
+
+func Members(ctx *middleware.Context, params martini.Params) {
+	ctx.Data["Title"] = "Organization " + params["org"] + " Members"
+	ctx.HTML(200, "org/members")
+}

+ 2 - 7
routers/org/org.go

@@ -36,7 +36,7 @@ func Home(ctx *middleware.Context, params martini.Params) {
 	ctx.Data["Org"] = org
 
 	ctx.Data["Repos"], err = models.GetRepositories(org.Id,
-		ctx.IsSigned && models.IsOrganizationMember(org.Id, ctx.User.Id))
+		ctx.IsSigned && org.IsOrgMember(ctx.User.Id))
 	if err != nil {
 		ctx.Handle(500, "org.Home(GetRepositories)", err)
 		return
@@ -57,11 +57,6 @@ func Home(ctx *middleware.Context, params martini.Params) {
 	ctx.HTML(200, HOME)
 }
 
-func Members(ctx *middleware.Context, params martini.Params) {
-	ctx.Data["Title"] = "Organization " + params["org"] + " Members"
-	ctx.HTML(200, "org/members")
-}
-
 func New(ctx *middleware.Context) {
 	ctx.Data["Title"] = "Create An Organization"
 	ctx.HTML(200, NEW)
@@ -206,7 +201,7 @@ func DeletePost(ctx *middleware.Context, params martini.Params) {
 	}
 	ctx.Data["Org"] = org
 
-	if !models.IsOrganizationOwner(org.Id, ctx.User.Id) {
+	if !org.IsOrgOwner(ctx.User.Id) {
 		ctx.Error(403)
 		return
 	}

+ 41 - 6
routers/org/teams.go

@@ -1,21 +1,56 @@
+// Copyright 2014 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.
+
 package org
 
 import (
 	"github.com/go-martini/martini"
+
+	"github.com/gogits/gogs/models"
+	"github.com/gogits/gogs/modules/base"
 	"github.com/gogits/gogs/modules/middleware"
 )
 
+const (
+	TEAMS base.TplName = "org/teams"
+)
+
 func Teams(ctx *middleware.Context, params martini.Params) {
-	ctx.Data["Title"] = "Organization "+params["org"]+" Teams"
-	ctx.HTML(200, "org/teams")
+	ctx.Data["Title"] = "Organization " + params["org"] + " Teams"
+
+	org, err := models.GetUserByName(params["org"])
+	if err != nil {
+		if err == models.ErrUserNotExist {
+			ctx.Handle(404, "org.Teams(GetUserByName)", err)
+		} else {
+			ctx.Handle(500, "org.Teams(GetUserByName)", err)
+		}
+		return
+	}
+	ctx.Data["Org"] = org
+
+	if err = org.GetTeams(); err != nil {
+		ctx.Handle(500, "org.Teams(GetTeams)", err)
+		return
+	}
+	for _, t := range org.Teams {
+		if err = t.GetMembers(); err != nil {
+			ctx.Handle(500, "org.Home(GetMembers)", err)
+			return
+		}
+	}
+	ctx.Data["Teams"] = org.Teams
+
+	ctx.HTML(200, TEAMS)
 }
 
 func NewTeam(ctx *middleware.Context, params martini.Params) {
-	ctx.Data["Title"] = "Organization "+params["org"]+" New Team"
+	ctx.Data["Title"] = "Organization " + params["org"] + " New Team"
 	ctx.HTML(200, "org/new_team")
 }
 
-func EditTeam(ctx *middleware.Context, params martini.Params){
-	ctx.Data["Title"] = "Organization "+params["org"]+" Edit Team"
-	ctx.HTML(200,"org/edit_team")
+func EditTeam(ctx *middleware.Context, params martini.Params) {
+	ctx.Data["Title"] = "Organization " + params["org"] + " Edit Team"
+	ctx.HTML(200, "org/edit_team")
 }

+ 1 - 1
routers/repo/repo.go

@@ -90,7 +90,7 @@ func CreatePost(ctx *middleware.Context, form auth.CreateRepoForm) {
 		}
 
 		// Check ownership of organization.
-		if !models.IsOrganizationOwner(u.Id, ctx.User.Id) {
+		if !u.IsOrgOwner(ctx.User.Id) {
 			ctx.Error(403)
 			return
 		}

+ 1 - 1
routers/repo/setting.go

@@ -123,7 +123,7 @@ func SettingPost(ctx *middleware.Context, form auth.RepoSettingForm) {
 		}
 
 		if ctx.Repo.Owner.IsOrganization() &&
-			!models.IsOrganizationOwner(ctx.Repo.Owner.Id, ctx.User.Id) {
+			!ctx.Repo.Owner.IsOrgOwner(ctx.User.Id) {
 			ctx.Error(403)
 			return
 		}

+ 1 - 1
templates/VERSION

@@ -1 +1 @@
-0.4.5.0628 Alpha
+0.4.5.0629 Alpha

+ 20 - 34
templates/org/teams.tmpl

@@ -4,16 +4,16 @@
     <div class="container clearfix">
         <div id="org-nav-wrapper">
             <ul class="nav nav-pills pull-right">
-                <li><a href="#"><i class="fa fa-users"></i>Members
-                    <span class="label label-default">5</span></a>
+                <li><a href="/org/{{.Org.Name}}/members"><i class="fa fa-users"></i>Members
+                    <span class="label label-default">{{.Org.NumMembers}}</span></a>
                 </li>
-                <li class="active"><a href="#"><i class="fa fa-tags"></i>Teams
-                    <span class="label label-default">2</span></a>
+                <li class="active"><a href="/org/{{.Org.Name}}/teams"><i class="fa fa-tags"></i>Teams
+                    <span class="label label-default">{{.Org.NumTeams}}</span></a>
                 </li>
             </ul>
-            <img class="pull-left org-small-logo" src="https://avatars3.githubusercontent.com/u/6656686?s=140" alt="" width="60"/>
+            <img class="pull-left org-small-logo" src="{{.Org.AvatarLink}}?s=140" alt="" width="60"/>
             <div id="org-nav-info">
-                <h2 class="org-name">Organization Name</h2>
+                <h2 class="org-name">{{.Org.FullName}}</h2>
             </div>
         </div>
     </div>
@@ -23,48 +23,34 @@
         <div id="org-teams">
             <div id="org-teams-action">
                 <div class="col-md-12">
-                    <a href="#"><button class="btn btn-success"><i class="fa fa-plus-square"></i>New Team</button></a>
+                    <a href="/org/{{.Org.Name}}/teams/new"><button class="btn btn-success"><i class="fa fa-plus-square"></i>New Team</button></a>
                     <hr/>
                 </div>
             </div>
+            {{range .Teams}}
             <div class="org-team col-md-6">
                 <div class="panel panel-default">
-                    <h2 class="panel-heading org-team-name"><a href="#"><strong>Team Name</strong></a></h2>
+                    <h2 class="panel-heading org-team-name"><a href="/org/{{$.Org.Name}}/teams/{{.LowerName}}"><strong>{{.Name}}</strong></a></h2>
                     <div class="panel-body">
-                        <p class="org-team-meta">4 members · 10 repositories</p>
+                        <p class="org-team-meta">{{.NumMembers}} members · {{.NumRepos}} repositories</p>
                         <p class="org-team-members">
-                            <a href="#">
-                                <img class="img-thumbnail" src="https://avatars2.githubusercontent.com/u/2946214?s=60" alt=""/>
-                            </a>
-                            <a href="#">
-                                <img class="img-thumbnail" src="https://avatars2.githubusercontent.com/u/2946214?s=60" alt=""/>
-                            </a>
-                        </p>
-                    </div>
-                    <div class="panel-footer">
-                        <button class="pull-right btn btn-default">Join</button>
-                    </div>
-                </div>
-            </div>
-            <div class="org-team col-md-6">
-                <div class="panel panel-default">
-                    <h2 class="panel-heading org-team-name"><a href="#"><strong>Team Name</strong></a></h2>
-                    <div class="panel-body">
-                        <p class="org-team-meta">4 members · 10 repositories</p>
-                        <p class="org-team-members">
-                            <a href="#">
-                                <img class="img-thumbnail" src="https://avatars2.githubusercontent.com/u/2946214?s=60" alt=""/>
-                            </a>
-                            <a href="#">
-                                <img class="img-thumbnail" src="https://avatars2.githubusercontent.com/u/2946214?s=60" alt=""/>
+                            {{range .Members}}
+                            <a href="/user/{{.LowerName}}">
+                                <img class="img-thumbnail" src="{{.AvatarLink}}?s=60" alt=""/>
                             </a>
+                            {{end}}
                         </p>
                     </div>
                     <div class="panel-footer">
-                        <button class="pull-right btn btn-danger">Leave</button>
+                        {{if .IsMember $.SignedUserId}}
+                        <a class="pull-right btn btn-danger" href="/org/{{$.Org.Name}}/teams/{{.LowerName}}?action=leave">Leave</a>
+                        {{else}}
+                        <a class="pull-right btn btn-default" href="/org/{{$.Org.Name}}/teams/{{.LowerName}}?action=join">Join</a>
+                        {{end}}
                     </div>
                 </div>
             </div>
+            {{end}}
         </div>
     </div>
 </div>

Some files were not shown because too many files changed in this diff