parent
							
								
									2935ee440c
								
							
						
					
					
						commit
						5acc948562
					
				@ -0,0 +1,55 @@ | 
				
			||||
// 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 middleware | 
				
			||||
 | 
				
			||||
import ( | 
				
			||||
	"github.com/Unknwon/macaron" | 
				
			||||
 | 
				
			||||
	"github.com/gogits/gogs/models" | 
				
			||||
) | 
				
			||||
 | 
				
			||||
func OrgAssignment(redirect bool, args ...bool) macaron.Handler { | 
				
			||||
	return func(ctx *Context) { | 
				
			||||
		var ( | 
				
			||||
			requireMember bool | 
				
			||||
			requireOwner  bool | 
				
			||||
		) | 
				
			||||
		if len(args) >= 1 { | 
				
			||||
			requireMember = args[0] | 
				
			||||
		} | 
				
			||||
		if len(args) >= 2 { | 
				
			||||
			requireOwner = args[1] | 
				
			||||
		} | 
				
			||||
 | 
				
			||||
		orgName := ctx.Params(":org") | 
				
			||||
 | 
				
			||||
		var err error | 
				
			||||
		ctx.Org.Organization, err = models.GetUserByName(orgName) | 
				
			||||
		if err != nil { | 
				
			||||
			if err == models.ErrUserNotExist { | 
				
			||||
				ctx.Handle(404, "GetUserByName", err) | 
				
			||||
			} else if redirect { | 
				
			||||
				ctx.Redirect("/") | 
				
			||||
			} else { | 
				
			||||
				ctx.Handle(500, "GetUserByName", err) | 
				
			||||
			} | 
				
			||||
			return | 
				
			||||
		} | 
				
			||||
		ctx.Data["Org"] = ctx.Org.Organization | 
				
			||||
 | 
				
			||||
		if ctx.IsSigned { | 
				
			||||
			ctx.Org.IsOwner = ctx.Org.Organization.IsOrgOwner(ctx.User.Id) | 
				
			||||
			if ctx.Org.IsOwner { | 
				
			||||
				ctx.Org.IsMember = true | 
				
			||||
			} else { | 
				
			||||
				ctx.Org.IsMember = ctx.Org.Organization.IsOrgMember(ctx.User.Id) | 
				
			||||
			} | 
				
			||||
		} | 
				
			||||
		if (requireMember && !ctx.Org.IsMember) || (requireOwner && !ctx.Org.IsOwner) { | 
				
			||||
			ctx.Handle(404, "OrgAssignment", err) | 
				
			||||
			return | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,99 @@ | 
				
			||||
// 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/gogits/gogs/models" | 
				
			||||
	"github.com/gogits/gogs/modules/auth" | 
				
			||||
	"github.com/gogits/gogs/modules/base" | 
				
			||||
	"github.com/gogits/gogs/modules/log" | 
				
			||||
	"github.com/gogits/gogs/modules/middleware" | 
				
			||||
) | 
				
			||||
 | 
				
			||||
const ( | 
				
			||||
	SETTINGS_OPTIONS base.TplName = "org/settings/options" | 
				
			||||
	SETTINGS_DELETE  base.TplName = "org/settings/delete" | 
				
			||||
) | 
				
			||||
 | 
				
			||||
func Settings(ctx *middleware.Context) { | 
				
			||||
	ctx.Data["Title"] = ctx.Tr("org.settings") | 
				
			||||
	ctx.Data["PageIsSettingsOptions"] = true | 
				
			||||
	ctx.HTML(200, SETTINGS_OPTIONS) | 
				
			||||
} | 
				
			||||
 | 
				
			||||
func SettingsPost(ctx *middleware.Context, form auth.UpdateOrgSettingForm) { | 
				
			||||
	ctx.Data["Title"] = ctx.Tr("org.settings") | 
				
			||||
	ctx.Data["PageIsSettingsOptions"] = true | 
				
			||||
 | 
				
			||||
	if ctx.HasError() { | 
				
			||||
		ctx.HTML(200, SETTINGS_OPTIONS) | 
				
			||||
		return | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	org := ctx.Org.Organization | 
				
			||||
 | 
				
			||||
	// Check if organization name has been changed.
 | 
				
			||||
	if org.Name != form.OrgUserName { | 
				
			||||
		isExist, err := models.IsUserExist(form.OrgUserName) | 
				
			||||
		if err != nil { | 
				
			||||
			ctx.Handle(500, "IsUserExist", err) | 
				
			||||
			return | 
				
			||||
		} else if isExist { | 
				
			||||
			ctx.RenderWithErr(ctx.Tr("form.username_been_taken"), SETTINGS_OPTIONS, &form) | 
				
			||||
			return | 
				
			||||
		} else if err = models.ChangeUserName(org, form.OrgUserName); err != nil { | 
				
			||||
			if err == models.ErrUserNameIllegal { | 
				
			||||
				ctx.Flash.Error(ctx.Tr("form.illegal_username")) | 
				
			||||
				ctx.Redirect("/org/" + org.LowerName + "/settings") | 
				
			||||
				return | 
				
			||||
			} else { | 
				
			||||
				ctx.Handle(500, "ChangeUserName", err) | 
				
			||||
			} | 
				
			||||
			return | 
				
			||||
		} | 
				
			||||
		log.Trace("Organization name changed: %s -> %s", org.Name, form.OrgUserName) | 
				
			||||
		org.Name = form.OrgUserName | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	org.FullName = form.OrgFullName | 
				
			||||
	org.Email = form.Email | 
				
			||||
	org.Description = form.Description | 
				
			||||
	org.Website = form.Website | 
				
			||||
	org.Location = form.Location | 
				
			||||
	org.Avatar = base.EncodeMd5(form.Avatar) | 
				
			||||
	org.AvatarEmail = form.Avatar | 
				
			||||
	if err := models.UpdateUser(org); err != nil { | 
				
			||||
		ctx.Handle(500, "UpdateUser", err) | 
				
			||||
		return | 
				
			||||
	} | 
				
			||||
	log.Trace("Organization setting updated: %s", org.Name) | 
				
			||||
	ctx.Flash.Success(ctx.Tr("org.settings.update_setting_success")) | 
				
			||||
	ctx.Redirect("/org/" + org.Name + "/settings") | 
				
			||||
} | 
				
			||||
 | 
				
			||||
func SettingsDelete(ctx *middleware.Context) { | 
				
			||||
	ctx.Data["Title"] = ctx.Tr("org.settings") | 
				
			||||
	ctx.Data["PageIsSettingsDelete"] = true | 
				
			||||
 | 
				
			||||
	org := ctx.Org.Organization | 
				
			||||
	if ctx.Req.Method == "POST" { | 
				
			||||
		// TODO: validate password.
 | 
				
			||||
		if err := models.DeleteOrganization(org); err != nil { | 
				
			||||
			switch err { | 
				
			||||
			case models.ErrUserOwnRepos: | 
				
			||||
				ctx.Flash.Error(ctx.Tr("form.org_still_own_repo")) | 
				
			||||
				ctx.Redirect("/org/" + org.LowerName + "/settings/delete") | 
				
			||||
			default: | 
				
			||||
				ctx.Handle(500, "DeleteOrganization", err) | 
				
			||||
			} | 
				
			||||
		} else { | 
				
			||||
			log.Trace("Organization deleted: %s", ctx.User.Name) | 
				
			||||
			ctx.Redirect("/") | 
				
			||||
		} | 
				
			||||
		return | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	ctx.HTML(200, SETTINGS_DELETE) | 
				
			||||
} | 
				
			||||
@ -1 +1 @@ | 
				
			||||
0.4.7.0810 Alpha | 
				
			||||
0.4.7.0814 Alpha | 
				
			||||
@ -0,0 +1,28 @@ | 
				
			||||
{{template "ng/base/head" .}} | 
				
			||||
{{template "ng/base/header" .}} | 
				
			||||
<div id="setting-wrapper" class="main-wrapper"> | 
				
			||||
    <div id="org-setting" class="container clear"> | 
				
			||||
        {{template "org/settings/nav" .}} | 
				
			||||
        <div class="grid-4-5 left"> | 
				
			||||
            <div class="setting-content"> | 
				
			||||
                {{template "ng/base/alert" .}} | 
				
			||||
                <div id="setting-content"> | 
				
			||||
                    <div id="user-profile-setting-content" class="panel panel-warning panel-radius"> | 
				
			||||
                        <p class="panel-header"><strong>{{.i18n.Tr "org.settings.delete_account"}}</strong></p> | 
				
			||||
                        <div class="panel-body panel-content"> | 
				
			||||
                            <span class="alert alert-red alert-radius block"><i class="octicon octicon-alert"></i>{{.i18n.Tr "org.settings.delete_prompt" | Str2html}}</span> | 
				
			||||
                            <form  action="/org/{{.Org.LowerName}}/settings/delete" method="post"> | 
				
			||||
                                {{.CsrfTokenHtml}} | 
				
			||||
                                <p class="field"> | 
				
			||||
                                    <span class="form-label"></span> | 
				
			||||
                                    <button class="btn btn-red btn-large btn-radius" id="delete-org-button">{{.i18n.Tr "org.settings.confirm_delete_account"}}</button> | 
				
			||||
                                </p> | 
				
			||||
                            </form> | 
				
			||||
                        </div> | 
				
			||||
                    </div> | 
				
			||||
                </div> | 
				
			||||
            </div> | 
				
			||||
        </div> | 
				
			||||
    </div> | 
				
			||||
</div> | 
				
			||||
{{template "ng/base/footer" .}} | 
				
			||||
@ -0,0 +1,11 @@ | 
				
			||||
<div id="setting-menu" class="grid-1-5 panel panel-radius left"> | 
				
			||||
    <div class="panel-header"> | 
				
			||||
    	<strong>{{.i18n.Tr "org.settings"}}</strong> | 
				
			||||
    </div> | 
				
			||||
    <div class="panel-body"> | 
				
			||||
        <ul class="menu menu-vertical switching-list grid-1-5 left"> | 
				
			||||
            <li {{if .PageIsSettingsOptions}}class="current"{{end}}><a href="/org/{{.Org.LowerName}}/settings">{{.i18n.Tr "org.settings.options"}}</a></li> | 
				
			||||
            <li {{if .PageIsSettingsDelete}}class="current"{{end}}><a href="/org/{{.Org.LowerName}}/settings/delete">{{.i18n.Tr "org.settings.delete"}}</a></li> | 
				
			||||
        </ul> | 
				
			||||
    </div> | 
				
			||||
</div> | 
				
			||||
@ -0,0 +1,56 @@ | 
				
			||||
{{template "ng/base/head" .}} | 
				
			||||
{{template "ng/base/header" .}} | 
				
			||||
<div id="setting-wrapper" class="main-wrapper"> | 
				
			||||
    <div id="org-setting" class="container clear"> | 
				
			||||
	        {{template "org/settings/nav" .}} | 
				
			||||
	        <div class="grid-4-5 left"> | 
				
			||||
	            <div class="setting-content"> | 
				
			||||
	                {{template "ng/base/alert" .}} | 
				
			||||
	                <div id="setting-content"> | 
				
			||||
	                    <div id="user-profile-setting-content" class="panel panel-radius"> | 
				
			||||
	                        <div class="panel-header"> | 
				
			||||
	                        	<strong>{{.i18n.Tr "org.settings.options"}}</strong> | 
				
			||||
	                        </div> | 
				
			||||
	                        <form class="form form-align panel-body" id="org-setting-form" action="/org/{{.Org.LowerName}}/settings" method="post"> | 
				
			||||
	                            {{.CsrfTokenHtml}} | 
				
			||||
                    			<input type="hidden" name="action" value="update"> | 
				
			||||
	                            <div class="field"> | 
				
			||||
	                                <label class="req" for="orgname">{{.i18n.Tr "username"}}</label> | 
				
			||||
	                                <input class="ipt ipt-large ipt-radius {{if .Err_UserName}}ipt-error{{end}}" id="orgname" name="uname" value="{{.Org.Name}}" data-orgname="{{.Org.Name}}" required /> | 
				
			||||
	                            </div> | 
				
			||||
	                            <div class="field"> | 
				
			||||
	                                <label for="full-name">{{.i18n.Tr "org.settings.full_name"}}</label> | 
				
			||||
	                                <input class="ipt ipt-large ipt-radius {{if .Err_FullName}}ipt-error{{end}}" id="full-name" name="fullname" value="{{.Org.FullName}}" /> | 
				
			||||
	                            </div> | 
				
			||||
	                            <div class="field"> | 
				
			||||
	                                <label class="req" for="email">{{.i18n.Tr "email"}}</label> | 
				
			||||
	                                <input class="ipt ipt-large ipt-radius {{if .Err_Email}}ipt-error{{end}}" id="email" name="email" type="email" value="{{.Org.Email}}" required /> | 
				
			||||
	                            </div> | 
				
			||||
					            <div class="field clear"> | 
				
			||||
					                <label class="left" for="desc">{{.i18n.Tr "org.org_desc"}}</label> | 
				
			||||
					                <textarea class="ipt ipt-large ipt-radius {{if .Err_Description}}ipt-error{{end}}" id="desc" name="desc">{{.Org.Description}}</textarea> | 
				
			||||
					            </div> | 
				
			||||
	                            <div class="field"> | 
				
			||||
	                                <label for="website">{{.i18n.Tr "org.settings.website"}}</label> | 
				
			||||
	                                <input class="ipt ipt-large ipt-radius {{if .Err_Website}}ipt-error{{end}}" id="website" name="website" type="url" value="{{.Org.Website}}" /> | 
				
			||||
	                            </div> | 
				
			||||
	                            <div class="field"> | 
				
			||||
	                                <label for="location">{{.i18n.Tr "org.settings.location"}}</label> | 
				
			||||
	                                <input class="ipt ipt-large ipt-radius {{if .Err_Location}}ipt-error{{end}}" id="location" name="location" type="text" value="{{.Org.Location}}" /> | 
				
			||||
	                            </div> | 
				
			||||
	                            <div class="field"> | 
				
			||||
	                                <label for="gravatar-email">Gravatar {{.i18n.Tr "email"}}</label> | 
				
			||||
	                                <input class="ipt ipt-large ipt-radius {{if .Err_Avatar}}ipt-error{{end}}" id="gravatar-email" name="avatar" type="text" value="{{.Org.AvatarEmail}}" /> | 
				
			||||
	                            </div> | 
				
			||||
	                            <div class="field"> | 
				
			||||
	                                <span class="form-label"></span> | 
				
			||||
	                                <button class="btn btn-green btn-large btn-radius">{{.i18n.Tr "org.settings.update_settings"}}</button> | 
				
			||||
	                            </div> | 
				
			||||
	                        </form> | 
				
			||||
	                    </div> | 
				
			||||
	                </div> | 
				
			||||
	            </div> | 
				
			||||
	    </div> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
{{template "ng/base/footer" .}} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue