* merge develop

This commit is contained in:
Seth Call 2016-03-29 05:59:02 -05:00
commit 34067cb61d
20 changed files with 154 additions and 48 deletions

View File

@ -6,15 +6,29 @@ ActiveAdmin.register JamRuby::Teacher, :as => 'Teachers' do
config.batch_actions = false
config.per_page = 100
config.paginate = true
config.filters = false
scope("Default", default: true) { |scope| scope.unscoped.order("background_check_at > '#{(Date.today - 365).to_s}}' NULLS FIRST, ready_for_session_at IS NULL DESC") }
scope("All", default: true) { |scope| scope.unscoped.order("background_check_at > '#{(Date.today - 365).to_s}}' NULLS FIRST, ready_for_session_at IS NULL DESC") }
scope("All Sorted By Sign Up") { |scope| scope.unscoped.order("teachers.created_at DESC, background_check_at > '#{(Date.today - 365).to_s}}' NULLS FIRST, ready_for_session_at IS NULL DESC") }
scope("50% and Session Ready" ) { |scope| scope.unscoped.where('profile_pct >= ?', 50.0).where('ready_for_session_at IS NOT NULL').order("background_check_at > '#{(Date.today - 365).to_s}}' NULLS FIRST, ready_for_session_at IS NULL DESC") }
scope("50% and Not Session Ready" ) { |scope| scope.unscoped.where('profile_pct > ?', 50.0).where('ready_for_session_at IS NULL').order("background_check_at > '#{(Date.today - 365).to_s}}' NULLS FIRST, ready_for_session_at IS NULL DESC") }
index do
column "Name" do |teacher|
link_to teacher.user.name, "#{Rails.application.config.external_root_url}/client#/profile/teacher/#{teacher.user.id}"
span do
link_to "#{teacher.user.name} (#{teacher.user.email})", "#{Rails.application.config.external_root_url}/client#/profile/teacher/#{teacher.user.id}"
end
end
column "Email" do |teacher|
teacher.user.email
column "Instruments & Genres" do |teacher|
div do
div do
teacher.instruments.join(', ')
end
br
div do
teacher.genres.join(', ')
end
end
end
column "Location" do |teacher|
teacher.user.location(country = true)
@ -57,11 +71,8 @@ ActiveAdmin.register JamRuby::Teacher, :as => 'Teachers' do
link_to("mark as checked", mark_background_check_admin_teacher_path(teacher.id), {confirm: "Mark as background checked?"})
end
end
end
end
column "Session Ready" do |teacher|
div do
if teacher.ready_for_session_at
@ -108,6 +119,10 @@ ActiveAdmin.register JamRuby::Teacher, :as => 'Teachers' do
end
end
column "Signed Up" do |teacher|
teacher.created_at.to_date
end
end
show do
@ -228,6 +243,11 @@ ActiveAdmin.register JamRuby::Teacher, :as => 'Teachers' do
end
end
row "Signed Up" do |teacher|
teacher.created_at.to_date
end
end
end

View File

@ -21,4 +21,19 @@ class EmailController < ApplicationController
@users = @users.select('DISTINCT users.id, email, first_name, last_name').joins(:sales => :sale_line_items).where("sale_line_items.product_type = 'JamTrack'")
end
end
def dump_teachers
if params[:code] != Rails.application.config.email_dump_code
render :text => "", :status => 404
return
end
headers['Content-Disposition'] = "attachment; filename=\"teacher-list.csv\""
headers['Content-Type'] ||= 'text/csv'
@users = User.joins(:teacher)
render "dump_emailables.csv.erb"
end
end

View File

@ -30,6 +30,7 @@ JamAdmin::Application.routes.draw do
match '/api/checks/latency_tester' => 'checks#check_latency_tester', :via => :get
match '/api/users/emailables/:code' => 'email#dump_emailables', :via => :get
match '/api/teachers/:code' => 'email#dump_teachers', :via => :get
match '/jam_tracks/top/:code' => 'jam_track#dump_top_selling', :via => :get
match '/api/jam_tracks/released' => 'jam_track#dump_released', :via => :get, as: 'released_jamtracks_csv'

View File

@ -340,4 +340,5 @@ jamblaster_pairing_active.sql
email_blacklist.sql
jamblaster_connection.sql
teacher_progression.sql
lessons.sql
teacher_complete.sql
lessons.sql

View File

@ -0,0 +1,2 @@
ALTER TABLE teachers ADD COLUMN profile_pct NUMERIC(8,2) ;
ALTER TABLE teachers ADD COLUMN profile_pct_summary JSON;

View File

@ -30,6 +30,7 @@ require "jam_ruby/constants/validation_messages"
require "jam_ruby/errors/jam_permission_error"
require "jam_ruby/errors/state_error"
require "jam_ruby/errors/jam_argument_error"
require "jam_ruby/errors/jam_record_not_found"
require "jam_ruby/errors/conflict_error"
require "jam_ruby/lib/app_config"
require "jam_ruby/lib/s3_manager_mixin"

View File

@ -5,7 +5,10 @@ module JamRuby
@@log = Logging.logger[BaseManager]
@@in_websocket_gateway = Rails.env != 'test' && !Object.const_defined?(:UserManager)
# this is not working as expected
#@@in_websocket_gateway = Rails.env != 'test' && !Object.const_defined?(:UserManager)
@@in_websocket_gateway = false
def initialize(options={})
@log = Logging.logger[self]
@ -24,7 +27,6 @@ module JamRuby
# create a transaction, and pass the current connection to ConnectionManager.
# this lets the entire operation work with the same transaction,
# across Rails ActiveRecord and the pg-gem based code in ConnectionManager.
@@log.debug "DEBUG_TRAN -1"
manager.pg_conn = connection.instance_variable_get("@connection")
if @@in_websocket_gateway
@ -37,9 +39,7 @@ module JamRuby
ActiveRecord::Base.connection.execute('ROLLBACK')
end
else
@@log.debug "DEBUG_TRAN -2"
connection.transaction do
@@log.debug "DEBUG_TRAN -3"
yield manager
end
end

View File

@ -405,17 +405,20 @@ SQL
def join_music_session(user, client_id, music_session, as_musician, tracks, audio_latency, video_sources=nil)
connection = nil
@log.debug "DEBUG_TRAN 1"
ConnectionManager.active_record_transaction do |connection_manager|
@log.debug "DEBUG_TRAN 2"
db_conn = connection_manager.pg_conn
@log.debug "DEBUG_TRAN 3"
connection = Connection.find_by_client_id_and_user_id!(client_id, user.id)
@log.debug "DEBUG_TRAN 4"
connection = Connection.find_by_client_id(client_id)
if connection.nil?
raise JamRecordNotFound.new("Unable to find connection by client_id #{client_id}", 'Connection')
elsif connection.user_id.nil?
raise JamPermissionError, "no user_id associated with connection #{client_id}"
elsif connection.user_id != user.id
raise JamPermissionError, "wrong user_id associated with connection #{client_id}"
end
connection.join_the_session(music_session, as_musician, tracks, user, audio_latency, video_sources)
@log.debug "DEBUG_TRAN 5"
JamRuby::MusicSessionUserHistory.join_music_session(user.id, music_session.id)
# connection.music_session_id = music_session.id
# connection.as_musician = as_musician
@ -423,33 +426,18 @@ SQL
# connection.joined_session_at = Time.now
# associate_tracks(connection, tracks)
# connection.save
@log.debug "DEBUG_TRAN 6"
if connection.errors.any?
@log.debug "DEBUG_TRAN 7"
raise ActiveRecord::Rollback
else
@log.debug "DEBUG_TRAN 8"
update_session_controller(music_session.id)
end
end
@log.debug "DEBUG_TRAN 9"
connection
end
def testfunc()
value = nil
ConnectionManager.active_record_transaction do |connection_manager|
db_conn = connection_manager.pg_conn
value = 1
raise ActiveRecord::Rollback
end
value
end
# if a blk is passed in, upon success, it will be called and you can issue notifications
# within the connection table lock

View File

@ -0,0 +1,12 @@
module JamRuby
class JamRecordNotFound < StandardError
attr_accessor :missing_message, :record_type
def initialize(message, record_type)
@message = message
@missing_message = message
@record_type = record_type
end
end
end

View File

@ -255,6 +255,15 @@ module JamRuby
{artists: artists, songs:songs}
end
def purchase_stubs(user)
JamTrack.
select(['jam_tracks.id', :name, :original_artist, :year, 'jam_track_rights.created_at AS purchased_at']).
joins(:jam_track_rights).
where("jam_track_rights.user_id = ?", user.id).
includes(:genres).
order([:original_artist, :name])
end
def index(options, user)
if options[:page]
page = options[:page].to_i
@ -583,5 +592,9 @@ SQL
self.find_by_sql(sql).first
end
def genre_name
self.genres.first.try(:description)
end
end
end

View File

@ -37,6 +37,15 @@ module JamRuby
default_scope { includes(:genres).order('created_at desc') }
after_save :update_profile_pct
def update_profile_pct
result = pct_complete
self.profile_pct = result[:pct]
self.profile_pct_summary = result.to_json
Teacher.where(id: id).update_all(profile_pct: self.profile_pct, profile_pct_summary: self.profile_pct_summary)
end
def self.index(user, params = {})
limit = params[:per_page]

View File

@ -36,7 +36,7 @@ module JamRuby
acts_as_mappable
# after_save :check_lat_lng
after_save :update_teacher_pct
attr_accessible :first_name, :last_name, :email, :city, :password, :password_confirmation, :state, :country, :birth_date, :subscribe_email, :terms_of_service, :original_fpfile, :cropped_fpfile, :cropped_large_fpfile, :cropped_s3_path, :cropped_large_s3_path, :photo_url, :large_photo_url, :crop_selection
@ -253,6 +253,11 @@ module JamRuby
scope :musicians_geocoded, musicians.geocoded_users
scope :email_opt_in, where(:subscribe_email => true)
def update_teacher_pct
if teacher
teacher.update_profile_pct
end
end
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_recording_at", "first_social_promoted_at", "first_played_jamtrack_at"]
end

View File

@ -107,7 +107,7 @@ describe ConnectionManager, no_transaction: true do
cc.locidispid.should == 17192000002
cc.udp_reachable.should == true
@connman.reconnect(cc, channel_id, nil, "33.1.2.3", STALE_TIME, EXPIRE_TIME, false, GATEWAY, false)
@connman.reconnect(cc, channel_id, nil, "33.1.2.3", STALE_TIME, EXPIRE_TIME, false, GATEWAY)
cc = Connection.find_by_client_id!(client_id)
cc.connected?.should be_true
@ -147,7 +147,7 @@ describe ConnectionManager, no_transaction: true do
cc.locidispid.should == 17192000002
cc.udp_reachable.should == false
@connman.reconnect(cc, channel_id, nil, "33.1.2.3", STALE_TIME, EXPIRE_TIME, nil, GATEWAY, false) # heartbeat passes nil in for udp_reachable
@connman.reconnect(cc, channel_id, nil, "33.1.2.3", STALE_TIME, EXPIRE_TIME, nil, GATEWAY) # heartbeat passes nil in for udp_reachable
cc = Connection.find_by_client_id!(client_id)
cc.connected?.should be_true
@ -356,7 +356,7 @@ describe ConnectionManager, no_transaction: true do
user = User.find(user_id)
expect { @connman.join_music_session(user, client_id, music_session, true, TRACKS, 10) }.to raise_error(ActiveRecord::RecordNotFound)
expect { @connman.join_music_session(user, client_id, music_session, true, TRACKS, 10) }.to raise_error(JamRuby::JamRecordNotFound)
end
@ -429,7 +429,7 @@ describe ConnectionManager, no_transaction: true do
@connman.create_connection(user_id, client_id, channel_id, "1.1.1.1", 'client', STALE_TIME, EXPIRE_TIME, REACHABLE, GATEWAY, false)
# specify real user id, but not associated with this session
expect { @connman.join_music_session(user, client_id, music_session, true, TRACKS, 10) } .to raise_error(ActiveRecord::RecordNotFound)
expect { @connman.join_music_session(user, client_id, music_session, true, TRACKS, 10) } .to raise_error(JamRuby::JamPermissionError)
end
it "join_music_session fails if no music_session" do
@ -455,7 +455,7 @@ describe ConnectionManager, no_transaction: true do
@connman.create_connection(user_id, client_id, channel_id, "1.1.1.1", 'client', STALE_TIME, EXPIRE_TIME, REACHABLE, GATEWAY, false)
# specify real user id, but not associated with this session
expect { @connman.join_music_session(user, client_id, music_session, true, TRACKS, 10) } .to raise_error(ActiveRecord::RecordNotFound)
expect { @connman.join_music_session(user, client_id, music_session, true, TRACKS, 10) } .to raise_error(JamRuby::JamPermissionError)
end

View File

@ -17,7 +17,14 @@ describe ActiveMusicSession do
it "fails gracefully when no connection" do
music_session = FactoryGirl.create(:active_music_session, :creator => user, :musician_access => false)
expect { ActiveMusicSession.participant_create(user, music_session.id, "junk", true, nil, 5) }.to raise_error(ActiveRecord::RecordNotFound)
begin
ActiveMusicSession.participant_create(user, music_session.id, "junk", true, nil, 5)
false.should be_true
rescue JamRuby::JamRecordNotFound => e
e.record_type.should eql "Connection"
e.missing_message.should eql "Unable to find connection by client_id junk"
end
end
it "succeeds no active music session" do
@ -34,12 +41,6 @@ describe ActiveMusicSession do
expect { ActiveMusicSession.participant_create(user, 'bad music session ID', conn.client_id, true, nil, 5) }.to raise_error(ActiveRecord::RecordNotFound)
end
it "fails gracefully when invalid music session Id" do
music_session = FactoryGirl.create(:active_music_session, :creator => user, :musician_access => false)
conn = FactoryGirl.create(:connection, :user => user)
ActiveMusicSession.participant_create(user, 'bad music session ID', conn.client_id, true, nil, 5)
end
it "pulls out of other session" do
music_session1 = FactoryGirl.create(:active_music_session, :creator => user, :musician_access => false)
music_session2 = FactoryGirl.create(:active_music_session, :creator => user, :musician_access => false)
@ -52,7 +53,8 @@ describe ActiveMusicSession do
it "user-less connection bails appropriately" do
music_session1 = FactoryGirl.create(:active_music_session, :creator => user, :musician_access => false)
conn = FactoryGirl.create(:connection)
expect { ActiveMusicSession.participant_create(user, music_session1.id, conn.client_id, true, nil, 5) }.to raise_error(ActiveRecord::RecordNotFound)
ActiveRecord::Base.connection.execute("update connections set user_id = NULL where connections.id = '#{conn.id}'")
expect { ActiveMusicSession.participant_create(user, music_session1.id, conn.client_id, true, nil, 5) }.to raise_error(JamRuby::JamPermissionError)
end
end

View File

@ -19,6 +19,10 @@ class ApiController < ApplicationController
@exception = exception
render "errors/permission_error", :status => 403
end
rescue_from 'JamRuby::JamRecordNotFound' do |exception|
@exception = exception
render "errors/record_not_found", :status => 404
end
rescue_from 'JamRuby::ConflictError' do |exception|
@exception = exception
render "errors/conflict_error", :status => 409

View File

@ -142,7 +142,13 @@ class ApiJamTracksController < ApiController
self._handlePurchasedHead
return
end
params[:show_purchased_only] = true
if params[:mobile]
@jam_tracks = JamTrack.purchase_stubs(current_user).to_a
response.headers['total-entries'] = @jam_tracks.count.to_s
render "api_jam_tracks/purchased_mobile", :layout => nil
return
end
params[:show_purchased_only] = true
data = JamTrack.index(params, current_user)
@jam_tracks, @next = data[0], data[1]

View File

@ -0,0 +1,3 @@
node :jamtracks do |page|
partial "api_jam_tracks/show_for_mobile", object: @jam_tracks
end

View File

@ -0,0 +1,7 @@
object @jam_track
attributes :id, :name, :original_artist, :year, :genre_name
node :purchased_at do |jt|
Time.parse(jt.purchased_at).to_i rescue Time.now.to_i
end

View File

@ -0,0 +1,11 @@
object @exception
attributes :record_type
node "message" do |e|
e.missing_message
end
node "type" do
"JamRecordNotFound"
end

View File

@ -15,4 +15,10 @@ namespace :users do
end
end
task :update_profile_pct do |task, args|
Teacher.all.each do |teacher|
teacher.update_profile_pct
end
end
end