From a9b67a9a6b19a0cf875939ecf25835a61290d067 Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Tue, 3 Jun 2014 01:10:25 -0400 Subject: [PATCH] VRFS-1693 resque job to schedule recurring music sessions --- db/manifest | 1 + ...eduled_sessions_next_session_scheduled.sql | 1 + ruby/lib/jam_ruby/models/music_session.rb | 63 +++++++++++++++++++ .../scheduled/music_session_scheduler.rb | 39 ++++++++++++ web/config/scheduler.yml | 4 ++ 5 files changed, 108 insertions(+) create mode 100644 db/up/scheduled_sessions_next_session_scheduled.sql diff --git a/db/manifest b/db/manifest index d4b3013d5..4b526266a 100755 --- a/db/manifest +++ b/db/manifest @@ -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 \ No newline at end of file diff --git a/db/up/scheduled_sessions_next_session_scheduled.sql b/db/up/scheduled_sessions_next_session_scheduled.sql new file mode 100644 index 000000000..ac59d437a --- /dev/null +++ b/db/up/scheduled_sessions_next_session_scheduled.sql @@ -0,0 +1 @@ +alter table music_sessions add column next_session_scheduled BOOLEAN default null; \ No newline at end of file diff --git a/ruby/lib/jam_ruby/models/music_session.rb b/ruby/lib/jam_ruby/models/music_session.rb index 53cb4450c..13b340db2 100644 --- a/ruby/lib/jam_ruby/models/music_session.rb +++ b/ruby/lib/jam_ruby/models/music_session.rb @@ -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| diff --git a/ruby/lib/jam_ruby/resque/scheduled/music_session_scheduler.rb b/ruby/lib/jam_ruby/resque/scheduled/music_session_scheduler.rb index e69de29bb..6babdd5ee 100644 --- a/ruby/lib/jam_ruby/resque/scheduled/music_session_scheduler.rb +++ b/ruby/lib/jam_ruby/resque/scheduled/music_session_scheduler.rb @@ -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 \ No newline at end of file diff --git a/web/config/scheduler.yml b/web/config/scheduler.yml index 85297676e..87753a1f4 100644 --- a/web/config/scheduler.yml +++ b/web/config/scheduler.yml @@ -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" \ No newline at end of file