This commit is contained in:
nasia-sam 2017-06-23 08:02:49 +00:00 committed by GitHub
commit 5a178b8dad
32 changed files with 781 additions and 2 deletions

View file

@ -0,0 +1,82 @@
module Admin
class Admin::BoothsController < Admin::BaseController
load_and_authorize_resource :conference, find_by: :short_title
load_and_authorize_resource :booth, through: :conference
def index
@booths = @conference.booths
end
def show; end
def new
@booth = Booth.new(conference: @conference)
end
def create
@booth = @conference.booths.build(booth_params)
if @booth.save
redirect_to admin_conference_booths_path,
notice: "Booth successfully created."
else
flash[:error] = "Creating booth failed. #{@booth.errors.full_messages.join('. ')}."
render :new
end
end
def edit; end
def update
@booth = @conference.booths
@booth.assign_attributes(booth_params)
if @booth.update_attributes(booth_params)
redirect_to admin_conference_booths_path,
notice: "Successfully updated booth for #{@booth.title}."
else
flash[:error] = "An error prohibited the Booth for #{@booth.title} "\
"#{@booth.errors.full_messages.join('. ')}."
render :edit
end
end
def destroy; end
def accept
update_state(:accept, 'Booth accepted!')
end
def to_accept
update_state(:to_accept, 'Booth to accept')
end
def reject
update_state(:rejected, 'Booth rejected')
end
def reset
update_state(:reset, 'Booth is submitted')
end
private
def update_state(transition, notice)
alert = @booth.update_state(transition, notice)
if alert.blank?
flash[:notice] = notice
redirect_back_or_to(admin_conference_booths_path(conference_id: @conference.short_title)) && return
else
flash[:error] = alert
return redirect_back_or_to(admin_conference_booths_path(conference_id: @conference.short_title)) && return
end
end
def booth_params
params.require(:booth).permit(:title, :description, :reasoning, :state, :logo_link, :conference_id)
end
end
end

View file

@ -0,0 +1,55 @@
module Admin
class CallForBoothsController < Admin::BaseController
load_and_authorize_resource :conference, find_by: :short_title
load_and_authorize_resource through: :conference, singleton: true
def show; end
def new
@call_for_booth = CallForBooth.new(conference: @conference)
end
def edit; end
def create
@call_for_booth = @conference.call_for_booth.build(call_for_booth_params)
if @call_for_booth.save
redirect_to admin_conference_call_for_booth_path,
notice: "Call for booths successfully created."
else
flash[:error] = "Creating the call for booths failed. #{@call_for_booth.errors.full_messages.join('. ')}."
render :new
end
end
def update
@call_for_booth = @conference.call_for_booth
@call_for_booth.assign_attributes(call_for_booth_params)
if @call_for_booth.update_attributes(call_for_booth_params)
redirect_to admin_conference_call_for_booth_path(@conference.short_title),
notice: 'Call for booths successfully updated.'
else
flash.now[:error] = "Updating call for booths failed. #{@call_for_booth.errors.to_a.join('. ')}."
render :new
end
end
def destroy
if @call_for_booth.destroy
redirect_to admin_conference_call_for_booth_path, notice: 'Call for Booths successfully deleted.'
else
redirect_to admin_conference_call_for_booth_path, error: 'An error prohibited this Call for Booths from being destroyed: '\
"#{@call_for_booth.errors.full_messages.join('. ')}."
end
end
private
def call_for_booth_params
params.require(:call_for_booth).permit(:start_date, :end_date, :booth_limit)
end
end
end

View file

@ -0,0 +1,71 @@
class BoothsController < ApplicationController
before_action :set_booth, only: [:show, :edit, :update, :destroy]
# GET /booths
def index
@booths = Booth.all
respond_to do |format|
format.html # index.html.erb
end
end
# GET /booths/1
def show
respond_to do |format|
format.html # show.html.erb
end
end
# GET /booths/new
def new
@booth = Booth.new
end
# GET /booths/1/edit
def edit
end
# POST /booths
def create
@booth = Booth.new(booth_params)
respond_to do |format|
if @booth.save
format.html { redirect_to @booth, notice: 'Booth was successfully created.' }
else
format.html { render action: 'new' }
end
end
end
# PATCH/PUT /booths/1
def update
respond_to do |format|
if @booth.update(booth_params)
format.html { redirect_to @booth, notice: 'Booth was successfully updated.' }
else
format.html { render action: 'edit' }
end
end
end
# DELETE /booths/1
def destroy
@booth.destroy
respond_to do |format|
format.html { redirect_to booths_url }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_booth
@booth = Booth.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def booth_params
params.require(:booth).permit(:title, :conference_id, :description, :state, :reasoning, :logo_link)
end
end

View file

@ -0,0 +1,83 @@
class CallForBoothsController < ApplicationController
before_action :set_call_for_booth, only: [:show, :edit, :update, :destroy]
# GET /call_for_booths
# GET /call_for_booths.json
def index
@call_for_booths = CallForBooth.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @call_for_booths }
end
end
# GET /call_for_booths/1
# GET /call_for_booths/1.json
def show
respond_to do |format|
format.html # show.html.erb
format.json { render json: @call_for_booth }
end
end
# GET /call_for_booths/new
def new
@call_for_booth = CallForBooth.new
end
# GET /call_for_booths/1/edit
def edit
end
# POST /call_for_booths
# POST /call_for_booths.json
def create
@call_for_booth = CallForBooth.new(call_for_booth_params)
respond_to do |format|
if @call_for_booth.save
format.html { redirect_to @call_for_booth, notice: 'Call for booth was successfully created.' }
format.json { render json: @call_for_booth, status: :created }
else
format.html { render action: 'new' }
format.json { render json: @call_for_booth.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /call_for_booths/1
# PATCH/PUT /call_for_booths/1.json
def update
respond_to do |format|
if @call_for_booth.update(call_for_booth_params)
format.html { redirect_to @call_for_booth, notice: 'Call for booth was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @call_for_booth.errors, status: :unprocessable_entity }
end
end
end
# DELETE /call_for_booths/1
# DELETE /call_for_booths/1.json
def destroy
@call_for_booth.destroy
respond_to do |format|
format.html { redirect_to call_for_booths_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_call_for_booth
@call_for_booth = CallForBooth.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def call_for_booth_params
params.require(:call_for_booth).permit(:start_date, :end_date, :booth_limit)
end
end

49
app/models/booth.rb Normal file
View file

@ -0,0 +1,49 @@
class Booth < ActiveRecord::Base
include ActiveRecord::Transitions
belongs_to :conference
has_many :booth_requests
has_many :users, through: :booth_requests
validates :title,
uniqueness: { case_sensitive: false },
presence: true
validates :description,
:reasoning,
:state,
:logo_link,
:conference_id,
presence: true
state_machine initial: :submitted do
state :submitted
state :withdrawn
state :to_accept
state :accepted
state :rejected
event :restart do
transitions to: :submitted, from: [:withdrawn]
end
event :withdrawn do
transitions to: :withdrawn, from: [:submitted, :to_accept, :accepted]
end
event :to_accept do
transitions to: :to_accept, from: [:submitted, :rejected, :accepted]
end
event :accept do
transitions to: :accepted, from: [:submitted, :to_accept]
end
event :reject do
transitions to: :rejected, from: [:submitted]
end
event :reset do
transitions to: :submitted, from: [:to_accept]
end
end
def transition_possible?(transition)
self.class.state_machine.events_for(current_state).include?(transition)
end
end

View file

@ -0,0 +1,12 @@
class BoothRequest < ActiveRecord::Base
belongs_to :booth
belongs_to :user
validates :booth,
:user,
:role,
presence: true
ROLES = [%w[Submitter submitter], %w[Responsible responsible], %w[Secondary secondary]]
end

View file

@ -0,0 +1,22 @@
class CallForBooth < ActiveRecord::Base
belongs_to :conference
validates :start_date, :end_date, :booth_limit, presence: true
validate :before_end_of_conference
validate :start_date_before_end_date
private
def before_end_of_conference
errors
.add(:start_date, "can't be after the conference end date (#{conference.end_date})") if conference && conference.end_date && start_date && (start_date > conference.end_date)
errors
.add(:end_date, "can't be after the conference end date (#{conference.end_date})") if conference && conference.end_date && end_date && (end_date > conference.end_date)
end
def start_date_before_end_date
errors
.add(:start_date, "can't be after the end date") if start_date && end_date && start_date > end_date
end
end

View file

@ -16,6 +16,7 @@ class Conference < ActiveRecord::Base
has_one :splashpage, dependent: :destroy has_one :splashpage, dependent: :destroy
has_one :contact, dependent: :destroy has_one :contact, dependent: :destroy
has_one :registration_period, dependent: :destroy has_one :registration_period, dependent: :destroy
has_one :call_for_booths, dependent: :destroy
has_one :email_settings, dependent: :destroy has_one :email_settings, dependent: :destroy
has_one :program, dependent: :destroy has_one :program, dependent: :destroy
has_one :venue, dependent: :destroy has_one :venue, dependent: :destroy
@ -24,6 +25,7 @@ class Conference < ActiveRecord::Base
has_many :supporters, through: :ticket_purchases, source: :user has_many :supporters, through: :ticket_purchases, source: :user
has_many :tickets, dependent: :destroy has_many :tickets, dependent: :destroy
has_many :resources, dependent: :destroy has_many :resources, dependent: :destroy
has_many :booths, dependent: :destroy
has_many :lodgings, dependent: :destroy has_many :lodgings, dependent: :destroy
has_many :registrations, dependent: :destroy has_many :registrations, dependent: :destroy

View file

@ -50,11 +50,13 @@ class User < ActiveRecord::Base
has_many :votes, dependent: :destroy has_many :votes, dependent: :destroy
has_many :voted_events, through: :votes, source: :events has_many :voted_events, through: :votes, source: :events
has_many :subscriptions, dependent: :destroy has_many :subscriptions, dependent: :destroy
has_many :booth_requests
has_many :booths, through: :users_booths
accepts_nested_attributes_for :roles accepts_nested_attributes_for :roles
scope :admin, -> { where(is_admin: true) } scope :admin, -> { where(is_admin: true) }
scope :active, -> { where(is_disabled: false) } scope :active, -> { where(is_disabled: false) }
validates :email, presence: true validates :email, presence: true
validates :username, validates :username,

View file

@ -0,0 +1,25 @@
- if booth.transition_possible? :accept
%li= link_to 'Accept booth',
accept_admin_conference_booth_path(@conference.short_title, booth),
method: :patch, id: "accept_booth_#{booth.id}"
- if booth.transition_possible? :reject
%li= link_to 'Reject booth',
reject_admin_conference_booth_path(@conference.short_title, booth),
method: :patch, confirm: 'Are you sure?', id: "reject_booth_#{booth.id}"
- if booth.transition_possible? :restart
%li= link_to 'Start review',
restart_admin_conference_booth_path(@conference.short_title, booth),
method: :patch, id: "restart_booth_#{booth.id}"
- if booth.transition_possible? :to_accept
%li= link_to 'To accept booth',
to_accept_admin_conference_booth_path(@conference.short_title, booth),
method: :patch, id: "to_accept_booth_#{booth.id}"
- if booth.transition_possible? :cancel
%li= link_to 'Cancel booth',
cancel_admin_conference_booth_path(@conference.short_title, booth),
method: :patch, id: "cancel_booth_#{booth.id}"

View file

@ -0,0 +1,17 @@
.row
.col-md-12
.page-header
%title Request a Booth
.row
.col-md-8
= semantic_form_for(@booth, url: admin_conference_booths_path(@conference.short_title), html: {multipart: true}) do |f|
= f.input :title, as: :string, required: true
= f.input :description, input_html: { rows: 5, data: { provide: 'markdown-editable' } }, required: true
= f.input :reasoning, input_html: { rows: 5, data: { provide: 'markdown-editable' } }, required: true
= f.input :logo_link, as: :string, required: true
%p.text-right
- if @booth.new_record?
= f.submit 'Create Booth Request', class: 'btn btn-success'
- else
= f.submit 'Update Booth Request', class: 'btn btn-success'

View file

@ -0,0 +1,3 @@
%h1 Editing booth
= render 'form'

View file

@ -0,0 +1,47 @@
.row
.col-md-12
.page-header
%h1
Booths
= "(#{@booths.length})" if @booths.any?
.pull-right
- if can? :create, Booth
=link_to 'Add Booth', new_admin_conference_booth_path(@conference.short_title), class: 'button btn btn-default btn-info'
%p.text-muted
All the booth requests
.row
.col-md-12
.margin-event-table
%table.table.table-striped.table-bordered.table-hover.datatable
%thead
%th
%b ID
%th
%b Title
%th
%b Submitter
%th
%b Responsible
%th
%b Secondary Responsible
%th
%b State
- @booths.each do |booth|
%tr
%td
= booth.id
%td
= link_to booth.title, admin_conference_booth_path(@conference.short_title, booth)
%td
a
%td
b
%td
c
%td
.btn-group
%button{ type: 'button', class: 'btn btn-link dropdown-toggle', 'data-toggle' => 'dropdown' }
= booth.state.humanize
%span.caret
%ul.dropdown-menu{ role: 'menu' }
= render 'change_state_dropdown', booth: booth

View file

@ -0,0 +1,5 @@
%h1 New booth
= render 'form'
= link_to 'Back', admin_conference_booths_path

View file

@ -0,0 +1,20 @@
.row
.col-md-12
%h3
= @booth.title
.btn-group.pull-right
= link_to 'Edit', edit_admin_conference_booth_path(@conference.short_title, @booth), class: 'btn btn-mini btn-primary'
.row
.col-md-12
%table.table
%tr
%td.col-md-2
%b Description
%td
= @booth.description
%tr
%td.col-md-2
%b Reasoning
%td
= @booth.reasoning

View file

@ -0,0 +1,19 @@
= form_for @call_for_booth do |f|
- if @call_for_booth.errors.any?
#error_explanation
%h2= "#{pluralize(@call_for_booth.errors.count, "error")} prohibited this call_for_booth from being saved:"
%ul
- @call_for_booth.errors.full_messages.each do |msg|
%li= msg
.field
= f.label :start_date
= f.date_select :start_date
.field
= f.label :end_date
= f.date_select :end_date
.field
= f.label :booth_limit
= f.number_field :booth_limit
.actions
= f.submit 'Save'

View file

@ -0,0 +1,7 @@
%h1 Editing call_for_booth
= render 'form'
= link_to 'Show', @call_for_booth
\|
= link_to 'Back', call_for_booths_path

View file

@ -0,0 +1,23 @@
%h1 Listing call_for_booths
%table
%tr
%th Start date
%th End date
%th Booth limit
%th
%th
%th
- @call_for_booths.each do |call_for_booth|
%tr
%td= call_for_booth.start_date
%td= call_for_booth.end_date
%td= call_for_booth.booth_limit
%td= link_to 'Show', call_for_booth
%td= link_to 'Edit', edit_call_for_booth_path(call_for_booth)
%td= link_to 'Destroy', call_for_booth, :method => :delete, :data => { :confirm => 'Are you sure?' }
%br
= link_to 'New Call for booth', new_call_for_booth_path

View file

@ -0,0 +1,5 @@
%h1 New call_for_booth
= render 'form'
= link_to 'Back', call_for_booths_path

View file

@ -0,0 +1,15 @@
%p#notice= notice
%p
%b Start date:
= @call_for_booth.start_date
%p
%b End date:
= @call_for_booth.end_date
%p
%b Booth limit:
= @call_for_booth.booth_limit
= link_to 'Edit', edit_call_for_booth_path(@call_for_booth)
\|
= link_to 'Back', call_for_booths_path

View file

@ -0,0 +1,28 @@
= form_for @booth do |f|
- if @booth.errors.any?
#error_explanation
%h2= "#{pluralize(@booth.errors.count, "error")} prohibited this booth from being saved:"
%ul
- @booth.errors.full_messages.each do |msg|
%li= msg
.field
= f.label :title
= f.text_field :title
.field
= f.label :conference_id
= f.number_field :conference_id
.field
= f.label :description
= f.text_area :description
.field
= f.label :state
= f.text_field :state
.field
= f.label :reasoning
= f.text_area :reasoning
.field
= f.label :logo_link
= f.text_field :logo_link
.actions
= f.submit 'Save'

View file

@ -0,0 +1,7 @@
%h1 Editing booth
= render 'form'
= link_to 'Show', @booth
\|
= link_to 'Back', booths_path

View file

@ -0,0 +1,29 @@
%h1 Listing booths
%table
%tr
%th Title
%th Conference
%th Description
%th State
%th Reasoning
%th Logo link
%th
%th
%th
- @booths.each do |booth|
%tr
%td= booth.title
%td= booth.conference_id
%td= booth.description
%td= booth.state
%td= booth.reasoning
%td= booth.logo_link
%td= link_to 'Show', booth
%td= link_to 'Edit', edit_booth_path(booth)
%td= link_to 'Destroy', booth, :method => :delete, :data => { :confirm => 'Are you sure?' }
%br
= link_to 'New Booth', new_booth_path

View file

@ -0,0 +1,5 @@
%h1 New booth
= render 'form'
= link_to 'Back', booths_path

View file

@ -0,0 +1,24 @@
%p#notice= notice
%p
%b Title:
= @booth.title
%p
%b Conference:
= @booth.conference_id
%p
%b Description:
= @booth.description
%p
%b State:
= @booth.state
%p
%b Reasoning:
= @booth.reasoning
%p
%b Logo link:
= @booth.logo_link
= link_to 'Edit', edit_booth_path(@booth)
\|
= link_to 'Back', booths_path

View file

@ -1,5 +1,6 @@
Osem::Application.routes.draw do Osem::Application.routes.draw do
if ENV['OSEM_ICHAIN_ENABLED'] == 'true' if ENV['OSEM_ICHAIN_ENABLED'] == 'true'
devise_for :users, controllers: { registrations: :registrations } devise_for :users, controllers: { registrations: :registrations }
else else
@ -30,12 +31,25 @@ Osem::Application.routes.draw do
resources :conferences do resources :conferences do
resource :contact, except: [:index, :new, :create, :show, :destroy] resource :contact, except: [:index, :new, :create, :show, :destroy]
resources :schedules, only: [:index, :create, :show, :update, :destroy] resources :schedules, only: [:index, :create, :show, :update, :destroy]
resources :event_schedules, only: [:create, :update, :destroy] resources :event_schedules, only: [:create, :update, :destroy]
get 'commercials/render_commercial' => 'commercials#render_commercial' get 'commercials/render_commercial' => 'commercials#render_commercial'
resources :commercials, only: [:index, :create, :update, :destroy] resources :commercials, only: [:index, :create, :update, :destroy]
get '/volunteers_list' => 'volunteers#show' get '/volunteers_list' => 'volunteers#show'
get '/volunteers' => 'volunteers#index', as: 'volunteers_info' get '/volunteers' => 'volunteers#index', as: 'volunteers_info'
patch '/volunteers' => 'volunteers#update', as: 'volunteers_update' patch '/volunteers' => 'volunteers#update', as: 'volunteers_update'
patch '/booths' => 'booths#update'
resources :booths do
member do
patch :accept
patch :restart
patch :withdrawn
patch :to_accept
patch :reject
patch :reset
end
end
resources :registrations, except: [:create, :new] do resources :registrations, except: [:create, :new] do
member do member do
@ -52,6 +66,7 @@ Osem::Application.routes.draw do
resources :rooms, except: [:show] resources :rooms, except: [:show]
end end
resource :registration_period resource :registration_period
resource :call_for_booths
resource :program do resource :program do
resource :cfp resource :cfp
resources :tracks resources :tracks

View file

@ -0,0 +1,14 @@
class CreateBooths < ActiveRecord::Migration
def change
create_table :booths do |t|
t.string :title
t.text :description
t.text :reasoning
t.string :state
t.string :logo_link
t.integer :conference_id
t.timestamps null: false
end
end
end

View file

@ -0,0 +1,11 @@
class CreateBoothRequests < ActiveRecord::Migration
def change
create_table :booth_requests do |t|
t.references :booth, index: true, foreign_key: true
t.references :user, index: true, foreign_key: true
t.string :role
t.timestamps null: false
end
end
end

View file

@ -0,0 +1,12 @@
class CreateCallForBooths < ActiveRecord::Migration
def change
create_table :call_for_booths do |t|
t.date :start_date
t.date :end_date
t.integer :booth_limit
t.references :conference
t.timestamps null: false
end
end
end

View file

@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20170531094819) do ActiveRecord::Schema.define(version: 20170606182954) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@ -34,6 +34,37 @@ ActiveRecord::Schema.define(version: 20170531094819) do
t.datetime "updated_at" t.datetime "updated_at"
end end
create_table "booth_requests", force: :cascade do |t|
t.integer "booth_id"
t.integer "user_id"
t.string "role"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
add_index "booth_requests", ["booth_id"], name: "index_booth_requests_on_booth_id"
add_index "booth_requests", ["user_id"], name: "index_booth_requests_on_user_id"
create_table "booths", force: :cascade do |t|
t.string "title"
t.text "description"
t.text "reasoning"
t.string "state"
t.string "logo_link"
t.integer "conference_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "call_for_booths", force: :cascade do |t|
t.date "start_date"
t.date "end_date"
t.integer "booth_limit"
t.integer "conference_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "campaigns", force: :cascade do |t| create_table "campaigns", force: :cascade do |t|
t.integer "conference_id" t.integer "conference_id"
t.string "name" t.string "name"

24
spec/models/booth_spec.rb Normal file
View file

@ -0,0 +1,24 @@
require 'spec_helper'
describe 'Booth' do
subject { create(:booth) }
let!(:conference) { create(:conference) }
describe 'validation' do
it 'has a valid factory' do
expect(build(:booth)).to be_valid
end
it { is_expected.to validate_presence_of(:conference) }
it 'is not valid without a title' do
should validate_presence_of(:title)
end
end
describe 'association' do
it { is_expected.to belong_to(:conference) }
it { is_expected.to have_many(:booth_requests) }
end
end

View file

@ -0,0 +1,15 @@
require 'spec_helper'
describe CallForBooth do
it 'has a valid factory' do
expect(build(:call_for_booths)).to be_valid
end
it 'is not valid without a start_date' do
should validate_presence_of(:start_date)
end
it 'is not valid without an end_date' do
should validate_presence_of(:end_date)
end
end