mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Organization settings page
This commit is contained in:
		@@ -190,12 +190,13 @@ func runWeb(*cli.Context) {
 | 
			
		||||
 | 
			
		||||
	m.Group("/org", func(r martini.Router) {
 | 
			
		||||
		r.Get("/create", org.New)
 | 
			
		||||
		r.Post("/create", bindIgnErr(auth.CreateOrganizationForm{}), org.NewPost)
 | 
			
		||||
		r.Post("/create", bindIgnErr(auth.CreateOrgForm{}), org.NewPost)
 | 
			
		||||
		r.Get("/:org", org.Organization)
 | 
			
		||||
		r.Get("/:org/dashboard", org.Dashboard)
 | 
			
		||||
		r.Get("/:org/members", org.Members)
 | 
			
		||||
		r.Get("/:org/teams", org.Teams)
 | 
			
		||||
		r.Get("/:org/setting", org.Setting)
 | 
			
		||||
		r.Get("/:org/settings", org.Settings)
 | 
			
		||||
		r.Post("/:org/settings", bindIgnErr(auth.OrgSettingForm{}), org.SettingsPost)
 | 
			
		||||
	}, reqSignIn)
 | 
			
		||||
 | 
			
		||||
	m.Group("/:username/:reponame", func(r martini.Router) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								gogs.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								gogs.go
									
									
									
									
									
								
							@@ -17,7 +17,7 @@ import (
 | 
			
		||||
	"github.com/gogits/gogs/modules/setting"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const APP_VER = "0.4.5.0625 Alpha"
 | 
			
		||||
const APP_VER = "0.4.5.0627 Alpha"
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	runtime.GOMAXPROCS(runtime.NumCPU())
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,88 @@
 | 
			
		||||
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/gogits/gogs/modules/base"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// CreateOrganization creates record of a new organization.
 | 
			
		||||
func CreateOrganization(org, owner *User) (*User, error) {
 | 
			
		||||
	if !IsLegalName(org.Name) {
 | 
			
		||||
		return nil, ErrUserNameIllegal
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	isExist, err := IsUserExist(org.Name)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	} else if isExist {
 | 
			
		||||
		return nil, ErrUserAlreadyExist
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	isExist, err = IsEmailUsed(org.Email)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	} else if isExist {
 | 
			
		||||
		return nil, ErrEmailAlreadyUsed
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	org.LowerName = strings.ToLower(org.Name)
 | 
			
		||||
	org.FullName = org.Name
 | 
			
		||||
	org.Avatar = base.EncodeMd5(org.Email)
 | 
			
		||||
	org.AvatarEmail = org.Email
 | 
			
		||||
	// No password for organization.
 | 
			
		||||
	org.NumTeams = 1
 | 
			
		||||
	org.NumMembers = 1
 | 
			
		||||
 | 
			
		||||
	sess := x.NewSession()
 | 
			
		||||
	defer sess.Close()
 | 
			
		||||
	if err = sess.Begin(); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if _, err = sess.Insert(org); err != nil {
 | 
			
		||||
		sess.Rollback()
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Create default owner team.
 | 
			
		||||
	t := &Team{
 | 
			
		||||
		OrgId:      org.Id,
 | 
			
		||||
		Name:       OWNER_TEAM,
 | 
			
		||||
		Authorize:  ORG_ADMIN,
 | 
			
		||||
		NumMembers: 1,
 | 
			
		||||
	}
 | 
			
		||||
	if _, err = sess.Insert(t); err != nil {
 | 
			
		||||
		sess.Rollback()
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Add initial creator to organization and owner team.
 | 
			
		||||
	ou := &OrgUser{
 | 
			
		||||
		Uid:     owner.Id,
 | 
			
		||||
		OrgId:   org.Id,
 | 
			
		||||
		IsOwner: true,
 | 
			
		||||
		NumTeam: 1,
 | 
			
		||||
	}
 | 
			
		||||
	if _, err = sess.Insert(ou); err != nil {
 | 
			
		||||
		sess.Rollback()
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tu := &TeamUser{
 | 
			
		||||
		Uid:    owner.Id,
 | 
			
		||||
		OrgId:  org.Id,
 | 
			
		||||
		TeamId: t.Id,
 | 
			
		||||
	}
 | 
			
		||||
	if _, err = sess.Insert(tu); err != nil {
 | 
			
		||||
		sess.Rollback()
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return org, sess.Commit()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type AuthorizeType int
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
@@ -72,6 +154,10 @@ func GetOrgUsersByOrgId(orgId int64) ([]*OrgUser, error) {
 | 
			
		||||
	return ous, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetOrganizationCount(u *User) (int64, error) {
 | 
			
		||||
	return x.Where("uid=?", u.Id).Count(new(OrgUser))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ___________                    ____ ___
 | 
			
		||||
// \__    ___/___ _____    _____ |    |   \______ ___________
 | 
			
		||||
//   |    |_/ __ \\__  \  /     \|    |   /  ___// __ \_  __ \
 | 
			
		||||
 
 | 
			
		||||
@@ -240,7 +240,7 @@ func MirrorUpdate() {
 | 
			
		||||
			"git", "remote", "update"); err != nil {
 | 
			
		||||
			return errors.New("git remote update: " + stderr)
 | 
			
		||||
		} else if err = git.UnpackRefs(repoPath); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
			return errors.New("UnpackRefs: " + err.Error())
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		m.NextUpdate = time.Now().Add(time.Duration(m.Interval) * time.Hour)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										114
									
								
								models/user.go
									
									
									
									
									
								
							
							
						
						
									
										114
									
								
								models/user.go
									
									
									
									
									
								
							@@ -30,6 +30,7 @@ const (
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	ErrUserOwnRepos          = errors.New("User still have ownership of repositories")
 | 
			
		||||
	ErrUserHasOrgs           = errors.New("User still have membership of organization")
 | 
			
		||||
	ErrUserAlreadyExist      = errors.New("User already exist")
 | 
			
		||||
	ErrUserNotExist          = errors.New("User does not exist")
 | 
			
		||||
	ErrUserNotKeyOwner       = errors.New("User does not the owner of public key")
 | 
			
		||||
@@ -69,8 +70,9 @@ type User struct {
 | 
			
		||||
	Updated       time.Time `xorm:"updated"`
 | 
			
		||||
 | 
			
		||||
	// For organization.
 | 
			
		||||
	NumTeams   int
 | 
			
		||||
	NumMembers int
 | 
			
		||||
	Description string
 | 
			
		||||
	NumTeams    int
 | 
			
		||||
	NumMembers  int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HomeLink returns the user home page link.
 | 
			
		||||
@@ -211,81 +213,6 @@ func CreateUser(u *User) (*User, error) {
 | 
			
		||||
	return u, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CreateOrganization creates record of a new organization.
 | 
			
		||||
func CreateOrganization(org, owner *User) (*User, error) {
 | 
			
		||||
	if !IsLegalName(org.Name) {
 | 
			
		||||
		return nil, ErrUserNameIllegal
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	isExist, err := IsUserExist(org.Name)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	} else if isExist {
 | 
			
		||||
		return nil, ErrUserAlreadyExist
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	isExist, err = IsEmailUsed(org.Email)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	} else if isExist {
 | 
			
		||||
		return nil, ErrEmailAlreadyUsed
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	org.LowerName = strings.ToLower(org.Name)
 | 
			
		||||
	org.Avatar = base.EncodeMd5(org.Email)
 | 
			
		||||
	org.AvatarEmail = org.Email
 | 
			
		||||
	// No password for organization.
 | 
			
		||||
	org.NumTeams = 1
 | 
			
		||||
	org.NumMembers = 1
 | 
			
		||||
 | 
			
		||||
	sess := x.NewSession()
 | 
			
		||||
	defer sess.Close()
 | 
			
		||||
	if err = sess.Begin(); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if _, err = sess.Insert(org); err != nil {
 | 
			
		||||
		sess.Rollback()
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Create default owner team.
 | 
			
		||||
	t := &Team{
 | 
			
		||||
		OrgId:      org.Id,
 | 
			
		||||
		Name:       OWNER_TEAM,
 | 
			
		||||
		Authorize:  ORG_ADMIN,
 | 
			
		||||
		NumMembers: 1,
 | 
			
		||||
	}
 | 
			
		||||
	if _, err = sess.Insert(t); err != nil {
 | 
			
		||||
		sess.Rollback()
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Add initial creator to organization and owner team.
 | 
			
		||||
	ou := &OrgUser{
 | 
			
		||||
		Uid:     owner.Id,
 | 
			
		||||
		OrgId:   org.Id,
 | 
			
		||||
		IsOwner: true,
 | 
			
		||||
		NumTeam: 1,
 | 
			
		||||
	}
 | 
			
		||||
	if _, err = sess.Insert(ou); err != nil {
 | 
			
		||||
		sess.Rollback()
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tu := &TeamUser{
 | 
			
		||||
		Uid:    owner.Id,
 | 
			
		||||
		OrgId:  org.Id,
 | 
			
		||||
		TeamId: t.Id,
 | 
			
		||||
	}
 | 
			
		||||
	if _, err = sess.Insert(tu); err != nil {
 | 
			
		||||
		sess.Rollback()
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return org, sess.Commit()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetUsers returns given number of user objects with offset.
 | 
			
		||||
func GetUsers(num, offset int) ([]User, error) {
 | 
			
		||||
	users := make([]User, 0, num)
 | 
			
		||||
@@ -392,51 +319,62 @@ func UpdateUser(u *User) (err error) {
 | 
			
		||||
	if len(u.Website) > 255 {
 | 
			
		||||
		u.Website = u.Website[:255]
 | 
			
		||||
	}
 | 
			
		||||
	if len(u.Description) > 255 {
 | 
			
		||||
		u.Description = u.Description[:255]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err = x.Id(u.Id).AllCols().Update(u)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeleteUser completely deletes everything of the user.
 | 
			
		||||
func DeleteUser(user *User) error {
 | 
			
		||||
func DeleteUser(u *User) error {
 | 
			
		||||
	// Check ownership of repository.
 | 
			
		||||
	count, err := GetRepositoryCount(user)
 | 
			
		||||
	count, err := GetRepositoryCount(u)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.New("modesl.GetRepositories: " + err.Error())
 | 
			
		||||
		return errors.New("modesl.GetRepositories(GetRepositoryCount): " + err.Error())
 | 
			
		||||
	} else if count > 0 {
 | 
			
		||||
		return ErrUserOwnRepos
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Check membership of organization.
 | 
			
		||||
	count, err = GetOrganizationCount(u)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.New("modesl.GetRepositories(GetOrganizationCount): " + err.Error())
 | 
			
		||||
	} else if count > 0 {
 | 
			
		||||
		return ErrUserHasOrgs
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// TODO: check issues, other repos' commits
 | 
			
		||||
 | 
			
		||||
	// Delete all followers.
 | 
			
		||||
	if _, err = x.Delete(&Follow{FollowId: user.Id}); err != nil {
 | 
			
		||||
	if _, err = x.Delete(&Follow{FollowId: u.Id}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Delete oauth2.
 | 
			
		||||
	if _, err = x.Delete(&Oauth2{Uid: user.Id}); err != nil {
 | 
			
		||||
	if _, err = x.Delete(&Oauth2{Uid: u.Id}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Delete all feeds.
 | 
			
		||||
	if _, err = x.Delete(&Action{UserId: user.Id}); err != nil {
 | 
			
		||||
	if _, err = x.Delete(&Action{UserId: u.Id}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Delete all watches.
 | 
			
		||||
	if _, err = x.Delete(&Watch{UserId: user.Id}); err != nil {
 | 
			
		||||
	if _, err = x.Delete(&Watch{UserId: u.Id}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Delete all accesses.
 | 
			
		||||
	if _, err = x.Delete(&Access{UserName: user.LowerName}); err != nil {
 | 
			
		||||
	if _, err = x.Delete(&Access{UserName: u.LowerName}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Delete all SSH keys.
 | 
			
		||||
	keys := make([]*PublicKey, 0, 10)
 | 
			
		||||
	if err = x.Find(&keys, &PublicKey{OwnerId: user.Id}); err != nil {
 | 
			
		||||
	if err = x.Find(&keys, &PublicKey{OwnerId: u.Id}); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	for _, key := range keys {
 | 
			
		||||
@@ -446,11 +384,11 @@ func DeleteUser(user *User) error {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Delete user directory.
 | 
			
		||||
	if err = os.RemoveAll(UserPath(user.Name)); err != nil {
 | 
			
		||||
	if err = os.RemoveAll(UserPath(u.Name)); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err = x.Delete(user)
 | 
			
		||||
	_, err = x.Delete(u)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,12 +14,12 @@ import (
 | 
			
		||||
	"github.com/gogits/gogs/modules/middleware/binding"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type CreateOrganizationForm struct {
 | 
			
		||||
type CreateOrgForm struct {
 | 
			
		||||
	OrgName string `form:"orgname" binding:"Required;AlphaDashDot;MaxSize(30)"`
 | 
			
		||||
	Email   string `form:"email" binding:"Required;Email;MaxSize(50)"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *CreateOrganizationForm) Name(field string) string {
 | 
			
		||||
func (f *CreateOrgForm) Name(field string) string {
 | 
			
		||||
	names := map[string]string{
 | 
			
		||||
		"OrgName": "Organization name",
 | 
			
		||||
		"Email":   "E-mail address",
 | 
			
		||||
@@ -27,7 +27,31 @@ func (f *CreateOrganizationForm) Name(field string) string {
 | 
			
		||||
	return names[field]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *CreateOrganizationForm) Validate(errs *binding.Errors, req *http.Request, ctx martini.Context) {
 | 
			
		||||
func (f *CreateOrgForm) Validate(errs *binding.Errors, req *http.Request, ctx martini.Context) {
 | 
			
		||||
	data := ctx.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData)
 | 
			
		||||
	validate(errs, data, f)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type OrgSettingForm struct {
 | 
			
		||||
	DisplayName string `form:"display_name" binding:"Required;MaxSize(100)"`
 | 
			
		||||
	Email       string `form:"email" binding:"Required;Email;MaxSize(50)"`
 | 
			
		||||
	Description string `form:"desc" binding:"MaxSize(255)"`
 | 
			
		||||
	Website     string `form:"site" binding:"Url;MaxSize(100)"`
 | 
			
		||||
	Location    string `form:"location" binding:"MaxSize(50)"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *OrgSettingForm) Name(field string) string {
 | 
			
		||||
	names := map[string]string{
 | 
			
		||||
		"DisplayName": "Display name",
 | 
			
		||||
		"Email":       "E-mail address",
 | 
			
		||||
		"Description": "Description",
 | 
			
		||||
		"Website":     "Website address",
 | 
			
		||||
		"Location":    "Location",
 | 
			
		||||
	}
 | 
			
		||||
	return names[field]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *OrgSettingForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) {
 | 
			
		||||
	data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData)
 | 
			
		||||
	validate(errors, data, f)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -71,7 +71,7 @@ func (f *MigrateRepoForm) Validate(errors *binding.Errors, req *http.Request, co
 | 
			
		||||
 | 
			
		||||
type RepoSettingForm struct {
 | 
			
		||||
	RepoName    string `form:"name" binding:"Required;AlphaDash;MaxSize(100)"`
 | 
			
		||||
	Description string `form:"desc" binding:"MaxSize(100)"`
 | 
			
		||||
	Description string `form:"desc" binding:"MaxSize(255)"`
 | 
			
		||||
	Website     string `form:"site" binding:"Url;MaxSize(100)"`
 | 
			
		||||
	Branch      string `form:"branch"`
 | 
			
		||||
	Interval    int    `form:"interval"`
 | 
			
		||||
 
 | 
			
		||||
@@ -93,7 +93,7 @@ func (f *UpdateProfileForm) Name(field string) string {
 | 
			
		||||
	names := map[string]string{
 | 
			
		||||
		"UserName": "Username",
 | 
			
		||||
		"Email":    "E-mail address",
 | 
			
		||||
		"Website":  "Website",
 | 
			
		||||
		"Website":  "Website address",
 | 
			
		||||
		"Location": "Location",
 | 
			
		||||
		"Avatar":   "Gravatar Email",
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,8 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	NEW base.TplName = "org/new"
 | 
			
		||||
	NEW      base.TplName = "org/new"
 | 
			
		||||
	SETTINGS base.TplName = "org/settings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Organization(ctx *middleware.Context, params martini.Params) {
 | 
			
		||||
@@ -39,7 +40,7 @@ func New(ctx *middleware.Context) {
 | 
			
		||||
	ctx.HTML(200, NEW)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewPost(ctx *middleware.Context, form auth.CreateOrganizationForm) {
 | 
			
		||||
func NewPost(ctx *middleware.Context, form auth.CreateOrgForm) {
 | 
			
		||||
	ctx.Data["Title"] = "Create An Organization"
 | 
			
		||||
 | 
			
		||||
	if ctx.HasError() {
 | 
			
		||||
@@ -114,7 +115,52 @@ func Dashboard(ctx *middleware.Context, params martini.Params) {
 | 
			
		||||
	ctx.HTML(200, user.DASHBOARD)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Setting(ctx *middleware.Context, param martini.Params) {
 | 
			
		||||
	ctx.Data["Title"] = "Setting"
 | 
			
		||||
	ctx.HTML(200, "org/setting")
 | 
			
		||||
func Settings(ctx *middleware.Context, params martini.Params) {
 | 
			
		||||
	ctx.Data["Title"] = "Settings"
 | 
			
		||||
 | 
			
		||||
	org, err := models.GetUserByName(params["org"])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if err == models.ErrUserNotExist {
 | 
			
		||||
			ctx.Handle(404, "org.Settings(GetUserByName)", err)
 | 
			
		||||
		} else {
 | 
			
		||||
			ctx.Handle(500, "org.Settings(GetUserByName)", err)
 | 
			
		||||
		}
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	ctx.Data["Org"] = org
 | 
			
		||||
 | 
			
		||||
	ctx.HTML(200, SETTINGS)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SettingsPost(ctx *middleware.Context, params martini.Params, form auth.OrgSettingForm) {
 | 
			
		||||
	ctx.Data["Title"] = "Settings"
 | 
			
		||||
 | 
			
		||||
	org, err := models.GetUserByName(params["org"])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if err == models.ErrUserNotExist {
 | 
			
		||||
			ctx.Handle(404, "org.SettingsPost(GetUserByName)", err)
 | 
			
		||||
		} else {
 | 
			
		||||
			ctx.Handle(500, "org.SettingsPost(GetUserByName)", err)
 | 
			
		||||
		}
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	ctx.Data["Org"] = org
 | 
			
		||||
 | 
			
		||||
	if ctx.HasError() {
 | 
			
		||||
		ctx.HTML(200, SETTINGS)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	org.FullName = form.DisplayName
 | 
			
		||||
	org.Email = form.Email
 | 
			
		||||
	org.Description = form.Description
 | 
			
		||||
	org.Website = form.Website
 | 
			
		||||
	org.Location = form.Location
 | 
			
		||||
	if err = models.UpdateUser(org); err != nil {
 | 
			
		||||
		ctx.Handle(500, "org.SettingsPost(UpdateUser)", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.Trace("%s Organization setting updated: %s", ctx.Req.RequestURI, org.LowerName)
 | 
			
		||||
	ctx.Flash.Success("Organization profile has been successfully updated.")
 | 
			
		||||
	ctx.Redirect("/org/" + org.Name + "/settings")
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +1 @@
 | 
			
		||||
0.4.5.0625 Alpha
 | 
			
		||||
0.4.5.0627 Alpha
 | 
			
		||||
@@ -4,32 +4,20 @@
 | 
			
		||||
    <div class="container">
 | 
			
		||||
        <div class="btn-group pull-left" id="dashboard-switch">
 | 
			
		||||
            <button type="button" class="btn btn-default">
 | 
			
		||||
                <img src="//1.gravatar.com/avatar/f72f7454ce9d710baa506394f68f4132?s=28" alt="user-avatar"
 | 
			
		||||
                     title="username">
 | 
			
		||||
                gogits
 | 
			
		||||
                <img src="{{.Org.AvatarLink}}?s=28" alt="user-avatar" title="username">
 | 
			
		||||
                {{.Org.Name}}
 | 
			
		||||
            </button>
 | 
			
		||||
            <!--
 | 
			
		||||
                        <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
 | 
			
		||||
                            <span class="caret"></span>
 | 
			
		||||
                        </button>
 | 
			
		||||
                        <div class="dropdown-menu clone-group-btn no-propagation">
 | 
			
		||||
                            <ul id="dashboard-switch-menu" class="list-unstyled">
 | 
			
		||||
                                <li class="checked"><a href="#"><i class="fa fa-check"></i>
 | 
			
		||||
                                    <img src="//1.gravatar.com/avatar/f72f7454ce9d710baa506394f68f4132?s=28" alt="user-avatar" title="username">
 | 
			
		||||
                                    gogits/gogs</a>
 | 
			
		||||
                                </li>
 | 
			
		||||
                            </ul>
 | 
			
		||||
                        </div>-->
 | 
			
		||||
        </div>
 | 
			
		||||
        <ul class="nav nav-pills pull-right">
 | 
			
		||||
            <li><a href="/">Feed</a></li>
 | 
			
		||||
            <li><a href="/issues">Issues</a></li>
 | 
			
		||||
            <li class="active"><a href="#">Setting</a></li>
 | 
			
		||||
            <li><a href="/org/{{.Org.Name}}/dashboard/">News Feed</a></li>
 | 
			
		||||
            <li><a href="/org/{{.Org.Name}}/dashboard/issues">Issues</a></li>
 | 
			
		||||
            <li class="active"><a href="/org/{{.Org.Name}}/settings">Settings</a></li>
 | 
			
		||||
            <!-- <li><a href="/pulls">Pull Requests</a></li>
 | 
			
		||||
            <li><a href="/stars">Stars</a></li> -->
 | 
			
		||||
        </ul>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div id="body" class="container" data-page="org">
 | 
			
		||||
    <div id="user-setting-nav" class="col-md-2 repo-setting-nav">
 | 
			
		||||
        <ul class="list-group">
 | 
			
		||||
@@ -40,52 +28,46 @@
 | 
			
		||||
        {{template "base/alert" .}}
 | 
			
		||||
        <div class="panel panel-default">
 | 
			
		||||
            <div class="panel-heading">
 | 
			
		||||
                Repository Options
 | 
			
		||||
                Organization Options
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <div class="panel-body">
 | 
			
		||||
                <form action="/{{.Owner.Name}}/{{.Repository.Name}}/settings" method="post" class="form-horizontal">
 | 
			
		||||
                <form action="/org/{{.Org.Name}}/settings" method="post" class="form-horizontal">
 | 
			
		||||
                    {{.CsrfTokenHtml}}
 | 
			
		||||
                    <input type="hidden" name="action" value="update">
 | 
			
		||||
 | 
			
		||||
                    <div class="form-group">
 | 
			
		||||
                        <label class="col-md-3 text-right" for="org-setting-name">Name</label>
 | 
			
		||||
 | 
			
		||||
                    <div class="form-group{{if .Err_DisplayName}} has-error has-feedback{{end}}">
 | 
			
		||||
                        <label class="col-md-3 text-right" for="org-setting-name">Display Name</label>
 | 
			
		||||
                        <div class="col-md-9">
 | 
			
		||||
                            <input class="form-control" name="name" value="" title="" id="org-setting-name"/>
 | 
			
		||||
                            <input class="form-control" name="display_name" value="{{.Org.FullName}}" title="" id="org-setting-name"/>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
 | 
			
		||||
                    <div class="form-group">
 | 
			
		||||
                    <div class="form-group{{if .Err_Email}} has-error has-feedback{{end}}">
 | 
			
		||||
                        <label class="col-md-3 text-right" for="org-email">Email</label>
 | 
			
		||||
 | 
			
		||||
                        <div class="col-md-9">
 | 
			
		||||
                            <input class="form-control" name="email" value="" title="" id="org-email" type="email"/>
 | 
			
		||||
                            <input class="form-control" name="email" value="{{.Org.Email}}" title="" id="org-email" type="email"/>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
 | 
			
		||||
                    <div class="form-group">
 | 
			
		||||
                    <div class="form-group{{if .Err_Description}} has-error has-feedback{{end}}">
 | 
			
		||||
                        <label class="col-md-3 text-right" for="org-desc">Description</label>
 | 
			
		||||
 | 
			
		||||
                        <div class="col-md-9">
 | 
			
		||||
                            <textarea class="form-control" name="desc" id="org-desc" rows="3">{{.Repository.Description}}</textarea>
 | 
			
		||||
                            <textarea class="form-control" name="desc" id="org-desc" rows="3">{{.Org.Description}}</textarea>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
 | 
			
		||||
                    <div class="form-group">
 | 
			
		||||
                    <div class="form-group{{if .Err_Website}} has-error has-feedback{{end}}">
 | 
			
		||||
                        <label class="col-md-3 text-right" for="org-site">Official Site</label>
 | 
			
		||||
 | 
			
		||||
                        <div class="col-md-9">
 | 
			
		||||
                            <input type="url" class="form-control" name="site" value="{{.Repository.Website}}"
 | 
			
		||||
                                   id="org-site"/>
 | 
			
		||||
                            <input type="url" class="form-control" name="site" value="{{.Org.Website}}" id="org-site"/>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
 | 
			
		||||
                    <div class="form-group">
 | 
			
		||||
                    <div class="form-group{{if .Err_Location}} has-error has-feedback{{end}}">
 | 
			
		||||
                        <label class="col-md-3 text-right" for="org-location">Location</label>
 | 
			
		||||
 | 
			
		||||
                        <div class="col-md-9">
 | 
			
		||||
                            <input class="form-control" name="email" value="" title="" id="org-location"/>
 | 
			
		||||
                            <input class="form-control" name="location" value="{{.Org.Location}}" title="" id="org-location"/>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user