From e9a843b095ec3cf9bfc2d4dfcf21c4a48dc441f7 Mon Sep 17 00:00:00 2001 From: maxwell Date: Fri, 11 Mar 2011 13:13:55 -0800 Subject: [PATCH] email prefs are now saved. need more tests and use it in user#mail --- app/controllers/users_controller.rb | 31 ++++++++------ app/models/user.rb | 17 ++++++++ app/models/user_preference.rb | 3 ++ app/views/users/edit.html.haml | 42 +++++++++++++++---- .../20110311183826_create_user_preferences.rb | 14 +++++++ db/schema.rb | 8 ++++ spec/models/user_preferences_spec.rb | 5 +++ spec/models/user_spec.rb | 21 ++++++++-- 8 files changed, 119 insertions(+), 22 deletions(-) create mode 100644 app/models/user_preference.rb create mode 100644 db/migrate/20110311183826_create_user_preferences.rb create mode 100644 spec/models/user_preferences_spec.rb diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 9d122ec36..bc9d69f1b 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -13,37 +13,44 @@ class UsersController < ApplicationController def edit @aspect = :user_edit @user = current_user + @email_prefs = Hash.new(true) + @user.user_preferences.each do |pref| + @email_prefs[pref.email_type] = false + end end def update + + u = params[:user] @user = current_user - params[:user].delete(:password) if params[:user][:password].blank? - params[:user].delete(:password_confirmation) if params[:user][:password].blank? and params[:user][:password_confirmation].blank? - params[:user].delete(:language) if params[:user][:language].blank? + u.delete(:password) if u[:password].blank? + u.delete(:password_confirmation) if u[:password].blank? and u[:password_confirmation].blank? + u.delete(:language) if u[:language].blank? # change email notifications - if params[:user][:disable_mail] - @user.update_attributes(:disable_mail => params[:user][:disable_mail]) + if u[:email_preferences] + pp u[:email_preferences] + @user.update_user_preferences(u[:email_preferences]) flash[:notice] = I18n.t 'users.update.email_notifications_changed' # change passowrd - elsif params[:user][:current_password] && params[:user][:password] && params[:user][:password_confirmation] - if @user.update_with_password(params[:user]) + elsif u[:current_password] && u[:password] && u[:password_confirmation] + if @user.update_with_password(u) flash[:notice] = I18n.t 'users.update.password_changed' else flash[:error] = I18n.t 'users.update.password_not_changed' end - elsif params[:user][:language] - if @user.update_attributes(:language => params[:user][:language]) + elsif u[:language] + if @user.update_attributes(:language => u[:language]) I18n.locale = @user.language flash[:notice] = I18n.t 'users.update.language_changed' else flash[:error] = I18n.t 'users.update.language_not_changed' end - elsif params[:user][:a_ids] + elsif u[:a_ids] @user.aspects.update_all(:open => false) - unless params[:user][:a_ids] == ["home"] - @user.aspects.where(:id => params[:user][:a_ids]).update_all(:open => true) + unless u[:a_ids] == ["home"] + @user.aspects.where(:id => u[:a_ids]).update_all(:open => true) end end diff --git a/app/models/user.rb b/app/models/user.rb index dc366fc60..899f2bb74 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -37,6 +37,7 @@ class User < ActiveRecord::Base has_many :contacts has_many :contact_people, :through => :contacts, :source => :person has_many :services + has_many :user_preferences before_destroy :disconnect_everyone, :remove_person before_save do @@ -45,6 +46,22 @@ class User < ActiveRecord::Base attr_accessible :getting_started, :password, :password_confirmation, :language, :disable_mail + + + + def update_user_preferences(pref_hash) + pref_hash.keys.each do |key| + if pref_hash[key] == 'true' + self.user_preferences.find_or_create_by_email_type(key) + else + block = self.user_preferences.where(:email_type => key).first + if block + block.destroy + end + end + end + end + def strip_and_downcase_username if username.present? username.strip! diff --git a/app/models/user_preference.rb b/app/models/user_preference.rb new file mode 100644 index 000000000..9584d13e4 --- /dev/null +++ b/app/models/user_preference.rb @@ -0,0 +1,3 @@ +class UserPreference < ActiveRecord::Base + belongs_to :user +end diff --git a/app/views/users/edit.html.haml b/app/views/users/edit.html.haml index 8f6043977..968724c0b 100644 --- a/app/views/users/edit.html.haml +++ b/app/views/users/edit.html.haml @@ -77,11 +77,39 @@ = form_for @user do |f| = f.error_messages - %p.checkbox_select - = f.label :disable_mail, t('.receive_email_notifications') - = f.check_box :disable_mail, {:checked => !@user.disable_mail}, false, true - %br - = f.submit t('.change') + = f.fields_for :email_preferences do |type| + #email_prefs + %p.checkbox_select + = type.label t('.also_commented') + = type.check_box :also_commented, {:checked => @email_prefs['also_commented']}, false, true + %br + %p.checkbox_select + = type.label t('.mentioned') + = type.check_box :mentioned, {:checked => @email_prefs['mentioned']}, false, true + + + %br + %p.checkbox_select + = type.label t('.comment_on_post') + = type.check_box :comment_on_post, {:checked => @email_prefs['comment_on_post']}, false, true + + %br + %p.checkbox_select + = type.label t('.request_received') + = type.check_box :request_received, {:checked => @email_prefs['request_received']}, false, true + + %br + %p.checkbox_select + = type.label t('.private_message') + = type.check_box :private_message, {:checked => @email_prefs['private_message']}, false, true + + %br + %p.checkbox_select + = type.label t('.request_acceptence') + = type.check_box :request_acceptence, {:checked => @email_prefs['request_accpetence']}, false, true + + %br + = f.submit t('.change') %br %br @@ -100,5 +128,5 @@ %h3 = t('.close_account') = link_to t('.close_account'), current_user, - :confirm => t('are_you_sure'), :method => :delete, - :class => "button" + :confirm => t('are_you_sure'), :method => :delete, + :class => "button" diff --git a/db/migrate/20110311183826_create_user_preferences.rb b/db/migrate/20110311183826_create_user_preferences.rb new file mode 100644 index 000000000..a8c942693 --- /dev/null +++ b/db/migrate/20110311183826_create_user_preferences.rb @@ -0,0 +1,14 @@ +class CreateUserPreferences < ActiveRecord::Migration + def self.up + create_table :user_preferences do |t| + t.string :email_type + t.integer :user_id + + t.timestamps + end + end + + def self.down + drop_table :user_preferences + end +end diff --git a/db/schema.rb b/db/schema.rb index 5ef44075f..9f7795dd0 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -476,6 +476,13 @@ ActiveRecord::Schema.define(:version => 20110311220249) do t.string "name" end + create_table "user_preferences", :force => true do |t| + t.string "email_type" + t.integer "user_id" + t.datetime "created_at" + t.datetime "updated_at" + end + create_table "users", :force => true do |t| t.string "username" t.text "serialized_private_key" @@ -501,6 +508,7 @@ ActiveRecord::Schema.define(:version => 20110311220249) do t.string "mongo_id" t.string "invitation_service", :limit => 127 t.string "invitation_identifier", :limit => 127 + t.text "email_disabled" end add_index "users", ["email"], :name => "index_users_on_email" diff --git a/spec/models/user_preferences_spec.rb b/spec/models/user_preferences_spec.rb new file mode 100644 index 000000000..2c244c2d1 --- /dev/null +++ b/spec/models/user_preferences_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe UserPreferences do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 3b974a026..151a165c6 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -215,6 +215,22 @@ describe User do end end end + + describe 'update_user_preferences' do + it 'unsets disable mail and makes the right amount of prefs' do + alice.disable_mail = true + proc { + alice.update_user_preferences({}) + }.should change(alice.user_preferences, :count).by(6) + end + it 'still sets new prefs to false on update' do + alice.disable_mail = true + proc { + alice.update_user_preferences({'mentioned' => false}) + }.should change(alice.user_preferences, :count).by(5) + end + + end describe ".find_for_authentication" do it 'finds a user' do @@ -450,11 +466,10 @@ describe User do alice.mail(Job::MailRequestReceived, alice.id, 'contactrequestid') end - it 'does not enqueue a mail job' do - alice.disable_mail = true + it 'does not enqueue a mail job if the correct corresponding job has a prefrence entry' do alice.save alice.reload - + alice.user_preferences.create(:email_type => 'request_received') Resque.should_not_receive(:enqueue) alice.mail(Job::MailRequestReceived, alice.id, 'contactrequestid') end