mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-27 02:10:40 +00:00
save custom avatar as PNG
This commit is contained in:
parent
6a664e88c7
commit
1559bd58e7
5 changed files with 29 additions and 20 deletions
|
@ -13,7 +13,7 @@ watch_dirs = [
|
||||||
watch_exts = [".go"]
|
watch_exts = [".go"]
|
||||||
build_delay = 1500
|
build_delay = 1500
|
||||||
cmds = [
|
cmds = [
|
||||||
["go", "install"], # sqlite redis memcache cert pam tidb
|
["go", "install", "-race"], # sqlite redis memcache cert pam tidb
|
||||||
["go", "build"],
|
["go", "build", "-race"],
|
||||||
["./gogs", "web"]
|
["./gogs", "web"]
|
||||||
]
|
]
|
|
@ -14,6 +14,7 @@ import (
|
||||||
"image"
|
"image"
|
||||||
"image/jpeg"
|
"image/jpeg"
|
||||||
_ "image/jpeg"
|
_ "image/jpeg"
|
||||||
|
"image/png"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
@ -253,11 +254,9 @@ func (u *User) ValidatePassword(passwd string) bool {
|
||||||
// UploadAvatar saves custom avatar for user.
|
// UploadAvatar saves custom avatar for user.
|
||||||
// FIXME: split uploads to different subdirs in case we have massive users.
|
// FIXME: split uploads to different subdirs in case we have massive users.
|
||||||
func (u *User) UploadAvatar(data []byte) error {
|
func (u *User) UploadAvatar(data []byte) error {
|
||||||
u.UseCustomAvatar = true
|
|
||||||
|
|
||||||
img, _, err := image.Decode(bytes.NewReader(data))
|
img, _, err := image.Decode(bytes.NewReader(data))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return fmt.Errorf("Decode: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
m := resize.Resize(234, 234, img, resize.NearestNeighbor)
|
m := resize.Resize(234, 234, img, resize.NearestNeighbor)
|
||||||
|
@ -268,19 +267,20 @@ func (u *User) UploadAvatar(data []byte) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err = sess.Id(u.Id).AllCols().Update(u); err != nil {
|
u.UseCustomAvatar = true
|
||||||
return err
|
if err = updateUser(sess, u); err != nil {
|
||||||
|
return fmt.Errorf("updateUser: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
os.MkdirAll(setting.AvatarUploadPath, os.ModePerm)
|
os.MkdirAll(setting.AvatarUploadPath, os.ModePerm)
|
||||||
fw, err := os.Create(u.CustomAvatarPath())
|
fw, err := os.Create(u.CustomAvatarPath())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return fmt.Errorf("Create: %v", err)
|
||||||
}
|
}
|
||||||
defer fw.Close()
|
defer fw.Close()
|
||||||
|
|
||||||
if err = jpeg.Encode(fw, m, nil); err != nil {
|
if err = png.Encode(fw, m); err != nil {
|
||||||
return err
|
return fmt.Errorf("Encode: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return sess.Commit()
|
return sess.Commit()
|
||||||
|
|
|
@ -39,6 +39,8 @@ import (
|
||||||
"github.com/gogits/gogs/modules/setting"
|
"github.com/gogits/gogs/modules/setting"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
//FIXME: remove cache module
|
||||||
|
|
||||||
var gravatarSource string
|
var gravatarSource string
|
||||||
|
|
||||||
func UpdateGravatarSource() {
|
func UpdateGravatarSource() {
|
||||||
|
@ -153,7 +155,7 @@ func (this *Avatar) Encode(wr io.Writer, size int) (err error) {
|
||||||
if img, err = decodeImageFile(imgPath); err != nil {
|
if img, err = decodeImageFile(imgPath); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
m := resize.Resize(uint(size), 0, img, resize.NearestNeighbor)
|
m := resize.Resize(uint(size), 0, img, resize.Lanczos3)
|
||||||
return jpeg.Encode(wr, m, nil)
|
return jpeg.Encode(wr, m, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -205,7 +205,7 @@ func Contexter() macaron.Handler {
|
||||||
Session: sess,
|
Session: sess,
|
||||||
}
|
}
|
||||||
// Compute current URL for real-time change language.
|
// Compute current URL for real-time change language.
|
||||||
ctx.Data["Link"] = setting.AppSubUrl + ctx.Req.URL.Path
|
ctx.Data["Link"] = setting.AppSubUrl + strings.TrimSuffix(ctx.Req.URL.Path, "/")
|
||||||
|
|
||||||
ctx.Data["PageStartTime"] = time.Now()
|
ctx.Data["PageStartTime"] = time.Now()
|
||||||
|
|
||||||
|
|
|
@ -111,6 +111,7 @@ func Dashboard(ctx *middleware.Context) {
|
||||||
|
|
||||||
// Check access of private repositories.
|
// Check access of private repositories.
|
||||||
feeds := make([]*models.Action, 0, len(actions))
|
feeds := make([]*models.Action, 0, len(actions))
|
||||||
|
unameAvatars := make(map[string]string)
|
||||||
for _, act := range actions {
|
for _, act := range actions {
|
||||||
if act.IsPrivate {
|
if act.IsPrivate {
|
||||||
// This prevents having to retrieve the repository for each action
|
// This prevents having to retrieve the repository for each action
|
||||||
|
@ -122,16 +123,22 @@ func Dashboard(ctx *middleware.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
// FIXME: cache results?
|
|
||||||
u, err := models.GetUserByName(act.ActUserName)
|
// Cache results to reduce queries.
|
||||||
if err != nil {
|
_, ok := unameAvatars[act.ActUserName]
|
||||||
if models.IsErrUserNotExist(err) {
|
if !ok {
|
||||||
continue
|
u, err := models.GetUserByName(act.ActUserName)
|
||||||
|
if err != nil {
|
||||||
|
if models.IsErrUserNotExist(err) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
ctx.Handle(500, "GetUserByName", err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
ctx.Handle(500, "GetUserByName", err)
|
unameAvatars[act.ActUserName] = u.AvatarLink()
|
||||||
return
|
|
||||||
}
|
}
|
||||||
act.ActAvatar = u.AvatarLink()
|
|
||||||
|
act.ActAvatar = unameAvatars[act.ActUserName]
|
||||||
feeds = append(feeds, act)
|
feeds = append(feeds, act)
|
||||||
}
|
}
|
||||||
ctx.Data["Feeds"] = feeds
|
ctx.Data["Feeds"] = feeds
|
||||||
|
|
Loading…
Reference in a new issue