]> source.dussan.org Git - redmine.git/commitdiff
Allow admins to edit user's email notifications and preferences. #3503
authorEric Davis <edavis@littlestreamsoftware.com>
Tue, 28 Sep 2010 22:13:06 +0000 (22:13 +0000)
committerEric Davis <edavis@littlestreamsoftware.com>
Tue, 28 Sep 2010 22:13:06 +0000 (22:13 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4223 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/users_controller.rb
app/models/user.rb
app/views/my/account.rhtml
app/views/users/_form.rhtml
app/views/users/_mail_notifications.html.erb [new file with mode: 0644]
app/views/users/_preferences.html.erb [new file with mode: 0644]
test/functional/users_controller_test.rb

index f22427a6648b74ade01ff48892ea8173c52bd507..fb7a0e10d83340708217f4cb3a299655a44664ac 100644 (file)
@@ -72,17 +72,40 @@ class UsersController < ApplicationController
   end
 
   def add
+    @notification_options = User::MAIL_NOTIFICATION_OPTIONS
+    @notification_option = Setting.default_notification_option
+
     @user = User.new(:language => Setting.default_language)
     @auth_sources = AuthSource.find(:all)
+
+    # TODO: Similar to My#account
+    # Only users that belong to more than 1 project can select projects for which they are notified
+    # Note that @user.membership.size would fail since AR ignores
+    # :include association option when doing a count
+    if @user.memberships.length < 1
+      @notification_options.delete_if {|option| option.first == :selected}
+    end
   end
   
   verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
   def create
+    @notification_options = User::MAIL_NOTIFICATION_OPTIONS
+    @notification_option = Setting.default_notification_option
+
     @user = User.new(params[:user])
     @user.admin = params[:user][:admin] || false
     @user.login = params[:user][:login]
     @user.password, @user.password_confirmation = params[:password], params[:password_confirmation] unless @user.auth_source_id
+
+    # TODO: Similar to My#account
+    @user.mail_notification = params[:notification_option] || 'only_my_events'
+    @user.pref.attributes = params[:pref]
+    @user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
+
     if @user.save
+      @user.pref.save
+      @user.notified_project_ids = (params[:notification_option] == 'selected' ? params[:notified_project_ids] : [])
+
       Mailer.deliver_account_information(@user, params[:password]) if params[:send_information]
       flash[:notice] = l(:notice_successful_create)
       redirect_to(params[:continue] ? {:controller => 'users', :action => 'add'} : 
@@ -90,12 +113,24 @@ class UsersController < ApplicationController
       return
     else
       @auth_sources = AuthSource.find(:all)
+      @notification_option = @user.mail_notification
+
       render :action => 'add'
     end
   end
 
   def edit
     @user = User.find(params[:id])
+    # TODO: Similar to My#account
+    @notification_options = User::MAIL_NOTIFICATION_OPTIONS
+    # Only users that belong to more than 1 project can select projects for which they are notified
+    # Note that @user.membership.size would fail since AR ignores
+    # :include association option when doing a count
+    if @user.memberships.length < 1
+      @notification_options.delete_if {|option| option.first == :selected}
+    end
+    @notification_option = @user.mail_notification
+
     if request.post?
       @user.admin = params[:user][:admin] if params[:user][:admin]
       @user.login = params[:user][:login] if params[:user][:login]
@@ -106,7 +141,15 @@ class UsersController < ApplicationController
       @user.attributes = params[:user]
       # Was the account actived ? (do it before User#save clears the change)
       was_activated = (@user.status_change == [User::STATUS_REGISTERED, User::STATUS_ACTIVE])
+      # TODO: Similar to My#account
+      @user.mail_notification = params[:notification_option] || 'only_my_events'
+      @user.pref.attributes = params[:pref]
+      @user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
+
       if @user.save
+        @user.pref.save
+        @user.notified_project_ids = (params[:notification_option] == 'selected' ? params[:notified_project_ids] : [])
+
         if was_activated
           Mailer.deliver_account_activated(@user)
         elsif @user.active? && params[:send_information] && !params[:password].blank? && @user.auth_source_id.nil?
index 0ac5e7d638442510c32875348b0a006a96deed44..481c832b4b9e14fc4655f96557c7c03ae67dd098 100644 (file)
@@ -74,7 +74,7 @@ class User < Principal
   validates_confirmation_of :password, :allow_nil => true
 
   def before_create
-    self.mail_notification = Setting.default_notification_option
+    self.mail_notification = Setting.default_notification_option if self.mail_notification.blank?
     true
   end
   
index b173b2b0df13033ea3ece212ef42e627b6ca9613..99b58ffe780310d6d580c97d2e2987ada6d37496 100644 (file)
 <div class="splitcontentright">
 <h3><%=l(:field_mail_notification)%></h3>
 <div class="box">
-<%= select_tag 'notification_option', options_for_select(@notification_options.collect {|o| [l(o.last), o.first]}, @notification_option.to_sym),
-                                      :onchange => 'if ($("notification_option").value == "selected") {Element.show("notified-projects")} else {Element.hide("notified-projects")}' %>
-<% content_tag 'div', :id => 'notified-projects', :style => (@notification_option == 'selected' ? '' : 'display:none;') do %>
-<p><% User.current.projects.each do |project| %>
-    <label><%= check_box_tag 'notified_project_ids[]', project.id, @user.notified_projects_ids.include?(project.id) %> <%=h project.name %></label><br />
-<% end %></p>
-<p><em><%= l(:text_user_mail_option) %></em></p>
-<% end %>
-<p><label><%= check_box_tag 'no_self_notified', 1, @user.pref[:no_self_notified] %> <%= l(:label_user_mail_no_self_notified) %></label></p>
+<%= render :partial => 'users/mail_notifications' %>
 </div>
 
 <h3><%=l(:label_preferences)%></h3>
 <div class="box tabular">
-<% fields_for :pref, @user.pref, :builder => TabularFormBuilder, :lang => current_language do |pref_fields| %>
-<p><%= pref_fields.check_box :hide_mail %></p>
-<p><%= pref_fields.select :time_zone, ActiveSupport::TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %></p>
-<p><%= pref_fields.select :comments_sorting, [[l(:label_chronological_order), 'asc'], [l(:label_reverse_chronological_order), 'desc']] %></p>
-<% end %>
+<%= render :partial => 'users/preferences' %>
 </div>
 
 </div>
index 4f9a0ff2178a6c6ac3c4b173facc415af6269ece..7e50fcdc35cb1250ec20272c7f8b9c706498d1e1 100644 (file)
 <%= password_field_tag 'password_confirmation', nil, :size => 25  %></p>
 </div>
 </div>
+
+<div class="box">
+<h3><%=l(:field_mail_notification)%></h3>
+<%= render :partial => 'users/mail_notifications' %>
+</div>
+
+<div class="box tabular">
+<h3><%=l(:label_preferences)%></h3>
+<%= render :partial => 'users/preferences' %>
+</div>
 <!--[eoform:user]-->
diff --git a/app/views/users/_mail_notifications.html.erb b/app/views/users/_mail_notifications.html.erb
new file mode 100644 (file)
index 0000000..d292508
--- /dev/null
@@ -0,0 +1,12 @@
+<p>
+<%= select_tag 'notification_option', options_for_select(@notification_options.collect {|o| [l(o.last), o.first]}, @notification_option.to_sym),
+                                      :onchange => 'if ($("notification_option").value == "selected") {Element.show("notified-projects")} else {Element.hide("notified-projects")}' %>
+</p>
+<% content_tag 'div', :id => 'notified-projects', :style => (@notification_option == 'selected' ? '' : 'display:none;') do %>
+<p><% @user.projects.each do |project| %>
+    <label><%= check_box_tag 'notified_project_ids[]', project.id, @user.notified_projects_ids.include?(project.id) %> <%=h project.name %></label><br />
+<% end %></p>
+<p><em><%= l(:text_user_mail_option) %></em></p>
+<% end %>
+<p><label><%= l(:label_user_mail_no_self_notified) %></label><%= check_box_tag 'no_self_notified', 1, @user.pref[:no_self_notified] %></p>
+
diff --git a/app/views/users/_preferences.html.erb b/app/views/users/_preferences.html.erb
new file mode 100644 (file)
index 0000000..85b5990
--- /dev/null
@@ -0,0 +1,6 @@
+<% fields_for :pref, @user.pref, :builder => TabularFormBuilder, :lang => current_language do |pref_fields| %>
+<p><%= pref_fields.check_box :hide_mail %></p>
+<p><%= pref_fields.select :time_zone, ActiveSupport::TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %></p>
+<p><%= pref_fields.select :comments_sorting, [[l(:label_chronological_order), 'asc'], [l(:label_reverse_chronological_order), 'desc']] %></p>
+<% end %>
+
index 8e115eac6daff7992cdf2cbacd4106d9d7d7bba2..6131c7e7dd00ba93f0caf93589c765b5cb79c46c 100644 (file)
@@ -127,12 +127,18 @@ class UsersControllerTest < ActionController::TestCase
           :password => 'test',
           :password_confirmation => 'test',
           :mail => 'jdoe@gmail.com'
-        }
+        },
+        :notification_option => 'none'
       end
 
       should_assign_to :user
       should_respond_with :redirect
       should_redirect_to('user edit') { {:controller => 'users', :action => 'edit', :id => User.find_by_login('jdoe')}}
+
+      should 'set the users mail notification' do
+        user = User.last
+        assert_equal 'none', user.mail_notification
+      end
     end
 
     context "when unsuccessful" do
@@ -149,8 +155,13 @@ class UsersControllerTest < ActionController::TestCase
 
   def test_edit
     ActionMailer::Base.deliveries.clear
-    post :edit, :id => 2, :user => {:firstname => 'Changed'}
-    assert_equal 'Changed', User.find(2).firstname
+    post :edit, :id => 2, :user => {:firstname => 'Changed'}, :notification_option => 'all', :pref => {:hide_mail => '1', :comments_sorting => 'desc'}
+
+    user = User.find(2)
+    assert_equal 'Changed', user.firstname
+    assert_equal 'all', user.mail_notification
+    assert_equal true, user.pref[:hide_mail]
+    assert_equal 'desc', user.pref[:comments_sorting]
     assert ActionMailer::Base.deliveries.empty?
   end