From 81eee462129b5d1f0765931432ebe55755c8b9d1 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Mon, 1 Aug 2022 21:05:59 -0400 Subject: [PATCH 01/12] Add badge capabilities to users --- models/migrations/v999.go | 31 +++++++++++++++++++++++++++ models/user.go | 1 + models/user/badge.go | 42 +++++++++++++++++++++++++++++++++++++ routers/web/user/profile.go | 7 +++++++ templates/user/profile.tmpl | 11 ++++++++++ 5 files changed, 92 insertions(+) create mode 100644 models/migrations/v999.go create mode 100644 models/user/badge.go diff --git a/models/migrations/v999.go b/models/migrations/v999.go new file mode 100644 index 0000000000000..9a824292d5842 --- /dev/null +++ b/models/migrations/v999.go @@ -0,0 +1,31 @@ +// Copyright 2022 The Gitea 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 migrations + +import ( + "xorm.io/xorm" +) + +func creatUserBadgesTable(x *xorm.Engine) error { + type Badge struct { + ID int64 `xorm:"pk autoincr"` + Description string + ImageURL string + } + + type UserBadge struct { + ID int64 `xorm:"pk autoincr"` + BadgeID int64 + UserID int64 + } + + if err := x.Sync2(new(Badge)); err != nil { + return err + } + + if err := x.Sync2(new(UserBadge)); err != nil { + return err + } +} diff --git a/models/user.go b/models/user.go index 86a714e746bb2..4afbb9bea5c7d 100644 --- a/models/user.go +++ b/models/user.go @@ -85,6 +85,7 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) (err error) &organization.TeamUser{UID: u.ID}, &issues_model.Stopwatch{UserID: u.ID}, &user_model.Setting{UserID: u.ID}, + &user_model.UserBadge{UserID: u.ID}, &pull_model.AutoMerge{DoerID: u.ID}, &pull_model.ReviewState{UserID: u.ID}, ); err != nil { diff --git a/models/user/badge.go b/models/user/badge.go new file mode 100644 index 0000000000000..805cb1af52225 --- /dev/null +++ b/models/user/badge.go @@ -0,0 +1,42 @@ +// Copyright 2022 The Gitea 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 user + +import ( + "context" + + "code.gitea.io/gitea/models/db" +) + +// Badge represents a user badge +type Badge struct { + ID int64 `xorm:"pk autoincr"` + Description string + ImageURL string +} + +// UserBadge links users with a badge +type UserBadge struct { + ID int64 `xorm:"pk autoincr"` + BadgeID int64 + UserID int64 +} + +func init() { + db.RegisterModel(new(Badge)) + db.RegisterModel(new(UserBadge)) +} + +// GetUserFollowers returns range of user's followers. +func GetUserBadges(ctx context.Context, u *User) ([]*Badge, int64, error) { + sess := db.GetEngine(ctx). + Select("`badge`.*"). + Join("LEFT", "user_badge", "`user_badge`.badge_id=badge.id"). + Where("user_badge.user_id=?", u.ID) + + badges := make([]*Badge, 0, 8) + count, err := sess.FindAndCount(&badges) + return badges, count, err +} diff --git a/routers/web/user/profile.go b/routers/web/user/profile.go index 6f23d239e26a5..c804be3c5f74a 100644 --- a/routers/web/user/profile.go +++ b/routers/web/user/profile.go @@ -105,6 +105,13 @@ func Profile(ctx *context.Context) { ctx.Data["Orgs"] = orgs ctx.Data["HasOrgsVisible"] = organization.HasOrgsVisible(orgs, ctx.Doer) + badges, _, err := user_model.GetUserBadges(ctx, ctx.ContextUser) + if err != nil { + ctx.ServerError("GetUserBadges", err) + return + } + ctx.Data["Badges"] = badges + tab := ctx.FormString("tab") ctx.Data["TabName"] = tab diff --git a/templates/user/profile.tmpl b/templates/user/profile.tmpl index 947c8fcebe281..50ad15663ed80 100644 --- a/templates/user/profile.tmpl +++ b/templates/user/profile.tmpl @@ -69,6 +69,17 @@ {{end}} + {{if .Badges}} +
  • + +
  • + {{end}} {{if and .IsSigned (ne .SignedUserName .Owner.Name)}}
  • {{if $.IsFollowing}} From 9098907124605ab4b9991d1fa05489137d5d88da Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Mon, 1 Aug 2022 21:53:38 -0400 Subject: [PATCH 02/12] add migration --- models/migrations/migrations.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 2719f45efbbbc..aa08f055d34f4 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -406,6 +406,9 @@ var migrations = []Migration{ NewMigration("Drop old CredentialID column", dropOldCredentialIDColumn), // v223 -> v224 NewMigration("Rename CredentialIDBytes column to CredentialID", renameCredentialIDBytes), + + // v999 + NewMigration("Add badges to users", creatUserBadgesTable), } // GetCurrentDBVersion returns the current db version From 8c8f0206aacd4e40575d73b1cee17bfb7777457d Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Mon, 1 Aug 2022 23:19:49 -0400 Subject: [PATCH 03/12] placate lint --- models/migrations/v999.go | 7 ++----- models/user/badge.go | 5 ++--- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/models/migrations/v999.go b/models/migrations/v999.go index 9a824292d5842..7a2a037254d9a 100644 --- a/models/migrations/v999.go +++ b/models/migrations/v999.go @@ -15,7 +15,7 @@ func creatUserBadgesTable(x *xorm.Engine) error { ImageURL string } - type UserBadge struct { + type userBadge struct { ID int64 `xorm:"pk autoincr"` BadgeID int64 UserID int64 @@ -24,8 +24,5 @@ func creatUserBadgesTable(x *xorm.Engine) error { if err := x.Sync2(new(Badge)); err != nil { return err } - - if err := x.Sync2(new(UserBadge)); err != nil { - return err - } + return x.Sync2(new(userBadge)) } diff --git a/models/user/badge.go b/models/user/badge.go index 805cb1af52225..d665f8b59c888 100644 --- a/models/user/badge.go +++ b/models/user/badge.go @@ -17,8 +17,7 @@ type Badge struct { ImageURL string } -// UserBadge links users with a badge -type UserBadge struct { +type userBadge struct { ID int64 `xorm:"pk autoincr"` BadgeID int64 UserID int64 @@ -26,7 +25,7 @@ type UserBadge struct { func init() { db.RegisterModel(new(Badge)) - db.RegisterModel(new(UserBadge)) + db.RegisterModel(new(userBadge)) } // GetUserFollowers returns range of user's followers. From 4e94f51ad188d61fd75e824cb08f566563bd183e Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Wed, 3 Aug 2022 11:18:25 -0400 Subject: [PATCH 04/12] placate lint --- .golangci.yml | 4 ++++ models/user/badge.go | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 11c58454a0073..391827e9f2215 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -171,3 +171,7 @@ issues: - path: models/user/openid.go linters: - golint + - path: models/user/badge.go + linters: + - revive + text: "exported: type name will be used as user.UserBadge by other packages, and that stutters; consider calling this Badge" diff --git a/models/user/badge.go b/models/user/badge.go index d665f8b59c888..eb8607f4a0656 100644 --- a/models/user/badge.go +++ b/models/user/badge.go @@ -17,7 +17,8 @@ type Badge struct { ImageURL string } -type userBadge struct { +// UserBadge represents a user badge +type UserBadge struct { ID int64 `xorm:"pk autoincr"` BadgeID int64 UserID int64 @@ -25,7 +26,7 @@ type userBadge struct { func init() { db.RegisterModel(new(Badge)) - db.RegisterModel(new(userBadge)) + db.RegisterModel(new(UserBadge)) } // GetUserFollowers returns range of user's followers. From 4e0c6395e00b45d459fe0ff5cecc4b9400c6c936 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Wed, 3 Aug 2022 18:45:31 -0400 Subject: [PATCH 05/12] Update templates/user/profile.tmpl Co-authored-by: silverwind --- templates/user/profile.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/user/profile.tmpl b/templates/user/profile.tmpl index 50ad15663ed80..c514df6e96c15 100644 --- a/templates/user/profile.tmpl +++ b/templates/user/profile.tmpl @@ -74,7 +74,7 @@
      {{range .Badges}}
    • - {{ .Description}} + {{.Description}}
    • {{end}}
    From 6dafa31050d01106a044e965879e2b9f49711a12 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Sun, 14 Aug 2022 16:46:24 -0400 Subject: [PATCH 06/12] Update models/user/badge.go Co-authored-by: zeripath --- models/user/badge.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/user/badge.go b/models/user/badge.go index eb8607f4a0656..5cf7d94aa92d1 100644 --- a/models/user/badge.go +++ b/models/user/badge.go @@ -29,7 +29,7 @@ func init() { db.RegisterModel(new(UserBadge)) } -// GetUserFollowers returns range of user's followers. +// GetUserBadges returns the user's badges. func GetUserBadges(ctx context.Context, u *User) ([]*Badge, int64, error) { sess := db.GetEngine(ctx). Select("`badge`.*"). From 0145a5ee316a94f326232435cf8557eb93b9d525 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Tue, 16 Aug 2022 13:28:19 -0400 Subject: [PATCH 07/12] Update models/user/badge.go Co-authored-by: zeripath --- models/user/badge.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/user/badge.go b/models/user/badge.go index 5cf7d94aa92d1..a92ac0c3dc01a 100644 --- a/models/user/badge.go +++ b/models/user/badge.go @@ -33,7 +33,7 @@ func init() { func GetUserBadges(ctx context.Context, u *User) ([]*Badge, int64, error) { sess := db.GetEngine(ctx). Select("`badge`.*"). - Join("LEFT", "user_badge", "`user_badge`.badge_id=badge.id"). + Join("INNER", "user_badge", "`user_badge`.badge_id=badge.id"). Where("user_badge.user_id=?", u.ID) badges := make([]*Badge, 0, 8) From 8ccfd7acb4f206c5c898462a822179422da19a47 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Tue, 16 Aug 2022 14:41:24 -0400 Subject: [PATCH 08/12] update per suggestions --- templates/user/profile.tmpl | 2 +- web_src/less/_user.less | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/templates/user/profile.tmpl b/templates/user/profile.tmpl index c514df6e96c15..8cfa0a73e52d7 100644 --- a/templates/user/profile.tmpl +++ b/templates/user/profile.tmpl @@ -74,7 +74,7 @@
      {{range .Badges}}
    • - {{.Description}} + {{.Description}}
    • {{end}}
    diff --git a/web_src/less/_user.less b/web_src/less/_user.less index a9b6c02fb7af0..3becc21b03bdf 100644 --- a/web_src/less/_user.less +++ b/web_src/less/_user.less @@ -169,6 +169,21 @@ } } +.user-badges { + display: flex; + flex-flow: row wrap; + padding: 0; + margin: -3px !important; + + li { + display: flex; + border-bottom: 0 !important; + padding: 3px !important; + width: 20%; + max-width: 60px; + } +} + #notification_div .tab.segment { overflow-x: auto; } From 5a0887b366d68ca64e1fd0102a7b72bae510abdb Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Tue, 16 Aug 2022 15:25:10 -0400 Subject: [PATCH 09/12] update per suggestions --- web_src/less/_user.less | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/web_src/less/_user.less b/web_src/less/_user.less index 3becc21b03bdf..46b8409634bc5 100644 --- a/web_src/less/_user.less +++ b/web_src/less/_user.less @@ -170,18 +170,9 @@ } .user-badges { - display: flex; - flex-flow: row wrap; - padding: 0; - margin: -3px !important; - - li { - display: flex; - border-bottom: 0 !important; - padding: 3px !important; - width: 20%; - max-width: 60px; - } + display: grid; + grid-template-columns: repeat(auto-fill, 64px); + gap: 2px; } #notification_div .tab.segment { From 9f4b043d9ec68dfd2fd7bcfff10776bbf86ca437 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Tue, 16 Aug 2022 15:33:06 -0400 Subject: [PATCH 10/12] update per suggestions - add index --- models/migrations/v999.go | 2 +- models/user/badge.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/models/migrations/v999.go b/models/migrations/v999.go index 7a2a037254d9a..d684d538df222 100644 --- a/models/migrations/v999.go +++ b/models/migrations/v999.go @@ -18,7 +18,7 @@ func creatUserBadgesTable(x *xorm.Engine) error { type userBadge struct { ID int64 `xorm:"pk autoincr"` BadgeID int64 - UserID int64 + UserID int64 `xorm:"INDEX"` } if err := x.Sync2(new(Badge)); err != nil { diff --git a/models/user/badge.go b/models/user/badge.go index a92ac0c3dc01a..5ff840cb8c35e 100644 --- a/models/user/badge.go +++ b/models/user/badge.go @@ -21,7 +21,7 @@ type Badge struct { type UserBadge struct { ID int64 `xorm:"pk autoincr"` BadgeID int64 - UserID int64 + UserID int64 `xorm:"INDEX"` } func init() { From b7ed05e739cbb54f65fe9330836c703c41da11d6 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Tue, 16 Aug 2022 16:14:51 -0400 Subject: [PATCH 11/12] Update web_src/less/_user.less Co-authored-by: silverwind --- web_src/less/_user.less | 3 +++ 1 file changed, 3 insertions(+) diff --git a/web_src/less/_user.less b/web_src/less/_user.less index 46b8409634bc5..eb9e791d86e87 100644 --- a/web_src/less/_user.less +++ b/web_src/less/_user.less @@ -175,6 +175,9 @@ gap: 2px; } +.user-badges img { + object-fit: contain; +} #notification_div .tab.segment { overflow-x: auto; } From bfaa6f4ceaa96dc60caa29bd428b6abcc75bd56c Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Tue, 16 Aug 2022 16:15:00 -0400 Subject: [PATCH 12/12] Update templates/user/profile.tmpl Co-authored-by: silverwind --- templates/user/profile.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/user/profile.tmpl b/templates/user/profile.tmpl index 8cfa0a73e52d7..2a973c2d5bc04 100644 --- a/templates/user/profile.tmpl +++ b/templates/user/profile.tmpl @@ -74,7 +74,7 @@
      {{range .Badges}}
    • - {{.Description}} + {{.Description}}
    • {{end}}