From 5c14d283ab1ad9efd79cd96c532b1c270c6474d4 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Mon, 21 Mar 2016 15:39:15 -0500 Subject: [PATCH] * teacher profile pgae --- admin/app/admin/teachers.rb | 253 ++++++++++++++++++++++++++++ db/manifest | 3 +- db/up/teacher_progression.sql | 3 + ruby/lib/jam_ruby/models/teacher.rb | 222 ++++++++++++++++++------ ruby/lib/jam_ruby/models/user.rb | 7 +- 5 files changed, 428 insertions(+), 60 deletions(-) create mode 100644 admin/app/admin/teachers.rb create mode 100644 db/up/teacher_progression.sql diff --git a/admin/app/admin/teachers.rb b/admin/app/admin/teachers.rb new file mode 100644 index 000000000..494aaa243 --- /dev/null +++ b/admin/app/admin/teachers.rb @@ -0,0 +1,253 @@ +ActiveAdmin.register JamRuby::Teacher, :as => 'Teachers' do + + menu :label => 'Teacher', :parent => 'JamClass' + + config.sort_order = 'created_at desc' + config.batch_actions = false + config.per_page = 100 + config.paginate = true + + + index do + column "Name" do |teacher| + link_to teacher.user.name, "#{Rails.application.config.external_root_url}/client#/profile/teacher/#{teacher.user.id}" + end + column "Email" do |teacher| + teacher.user.email + end + column "Location" do |teacher| + teacher.user.location(country = true) + end + column "Profile %" do |teacher| + div do + span do + "#{teacher.pct_complete[:pct]}%" + end + br + span do + link_to "Detail", admin_teacher_path(teacher.id) + end + end + + end + column "Background Check" do |teacher| + div do + if teacher.background_check_at + span do + teacher.background_check_at.to_date + end + span do + br + end + span do + link_to(mark_background_check_admin_teacher_path(teacher.id), {confirm: "Mark as background checked?"}) do + "mark as checked" + end + end + + else + span do + 'NOT DONE' + end + span do + br + end + span 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 + span do + 'YES' + end + else + span do + 'NO' + end + span do + br + end + span do + link_to("mark as checked", mark_session_ready_admin_teacher_path(teacher.id), {confirm: "Mark as ready for session?"}) + end + + end + end + end + column "Top Teacher" do |teacher| + div do + if teacher.top_rated + span do + 'YES' + end + span do + br + end + span do + link_to("mark not top", mark_not_top_admin_teacher_path(teacher.id), {confirm: "Mark as not top rated?"}) + end + else + span do + 'NO' + end + span do + br + end + span do + link_to("mark as top", mark_top_admin_teacher_path(teacher.id), {confirm: "Mark as top rated?"}) + end + end + end + + end + end + + show do + attributes_table do + row "Name" do |teacher| + link_to teacher.user.name, "#{Rails.application.config.external_root_url}/client#/profile/teacher/#{teacher.user.id}" + end + row "Email" do |teacher| + teacher.user.email + end + row "Location" do |teacher| + teacher.user.location(country = true) + end + row "Profile %" do |teacher| + div do + span do + "#{teacher.pct_complete[:pct]}%" + end + br + br + div do + h5 do "Completed Sections" end + teacher.pct_complete.each do |k, v| + if k != :pct && v + div do + k + end + end + end + br + br + h5 do "Uncompleted Sections" end + teacher.pct_complete.each do |k, v| + if k != :pct && !v + div do + k + end + end + end + end + end + + end + row "Background Check" do |teacher| + div do + if teacher.background_check_at + span do + teacher.background_check_at.to_date + end + span do + br + end + span do + link_to(mark_background_check_admin_teacher_path(teacher.id), {confirm: "Mark as background checked?"}) do + "mark as checked" + end + end + + else + span do + 'NOT DONE' + end + span do + br + end + span do + link_to("mark as checked", mark_background_check_admin_teacher_path(teacher.id), {confirm: "Mark as background checked?"}) + end + end + + + end + end + + row "Session Ready" do |teacher| + div do + if teacher.ready_for_session + span do + 'YES' + end + else + span do + 'NO' + end + span do + br + end + span do + link_to("mark as checked", mark_session_ready_admin_teacher_path(teacher.id), {confirm: "Mark as ready for session?"}) + end + + end + end + end + row "Top Teacher" do |teacher| + div do + if teacher.top_rated + span do + 'YES' + end + span do + br + end + span do + link_to("mark not top", mark_not_top_admin_teacher_path(teacher.id), {confirm: "Mark as not top rated?"}) + end + else + span do + 'NO' + end + span do + br + end + span do + link_to("mark as top", mark_top_admin_teacher_path(teacher.id), {confirm: "Mark as top rated?"}) + end + end + end + + end + end + end + + + member_action :mark_background_check, :method => :get do + resource.mark_background_checked + redirect_to :back + end + + member_action :mark_session_ready, :method => :get do + resource.mark_session_ready + redirect_to :back + end + + member_action :mark_top, :method => :get do + resource.mark_top_rated + redirect_to :back + end + + member_action :mark_not_top, :method => :get do + resource.mark_not_top_rated + redirect_to :back + end +end \ No newline at end of file diff --git a/db/manifest b/db/manifest index f1371cce7..8b5d0e349 100755 --- a/db/manifest +++ b/db/manifest @@ -338,4 +338,5 @@ jamblaster_v2.sql acapella_rename.sql jamblaster_pairing_active.sql email_blacklist.sql -jamblaster_connection.sql \ No newline at end of file +jamblaster_connection.sql +teacher_progression.sql \ No newline at end of file diff --git a/db/up/teacher_progression.sql b/db/up/teacher_progression.sql new file mode 100644 index 000000000..1f00296b3 --- /dev/null +++ b/db/up/teacher_progression.sql @@ -0,0 +1,3 @@ +ALTER TABLE teachers ADD COLUMN background_check_at TIMESTAMP WITHOUT TIME ZONE; +ALTER TABLE teachers ADD COLUMN ready_for_session BOOLEAN NOT NULL DEFAULT FALSE; +ALTER TABLE teachers ADD COLUMN top_rated BOOLEAN NOT NULL DEFAULT FALSE; \ No newline at end of file diff --git a/ruby/lib/jam_ruby/models/teacher.rb b/ruby/lib/jam_ruby/models/teacher.rb index 387a4757c..8c8878de1 100644 --- a/ruby/lib/jam_ruby/models/teacher.rb +++ b/ruby/lib/jam_ruby/models/teacher.rb @@ -4,35 +4,37 @@ module JamRuby html_sanitize strict: [:biography, :website] attr_accessor :validate_introduction, :validate_basics, :validate_pricing attr_accessible :genres, :teacher_experiences, :experiences_teaching, :experiences_education, :experiences_award - has_and_belongs_to_many :genres, :class_name => "JamRuby::Genre", :join_table => "teachers_genres", :order=>"description" - has_and_belongs_to_many :instruments, :class_name => "JamRuby::Instrument", :join_table => "teachers_instruments", :order=>"description" - has_and_belongs_to_many :subjects, :class_name => "JamRuby::Subject", :join_table => "teachers_subjects", :order=>"description" - has_and_belongs_to_many :languages, :class_name => "JamRuby::Language", :join_table => "teachers_languages", :order=>"description" + has_and_belongs_to_many :genres, :class_name => "JamRuby::Genre", :join_table => "teachers_genres", :order => "description" + has_and_belongs_to_many :instruments, :class_name => "JamRuby::Instrument", :join_table => "teachers_instruments", :order => "description" + has_and_belongs_to_many :subjects, :class_name => "JamRuby::Subject", :join_table => "teachers_subjects", :order => "description" + has_and_belongs_to_many :languages, :class_name => "JamRuby::Language", :join_table => "teachers_languages", :order => "description" has_many :teacher_experiences, :class_name => "JamRuby::TeacherExperience" has_many :experiences_teaching, :class_name => "JamRuby::TeacherExperience", conditions: {experience_type: 'teaching'} has_many :experiences_education, :class_name => "JamRuby::TeacherExperience", conditions: {experience_type: 'education'} has_many :experiences_award, :class_name => "JamRuby::TeacherExperience", conditions: {experience_type: 'award'} has_many :reviews, :class_name => "JamRuby::Review", as: :target - has_one :review_summary, :class_name => "JamRuby::ReviewSummary", as: :target - has_one :user, :class_name => 'JamRuby::User' + has_one :review_summary, :class_name => "JamRuby::ReviewSummary", as: :target + has_one :user, :class_name => 'JamRuby::User' validates :user, :presence => true validates :biography, length: {minimum: 5, maximum: 4096}, :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 :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 + validates :top_rated, inclusion: {in: [true, false]} + validates :ready_for_session, inclusion: {in: [true, false]} validates :test_drives_per_week, numericality: {only_integer: true, minimum: 2, maximum: 10}, :if => :validate_pricing - validates :instruments, :length => { minimum:1, message:"At least one instrument or subject is required"}, if: :validate_basics, unless: ->(teacher){teacher.subjects.length>0} - validates :subjects, :length => { minimum:1, message:"At least one instrument or subject is required"}, if: :validate_basics, unless: ->(teacher){teacher.instruments.length>0} - validates :genres, :length => { minimum:1, message:"At least one genre is required"}, if: :validate_basics - validates :languages, :length => { minimum:1, message:"At least one language is required"}, if: :validate_basics + validates :instruments, :length => {minimum: 1, message: "At least one instrument or subject is required"}, if: :validate_basics, unless: ->(teacher) { teacher.subjects.length>0 } + validates :subjects, :length => {minimum: 1, message: "At least one instrument or subject is required"}, if: :validate_basics, unless: ->(teacher) { teacher.instruments.length>0 } + validates :genres, :length => {minimum: 1, message: "At least one genre is required"}, if: :validate_basics + validates :languages, :length => {minimum: 1, message: "At least one language is required"}, if: :validate_basics validate :offer_pricing, :if => :validate_pricing validate :offer_duration, :if => :validate_pricing validate :teaches_ages, :if => :validate_basics - default_scope { includes(:genres) } + default_scope { includes(:genres).order('created_at desc') } def self.index(user, params = {}) @@ -45,7 +47,7 @@ module JamRuby instruments = params[:instruments] if instruments && !instruments.blank? && instruments.length > 0 query = query.joins("inner JOIN teachers_instruments AS tinst ON tinst.teacher_id = teachers.id") - .where("tinst.instrument_id IN (?)", instruments) + .where("tinst.instrument_id IN (?)", instruments) end subjects = params[:subjects] @@ -72,8 +74,8 @@ module JamRuby languages = params[:languages] if languages && !languages.blank? && languages.length > 0 - query= query.joins("inner JOIN teachers_languages AS tlang ON tlang.teacher_id = teachers.id") - .where('tlang.language_id IN (?)', languages) + query= query.joins("inner JOIN teachers_languages AS tlang ON tlang.teacher_id = teachers.id") + .where('tlang.language_id IN (?)', languages) end years_teaching = params[:years_teaching].to_i @@ -118,12 +120,12 @@ module JamRuby # 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} + 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 } + {query: query, next_page: next_page} end end @@ -147,33 +149,33 @@ module JamRuby teacher.biography = params[:biography] if params.key?(:biography) teacher.introductory_video = params[:introductory_video] if params.key?(:introductory_video) - teacher.introductory_video = params[:introductory_video] if params.key?(:introductory_video) - teacher.years_teaching = params[:years_teaching] if params.key?(:years_teaching) - teacher.years_playing = params[:years_playing] if params.key?(:years_playing) - teacher.teaches_age_lower = params[:teaches_age_lower] if params.key?(:teaches_age_lower) - teacher.teaches_age_upper = params[:teaches_age_upper] if params.key?(:teaches_age_upper) - teacher.website = params[:website] if params.key?(:website) - teacher.biography = params[:biography] if params.key?(:biography) - teacher.teaches_beginner = params[:teaches_beginner] if params.key?(:teaches_beginner) - teacher.teaches_intermediate = params[:teaches_intermediate] if params.key?(:teaches_intermediate) - teacher.teaches_advanced = params[:teaches_advanced] if params.key?(:teaches_advanced) - teacher.prices_per_lesson = params[:prices_per_lesson] if params.key?(:prices_per_lesson) - teacher.prices_per_month = params[:prices_per_month] if params.key?(:prices_per_month) - teacher.lesson_duration_30 = params[:lesson_duration_30] if params.key?(:lesson_duration_30) - teacher.lesson_duration_45 = params[:lesson_duration_45] if params.key?(:lesson_duration_45) - teacher.lesson_duration_60 = params[:lesson_duration_60] if params.key?(:lesson_duration_60) - teacher.lesson_duration_90 = params[:lesson_duration_90] if params.key?(:lesson_duration_90) - teacher.lesson_duration_120 = params[:lesson_duration_120] if params.key?(:lesson_duration_120) - teacher.price_per_lesson_30_cents = params[:price_per_lesson_30_cents] if params.key?(:price_per_lesson_30_cents) - teacher.price_per_lesson_45_cents = params[:price_per_lesson_45_cents] if params.key?(:price_per_lesson_45_cents) - teacher.price_per_lesson_60_cents = params[:price_per_lesson_60_cents] if params.key?(:price_per_lesson_60_cents) - teacher.price_per_lesson_90_cents = params[:price_per_lesson_90_cents] if params.key?(:price_per_lesson_90_cents) - teacher.price_per_lesson_120_cents = params[:price_per_lesson_120_cents] if params.key?(:price_per_lesson_120_cents) - teacher.price_per_month_30_cents = params[:price_per_month_30_cents] if params.key?(:price_per_month_30_cents) - teacher.price_per_month_45_cents = params[:price_per_month_45_cents] if params.key?(:price_per_month_45_cents) - teacher.price_per_month_60_cents = params[:price_per_month_60_cents] if params.key?(:price_per_month_60_cents) - teacher.price_per_month_90_cents = params[:price_per_month_90_cents] if params.key?(:price_per_month_90_cents) - teacher.price_per_month_120_cents = params[:price_per_month_120_cents] if params.key?(:price_per_month_120_cents) + teacher.introductory_video = params[:introductory_video] if params.key?(:introductory_video) + teacher.years_teaching = params[:years_teaching] if params.key?(:years_teaching) + teacher.years_playing = params[:years_playing] if params.key?(:years_playing) + teacher.teaches_age_lower = params[:teaches_age_lower] if params.key?(:teaches_age_lower) + teacher.teaches_age_upper = params[:teaches_age_upper] if params.key?(:teaches_age_upper) + teacher.website = params[:website] if params.key?(:website) + teacher.biography = params[:biography] if params.key?(:biography) + teacher.teaches_beginner = params[:teaches_beginner] if params.key?(:teaches_beginner) + teacher.teaches_intermediate = params[:teaches_intermediate] if params.key?(:teaches_intermediate) + teacher.teaches_advanced = params[:teaches_advanced] if params.key?(:teaches_advanced) + teacher.prices_per_lesson = params[:prices_per_lesson] if params.key?(:prices_per_lesson) + teacher.prices_per_month = params[:prices_per_month] if params.key?(:prices_per_month) + teacher.lesson_duration_30 = params[:lesson_duration_30] if params.key?(:lesson_duration_30) + teacher.lesson_duration_45 = params[:lesson_duration_45] if params.key?(:lesson_duration_45) + teacher.lesson_duration_60 = params[:lesson_duration_60] if params.key?(:lesson_duration_60) + teacher.lesson_duration_90 = params[:lesson_duration_90] if params.key?(:lesson_duration_90) + teacher.lesson_duration_120 = params[:lesson_duration_120] if params.key?(:lesson_duration_120) + teacher.price_per_lesson_30_cents = params[:price_per_lesson_30_cents] if params.key?(:price_per_lesson_30_cents) + teacher.price_per_lesson_45_cents = params[:price_per_lesson_45_cents] if params.key?(:price_per_lesson_45_cents) + teacher.price_per_lesson_60_cents = params[:price_per_lesson_60_cents] if params.key?(:price_per_lesson_60_cents) + teacher.price_per_lesson_90_cents = params[:price_per_lesson_90_cents] if params.key?(:price_per_lesson_90_cents) + teacher.price_per_lesson_120_cents = params[:price_per_lesson_120_cents] if params.key?(:price_per_lesson_120_cents) + teacher.price_per_month_30_cents = params[:price_per_month_30_cents] if params.key?(:price_per_month_30_cents) + teacher.price_per_month_45_cents = params[:price_per_month_45_cents] if params.key?(:price_per_month_45_cents) + teacher.price_per_month_60_cents = params[:price_per_month_60_cents] if params.key?(:price_per_month_60_cents) + teacher.price_per_month_90_cents = params[:price_per_month_90_cents] if params.key?(:price_per_month_90_cents) + teacher.price_per_month_120_cents = params[:price_per_month_120_cents] if params.key?(:price_per_month_120_cents) teacher.teaches_test_drive = params[:teaches_test_drive] if params.key?(:teaches_test_drive) teacher.test_drives_per_week = params[:test_drives_per_week] if params.key?(:test_drives_per_week) @@ -181,22 +183,22 @@ module JamRuby if params.key?(:genres) genres = params[:genres] genres = [] if genres.nil? - teacher.genres = genres.collect{|genre_id| Genre.find(genre_id)} + 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)} + 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)} + 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)} + teacher.languages = languages.collect { |language_id| Language.find(language_id) } end # Experience: @@ -207,11 +209,11 @@ module JamRuby 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] + name: exp[:name], + experience_type: experience_type, + organization: exp[:organization], + start_year: exp[:start_year], + end_year: exp[:end_year] ) end # collect @@ -254,5 +256,113 @@ module JamRuby def recent_reviews reviews.order('created_at desc').limit(20) end + + def mark_background_checked + self.background_check_at = Time.now + self.save! + end + + def mark_session_ready + self.ready_for_session = true + self.save! + end + + def mark_top_rated + self.top_rated = true + self.save! + end + + def mark_not_top_rated + self.top_rated = false + self.save! + end + def has_experiences_teaching? + experiences_teaching.count > 0 + end + + def has_experiences_education? + experiences_education.count > 0 + end + + def has_experiences_award? + experiences_award.count > 0 + end + + def has_stripe_billing? + false + end + + def has_instruments_or_subject? + instruments.count > 0 || subjects.count > 0 + end + + def has_genres? + genres.count > 0 + end + + def has_languages? + languages.count > 0 + end + + def teaches_ages_specified? + (!teaches_age_lower.nil? && teaches_age_lower > 0) || (!teaches_age_upper.nil? && teaches_age_upper > 0) + end + + def teaching_level_specified? + teaches_beginner || teaches_intermediate || teaches_advanced + end + + def has_pricing_specified? + specified = false + durations_allowed = [] + [30, 45, 60, 90, 120].each do |i| + durations_allowed << i if self["lesson_duration_#{i}"] + end + + durations_allowed.each do |i| + if self["price_per_lesson_#{i}_cents"] || self["price_per_month_#{i}_cents"] + specified = true + break + end + end + specified + end + + def has_name_specified? + !user.anonymous? + end + + # how complete is their profile? + def pct_complete + @part_complete ||= { + name_specified: has_name_specified?, + experiences_teaching: has_experiences_teaching?, + experiences_education: has_experiences_education?, + experiences_award: has_experiences_award?, + has_stripe_account: has_stripe_billing?, + has_teacher_bio: !biography.nil?, + intro_video: !introductory_video.nil?, + years_teaching: years_teaching > 0, + years_playing: years_playing > 0, + instruments_or_subject: has_instruments_or_subject?, + genres: genres.count > 0, + languages: languages.count > 0, + teaches_ages_specified: teaches_ages_specified?, + teaching_level_specified: teaching_level_specified?, + has_pricing_specified: has_pricing_specified? + } + + done = 0 + @part_complete.each do |k, v| + if v + done += 1 + end + end + + complete = 100.0 * done.to_f / parts.length.to_f + + @part_complete[:pct] = complete.round + @part_complete + end end end diff --git a/ruby/lib/jam_ruby/models/user.rb b/ruby/lib/jam_ruby/models/user.rb index 43fabf0b3..d7a964414 100644 --- a/ruby/lib/jam_ruby/models/user.rb +++ b/ruby/lib/jam_ruby/models/user.rb @@ -349,11 +349,12 @@ module JamRuby end end - def location + def location(country = false) loc = self.city.blank? ? '' : self.city loc = loc.blank? ? self.state : "#{loc}, #{self.state}" unless self.state.blank? - #loc = loc.blank? ? self.country : "#{loc}, #{self.country}" unless self.country.blank? - # XXX WHY IS COUNTRY COMMENTED OUT? + if country + loc = loc.blank? ? self.country : "#{loc}, #{self.country}" unless self.country.blank? + end loc end