0
0
mirror of https://github.com/go-gitea/gitea.git synced 2025-07-19 19:18:43 +02:00
This commit is contained in:
NorthRealm 2025-07-11 17:01:11 +08:00
parent 540c3f00eb
commit 4f31cd88f7
7 changed files with 82 additions and 14 deletions

View File

@ -35,7 +35,7 @@ func AddFineGrainedActionsNotificationSettings(x *xorm.Engine) error {
if err := db.Iterate(context.Background(), nil, func(ctx context.Context, user *User) error {
settings = append(settings, NotificationSettings{
UserID: user.ID,
Actions: user_model.NotificationActionsFailureOnly,
Actions: user_model.NotificationGiteaActionsFailureOnly,
})
if len(settings) >= 100 {
_, err := x.Insert(&settings)

View File

@ -9,10 +9,11 @@ import (
"code.gitea.io/gitea/models/db"
)
// Actions email preference
const (
NotificationActionsAll = "all"
NotificationActionsFailureOnly = "failureonly"
NotificationActionsDisabled = "disabled"
NotificationGiteaActionsAll = "all"
NotificationGiteaActionsFailureOnly = "failureonly"
NotificationGiteaActionsDisabled = "disabled"
)
type NotificationSettings struct {

View File

@ -17,21 +17,21 @@ func TestUserNotificationSettings(t *testing.T) {
settings, err := GetUserNotificationSettings(db.DefaultContext, 1)
assert.NoError(t, err)
assert.Equal(t, NotificationActionsFailureOnly, settings.Actions)
assert.Equal(t, NotificationGiteaActionsFailureOnly, settings.Actions)
assert.NoError(t, UpdateUserNotificationSettings(db.DefaultContext, &NotificationSettings{
UserID: 1,
Actions: NotificationActionsAll,
Actions: NotificationGiteaActionsAll,
}))
settings, err = GetUserNotificationSettings(db.DefaultContext, 1)
assert.NoError(t, err)
assert.Equal(t, NotificationActionsAll, settings.Actions)
assert.Equal(t, NotificationGiteaActionsAll, settings.Actions)
assert.NoError(t, UpdateUserNotificationSettings(db.DefaultContext, &NotificationSettings{
UserID: 1,
Actions: NotificationActionsDisabled,
Actions: NotificationGiteaActionsDisabled,
}))
settings, err = GetUserNotificationSettings(db.DefaultContext, 1)
assert.NoError(t, err)
assert.Equal(t, NotificationActionsDisabled, settings.Actions)
assert.Equal(t, NotificationGiteaActionsDisabled, settings.Actions)
}

View File

@ -29,6 +29,13 @@ func Notifications(ctx *context.Context) {
ctx.Data["PageIsSettingsNotifications"] = true
ctx.Data["EmailNotificationsPreference"] = ctx.Doer.EmailNotificationsPreference
fineGrainedPreference, err := user_model.GetUserNotificationSettings(ctx, ctx.Doer.ID)
if err != nil {
ctx.ServerError("GetUserNotificationSettings", err)
return
}
ctx.Data["ActionsEmailNotificationsPreference"] = fineGrainedPreference.Actions
ctx.HTML(http.StatusOK, tplSettingsNotifications)
}
@ -45,7 +52,7 @@ func NotificationsEmailPost(ctx *context.Context) {
preference == user_model.EmailNotificationsDisabled ||
preference == user_model.EmailNotificationsAndYourOwn) {
log.Error("Email notifications preference change returned unrecognized option %s: %s", preference, ctx.Doer.Name)
ctx.ServerError("SetEmailPreference", errors.New("option unrecognized"))
ctx.ServerError("NotificationsEmailPost", errors.New("option unrecognized"))
return
}
opts := &user.UpdateOptions{
@ -60,3 +67,31 @@ func NotificationsEmailPost(ctx *context.Context) {
ctx.Flash.Success(ctx.Tr("settings.email_preference_set_success"))
ctx.Redirect(setting.AppSubURL + "/user/settings/notifications")
}
// NotificationsActionsEmailPost set user's email notification preference on Gitea Actions
func NotificationsActionsEmailPost(ctx *context.Context) {
if !ctx.GetContextValue("EnableActions").(bool) {
ctx.NotFound(nil)
return
}
preference := ctx.FormString("preference")
if !(preference == user_model.NotificationGiteaActionsAll ||
preference == user_model.NotificationGiteaActionsDisabled ||
preference == user_model.NotificationGiteaActionsFailureOnly) {
log.Error("Actions Email notifications preference change returned unrecognized option %s: %s", preference, ctx.Doer.Name)
ctx.ServerError("NotificationsActionsEmailPost", errors.New("option unrecognized"))
return
}
opts := &user.UpdateNotificationSettingsOptions{
Actions: optional.Some(preference),
}
if err := user.UpdateNotificationSettings(ctx, new(user_model.NotificationSettings), opts); err != nil {
log.Error("Cannot set actions email notifications preference: %v", err)
ctx.ServerError("UpdateNotificationSettings", err)
return
}
log.Trace("Actions email notifications preference made %s: %s", preference, ctx.Doer.Name)
ctx.Flash.Success(ctx.Tr("settings.email_preference_set_success"))
ctx.Redirect(setting.AppSubURL + "/user/settings/notifications")
}

View File

@ -598,6 +598,7 @@ func registerWebRoutes(m *web.Router) {
m.Group("/notifications", func() {
m.Get("", user_setting.Notifications)
m.Post("/email", user_setting.NotificationsEmailPost)
m.Post("/actions", user_setting.NotificationsActionsEmailPost)
})
m.Group("/security", func() {
m.Get("", security.Security)

View File

@ -133,14 +133,14 @@ func TestUpdateNotificationSettings(t *testing.T) {
settingsCopy := *settings
assert.NoError(t, UpdateNotificationSettings(db.DefaultContext, settings, &UpdateNotificationSettingsOptions{
Actions: optional.Some(user_model.NotificationActionsAll),
Actions: optional.Some(user_model.NotificationGiteaActionsAll),
}))
assert.Equal(t, user_model.NotificationActionsAll, settings.Actions)
assert.Equal(t, user_model.NotificationGiteaActionsAll, settings.Actions)
assert.NotEqual(t, settingsCopy.Actions, settings.Actions)
assert.NoError(t, UpdateNotificationSettings(db.DefaultContext, settings, &UpdateNotificationSettingsOptions{
Actions: optional.Some(user_model.NotificationActionsDisabled),
Actions: optional.Some(user_model.NotificationGiteaActionsDisabled),
}))
assert.Equal(t, user_model.NotificationActionsDisabled, settings.Actions)
assert.Equal(t, user_model.NotificationGiteaActionsDisabled, settings.Actions)
assert.NotEqual(t, settingsCopy.Actions, settings.Actions)
}

View File

@ -29,6 +29,37 @@
</div>
</div>
</div>
{{if .EnableActions}}
<h4 class="ui top attached header">
Actions
</h4>
<div class="ui attached segment">
<div class="ui list flex-items-block">
<div class="item">
<form class="ui form tw-w-full" action="{{AppSubUrl}}/user/settings/notifications/actions" method="post">
{{$.CsrfTokenHtml}}
<div class="field">
<label>Set email preference on Gitea Actions</label>
<div class="ui selection dropdown">
<input name="preference" type="hidden" value="{{.ActionsEmailNotificationsPreference}}">
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
<div class="text"></div>
<div class="menu">
<div data-value="enabled" class="{{if eq .ActionsEmailNotificationsPreference "all"}}active selected {{end}}item">{{ctx.Locale.Tr "all"}}</div>
<div data-value="andyourown" class="{{if eq .ActionsEmailNotificationsPreference "failureonly"}}active selected {{end}}item">Failure only</div>
<div data-value="disabled" class="{{if eq .ActionsEmailNotificationsPreference "disabled"}}active selected {{end}}item">{{ctx.Locale.Tr "disabled"}}</div>
</div>
</div>
</div>
<div class="field">
<button class="ui primary button">{{ctx.Locale.Tr "settings.email_notifications.submit"}}</button>
</div>
</form>
</div>
</div>
</div>
{{end}}
</div>
{{template "user/settings/layout_footer" .}}