* working on event page

This commit is contained in:
Seth Call 2014-03-10 06:31:20 +00:00
parent 3c5a14312a
commit b9ee475db5
17 changed files with 226 additions and 17 deletions

View File

@ -0,0 +1,3 @@
ActiveAdmin.register JamRuby::EventSession, :as => 'Event Session' do
menu :parent => 'Events'
end

View File

@ -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
); );

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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