From ee9b203f99742784abc28b40204c41c2e184875e Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Tue, 26 Nov 2013 00:03:42 -0600 Subject: [PATCH 1/5] vrfs-775: integrating new musician emails --- ruby/lib/jam_ruby/app/mailers/user_mailer.rb | 10 +++++++ .../user_mailer/new_musicians.html.erb | 5 ++++ .../user_mailer/new_musicians.text.erb | 5 ++++ ruby/lib/jam_ruby/models/search.rb | 16 +++++------ ruby/lib/jam_ruby/models/user.rb | 11 +++++++- .../jam_ruby/models/musician_search_spec.rb | 28 +++++++++++++++---- ruby/spec/mailers/user_mailer_spec.rb | 19 +++++++++++++ 7 files changed, 78 insertions(+), 16 deletions(-) create mode 100644 ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.html.erb create mode 100644 ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.text.erb diff --git a/ruby/lib/jam_ruby/app/mailers/user_mailer.rb b/ruby/lib/jam_ruby/app/mailers/user_mailer.rb index e8785e81c..9afebd965 100644 --- a/ruby/lib/jam_ruby/app/mailers/user_mailer.rb +++ b/ruby/lib/jam_ruby/app/mailers/user_mailer.rb @@ -78,5 +78,15 @@ format.html end end + + def new_musicians(user, new_nearby) + @user, @new_nearby = user, new_nearby + sendgrid_unique_args :type => "new_musicians" + mail(:to => user.email, :subject => "JamKazam New Musicians in Your Area") do |format| + format.text + format.html + end + end + end end diff --git a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.html.erb b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.html.erb new file mode 100644 index 000000000..104eaab6e --- /dev/null +++ b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.html.erb @@ -0,0 +1,5 @@ +<% provide(:title, 'Confirm Email') %> + +

New JamKazam Musicians in your Area, <%= @user.first_name %>!

+ +

diff --git a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.text.erb b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.text.erb new file mode 100644 index 000000000..7c127fe37 --- /dev/null +++ b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.text.erb @@ -0,0 +1,5 @@ +<% provide(:title, 'Confirm Email') %> + +New JamKazam Musicians in your Area, <%= @user.first_name %>! + + diff --git a/ruby/lib/jam_ruby/models/search.rb b/ruby/lib/jam_ruby/models/search.rb index cdfcb8d53..8ee7ea767 100644 --- a/ruby/lib/jam_ruby/models/search.rb +++ b/ruby/lib/jam_ruby/models/search.rb @@ -250,16 +250,14 @@ module JamRuby false end - def self.new_musicians(since_date=Time.now - 1.week, max_count=100, radius=M_MILES_DEFAULT) + def self.new_musicians(usr, since_date=Time.now - 1.week, max_count=50, radius=M_MILES_DEFAULT) return unless block_given? - User.where(['lat IS NOT NULL AND lng IS NOT NULL']).find_each do |usr| - rel = User.musicians - .where(['created_at >= ? AND users.id != ?', since_date, usr.id]) - .within(radius, :origin => [usr.lat, usr.lng]) - .order('created_at DESC') - .limit(max_count) - yield(rel) if 0 < rel.count - end + rel = User.musicians + .where(['created_at >= ? AND users.id != ?', since_date, usr.id]) + .within(radius, :origin => [usr.lat, usr.lng]) + .order('created_at DESC') + .limit(max_count) + yield(rel) if 0 < rel.count end end diff --git a/ruby/lib/jam_ruby/models/user.rb b/ruby/lib/jam_ruby/models/user.rb index a07554d81..5a4d7debc 100644 --- a/ruby/lib/jam_ruby/models/user.rb +++ b/ruby/lib/jam_ruby/models/user.rb @@ -139,7 +139,8 @@ module JamRuby validate :update_email_case_insensitive_uniqueness, :if => :updating_email scope :musicians, where(:musician => true) - scope :musicians_geocoded, where(['musician = ? AND lat IS NOT NULL AND lng IS NOT NULL',true]) + scope :geocoded_users, where(['lat IS NOT NULL AND lng IS NOT NULL']) + scope :musicians_geocoded, musicians.geocoded_users def user_progression_fields @user_progression_fields ||= Set.new ["first_downloaded_client_at", "first_ran_client_at", "first_music_session_at", "first_real_music_session_at", "first_good_music_session_at", "first_certified_gear_at", "first_invited_at", "first_friended_at", "first_social_promoted_at" ] @@ -988,6 +989,14 @@ module JamRuby .order('follows.created_at DESC') .limit(3) end + + def self.deliver_new_musician_notifications + self.geocoded_users.find_each do |usr| + Search.new_musicians(usr) do |new_nearby| + UserMailer.password_changed(self, new_nearby).deliver + end + end + end # devise compatibility diff --git a/ruby/spec/jam_ruby/models/musician_search_spec.rb b/ruby/spec/jam_ruby/models/musician_search_spec.rb index e86bd5db4..6eda4ae28 100644 --- a/ruby/spec/jam_ruby/models/musician_search_spec.rb +++ b/ruby/spec/jam_ruby/models/musician_search_spec.rb @@ -204,15 +204,31 @@ describe 'Musician search' do end context 'new users' do + it "find nearby" do - # create new user to ensure its excluded from results - usr = FactoryGirl.create(:user, {city: "Austin", state: "TX", country: "US"}) - Search.new_musicians do |usrs| - # the newly created user is not nearby the existing users (which are in Apex, NC) - # and that user is not included in query - expect(usrs.count).to eq(User.musicians.count - 1) + # create new user outside 500 from Apex to ensure its excluded from results + FactoryGirl.create(:user, {city: "Austin", state: "TX", country: "US"}) + User.geocoded_users.find_each do |usr| + Search.new_musicians(usr) do |new_usrs| + # the newly created user is not nearby the existing users (which are in Apex, NC) + # and that user is not included in query + expect(new_usrs.count).to eq(User.musicians.count - 1) + end end end + + it "sends new musician email" do + # create new user outside 500 from Apex to ensure its excluded from results + FactoryGirl.create(:user, {city: "Austin", state: "TX", country: "US"}) + User.geocoded_users.find_each do |usr| + Search.new_musicians(usr) do |new_usrs| + # the newly created user is not nearby the existing users (which are in Apex, NC) + # and that user is not included in query + expect(new_usrs.count).to eq(User.musicians.count - 1) + end + end + end + end end diff --git a/ruby/spec/mailers/user_mailer_spec.rb b/ruby/spec/mailers/user_mailer_spec.rb index 77f48e0c4..30ecc52af 100644 --- a/ruby/spec/mailers/user_mailer_spec.rb +++ b/ruby/spec/mailers/user_mailer_spec.rb @@ -137,4 +137,23 @@ describe UserMailer do end + describe "sends new musicians email" do + + let(:mail) { UserMailer.deliveries[0] } + + before(:each) do + UserMailer.new_musicians(user, User.musicians).deliver + end + + it { UserMailer.deliveries.length.should == 1 } + + it { mail['from'].to_s.should == UserMailer::DEFAULT_SENDER } + it { mail['to'].to_s.should == user.email } + it { mail.multipart?.should == true } # because we send plain + html + + # verify that the messages are correctly configured + it { mail.html_part.body.include?("New JamKazam Musicians in your Area").should be_true } + it { mail.text_part.body.include?("New JamKazam Musicians in your Area").should be_true } + end + end From cde19cde5696037ae5ff43358fecf608372790a4 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Tue, 26 Nov 2013 03:08:22 -0600 Subject: [PATCH 2/5] vrfs-775: formatting new musicians email --- ruby/lib/jam_ruby/app/mailers/user_mailer.rb | 4 ++-- .../user_mailer/new_musicians.html.erb | 24 ++++++++++++++++--- ruby/lib/jam_ruby/models/search.rb | 3 ++- ruby/lib/jam_ruby/models/user.rb | 2 +- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/ruby/lib/jam_ruby/app/mailers/user_mailer.rb b/ruby/lib/jam_ruby/app/mailers/user_mailer.rb index 9afebd965..c399f4e24 100644 --- a/ruby/lib/jam_ruby/app/mailers/user_mailer.rb +++ b/ruby/lib/jam_ruby/app/mailers/user_mailer.rb @@ -79,8 +79,8 @@ end end - def new_musicians(user, new_nearby) - @user, @new_nearby = user, new_nearby + def new_musicians(user, new_nearby, host='www.jamkazam.com') + @user, @new_nearby, @host = user, new_nearby, host sendgrid_unique_args :type => "new_musicians" mail(:to => user.email, :subject => "JamKazam New Musicians in Your Area") do |format| format.text diff --git a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.html.erb b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.html.erb index 104eaab6e..12d366f63 100644 --- a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.html.erb +++ b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.html.erb @@ -1,5 +1,23 @@ -<% provide(:title, 'Confirm Email') %> +<% provide(:title, 'New JamKazam Musicians in your Area') %>

New JamKazam Musicians in your Area, <%= @user.first_name %>!

- -

+<% link_style = "background-color:#ED3618; margin:0px 8px 0px 8px; border: solid 1px #F27861; outline: solid 2px #ED3618; padding:3px 10px; font-family:raleway; font-size:12px; font-weight:300; cursor:pointer; color:#FC9; text-decoration:none;" %> +

+ +<% @new_nearby.each do |user| %> + + + + + + +<% end %> +
<%= user.name %>
+ <%= user.location %>

+ <% user.musician_instruments.each do |inst| %> + + <% end %> +
<%= user.biography %>

+Profile   +
+

diff --git a/ruby/lib/jam_ruby/models/search.rb b/ruby/lib/jam_ruby/models/search.rb index 8ee7ea767..f6e6cca60 100644 --- a/ruby/lib/jam_ruby/models/search.rb +++ b/ruby/lib/jam_ruby/models/search.rb @@ -257,7 +257,8 @@ module JamRuby .within(radius, :origin => [usr.lat, usr.lng]) .order('created_at DESC') .limit(max_count) - yield(rel) if 0 < rel.count + objs = rel.all.to_a + yield(objs) if 0 < objs.count end end diff --git a/ruby/lib/jam_ruby/models/user.rb b/ruby/lib/jam_ruby/models/user.rb index 5a4d7debc..c212e96c9 100644 --- a/ruby/lib/jam_ruby/models/user.rb +++ b/ruby/lib/jam_ruby/models/user.rb @@ -993,7 +993,7 @@ module JamRuby def self.deliver_new_musician_notifications self.geocoded_users.find_each do |usr| Search.new_musicians(usr) do |new_nearby| - UserMailer.password_changed(self, new_nearby).deliver + UserMailer.new_musicians(self, new_nearby).deliver end end end From c792b5216aea181bf70258ff1a2f61b954cefa74 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Tue, 26 Nov 2013 08:40:06 -0600 Subject: [PATCH 3/5] vrfs-775: tuning the new musician email --- .../user_mailer/new_musicians.html.erb | 7 ++-- ruby/lib/jam_ruby/models/instrument.rb | 33 +++++++++++++++++++ ruby/lib/jam_ruby/models/search.rb | 7 ++-- ruby/lib/jam_ruby/models/user.rb | 6 ++-- 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.html.erb b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.html.erb index 12d366f63..a6abfd81a 100644 --- a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.html.erb +++ b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.html.erb @@ -1,16 +1,15 @@ <% provide(:title, 'New JamKazam Musicians in your Area') %> -

New JamKazam Musicians in your Area, <%= @user.first_name %>!

<% link_style = "background-color:#ED3618; margin:0px 8px 0px 8px; border: solid 1px #F27861; outline: solid 2px #ED3618; padding:3px 10px; font-family:raleway; font-size:12px; font-weight:300; cursor:pointer; color:#FC9; text-decoration:none;" %>

<% @new_nearby.each do |user| %> - +
<%= user.name %>
<%= user.location %>

- <% user.musician_instruments.each do |inst| %> - + <% user.instruments.each do |inst| %> + <% end %>
<%= user.biography %>

diff --git a/ruby/lib/jam_ruby/models/instrument.rb b/ruby/lib/jam_ruby/models/instrument.rb index 6b5936e87..2764a930c 100644 --- a/ruby/lib/jam_ruby/models/instrument.rb +++ b/ruby/lib/jam_ruby/models/instrument.rb @@ -1,6 +1,35 @@ module JamRuby class Instrument < ActiveRecord::Base + MAP_ICON_NAME = { + "accordion" => "accordion", + "acoustic guitar" => "acoustic", + "banjo" => "banjo", + "bass guitar" => "bass", + "cello" => "cello", + "clarinet" => "clarinet", + "computer" => "computer", + "default" => "default", + "drums" => "drums", + "electric guitar" => "guitar", + "euphonium" => "euphonium", + "flute" => "flute", + "french horn" => "frenchhorn", + "harmonica" => "harmonica", + "keyboard" => "keyboard", + "mandolin" => "mandolin", + "oboe" => "oboe", + "other" => "other", + "saxophone" => "saxophone", + "trombone" => "trombone", + "trumpet" => "trumpet", + "tuba" => "tuba", + "ukulele" => "ukelele", + "viola" => "viola", + "violin" => "violin", + "voice" => "vocals" + } + self.primary_key = 'id' # users @@ -16,5 +45,9 @@ module JamRuby return Instrument.where('instruments.popularity > 0').order('instruments.popularity DESC, instruments.description ASC') end + def icon_name + MAP_ICON_NAME[self.id] + end + end end diff --git a/ruby/lib/jam_ruby/models/search.rb b/ruby/lib/jam_ruby/models/search.rb index f6e6cca60..1372f495e 100644 --- a/ruby/lib/jam_ruby/models/search.rb +++ b/ruby/lib/jam_ruby/models/search.rb @@ -251,14 +251,17 @@ module JamRuby end def self.new_musicians(usr, since_date=Time.now - 1.week, max_count=50, radius=M_MILES_DEFAULT) - return unless block_given? rel = User.musicians .where(['created_at >= ? AND users.id != ?', since_date, usr.id]) .within(radius, :origin => [usr.lat, usr.lng]) .order('created_at DESC') .limit(max_count) objs = rel.all.to_a - yield(objs) if 0 < objs.count + if block_given? + yield(objs) if 0 < objs.count + else + return objs + end end end diff --git a/ruby/lib/jam_ruby/models/user.rb b/ruby/lib/jam_ruby/models/user.rb index c212e96c9..8fbdb7ed9 100644 --- a/ruby/lib/jam_ruby/models/user.rb +++ b/ruby/lib/jam_ruby/models/user.rb @@ -990,10 +990,10 @@ module JamRuby .limit(3) end - def self.deliver_new_musician_notifications + def self.deliver_new_musician_notifications(since_date=Time.now-1.week) self.geocoded_users.find_each do |usr| - Search.new_musicians(usr) do |new_nearby| - UserMailer.new_musicians(self, new_nearby).deliver + Search.new_musicians(usr, since_date) do |new_nearby| + UserMailer.new_musicians(usr, new_nearby).deliver end end end From e57a27614485146022769c686b1b08cf7655c9b2 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Tue, 26 Nov 2013 09:00:50 -0600 Subject: [PATCH 4/5] vrfs-775: added rake task; updating plain text email --- .../views/jam_ruby/user_mailer/new_musicians.text.erb | 10 +++++++--- web/lib/tasks/users.rake | 7 +++++++ 2 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 web/lib/tasks/users.rake diff --git a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.text.erb b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.text.erb index 7c127fe37..8260d4bd7 100644 --- a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.text.erb +++ b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.text.erb @@ -1,5 +1,9 @@ -<% provide(:title, 'Confirm Email') %> - -New JamKazam Musicians in your Area, <%= @user.first_name %>! +<% provide(:title, 'New JamKazam Musicians in your Area') %> +<% @new_nearby.each do |user| %> +<%= user.name %> (http://<%= @host %>/#/profile/<%= user.id %>) + <%= user.location %> + <% user.instruments.collect { |inst| inst.description }.join(', ') %> + <%= user.biography %> +<% end %> diff --git a/web/lib/tasks/users.rake b/web/lib/tasks/users.rake new file mode 100644 index 000000000..4ad3d895f --- /dev/null +++ b/web/lib/tasks/users.rake @@ -0,0 +1,7 @@ +namespace :users do + desc "Import a maxmind database; run like this: rake db:import_maxmind_geo file=" + task new_musician_email: :environment do + User.deliver_new_musician_notifications(Time.now-12.months) + end + +end From 6253b90697e70514c65905d48a9999d08be184e9 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Tue, 26 Nov 2013 09:07:02 -0600 Subject: [PATCH 5/5] vrfs-775: fixed title to pass test --- .../app/views/jam_ruby/user_mailer/new_musicians.text.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.text.erb b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.text.erb index 8260d4bd7..c69f9965f 100644 --- a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.text.erb +++ b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/new_musicians.text.erb @@ -1,4 +1,4 @@ -<% provide(:title, 'New JamKazam Musicians in your Area') %> +New JamKazam Musicians in your Area <% @new_nearby.each do |user| %> <%= user.name %> (http://<%= @host %>/#/profile/<%= user.id %>)