From c774685d521c442bb7e3b4b69fa4c9ed1676009a Mon Sep 17 00:00:00 2001 From: maxwell Date: Fri, 10 Dec 2010 11:47:10 -0800 Subject: [PATCH] users can now disable email notfications --- app/controllers/users_controller.rb | 7 ++++++- app/models/user.rb | 23 +++++++++-------------- app/views/users/edit.html.haml | 16 ++++++++++++++++ config/locales/diaspora/en.yml | 4 ++++ lib/diaspora/user/connecting.rb | 4 ++-- spec/models/user_spec.rb | 21 +++++++++++++++++++++ 6 files changed, 58 insertions(+), 17 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index c2d443b20..034716db5 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -23,7 +23,12 @@ class UsersController < ApplicationController 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? - if params[:user][:password] && params[:user][:password_confirmation] + # change email notifications + if params[:user][:disable_mail] + @user.update_attributes(:disable_mail => params[:user][:disable_mail]) + flash[:notice] = I18n.t 'users.update.email_notification_changed' + # change passowrd + elsif params[:user][:password] && params[:user][:password_confirmation] if @user.update_attributes(:password => params[:user][:password], :password_confirmation => params[:user][:password_confirmation]) flash[:notice] = I18n.t 'users.update.password_changed' else diff --git a/app/models/user.rb b/app/models/user.rb index c09d9ef3b..b57131607 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -26,6 +26,7 @@ class User key :visible_person_ids, Array, :typecast => 'ObjectId' key :getting_started, Boolean, :default => true + key :disable_mail, Boolean, :default => false key :language, String @@ -60,7 +61,7 @@ class User person.save if person end - attr_accessible :getting_started, :password, :password_confirmation, :language, + attr_accessible :getting_started, :password, :password_confirmation, :language, :disable_mail def strip_and_downcase_username if username.present? @@ -281,6 +282,13 @@ class User end end + ######### Mailer ####################### + def mail(job, *args) + unless self.disable_mail + Resque.enqueue(job, *args) + end + end + ######### Posts and Such ############### def retract(post) aspect_ids = aspects_with_post(post.id) @@ -367,24 +375,11 @@ class User self end - def seed_aspects self.aspects.create(:name => I18n.t('aspects.seed.family')) self.aspects.create(:name => I18n.t('aspects.seed.work')) end - def as_json(opts={}) - { - :user => { - :posts => self.raw_visible_posts.each { |post| post.as_json }, - :contacts => self.contacts.each { |contact| contact.as_json }, - :aspects => self.aspects.each { |aspect| aspect.as_json }, - :pending_requests => self.pending_requests.each { |request| request.as_json }, - } - } - end - - def self.generate_key key_size = (Rails.env == 'test' ? 512 : 4096) OpenSSL::PKey::RSA::generate key_size diff --git a/app/views/users/edit.html.haml b/app/views/users/edit.html.haml index 3bb4b2652..3a813eb82 100644 --- a/app/views/users/edit.html.haml +++ b/app/views/users/edit.html.haml @@ -81,6 +81,22 @@ %hr %br + %h3 + = t('.email_notifications') + = 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') + + %br + %br + %hr + %br + .span-8.append-2 %h3 diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml index e96755e2d..88e4ae0dd 100644 --- a/config/locales/diaspora/en.yml +++ b/config/locales/diaspora/en.yml @@ -180,6 +180,9 @@ en: your_handle: "Your diaspora handle" your_email: "Your email" edit_account: "Edit account" + email_notifications: "Email notificaions" + receive_email_notifications: "Receive email notificaions?" + change: "Change" destroy: "Account successfully closed." getting_started: welcome: "Welcome to Diaspora!" @@ -214,6 +217,7 @@ en: password_not_changed: "Password Change Failed" language_changed: "Language Changed" language_not_changed: "Language Change Failed" + email_notifications_changed: "Language Change Failed" public: does_not_exist: "User %{username} does not exist!" comments: diff --git a/lib/diaspora/user/connecting.rb b/lib/diaspora/user/connecting.rb index 22a0c793a..62fc304db 100644 --- a/lib/diaspora/user/connecting.rb +++ b/lib/diaspora/user/connecting.rb @@ -65,7 +65,7 @@ module Diaspora self.pending_requests << contact_request self.save! Rails.logger.info("event=contact_request status=received_new_request from=#{contact_request.from.diaspora_handle} to=#{self.diaspora_handle}") - Resque.enqueue(Jobs::MailRequestReceived, self.id, contact_request.from.id) + self.mail(Jobs::MailRequestReceived, self.id, contact_request.from.id) end else Rails.logger.info "event=contact_request status=abort from=#{contact_request.from.diaspora_handle} to=#{self.diaspora_handle} reason=self-love" @@ -83,7 +83,7 @@ module Diaspora pending_requests.delete(sent_request) sent_request.destroy self.save - Resque.enqueue(Jobs::MailRequestAcceptance, self.id, received_request.from.id, destination_aspect.id) + self.mail(Jobs::MailRequestAcceptance, self.id, received_request.from.id, destination_aspect.id) end def disconnect(bad_contact) diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index c11d5b99b..1e43efc2a 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -381,4 +381,25 @@ describe User do end end end + + describe '#mail' do + it 'enqueues a mail job' do + user.disable_mail = false + user.save + user.reload + + Resque.should_receive(:enqueue).with(Jobs::MailRequestReceived, user.id, 'contactrequestid').once + user.mail(Jobs::MailRequestReceived, user.id, 'contactrequestid') + end + + it 'does not enqueue a mail job' do + user.disable_mail = true + user.save + user.reload + + Resque.should_not_receive(:enqueue) + user.mail(Jobs::MailRequestReceived, user.id, 'contactrequestid') + end + end + end