Added paper_trail, also starting work on the scheduler

This commit is contained in:
Matt Barringer 2013-01-07 16:45:48 +01:00
parent 90b30db9e8
commit f86232bedf
35 changed files with 523 additions and 32137 deletions

View file

@ -30,8 +30,10 @@ gem "haml"
gem 'bcrypt-ruby', '~> 3.0.0' gem 'bcrypt-ruby', '~> 3.0.0'
gem 'node' gem 'node'
gem 'twitter-bootstrap-rails' gem 'twitter-bootstrap-rails'
gem 'paper_trail'
gem 'formtastic-bootstrap' gem 'formtastic-bootstrap'
gem 'cocoon' gem 'cocoon'
gem 'therubyracer'
gem 'transitions', :require => ["transitions", "active_record/transitions"] gem 'transitions', :require => ["transitions", "active_record/transitions"]
gem 'acts_as_commentable_with_threading' gem 'acts_as_commentable_with_threading'
gem 'prawn' gem 'prawn'

View file

@ -75,6 +75,7 @@ GEM
thor (>= 0.14, < 2.0) thor (>= 0.14, < 2.0)
jquery_datepicker (0.4) jquery_datepicker (0.4)
json (1.7.5) json (1.7.5)
libv8 (3.11.8.11)
mail (2.4.4) mail (2.4.4)
i18n (>= 0.4.0) i18n (>= 0.4.0)
mime-types (~> 1.16) mime-types (~> 1.16)
@ -84,6 +85,9 @@ GEM
node (0.0.2) node (0.0.2)
eventmachine eventmachine
orm_adapter (0.4.0) orm_adapter (0.4.0)
paper_trail (2.7.0)
activerecord (~> 3.0)
railties (~> 3.0)
paperclip (3.4.0) paperclip (3.4.0)
activemodel (>= 3.0.0) activemodel (>= 3.0.0)
activerecord (>= 3.0.0) activerecord (>= 3.0.0)
@ -126,6 +130,7 @@ GEM
rake (10.0.3) rake (10.0.3)
rdoc (3.12) rdoc (3.12)
json (~> 1.4) json (~> 1.4)
ref (1.0.2)
ruby-rc4 (0.1.5) ruby-rc4 (0.1.5)
sass (3.2.4) sass (3.2.4)
sass-rails (3.2.5) sass-rails (3.2.5)
@ -138,6 +143,9 @@ GEM
rack (~> 1.0) rack (~> 1.0)
tilt (~> 1.1, != 1.3.0) tilt (~> 1.1, != 1.3.0)
sqlite3 (1.3.6) sqlite3 (1.3.6)
therubyracer (0.11.1)
libv8 (~> 3.11.8.7)
ref
thor (0.16.0) thor (0.16.0)
tilt (1.3.3) tilt (1.3.3)
transitions (0.1.4) transitions (0.1.4)
@ -172,12 +180,14 @@ DEPENDENCIES
jquery-rails jquery-rails
jquery_datepicker jquery_datepicker
node node
paper_trail
paperclip (~> 3.0) paperclip (~> 3.0)
prawn prawn
prawn_rails prawn_rails
rails (= 3.2.9) rails (= 3.2.9)
sass-rails (~> 3.2.3) sass-rails (~> 3.2.3)
sqlite3 sqlite3
therubyracer
transitions transitions
twitter-bootstrap-rails twitter-bootstrap-rails
uglifier (>= 1.0.3) uglifier (>= 1.0.3)

View file

@ -47,6 +47,21 @@ $(function() {
} }
}); });
$("#conference-reg-start-datepicker").datepicker({
dateFormat: 'yy/mm/dd',
numberOfMonths: 2,
onSelect: function(selected) {
$("#conference-reg-end-datepicker").datepicker("option","minDate", selected)
}
});
$("#conference-reg-end-datepicker").datepicker({
dateFormat: 'yy/mm/dd',
numberOfMonths: 2,
onSelect: function(selected) {
$("#conference-reg-start-datepicker").datepicker("option","maxDate", selected)
}
});
$(".comment-reply-link").click(function(){ $(".comment-reply-link").click(function(){
$(".comment-reply", $(this).parent()).toggle(); $(".comment-reply", $(this).parent()).toggle();
return false; return false;

View file

@ -2,6 +2,7 @@
*= require formtastic-bootstrap *= require formtastic-bootstrap
*= require bootstrap_and_overrides *= require bootstrap_and_overrides
*= require osem *= require osem
*= require schedule
*= require jquery-ui-1.9.2.custom *= require jquery-ui-1.9.2.custom
*= require jquery.fileupload-ui *= require jquery.fileupload-ui
*/ */

View file

@ -100,3 +100,4 @@ textarea {
position:relative; position:relative;
top:1px; top:1px;
} }

View file

@ -0,0 +1,45 @@
.schedule-content {
overflow: hidden;
width: 100%;
}
.unscheduled {
float:left;
border:1px solid #bbb;
padding-left:10px;
padding-right: 10px;
margin-right:20px;
margin-left:20px;
width:149px;
height:100%;
position:relative;
}
.schedule {
overflow: hidden;
}
.schedule-track-column-header {
position: absolute;
width: 149px;
}
.schedule-track-column {
float:left;
border-right:1px solid #bbb;
width:149px;
height:400px;
position:relative;
}
.schedule-event {
position:absolute;
cursor:move;
width:141px;
height:32px;
background: #6af;
color:#fff;
padding:4px;
font-weight:bold;
z-index:1;
}

View file

@ -0,0 +1,13 @@
class Admin::ScheduleController < ApplicationController
before_filter :verify_organizer
layout "schedule"
def show
@dates = @conference.start_date..@conference.end_date
@tracks = @conference.tracks
end
def update
end
end

View file

@ -71,7 +71,8 @@ class EventAttachmentsController < ApplicationController
end end
def update def update
@upload = EventAttachment.find(params[:proposal_id]) @proposal = current_user.person.events.find(params[:proposal_id])
@upload = @proposal.event_attachments.find(params[:proposal_id])
respond_to do |format| respond_to do |format|
if @upload.update_attributes(params[:upload]) if @upload.update_attributes(params[:upload])

View file

@ -25,7 +25,7 @@ class ProposalController < ApplicationController
@event = @person.events.find_by_id(params[:id]) @event = @person.events.find_by_id(params[:id])
@attachments = @event.event_attachments @attachments = @event.event_attachments
if @event.nil? if @event.nil? || !@conference.cfp_open?
redirect_to(conference_proposal_index_path(:conference_id => @conference.short_title), :alert => 'Invalid proposal.') redirect_to(conference_proposal_index_path(:conference_id => @conference.short_title), :alert => 'Invalid proposal.')
end end
end end

View file

@ -1,7 +1,9 @@
class Conference < ActiveRecord::Base class Conference < ActiveRecord::Base
attr_accessible :title, :short_title, :social_tag, :contact_email, :timezone, :html_export_path, attr_accessible :title, :short_title, :social_tag, :contact_email, :timezone, :html_export_path,
:start_date, :end_date, :rooms_attributes, :tracks_attributes, :cfp_open, :registration_open, :start_date, :end_date, :rooms_attributes, :tracks_attributes,
:event_types_attributes :event_types_attributes, :registration_start_date, :registration_end_date
has_paper_trail
has_one :call_for_papers, :dependent => :destroy has_one :call_for_papers, :dependent => :destroy
has_many :events, :dependent => :destroy has_many :events, :dependent => :destroy
@ -61,6 +63,15 @@ class Conference < ActiveRecord::Base
end end
end end
def registration_open?
today = Date.current
if self.registration_start_date.nil? || self.registration_end_date.nil?
false
end
(registration_start_date..registration_end_date).cover?(today)
end
def cfp_open? def cfp_open?
today = Date.current today = Date.current
cfp = self.call_for_papers cfp = self.call_for_papers

View file

@ -1,6 +1,6 @@
class Event < ActiveRecord::Base class Event < ActiveRecord::Base
include ActiveRecord::Transitions include ActiveRecord::Transitions
has_paper_trail
attr_accessible :title, :subtitle, :abstract, :description, :event_type_id, :people_attributes, :person, attr_accessible :title, :subtitle, :abstract, :description, :event_type_id, :people_attributes, :person,
:proposal_additional_speakers :proposal_additional_speakers
acts_as_commentable acts_as_commentable

View file

@ -1,4 +1,6 @@
class EventAttachment < ActiveRecord::Base class EventAttachment < ActiveRecord::Base
has_paper_trail
belongs_to :event belongs_to :event
scope :public, where(:public => true) scope :public, where(:public => true)
attr_accessible :public, :attachment, :event_id, :title attr_accessible :public, :attachment, :event_id, :title

View file

@ -32,8 +32,9 @@ class Person < ActiveRecord::Base
:person_id => self.id).count :person_id => self.id).count
end end
def proposals conference def proposals conference
self.events.where("conference_id = ? AND state != ? AND state != ?", conference.id, "withdrawn", "rejected") self.events.where("conference_id = ? AND state != ? AND state != ? AND event_people.event_role=?", conference.id, "withdrawn", "rejected", "submitter")
end end
def proposal_count conference def proposal_count conference
@ -48,6 +49,10 @@ class Person < ActiveRecord::Base
end end
end end
def self.find_person_by_user_id user_id
Person.where(:user_id => user_id).first
end
private private
def biography_limit def biography_limit
if self.biography.split.size > 150 if self.biography.split.size > 150

View file

@ -11,7 +11,7 @@
= f.input :timezone, :as => :time_zone, :hint => "The conference time zone" = f.input :timezone, :as => :time_zone, :hint => "The conference time zone"
= f.input :start_date, :as => :string, :input_html => { :id => "conference-start-datepicker", :readonly => "readonly" } = f.input :start_date, :as => :string, :input_html => { :id => "conference-start-datepicker", :readonly => "readonly" }
= f.input :end_date, :as => :string, :input_html => { :id => "conference-end-datepicker", :readonly => "readonly" } = f.input :end_date, :as => :string, :input_html => { :id => "conference-end-datepicker", :readonly => "readonly" }
= f.input :registration_start_date, :as => :string, :input_html => { :id => "conference-reg-start-datepicker", :readonly => "readonly" }
= f.input :registration_end_date, :as => :string, :input_html => { :id => "conference-reg-end-datepicker", :readonly => "readonly" }
= f.input :html_export_path, :hint => "The path for static HTML exports" = f.input :html_export_path, :hint => "The path for static HTML exports"
= f.input :cfp_open, :label => false, :hint => "Allow people to submit papers?"
= f.input :registration_open, :label => false, :hint => "Allow people to register as attendees?"
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"} = f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}

View file

@ -0,0 +1,112 @@
.row-fluid
.span10
%h3
= @event.title
%i= @event.subtitle
.span2
= link_to "Edit Submission", edit_admin_conference_event_path(@conference.short_title, @event),
:class => "btn btn-mini btn-primary pull-right", :style => "margin-top:20px;"
.row-fluid
.span12
%table.table
%tr
%td
%b State
%td
.dropdown
= link_to "#", :class => "dropdown-toggle" do
= @event.state.humanize
<b class="caret"></b>
%ul.dropdown-menu
- if @event.transition_possible? :accept
%li= link_to "Accept event (no email)", update_state_admin_conference_event_path(@conference.short_title, @event, :transition => :accept, :send_mail => false),
:method => :put, :hint => "Accept this event without sending an automated email."
- if @event.transition_possible? :reject
%li= link_to "Reject event (no email)", update_state_admin_conference_event_path(@conference.short_title, @event, :transition => :reject, :send_mail => false),
:method => :put, :confirm => "Are you sure?",
:hint => "Reject this event without sending an automated email."
- if @event.transition_possible? :start_review
%li= link_to "Start review", update_state_admin_conference_event_path(@conference.short_title, @event, :transition => :start_review),
:method => :put
- if @event.transition_possible? :confirm
%li= link_to "Confirm event", update_state_admin_conference_event_path(@conference.short_title, @event, :transition => :confirm),
:method => :put, :hint => "Confirm that the speaker(s) will be present and that the event will actually take place."
- if @event.transition_possible? :cancel
%li= link_to "Cancel event", update_state_admin_conference_event_path(@conference.short_title, @event, :transition => :cancel),
:method => :put, :hint => "Mark this event as cancelled. Usually this means that the speakers had to cancel their appearance."
%tr
%td
%b Submitter
%td
= link_to @event.submitter.public_name, admin_person_path(@conference.short_title, @event.submitter)
(
= link_to @event.submitter.email, "mailto: #{@event.submitter.email}"
)
%tr
%td
%b Biography
%td
= simple_format(@event.submitter.biography)
%tr
%td
%b Submitted on
%td= @event.created_at
%tr
%td
%b Last updated on
%td= @event.updated_at
%tr
%td
%b Abstract
%td= simple_format(@event.abstract)
%tr
%td
%b Description
%td= simple_format(@event.description)
- if @event.event_attachments.size > 0
%table.table
%thead
%th
%b Filename
%th
%b Title
%th
%b Size
%th
%b Public?
%th
%tbody
- @event.event_attachments.each do |a|
%tr
%td
= link_to a.attachment_file_name, conference_proposal_event_attachment_path(@conference.short_title, @event.id, a.id)
%td
= a.title
%td
= number_to_human_size a.attachment_file_size
%td
- if a.public?
Public
- else
Not Public
%td
= link_to "Delete", conference_proposal_event_attachment_path(@conference.short_title, @event.id, a.id),
:method => :delete, :confirm => "Are you sure you want to delete this attachment? It's permanant!"
.row-fluid
= link_to "Comments (#{@comment_count})", "#", :id => "event-comment-link"
#comments-div
%hr
%ul.media
%div
.row-fluid
= form_tag(comment_admin_conference_event_path(@conference.short_title, @event.id), :method => :post) do
= text_area_tag(:comment, "")
= submit_tag "Add Comment", :class => "btn btn-primary pull-right"
%br
- @comments.each do |comment|
%div
= raw format_comments(comment)

View file

@ -1,112 +1,38 @@
.row-fluid .tabbable
.span10 %ul.nav.nav-tabs
%h3 %li.active
= @event.title = link_to "Proposal", "#proposal-content", "data-toggle"=>"tab"
%i= @event.subtitle %li
= link_to "History", "#history-content", "data-toggle"=>"tab"
.tab-content
#proposal-content.tab-pane.active
= render 'proposal'
#history-content.tab-pane
.span12
%table.table
%thead
%th
%b Who
%th
%b Timestamp
%th
%b Modification Type
%th
%b Changes
%tbody
- @event.versions.each do |version|
%tr
%td
- if !version.whodunnit.nil?
= Person.find_person_by_user_id(version.whodunnit).public_name
- else
No user (probably via the console)
%td
= version.created_at
%td
= version.event
%td
- version.changeset.each_key do |key|
= "#{key}: #{version.changeset[key][0]} -> #{version.changeset[key][1]}"
%br
.span2
= link_to "Edit Submission", edit_admin_conference_event_path(@conference.short_title, @event),
:class => "btn btn-mini btn-primary pull-right", :style => "margin-top:20px;"
.row-fluid
.span12
%table.table
%tr
%td
%b State
%td
.dropdown
= link_to "#", :class => "dropdown-toggle" do
= @event.state.humanize
<b class="caret"></b>
%ul.dropdown-menu
- if @event.transition_possible? :accept
%li= link_to "Accept event (no email)", update_state_admin_conference_event_path(@conference.short_title, @event, :transition => :accept, :send_mail => false),
:method => :put, :hint => "Accept this event without sending an automated email."
- if @event.transition_possible? :reject
%li= link_to "Reject event (no email)", update_state_admin_conference_event_path(@conference.short_title, @event, :transition => :reject, :send_mail => false),
:method => :put, :confirm => "Are you sure?",
:hint => "Reject this event without sending an automated email."
- if @event.transition_possible? :start_review
%li= link_to "Start review", update_state_admin_conference_event_path(@conference.short_title, @event, :transition => :start_review),
:method => :put
- if @event.transition_possible? :confirm
%li= link_to "Confirm event", update_state_admin_conference_event_path(@conference.short_title, @event, :transition => :confirm),
:method => :put, :hint => "Confirm that the speaker(s) will be present and that the event will actually take place."
- if @event.transition_possible? :cancel
%li= link_to "Cancel event", update_state_admin_conference_event_path(@conference.short_title, @event, :transition => :cancel),
:method => :put, :hint => "Mark this event as cancelled. Usually this means that the speakers had to cancel their appearance."
%tr
%td
%b Submitter
%td
= link_to @event.submitter.public_name, admin_person_path(@conference.short_title, @event.submitter)
(
= link_to @event.submitter.email, "mailto: #{@event.submitter.email}"
)
%tr
%td
%b Biography
%td
= simple_format(@event.submitter.biography)
%tr
%td
%b Submitted on
%td= @event.created_at
%tr
%td
%b Last updated on
%td= @event.updated_at
%tr
%td
%b Abstract
%td= simple_format(@event.abstract)
%tr
%td
%b Description
%td= simple_format(@event.description)
- if @event.event_attachments.size > 0
%table.table
%thead
%th
%b Filename
%th
%b Title
%th
%b Size
%th
%b Public?
%th
%tbody
- @event.event_attachments.each do |a|
%tr
%td
= link_to a.attachment_file_name, conference_proposal_event_attachment_path(@conference.short_title, @event.id, a.id)
%td
= a.title
%td
= number_to_human_size a.attachment_file_size
%td
- if a.public?
Public
- else
Not Public
%td
= link_to "Delete", conference_proposal_event_attachment_path(@conference.short_title, @event.id, a.id),
:method => :delete, :confirm => "Are you sure you want to delete this attachment? It's permanant!"
.row-fluid
= link_to "Comments (#{@comment_count})", "#", :id => "event-comment-link"
#comments-div
%hr
%ul.media
%div
.row-fluid
= form_tag(comment_admin_conference_event_path(@conference.short_title, @event.id), :method => :post) do
= text_area_tag(:comment, "")
= submit_tag "Add Comment", :class => "btn btn-primary pull-right"
%br
- @comments.each do |comment|
%div
= raw format_comments(comment)

View file

@ -0,0 +1,4 @@
- @tracks.each do |track|
.schedule-track-column-header
= track.name
.schedule-track-column

View file

@ -0,0 +1,43 @@
.schedule-content
.unscheduled
Unscheduled Events
#test1.schedule-event
Test
#test2.schedule-event
Test2
.schedule
.tabbable
%ul.nav.nav-tabs
- @dates.each do |date|
-if date == @dates.first
%li.active
= link_to "#{date}", "##{date}-content", "data-toggle"=>"tab"
- else
%li
= link_to "#{date}", "##{date}-content", "data-toggle"=>"tab"
.tab-content
- @dates.each do |date|
- if date == @dates.first
.tab-pane.active{:id => "#{date}-content"}
= render 'day_tab'
- else
.tab-pane{:id => "#{date}-content"}
= render 'day_tab'
:javascript
$(document).ready( function() {
$('.schedule-track-column').droppable({
accept: '.schedule-event',
drop: function(event, ui) {
var evtName = ui.draggable.text();
var evtDay = $(this).attr('title');
alert('Moved \'' + evtName + '\' to ' + evtDay);
}
});
$('.schedule-event').draggable({
grid: [150,20],
containment: '.schedule-content',
opacity: 0.7,
zIndex: 2
});
});

View file

@ -15,16 +15,19 @@
= conference.venue.address = conference.venue.address
.row-fluid{:style => "padding-top: 30px;"} .row-fluid{:style => "padding-top: 30px;"}
.span4 .span4
- if conference.user_registered?(current_user) - if conference.registration_open?
= link_to "Modify Registration", register_conference_path(conference.short_title), :class => "mainbutton center-text" - if conference.user_registered?(current_user)
%br = link_to "Modify Registration", register_conference_path(conference.short_title), :class => "mainbutton center-text"
%i.icon-thumbs-up You're attending! %br
%i.icon-thumbs-up You're attending!
- else
= link_to "Register", register_conference_path(conference.short_title), :class => "mainbutton center-text"
%br
- if !current_user.nil?
%i.icon-thumbs-down
You haven't registered yet!
- else - else
= link_to "Register", register_conference_path(conference.short_title), :class => "mainbutton center-text" %b Registration is closed.
%br
- if !current_user.nil?
%i.icon-thumbs-down
You haven't registered yet!
.span4.offset4.pull-right .span4.offset4.pull-right
- if !current_user.nil? && current_user.person.proposal_count(conference) > 0 - if !current_user.nil? && current_user.person.proposal_count(conference) > 0
= link_to "View My Proposals", conference_proposal_index_path(conference.short_title), :class => "mainbutton center-text" = link_to "View My Proposals", conference_proposal_index_path(conference.short_title), :class => "mainbutton center-text"

View file

@ -16,6 +16,12 @@
- else - else
%li %li
= link_to "Events", admin_conference_events_path(@conference.short_title) = link_to "Events", admin_conference_events_path(@conference.short_title)
- if current_page?(admin_conference_schedule_path(@conference.short_title))
%li.active
= link_to "Schedule", "#"
-else
%li
= link_to "Schedule ", admin_conference_schedule_path(@conference.short_title)
%ul.nav.secondary-nav.pull-right %ul.nav.secondary-nav.pull-right
- if !@conference.nil? - if !@conference.nil?
%li.dropdown %li.dropdown

View file

@ -0,0 +1,22 @@
!!!
%html
%head
%meta{:charset => "utf-8"}
%meta{:name => "viewport", :content => "width=device-width, initial-scale=1, maximum-scale=1"}
%title= content_for?(:title) ? yield(:title) : "OSEM"
%meta{:content => "", :name => "description"}
%meta{:content => "", :name => "author"}
= stylesheet_link_tag "application", :media => "all"
= javascript_include_tag "application"
= csrf_meta_tags
= yield(:head)
%body
.navbar.navbar-fixed-top
.navbar-inner
.container-fluid
= render 'layouts/admin_navigation'
= render 'layouts/messages'
.content
#wrap
#inner-content
= yield

View file

@ -6,40 +6,7 @@
= link_to "Attachments", "#attachment-content", "data-toggle"=>"tab" = link_to "Attachments", "#attachment-content", "data-toggle"=>"tab"
.tab-content .tab-content
#proposal-content.tab-pane.active #proposal-content.tab-pane.active
.span12 = render 'proposal_form'
= semantic_form_for(@event, :url => @url) do |f|
%section#basic
= f.inputs :name => "Basic Information" do
= f.input :title, :required => true
= f.input :subtitle
= f.input :abstract, :input_html => {:rows => 5, "onkeyup" => "word_count(this, 'abstract-count')"}, :required => true
You have used
%span#abstract-count #{@event.abstract_word_count}
words. Abstracts are limited to 250 words.
%br
%br
= f.input :description, :input_html => {:rows => 5}, :hint => "This will only be shown to organizers, not to attendees."
%section#details
= f.inputs :name => "Event Details" do
= f.input :event_type_id,:as => :select, :collection => @event_types, :include_blank => false
%section#information
= f.inputs :name => "Your Information" do
= semantic_fields_for @person do |p|
= p.input :public_name, :required => true
= p.input :company, :label => "Affiliation", :hint => "This could be a company, a user group, or nothing at all."
= p.input :biography, :required => true, :input_html => {:rows => 5, "onkeyup" => "word_count(this, 'biography-count')"}
You have used
%span#biography-count #{@person.biography_word_count}
words. Biographies are limited to 150 words.
%br
%br
%section#speakers
= f.inputs :name => "Additional Speakers" do
Will there be any additional speakers? If so, please enter their full names, email address, and a short
biography for each.
= f.input :proposal_additional_speakers, :input_html => {:rows => 5}, :label => false
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
#attachment-content.tab-pane #attachment-content.tab-pane
.span12 .span12
= form_for EventAttachment.new, :url => conference_proposal_event_attachment_index_path(@conference.short_title, @event), = form_for EventAttachment.new, :url => conference_proposal_event_attachment_index_path(@conference.short_title, @event),

View file

@ -0,0 +1,34 @@
.span12
= semantic_form_for(@event, :url => @url) do |f|
%section#basic
= f.inputs :name => "Basic Information" do
= f.input :title, :required => true
= f.input :subtitle
= f.input :abstract, :input_html => {:rows => 5, "onkeyup" => "word_count(this, 'abstract-count')"}, :required => true
You have used
%span#abstract-count #{@event.abstract_word_count}
words. Abstracts are limited to 250 words.
%br
%br
= f.input :description, :input_html => {:rows => 5}, :hint => "This will only be shown to organizers, not to attendees."
%section#details
= f.inputs :name => "Event Details" do
= f.input :event_type_id,:as => :select, :collection => @event_types, :include_blank => false
%section#information
= f.inputs :name => "Your Information" do
= semantic_fields_for @person do |p|
= p.input :public_name, :required => true
= p.input :company, :label => "Affiliation", :hint => "This could be a company, a user group, or nothing at all."
= p.input :biography, :required => true, :input_html => {:rows => 5, "onkeyup" => "word_count(this, 'biography-count')"}
You have used
%span#biography-count #{@person.biography_word_count}
words. Biographies are limited to 150 words.
%br
%br
%section#speakers
= f.inputs :name => "Additional Speakers" do
Will there be any additional speakers? If so, please enter their full names, email address, and a short
biography for each.
= f.input :proposal_additional_speakers, :input_html => {:rows => 5}, :label => false
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}

View file

@ -13,6 +13,7 @@
.span10 .span10
= event.title = event.title
.pull-right .pull-right
= link_to "Edit", edit_conference_proposal_path(@conference.short_title, event.id), :class => "btn btn-mini btn-primary" - if @conference.cfp_open?
= link_to "Withdraw", conference_proposal_path(@conference.short_title, event.id), :method => :delete, = link_to "Edit", edit_conference_proposal_path(@conference.short_title, event.id), :class => "btn btn-mini btn-primary"
:confirm => "Are you sure you want to withdraw this proposal?", :class => "btn btn-mini btn-danger" = link_to "Withdraw", conference_proposal_path(@conference.short_title, event.id), :method => :delete,
:confirm => "Are you sure you want to withdraw this proposal?", :class => "btn btn-mini btn-danger"

View file

@ -1,2 +1,2 @@
.container .container
= render 'form' = render 'proposal_form'

View file

@ -7,6 +7,8 @@ Osem::Application.routes.draw do
resources :people resources :people
resources :conference do resources :conference do
get "/schedule" => "schedule#show"
put "/schedule" => "schedule#update"
get "/registrations" => "registrations#show" get "/registrations" => "registrations#show"
get "/venue" => "venue#show", :as => "venue_info" get "/venue" => "venue#show", :as => "venue_info"
put "/venue" => "venue#update", :as => "venue_update" put "/venue" => "venue#update", :as => "venue_update"

View file

@ -0,0 +1,6 @@
class AddRegistrationDatesToConferencesTable < ActiveRecord::Migration
def change
add_column :conferences, :registration_start_date, :date
add_column :conferences, :registration_end_date, :date
end
end

View file

@ -0,0 +1,11 @@
class RemoveCfpAndRegBooleansFromConferences < ActiveRecord::Migration
def up
remove_column :conferences, :cfp_open
remove_column :conferences, :registration_open
end
def down
add_column :conferences, :cfp_open, :default => false
add_column :registration_open, :default => false
end
end

View file

@ -0,0 +1,19 @@
class CreateVersions < ActiveRecord::Migration
def self.up
create_table :versions do |t|
t.string :item_type, :null => false
t.integer :item_id, :null => false
t.string :event, :null => false
t.string :whodunnit
t.text :object
t.text :object_changes
t.datetime :created_at
end
add_index :versions, [:item_type, :item_id]
end
def self.down
remove_index :versions, [:item_type, :item_id]
drop_table :versions
end
end

View file

@ -11,7 +11,7 @@
# #
# It's strongly recommended to check this file into your version control system. # It's strongly recommended to check this file into your version control system.
ActiveRecord::Schema.define(:version => 20130105115603) do ActiveRecord::Schema.define(:version => 20130107114930) do
create_table "call_for_papers", :force => true do |t| create_table "call_for_papers", :force => true do |t|
t.date "start_date", :null => false t.date "start_date", :null => false
@ -42,31 +42,32 @@ ActiveRecord::Schema.define(:version => 20130105115603) do
add_index "comments", ["user_id"], :name => "index_comments_on_user_id" add_index "comments", ["user_id"], :name => "index_comments_on_user_id"
create_table "conferences", :force => true do |t| create_table "conferences", :force => true do |t|
t.string "guid", :null => false t.string "guid", :null => false
t.string "title", :null => false t.string "title", :null => false
t.string "short_title", :null => false t.string "short_title", :null => false
t.string "social_tag" t.string "social_tag"
t.string "contact_email", :null => false t.string "contact_email", :null => false
t.string "timezone", :null => false t.string "timezone", :null => false
t.string "html_export_path" t.string "html_export_path"
t.date "start_date", :null => false t.date "start_date", :null => false
t.date "end_date", :null => false t.date "end_date", :null => false
t.boolean "cfp_open", :default => false
t.boolean "registration_open", :default => false
t.integer "venue_id" t.integer "venue_id"
t.datetime "created_at", :null => false t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false t.datetime "updated_at", :null => false
t.date "registration_start_date"
t.date "registration_end_date"
end end
create_table "event_attachments", :force => true do |t| create_table "event_attachments", :force => true do |t|
t.integer "event_id" t.integer "event_id"
t.string "title", :null => false t.string "title", :null => false
t.string "attachment_file_name" t.string "attachment_file_name"
t.string "attachment_content_type" t.string "attachment_content_type"
t.integer "attachment_file_size" t.integer "attachment_file_size"
t.datetime "attachment_updated_at" t.datetime "attachment_updated_at"
t.datetime "created_at", :null => false t.boolean "public", :default => true
t.datetime "updated_at", :null => false t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end end
create_table "event_people", :force => true do |t| create_table "event_people", :force => true do |t|
@ -103,11 +104,11 @@ ActiveRecord::Schema.define(:version => 20130105115603) do
t.string "logo_content_type" t.string "logo_content_type"
t.integer "logo_file_size" t.integer "logo_file_size"
t.datetime "logo_updated_at" t.datetime "logo_updated_at"
t.text "proposal_additional_speakers"
t.integer "track_id" t.integer "track_id"
t.integer "room_id" t.integer "room_id"
t.datetime "created_at", :null => false t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false t.datetime "updated_at", :null => false
t.text "proposal_additional_speakers"
end end
create_table "people", :force => true do |t| create_table "people", :force => true do |t|
@ -136,7 +137,6 @@ ActiveRecord::Schema.define(:version => 20130105115603) do
t.boolean "using_affiliated_lodging", :default => true t.boolean "using_affiliated_lodging", :default => true
t.date "arrival" t.date "arrival"
t.date "departure" t.date "departure"
t.text "additional_speakers"
t.datetime "created_at", :null => false t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false t.datetime "updated_at", :null => false
end end
@ -205,4 +205,15 @@ ActiveRecord::Schema.define(:version => 20130105115603) do
t.datetime "updated_at", :null => false t.datetime "updated_at", :null => false
end end
create_table "versions", :force => true do |t|
t.string "item_type", :null => false
t.integer "item_id", :null => false
t.string "event", :null => false
t.string "whodunnit"
t.text "object"
t.datetime "created_at"
end
add_index "versions", ["item_type", "item_id"], :name => "index_versions_on_item_type_and_item_id"
end end

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

View file

@ -1,53 +1,53 @@
--- ---
rails.png: rails.png rails.png: rails-a3386665c05a2d82f711a4aaa72d247c.png
rails/index.png: rails.png rails/index.png: rails-a3386665c05a2d82f711a4aaa72d247c.png
ui-bg_flat_0_aaaaaa_40x100.png: ui-bg_flat_0_aaaaaa_40x100.png ui-bg_flat_0_aaaaaa_40x100.png: ui-bg_flat_0_aaaaaa_40x100-7d1197a52442bc56fcad60d0390f4b32.png
ui-bg_flat_0_aaaaaa_40x100/index.png: ui-bg_flat_0_aaaaaa_40x100.png ui-bg_flat_0_aaaaaa_40x100/index.png: ui-bg_flat_0_aaaaaa_40x100-7d1197a52442bc56fcad60d0390f4b32.png
ui-bg_flat_55_fbec88_40x100.png: ui-bg_flat_55_fbec88_40x100.png ui-bg_flat_55_fbec88_40x100.png: ui-bg_flat_55_fbec88_40x100-6bd1905222cab173dc4996f12b7a07cb.png
ui-bg_flat_55_fbec88_40x100/index.png: ui-bg_flat_55_fbec88_40x100.png ui-bg_flat_55_fbec88_40x100/index.png: ui-bg_flat_55_fbec88_40x100-6bd1905222cab173dc4996f12b7a07cb.png
ui-bg_glass_75_d0e5f5_1x400.png: ui-bg_glass_75_d0e5f5_1x400.png ui-bg_glass_75_d0e5f5_1x400.png: ui-bg_glass_75_d0e5f5_1x400-d4e12d9ce6e2b20ae0aadf27c8dcd12c.png
ui-bg_glass_75_d0e5f5_1x400/index.png: ui-bg_glass_75_d0e5f5_1x400.png ui-bg_glass_75_d0e5f5_1x400/index.png: ui-bg_glass_75_d0e5f5_1x400-d4e12d9ce6e2b20ae0aadf27c8dcd12c.png
ui-bg_glass_85_dfeffc_1x400.png: ui-bg_glass_85_dfeffc_1x400.png ui-bg_glass_85_dfeffc_1x400.png: ui-bg_glass_85_dfeffc_1x400-d1dabcb9501a4ed8c9bfc1b19c966022.png
ui-bg_glass_85_dfeffc_1x400/index.png: ui-bg_glass_85_dfeffc_1x400.png ui-bg_glass_85_dfeffc_1x400/index.png: ui-bg_glass_85_dfeffc_1x400-d1dabcb9501a4ed8c9bfc1b19c966022.png
ui-bg_glass_95_fef1ec_1x400.png: ui-bg_glass_95_fef1ec_1x400.png ui-bg_glass_95_fef1ec_1x400.png: ui-bg_glass_95_fef1ec_1x400-ab58fbcd66af992f067fcbc7c6488996.png
ui-bg_glass_95_fef1ec_1x400/index.png: ui-bg_glass_95_fef1ec_1x400.png ui-bg_glass_95_fef1ec_1x400/index.png: ui-bg_glass_95_fef1ec_1x400-ab58fbcd66af992f067fcbc7c6488996.png
ui-bg_gloss-wave_55_5c9ccc_500x100.png: ui-bg_gloss-wave_55_5c9ccc_500x100.png ui-bg_gloss-wave_55_5c9ccc_500x100.png: ui-bg_gloss-wave_55_5c9ccc_500x100-b9ac529234515ff4971dee7e7281c14b.png
ui-bg_gloss-wave_55_5c9ccc_500x100/index.png: ui-bg_gloss-wave_55_5c9ccc_500x100.png ui-bg_gloss-wave_55_5c9ccc_500x100/index.png: ui-bg_gloss-wave_55_5c9ccc_500x100-b9ac529234515ff4971dee7e7281c14b.png
ui-bg_inset-hard_100_f5f8f9_1x100.png: ui-bg_inset-hard_100_f5f8f9_1x100.png ui-bg_inset-hard_100_f5f8f9_1x100.png: ui-bg_inset-hard_100_f5f8f9_1x100-ad5cffb7206618b1667599d7c6c24e00.png
ui-bg_inset-hard_100_f5f8f9_1x100/index.png: ui-bg_inset-hard_100_f5f8f9_1x100.png ui-bg_inset-hard_100_f5f8f9_1x100/index.png: ui-bg_inset-hard_100_f5f8f9_1x100-ad5cffb7206618b1667599d7c6c24e00.png
ui-bg_inset-hard_100_fcfdfd_1x100.png: ui-bg_inset-hard_100_fcfdfd_1x100.png ui-bg_inset-hard_100_fcfdfd_1x100.png: ui-bg_inset-hard_100_fcfdfd_1x100-9f0c2e70b06a9eaec77d569b25b04d7e.png
ui-bg_inset-hard_100_fcfdfd_1x100/index.png: ui-bg_inset-hard_100_fcfdfd_1x100.png ui-bg_inset-hard_100_fcfdfd_1x100/index.png: ui-bg_inset-hard_100_fcfdfd_1x100-9f0c2e70b06a9eaec77d569b25b04d7e.png
ui-icons_217bc0_256x240.png: ui-icons_217bc0_256x240.png ui-icons_217bc0_256x240.png: ui-icons_217bc0_256x240-2f9a30594e6475d5f34e3e43d6447b41.png
ui-icons_217bc0_256x240/index.png: ui-icons_217bc0_256x240.png ui-icons_217bc0_256x240/index.png: ui-icons_217bc0_256x240-2f9a30594e6475d5f34e3e43d6447b41.png
ui-icons_2e83ff_256x240.png: ui-icons_2e83ff_256x240.png ui-icons_2e83ff_256x240.png: ui-icons_2e83ff_256x240-2ea4c160a75c1992daa2eeac86255b99.png
ui-icons_2e83ff_256x240/index.png: ui-icons_2e83ff_256x240.png ui-icons_2e83ff_256x240/index.png: ui-icons_2e83ff_256x240-2ea4c160a75c1992daa2eeac86255b99.png
ui-icons_469bdd_256x240.png: ui-icons_469bdd_256x240.png ui-icons_469bdd_256x240.png: ui-icons_469bdd_256x240-232cd1e8416c1a5e7bbc316084708d2c.png
ui-icons_469bdd_256x240/index.png: ui-icons_469bdd_256x240.png ui-icons_469bdd_256x240/index.png: ui-icons_469bdd_256x240-232cd1e8416c1a5e7bbc316084708d2c.png
ui-icons_6da8d5_256x240.png: ui-icons_6da8d5_256x240.png ui-icons_6da8d5_256x240.png: ui-icons_6da8d5_256x240-d155be4d851213e810cb13fc5e009fbf.png
ui-icons_6da8d5_256x240/index.png: ui-icons_6da8d5_256x240.png ui-icons_6da8d5_256x240/index.png: ui-icons_6da8d5_256x240-d155be4d851213e810cb13fc5e009fbf.png
ui-icons_cd0a0a_256x240.png: ui-icons_cd0a0a_256x240.png ui-icons_cd0a0a_256x240.png: ui-icons_cd0a0a_256x240-c0c1ec6a8bcf48fec40303e975a4dfa6.png
ui-icons_cd0a0a_256x240/index.png: ui-icons_cd0a0a_256x240.png ui-icons_cd0a0a_256x240/index.png: ui-icons_cd0a0a_256x240-c0c1ec6a8bcf48fec40303e975a4dfa6.png
ui-icons_d8e7f3_256x240.png: ui-icons_d8e7f3_256x240.png ui-icons_d8e7f3_256x240.png: ui-icons_d8e7f3_256x240-e5dd5fb46ca349d167fbabdcb57e8f7c.png
ui-icons_d8e7f3_256x240/index.png: ui-icons_d8e7f3_256x240.png ui-icons_d8e7f3_256x240/index.png: ui-icons_d8e7f3_256x240-e5dd5fb46ca349d167fbabdcb57e8f7c.png
ui-icons_f9bd01_256x240.png: ui-icons_f9bd01_256x240.png ui-icons_f9bd01_256x240.png: ui-icons_f9bd01_256x240-08305efda447dd00f0eaf5e34994bc92.png
ui-icons_f9bd01_256x240/index.png: ui-icons_f9bd01_256x240.png ui-icons_f9bd01_256x240/index.png: ui-icons_f9bd01_256x240-08305efda447dd00f0eaf5e34994bc92.png
application.js: application.js application.js: application-9016673953cb4aa8c7ea06dc4da2482a.js
application/index.js: application.js application/index.js: application-9016673953cb4aa8c7ea06dc4da2482a.js
application.css: application.css application.css: application-35f07b325acce0c59f42ac76f4921a19.css
application/index.css: application.css application/index.css: application-35f07b325acce0c59f42ac76f4921a19.css
fontawesome-webfont.eot: fontawesome-webfont.eot fontawesome-webfont.eot: fontawesome-webfont-86a6da438b901860c3a54e21f9098bf8.eot
fontawesome-webfont/index.eot: fontawesome-webfont.eot fontawesome-webfont/index.eot: fontawesome-webfont-86a6da438b901860c3a54e21f9098bf8.eot
fontawesome-webfont.svg: fontawesome-webfont.svg fontawesome-webfont.svg: fontawesome-webfont-c3f3594758768fbb43eae746d18b3b50.svg
fontawesome-webfont/index.svg: fontawesome-webfont.svg fontawesome-webfont/index.svg: fontawesome-webfont-c3f3594758768fbb43eae746d18b3b50.svg
fontawesome-webfont.ttf: fontawesome-webfont.ttf fontawesome-webfont.ttf: fontawesome-webfont-89ca9bd89cea7c74302ae94f18d4ec3e.ttf
fontawesome-webfont/index.ttf: fontawesome-webfont.ttf fontawesome-webfont/index.ttf: fontawesome-webfont-89ca9bd89cea7c74302ae94f18d4ec3e.ttf
fontawesome-webfont.woff: fontawesome-webfont.woff fontawesome-webfont.woff: fontawesome-webfont-8255009c90d86ee3458a13f5db9a6ed0.woff
fontawesome-webfont/index.woff: fontawesome-webfont.woff fontawesome-webfont/index.woff: fontawesome-webfont-8255009c90d86ee3458a13f5db9a6ed0.woff
twitter/bootstrap/glyphicons-halflings-white.png: twitter/bootstrap/glyphicons-halflings-white.png twitter/bootstrap/glyphicons-halflings-white.png: twitter/bootstrap/glyphicons-halflings-white-6cccd17a7aed91dbc0157d343c68c0d9.png
twitter/bootstrap/glyphicons-halflings-white/index.png: twitter/bootstrap/glyphicons-halflings-white.png twitter/bootstrap/glyphicons-halflings-white/index.png: twitter/bootstrap/glyphicons-halflings-white-6cccd17a7aed91dbc0157d343c68c0d9.png
twitter/bootstrap/glyphicons-halflings.png: twitter/bootstrap/glyphicons-halflings.png twitter/bootstrap/glyphicons-halflings.png: twitter/bootstrap/glyphicons-halflings-2851b489e8c39f8fad44fc10efb99c3e.png
twitter/bootstrap/glyphicons-halflings/index.png: twitter/bootstrap/glyphicons-halflings.png twitter/bootstrap/glyphicons-halflings/index.png: twitter/bootstrap/glyphicons-halflings-2851b489e8c39f8fad44fc10efb99c3e.png
loading.gif: loading.gif loading.gif: loading-b7ff30d20adcf2b850f420d17048930c.gif
loading/index.gif: loading.gif loading/index.gif: loading-b7ff30d20adcf2b850f420d17048930c.gif
progressbar.gif: progressbar.gif progressbar.gif: progressbar-bc538af0ba6ff3d792217a96651cd58a.gif
progressbar/index.gif: progressbar.gif progressbar/index.gif: progressbar-bc538af0ba6ff3d792217a96651cd58a.gif