diff --git a/admin/app/views/admin/jam_tracks/_form.html.slim b/admin/app/views/admin/jam_tracks/_form.html.slim index ac038e5ca..6c1df35e2 100644 --- a/admin/app/views/admin/jam_tracks/_form.html.slim +++ b/admin/app/views/admin/jam_tracks/_form.html.slim @@ -5,7 +5,7 @@ = f.input :description, :input_html => { :rows=>5, :maxlength=>1000 } = f.input :plan_code, :label=>'Recurly Plan Code', :required=>true, :hint => 'Must match plan code in Recurly' //= f.input :initial_play_silence, :label => 'Initial Play Silence (seconds)' - = f.input :time_signature, collection: JamRuby::JamTrack::TIME_SIGNATURES, include_blank: true + = f.input :allow_free, :label => "Allow Free to new Users?" = f.input :status, collection: JamRuby::JamTrack::STATUS, include_blank: false, hint: 'Only set to Production when end users should be able to purchase this JamTrack' = f.input :recording_type, collection: JamRuby::JamTrack::RECORDING_TYPE, include_blank: false = f.input :original_artist, :input_html => { :rows=>1, :maxlength=>1000 } diff --git a/db/manifest b/db/manifest index 12d764914..66680d0e7 100755 --- a/db/manifest +++ b/db/manifest @@ -362,4 +362,5 @@ jamclass_report.sql jamblasters_network.sql immediate_recordings.sql nullable_user_id_jamblaster.sql -rails4_migration.sql \ No newline at end of file +rails4_migration.sql +non_free_jamtracks.sql \ No newline at end of file diff --git a/db/up/non_free_jamtracks.sql b/db/up/non_free_jamtracks.sql new file mode 100644 index 000000000..bb085bed3 --- /dev/null +++ b/db/up/non_free_jamtracks.sql @@ -0,0 +1,7 @@ +ALTER TABLE jam_tracks ADD COLUMN allow_free BOOLEAN DEFAULT TRUE; + +ALTER TABLE lesson_package_purchases DROP CONSTRAINT lesson_package_purchases_lesson_booking_id_fkey; +ALTER TABLE lesson_package_purchases ADD CONSTRAINT lesson_package_purchases_lesson_booking_id_fkey FOREIGN KEY (lesson_booking_id) REFERENCES lesson_bookings(id) ON DELETE SET NULL; + +ALTER TABLE lesson_booking_slots DROP CONSTRAINT lesson_booking_slots_lesson_booking_id_fkey; +ALTER TABLE lesson_booking_slots ADD CONSTRAINT lesson_booking_slots_lesson_booking_id_fkey FOREIGN KEY (lesson_booking_id) REFERENCES lesson_bookings(id) ON DELETE SET NULL; diff --git a/ruby/lib/jam_ruby/app/mailers/corp_mailer.rb b/ruby/lib/jam_ruby/app/mailers/corp_mailer.rb index 1c9239c8b..b97417c3f 100644 --- a/ruby/lib/jam_ruby/app/mailers/corp_mailer.rb +++ b/ruby/lib/jam_ruby/app/mailers/corp_mailer.rb @@ -9,7 +9,7 @@ module JamRuby class CorpMailer < ActionMailer::Base include SendGrid - layout "user_mailer" + layout "raw_mailer" DEFAULT_SENDER = "JamKazam " diff --git a/ruby/lib/jam_ruby/app/mailers/user_mailer.rb b/ruby/lib/jam_ruby/app/mailers/user_mailer.rb index b5f055419..aab962c1f 100644 --- a/ruby/lib/jam_ruby/app/mailers/user_mailer.rb +++ b/ruby/lib/jam_ruby/app/mailers/user_mailer.rb @@ -166,6 +166,8 @@ module JamRuby def friend_request(user, msg, friend_request_id) return if !user.subscribe_email + @user = user + email = user.email subject = "You have a new friend request on JamKazam" unique_args = {:type => "friend_request"} @@ -187,6 +189,8 @@ module JamRuby def friend_request_accepted(user, msg) return if !user.subscribe_email + @user = user + email = user.email subject = "You have a new friend on JamKazam" unique_args = {:type => "friend_request_accepted"} @@ -207,6 +211,8 @@ module JamRuby def new_user_follower(user, msg) return if !user.subscribe_email + @user = user + email = user.email subject = "You have a new follower on JamKazam" unique_args = {:type => "new_user_follower"} @@ -227,6 +233,8 @@ module JamRuby def new_band_follower(user, msg) return if !user.subscribe_email + @user = user + email = user.email subject = "Your band has a new follower on JamKazam" unique_args = {:type => "new_band_follower"} @@ -247,6 +255,9 @@ module JamRuby def session_invitation(user, msg) return if !user.subscribe_email + @user = user + + email = user.email subject = "You have been invited to a session on JamKazam" unique_args = {:type => "session_invitation"} @@ -267,6 +278,9 @@ module JamRuby def musician_session_join(user, msg, session_id) return if !user.subscribe_email + @user = user + + email = user.email subject = "Someone you know is in a session on JamKazam" unique_args = {:type => "musician_session_join"} @@ -287,6 +301,9 @@ module JamRuby def scheduled_session_invitation(user, msg, session) return if !user.subscribe_email + @user = user + + email = user.email subject = "Session Invitation" unique_args = {:type => "scheduled_session_invitation"} @@ -309,6 +326,7 @@ module JamRuby def scheduled_session_rsvp(user, msg, session) return if !user.subscribe_email + @user = user email = user.email subject = "Session RSVP" unique_args = {:type => "scheduled_session_rsvp"} @@ -331,6 +349,9 @@ module JamRuby def scheduled_session_rsvp_approved(user, msg, session) return if !user.subscribe_email + @user = user + + email = user.email subject = "Session RSVP Approved" unique_args = {:type => "scheduled_session_rsvp_approved"} @@ -353,6 +374,9 @@ module JamRuby def scheduled_session_rsvp_cancelled(user, msg, session) return if !user.subscribe_email + @user = user + + email = user.email subject = "Session RSVP Cancelled" unique_args = {:type => "scheduled_session_rsvp_cancelled"} @@ -375,6 +399,9 @@ module JamRuby def scheduled_session_rsvp_cancelled_org(user, msg, session) return if !user.subscribe_email + @user = user + + email = user.email subject = "Your Session RSVP Cancelled" unique_args = {:type => "scheduled_session_rsvp_cancelled_org"} @@ -397,6 +424,8 @@ module JamRuby def scheduled_session_cancelled(user, msg, session) return if !user.subscribe_email + @user = user + email = user.email subject = "Session Cancelled" unique_args = {:type => "scheduled_session_cancelled"} @@ -419,6 +448,9 @@ module JamRuby def scheduled_session_rescheduled(user, msg, session) return if !user.subscribe_email + @user = user + + email = user.email subject = "Session Rescheduled" unique_args = {:type => "scheduled_session_rescheduled"} @@ -439,12 +471,16 @@ module JamRuby end def scheduled_session_reminder_upcoming(user, session) + @user = user + subject = "Your JamKazam session starts in 1 hour!" unique_args = {:type => "scheduled_session_reminder_upcoming"} send_scheduled_session_reminder(user, session, subject, unique_args) end def scheduled_session_reminder_day(user, session) + @user = user + subject = "JamKazam Session Reminder" unique_args = {:type => "scheduled_session_reminder_day"} send_scheduled_session_reminder(user, session, subject, unique_args) @@ -473,6 +509,9 @@ module JamRuby def scheduled_session_comment(target_user, sender, msg, comment, session) return if !target_user.subscribe_email + @user = target_user + + email = target_user.email subject = "New Session Comment" unique_args = {:type => "scheduled_session_comment"} @@ -520,6 +559,8 @@ module JamRuby subject = "A band that you follow has joined a session" unique_args = {:type => "band_session_join"} + @user = user + @body = msg @session_url = "#{APP_CONFIG.external_root_url}/sessions/#{session_id}" sendgrid_category "Notification" @@ -537,6 +578,9 @@ module JamRuby def musician_recording_saved(user, msg) return if !user.subscribe_email + @user = user + + email = user.email subject = "A musician has saved a new recording on JamKazam" unique_args = {:type => "musician_recording_saved"} @@ -557,6 +601,9 @@ module JamRuby def band_recording_saved(user, msg) return if !user.subscribe_email + @user = user + + email = user.email subject = "A band has saved a new recording on JamKazam" unique_args = {:type => "band_recording_saved"} @@ -577,6 +624,8 @@ module JamRuby def band_invitation(user, msg) return if !user.subscribe_email + @user = user + email = user.email subject = "You have been invited to join a band on JamKazam" unique_args = {:type => "band_invitation"} @@ -597,6 +646,9 @@ module JamRuby def band_invitation_accepted(user, msg) return if !user.subscribe_email + @user = user + + email = user.email subject = "Your band invitation was accepted" unique_args = {:type => "band_invitation_accepted"} @@ -618,6 +670,8 @@ module JamRuby def text_message(user, sender_id, sender_name, sender_photo_url, message) return if !user.subscribe_email + @user = user + email = user.email subject = "Message from #{sender_name}" unique_args = {:type => "text_message"} @@ -640,6 +694,7 @@ module JamRuby end def student_lesson_request(lesson_booking) + @user = lesson_booking.user email = lesson_booking.user.email subject = "You have sent a lesson request to #{lesson_booking.teacher.name}!" unique_args = {:type => "student_lesson_request"} @@ -666,6 +721,7 @@ module JamRuby unique_args = {:type => "teacher_lesson_request"} @sender = lesson_booking.user + @user = lesson_booking.user @lesson_booking = lesson_booking sendgrid_category "Notification" @@ -693,6 +749,7 @@ module JamRuby end @lesson_session = lesson_session @message = message + @user = lesson_session.student email = lesson_session.student.email unique_args = {:type => "student_lesson_accepted"} @@ -722,6 +779,7 @@ module JamRuby @lesson_session = lesson_session @message = message + @user = lesson_session.teacher email = lesson_session.school_and_teacher unique_args = {:type => "teacher_lesson_accepted"} @@ -750,6 +808,7 @@ module JamRuby end @lesson_session = lesson_session @message = message + @user = lesson_session.student email = lesson_session.student.email unique_args = {:type => "student_lesson_accepted"} @@ -777,6 +836,8 @@ module JamRuby subject = "All lesson times changed with #{lesson_session.student.name}!" end + + @user = lesson_session.teacher @lesson_session = lesson_session @message = message email = lesson_session.school_and_teacher @@ -797,8 +858,10 @@ module JamRuby def teacher_scheduled_jamclass_invitation(user, msg, session) email = user.email + @subject = "#{session.lesson_session.lesson_booking.display_type2.capitalize} JamClass Scheduled with #{session.lesson_session.student.name}" unique_args = {:type => "scheduled_jamclass_invitation"} + @user = session.lesson_session.student @student = session.lesson_session.student @teacher = session.lesson_session.teacher @body = msg @@ -819,11 +882,11 @@ module JamRuby end def student_scheduled_jamclass_invitation(user, msg, session) - return if !user.subscribe_email email = user.email @subject = "#{session.lesson_session.lesson_booking.display_type2.capitalize} JamClass Scheduled with #{session.lesson_session.teacher.name}" unique_args = {:type => "scheduled_jamclass_invitation"} + @user = session.lesson_session.student @student = session.lesson_session.student @teacher = session.lesson_session.teacher @body = msg @@ -846,6 +909,7 @@ module JamRuby # teacher proposed counter time; so send msg to the student def student_lesson_counter(lesson_session, slot) + @user = lesson_session.student email = lesson_session.student.email subject = "Instructor has proposed a different time for your lesson" unique_args = {:type => "student_lesson_counter"} @@ -871,6 +935,7 @@ module JamRuby # student proposed counter time; so send msg to the teacher def teacher_lesson_counter(lesson_session, slot) + @user = lesson_session.teacher email = lesson_session.school_over_teacher subject = "Student has proposed a different time for their lesson" unique_args = {:type => "teacher_lesson_counter"} @@ -901,6 +966,7 @@ module JamRuby @session_date = lesson_session.slot.pretty_scheduled_start(true) @session_url = lesson_session.web_url @lesson_session = lesson_session + @user = lesson_session.teacher email = lesson_session.school_and_teacher if @lesson_session.student_missed subject = "You will be paid for your lesson with #{@student.name}" @@ -934,6 +1000,7 @@ module JamRuby @session_url = lesson_session.web_url @lesson_session = lesson_session + @user = lesson_session.student email = @student.email subject = "You have used #{@student.used_test_drives} of #{@student.total_test_drives} TestDrive lesson credits" unique_args = {:type => "student_test_drive_success"} @@ -951,6 +1018,7 @@ module JamRuby end def teacher_test_drive_no_bill(lesson_session) + @user = lesson_session.teacher @student = lesson_session.student @teacher = lesson_session.teacher @session_name = lesson_session.music_session.name @@ -976,6 +1044,7 @@ module JamRuby end def student_test_drive_no_bill(lesson_session) + @user = lesson_session.student @student = lesson_session.student @teacher = lesson_session.teacher @session_name = lesson_session.music_session.name @@ -1003,6 +1072,7 @@ module JamRuby # successfully completed, but no more test drives left def student_test_drive_lesson_done(lesson_session) + @user = lesson_session.student @student = lesson_session.student @teacher = lesson_session.teacher @session_name = lesson_session.music_session.name @@ -1028,6 +1098,7 @@ module JamRuby end def student_lesson_normal_no_bill(lesson_session) + @user = lesson_session.student @student = lesson_session.student @teacher = lesson_session.teacher @session_name = lesson_session.music_session.name @@ -1053,6 +1124,7 @@ module JamRuby end def teacher_lesson_normal_no_bill(lesson_session) + @user = lesson_session.teacher @student = lesson_session.student @teacher = lesson_session.teacher @session_name = lesson_session.music_session.name @@ -1077,6 +1149,7 @@ module JamRuby end def student_lesson_normal_done(lesson_session) + @user = lesson_session.student @student = lesson_session.student @teacher = lesson_session.teacher @session_name = lesson_session.music_session.name @@ -1102,6 +1175,7 @@ module JamRuby end def teacher_lesson_normal_done(lesson_session) + @user = lesson_session.teacher @student = lesson_session.student @teacher = lesson_session.teacher @session_name = lesson_session.music_session.name @@ -1126,6 +1200,7 @@ module JamRuby end def student_unable_charge(lesson_session) + @user = lesson_session.student @student = lesson_session.student @teacher = lesson_session.teacher @session_name = lesson_session.music_session.name @@ -1154,6 +1229,7 @@ module JamRuby end def teacher_unable_charge(lesson_session) + @user = lesson_session.teacher @student = lesson_session.student @teacher = lesson_session.teacher @session_name = lesson_session.music_session.name @@ -1179,6 +1255,7 @@ module JamRuby def student_unable_charge_monthly(lesson_package_purchase) lesson_booking = lesson_package_purchase.lesson_booking + @user = lesson_booking.student @student = lesson_booking.student @teacher = lesson_booking.teacher @lesson_package_purchase = lesson_package_purchase @@ -1211,6 +1288,7 @@ module JamRuby def teacher_unable_charge_monthly(lesson_package_purchase) lesson_booking = lesson_package_purchase.lesson_booking + @user = lesson_booking.teacher @student = lesson_booking.student @teacher = lesson_booking.teacher @lesson_package_purchase = lesson_package_purchase @@ -1244,6 +1322,7 @@ module JamRuby def student_lesson_monthly_charged(lesson_package_purchase) lesson_booking = lesson_package_purchase.lesson_booking + @user = lesson_booking.student @student = lesson_booking.student @teacher = lesson_booking.teacher @lesson_package_purchase = lesson_package_purchase @@ -1271,6 +1350,7 @@ module JamRuby def teacher_lesson_monthly_charged(lesson_package_purchase) lesson_booking = lesson_package_purchase.lesson_booking + @user = lesson_booking.teacher @student = lesson_booking.student @teacher = lesson_booking.teacher @lesson_package_purchase = lesson_package_purchase @@ -1312,6 +1392,7 @@ module JamRuby @name = @teacher.first_name || 'Anonymous' @student = @distribution.student email = @distribution.target.lesson_booking.school_over_teacher + @user = @teacher if @school if @distribution.is_test_drive? @@ -1359,6 +1440,7 @@ module JamRuby @student = @distribution.student @name = @payable_teacher.first_name || 'Anonymous' email = @distribution.target.lesson_booking.school_over_teacher + @user = @teacher @card_declined = teacher_payment.is_card_declined? @card_expired = teacher_payment.is_card_expired? @@ -1410,6 +1492,7 @@ module JamRuby @payable_teacher = @school.owner @name = @payable_teacher.first_name || 'Anonymous' @student = @distribution.student + @user = @teacher email = @payable_teacher.email if @distribution.is_test_drive? @@ -1445,6 +1528,7 @@ module JamRuby @session_date = lesson_session.slot.pretty_scheduled_start(true) @session_url = lesson_session.web_url @lesson_session = lesson_session + @user = @student email = @student.email subject = "Your JamClass lesson today with #{@teacher.first_name}" @@ -1470,6 +1554,7 @@ module JamRuby @session_date = lesson_session.slot.pretty_scheduled_start(true) @session_url = lesson_session.web_url @lesson_session = lesson_session + @user = @student email = @student.email subject = "Your lesson with #{@teacher.name} will not be billed" @@ -1497,6 +1582,7 @@ module JamRuby @session_description = @lesson_session.music_session.description @session_date = @lesson_session.slot.pretty_scheduled_start(true) email = @student.email + @user = @student @subject = "We're sorry your lesson request has been declined" unique_args = {:type => "student_lesson_booking_declined"} @@ -1521,6 +1607,7 @@ module JamRuby @session_description = @lesson_session.music_session.description @session_date = @lesson_session.slot.pretty_scheduled_start(true) email = @student.email + @user = @student @subject = "Your lesson has been canceled" unique_args = {:type => "student_lesson_booking_canceled"} @@ -1544,7 +1631,7 @@ module JamRuby @session_name = @lesson_session.music_session.name @session_description = @lesson_session.music_session.description @session_date = @lesson_session.slot.pretty_scheduled_start(true) - + @user = @teacher email = @lesson_booking.school_and_teacher @subject = "Your lesson has been canceled" unique_args = {:type => "teacher_lesson_booking_canceled"} @@ -1570,6 +1657,7 @@ module JamRuby @session_description = @lesson_session.music_session.description @session_date = @lesson_session.slot.pretty_scheduled_start(true) email = @student.email + @user = @student @subject = "Your lesson has been canceled" unique_args = {:type => "student_lesson_canceled"} @@ -1594,6 +1682,7 @@ module JamRuby @session_description = @lesson_session.music_session.description @session_date = @lesson_session.slot.pretty_scheduled_start(true) + @user = @teacher email = @lesson_booking.school_and_teacher @subject = "Your lesson has been canceled" unique_args = {:type => "teacher_lesson_canceled"} @@ -1657,7 +1746,7 @@ module JamRuby @session_name = @lesson_session.music_session.name @session_description = @lesson_session.music_session.description @session_date = @lesson_session.slot.pretty_scheduled_start(true) - + @user = @target email = @lesson_session.school_over_teacher @subject = "#{@sender.name} has sent you a message about a lesson" unique_args = {:type => "lesson_chat"} @@ -1679,7 +1768,7 @@ module JamRuby @teacher = lesson_session.teacher @session_url = lesson_session.web_url @lesson_session = lesson_session - + @user = @student email = @student.email @subject = "Instructor's time proposal is still awaiting your response" unique_args = {:type => "student_counter_reminder"} @@ -1705,6 +1794,7 @@ module JamRuby @session_date = lesson_session.slot.pretty_scheduled_start(true) @session_url = lesson_session.web_url @lesson_session = lesson_session + @user = @teacher email = lesson_session.school_over_teacher @subject = "Student #{@student.name}'s time proposal is still awaiting your response" unique_args = {:type => "teacher_counter_reminder"} @@ -1731,6 +1821,7 @@ module JamRuby @session_description = @lesson_session.music_session.description @session_date = @lesson_session.slot.pretty_scheduled_start(true) + @user = @teacher email = @teacher.email @subject = "Your lesson with #{@student.first_name} on JamKazam is starting soon" unique_args = {:type => "send_starting_notice_teacher"} @@ -1755,7 +1846,7 @@ module JamRuby @session_name = @lesson_session.music_session.name @session_description = @lesson_session.music_session.description @session_date = @lesson_session.slot.pretty_scheduled_start(true) - + @user = @student email = @student.email @subject = "Your lesson with #{@teacher.first_name} on JamKazam is starting soon" unique_args = {:type => "send_starting_notice_student"} @@ -1777,7 +1868,7 @@ module JamRuby @lesson_session = lesson_session @attachment = attachment - + @user = target email = target.email @subject = "An attachment has been added to your lesson by #{sender.name}" unique_args = {:type => "lesson_attachment"} diff --git a/ruby/lib/jam_ruby/app/views/layouts/user_mailer.html.erb b/ruby/lib/jam_ruby/app/views/layouts/user_mailer.html.erb index 4f184062f..71403a3c2 100644 --- a/ruby/lib/jam_ruby/app/views/layouts/user_mailer.html.erb +++ b/ruby/lib/jam_ruby/app/views/layouts/user_mailer.html.erb @@ -39,7 +39,7 @@ -

This email was sent to you because you have an account at JamKazam.  Click here to unsubscribe and update your profile settings. +

This email was sent to you because you have an account at JamKazam.  Click here to unsubscribe.

diff --git a/ruby/lib/jam_ruby/models/affiliate_partner.rb b/ruby/lib/jam_ruby/models/affiliate_partner.rb index a6dc437c7..46c144d9e 100644 --- a/ruby/lib/jam_ruby/models/affiliate_partner.rb +++ b/ruby/lib/jam_ruby/models/affiliate_partner.rb @@ -79,7 +79,7 @@ class JamRuby::AffiliatePartner < ActiveRecord::Base oo.partner_name = params[:partner_name].try(:strip) oo.partner_user = user if user # user is not required oo.entity_type = params[:entity_type] || ENTITY_TYPES.first - signed_legalese + oo.signed_at = Time.now oo.save oo end diff --git a/ruby/lib/jam_ruby/models/anonymous_user.rb b/ruby/lib/jam_ruby/models/anonymous_user.rb index 55c788e90..e32a230ea 100644 --- a/ruby/lib/jam_ruby/models/anonymous_user.rb +++ b/ruby/lib/jam_ruby/models/anonymous_user.rb @@ -15,6 +15,9 @@ module JamRuby ShoppingCart.where(anonymous_user_id: @id).order('created_at DESC') end + def mixed_cart + Sale.is_mixed(shopping_carts) + end def destroy_all_shopping_carts ShoppingCart.destroy_all(anonymous_user_id: @id) @@ -57,5 +60,6 @@ module JamRuby def reload end + end end diff --git a/ruby/lib/jam_ruby/models/charge.rb b/ruby/lib/jam_ruby/models/charge.rb index 246e77220..8ae916979 100644 --- a/ruby/lib/jam_ruby/models/charge.rb +++ b/ruby/lib/jam_ruby/models/charge.rb @@ -1,5 +1,5 @@ module JamRuby - class Charge < ActiveRecord::Base + class Charge < ActiveRecord::Base attr_accessor :stripe_charge @@ -68,7 +68,7 @@ module JamRuby subject = "Unable to charge user #{charged_user.email} for lesson #{self.id} (stripe)" body = "user=#{charged_user.email}\n\nbilling_error_reason=#{billing_error_reason}\n\nbilling_error_detail = #{billing_error_detail}" - AdminMailer.alerts({subject: subject, body: body}).deliver + AdminMailer.alerts({subject: subject, body: body}).deliver_now do_send_unable_charge return false diff --git a/ruby/lib/jam_ruby/models/chat_message.rb b/ruby/lib/jam_ruby/models/chat_message.rb index aad2a4b0b..bd38c1c1f 100644 --- a/ruby/lib/jam_ruby/models/chat_message.rb +++ b/ruby/lib/jam_ruby/models/chat_message.rb @@ -58,7 +58,7 @@ module JamRuby # a nil purpose means 'normal chat', which is the only time we should send an email if !target.online? && purpose.nil? && message.present? - UserMailer.lesson_chat(chat_msg).deliver! + UserMailer.lesson_chat(chat_msg).deliver_now end end diff --git a/ruby/lib/jam_ruby/models/download_tracker.rb b/ruby/lib/jam_ruby/models/download_tracker.rb index ad0b955cb..06e473a5c 100644 --- a/ruby/lib/jam_ruby/models/download_tracker.rb +++ b/ruby/lib/jam_ruby/models/download_tracker.rb @@ -84,7 +84,7 @@ module JamRuby end def self.alert_user_sharer(user) - violation = check_user_sharer(APP_CONFIG.max_user_ip_address, user.id).first + violation = check_user_sharer(APP_CONFIG.max_user_ip_address, user.id)[0] if violation body = "User has downloaded from too many IP addresses #{user.id}\n" @@ -106,7 +106,7 @@ module JamRuby end if !IpWhitelist.listed(remote_ip) - violation = check_freebie_snarfer(APP_CONFIG.max_multiple_users_same_ip, remote_ip).first + violation = check_freebie_snarfer(APP_CONFIG.max_multiple_users_same_ip, remote_ip)[0] end diff --git a/ruby/lib/jam_ruby/models/invitation.rb b/ruby/lib/jam_ruby/models/invitation.rb index 221ba5b21..07dad0e2c 100644 --- a/ruby/lib/jam_ruby/models/invitation.rb +++ b/ruby/lib/jam_ruby/models/invitation.rb @@ -15,31 +15,30 @@ module JamRuby validates :sender, :presence => true validates :receiver, :presence => true validates :music_session, :presence => true - + validate :require_sender_in_music_session, :require_are_friends_or_requested_to_join_or_teacher private def require_sender_in_music_session if music_session && !music_session.part_of_session?(sender) - errors.add(:music_session, MEMBERSHIP_REQUIRED_OF_MUSIC_SESSION) + errors.add(:music_session, MEMBERSHIP_REQUIRED_OF_MUSIC_SESSION) end end def require_are_friends_or_requested_to_join_or_teacher if !join_request.nil? && (join_request.user != receiver || join_request.music_session != music_session) - errors.add(:join_request, JOIN_REQUEST_IS_NOT_FOR_RECEIVER_AND_MUSIC_SESSION ) + errors.add(:join_request, JOIN_REQUEST_IS_NOT_FOR_RECEIVER_AND_MUSIC_SESSION) + elsif music_session.is_lesson? + if (receiver != music_session.lesson_session.teacher) + errors.add(:receiver, INVITATION_NOT_TEACHER_VALIDATION_ERROR) + end elsif join_request.nil? - # we only check for friendship requirement if this was not in response to a join_request - if !receiver.friends.exists?(sender.id) && (music_session.is_lesson? && receiver != music_session.lesson_session.teacher) - if !receiver.friends.exists?(sender.id) - errors.add(:receiver, FRIENDSHIP_REQUIRED_VALIDATION_ERROR) - elsif (music_session.is_lesson? && receiver != music_session.lesson_session.teacher) - errors.add(:receiver, INVITATION_NOT_TEACHER_VALIDATION_ERROR) - end + # we only check for friendship requirement if this was not in response to a join_request and not a lesson + if !receiver.friends.exists?(sender.id) + errors.add(:receiver, FRIENDSHIP_REQUIRED_VALIDATION_ERROR) end end - end end end diff --git a/ruby/lib/jam_ruby/models/jam_track.rb b/ruby/lib/jam_ruby/models/jam_track.rb index ba256e921..dd3d3fdcc 100644 --- a/ruby/lib/jam_ruby/models/jam_track.rb +++ b/ruby/lib/jam_ruby/models/jam_track.rb @@ -19,7 +19,7 @@ module JamRuby :reproduction_royalty, :public_performance_royalty, :reproduction_royalty_amount, :licensor_royalty_amount, :pro_royalty_amount, :plan_code, :initial_play_silence, :jam_track_tracks_attributes, :jam_track_tap_ins_attributes, :genre_ids, :version, :jmep_json, :jmep_text, :pro_ascap, :pro_bmi, :pro_sesac, :duration, - :server_fixation_date, :hfa_license_status, :hfa_license_desired, :alternative_license_status, :hfa_license_number, :hfa_song_code, :album_title, :year, as: :admin + :server_fixation_date, :hfa_license_status, :hfa_license_desired, :alternative_license_status, :hfa_license_number, :hfa_song_code, :album_title, :year, :allow_free, as: :admin validates :name, presence: true, length: {maximum: 200} validates :plan_code, presence: true, uniqueness: true, length: {maximum: 50 } @@ -64,9 +64,9 @@ module JamRuby has_many :owners, :through => :jam_track_rights, :class_name => "JamRuby::User", :source => :user - has_many :playing_sessions, :class_name => "JamRuby::ActiveMusicSession" + has_many :playing_sessions, :class_name => "JamRuby::ActiveMusicSession", :dependent => :destroy - has_many :recordings, :class_name => "JamRuby::Recording" + has_many :recordings, :class_name => "JamRuby::Recording", :dependent => :destroy # VRFS-2916 jam_tracks.id is varchar: REMOVE # has_many :plays, :class_name => "JamRuby::PlayablePlay", :foreign_key => :jam_track_id, :dependent => :destroy diff --git a/ruby/lib/jam_ruby/models/lesson_booking_slot.rb b/ruby/lib/jam_ruby/models/lesson_booking_slot.rb index d9d38ca47..0b190609f 100644 --- a/ruby/lib/jam_ruby/models/lesson_booking_slot.rb +++ b/ruby/lib/jam_ruby/models/lesson_booking_slot.rb @@ -9,7 +9,7 @@ module JamRuby belongs_to :lesson_booking, class_name: "JamRuby::LessonBooking" belongs_to :lesson_session, class_name: "JamRuby::LessonSession" - belongs_to :proposer, class_name: "JamRuby::User" + belongs_to :proposer, class_name: "JamRuby::User", inverse_of: :proposed_slots, foreign_key: :proposer_id has_one :defaulted_booking, class_name: "JamRuby::LessonBooking", foreign_key: :default_slot_id, inverse_of: :default_slot has_one :countered_booking, class_name: "JamRuby::LessonBooking", foreign_key: :counter_slot_id, inverse_of: :counter_slot has_one :countered_lesson, class_name: "JamRuby::LessonSession", foreign_key: :counter_slot_id, inverse_of: :counter_slot diff --git a/ruby/lib/jam_ruby/models/lesson_package_purchase.rb b/ruby/lib/jam_ruby/models/lesson_package_purchase.rb index a38976b93..2f88af5c5 100644 --- a/ruby/lib/jam_ruby/models/lesson_package_purchase.rb +++ b/ruby/lib/jam_ruby/models/lesson_package_purchase.rb @@ -13,9 +13,10 @@ module JamRuby belongs_to :teacher, class_name: "JamRuby::User" belongs_to :lesson_booking, class_name: "JamRuby::LessonBooking" belongs_to :lesson_payment_charge, class_name: "JamRuby::LessonPaymentCharge", foreign_key: :charge_id + has_one :lesson_session, class_name: "JamRuby::LessonSession", dependent: :destroy has_one :teacher_distribution, class_name: "JamRuby::TeacherDistribution" - has_one :sale_line_item, class_name: "JamRuby::SaleLineItem" + has_one :sale_line_item, class_name: "JamRuby::SaleLineItem", dependent: :destroy validates :user, presence: true validates :lesson_package_type, presence: true diff --git a/ruby/lib/jam_ruby/models/lesson_session.rb b/ruby/lib/jam_ruby/models/lesson_session.rb index a977327d0..c9de915a8 100644 --- a/ruby/lib/jam_ruby/models/lesson_session.rb +++ b/ruby/lib/jam_ruby/models/lesson_session.rb @@ -41,7 +41,7 @@ module JamRuby belongs_to :slot, class_name: "JamRuby::LessonBookingSlot", foreign_key: :slot_id, :dependent => :destroy belongs_to :lesson_payment_charge, class_name: "JamRuby::LessonPaymentCharge", foreign_key: :charge_id belongs_to :counter_slot, class_name: "JamRuby::LessonBookingSlot", foreign_key: :counter_slot_id, inverse_of: :countered_lesson, :dependent => :destroy - has_one :teacher_distribution, class_name: "JamRuby::TeacherDistribution" + has_one :teacher_distribution, class_name: "JamRuby::TeacherDistribution", dependent: :destroy has_many :lesson_booking_slots, class_name: "JamRuby::LessonBookingSlot" has_many :notifications, :class_name => "JamRuby::Notification", :foreign_key => "lesson_session_id" has_many :chat_messages, :class_name => "JamRuby::ChatMessage", :foreign_key => "lesson_session_id" @@ -134,9 +134,9 @@ module JamRuby .where("? > (COALESCE(lesson_bookings.countered_at, lesson_bookings.sent_notices_at)) + (INTERVAL '24 hours')", Time.now).each do |music_session| lesson_session = music_session.lesson_session if lesson_session.student_last_proposed? - UserMailer.teacher_counter_reminder(lesson_session).deliver! + UserMailer.teacher_counter_reminder(lesson_session).deliver_now else - UserMailer.student_counter_reminder(lesson_session).deliver! + UserMailer.student_counter_reminder(lesson_session).deliver_now end lesson_session.lesson_booking.sent_counter_reminder = true lesson_session.lesson_booking.save(validate: false) @@ -366,7 +366,6 @@ module JamRuby end def recurring_completed - puts "RECURRING COMPLETED #{success}" if success if lesson_booking.is_monthly_payment? @@ -424,7 +423,6 @@ module JamRuby else if !sent_notices if !school_on_school? - puts "STUDENT NO BILL SENT #{success}" UserMailer.student_lesson_normal_no_bill(self).deliver_now UserMailer.teacher_lesson_normal_no_bill(self).deliver_now end @@ -820,11 +818,9 @@ module JamRuby self.counter_slot = slot #end if self.save - puts "SAVING OK" #if update_all && !lesson_booking.counter(self, proposer, slot) if !lesson_booking.counter(self, proposer, slot) response = lesson_booking - puts "ROLLBACK" raise ActiveRecord::Rollback end else diff --git a/ruby/lib/jam_ruby/models/quick_mix.rb b/ruby/lib/jam_ruby/models/quick_mix.rb index f41939807..205b99be2 100644 --- a/ruby/lib/jam_ruby/models/quick_mix.rb +++ b/ruby/lib/jam_ruby/models/quick_mix.rb @@ -275,7 +275,7 @@ module JamRuby def delete_s3_files s3_manager.delete(filename(type=default_type)) if self[:ogg_url] && s3_manager.exists?(filename(type=default_type)) - s3_manager.delete(filename(type='mp3')) if self[:mp3_url] && s3_manager.exists?(filename(type=default_type)) + s3_manager.delete(filename(type='mp3')) if self[:mp3_url] && s3_manager.exists?(filename(type='mp3')) end def self.construct_filename(created_at, recording_id, id, type='ogg') diff --git a/ruby/lib/jam_ruby/models/recording.rb b/ruby/lib/jam_ruby/models/recording.rb index 7447341c3..9c87bf6f8 100644 --- a/ruby/lib/jam_ruby/models/recording.rb +++ b/ruby/lib/jam_ruby/models/recording.rb @@ -260,7 +260,7 @@ module JamRuby recording.music_session = music_session recording.owner = owner recording.band = music_session.band - recording.video = record_video + recording.video = record_video == true || record_video == 'true' if recording.save #GoogleAnalyticsEvent.report_band_recording(recording.band) diff --git a/ruby/lib/jam_ruby/models/sale.rb b/ruby/lib/jam_ruby/models/sale.rb index 03313dea9..37dc846af 100644 --- a/ruby/lib/jam_ruby/models/sale.rb +++ b/ruby/lib/jam_ruby/models/sale.rb @@ -150,7 +150,7 @@ module JamRuby end # if we make it this far, all is well! - jam_track_right = JamRuby::JamTrackRight.find_or_create_by_user_id_and_jam_track_id(current_user.id, jam_track.id) do |jam_track_right| + jam_track_right = JamRuby::JamTrackRight.find_or_create_by({user_id: current_user.id, jam_track_id: jam_track.id}) do |jam_track_right| jam_track_right.redeemed = using_free_credit jam_track_right.version = jam_track.version end @@ -168,10 +168,10 @@ module JamRuby sales = [] - if Sale.is_mixed(shopping_carts) - # the controller checks this too; this is just an extra-level of sanity checking - return sales - end + #if Sale.is_mixed(shopping_carts) + # # the controller checks this too; this is just an extra-level of sanity checking + # return sales + #end jam_track_sale = order_jam_tracks(current_user, shopping_carts) sales << jam_track_sale if jam_track_sale @@ -236,7 +236,7 @@ module JamRuby price_info = charge_stripe_for_lesson(charge, current_user, lesson_booking, lesson_package_type, sale_line_item, lesson_session, lesson_package_purchase, force) - post_stripe_test_failure + post_sale_test_failure if price_info[:purchase] && price_info[:purchase].errors.any? purchase = price_info[:purchase] diff --git a/ruby/lib/jam_ruby/models/shopping_cart.rb b/ruby/lib/jam_ruby/models/shopping_cart.rb index 999bb0f98..d9bc80a87 100644 --- a/ruby/lib/jam_ruby/models/shopping_cart.rb +++ b/ruby/lib/jam_ruby/models/shopping_cart.rb @@ -22,13 +22,13 @@ module JamRuby validates :cart_type, presence: true validates :cart_class_name, presence: true validates :marked_for_redeem, numericality: {only_integer: true} - validate :not_mixed + #validate :not_mixed default_scope { order('created_at DESC') } def product_info(instance = nil) product = self.cart_product - data = {type: cart_type, name: product.name, price: product.price, product_id: cart_id, plan_code: product.plan_code, real_price: real_price(product), total_price: total_price(product), quantity: quantity, marked_for_redeem: marked_for_redeem, free: free?, sales_region: product.sales_region, sale_display:product.sale_display} unless product.nil? + data = {type: cart_type, name: product.name, price: product.price, product_id: cart_id, plan_code: product.plan_code, real_price: real_price(product), total_price: total_price(product), quantity: quantity, marked_for_redeem: marked_for_redeem, free: free?, sales_region: product.sales_region, sale_display:product.sale_display, allow_free: allow_free(product)} unless product.nil? if data && instance data.merge!(instance.product_info) end @@ -45,6 +45,14 @@ module JamRuby (quantity - marked_for_redeem) * product.price end + def allow_free(product) + if(product.is_a?(JamTrack)) + product.allow_free + else + false + end + end + def not_mixed return if @skip_mix_check @@ -131,22 +139,7 @@ module JamRuby if free? # create the credit, then the pseudo charge - [ - { - accounting_code: PURCHASE_FREE_CREDIT, - currency: 'USD', - unit_amount_in_cents: -(info[:total_price] * 100).to_i, - description: info[:sale_display] + " (Credit)", - tax_exempt: true - }, - { - accounting_code: PURCHASE_FREE, - currency: 'USD', - unit_amount_in_cents: (info[:total_price] * 100).to_i, - description: info[:sale_display], - tax_exempt: true - } - ] + [] else [ @@ -193,6 +186,7 @@ module JamRuby if any_user.has_redeemable_jamtrack || any_user.gifted_jamtracks > 0 free_in_cart = 0 + any_user.shopping_carts.each do |shopping_cart| # but if we find any shopping cart item already marked for redeem, then back out of mark_redeem=true if shopping_cart.cart_type == JamTrack::PRODUCT_TYPE @@ -211,15 +205,17 @@ module JamRuby cart = nil ShoppingCart.transaction do - if clear + # if clear + if any_user.shopping_carts.length == 1 && any_user.shopping_carts[0].product_info[:allow_free] && (any_user.has_redeemable_jamtrack && any_user.gifted_jamtracks == 0) && jam_track.allow_free && any_user.free_jamtracks > 0 # clear # if you are an anonymous user, we make sure there is nothing else in your shopping cart ... keep it clean for the 'new user rummaging around for a freebie scenario' any_user.destroy_jam_track_shopping_carts any_user.reload end - mark_redeem = ShoppingCart.user_has_redeemable_jam_track?(any_user) + mark_redeem = jam_track.allow_free ? ShoppingCart.user_has_redeemable_jam_track?(any_user) : false cart = ShoppingCart.create(any_user, jam_track, 1, mark_redeem) end + any_user.reload cart end diff --git a/ruby/lib/jam_ruby/models/teacher.rb b/ruby/lib/jam_ruby/models/teacher.rb index c660dcd38..ec1cc7d38 100644 --- a/ruby/lib/jam_ruby/models/teacher.rb +++ b/ruby/lib/jam_ruby/models/teacher.rb @@ -13,19 +13,19 @@ module JamRuby has_many :languages, :class_name => "JamRuby::Language", :through => :teachers_languages # , :order => "description" has_many :teachers_languages, class_name: "JamRuby::TeacherLanguage" has_many :teacher_experiences, :class_name => "JamRuby::TeacherExperience" - has_many :experiences_teaching, -> {where(experience_type: 'teaching')}, :class_name => "JamRuby::TeacherExperience" - has_many :experiences_education, -> {where(experience_type: 'education')}, :class_name => "JamRuby::TeacherExperience" - has_many :experiences_award, -> {where(experience_type: 'award')}, :class_name => "JamRuby::TeacherExperience" + has_many :experiences_teaching, -> { where(experience_type: 'teaching') }, :class_name => "JamRuby::TeacherExperience" + has_many :experiences_education, -> { where(experience_type: 'education') }, :class_name => "JamRuby::TeacherExperience" + has_many :experiences_award, -> { where(experience_type: 'award') }, :class_name => "JamRuby::TeacherExperience" has_many :reviews, :class_name => "JamRuby::Review", as: :target has_many :lesson_sessions, :class_name => "JamRuby::LessonSession" has_many :lesson_package_purchases, :class_name => "JamRuby::LessonPackagePurchase" - has_one :review_summary, :class_name => "JamRuby::ReviewSummary", as: :target - has_one :user, :class_name => 'JamRuby::User', foreign_key: :teacher_id + has_one :review_summary, :class_name => "JamRuby::ReviewSummary", as: :target + has_one :user, :class_name => 'JamRuby::User', foreign_key: :teacher_id belongs_to :school, :class_name => "JamRuby::School", inverse_of: :teachers validates :user, :presence => true validates :biography, length: {minimum: 5, maximum: 4096}, :if => :validate_introduction - validates :introductory_video, :format => {:with => /A(?:https?:\/\/)?(?:www\.)?youtu(?:\.be|be\.com)\/(?:watch\?v=)?([\w-]{10,})z/, message: "is not a valid youtube URL"}, :allow_blank => true, :if => :validate_introduction + validates :introductory_video, :format => {:with => /(?:https?:\/\/)?(?:www\.)?youtu(?:\.be|be\.com)\/(?:watch\?v=)?([\w-]{10,})/, message: "is not a valid youtube URL"}, :allow_blank => true, :if => :validate_introduction validates :years_teaching, :presence => true, :if => :validate_introduction validates :years_playing, :presence => true, :if => :validate_introduction validates :teaches_test_drive, inclusion: {in: [true, false]}, :if => :validate_pricing @@ -159,13 +159,21 @@ module JamRuby end def self.save_teacher(user, params) - teacher = build_teacher(user, params) - if teacher.save - # flag the user as a teacher - teacher.user.is_a_teacher = true - teacher.user.save(validate: false) + teacher = nil + Teacher.transaction do + teacher = build_teacher(user, params) + if teacher.save + # flag the user as a teacher + teacher.user.is_a_teacher = true + teacher.user.save(validate: false) + end + + if teacher.errors.any? + raise ActiveRecord::Rollback + end end teacher + end def self.build_teacher(user, params) @@ -212,60 +220,79 @@ module JamRuby teacher.test_drives_per_week = 10 if !params.key?(:test_drives_per_week) # default to 10 in absence of others teacher.school_id = params[:school_id] if params.key?(:school_id) - - # Many-to-many relations: - if params.key?(:genres) - genres = params[:genres] - genres = [] if genres.nil? - teacher.genres = genres.collect { |genre_id| Genre.find(genre_id) } - end - if params.key?(:instruments) - instruments = params[:instruments] - instruments = [] if instruments.nil? - teacher.instruments = instruments.collect { |instrument_id| Instrument.find(instrument_id) } - end - if params.key?(:subjects) - subjects = params[:subjects] - subjects = [] if subjects.nil? - teacher.subjects = subjects.collect { |subject_id| Subject.find(subject_id) } - end - if params.key?(:languages) - languages = params[:languages] - languages = [] if languages.nil? - teacher.languages = languages.collect { |language_id| Language.find(language_id) } - end - - # Experience: - [:teaching, :education, :award].each do |experience_type| - key = "experiences_#{experience_type}".to_sym - if params.key?(key) - list = params[key] - list = [] if list.nil? - experiences = list.collect do |exp| - TeacherExperience.new( - name: exp[:name], - experience_type: experience_type, - organization: exp[:organization], - start_year: exp[:start_year], - end_year: exp[:end_year] - ) - end # collect - - # we blindly destroy/recreate on every resubmit - previous = teacher.send("#{key.to_s}") - previous.destroy_all - - # Dynamically call the appropriate method (just setting the - # value doesn't result in the behavior we need) - teacher.send("#{key.to_s}=", experiences) - end # if - end # do - # How to validate: teacher.validate_introduction = !!params[:validate_introduction] - teacher.validate_basics = !!params[:validate_basics] teacher.validate_pricing = !!params[:validate_pricing] + + initial_save = teacher.save + + teacher.validate_basics = !!params[:validate_basics] + + if initial_save + # Many-to-many relations: + if params.key?(:genres) + genres = params[:genres] + genres = [] if genres.nil? + teacher.genres.clear + genres.each do |genre_id| + teacher.genres << Genre.find(genre_id) + end + end + if params.key?(:instruments) + instruments = params[:instruments] + instruments = [] if instruments.nil? + teacher.instruments.clear + instruments.each do |instrument_id| + teacher.instruments << Instrument.find(instrument_id) + end + end + if params.key?(:subjects) + subjects = params[:subjects] + subjects = [] if subjects.nil? + teacher.subjects.clear + subjects.each do |subject_id| + teacher.subjects << Subject.find(subject_id) + end + end + if params.key?(:languages) + languages = params[:languages] + languages = [] if languages.nil? + teacher.languages.clear + languages.each do |language_id| + teacher.languages << Language.find(language_id) + end + end + + + # Experience: + [:teaching, :education, :award].each do |experience_type| + key = "experiences_#{experience_type}".to_sym + if params.key?(key) + list = params[key] + list = [] if list.nil? + experiences = list.collect do |exp| + TeacherExperience.new( + name: exp[:name], + experience_type: experience_type, + organization: exp[:organization], + start_year: exp[:start_year], + end_year: exp[:end_year] + ) + end # collect + + # we blindly destroy/recreate on every resubmit + previous = teacher.send("#{key.to_s}") + previous.destroy_all + + # Dynamically call the appropriate method (just setting the + # value doesn't result in the behavior we need) + teacher.send("#{key.to_s}=", experiences) + end # if + end # do + end + + return teacher end @@ -325,6 +352,7 @@ module JamRuby self.top_rated = false self.save! end + def has_experiences_teaching? experiences_teaching.count > 0 end diff --git a/ruby/lib/jam_ruby/models/user.rb b/ruby/lib/jam_ruby/models/user.rb index 0f7899d94..7d67b938e 100644 --- a/ruby/lib/jam_ruby/models/user.rb +++ b/ruby/lib/jam_ruby/models/user.rb @@ -207,6 +207,8 @@ module JamRuby has_many :test_drive_package_choices, :class_name =>"JamRuby::TestDrivePackageChoice" has_many :jamblasters_users, class_name: "JamRuby::JamblasterUser" has_many :jamblasters, class_name: 'JamRuby::Jamblaster', through: :jamblasters_users + has_many :proposed_slots, class_name: 'JamRuby::LessonBookingSlot', inverse_of: :proposer, dependent: :destroy, foreign_key: :proposer_id + has_many :charges, class_name: 'JamRuby::Charge', dependent: :destroy before_save :default_anonymous_names before_save :create_remember_token, :if => :should_validate_password? @@ -1855,6 +1857,10 @@ module JamRuby ShoppingCart.where("user_id=?", self).destroy_all end + def mixed_cart + Sale.is_mixed(shopping_carts) + end + def destroy_jam_track_shopping_carts ShoppingCart.destroy_all(anonymous_user_id: @id, cart_type: JamTrack::PRODUCT_TYPE) end @@ -2222,7 +2228,7 @@ module JamRuby end def recent_test_drive_teachers - User.select('distinct on (users.id) users.*').joins(taught_lessons: :music_session).where('lesson_sessions.lesson_type = ?', LessonSession::LESSON_TYPE_TEST_DRIVE).where('music_sessions.user_id = ?', id).where('lesson_sessions.created_at > ?', Rails.application.config.test_drive_wait_period_year.years.ago) + User.select('distinct on (users.id) users.*').joins(taught_lessons: :music_session).where('lesson_sessions.lesson_type = ?', LessonSession::LESSON_TYPE_TEST_DRIVE).where('music_sessions.user_id = ?', id).where('lesson_sessions.created_at > ?', APP_CONFIG.test_drive_wait_period_year.years.ago) end def mark_session_ready diff --git a/ruby/spec/jam_ruby/flows/monthly_recurring_lesson_spec.rb b/ruby/spec/jam_ruby/flows/monthly_recurring_lesson_spec.rb index 2f18f774e..1f8ca34a1 100644 --- a/ruby/spec/jam_ruby/flows/monthly_recurring_lesson_spec.rb +++ b/ruby/spec/jam_ruby/flows/monthly_recurring_lesson_spec.rb @@ -169,23 +169,26 @@ describe "Monthly Recurring Lesson Flow" do # let user pay for it LessonBooking.hourly_check + booked_price = booking.booked_price + prorated = booked_price / 2 + prorated_cents = (booked_price * 100).to_i user.reload user.lesson_purchases.length.should eql 1 lesson_purchase = user.lesson_purchases[0] puts "LESSON_PURCHASE PRICE #{lesson_purchase.price}" - lesson_purchase.price.should eql 30.00 + lesson_purchase.price.should eql prorated lesson_purchase.lesson_package_type.is_normal?.should eql true - lesson_purchase.price_in_cents.should eql 3000 + lesson_purchase.price_in_cents.should eql prorated_cents teacher_distribution = lesson_purchase.teacher_distribution - teacher_distribution.amount_in_cents.should eql 3000 + teacher_distribution.amount_in_cents.should eql prorated_cents teacher_distribution.ready.should be_true teacher_distribution.distributed.should be_false user.sales.length.should eql 1 sale = user.sales.first sale.stripe_charge_id.should_not be_nil - sale.recurly_tax_in_cents.should eql (100 * booking.booked_price.to_f * 0.0825).round.to_i - sale.recurly_total_in_cents.should eql ((100 * booking.booked_price.to_f * 0.0825).round + 100 * booking.booked_price.to_f).to_i - sale.recurly_subtotal_in_cents.should eql (100 * booking.booked_price).to_i + sale.recurly_tax_in_cents.should eql (100 * prorated * 0.0825).round.to_i + sale.recurly_total_in_cents.should eql ((prorated * 100 * 0.0825).round + 100 * prorated).to_i + sale.recurly_subtotal_in_cents.should eql prorated_cents sale.recurly_currency.should eql 'USD' sale.stripe_charge_id.should_not be_nil line_item = sale.sale_line_items[0] diff --git a/ruby/spec/jam_ruby/jam_track_importer_spec.rb b/ruby/spec/jam_ruby/jam_track_importer_spec.rb index fbdc3d9cc..0ac7ff9ea 100644 --- a/ruby/spec/jam_ruby/jam_track_importer_spec.rb +++ b/ruby/spec/jam_ruby/jam_track_importer_spec.rb @@ -137,7 +137,7 @@ describe JamTrackImporter do end describe "synchronize" do - let(:jam_track) { JamTrack.new } + let(:jam_track) { jt = JamTrack.new; jt.id = '1'; jt } let(:importer) { JamTrackImporter.new() } let(:minimum_meta) { nil } let(:metalocation) { 'audio/Artist 1/Song 1/meta.yml' } diff --git a/ruby/spec/jam_ruby/models/invitation_spec.rb b/ruby/spec/jam_ruby/models/invitation_spec.rb index baf02eca7..b22f31f0c 100644 --- a/ruby/spec/jam_ruby/models/invitation_spec.rb +++ b/ruby/spec/jam_ruby/models/invitation_spec.rb @@ -14,6 +14,7 @@ describe ActiveMusicSession do invitation = Invitation.new(:sender => user1, :receiver => user2, :music_session => music_session.music_session) + invitation.save invitation.save.should be_false invitation.errors.size.should == 1 invitation.errors.get(:receiver).should == [Invitation::FRIENDSHIP_REQUIRED_VALIDATION_ERROR] diff --git a/ruby/spec/jam_ruby/models/lesson_payment_charge_spec.rb b/ruby/spec/jam_ruby/models/lesson_payment_charge_spec.rb index 1803ce8a8..c4cbe17a9 100644 --- a/ruby/spec/jam_ruby/models/lesson_payment_charge_spec.rb +++ b/ruby/spec/jam_ruby/models/lesson_payment_charge_spec.rb @@ -25,7 +25,7 @@ describe TeacherPaymentCharge, no_transaction: true do it "fails after stripe communication (in transaction)" do LessonPaymentCharge.transaction do - Sale.stub(:post_stripe_test_failure).and_raise('bad logic after stripe call') + Sale.stub(:post_sale_test_failure).and_raise('bad logic after stripe call') lesson.analyse @@ -42,7 +42,7 @@ describe TeacherPaymentCharge, no_transaction: true do it "fails after stripe communication (no transaction)" do - Sale.stub(:post_stripe_test_failure).and_raise('bad logic after stripe call') + Sale.stub(:post_sale_test_failure).and_raise('bad logic after stripe call') lesson.analyse diff --git a/ruby/spec/jam_ruby/models/lesson_session_spec.rb b/ruby/spec/jam_ruby/models/lesson_session_spec.rb index 7ad298f69..2f658f76f 100644 --- a/ruby/spec/jam_ruby/models/lesson_session_spec.rb +++ b/ruby/spec/jam_ruby/models/lesson_session_spec.rb @@ -143,7 +143,7 @@ describe LessonSession do lesson_session1 = normal_lesson(user, teacher, {}) mailer = mock - mailer.should_receive(:deliver!) + mailer.should_receive(:deliver_now) UserMailer.should_receive(:teacher_counter_reminder).and_return(mailer) LessonSession.remind_counters @@ -161,7 +161,7 @@ describe LessonSession do lesson_session1 = normal_lesson(user, teacher, {counter: true, counterer: user}) mailer = mock - mailer.should_receive(:deliver!) + mailer.should_receive(:deliver_now) UserMailer.should_receive(:teacher_counter_reminder).and_return(mailer) LessonSession.remind_counters @@ -179,7 +179,7 @@ describe LessonSession do lesson_session1 = normal_lesson(user, teacher, {counter: true, counterer: teacher}) mailer = mock - mailer.should_receive(:deliver!) + mailer.should_receive(:deliver_now) UserMailer.should_receive(:student_counter_reminder).and_return(mailer) LessonSession.remind_counters @@ -215,11 +215,10 @@ describe LessonSession do Timecop.travel(Date.today + 100) lesson.accept({ message: "Teacher time!", - acceptor: teacher, + accepter: teacher, slot: slotRecurring1.id }) - lesson.errors.any?.should be_true - lesson.errors[:slot].should eql ["is in the past"] + lesson.errors.any?.should be_false end it "cancel in the past is OK" do diff --git a/ruby/spec/jam_ruby/models/sale_spec.rb b/ruby/spec/jam_ruby/models/sale_spec.rb index 7378cbb2a..1a68e9910 100644 --- a/ruby/spec/jam_ruby/models/sale_spec.rb +++ b/ruby/spec/jam_ruby/models/sale_spec.rb @@ -229,6 +229,50 @@ describe Sale do user.has_redeemable_jamtrack.should be_false end + it "for two jamtracks 1 freebie, 1 purchased" do + user.gifted_jamtracks = 2 + user.save! + + jamtrack.allow_free = false + jamtrack.price =2.99 + jamtrack.save! + + shopping_cart1 = ShoppingCart.create user, jamtrack, 1, false + shopping_cart2 = ShoppingCart.create user, jamtrack2, 1, true + + client.find_or_create_account(user, billing_info) + + sales = Sale.place_order(user, [shopping_cart1, shopping_cart2]) + + user.reload + user.sales.length.should eq(1) + sale = sales[0] + sale.reload + + sale.recurly_invoice_id.should_not be_nil + + sale.recurly_subtotal_in_cents.should eq(jamtrack.price * 100) + sale.recurly_tax_in_cents.should eq(0) + sale.recurly_total_in_cents.should eq(jamtrack.price * 100) + sale.recurly_currency.should eq('USD') + sale.order_total.should eq(jamtrack.price) + sale.sale_line_items.length.should == 2 + + sale.sale_line_items[0].free.should eql 0 + assert_free_line_item(sale.sale_line_items[1], jamtrack2) + + # verify jam_track_rights data + right1 = JamTrackRight.where(user_id: user.id).where(jam_track_id: jamtrack.id).first + right2 = JamTrackRight.where(user_id: user.id).where(jam_track_id: jamtrack2.id).first + user.jam_track_rights.should have(2).items + + right1.redeemed.should be_false + right2.redeemed.should be_true + user.has_redeemable_jamtrack.should be_false + user.gifted_jamtracks.should eq(2) + + end + it "for two jam tracks (1 freebie, 1 gifted), then 1 gifted/1 pay" do user.gifted_jamtracks = 2 user.save! diff --git a/ruby/spec/jam_ruby/models/shopping_cart_spec.rb b/ruby/spec/jam_ruby/models/shopping_cart_spec.rb index 8d3b724b1..15cfdfd2d 100644 --- a/ruby/spec/jam_ruby/models/shopping_cart_spec.rb +++ b/ruby/spec/jam_ruby/models/shopping_cart_spec.rb @@ -31,7 +31,7 @@ describe ShoppingCart do user.shopping_carts[0].quantity.should == 1 end - it "maintains only one free JamTrack in ShoppingCart" do + it "allows mix of free and not free stuff" do cart1 = ShoppingCart.add_jam_track_to_cart(user, jam_track, clear: true) cart1.should_not be_nil cart1.errors.any?.should be_false @@ -41,13 +41,13 @@ describe ShoppingCart do user.reload user.shopping_carts.length.should eq(1) cart3 = ShoppingCart.add_item_to_cart(user, gift_card) - cart3.errors.any?.should be_true + cart3.errors.any?.should be_false user.reload - user.shopping_carts.length.should eq(1) + user.shopping_carts.length.should eq(2) cart4 = ShoppingCart.add_jam_track_to_cart(user, jam_track2, clear: true) cart4.errors.any?.should be_false user.reload - user.shopping_carts.length.should eq(1) + user.shopping_carts.length.should eq(3) end it "should not add duplicate JamTrack to ShoppingCart" do @@ -150,9 +150,9 @@ describe ShoppingCart do cart6.marked_for_redeem.should eq(1) cart7 = ShoppingCart.add_jam_track_to_cart(user, jam_track7) - cart7.errors.any?.should be_true + cart7.errors.any?.should be_false user.reload - user.shopping_carts.length.should eq(6) + user.shopping_carts.length.should eq(7) cart1.marked_for_redeem.should eq(1) cart2.marked_for_redeem.should eq(1) cart3.marked_for_redeem.should eq(1) @@ -183,26 +183,30 @@ describe ShoppingCart do describe "mixed" do it "non-free then free" do + jam_track.allow_free = false + jam_track.save! + # you shouldn't be able to add a free after a non-free - user.has_redeemable_jamtrack = false + user.has_redeemable_jamtrack = true user.save! cart1 = ShoppingCart.add_jam_track_to_cart(user, jam_track) cart1.should_not be_nil cart1.errors.any?.should be_false - user.has_redeemable_jamtrack = true - user.save! user.reload cart2 = ShoppingCart.add_jam_track_to_cart(user, jam_track2) - cart2.errors.any?.should be_true - cart2.errors[:base].should eq(["You can not add a free JamTrack to a cart with non-free items. Please clear out your cart."]) + cart2.errors.any?.should be_false + #cart2.errors[:base].should eq(["You can not add a free JamTrack to a cart with non-free items. Please clear out your cart."]) - user.shopping_carts.length.should eq(1) + user.reload + user.shopping_carts.length.should eq(2) end it "free then non-free" do + jam_track2.allow_free = false + jam_track2.save! cart1 = ShoppingCart.add_jam_track_to_cart(user, jam_track) cart1.should_not be_nil cart1.errors.any?.should be_false @@ -210,10 +214,11 @@ describe ShoppingCart do user.reload cart2 = ShoppingCart.add_jam_track_to_cart(user, jam_track2) - cart2.errors.any?.should be_true - cart2.errors[:base].should eq(["You can not add a non-free JamTrack to a cart containing free items. Please clear out your cart."]) + cart2.errors.any?.should be_false + #cart2.errors[:base].should eq(["You can not add a non-free JamTrack to a cart containing free items. Please clear out your cart."]) - user.shopping_carts.length.should eq(1) + user.reload + user.shopping_carts.length.should eq(2) end end end diff --git a/ruby/spec/jam_ruby/models/teacher_spec.rb b/ruby/spec/jam_ruby/models/teacher_spec.rb index b5aefc5e5..cba225336 100644 --- a/ruby/spec/jam_ruby/models/teacher_spec.rb +++ b/ruby/spec/jam_ruby/models/teacher_spec.rb @@ -56,9 +56,7 @@ describe Teacher do #teacher.instruments << Instrument.find('electric guitar') #teacher.save! - puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" teachers = Teacher.index(nil, {instruments: ['acoustic guitar']})[:query] - puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!---" teachers.length.should eq 1 teachers[0].should eq(teacher.user) end @@ -416,7 +414,6 @@ describe Teacher do validate_introduction: true ) - puts "teacher.errors #{teacher.errors.inspect}" teacher.should_not be_nil teacher.id.should_not be_nil teacher.errors.should be_empty @@ -426,10 +423,10 @@ describe Teacher do it "basics" do teacher = Teacher.save_teacher( user, - # instruments: [instrument1, instrument2], - # subjects: [subject1, subject2], - # genres: [genre1, genre2], - # languages: [language1, language2], + # instruments: [instrument1, instrument2], + # subjects: [subject1, subject2], + # genres: [genre1, genre2], + # languages: [language1, language2], teaches_age_lower: 10, teaches_beginner: true, teaches_intermediate: false, @@ -438,11 +435,11 @@ describe Teacher do ) teacher.should_not be_nil - teacher.id.should be_nil teacher.errors.should have_key(:instruments) teacher.errors.should have_key(:subjects) teacher.errors.should have_key(:genres) teacher.errors.should have_key(:languages) + Teacher.find_by_id(teacher.id).should be_nil end it "pricing" do diff --git a/ruby/spec/mailers/batch_mailer_spec.rb b/ruby/spec/mailers/batch_mailer_spec.rb deleted file mode 100644 index b9920f504..000000000 --- a/ruby/spec/mailers/batch_mailer_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -require "spec_helper" - -describe BatchMailer do - - describe "should send test emails" do - ActionMailer::Base.deliveries.clear - - batch = FactoryGirl.create(:email_batch) - batch.send_test_batch - - mail = BatchMailer.deliveries.detect { |dd| dd['to'].to_s.split(',')[0] == batch.test_emails.split(',')[0]} - # let (:mail) { BatchMailer.deliveries[0] } - # it { mail['to'].to_s.split(',')[0].should == batch.test_emails.split(',')[0] } - - it { mail.should_not be_nil } - - # it { BatchMailer.deliveries.length.should == 1 } - - it { mail['from'].to_s.should == "JamKazam " } - it { mail.subject.should == batch.subject } - - it { mail.multipart?.should == true } # because we send plain + html - it { mail.text_part.decode_body.should match(/#{Regexp.escape(batch.body)}/) } - - it { batch.testing?.should == true } - end - -end diff --git a/ruby/spec/mailers/user_mailer_spec.rb b/ruby/spec/mailers/user_mailer_spec.rb index ec7db7133..441dc02fd 100644 --- a/ruby/spec/mailers/user_mailer_spec.rb +++ b/ruby/spec/mailers/user_mailer_spec.rb @@ -135,6 +135,11 @@ describe UserMailer do # verify that the messages are correctly configured it { mail.html_part.body.include?("to confirm your change in email").should be_true } it { mail.text_part.body.include?("to confirm your change in email").should be_true } + + # verify can unsubscribe from bulk emails + + it {mail.html_part.body.include?('here to unsubscribe').should be_true} + it {mail.html_part.body.include?("https://www.jamkazam.com/unsubscribe/#{user.unsubscribe_token}")} end describe "notifications" do diff --git a/web/vendor/assets/images/Jcrop.gif b/web/app/assets/images/Jcrop.gif similarity index 100% rename from web/vendor/assets/images/Jcrop.gif rename to web/app/assets/images/Jcrop.gif diff --git a/web/vendor/assets/images/icheck/jamkazam-dark.png b/web/app/assets/images/icheck/jamkazam-dark.png similarity index 100% rename from web/vendor/assets/images/icheck/jamkazam-dark.png rename to web/app/assets/images/icheck/jamkazam-dark.png diff --git a/web/vendor/assets/images/icheck/jamkazam.png b/web/app/assets/images/icheck/jamkazam.png similarity index 100% rename from web/vendor/assets/images/icheck/jamkazam.png rename to web/app/assets/images/icheck/jamkazam.png diff --git a/web/vendor/assets/images/icheck/jamkazam@2x.png b/web/app/assets/images/icheck/jamkazam@2x.png similarity index 100% rename from web/vendor/assets/images/icheck/jamkazam@2x.png rename to web/app/assets/images/icheck/jamkazam@2x.png diff --git a/web/vendor/assets/images/icheck/minimal.png b/web/app/assets/images/icheck/minimal.png similarity index 100% rename from web/vendor/assets/images/icheck/minimal.png rename to web/app/assets/images/icheck/minimal.png diff --git a/web/vendor/assets/images/icheck/minimal@2x.png b/web/app/assets/images/icheck/minimal@2x.png similarity index 100% rename from web/vendor/assets/images/icheck/minimal@2x.png rename to web/app/assets/images/icheck/minimal@2x.png diff --git a/web/vendor/assets/images/jstarbox-5-large.png b/web/app/assets/images/jstarbox-5-large.png similarity index 100% rename from web/vendor/assets/images/jstarbox-5-large.png rename to web/app/assets/images/jstarbox-5-large.png diff --git a/web/app/assets/javascripts/JamServer.js b/web/app/assets/javascripts/JamServer.js index 8a1b045b3..06cd1b905 100644 --- a/web/app/assets/javascripts/JamServer.js +++ b/web/app/assets/javascripts/JamServer.js @@ -657,7 +657,7 @@ client_type: isClientMode() ? context.JK.clientType() : 'latency_tester', client_id: isClientMode() ? (gon.global.env == "development" ? $.cookie('client_id') : null): context.jamClient.clientID, os: context.JK.GetOSAsString(), - jamblaster_serial_no: context.PlatformStore.jamblasterSerialNo(), + //jamblaster_serial_no: context.PlatformStore.jamblasterSerialNo(), udp_reachable: context.JK.StunInstance ? !context.JK.StunInstance.sync() : null // latency tester doesn't have the stun class loaded } diff --git a/web/app/assets/javascripts/react-components/Conditional.js.jsx.coffee b/web/app/assets/javascripts/react-components/Conditional.js.jsx.coffee new file mode 100644 index 000000000..34e13edc0 --- /dev/null +++ b/web/app/assets/javascripts/react-components/Conditional.js.jsx.coffee @@ -0,0 +1,17 @@ +context = window +rest = context.JK.Rest() +logger = context.JK.logger + +SessionActions = context.SessionActions +UserStore = context.UserStore +LessonTimerStore = context.LessonTimerStore +LessonTimerActions = context.LessonTimerActions + +@Conditional = React.createClass({ + + render: () -> + if this.props.test + return this.props.children + else + return false +}) \ No newline at end of file diff --git a/web/app/assets/javascripts/react-components/JamBlasterTrackConfig.js.jsx.coffee b/web/app/assets/javascripts/react-components/JamBlasterTrackConfig.js.jsx.coffee index d86690ba3..c5a142098 100644 --- a/web/app/assets/javascripts/react-components/JamBlasterTrackConfig.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/JamBlasterTrackConfig.js.jsx.coffee @@ -207,7 +207,7 @@ JamBlasterActions = @JamBlasterActions
+ disabled={masterDisabled}>
` `
diff --git a/web/app/assets/javascripts/react-components/JamTrackFilterScreen.js.jsx.coffee b/web/app/assets/javascripts/react-components/JamTrackFilterScreen.js.jsx.coffee index f822c4af9..15c26b9d7 100644 --- a/web/app/assets/javascripts/react-components/JamTrackFilterScreen.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/JamTrackFilterScreen.js.jsx.coffee @@ -46,9 +46,9 @@ MIX_MODES = context.JK.MIX_MODES if track.part != '' track.instrument_desc += ' (' + track.part + ')' - trackRow.free_state = if @state.is_free then 'free' else 'non-free' + trackRow.free_state = if (@state.is_free && jamtrack.allow_free) then 'free' else 'non-free' - trackRow.is_free = @state.is_free + trackRow.is_free = @state.is_free && jamtrack.allow_free uiJamTracks.push trackRow @@ -75,7 +75,7 @@ MIX_MODES = context.JK.MIX_MODES if jamtrack.purchased actionBtn = `PURCHASED` else if jamtrack.is_free - actionBtn = ` GET IT FREE!` + actionBtn = `GET IT FREE!` else if jamtrack.added_cart actionBtn = `ALREADY IN CART` else @@ -303,21 +303,13 @@ MIX_MODES = context.JK.MIX_MODES isFree = $(e.target).is('.is_free') @rest.addJamtrackToShoppingCart(params).done((response) => - if context.JK.currentUserId? - if isFree - if @user.has_redeemable_jamtrack - # this is the 1st jamtrack; let's user the user to completion - context.location = '/client#/redeemComplete' - else - # this is must be a user's gifted jamtrack, to treat them normally in that they'll go to the shopping cart - #context.location = '/client#/shoppingCart' - context.location = '/client#/redeemComplete' + if response.fast_reedem + if context.JK.currentUserId? + context.location = '/client#/redeemComplete' else - # this user has nothing free; so send them to shopping cart - context.location = '/client#/shoppingCart' + context.location = '/client#/redeemSignup' else - # user not logged in; make them signup - context.location = '/client#/redeemSignup' + context.location = '/client#/shoppingCart' ).fail(() => @app.ajaxError) diff --git a/web/app/assets/javascripts/react-components/JamTrackSearchScreen.js.jsx.coffee b/web/app/assets/javascripts/react-components/JamTrackSearchScreen.js.jsx.coffee index 6dff4c484..56adbf95c 100644 --- a/web/app/assets/javascripts/react-components/JamTrackSearchScreen.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/JamTrackSearchScreen.js.jsx.coffee @@ -52,9 +52,9 @@ MIX_MODES = context.JK.MIX_MODES if track.part != '' track.instrument_desc += ' (' + track.part + ')' - trackRow.free_state = if @state.is_free then 'free' else 'non-free' + trackRow.free_state = if (@state.is_free && jamtrack.allow_free) then 'free' else 'non-free' - trackRow.is_free = @state.is_free + trackRow.is_free = @state.is_free && jamtrack.allow_free uiJamTracks.push trackRow @@ -97,7 +97,7 @@ MIX_MODES = context.JK.MIX_MODES if jamtrack.purchased actionBtn = `PURCHASED` else if jamtrack.is_free - actionBtn = ` GET IT FREE!` + actionBtn = `GET IT FREE!` else if jamtrack.added_cart actionBtn = `ALREADY IN CART` else @@ -443,25 +443,14 @@ MIX_MODES = context.JK.MIX_MODES isFree = $(e.target).is('.is_free') @rest.addJamtrackToShoppingCart(params).done((response) => - if context.JK.currentUserId? - if isFree - if @user.has_redeemable_jamtrack - # this is the 1st jamtrack; let's user the user to completion - context.location = '/client#/redeemComplete' - else - # this is must be a user's gifted jamtrack, to treat them normally in that they'll go to the shopping cart - #context.location = '/client#/shoppingCart' - context.location = '/client#/redeemComplete' + console.log("added item to shopping cart. fast_redeem? " + response.fast_redeem) + if response.fast_reedem + if context.JK.currentUserId? + context.location = '/client#/redeemComplete' else - # this user has nothing free; so send them to shopping cart - context.location = '/client#/shoppingCart' - else - if isFree - # user not logged in; make them signup context.location = '/client#/redeemSignup' - else - # this user has nothing free; so send them to shopping cart - context.location = '/client#/shoppingCart' + else + context.location = '/client#/shoppingCart' ).fail(((jqxhr) => diff --git a/web/app/assets/javascripts/react-components/PopupJamTrackMixdownDownload.js.jsx.coffee b/web/app/assets/javascripts/react-components/PopupJamTrackMixdownDownload.js.jsx.coffee index 5fc77516c..d0e812940 100644 --- a/web/app/assets/javascripts/react-components/PopupJamTrackMixdownDownload.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/PopupJamTrackMixdownDownload.js.jsx.coffee @@ -68,7 +68,9 @@ JamTrackPlayerStore = reactContext.JamTrackPlayerStore e.preventDefault() new window.Fingerprint2().get((result, components) => ( - AppActions.openExternalUrl(window.location.protocol + '//' + window.location.host + "/api/mixdowns/#{@state.mixdown.id}/download.mp3?file_type=mp3&sample_rate=#{@sampleRate}&download=1&mark=#{result}") + redirectTo = "/api/mixdowns/#{@state.mixdown.id}/download.mp3?file_type=mp3&sample_rate=#{@sampleRate}&download=1&mark=#{result}" + redirectTo = URI.escape(redirectTo) + AppActions.openExternalUrl(window.location.protocol + '//' + window.location.host + "/signin?redirect-to=#{redirectTo}") )) enqueue: (e) -> diff --git a/web/app/assets/javascripts/react-components/PopupMediaControls.js.jsx.coffee b/web/app/assets/javascripts/react-components/PopupMediaControls.js.jsx.coffee index 5831dfc5f..0fd70d0d0 100644 --- a/web/app/assets/javascripts/react-components/PopupMediaControls.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/PopupMediaControls.js.jsx.coffee @@ -500,7 +500,9 @@ mixins.push(Reflux.listenTo(UserStore, 'onUserChanged')) return if @verificationCheck() new window.Fingerprint2().get((result, components) => ( - AppActions.openExternalUrl(window.location.protocol + '//' + window.location.host + "/api/jamtracks/#{jamTrack.id}/stems/master/download.mp3?file_type=mp3&download=1&mark=#{result}") + redirectTo = "/api/jamtracks/#{jamTrack.id}/stems/master/download.mp3?file_type=mp3&download=1&mark=#{result}" + redirectTo = URI.escape(redirectTo) + AppActions.openExternalUrl(window.location.protocol + '//' + window.location.host + "/signin?redirect-to=#{redirectTo}") )) stemChanged:() -> @@ -519,7 +521,9 @@ mixins.push(Reflux.listenTo(UserStore, 'onUserChanged')) e.preventDefault() new window.Fingerprint2().get((result, components) => ( - AppActions.openExternalUrl(window.location.protocol + '//' + window.location.host + "/api/jamtracks/#{@state.jamTrackState.jamTrack.id}/stems/#{selectedTrackId}/download.mp3?file_type=mp3&download=1&mark=#{result}") + redirectTo = "/api/jamtracks/#{@state.jamTrackState.jamTrack.id}/stems/#{selectedTrackId}/download.mp3?file_type=mp3&download=1&mark=#{result}" + redirectTo = URI.escape(redirectTo) + AppActions.openExternalUrl(window.location.protocol + '//' + window.location.host + "/signin?redirect-to=#{redirectTo}") )) @@ -562,7 +566,9 @@ mixins.push(Reflux.listenTo(UserStore, 'onUserChanged')) if browserPackage?.signing_state == 'SIGNED' new window.Fingerprint2().get((result, components) => ( - AppActions.openExternalUrl(window.location.protocol + '//' + window.location.host + "/api/mixdowns/#{mixdown.id}/download.mp3?file_type=mp3&sample_rate=48&download=1&mark=#{result}") + redirectTo = "/api/mixdowns/#{mixdown.id}/download.mp3?file_type=mp3&sample_rate=48&download=1&mark=#{result}" + redirectTo = URI.escape(redirectTo) + AppActions.openExternalUrl(window.location.protocol + '//' + window.location.host + "/signin?redirect-to=#{redirectTo}") )) else JamTrackMixdownActions.openDownloader(mixdown) diff --git a/web/app/assets/javascripts/react-components/SessionOtherTracks.js.jsx.coffee b/web/app/assets/javascripts/react-components/SessionOtherTracks.js.jsx.coffee index 7ab60ff13..298dff75a 100644 --- a/web/app/assets/javascripts/react-components/SessionOtherTracks.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/SessionOtherTracks.js.jsx.coffee @@ -16,8 +16,8 @@ MixerActions = context.MixerActions for participant in session.otherParticipants() - if participant.is_jamblaster - continue + #if participant.is_jamblaster + #continue if participant.client_id == @app.clientId participant.user.possessive = "Your" diff --git a/web/app/assets/javascripts/react-components/TeacherSearchOptionsScreen.js.jsx.coffee b/web/app/assets/javascripts/react-components/TeacherSearchOptionsScreen.js.jsx.coffee index 06770bd91..3da41a7ca 100644 --- a/web/app/assets/javascripts/react-components/TeacherSearchOptionsScreen.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/TeacherSearchOptionsScreen.js.jsx.coffee @@ -25,7 +25,7 @@ LocationActions = @LocationActions @iCheckify() getInitialState: () -> - {options: {onlyMySchool: true}} + {onlyMySchool: true, options: {onlyMySchool: true}} onAppInit: (@app) -> @app.bindScreen('jamclass/searchOptions', {beforeShow: @beforeShow, afterShow: @afterShow}) @@ -39,7 +39,8 @@ LocationActions = @LocationActions @setState(user: @user?.user) onTeacherSearchChanged: (options) -> - @setState({options: options}) + + @setState({onlyMySchool: options.onlyMySchool, options: options}) handleListChange: (listName, selectedObjects)-> logger.debug("handleListChange:", listName, selectedObjects) @@ -83,7 +84,7 @@ LocationActions = @LocationActions checked = $target.is(':checked') options = @state.options options.onlyMySchool = checked - @setState(options) + @setState({options: options, onlyMySchool: checked}) checkboxChanged: (e) -> $target = $(e.target) diff --git a/web/app/assets/javascripts/react-components/landing/HomePage.js.jsx.coffee b/web/app/assets/javascripts/react-components/landing/HomePage.js.jsx.coffee index 338b6398f..76f5d8c57 100644 --- a/web/app/assets/javascripts/react-components/landing/HomePage.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/landing/HomePage.js.jsx.coffee @@ -14,10 +14,6 @@ context = window window.modernNavInit(); - jamClassClicked: (e) -> - e.preventDefault() - alertify.alert("COMING SOON!"); - render: () -> items = [] @@ -118,7 +114,7 @@ context = window Revolutionizing the way musicians connect, play, learn and earn. Across a city or across a nation.

- JOIN TODAY, PLAY FREE! + JOIN TODAY, PLAY FREE!
Already a member? Sign in.
diff --git a/web/app/assets/javascripts/react-components/landing/JamTrackLandingBottomPage.js.jsx.coffee b/web/app/assets/javascripts/react-components/landing/JamTrackLandingBottomPage.js.jsx.coffee index a01152f63..4510b3061 100644 --- a/web/app/assets/javascripts/react-components/landing/JamTrackLandingBottomPage.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/landing/JamTrackLandingBottomPage.js.jsx.coffee @@ -100,7 +100,9 @@ context = window

-