From: Marius Balteanu Date: Sat, 19 Mar 2022 10:14:29 +0000 (+0000) Subject: Automatically add the user to the watchers list after contributing to an issue (... X-Git-Tag: 5.0.0~30 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=e50190a82a5b6a066a3fadfdebf9df6e268719ad;p=redmine.git Automatically add the user to the watchers list after contributing to an issue (#4347). User can enable/disable this feature from My Account. Patch by Takenori TAKAKI and Jens Krämer. git-svn-id: http://svn.redmine.org/redmine/trunk@21469 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index 9724a3487..0dbb0f1bd 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -66,6 +66,10 @@ module UsersHelper [l('label_last_tab_visited'), 'last_tab_visited']] end + def auto_watch_on_options + UserPreference::AUTO_WATCH_ON_OPTIONS.index_by {|o| l("label_auto_watch_on_#{o}")} + end + def change_status_link(user) url = {:controller => 'users', :action => 'update', :id => user, :page => params[:page], :status => params[:status], :tab => nil} diff --git a/app/models/journal.rb b/app/models/journal.rb index 3d1feb906..01d5debcd 100644 --- a/app/models/journal.rb +++ b/app/models/journal.rb @@ -60,6 +60,7 @@ class Journal < ActiveRecord::Base ) acts_as_mentionable :attributes => ['notes'] before_create :split_private_notes + before_create :add_watcher after_create_commit :send_notification scope :visible, (lambda do |*args| @@ -327,6 +328,15 @@ class Journal < ActiveRecord::Base true end + def add_watcher + if user && + user.allowed_to?(:add_issue_watchers, project) && + user.pref.auto_watch_on?('issue_contributed_to') && + !Watcher.any_watched?(Array.wrap(journalized), user) + journalized.set_watcher(user, true) + end + end + def send_notification if notify? && ( diff --git a/app/models/user_preference.rb b/app/models/user_preference.rb index a0fea2851..758736824 100644 --- a/app/models/user_preference.rb +++ b/app/models/user_preference.rb @@ -39,10 +39,12 @@ class UserPreference < ActiveRecord::Base 'history_default_tab', 'default_issue_query', 'default_project_query', - 'toolbar_language_options') + 'toolbar_language_options', + 'auto_watch_on') TEXTAREA_FONT_OPTIONS = ['monospace', 'proportional'] DEFAULT_TOOLBAR_LANGUAGE_OPTIONS = %w[c cpp csharp css diff go groovy html java javascript objc perl php python r ruby sass scala shell sql swift xml yaml] + AUTO_WATCH_ON_OPTIONS = ['issue_contributed_to'] def initialize(attributes=nil, *args) super @@ -56,6 +58,9 @@ class UserPreference < ActiveRecord::Base unless attributes && attributes.key?(:no_self_notified) self.no_self_notified = Setting.default_users_no_self_notified end + unless attributes && attributes.key?(:auto_watch_on) + self.auto_watch_on = AUTO_WATCH_ON_OPTIONS + end end self.others ||= {} end @@ -124,6 +129,10 @@ class UserPreference < ActiveRecord::Base def default_project_query; self[:default_project_query] end def default_project_query=(value); self[:default_project_query]=value; end + def auto_watch_on; self[:auto_watch_on] || []; end + def auto_watch_on=(values); self[:auto_watch_on]=values; end + def auto_watch_on?(action); self.auto_watch_on.include?(action.to_s); end + # Returns the names of groups that are displayed on user's page # Example: # preferences.my_page_groups diff --git a/app/views/my/account.html.erb b/app/views/my/account.html.erb index fc27dc61c..4240832b7 100644 --- a/app/views/my/account.html.erb +++ b/app/views/my/account.html.erb @@ -55,6 +55,11 @@ <%= render :partial => 'users/mail_notifications' %> +
+ <%=l(:label_auto_watch_on)%> + <%= render :partial => 'users/auto_watch_on' %> +
+
<%=l(:label_preferences)%> <%= render :partial => 'users/preferences' %> diff --git a/app/views/users/_form.html.erb b/app/views/users/_form.html.erb index 5505766b4..6d6058c49 100644 --- a/app/views/users/_form.html.erb +++ b/app/views/users/_form.html.erb @@ -63,6 +63,11 @@ <%= render :partial => 'users/mail_notifications' %>
+
+ <%=l(:label_auto_watch_on)%> + <%= render :partial => 'users/auto_watch_on' %> +
+
<%=l(:label_preferences)%> <%= render :partial => 'users/preferences' %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 2378e56d5..62577376f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -956,6 +956,8 @@ en: label_downloads_abbr: D/L label_optional_description: Optional description label_add_another_file: Add another file + label_auto_watch_on: Auto watch + label_auto_watch_on_issue_contributed_to: Issues I contributed to label_preferences: Preferences label_chronological_order: In chronological order label_reverse_chronological_order: In reverse chronological order diff --git a/test/unit/journal_test.rb b/test/unit/journal_test.rb index f9c269291..cf86a7990 100644 --- a/test/unit/journal_test.rb +++ b/test/unit/journal_test.rb @@ -120,6 +120,28 @@ class JournalTest < ActiveSupport::TestCase end end + def test_create_should_add_wacher + user = User.first + user.pref.auto_watch_on=['issue_contributed_to'] + user.save + journal = Journal.new(:journalized => Issue.first, :notes => 'notes', :user => user) + + assert_difference 'Watcher.count', 1 do + assert_equal true, journal.save + end + end + + def test_create_should_not_add_watcher + user = User.first + user.pref.auto_watch_on=[] + user.save + journal = Journal.new(:journalized => Issue.first, :notes => 'notes', :user => user) + + assert_no_difference 'Watcher.count' do + assert_equal true, journal.save + end + end + def test_visible_scope_for_anonymous # Anonymous user should see issues of public projects only journals = Journal.visible(User.anonymous).to_a diff --git a/test/unit/user_preference_test.rb b/test/unit/user_preference_test.rb index 9ac213b5f..4ca79400e 100644 --- a/test/unit/user_preference_test.rb +++ b/test/unit/user_preference_test.rb @@ -57,6 +57,11 @@ class UserPreferenceTest < ActiveSupport::TestCase end end + def test_auto_watch_on_should_default_to_setting + preference = UserPreference.new + assert_equal ['issue_contributed_to'], preference.auto_watch_on + end + def test_create user = User.new(:firstname => "new", :lastname => "user", :mail => "newuser@somenet.foo") user.login = "newuser"