Skip to content

Commit fdd742b

Browse files
authored
Merge branch 'main' into fix-20621-no-err-in-IsUserAllowedToUpdate
2 parents b93d5b7 + 4a797f8 commit fdd742b

File tree

11 files changed

+137
-1
lines changed

11 files changed

+137
-1
lines changed

.golangci.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,3 +171,7 @@ issues:
171171
- path: models/user/openid.go
172172
linters:
173173
- golint
174+
- path: models/user/badge.go
175+
linters:
176+
- revive
177+
text: "exported: type name will be used as user.UserBadge by other packages, and that stutters; consider calling this Badge"

models/migrations/migrations.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,9 @@ var migrations = []Migration{
406406
NewMigration("Drop old CredentialID column", dropOldCredentialIDColumn),
407407
// v223 -> v224
408408
NewMigration("Rename CredentialIDBytes column to CredentialID", renameCredentialIDBytes),
409+
410+
// v999
411+
NewMigration("Add badges to users", creatUserBadgesTable),
409412
}
410413

411414
// GetCurrentDBVersion returns the current db version

models/migrations/v999.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright 2022 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package migrations
6+
7+
import (
8+
"xorm.io/xorm"
9+
)
10+
11+
func creatUserBadgesTable(x *xorm.Engine) error {
12+
type Badge struct {
13+
ID int64 `xorm:"pk autoincr"`
14+
Description string
15+
ImageURL string
16+
}
17+
18+
type userBadge struct {
19+
ID int64 `xorm:"pk autoincr"`
20+
BadgeID int64
21+
UserID int64 `xorm:"INDEX"`
22+
}
23+
24+
if err := x.Sync2(new(Badge)); err != nil {
25+
return err
26+
}
27+
return x.Sync2(new(userBadge))
28+
}

models/user.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ func DeleteUser(ctx context.Context, u *user_model.User, purge bool) (err error)
8585
&organization.TeamUser{UID: u.ID},
8686
&issues_model.Stopwatch{UserID: u.ID},
8787
&user_model.Setting{UserID: u.ID},
88+
&user_model.UserBadge{UserID: u.ID},
8889
&pull_model.AutoMerge{DoerID: u.ID},
8990
&pull_model.ReviewState{UserID: u.ID},
9091
); err != nil {

models/user/badge.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Copyright 2022 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package user
6+
7+
import (
8+
"context"
9+
10+
"code.gitea.io/gitea/models/db"
11+
)
12+
13+
// Badge represents a user badge
14+
type Badge struct {
15+
ID int64 `xorm:"pk autoincr"`
16+
Description string
17+
ImageURL string
18+
}
19+
20+
// UserBadge represents a user badge
21+
type UserBadge struct {
22+
ID int64 `xorm:"pk autoincr"`
23+
BadgeID int64
24+
UserID int64 `xorm:"INDEX"`
25+
}
26+
27+
func init() {
28+
db.RegisterModel(new(Badge))
29+
db.RegisterModel(new(UserBadge))
30+
}
31+
32+
// GetUserBadges returns the user's badges.
33+
func GetUserBadges(ctx context.Context, u *User) ([]*Badge, int64, error) {
34+
sess := db.GetEngine(ctx).
35+
Select("`badge`.*").
36+
Join("INNER", "user_badge", "`user_badge`.badge_id=badge.id").
37+
Where("user_badge.user_id=?", u.ID)
38+
39+
badges := make([]*Badge, 0, 8)
40+
count, err := sess.FindAndCount(&badges)
41+
return badges, count, err
42+
}

options/locale/locale_de-DE.ini

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,6 +1031,7 @@ file_view_rendered=Ansicht rendern
10311031
file_view_raw=Originalformat anzeigen
10321032
file_permalink=Permalink
10331033
file_too_large=Die Datei ist zu groß zum Anzeigen.
1034+
ambiguous_character=`%[1]c [U+%04[1]X] kann mit %[2]c [U+%04[2]X] verwechselt werden`
10341035
10351036
escape_control_characters=Escapen
10361037
unescape_control_characters=Unescapen
@@ -1051,6 +1052,7 @@ normal_view=Normale Ansicht
10511052
line=zeile
10521053
lines=Zeilen
10531054
1055+
editor.add_file=Datei hinzufügen
10541056
editor.new_file=Neue Datei
10551057
editor.upload_file=Datei hochladen
10561058
editor.edit_file=Datei bearbeiten
@@ -1256,6 +1258,8 @@ issues.filter_milestone=Meilenstein
12561258
issues.filter_milestone_no_select=Alle Meilensteine
12571259
issues.filter_assignee=Zuständig
12581260
issues.filter_assginee_no_select=Alle Zuständigen
1261+
issues.filter_poster=Autor
1262+
issues.filter_poster_no_select=Alle Autoren
12591263
issues.filter_type=Typ
12601264
issues.filter_type.all_issues=Alle Issues
12611265
issues.filter_type.assigned_to_you=Dir zugewiesen
@@ -2782,7 +2786,9 @@ config.deliver_timeout=Zeitlimit für Zustellung
27822786
config.skip_tls_verify=TLS-Verifikation überspringen
27832787

27842788
config.mailer_enabled=Aktiviert
2789+
config.mailer_enable_helo=HELO aktivieren
27852790
config.mailer_name=Name
2791+
config.mailer_protocol=Protokoll
27862792
config.mailer_user=Benutzer
27872793
config.mailer_use_sendmail=Sendmail benutzen
27882794
config.mailer_sendmail_path=Sendmail-Pfad
@@ -3089,6 +3095,7 @@ npm.dependencies.development=Entwicklungsabhängigkeiten
30893095
npm.dependencies.peer=Peer Abhängigkeiten
30903096
npm.dependencies.optional=Optionale Abhängigkeiten
30913097
npm.details.tag=Tag
3098+
pub.install=Um das Paket mit Dart zu installieren, führe den folgenden Befehl aus:
30923099
pypi.requires=Erfordert Python
30933100
pypi.install=Nutze folgenden Befehl, um das Paket mit pip zu installieren:
30943101
pypi.documentation=Weitere Informationen zur PyPI-Paketverwaltung findest du in der <a target="_blank" rel="noopener noreferrer" href="https://docs.gitea.io/en-us/packages/pypi/">Dokumentation</a>.

options/locale/locale_fr-FR.ini

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,7 @@ reset_password.text=Veuillez cliquer sur le lien suivant pour récupérer votre
372372

373373
register_success=Inscription réussie
374374

375+
issue_assigned.pull=@%[1]s vous a assigné à la demande d’ajout %[2]s dans le dépôt %[3]s.
375376
issue_assigned.issue=@%[1]s vous a assigné le ticket %[2]s dans le dépôt %[3]s.
376377

377378
issue.x_mentioned_you=<b>@%s</b> vous a mentionné:
@@ -1418,6 +1419,7 @@ compare.compare_head=comparer
14181419
14191420
pulls.desc=Activer les demandes de fusion et la revue de code.
14201421
pulls.new=Nouvelle demande d'ajout
1422+
pulls.view=Voir la demande d'ajout
14211423
pulls.compare_changes=Nouvelle demande de fusion
14221424
pulls.compare_changes_desc=Sélectionnez la branche dans laquelle fusionner et la branche depuis laquelle tirer les modifications.
14231425
pulls.compare_base=fusionner dans
@@ -1427,6 +1429,7 @@ pulls.filter_branch=Filtre de branche
14271429
pulls.no_results=Aucun résultat trouvé.
14281430
pulls.nothing_to_compare=Ces branches sont identiques. Il n'y a pas besoin de créer une demande de fusion.
14291431
pulls.nothing_to_compare_and_allow_empty_pr=Ces branches sont égales. Cette demande d'ajout sera vide.
1432+
pulls.has_pull_request='Il existe déjà une demande d'ajout entre ces deux branches : <a href="%[1]s">%[2]s#%[3]d</a>'
14301433
pulls.create=Créer une demande d'ajout
14311434
pulls.title_desc=veut fusionner %[1]d révision(s) depuis <code>%[2]s</code> vers <code id="branch_target">%[3]s</code>
14321435
pulls.merged_title_desc=a fusionné %[1]d révision(s) à partir de <code>%[2]s</code> vers <code>%[3]s</code> %[4]s
@@ -1455,7 +1458,6 @@ pulls.required_status_check_missing=Certains contrôles requis sont manquants.
14551458
pulls.required_status_check_administrator=En tant qu'administrateur, vous pouvez toujours fusionner cette requête de pull.
14561459
pulls.blocked_by_approvals=Cette demande d'ajout n'a pas assez d'approbation. %d sur %d approbations accordées.
14571460
pulls.blocked_by_rejection=Cette demande de fusion a des modifications demandées par un réviseur officiel.
1458-
pulls.blocked_by_official_review_requests=Cette demande d'ajout a des demandes de revue officielles.
14591461
pulls.blocked_by_outdated_branch=Cette demande d'ajout est bloquée car elle est obsolète.
14601462
pulls.blocked_by_changed_protected_files_1=Cette demande d'ajout est bloquée car elle modifie un fichier protégé :
14611463
pulls.blocked_by_changed_protected_files_n=Cette Pull Request est bloquée car elle modifie les fichiers protégés :
@@ -1477,6 +1479,10 @@ pulls.no_merge_helper=Activez des options de fusion dans les paramètres du dép
14771479
pulls.no_merge_wip=Cette demande d'ajout ne peut pas être fusionnée car elle est marquée comme en cours de chantier.
14781480
pulls.no_merge_not_ready=Cette demande d'ajout n'est pas prête à être fusionnée, vérifiez l'état de la revue et les vérifications.
14791481
pulls.no_merge_access=Vous n'êtes pas autorisé⋅e à fusionner cette demande d'ajout.
1482+
pulls.merge_pull_request=Créer une révision de fusion
1483+
pulls.rebase_merge_pull_request=Rebaser puis avancer rapidement
1484+
pulls.rebase_merge_commit_pull_request=Rebaser puis créer une révision de fusion
1485+
pulls.squash_merge_pull_request=Créer une révision de concaténation
14801486
pulls.merge_manually=Fusionné manuellement
14811487
pulls.merge_commit_id=L'ID de la révision de fusion
14821488
pulls.require_signed_wont_sign=La branche nécessite des révisions signées mais cette fusion ne sera pas signée
@@ -1507,9 +1513,17 @@ pulls.merge_instruction_hint=`Vous pouvez également voir <a class="show-instruc
15071513
pulls.merge_instruction_step1_desc=Depuis le dépôt de votre projet, sélectionnez une nouvelle branche et testez les modifications.
15081514
pulls.merge_instruction_step2_desc=Fusionner les modifications et mettre à jour sur Gitea.
15091515
1516+
pulls.auto_merge_newly_scheduled=La demande d'ajout était programmée pour fusionner lorsque toutes les vérifications aurait réussi.
1517+
pulls.auto_merge_has_pending_schedule=%[1]s Ont planifié cette demande d'ajout pour fusionner automatiquement lorsque toutes les vérifications réussissent %[2]s.
15101518
1519+
pulls.auto_merge_not_scheduled=Cette demande d'ajout n'est pas planifiée pour fusionner automatiquement.
1520+
pulls.auto_merge_canceled_schedule=La fusion automatique a été annulée pour cette demande d'ajout.
15111521

1522+
pulls.auto_merge_newly_scheduled_comment=`a programmé cette demande de fusion automatique lorsque toutes les vérifications réussissent %[1]s`
1523+
pulls.auto_merge_canceled_schedule_comment=`a annulé la fusion automatique de cette demande d'ajout lorsque toutes les vérifications réussissent %[1]s`
15121524
1525+
pulls.delete.title=Supprimer cette demande d'ajout ?
1526+
pulls.delete.text=Voulez-vous vraiment supprimer cet demande d'ajout ? (Cela supprimera définitivement tout le contenu. Envisagez de le fermer à la place, si vous avez l'intention de le garder archivé)
15131527

15141528
milestones.new=Nouveau jalon
15151529
milestones.closed=%s fermé
@@ -1704,6 +1718,7 @@ settings.pulls.allow_rebase_merge_commit=Activer le rebasage avec un commit de f
17041718
settings.pulls.allow_squash_commits=Activer la concaténation de révisions
17051719
settings.pulls.allow_manual_merge=Activer le marquage des demandes d'ajout comme fusionnées manuellement
17061720
settings.pulls.enable_autodetect_manual_merge=Activer la détection automatique de la fusion manuelle (Remarque : dans certains cas particuliers, des erreurs de détection peuvent se produire)
1721+
settings.pulls.allow_rebase_update=Activer la mise à jour de demande d'ajout par rebase
17071722
settings.pulls.default_delete_branch_after_merge=Supprimer la branche après la fusion par default
17081723
settings.projects_desc=Activer les projets de dépôt
17091724
settings.admin_settings=Paramètres administrateur
@@ -2671,13 +2686,20 @@ notices.delete_success=Les informations systèmes ont été supprimées.
26712686
[action]
26722687
create_repo=a créé le dépôt <a href="%s">%s</a>
26732688
rename_repo=a rebaptisé le dépôt de <code>%[1]s</code> vers <a href="%[2]s">%[3]s</a>
2689+
create_pull_request=`a créé la demande d'ajout <a href="%[1]s">%[3]s#%[2]s</a>`
2690+
close_pull_request=`a fermé la demande d'ajout <a href="%[1]s">%[3]s#%[2]s</a>`
2691+
reopen_pull_request=`a réouvert la demande d'ajout <a href="%[1]s">%[3]s#%[2]s</a>`
2692+
comment_pull=`a commenté la demande d'ajout <a href="%[1]s">%[3]s#%[2]s</a>`
2693+
merge_pull_request=`a fusionné la demande d'ajout <a href="%[1]s">%[3]s#%[2]s</a>`
26742694
transfer_repo=a transféré le dépôt <code>%s</code> à <a href="%s">%s</a>
26752695
delete_tag=étiquette supprimée %[2]s de <a href="%[1]s">%[3]s</a>
26762696
delete_branch=branche %[2]s supprimée de <a href="%[1]s">%[3]s</a>
26772697
compare_branch=Comparer
26782698
compare_commits=Comparer %d révisions
26792699
compare_commits_general=Comparer les révisions
26802700
mirror_sync_delete=a synchronisé puis supprimé la nouvelle référence <code>%[2]s</code> vers <a href="%[1]s">%[3]s</a> depuis le miroir
2701+
approve_pull_request=`a approuvé <a href="%[1]s">%[3]s#%[2]s</a>`
2702+
reject_pull_request=`a suggérés des changements pour <a href="%[1]s">%[3]s#%[2]s</a>`
26812703
review_dismissed_reason=Raison :
26822704
26832705
[tool]

options/locale/locale_tr-TR.ini

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,6 +1038,7 @@ file_too_large=Bu dosya görüntülemek için çok büyük.
10381038
invisible_runes_header=`Bu dosya görünmez Evrensel Kodlu karakter içeriyor!`
10391039
invisible_runes_description=`Bu dosya, aşağıda görünenden farklı bir şekilde işlenebilecek görünmez Evrensel Kodlu karakter içeriyor. Eğer bunu kasıtlı ve meşru olarak yaptıysanız bu uyarıyı yok sayabilirsiniz. Gizli karakterleri göstermek için Kaçış düğmesine tıklayın.`
10401040
ambiguous_runes_header=`Bu dosya muğlak Evrensel Kodlu karakter içeriyor!`
1041+
ambiguous_runes_description=`Bu dosya, aşağıda görünenden farklı bir şekilde işlenebilecek muğlak Evrensel Kodlu karakter içeriyor. Eğer bunu kasıtlı ve meşru olarak yaptıysanız bu uyarıyı yok sayabilirsiniz. Bu karakterleri göstermek için Kaçış düğmesine tıklayın.`
10411042
invisible_runes_line=`Bu satırda görünmez evrensel kodlu karakter var`
10421043
ambiguous_runes_line=`Bu satırda muğlak evrensel kodlu karakter var`
10431044
ambiguous_character=`%[1]c [U+%04[1]X], %[2]c [U+%04[2]X] ile karıştırılabilir`
@@ -2894,6 +2895,7 @@ monitor.queue.nopool.title=Çalışan Havuzu Yok
28942895
monitor.queue.nopool.desc=Bu kuyruk diğer kuyrukları sarar ve kendisinin bir işçi havuzu yoktur.
28952896
monitor.queue.wrapped.desc=Sarılmış bir kuyruk, yavaş bir başlangıç kuyruğunu sararak kanaldaki kuyruk isteklerini arabelleğe alır. Bir işçi havuzu yoktur.
28962897
monitor.queue.persistable-channel.desc=Kesintisiz bir kanal, kendi alt havuzuna sahip bir kanal kuyruğu ve önceki kapanmalardan gelen kalıcı istekler için bir seviye kuyruğu olan iki kuyruğu sarar. Bir işçi havuzu yoktur.
2898+
monitor.queue.flush=Çalışanı boşalt
28972899
monitor.queue.pool.timeout=Zaman aşımı
28982900
monitor.queue.pool.addworkers.title=Çalışan Ekle
28992901
monitor.queue.pool.addworkers.submit=Çalışan Ekle

routers/web/user/profile.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,13 @@ func Profile(ctx *context.Context) {
105105
ctx.Data["Orgs"] = orgs
106106
ctx.Data["HasOrgsVisible"] = organization.HasOrgsVisible(orgs, ctx.Doer)
107107

108+
badges, _, err := user_model.GetUserBadges(ctx, ctx.ContextUser)
109+
if err != nil {
110+
ctx.ServerError("GetUserBadges", err)
111+
return
112+
}
113+
ctx.Data["Badges"] = badges
114+
108115
tab := ctx.FormString("tab")
109116
ctx.Data["TabName"] = tab
110117

templates/user/profile.tmpl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,17 @@
6969
</ul>
7070
</li>
7171
{{end}}
72+
{{if .Badges}}
73+
<li>
74+
<ul class="user-badges">
75+
{{range .Badges}}
76+
<li>
77+
<img width="64" height="64" src="{{.ImageURL}}" alt="{{.Description}}" data-content="{{.Description}}" class="tooltip"/>
78+
</li>
79+
{{end}}
80+
</ul>
81+
</li>
82+
{{end}}
7283
{{if and .IsSigned (ne .SignedUserName .Owner.Name)}}
7384
<li class="follow">
7485
{{if $.IsFollowing}}

web_src/less/_user.less

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,15 @@
169169
}
170170
}
171171

172+
.user-badges {
173+
display: grid;
174+
grid-template-columns: repeat(auto-fill, 64px);
175+
gap: 2px;
176+
}
177+
178+
.user-badges img {
179+
object-fit: contain;
180+
}
172181
#notification_div .tab.segment {
173182
overflow-x: auto;
174183
}

0 commit comments

Comments
 (0)