Rooms belong to venue

This commit is contained in:
Stella Rouzi 2015-11-07 11:43:36 +02:00 committed by Henne Vogelsang
parent feabbfbc99
commit f840f2b3f0
31 changed files with 221 additions and 166 deletions

View file

@ -1,22 +1,22 @@
module Admin
class RoomsController < Admin::BaseController
load_and_authorize_resource :conference, find_by: :short_title
load_and_authorize_resource :program, through: :conference, singleton: true
load_and_authorize_resource through: :program
load_and_authorize_resource :venue, through: :conference, singleton: true
load_and_authorize_resource through: :venue
def index; end
def edit; end
def new
@room = @program.rooms.new
@room = @venue.rooms.new
end
def create
@room = @program.rooms.new(room_params)
@room = @venue.rooms.new(room_params)
if @room.save
flash[:notice] = 'Room successfully created.'
redirect_to(admin_conference_program_rooms_path(conference_id: @conference.short_title))
redirect_to(admin_conference_venue_rooms_path(conference_id: @conference.short_title))
else
flash[:error] = "Creating Room failed: #{@room.errors.full_messages.join('. ')}."
render :new
@ -26,7 +26,7 @@ module Admin
def update
if @room.update_attributes(room_params)
flash[:notice] = 'Room successfully updated.'
redirect_to(admin_conference_program_rooms_path(conference_id: @conference.short_title))
redirect_to(admin_conference_venue_rooms_path(conference_id: @conference.short_title))
else
flash[:error] = "Update Room failed: #{@room.errors.full_messages.join('. ')}."
render :edit
@ -36,10 +36,10 @@ module Admin
def destroy
if @room.destroy
flash[:notice] = 'Room successfully deleted.'
redirect_to(admin_conference_program_rooms_path(conference_id: @conference.short_title))
redirect_to(admin_conference_venue_rooms_path(conference_id: @conference.short_title))
else
flash[:error] = "Destroying room failed! #{@room.errors.full_messages.join('. ')}."
redirect_to(admin_conference_program_rooms_path(conference_id: @conference.short_title))
redirect_to(admin_conference_venue_rooms_path(conference_id: @conference.short_title))
end
end

View file

@ -4,6 +4,7 @@ module Admin
# the schedule of a conference, which should not be accessed in the first place
load_and_authorize_resource :conference, find_by: :short_title
load_and_authorize_resource :program, through: :conference, singleton: true
load_resource :venue, through: :conference, singleton: true
skip_before_filter :verify_authenticity_token, only: [:update]
layout 'schedule'
@ -15,7 +16,7 @@ module Admin
return
end
@dates = @conference.start_date..@conference.end_date
@rooms = @program.rooms
@rooms = @venue.rooms
end
def update

View file

@ -5,8 +5,12 @@ module Api
respond_to :json
def index
@conference ? (rooms = @conference.rooms) : (rooms = Room.all)
if params[:conference_id].blank?
rooms = Room.all
else
conference = Conference.find_by_guid(params[:conference_id])
rooms = conference.venue.rooms if conference.venue
end
respond_with rooms
end
end

View file

@ -11,7 +11,7 @@ class ConferenceController < ApplicationController
def show; end
def schedule
@rooms = @conference.program.rooms
@rooms = @conference.venue.rooms if @conference.venue
@events = @conference.program.events
@dates = @conference.start_date..@conference.end_date

View file

@ -106,6 +106,10 @@ class Ability
can :manage, :all if user.is_admin
cannot :destroy, Program
# Do not delete venue, when there are rooms being used
cannot :destroy, Venue do |venue|
venue.conference.program.events.where.not(room_id: nil).any?
end
end
def signed_in_with_organizer_role(user)
@ -141,7 +145,7 @@ class Ability
commercialable_id: Event.where(program_id: Program.where(conference_id: conf_ids_for_organizer).pluck(:id)).pluck(:id)
can :manage, Venue, conference_id: conf_ids_for_organizer
can :manage, Lodging, conference_id: conf_ids_for_organizer
can :manage, Room, program: { conference_id: conf_ids_for_organizer}
can :manage, Room, venue: { conference_id: conf_ids_for_organizer}
can :manage, Sponsor, conference_id: conf_ids_for_organizer
can :manage, SponsorshipLevel, conference_id: conf_ids_for_organizer
can :manage, Ticket, conference_id: conf_ids_for_organizer
@ -160,7 +164,7 @@ class Ability
can :manage, Track, program: { conference_id: conf_ids_for_cfp }
can :manage, DifficultyLevel, program: { conference_id: conf_ids_for_cfp }
can :manage, EmailSettings, conference_id: conf_ids_for_cfp
can :manage, Room, program: { conference_id: conf_ids_for_cfp }
can :manage, Room, venue: { conference_id: conf_ids_for_cfp }
can :index, Venue, conference_id: conf_ids_for_cfp
can :manage, Cfp, program: { conference_id: conf_ids_for_cfp }
can :manage, Program, conference_id: conf_ids_for_cfp

View file

@ -707,7 +707,7 @@ class Conference < ActiveRecord::Base
# * +True+ -> One room or more
# * +False+ -> No room
def rooms_set?
program.rooms.count > 0
venue.present? && venue.rooms.count > 0
end
# Checks if the conference has a venue object.

View file

@ -7,7 +7,6 @@ class Program < ActiveRecord::Base
has_many :event_types, dependent: :destroy
has_many :tracks, dependent: :destroy
has_many :difficulty_levels, dependent: :destroy
has_many :rooms, dependent: :destroy
has_many :events, dependent: :destroy do
def workshops
where(require_registration: true, state: :confirmed)
@ -36,11 +35,10 @@ class Program < ActiveRecord::Base
accepts_nested_attributes_for :event_types, allow_destroy: true
accepts_nested_attributes_for :tracks, reject_if: proc { |r| r['name'].blank? }, allow_destroy: true
accepts_nested_attributes_for :difficulty_levels, allow_destroy: true
accepts_nested_attributes_for :rooms, reject_if: proc { |r| r['name'].blank? }, allow_destroy: true
attr_accessible :schedule_fluid, :rating,
:schedule_public, :include_cfp_in_splash, :conference_id,
:event_types_attributes, :difficulty_levels_attributes, :rooms_attributes, :tracks_attributes
:event_types_attributes, :difficulty_levels_attributes, :tracks_attributes
# validates :conference_id, presence: true, uniqueness: true
validates :rating, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 10 }

View file

@ -1,10 +1,10 @@
class Room < ActiveRecord::Base
belongs_to :program
belongs_to :venue
has_many :events, dependent: :nullify
before_create :generate_guid
validates :name, presence: true
validates :name, :venue_id, presence: true
validates :size, numericality: { only_integer: true, greater_than: 0 }, allow_nil: true

View file

@ -1,9 +1,10 @@
class Venue < ActiveRecord::Base
belongs_to :conference
has_many :lodgings
has_many :rooms, dependent: :destroy
before_create :generate_guid
validates :name, :street, :city, :country, presence: true
validates :conference_id, presence: true, uniqueness: true
has_attached_file :photo,
styles: { thumb: '100x100>', large: '300x300>' }
@ -11,8 +12,6 @@ class Venue < ActiveRecord::Base
content_type: [/jpg/, /jpeg/, /png/, /gif/],
size: { in: 0..500.kilobytes }
accepts_nested_attributes_for :lodgings, allow_destroy: true
after_update :send_mail_notification
def address

View file

@ -32,8 +32,8 @@
Add venue
%li{'class'=>"list-group-item #{class_for_todo(conference_progress['rooms'])}"}
%span{'class'=>icon_for_todo(conference_progress['rooms'])}
- if can? :update, @conference.program.rooms.build
= link_to 'Add rooms', admin_conference_program_rooms_path(conference_progress['short_title'])
- if @conference.venue && (can? :update, @conference.venue.rooms.build)
= link_to 'Add rooms', admin_conference_venue_rooms_path(conference_progress['short_title'])
- else
Add rooms
%li{'class'=>"list-group-item #{class_for_todo(conference_progress['tracks'])}"}

View file

@ -8,8 +8,8 @@
= @room.name
.row
.col-md-8
= semantic_form_for(@room, :url => (@room.new_record? ? admin_conference_program_rooms_path : admin_conference_program_room_path(@conference.short_title, @room))) do |f|
= f.input :name
= semantic_form_for(@room, :url => (@room.new_record? ? admin_conference_venue_rooms_path : admin_conference_venue_room_path(@conference.short_title, @room))) do |f|
= f.input :name, input_html: { autofocus: true}
= f.input :size, :input_html => {:size => 5}
%p.text-right
= f.action :submit, as: :button, button_html: { class: 'btn btn-primary' }
= f.action :submit, as: :button, button_html: { class: 'btn btn-primary' }

View file

@ -5,7 +5,7 @@
%p.text-muted
The rooms of your conference venue
- if @conference.program.rooms.any?
- if @rooms.any?
.row
.col-md-12
%table.table.table-hover#rooms
@ -14,18 +14,18 @@
%th Size
%th Actions
%tbody
- @conference.program.rooms.each_with_index do |room, index|
- @rooms.each_with_index do |room, index|
%tr
%td
= room.name
%td
= room.size
%td
= link_to 'Edit', edit_admin_conference_program_room_path(@conference.short_title, room.id),
= link_to 'Edit', edit_admin_conference_venue_room_path(@conference.short_title, room.id),
method: :get, class: 'btn btn-primary'
= link_to 'Delete', admin_conference_program_room_path(@conference.short_title, room.id),
= link_to 'Delete', admin_conference_venue_room_path(@conference.short_title, room.id),
method: :delete, class: 'btn btn-danger',
data: { confirm: "Do you really want to delete #{room.name}? Attention: This room will be removed from all Events that have it set"}
.row
.col-md-12.text-right
= link_to 'Add Room', new_admin_conference_program_room_path(@conference.short_title), class: 'btn btn-primary'
= link_to 'Add Room', new_admin_conference_venue_room_path(@conference.short_title), class: 'btn btn-primary'

View file

@ -20,9 +20,12 @@
= @venue.country_name
.row
.col-md-12
= link_to 'Edit Venue', edit_admin_conference_venue_path(@conference.short_title), class: 'btn btn-primary', disabled: !(can? :edit, @conference.venue)
= link_to 'Delete Venue', admin_conference_venue_path(@conference.short_title), method: 'delete', class: 'btn btn-danger', disabled: !(can? :edit, @conference.venue)
= link_to(edit_admin_conference_venue_path(@conference.short_title), class: 'btn btn-primary', disabled: !(can? :update, @venue) ) do
Edit Venue
= link_to(admin_conference_venue_path(@conference.short_title), method: 'delete', class: 'btn btn-danger', disabled: !(can? :destroy, @venue)) do
Delete Venue
-else
.row
.col-md-12.text-right
= link_to 'Create Venue', new_admin_conference_venue_path(@conference.short_title), class: 'btn btn-primary', disabled: !(can? :edit, @conference.venue)
= link_to(new_admin_conference_venue_path(@conference.short_title), class: 'btn btn-primary') do
Create Venue

View file

@ -53,9 +53,9 @@
%span.fa.fa-road
Venue
%ul
- if can? :update, @conference.program.rooms.build
%li{:class=> active_nav_li(admin_conference_program_rooms_path(@conference.short_title))}
= link_to 'Rooms', admin_conference_program_rooms_path(@conference.short_title)
- if @conference.venue && @conference.venue.persisted? && (can? :update, @conference.venue.rooms.build)
%li{:class=> active_nav_li(admin_conference_venue_rooms_path(@conference.short_title))}
= link_to 'Rooms', admin_conference_venue_rooms_path(@conference.short_title)
- if can? :update, @conference.lodgings.build
%li{ class: active_nav_li(admin_conference_lodgings_path(@conference.short_title)) }
= link_to 'Lodgings', admin_conference_lodgings_path(@conference.short_title)