diff --git a/.haml-lint_todo.yml b/.haml-lint_todo.yml index 25ccb622..49feab3d 100644 --- a/.haml-lint_todo.yml +++ b/.haml-lint_todo.yml @@ -153,6 +153,7 @@ linters: - "app/views/layouts/_admin_sidebar_index.html.haml" - "app/views/layouts/_messages.html.haml" - "app/views/layouts/_navigation.html.haml" + - "app/views/layouts/_user_menu.html.haml" - "app/views/layouts/application.html.haml" - "app/views/organizations/index.html.haml" - "app/views/payments/_payment.html.haml" diff --git a/app/controllers/admin/booths_controller.rb b/app/controllers/admin/booths_controller.rb index a200e42e..a65de090 100644 --- a/app/controllers/admin/booths_controller.rb +++ b/app/controllers/admin/booths_controller.rb @@ -90,6 +90,10 @@ module Admin update_state(:cancel, 'Booth is canceled') end + def confirm + update_state(:confirm, 'Booth successfully confirmed') + end + private def update_state(transition, notice) diff --git a/app/controllers/conferences_controller.rb b/app/controllers/conferences_controller.rb index 53e5bd6d..f141529d 100644 --- a/app/controllers/conferences_controller.rb +++ b/app/controllers/conferences_controller.rb @@ -1,18 +1,29 @@ class ConferencesController < ApplicationController protect_from_forgery with: :null_session before_action :respond_to_options - load_and_authorize_resource find_by: :short_title - load_resource :program, through: :conference, singleton: true, except: :index + load_and_authorize_resource find_by: :short_title, except: :show def index @current = Conference.where('end_date >= ?', Date.current).reorder(start_date: :asc) @antiquated = @conferences - @current end - def show; end + def show + @conference = if params[:id] + Conference.find_by_short_title(params[:id]) + else + load_conference_by_domain + end + authorize! :show, @conference + @program = @conference.program + end private + def load_conference_by_domain + Conference.find_by(custom_domain: request.domain) + end + def respond_to_options respond_to do |format| format.html { head :ok } diff --git a/app/views/admin/booths/_change_state_dropdown.html.haml b/app/views/admin/booths/_change_state_dropdown.html.haml index 12b982df..338e43f7 100644 --- a/app/views/admin/booths/_change_state_dropdown.html.haml +++ b/app/views/admin/booths/_change_state_dropdown.html.haml @@ -42,3 +42,8 @@ %li= link_to 'Cancel booth', cancel_admin_conference_booth_path(@conference.short_title, booth), method: :patch, id: "cancel_booth_#{booth.id}" + +- if booth.transition_possible? :confirm + %li= link_to 'Confirm booth', + confirm_admin_conference_booth_path(@conference.short_title, booth), + method: :patch, id: "confirm_booth_#{booth.id}" diff --git a/app/views/conferences/_lodging.html.haml b/app/views/conferences/_lodging.html.haml index e94286a4..561e2421 100644 --- a/app/views/conferences/_lodging.html.haml +++ b/app/views/conferences/_lodging.html.haml @@ -12,22 +12,26 @@ = @conference.venue.city %p.lead We recommend these affordable lodging accommodations for your visit. - - @conference.lodgings.each_slice(3) do |slice| - .row.row-centered - - slice.each do |lodging| - .col-md-4.col-sm-4.ticket.col-centered.col-top - .thumbnail - - unless lodging.picture? - %p.text-center - %i.fa.fa-home.fa-5x + + .row.row-centered{ style:"display: flex; flex-wrap: wrap" } + - @conference.lodgings.each do |lodging| + .col-md-4.col-sm-4.col-centered.col-top{ style:"display:flex;" } + .thumbnail + - if lodging.picture? + -if lodging.website_link.present? + = link_to(lodging.website_link, class: 'thumbnail') do + = image_tag lodging.picture.large.url, class: 'img-responsive img-lodging' - else + = image_tag lodging.picture.large.url, class: 'img-responsive img-lodging' + - else + %p.text-center -if lodging.website_link.present? = link_to(lodging.website_link, class: 'thumbnail') do - = image_tag lodging.picture.large.url, class: 'img-responsive img-lodging' + %i.fa.fa-home.fa-5x - else - = image_tag lodging.picture.large.url, class: 'img-responsive img-lodging' - .caption - %h3.text-center - = lodging.name - -if lodging.description.present? - = markdown(lodging.description) + %i.fa.fa-home.fa-5x + .caption + %h3.text-center + = lodging.name + -if lodging.description.present? + = markdown(lodging.description) diff --git a/app/views/layouts/_admin_sidebar.html.haml b/app/views/layouts/_admin_sidebar.html.haml index b50e9464..4385d307 100644 --- a/app/views/layouts/_admin_sidebar.html.haml +++ b/app/views/layouts/_admin_sidebar.html.haml @@ -116,7 +116,11 @@ - if can? :update, @conference.tickets.build %li{class: active_nav_li(admin_conference_tickets_path(@conference.short_title)) } = link_to 'Tickets', admin_conference_tickets_path(@conference.short_title) - + - if can? :manage, @conference.booths.build + %li + = link_to admin_conference_booths_path(@conference.short_title) do + %span.fa.fa-shopping-bag + Booths - if (can? :manage, @conference.targets.build) || (can? :manage, @conference.campaigns.build) %li %a diff --git a/app/views/layouts/_user_menu.html.haml b/app/views/layouts/_user_menu.html.haml index 5311fd7b..10d4c386 100644 --- a/app/views/layouts/_user_menu.html.haml +++ b/app/views/layouts/_user_menu.html.haml @@ -16,6 +16,11 @@ = link_to(conference_program_tracks_path(@conference.short_title)) do %span.fa.fa-road My Tracks +-if @conference && @conference.program && (@conference.program.cfps.for_booths.try(:open?) || current_user.booths.where(conference_id: @conference.id).count > 0) + %li + = link_to (conference_booths_path(@conference.short_title)) do + %span.fa.fa-shopping-bag + My Booth Requests %li - if ENV['OSEM_ICHAIN_ENABLED'] == 'true' = link_to(destroy_user_ichain_session_path, method: 'delete') do diff --git a/config/initializers/domain_constraint.rb b/config/initializers/domain_constraint.rb new file mode 100644 index 00000000..5b35e5c7 --- /dev/null +++ b/config/initializers/domain_constraint.rb @@ -0,0 +1,6 @@ +class DomainConstraint + def self.matches?(request) + domains = Conference.where.not(custom_domain: nil).pluck(:custom_domain) + domains.include?(request.domain) + end +end diff --git a/config/routes.rb b/config/routes.rb index d1398b7f..ec55b8a3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,9 @@ Osem::Application.routes.draw do + constraints DomainConstraint do + get '/', to: 'conferences#show' + end + if ENV['OSEM_ICHAIN_ENABLED'] == 'true' devise_for :users, controllers: { registrations: :registrations } else @@ -53,6 +57,7 @@ Osem::Application.routes.draw do patch :reset patch :to_reject patch :cancel + patch :confirm end end diff --git a/db/migrate/20170721184810_add_custom_domain_to_conferences.rb b/db/migrate/20170721184810_add_custom_domain_to_conferences.rb new file mode 100644 index 00000000..d5aef4fd --- /dev/null +++ b/db/migrate/20170721184810_add_custom_domain_to_conferences.rb @@ -0,0 +1,5 @@ +class AddCustomDomainToConferences < ActiveRecord::Migration + def change + add_column :conferences, :custom_domain, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 83499b33..d9949b1e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,10 +11,10 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170807092805) do +ActiveRecord::Schema.define(version: 20170816203325) do create_table "ahoy_events", force: :cascade do |t| - t.integer "visit_id" + t.uuid "visit_id", limit: 16 t.integer "user_id" t.string "name" t.text "properties" @@ -127,6 +127,7 @@ ActiveRecord::Schema.define(version: 20170807092805) do t.integer "end_hour", default: 20 t.integer "organization_id" t.integer "ticket_layout", default: 0 + t.string "custom_domain" t.integer "booth_limit", default: 0 end @@ -511,10 +512,10 @@ ActiveRecord::Schema.define(version: 20170807092805) do create_table "tickets", force: :cascade do |t| t.integer "conference_id" - t.string "title", null: false + t.string "title", null: false t.text "description" - t.integer "price_cents", default: 0, null: false - t.string "price_currency", default: "USD", null: false + t.integer "price_cents", default: 0, null: false + t.string "price_currency", default: "USD", null: false t.boolean "registration_ticket", default: false end @@ -572,6 +573,7 @@ ActiveRecord::Schema.define(version: 20170807092805) do t.boolean "is_admin", default: false t.string "username" t.boolean "is_disabled", default: false + t.string "token" end add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true diff --git a/spec/controllers/conferences_controller_spec.rb b/spec/controllers/conferences_controller_spec.rb index 6479eb34..cdbebf9f 100644 --- a/spec/controllers/conferences_controller_spec.rb +++ b/spec/controllers/conferences_controller_spec.rb @@ -24,6 +24,20 @@ describe ConferencesController do expect(response).to render_template :show end end + + context 'accessing conference via custom domain' do + before do + conference.update_attribute(:custom_domain, 'lvh.me') + @request.host = 'lvh.me' + end + + it 'assigns correct conference' do + get :show + + expect(response).to render_template :show + expect(assigns(:conference)).to eq conference + end + end end describe 'OPTIONS #index' do