VRFS-1693 resque job to schedule recurring music sessions

This commit is contained in:
Brian Smith 2014-06-03 01:10:25 -04:00
parent 1f726df320
commit a9b67a9a6b
5 changed files with 108 additions and 0 deletions

View File

@ -169,3 +169,4 @@ periodic_emails.sql
remember_extra_scoring_data.sql
indexing_for_regions.sql
latency_tester.sql
scheduled_sessions_next_session_scheduled.sql

View File

@ -0,0 +1 @@
alter table music_sessions add column next_session_scheduled BOOLEAN default null;

View File

@ -62,6 +62,69 @@ module JamRuby
self.comments.size
end
# copies all relevant info for the recurring session
def copy
MusicSession.transaction do
# copy base music_session data
new_session = MusicSession.new
new_session.description = self.description
new_session.user_id = self.user_id
new_session.band_id = self.band_id
new_session.fan_access = self.fan_access
# TODO: confirm this logic
new_session.scheduled_start = self.scheduled_start + self.scheduled_duration
new_session.scheduled_duration = self.scheduled_duration
new_session.musician_access = self.musician_access
new_session.approval_required = self.approval_required
new_session.fan_chat = self.fan_chat
new_session.genre_id = self.genre_id
new_session.legal_policy = self.legal_policy
new_session.language = self.language
new_session.name = self.name
new_session.recurring_mode = self.recurring_mode
new_session.timezone = self.timezone
new_session.open_rsvps = self.open_rsvps
new_session.save
# copy rsvp_slots
RsvpSlot.find_each(:conditions => "music_session_id = '#{self.id}'") do |slot|
new_slot = RsvpSlot.new
new_slot.instrument_id = slot.instrument_id
new_slot.proficiency_level = slot.proficiency_level
new_slot.music_session_id = new_session.id
new_slot.save
end
# copy music_notations
MusicNotation.find_each(:conditions => "music_session_id = '#{self.id}'") do |notation|
new_notation = MusicNotation.new
new_notation.user_id = notation.user_id
new_notation.music_session_id = new_session.id
new_notation.file_url = notation.file_url
new_notation.size = notation.size
new_notation.save
end
# copy invitations
Invitation.find_each(:conditions => "music_session_id = '#{self.id}'") do |invitation|
new_invitation = Invitation.new
new_invitation.sender_id = invitation.sender_id
new_invitation.receiver_id = invitation.receiver_id
new_invitation.music_session_id = new_session.id
new_invitation.save
user = User.find(new_invitation.receiver_id)
Notification.send_scheduled_session_invitation(new_session, user)
end
# mark the next session as scheduled
self.next_session_scheduled = true
self.save
end
end
def grouped_tracks
tracks = []
self.music_session_user_histories.each do |msuh|

View File

@ -0,0 +1,39 @@
require 'json'
require 'resque'
require 'resque-retry'
require 'net/http'
require 'digest/md5'
module JamRuby
class MusicSessionScheduler
extend Resque::Plugins::LonelyJob
@queue = :music_session_scheduler
@@log = Logging.logger[MusicSessionScheduler]
def self.lock_timeout
120
end
def self.perform
@@log.debug("waking up")
JamWebEventMachine.run_wait_stop do
MusicSessionScheduler.new.run
end
@@log.debug("done")
end
def run
# get all weekly sessions that have ended in the last 15 minutes
criteria = "recurring_mode = 'weekly' AND session_removed_at is not null AND next_session_scheduled = false"
MusicSession.find_each(:conditions => criteria) do |music_session|
music_session.copy
end
end
end
end

View File

@ -39,3 +39,7 @@ NewMusicianEmailer:
class: "JamRuby::NewMusicianEmailer"
description: "Sends weekly emails of new users with good latency"
MusicSessionScheduler:
cron: "0 */5 0 * *"
class: "JamRuby::MusicSessionScheduler"
description: "Schedules music sessions that are marked as recurring"