]> source.dussan.org Git - redmine.git/commitdiff
New email notification option "For any event on my bookmarked projects" (#35189).
authorGo MAEDA <maeda@farend.jp>
Thu, 16 Nov 2023 08:32:41 +0000 (08:32 +0000)
committerGo MAEDA <maeda@farend.jp>
Thu, 16 Nov 2023 08:32:41 +0000 (08:32 +0000)
Patch by Mizuki ISHIKAWA.

git-svn-id: https://svn.redmine.org/redmine/trunk@22438 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/projects_controller.rb
app/models/user.rb
config/locales/en.yml
config/locales/ja.yml
test/functional/projects_controller_test.rb
test/unit/project_test.rb
test/unit/user_test.rb

index 15e9120f8664de0cfd73b4eb8313182bdecbfddd..1faeee46ca91fcc90e443cfe7540049d1108071c 100644 (file)
@@ -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
index 44fe8175f74d6f06dec00dd1bc347d311c8cda89..90dbea6b15d237f41973acb1e887431b55ac9b8a 100644 (file)
@@ -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'
index 3f60e9e7301d9eb72f5253a89a04dd323d84eea5..672d4d5302c614693af7b792c262d293fb5d02ed 100644 (file)
@@ -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"
index d5b08b4b34bba07741e611555d0e39110c544eba..596d80757e2df045d5387e96a19d0b8c743c5f32 100644 (file)
@@ -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: "ウォッチ中または自分が担当しているもの"
index 0ac0ecc3611818e364c9aa9366818f56ebce4be6..1042ad97318ecc5988d0fe56d34e60913e89c100 100644 (file)
@@ -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'
index 4ee1e1b3610ace73cd4ac3752647ce34b99fa8c5..d585da1d78b61b77215044d42a42d49569f2661e 100644 (file)
@@ -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),
index 4199ce003a2d835885b25a32b2f3ff0e298503c3..74d759846c5caef9a65cad5084d378dafbb7b08d 100644 (file)
@@ -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)
     }