| @@ -104,6 +104,7 @@ type User struct { | |||||
| Rands string `xorm:"VARCHAR(10)"` | Rands string `xorm:"VARCHAR(10)"` | ||||
| Salt string `xorm:"VARCHAR(10)"` | Salt string `xorm:"VARCHAR(10)"` | ||||
| Language string `xorm:"VARCHAR(5)"` | Language string `xorm:"VARCHAR(5)"` | ||||
| Description string | |||||
| CreatedUnix util.TimeStamp `xorm:"INDEX created"` | CreatedUnix util.TimeStamp `xorm:"INDEX created"` | ||||
| UpdatedUnix util.TimeStamp `xorm:"INDEX updated"` | UpdatedUnix util.TimeStamp `xorm:"INDEX updated"` | ||||
| @@ -134,12 +135,11 @@ type User struct { | |||||
| NumRepos int | NumRepos int | ||||
| // For organization | // For organization | ||||
| Description string | |||||
| NumTeams int | |||||
| NumMembers int | |||||
| Teams []*Team `xorm:"-"` | |||||
| Members []*User `xorm:"-"` | |||||
| Visibility structs.VisibleType `xorm:"NOT NULL DEFAULT 0"` | |||||
| NumTeams int | |||||
| NumMembers int | |||||
| Teams []*Team `xorm:"-"` | |||||
| Members []*User `xorm:"-"` | |||||
| Visibility structs.VisibleType `xorm:"NOT NULL DEFAULT 0"` | |||||
| // Preferences | // Preferences | ||||
| DiffViewStyle string `xorm:"NOT NULL DEFAULT ''"` | DiffViewStyle string `xorm:"NOT NULL DEFAULT ''"` | ||||
| @@ -201,6 +201,7 @@ type UpdateProfileForm struct { | |||||
| Website string `binding:"ValidUrl;MaxSize(255)"` | Website string `binding:"ValidUrl;MaxSize(255)"` | ||||
| Location string `binding:"MaxSize(50)"` | Location string `binding:"MaxSize(50)"` | ||||
| Language string `binding:"Size(5)"` | Language string `binding:"Size(5)"` | ||||
| Description string `binding:"MaxSize(255)"` | |||||
| } | } | ||||
| // Validate validates the fields | // Validate validates the fields | ||||
| @@ -334,6 +334,7 @@ following = Following | |||||
| follow = Follow | follow = Follow | ||||
| unfollow = Unfollow | unfollow = Unfollow | ||||
| heatmap.loading = Loading Heatmap… | heatmap.loading = Loading Heatmap… | ||||
| user_bio = Biography | |||||
| form.name_reserved = The username '%s' is reserved. | form.name_reserved = The username '%s' is reserved. | ||||
| form.name_pattern_not_allowed = The pattern '%s' is not allowed in a username. | form.name_pattern_not_allowed = The pattern '%s' is not allowed in a username. | ||||
| @@ -92,6 +92,7 @@ func ProfilePost(ctx *context.Context, form auth.UpdateProfileForm) { | |||||
| ctx.User.Website = form.Website | ctx.User.Website = form.Website | ||||
| ctx.User.Location = form.Location | ctx.User.Location = form.Location | ||||
| ctx.User.Language = form.Language | ctx.User.Language = form.Language | ||||
| ctx.User.Description = form.Description | |||||
| if err := models.UpdateUserSetting(ctx.User); err != nil { | if err := models.UpdateUserSetting(ctx.User); err != nil { | ||||
| if _, ok := err.(models.ErrEmailAlreadyUsed); ok { | if _, ok := err.(models.ErrEmailAlreadyUsed); ok { | ||||
| ctx.Flash.Error(ctx.Tr("form.email_been_used")) | ctx.Flash.Error(ctx.Tr("form.email_been_used")) | ||||
| @@ -34,6 +34,12 @@ | |||||
| <a target="_blank" rel="noopener noreferrer me" href="{{.Owner.Website}}">{{.Owner.Website}}</a> | <a target="_blank" rel="noopener noreferrer me" href="{{.Owner.Website}}">{{.Owner.Website}}</a> | ||||
| </li> | </li> | ||||
| {{end}} | {{end}} | ||||
| {{if .Owner.Description}} | |||||
| <li> | |||||
| <i class="octicon octicon-info"></i> | |||||
| <span>{{.Owner.Description}}</span> | |||||
| </li> | |||||
| {{end}} | |||||
| {{range .OpenIDs}} | {{range .OpenIDs}} | ||||
| {{if .Show}} | {{if .Show}} | ||||
| <li> | <li> | ||||
| @@ -31,6 +31,10 @@ | |||||
| <input name="keep_email_private" type="checkbox" {{if .SignedUser.KeepEmailPrivate}}checked{{end}}> | <input name="keep_email_private" type="checkbox" {{if .SignedUser.KeepEmailPrivate}}checked{{end}}> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <div class="field {{if .Err_Description}}error{{end}}"> | |||||
| <label for="description">{{$.i18n.Tr "user.user_bio"}}</label> | |||||
| <textarea id="description" name="description" rows="2">{{.SignedUser.Description}}</textarea> | |||||
| </div> | |||||
| <div class="field {{if .Err_Website}}error{{end}}"> | <div class="field {{if .Err_Website}}error{{end}}"> | ||||
| <label for="website">{{.i18n.Tr "settings.website"}}</label> | <label for="website">{{.i18n.Tr "settings.website"}}</label> | ||||
| <input id="website" name="website" type="url" value="{{.SignedUser.Website}}"> | <input id="website" name="website" type="url" value="{{.SignedUser.Website}}"> | ||||