diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index b5009ce3f..e13658241 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -121,7 +121,10 @@ class IssuesController < ApplicationController render :nothing => true, :layout => true return end - @issue.attributes = params[:issue] + if params[:issue].is_a?(Hash) + @issue.attributes = params[:issue] + @issue.watcher_user_ids = params[:issue]['watcher_user_ids'] if User.current.allowed_to?(:add_issue_watchers, @project) + end @issue.author = User.current default_status = IssueStatus.default diff --git a/app/models/mailer.rb b/app/models/mailer.rb index 969fcd9ac..d9207cd92 100644 --- a/app/models/mailer.rb +++ b/app/models/mailer.rb @@ -28,6 +28,7 @@ class Mailer < ActionMailer::Base 'Issue-Author' => issue.author.login redmine_headers 'Issue-Assignee' => issue.assigned_to.login if issue.assigned_to recipients issue.recipients + cc(issue.watcher_recipients - @recipients) subject "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] (#{issue.status.name}) #{issue.subject}" body :issue => issue, :issue_url => url_for(:controller => 'issues', :action => 'show', :id => issue) diff --git a/app/views/issues/_form.rhtml b/app/views/issues/_form.rhtml index 419536fee..dcc554101 100644 --- a/app/views/issues/_form.rhtml +++ b/app/views/issues/_form.rhtml @@ -48,6 +48,14 @@
<%= render :partial => 'attachments/form' %>
<% end %> +<% if @issue.new_record? && User.current.allowed_to?(:add_issue_watchers, @project) -%> ++<% @issue.project.users.sort.each do |user| -%> + +<% end -%> +
+<% end %> + <%= call_hook(:view_issues_form_details_bottom, { :issue => @issue, :form => f }) %> <%= wikitoolbar_for 'issue_description' %> diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb index 86340ba63..49dddf91c 100644 --- a/test/functional/issues_controller_test.rb +++ b/test/functional/issues_controller_test.rb @@ -322,6 +322,30 @@ class IssuesControllerTest < Test::Unit::TestCase assert_equal 'activerecord_error_invalid', issue.errors.on(:custom_values) end + def test_post_new_with_watchers + @request.session[:user_id] = 2 + ActionMailer::Base.deliveries.clear + + assert_difference 'Watcher.count', 2 do + post :new, :project_id => 1, + :issue => {:tracker_id => 1, + :subject => 'This is a new issue with watchers', + :description => 'This is the description', + :priority_id => 5, + :watcher_user_ids => ['2', '3']} + end + assert_redirected_to 'issues/show' + + issue = Issue.find_by_subject('This is a new issue with watchers') + # Watchers added + assert_equal [2, 3], issue.watcher_user_ids.sort + assert issue.watched_by?(User.find(3)) + # Watchers notified + mail = ActionMailer::Base.deliveries.last + assert_kind_of TMail::Mail, mail + assert [mail.bcc, mail.cc].flatten.include?(User.find(3).mail) + end + def test_post_should_preserve_fields_values_on_validation_failure @request.session[:user_id] = 2 post :new, :project_id => 1, diff --git a/vendor/plugins/acts_as_watchable/lib/acts_as_watchable.rb b/vendor/plugins/acts_as_watchable/lib/acts_as_watchable.rb index 2cb122795..3d0de0dca 100644 --- a/vendor/plugins/acts_as_watchable/lib/acts_as_watchable.rb +++ b/vendor/plugins/acts_as_watchable/lib/acts_as_watchable.rb @@ -14,6 +14,8 @@ module Redmine class_eval do has_many :watchers, :as => :watchable, :dependent => :delete_all has_many :watcher_users, :through => :watchers, :source => :user + + attr_protected :watcher_ids, :watcher_user_ids end end end