diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 15e9120f8..1faeee46c 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -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 diff --git a/app/models/user.rb b/app/models/user.rb index 88e18b8d0..79983a088 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -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], @@ -498,13 +499,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 @@ -834,7 +847,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' diff --git a/config/locales/en.yml b/config/locales/en.yml index 3f60e9e73..672d4d530 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -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" diff --git a/config/locales/ja.yml b/config/locales/ja.yml index d5b08b4b3..596d80757 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -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: "ウォッチ中または自分が担当しているもの" diff --git a/test/functional/projects_controller_test.rb b/test/functional/projects_controller_test.rb index 0ac0ecc36..1042ad973 100644 --- a/test/functional/projects_controller_test.rb +++ b/test/functional/projects_controller_test.rb @@ -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' diff --git a/test/unit/project_test.rb b/test/unit/project_test.rb index 4ee1e1b36..d585da1d7 100644 --- a/test/unit/project_test.rb +++ b/test/unit/project_test.rb @@ -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), diff --git a/test/unit/user_test.rb b/test/unit/user_test.rb index 4199ce003..74d759846 100644 --- a/test/unit/user_test.rb +++ b/test/unit/user_test.rb @@ -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) }