Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
3 changes: 3 additions & 0 deletions models/migrations/migrations.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
28 changes: 28 additions & 0 deletions models/migrations/v999.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// 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
}
return x.Sync2(new(userBadge))
}
1 change: 1 addition & 0 deletions models/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
42 changes: 42 additions & 0 deletions models/user/badge.go
Original file line number Diff line number Diff line change
@@ -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 represents a user 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
}
7 changes: 7 additions & 0 deletions routers/web/user/profile.go
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
11 changes: 11 additions & 0 deletions templates/user/profile.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,17 @@
</ul>
</li>
{{end}}
{{if .Badges}}
<li>
<ul class="user-badges">
{{range .Badges}}
<li>
<img src="{{ .ImageURL }}" alt="{{ .Description}}" />
</li>
{{end}}
</ul>
</li>
{{end}}
{{if and .IsSigned (ne .SignedUserName .Owner.Name)}}
<li class="follow">
{{if $.IsFollowing}}
Expand Down