mirror of
https://github.com/redmine/redmine.git
synced 2025-11-10 15:26:03 +01:00
New email notification option "For any event on my bookmarked projects" (#35189).
Patch by Mizuki ISHIKAWA. git-svn-id: https://svn.redmine.org/redmine/trunk@22438 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
@@ -263,11 +263,14 @@ class ProjectsController < ApplicationController
|
||||
end
|
||||
|
||||
def bookmark
|
||||
jump_box = Redmine::ProjectJumpBox.new User.current
|
||||
user = User.current
|
||||
jump_box = Redmine::ProjectJumpBox.new user
|
||||
if request.delete?
|
||||
jump_box.delete_project_bookmark @project
|
||||
user.update_notified_bookmarked_project_ids(@project)
|
||||
elsif request.post?
|
||||
jump_box.bookmark_project @project
|
||||
user.update_notified_bookmarked_project_ids(@project)
|
||||
end
|
||||
respond_to do |format|
|
||||
format.js
|
||||
|
||||
@@ -75,6 +75,7 @@ class User < Principal
|
||||
MAIL_NOTIFICATION_OPTIONS = [
|
||||
['all', :label_user_mail_option_all],
|
||||
['selected', :label_user_mail_option_selected],
|
||||
['bookmarked', :label_user_mail_option_bookmarked],
|
||||
['only_my_events', :label_user_mail_option_only_my_events],
|
||||
['only_assigned', :label_user_mail_option_only_assigned],
|
||||
['only_owner', :label_user_mail_option_only_owner],
|
||||
@@ -492,13 +493,25 @@ class User < Principal
|
||||
# Updates per project notifications (after_save callback)
|
||||
def update_notified_project_ids
|
||||
if @notified_projects_ids_changed
|
||||
ids = (mail_notification == 'selected' ? Array.wrap(notified_projects_ids).reject(&:blank?) : [])
|
||||
ids = []
|
||||
if mail_notification == 'selected'
|
||||
ids = Array.wrap(notified_projects_ids).reject(&:blank?)
|
||||
elsif mail_notification == 'bookmarked'
|
||||
ids = Array.wrap(bookmarked_project_ids).reject(&:blank?)
|
||||
end
|
||||
members.update_all(:mail_notification => false)
|
||||
members.where(:project_id => ids).update_all(:mail_notification => true) if ids.any?
|
||||
end
|
||||
end
|
||||
private :update_notified_project_ids
|
||||
|
||||
def update_notified_bookmarked_project_ids(project_id)
|
||||
if mail_notification == 'bookmarked'
|
||||
@notified_projects_ids_changed = true
|
||||
self.update_notified_project_ids
|
||||
end
|
||||
end
|
||||
|
||||
def valid_notification_options
|
||||
self.class.valid_notification_options(self)
|
||||
end
|
||||
@@ -822,7 +835,7 @@ class User < Principal
|
||||
case object
|
||||
when Issue
|
||||
case mail_notification
|
||||
when 'selected', 'only_my_events'
|
||||
when 'selected', 'only_my_events', 'bookmarked'
|
||||
# user receives notifications for created/assigned issues on unselected projects
|
||||
object.author == self || is_or_belongs_to?(object.assigned_to) || is_or_belongs_to?(object.previous_assignee)
|
||||
when 'only_assigned'
|
||||
|
||||
@@ -942,6 +942,7 @@ en:
|
||||
label_search_titles_only: Search titles only
|
||||
label_user_mail_option_all: "For any event on all my projects"
|
||||
label_user_mail_option_selected: "For any event on the selected projects only..."
|
||||
label_user_mail_option_bookmarked: "For any event on my bookmarked projects"
|
||||
label_user_mail_option_none: "No events"
|
||||
label_user_mail_option_only_my_events: "Only for things I watch or I'm involved in"
|
||||
label_user_mail_option_only_assigned: "Only for things I watch or I am assigned to"
|
||||
|
||||
@@ -756,6 +756,7 @@ ja:
|
||||
label_search_titles_only: タイトルのみ
|
||||
label_user_mail_option_all: "参加しているプロジェクトのすべての通知"
|
||||
label_user_mail_option_selected: "選択したプロジェクトのすべての通知..."
|
||||
label_user_mail_option_bookmarked: "ブックマークしているプロジェクトのすべての通知"
|
||||
label_user_mail_option_none: "通知しない"
|
||||
label_user_mail_option_only_my_events: "ウォッチ中または自分が関係しているもの"
|
||||
label_user_mail_option_only_assigned: "ウォッチ中または自分が担当しているもの"
|
||||
|
||||
@@ -1499,6 +1499,18 @@ class ProjectsControllerTest < Redmine::ControllerTest
|
||||
refute jb.bookmark?(Project.find('ecookbook'))
|
||||
end
|
||||
|
||||
def test_bookmark_should_update_notified_project_ids_if_mail_notification_is_bookmarked
|
||||
user = User.find(2)
|
||||
@request.session[:user_id] = user.id
|
||||
user.update(mail_notification: 'bookmarked')
|
||||
|
||||
post(:bookmark, :params => {:id => 'ecookbook'})
|
||||
assert_equal [true, false, false], user.members.order(:id).pluck(:mail_notification)
|
||||
|
||||
delete(:bookmark, :params => {:id => 'ecookbook'})
|
||||
assert_equal [false, false, false], user.members.order(:id).pluck(:mail_notification)
|
||||
end
|
||||
|
||||
def test_index_jump_without_project_id_should_redirect_to_active_tab
|
||||
get(:index, :params => {:jump => 'issues'})
|
||||
assert_redirected_to '/issues'
|
||||
|
||||
@@ -1045,6 +1045,9 @@ class ProjectTest < ActiveSupport::TestCase
|
||||
only_my_events_user = User.generate!(:mail_notification => 'only_my_events')
|
||||
Member.create!(:project => project, :roles => [role], :principal => only_my_events_user)
|
||||
|
||||
bookmarked_user = User.generate!(:mail_notification => 'bookmarked')
|
||||
Member.create!(:project => project, :roles => [role], :principal => bookmarked_user)
|
||||
|
||||
only_assigned_user = User.generate!(:mail_notification => 'only_assigned')
|
||||
Member.create!(:project => project, :roles => [role], :principal => only_assigned_user)
|
||||
|
||||
@@ -1059,6 +1062,8 @@ class ProjectTest < ActiveSupport::TestCase
|
||||
"should not include users with the 'none' notification option"
|
||||
assert !project.notified_users.include?(only_my_events_user),
|
||||
"should not include users with the 'only_my_events' notification option"
|
||||
assert !project.notified_users.include?(bookmarked_user),
|
||||
"should not include users with the 'bookmarked' notification option"
|
||||
assert !project.notified_users.include?(only_assigned_user),
|
||||
"should not include users with the 'only_assigned' notification option"
|
||||
assert !project.notified_users.include?(only_owned_user),
|
||||
|
||||
@@ -1043,15 +1043,15 @@ class UserTest < ActiveSupport::TestCase
|
||||
|
||||
def test_valid_notification_options
|
||||
# without memberships
|
||||
assert_equal 5, User.find(7).valid_notification_options.size
|
||||
assert_equal 6, User.find(7).valid_notification_options.size
|
||||
# with memberships
|
||||
assert_equal 6, User.find(2).valid_notification_options.size
|
||||
assert_equal 7, User.find(2).valid_notification_options.size
|
||||
end
|
||||
|
||||
def test_valid_notification_options_class_method
|
||||
assert_equal 5, User.valid_notification_options.size
|
||||
assert_equal 5, User.valid_notification_options(User.find(7)).size
|
||||
assert_equal 6, User.valid_notification_options(User.find(2)).size
|
||||
assert_equal 6, User.valid_notification_options.size
|
||||
assert_equal 6, User.valid_notification_options(User.find(7)).size
|
||||
assert_equal 7, User.valid_notification_options(User.find(2)).size
|
||||
end
|
||||
|
||||
def test_notified_project_ids_setter_should_coerce_to_unique_integer_array
|
||||
@@ -1250,8 +1250,8 @@ class UserTest < ActiveSupport::TestCase
|
||||
issue = Issue.generate!(:project => project, :assigned_to => assignee, :author => author)
|
||||
|
||||
tests = {
|
||||
author => %w(all only_my_events only_owner selected),
|
||||
assignee => %w(all only_my_events only_assigned selected),
|
||||
author => %w(all only_my_events only_owner selected bookmarked),
|
||||
assignee => %w(all only_my_events only_assigned selected bookmarked),
|
||||
member => %w(all)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user