* working on event page
This commit is contained in:
parent
3c5a14312a
commit
b9ee475db5
|
|
@ -0,0 +1,3 @@
|
||||||
|
ActiveAdmin.register JamRuby::EventSession, :as => 'Event Session' do
|
||||||
|
menu :parent => 'Events'
|
||||||
|
end
|
||||||
|
|
@ -1,10 +1,25 @@
|
||||||
CREATE TABLE events (
|
CREATE TABLE events (
|
||||||
id VARCHAR(64) PRIMARY KEY DEFAULT uuid_generate_v4(),
|
id VARCHAR(64) PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||||
slug VARCHAR(512) NOT NULL UNIQUE,
|
slug VARCHAR(512) NOT NULL UNIQUE,
|
||||||
starts_at TIMESTAMP,
|
event_day date,
|
||||||
ends_at TIMESTAMP,
|
|
||||||
title TEXT,
|
title TEXT,
|
||||||
description TEXT,
|
description TEXT,
|
||||||
|
show_sponser BOOLEAN NOT NULL DEFAULT false,
|
||||||
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE event_sessions (
|
||||||
|
id VARCHAR(64) PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||||
|
starts_at TIMESTAMP,
|
||||||
|
ends_at TIMESTAMP,
|
||||||
|
pinned_state VARCHAR(255),
|
||||||
|
img_url VARCHAR(1024),
|
||||||
|
img_width INTEGER,
|
||||||
|
img_height INTEGER,
|
||||||
|
event_id VARCHAR(64) REFERENCES events(id) ON DELETE CASCADE,
|
||||||
|
user_id VARCHAR(64) REFERENCES users(id) ON DELETE SET NULL,
|
||||||
|
band_id VARCHAR(64) REFERENCES bands(id) ON DELETE SET NULL,
|
||||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||||
);
|
);
|
||||||
|
|
@ -100,6 +100,7 @@ require "jam_ruby/models/crash_dump"
|
||||||
require "jam_ruby/models/isp_score_batch"
|
require "jam_ruby/models/isp_score_batch"
|
||||||
require "jam_ruby/models/promotional"
|
require "jam_ruby/models/promotional"
|
||||||
require "jam_ruby/models/event"
|
require "jam_ruby/models/event"
|
||||||
|
require "jam_ruby/models/event_session"
|
||||||
require "jam_ruby/models/icecast_admin_authentication"
|
require "jam_ruby/models/icecast_admin_authentication"
|
||||||
require "jam_ruby/models/icecast_directory"
|
require "jam_ruby/models/icecast_directory"
|
||||||
require "jam_ruby/models/icecast_limit"
|
require "jam_ruby/models/icecast_limit"
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,9 @@ module JamRuby
|
||||||
has_many :music_sessions, :class_name => "JamRuby::MusicSession", :foreign_key => "band_id"
|
has_many :music_sessions, :class_name => "JamRuby::MusicSession", :foreign_key => "band_id"
|
||||||
has_many :music_session_history, :class_name => "JamRuby::MusicSessionHistory", :foreign_key => "band_id", :inverse_of => :band
|
has_many :music_session_history, :class_name => "JamRuby::MusicSessionHistory", :foreign_key => "band_id", :inverse_of => :band
|
||||||
|
|
||||||
|
# events
|
||||||
|
has_many :event_sessions, :class_name => "JamRuby::EventSession"
|
||||||
|
|
||||||
include Geokit::ActsAsMappable::Glue unless defined?(acts_as_mappable)
|
include Geokit::ActsAsMappable::Glue unless defined?(acts_as_mappable)
|
||||||
acts_as_mappable
|
acts_as_mappable
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,9 @@
|
||||||
class JamRuby::Event < ActiveRecord::Base
|
class JamRuby::Event < ActiveRecord::Base
|
||||||
|
|
||||||
attr_accessible :slug, :starts_at, :ends_at,
|
attr_accessible :slug, :event_day, :title, :description, :show_sponser, as: :admin
|
||||||
:'starts_at(1i)', :'starts_at(2i)', :'starts_at(3i)', :'starts_at(4i)', :'starts_at(5i)',
|
|
||||||
:'ends_at(1i)', :'ends_at(2i)', :'ends_at(3i)', :'ends_at(4i)', :'ends_at(5i)',
|
|
||||||
:title,
|
|
||||||
:description, as: :admin
|
|
||||||
|
|
||||||
validates :slug, uniqueness: true, presence: true
|
validates :slug, uniqueness: true, presence: true
|
||||||
|
validates :show_sponser, :inclusion => {:in => [true, false]}
|
||||||
|
|
||||||
|
has_many :event_sessions, class_name: 'JamRuby::EventSession'
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
class JamRuby::EventSession < ActiveRecord::Base
|
||||||
|
|
||||||
|
attr_accessible :event_id, :user_id, :band_id, :starts_at, :ends_at, :pinned_state, :position, :img_url, :img_width, :img_height, as: :admin
|
||||||
|
|
||||||
|
belongs_to :user, class_name: 'JamRuby::User'
|
||||||
|
belongs_to :band, class_name: 'JamRuby::Band'
|
||||||
|
belongs_to :event
|
||||||
|
|
||||||
|
|
||||||
|
validates :event, presence: true
|
||||||
|
validates :pinned_state, :inclusion => {:in => [nil, :not_started, :over]}
|
||||||
|
validate :one_of_user_band
|
||||||
|
|
||||||
|
before_validation :sanitize_active_admin
|
||||||
|
|
||||||
|
def sanitize_active_admin
|
||||||
|
puts self.inspect
|
||||||
|
self.img_url = nil if self.img_url == ''
|
||||||
|
self.user_id = nil if self.user_id == ''
|
||||||
|
self.band_id = nil if self.band_id == ''
|
||||||
|
self.pinned_state = nil if self.pinned_state == ''
|
||||||
|
end
|
||||||
|
|
||||||
|
def one_of_user_band
|
||||||
|
if band && user
|
||||||
|
errors.add(:user, 'specify band, or user. not both')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -94,6 +94,9 @@ module JamRuby
|
||||||
# crash dumps
|
# crash dumps
|
||||||
has_many :crash_dumps, :foreign_key => "user_id", :class_name => "JamRuby::CrashDump"
|
has_many :crash_dumps, :foreign_key => "user_id", :class_name => "JamRuby::CrashDump"
|
||||||
|
|
||||||
|
# events
|
||||||
|
has_many :event_sessions, :class_name => "JamRuby::EventSession"
|
||||||
|
|
||||||
# This causes the authenticate method to be generated (among other stuff)
|
# This causes the authenticate method to be generated (among other stuff)
|
||||||
#has_secure_password
|
#has_secure_password
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -420,6 +420,8 @@ FactoryGirl.define do
|
||||||
sequence(:slug) { |n| "slug-#{n}" }
|
sequence(:slug) { |n| "slug-#{n}" }
|
||||||
title 'event title'
|
title 'event title'
|
||||||
description 'event description'
|
description 'event description'
|
||||||
|
end
|
||||||
|
|
||||||
|
factory :event_session, :class => JamRuby::EventSession do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe EventSession do
|
||||||
|
|
||||||
|
it "should be creatable" do
|
||||||
|
event = FactoryGirl.create(:event)
|
||||||
|
event_session = FactoryGirl.create(:event_session, event: event)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "requires a parent event" do
|
||||||
|
event_session = FactoryGirl.build(:event_session)
|
||||||
|
event_session.save.should be_false
|
||||||
|
event_session.errors[:event].should == ["can't be blank"]
|
||||||
|
end
|
||||||
|
|
||||||
|
it "can't specify both band and user" do
|
||||||
|
user = FactoryGirl.create(:user)
|
||||||
|
band = FactoryGirl.create(:band)
|
||||||
|
event = FactoryGirl.create(:event)
|
||||||
|
event_session = FactoryGirl.build(:event_session, event: event, user: user, band:band)
|
||||||
|
event_session.save.should be_false
|
||||||
|
event_session.errors[:user].should == ["specify band, or user. not both"]
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
@ -1,8 +1,6 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe Event do
|
describe Event do
|
||||||
before do
|
|
||||||
end
|
|
||||||
|
|
||||||
it "should be creatable" do
|
it "should be creatable" do
|
||||||
FactoryGirl.create(:event)
|
FactoryGirl.create(:event)
|
||||||
|
|
@ -15,4 +13,13 @@ describe Event do
|
||||||
dup.errors[:slug].should == ["has already been taken"]
|
dup.errors[:slug].should == ["has already been taken"]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "can have associated event session, then destroy it by destroying event" do
|
||||||
|
event = FactoryGirl.create(:event)
|
||||||
|
event_session = FactoryGirl.create(:event_session, event: event)
|
||||||
|
event.reload
|
||||||
|
event.event_sessions.length.should == 1
|
||||||
|
event_session.event.should == event
|
||||||
|
event.destroy
|
||||||
|
EventSession.find_by_id(event_session.id).should be_nil
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 6.0 KiB |
|
|
@ -518,3 +518,10 @@ div[layout-id=session], div[layout-id=ftue], .no-selection-range {
|
||||||
margin:0 10px 0 3px;
|
margin:0 10px 0 3px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
background-color: #999999;
|
||||||
|
border: 0 none;
|
||||||
|
height: 1px;
|
||||||
|
margin: 10px 0;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ class EventsController < ApplicationController
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@event = Event.find_by_slug!(params[:slug])
|
@event = Event.find_by_slug!(params[:slug])
|
||||||
render :layout => "web"
|
render 'event', :layout => "web"
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
@ -22,11 +22,15 @@ module AvatarHelper
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def resolve_avatarables(*avatarables)
|
def resolve_avatarables(*avatarables, allow_none: false)
|
||||||
avatarables.each do |avatarable|
|
avatarables.each do |avatarable|
|
||||||
return resolve_avatarable(avatarable) if avatarable
|
return resolve_avatarable(avatarable) if avatarable
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if allow_none
|
||||||
|
nil
|
||||||
|
else
|
||||||
raise "at least one avatarable must be specified"
|
raise "at least one avatarable must be specified"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,91 @@
|
||||||
|
module EventSessionHelper
|
||||||
|
|
||||||
|
def event_session_img(event_session)
|
||||||
|
|
||||||
|
# need to figure out img, width, height
|
||||||
|
|
||||||
|
# prefer the session URL if specified; otherwise use the band/user
|
||||||
|
url = nil
|
||||||
|
width = nil
|
||||||
|
height = nil
|
||||||
|
|
||||||
|
if event_session.img_url
|
||||||
|
url = image_path(event_session.img_url)
|
||||||
|
else
|
||||||
|
url = resolve_avatarables(event_session.band, event_session.user, allow_none: true)
|
||||||
|
end
|
||||||
|
|
||||||
|
if url
|
||||||
|
width = event_session.img_width
|
||||||
|
height = event_session.img_height
|
||||||
|
else
|
||||||
|
url = image_path('web/logo-256.png')
|
||||||
|
width = 115
|
||||||
|
end
|
||||||
|
|
||||||
|
content_tag(:img, nil, src: url, width: width, height: height)
|
||||||
|
end
|
||||||
|
|
||||||
|
def event_session_title(event_session)
|
||||||
|
return event_session.band.name if event_session.band
|
||||||
|
return event_session.user.name if event_session.user
|
||||||
|
'TBD'
|
||||||
|
end
|
||||||
|
|
||||||
|
def event_session_start_hour(event_session)
|
||||||
|
timezone = ActiveSupport::TimeZone.new('Central Time (US & Canada)')
|
||||||
|
timezone.at(event_session.starts_at.to_i).strftime('%l:%M %P')
|
||||||
|
end
|
||||||
|
|
||||||
|
def event_session_button(event_session)
|
||||||
|
|
||||||
|
state = nil # can be :not_started, :over, :playing
|
||||||
|
state = event_session.pinned_state if event_session.pinned_state
|
||||||
|
if !state && (event_session.user_id || event_session.band_id)
|
||||||
|
# if no pinned state, then we try to find if there is a session currently on going during the specified time range
|
||||||
|
# if so, then we are playing.
|
||||||
|
# if there has been none, we say it's still coming,
|
||||||
|
# if there has been at least one, and it's over, we say session over
|
||||||
|
query = MusicSessionHistory.where(created_at: event_session.event.event_day..(event_session.event.event_day + 1.day))
|
||||||
|
if event_session.user_id
|
||||||
|
query = query.where(user_id: event_session.user_id)
|
||||||
|
elsif event_session.band_id
|
||||||
|
query = query.where(band_id: event_session.band_id)
|
||||||
|
else
|
||||||
|
raise 'invalid state in event_session_button'
|
||||||
|
end
|
||||||
|
|
||||||
|
music_session_history = query.order('created_at DESC').first
|
||||||
|
|
||||||
|
if music_session_history
|
||||||
|
if music_session_history.session_removed_at
|
||||||
|
state = 'over'
|
||||||
|
else
|
||||||
|
state = 'playing'
|
||||||
|
end
|
||||||
|
else
|
||||||
|
state = 'not_started'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if state == 'over'
|
||||||
|
content_tag(:a, 'SESSION ENDED', href: music_session_detail_path(music_session_history.id), class: 'button-grey')
|
||||||
|
elsif state == 'playing'
|
||||||
|
content_tag(:a, '', href: music_session_detail_path(music_session_history.id), class: 'button-orange') do
|
||||||
|
image_tag 'content/icon_playbutton.png', :width => 20, height: 20, align: 'absmiddle'
|
||||||
|
content_tag(:span, 'LISTEN NOW')
|
||||||
|
end
|
||||||
|
elsif state == 'not_started'
|
||||||
|
nil
|
||||||
|
else
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
def event_session_description(event_session)
|
||||||
|
event_session.band.biography if event_session.band
|
||||||
|
event_session.user.biography if event_session.user
|
||||||
|
''
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
%hr{ class:'w60' }
|
||||||
|
.landing-band
|
||||||
|
= event_session_img(event_session)
|
||||||
|
%br
|
||||||
|
%br
|
||||||
|
%span= event_session_title(event_session)
|
||||||
|
|
||||||
|
.landing-details
|
||||||
|
.left.f20.teal
|
||||||
|
%strong
|
||||||
|
= event_session_start_hour(event_session)
|
||||||
|
.right
|
||||||
|
= event_session_button(event_session)
|
||||||
|
%br{ clear:'all' }
|
||||||
|
%br
|
||||||
|
.left
|
||||||
|
= event_session_description(event_session)
|
||||||
|
%br
|
||||||
|
%br
|
||||||
|
|
@ -1,14 +1,15 @@
|
||||||
- provide(:title, @event.title)
|
- provide(:title, @event.title)
|
||||||
|
|
||||||
.landing-content
|
.landing-content
|
||||||
%h1 Virtual Jam Fest 2014
|
%h1= @event.title
|
||||||
%p.w60
|
%p.w60= @event.description
|
||||||
= @event.description
|
|
||||||
%br
|
%br
|
||||||
%br
|
%br
|
||||||
%h2 ARTIST LINEUP
|
%h2 ARTIST LINEUP
|
||||||
%br
|
%br
|
||||||
|
|
||||||
|
= render :partial => "event_session", :collection => @event.event_sessions
|
||||||
|
|
||||||
%br{clear:'all'}
|
%br{clear:'all'}
|
||||||
|
|
||||||
.landing-sidebar
|
.landing-sidebar
|
||||||
Loading…
Reference in New Issue