Merge branch 'master' of git://github.com/diaspora/diaspora

This commit is contained in:
Jordi Mallach 2011-03-12 01:07:58 +01:00
commit 2d5dc81854
10 changed files with 155 additions and 28 deletions

View file

@ -13,37 +13,43 @@ class UsersController < ApplicationController
def edit def edit
@aspect = :user_edit @aspect = :user_edit
@user = current_user @user = current_user
@email_prefs = Hash.new(true)
@user.user_preferences.each do |pref|
@email_prefs[pref.email_type] = false
end
end end
def update def update
u = params[:user]
@user = current_user @user = current_user
params[:user].delete(:password) if params[:user][:password].blank? u.delete(:password) if u[:password].blank?
params[:user].delete(:password_confirmation) if params[:user][:password].blank? and params[:user][:password_confirmation].blank? u.delete(:password_confirmation) if u[:password].blank? and u[:password_confirmation].blank?
params[:user].delete(:language) if params[:user][:language].blank? u.delete(:language) if u[:language].blank?
# change email notifications # change email notifications
if params[:user][:disable_mail] if u[:email_preferences]
@user.update_attributes(:disable_mail => params[:user][:disable_mail]) @user.update_user_preferences(u[:email_preferences])
flash[:notice] = I18n.t 'users.update.email_notifications_changed' flash[:notice] = I18n.t 'users.update.email_notifications_changed'
# change passowrd # change passowrd
elsif params[:user][:current_password] && params[:user][:password] && params[:user][:password_confirmation] elsif u[:current_password] && u[:password] && u[:password_confirmation]
if @user.update_with_password(params[:user]) if @user.update_with_password(u)
flash[:notice] = I18n.t 'users.update.password_changed' flash[:notice] = I18n.t 'users.update.password_changed'
else else
flash[:error] = I18n.t 'users.update.password_not_changed' flash[:error] = I18n.t 'users.update.password_not_changed'
end end
elsif params[:user][:language] elsif u[:language]
if @user.update_attributes(:language => params[:user][:language]) if @user.update_attributes(:language => u[:language])
I18n.locale = @user.language I18n.locale = @user.language
flash[:notice] = I18n.t 'users.update.language_changed' flash[:notice] = I18n.t 'users.update.language_changed'
else else
flash[:error] = I18n.t 'users.update.language_not_changed' flash[:error] = I18n.t 'users.update.language_not_changed'
end end
elsif params[:user][:a_ids] elsif u[:a_ids]
@user.aspects.update_all(:open => false) @user.aspects.update_all(:open => false)
unless params[:user][:a_ids] == ["home"] unless u[:a_ids] == ["home"]
@user.aspects.where(:id => params[:user][:a_ids]).update_all(:open => true) @user.aspects.where(:id => u[:a_ids]).update_all(:open => true)
end end
end end

View file

@ -37,6 +37,7 @@ class User < ActiveRecord::Base
has_many :contacts has_many :contacts
has_many :contact_people, :through => :contacts, :source => :person has_many :contact_people, :through => :contacts, :source => :person
has_many :services has_many :services
has_many :user_preferences
before_destroy :disconnect_everyone, :remove_person before_destroy :disconnect_everyone, :remove_person
before_save do before_save do
@ -45,6 +46,25 @@ class User < ActiveRecord::Base
attr_accessible :getting_started, :password, :password_confirmation, :language, :disable_mail attr_accessible :getting_started, :password, :password_confirmation, :language, :disable_mail
def update_user_preferences(pref_hash)
if self.disable_mail
mails = ['mentioned', 'request_received', 'comment_on_post', 'request_acceptence', 'also_commented', 'private_message']
mails.each{|x| self.user_preferences.find_or_create_by_email_type(x)}
self.update_attributes(:disable_mail => false)
end
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 def strip_and_downcase_username
if username.present? if username.present?
username.strip! username.strip!
@ -158,7 +178,8 @@ class User < ActiveRecord::Base
######### Mailer ####################### ######### Mailer #######################
def mail(job, *args) def mail(job, *args)
unless self.disable_mail pref = job.to_s.gsub('Job::Mail', '').underscore
unless self.disable_mail || self.user_preferences.exists?(:email_type => pref)
Resque.enqueue(job, *args) Resque.enqueue(job, *args)
end end
end end

View file

@ -0,0 +1,3 @@
class UserPreference < ActiveRecord::Base
belongs_to :user
end

View file

@ -73,15 +73,43 @@
%br %br
%h3 %h3
= t('.email_notifications') = t('.receive_email_notifications')
= form_for @user do |f| = form_for @user do |f|
= f.error_messages = f.error_messages
%p.checkbox_select = f.fields_for :email_preferences do |type|
= f.label :disable_mail, t('.receive_email_notifications') #email_prefs
= f.check_box :disable_mail, {:checked => !@user.disable_mail}, false, true %p.checkbox_select
%br = type.label t('.also_commented')
= f.submit t('.change') = 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
%br %br
@ -100,5 +128,5 @@
%h3 %h3
= t('.close_account') = t('.close_account')
= link_to t('.close_account'), current_user, = link_to t('.close_account'), current_user,
:confirm => t('are_you_sure'), :method => :delete, :confirm => t('are_you_sure'), :method => :delete,
:class => "button" :class => "button"

View file

@ -164,6 +164,7 @@ en:
contacts_visible: "Contacts in this aspect will be able to see each other." contacts_visible: "Contacts in this aspect will be able to see each other."
contacts_not_visible: "Contacts in this aspect will not be able to see each other." contacts_not_visible: "Contacts in this aspect will not be able to see each other."
edit: edit:
make_aspect_list_visible: 'make aspect list visible?'
remove_aspect: "Delete this aspect" remove_aspect: "Delete this aspect"
confirm_remove_aspect: "Are you sure you want to delete this aspect?" confirm_remove_aspect: "Are you sure you want to delete this aspect?"
add_existing: "Add an existing contact" add_existing: "Add an existing contact"
@ -250,8 +251,13 @@ en:
your_handle: "Your diaspora handle" your_handle: "Your diaspora handle"
your_email: "Your email" your_email: "Your email"
edit_account: "Edit account" edit_account: "Edit account"
email_notifications: "Email notifications" receive_email_notifications: "Receive email notifications when..."
receive_email_notifications: "Receive email notifications?" also_commented: "...someone also comments on your contacts post?"
comment_on_post: "...someone comments on your post?"
mentioned: "...you are mentioned in a post?"
request_received: "...you receive a new share request?"
request_acceptence: "...your share request is accepted?"
private_message: "...you recevie a private message?"
change: "Change" change: "Change"
destroy: "Account successfully closed." destroy: "Account successfully closed."
getting_started: getting_started:

View file

@ -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

View file

@ -476,6 +476,13 @@ ActiveRecord::Schema.define(:version => 20110311220249) do
t.string "name" t.string "name"
end 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| create_table "users", :force => true do |t|
t.string "username" t.string "username"
t.text "serialized_private_key" t.text "serialized_private_key"

View file

@ -95,6 +95,24 @@ describe UsersController do
@user.language.should_not == old_language @user.language.should_not == old_language
end end
end end
describe 'email settings' do
it 'lets the user turn off mail' do
par = {:id => @user.id, :user => {:email_preferences => {'mentioned' => 'true'}}}
proc{
put :update, par
}.should change(@user.user_preferences, :count).by(1)
end
it 'lets the user get mail again' do
@user.user_preferences.create(:email_type => 'mentioned')
par = {:id => @user.id, :user => {:email_preferences => {'mentioned' => 'false'}}}
proc{
put :update, par
}.should change(@user.user_preferences, :count).by(-1)
end
end
end end
describe '#edit' do describe '#edit' do
@ -102,5 +120,11 @@ describe UsersController do
get 'edit', :id => @user.id get 'edit', :id => @user.id
response.status.should == 200 response.status.should == 200
end end
it 'set @email_pref to false when there is a user pref' do
@user.user_preferences.create(:email_type => 'mentioned')
get 'edit', :id => @user.id
assigns[:email_prefs]['mentioned'].should be_false
end
end end
end end

View file

@ -0,0 +1,5 @@
require 'spec_helper'
describe UserPreference do
pending "add some examples to (or delete) #{__FILE__}"
end

View file

@ -215,6 +215,22 @@ describe User do
end end
end 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 describe ".find_for_authentication" do
it 'finds a user' do it 'finds a user' do
@ -450,11 +466,8 @@ describe User do
alice.mail(Job::MailRequestReceived, alice.id, 'contactrequestid') alice.mail(Job::MailRequestReceived, alice.id, 'contactrequestid')
end end
it 'does not enqueue a mail job' do it 'does not enqueue a mail job if the correct corresponding job has a prefrence entry' do
alice.disable_mail = true alice.user_preferences.create(:email_type => 'request_received')
alice.save
alice.reload
Resque.should_not_receive(:enqueue) Resque.should_not_receive(:enqueue)
alice.mail(Job::MailRequestReceived, alice.id, 'contactrequestid') alice.mail(Job::MailRequestReceived, alice.id, 'contactrequestid')
end end