jam-cloud/ruby/lib/jam_ruby/models/lesson_session.rb

118 lines
3.5 KiB
Ruby

# represenst the type of lesson package
module JamRuby
class LessonSession < ActiveRecord::Base
attr_accessor :accepting
@@log = Logging.logger[LessonSession]
STATUS_REQUESTED = 'requested'
STATUS_CANCELED = 'canceled'
STATUS_MISSED = 'missed'
STATUS_COMPLETED = 'completed'
STATUS_APPROVED = 'approved'
STATUS_TYPES = [STATUS_REQUESTED, STATUS_CANCELED, STATUS_MISSED, STATUS_COMPLETED, STATUS_APPROVED]
LESSON_TYPE_SINGLE = 'single'
LESSON_TYPE_SINGLE_FREE = 'single-free'
LESSON_TYPE_TEST_DRIVE = 'test-drive'
LESSON_TYPES = [LESSON_TYPE_SINGLE, LESSON_TYPE_SINGLE_FREE, LESSON_TYPE_TEST_DRIVE]
belongs_to :music_session, class_name: "JamRuby::MusicSession"
belongs_to :teacher, class_name: "JamRuby::User"
belongs_to :lesson_package_purchase, class_name: "JamRuby::LessonPackagePurchase"
belongs_to :lesson_booking, class_name: "JamRuby::LessonBooking"
validates :duration, presence: true, numericality: {only_integer: true}
validates :lesson_booking, presence: true
validates :lesson_type, inclusion: {in: LESSON_TYPES}
validates :price, presence: true
validates :status, presence: true, inclusion: {in: STATUS_TYPES}
validates :teacher_complete, inclusion: {in: [true, false]}
validates :student_complete, inclusion: {in: [true, false]}
validates :teacher_canceled, inclusion: {in: [true, false]}
validates :student_canceled, inclusion: {in: [true, false]}
validate :validate_accepted, :if => :accepting
def validate_accepted
end
def student
music_session.creator
end
def self.index(user, params = {})
limit = params[:per_page]
limit ||= 100
limit = limit.to_i
query = LessonSession.joins(:music_session).joins(music_session: :creator)
query = query.includes([:teacher, :music_session])
query = query.order('music_sessions.scheduled_start DESC')
if params[:as_teacher]
query = query.where('lesson_sessions.teacher_id = ?', user.id)
else
query = query.where('music_sessions.user_id = ?', user.id)
end
current_page = params[:page].nil? ? 1 : params[:page].to_i
next_page = current_page + 1
# will_paginate gem
query = query.paginate(:page => current_page, :per_page => limit)
if query.length == 0 # no more results
{ query: query, next_page: nil}
elsif query.length < limit # no more results
{ query: query, next_page: nil}
else
{ query: query, next_page: next_page }
end
end
# teacher accepts the lesson
def accept(params)
LessonSession.transaction do
message = params[:message]
slot = params[:slot]
update_all = params[:update_all]
self.accepting = true
slot = LessonBookingSlot.find(slot)
if lesson_booking.default_slot.nil? || update_all
lesson_booking.accepting = true
lesson_booking.default_slot = slot
lesson_booking.save!
end
self.slot = slot
if self.save
msg = ChatMessage.create(teacher, nil, message, ChatMessage::CHANNEL_LESSON, nil, user, self)
Notification.send_lesson_message('accept', self, true)
UserMailer.student_lesson_accepted(self, message)
UserMailer.teacher_lesson_accepted(self, message)
end
end
end
def home_url
APP_CONFIG.external_root_url + "/client#/jamclass"
end
def web_url
APP_CONFIG.external_root_url + "/client#/jamclass/lesson-request/" + id
end
end
end