Merge branch 'master' into org-name-in-conf

This commit is contained in:
Shlok Srivastava 2017-08-19 08:34:17 +00:00 • committed by GitHub
commit e652880dd1
120 changed files with 2844 additions and 408 deletions

View file

@ -11,6 +11,7 @@ linters:
# Offense count: 945
LineLength:
exclude:
- "app/views/admin/booths/_change_state_dropdown.html.haml"
- "app/views/admin/booths/_form.html.haml"
- "app/views/admin/booths/index.html.haml"
- "app/views/admin/booths/show.html.haml"
@ -109,6 +110,9 @@ linters:
- "app/views/admin/versions/_object_desc_and_link.html.haml"
- "app/views/admin/versions/index.html.haml"
- "app/views/admin/volunteers/index.html.haml"
- "app/views/booths/_form.html.haml"
- "app/views/booths/index.html.haml"
- "app/views/booths/show.html.haml"
- "app/views/commercials/edit.html.haml"
- "app/views/commercials/new.html.haml"
- "app/views/conference_registrations/_form.html.haml"
@ -116,6 +120,7 @@ linters:
- "app/views/conference_registrations/_registration_info.html.haml"
- "app/views/conference_registrations/_volunteer.html.haml"
- "app/views/conference_registrations/show.html.haml"
- "app/views/conferences/_booths.html.haml"
- "app/views/conferences/_call_for_paper.html.haml"
- "app/views/conferences/_conference_details.html.haml"
- "app/views/conferences/_gallery.html.haml"
@ -178,6 +183,9 @@ linters:
- "app/views/tracks/_form.html.haml"
- "app/views/tracks/index.html.haml"
- "app/views/tracks/show.html.haml"
- "app/views/conferences/_call_for_tracks.html.haml"
- "app/views/admin/tracks/_change_state_dropdown.html.haml"
- "app/views/proposals/_encouragement_text.html.haml"
# Offense count: 223
InstanceVariables:
@ -240,6 +248,9 @@ linters:
- "app/views/schedules/_schedule_tabs.html.haml"
- "app/views/admin/cfps/_events_cfp.html.haml"
- "app/views/tracks/_form.html.haml"
- "app/views/admin/cfps/_tracks_cfp.html.haml"
- "app/views/conferences/_call_for_tracks.html.haml"
- "app/views/admin/tracks/_change_state_dropdown.html.haml"
# Offense count: 32
IdNames:
@ -259,6 +270,7 @@ linters:
- "app/views/admin/users/show.html.haml"
- "app/views/users/edit.html.haml"
- "app/views/admin/cfps/_events_cfp.html.haml"
- "app/views/admin/cfps/_tracks_cfp.html.haml"
# Offense count: 4
UnnecessaryInterpolation:
@ -294,6 +306,7 @@ linters:
SpaceInsideHashAttributes:
exclude:
- "app/views/admin/conferences/_todo_list.html.haml"
- "app/views/admin/emails/index.html.haml"
- "app/views/admin/questions/_form.html.haml"
- "app/views/admin/questions/index.html.haml"
- "app/views/admin/registrations/index.html.haml"
@ -369,6 +382,7 @@ linters:
- "app/views/admin/tracks/show.html.haml"
- "app/views/admin/venues/show.html.haml"
- "app/views/admin/versions/index.html.haml"
- "app/views/booths/index.html.haml"
- "app/views/conference_registrations/_form.html.haml"
- "app/views/conference_registrations/_ticket.html.haml"
- "app/views/conference_registrations/show.html.haml"
@ -393,10 +407,12 @@ linters:
# Offense count: 14
ConsecutiveSilentScripts:
exclude:
- "app/views/admin/booths/_change_state_dropdown.html.haml"
- "app/views/admin/events/index.html.haml"
- "app/views/admin/schedules/_day_tab.html.haml"
- "app/views/admin/schedules/_event.html.haml"
- "app/views/admin/versions/_object_desc_and_link.html.haml"
- "app/views/booths/index.html.haml"
- "app/views/schedules/_carousel.html.haml"
# Offense count: 29

View file

@ -317,6 +317,8 @@ Metrics/BlockLength:
# Offense count: 23
Metrics/CyclomaticComplexity:
Max: 12
Exclude:
- 'app/models/track.rb'
# Offense count: 2353
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
@ -328,15 +330,21 @@ Metrics/LineLength:
# Configuration parameters: CountComments.
Metrics/MethodLength:
Max: 56
Exclude:
- 'app/models/admin_ability.rb'
# Offense count: 3
# Configuration parameters: CountComments.
Metrics/ModuleLength:
Max: 159
Exclude:
- 'app/helpers/format_helper.rb'
# Offense count: 15
Metrics/PerceivedComplexity:
Max: 16
Exclude:
- 'app/models/track.rb'
# Offense count: 20
Style/AccessorMethodName:
@ -437,6 +445,7 @@ Style/HashSyntax:
# Configuration parameters: MaxLineLength.
Style/IfUnlessModifier:
Exclude:
- 'app/controllers/admin/booths_controller.rb'
- 'app/controllers/admin/events_controller.rb'
- 'app/controllers/api/v1/events_controller.rb'
- 'app/controllers/conference_registrations_controller.rb'
@ -444,6 +453,7 @@ Style/IfUnlessModifier:
- 'app/helpers/application_helper.rb'
- 'app/models/commercial.rb'
- 'app/models/conference.rb'
- 'app/models/email_settings.rb'
- 'app/models/ticket_purchase.rb'
- 'app/models/user.rb'
- 'db/migrate/20151031092713_change_conference_id_to_venue_id_in_rooms.rb'
@ -563,6 +573,7 @@ Style/PercentLiteralDelimiters:
- 'app/models/subscription.rb'
- 'app/uploaders/picture_uploader.rb'
- 'spec/models/program_spec.rb'
- 'app/models/track.rb'
# Offense count: 2
# Configuration parameters: NamePrefix, NamePrefixBlacklist, NameWhitelist.

View file

@ -57,7 +57,7 @@ gem 'unobtrusive_flash', '>=3'
gem 'transitions', :require => %w( transitions active_record/transitions )
# for comments
gem 'awesome_nested_set', '~> 3.0.0.rc.5'
gem 'awesome_nested_set', '~> 3.1.3'
gem 'acts_as_commentable_with_threading'
# as templating language

View file

@ -69,11 +69,10 @@ GEM
uuidtools
arel (6.0.4)
ast (2.3.0)
autoprefixer-rails (5.1.9)
autoprefixer-rails (7.1.1)
execjs
json
awesome_nested_set (3.0.0.rc.5)
activerecord (>= 4.0.0, < 5)
awesome_nested_set (3.1.3)
activerecord (>= 4.0.0, < 5.2)
aws_cf_signer (0.1.3)
axlsx_rails (0.2.0)
axlsx (>= 2.0.1)
@ -117,13 +116,14 @@ GEM
rest-client
cocoon (1.2.6)
coderay (1.1.1)
coffee-rails (4.1.1)
coffee-rails (4.2.2)
coffee-script (>= 2.2.0)
railties (>= 4.0.0, < 5.1.x)
railties (>= 4.0.0)
coffee-script (2.4.1)
coffee-script-source
execjs
coffee-script-source (1.10.0)
coffee-script-source (1.12.2)
concurrent-ruby (1.0.5)
countable-rails (0.0.1)
railties (>= 3.1)
countries (1.2.5)
@ -145,10 +145,10 @@ GEM
dante (0.2.0)
database_cleaner (1.3.0)
debug_inspector (0.0.2)
delayed_job (4.1.1)
activesupport (>= 3.0, < 5.0)
delayed_job_active_record (4.1.0)
activerecord (>= 3.0, < 5)
delayed_job (4.1.3)
activesupport (>= 3.0, < 5.2)
delayed_job_active_record (4.1.2)
activerecord (>= 3.0, < 5.2)
delayed_job (>= 3.0, < 5)
devise (4.2.0)
bcrypt (~> 3.0)
@ -162,10 +162,10 @@ GEM
docile (1.1.5)
domain_name (0.5.20160310)
unf (>= 0.0.5, < 1.0.0)
dotenv (2.1.1)
dotenv-rails (2.1.1)
dotenv (= 2.1.1)
railties (>= 4.0, < 5.1)
dotenv (2.2.1)
dotenv-rails (2.2.1)
dotenv (= 2.2.1)
railties (>= 3.2, < 5.2)
erubis (2.7.0)
execjs (2.6.0)
factory_girl (4.5.0)
@ -180,8 +180,8 @@ GEM
fastimage (2.0.0)
addressable (~> 2)
ffi (1.9.18)
font-awesome-rails (4.1.0.0)
railties (>= 3.2, < 5.0)
font-awesome-rails (4.7.0.2)
railties (>= 3.2, < 5.2)
formatador (0.2.5)
formtastic (3.1.3)
actionpack (>= 3.2.13)
@ -219,8 +219,7 @@ GEM
rubocop (>= 0.47.0)
sysexits (~> 1.1)
hashdiff (0.3.4)
hashie (2.1.1)
hike (1.2.3)
hashie (3.5.5)
hoptoad_notifier (2.4.11)
activesupport
builder
@ -235,8 +234,9 @@ GEM
jquery-datatables-rails (2.2.3)
jquery-rails
sass-rails
jquery-rails (3.1.4)
railties (>= 3.0, < 5.0)
jquery-rails (4.3.1)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
jquery-ui-rails (4.2.1)
railties (>= 3.2.16)
@ -295,15 +295,15 @@ GEM
notiffany (0.1.1)
nenv (~> 0.1)
shellany (~> 0.0)
oauth2 (0.9.4)
faraday (>= 0.8, < 0.10)
oauth2 (1.3.1)
faraday (>= 0.8, < 0.12)
jwt (~> 1.0)
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (~> 1.2)
omniauth (1.2.1)
hashie (>= 1.2, < 3)
rack (~> 1.0)
rack (>= 1.2, < 3)
omniauth (1.6.1)
hashie (>= 3.4.6, < 3.6.0)
rack (>= 1.6.2, < 3)
omniauth-facebook (1.6.0)
omniauth-oauth2 (~> 1.1)
omniauth-github (1.1.2)
@ -312,10 +312,8 @@ GEM
omniauth-google-oauth2 (0.2.4)
omniauth (~> 1.0)
omniauth-oauth2 (~> 1.1)
omniauth-oauth2 (1.1.2)
faraday (>= 0.8, < 0.10)
multi_json (~> 1.3)
oauth2 (~> 0.9.3)
omniauth-oauth2 (1.4.0)
oauth2 (~> 1.0)
omniauth (~> 1.2)
omniauth-openid (1.0.1)
omniauth (~> 1.0)
@ -425,8 +423,9 @@ GEM
redcarpet (3.2.3)
referer-parser (0.2.1)
request_store (1.1.0)
responders (2.1.1)
railties (>= 4.2.0, < 5.1)
responders (2.4.0)
actionpack (>= 4.2.0, < 5.3)
railties (>= 4.2.0, < 5.3)
rest-client (1.8.0)
http-cookie (>= 1.0.2, < 2.0)
mime-types (>= 1.16, < 3.0)
@ -473,11 +472,12 @@ GEM
rubyzip (1.2.1)
safe_yaml (1.0.4)
sass (3.2.19)
sass-rails (4.0.4)
railties (>= 4.0.0, < 5.0)
sass (~> 3.2.2)
sprockets (~> 2.8, < 2.12)
sprockets-rails (~> 2.0)
sass-rails (5.0.6)
railties (>= 4.0.0, < 6)
sass (~> 3.1)
sprockets (>= 2.8, < 4.0)
sprockets-rails (>= 2.0, < 4.0)
tilt (>= 1.1, < 3)
selectize-rails (0.12.4)
shellany (0.0.1)
shoulda-matchers (2.8.0)
@ -494,11 +494,9 @@ GEM
spring (1.6.3)
spring-commands-rspec (1.0.4)
spring (>= 0.9.1)
sprockets (2.11.3)
hike (~> 1.2)
multi_json (~> 1.0)
rack (~> 1.0)
tilt (~> 1.1, != 1.3.0)
sprockets (3.7.1)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
sprockets-rails (2.3.3)
actionpack (>= 3.0)
activesupport (>= 3.0)
@ -566,7 +564,7 @@ DEPENDENCIES
acts_as_list
ahoy_matey
autoprefixer-rails
awesome_nested_set (~> 3.0.0.rc.5)
awesome_nested_set (~> 3.1.3)
axlsx!
axlsx_rails
bootstrap-sass (~> 3.3.4.1)

View file

@ -1,5 +1,5 @@
# Translation
We are using [Transifex] (https://www.transifex.com/opensuse-community/osem/) to manage our translations.
We are using [Transifex](https://www.transifex.com/opensuse-community/osem/) to manage our translations.
We are also using the _Live_ feature of Transifex. That means that all strings from OSEM instances are automatically collected and are available for translating.
>Automated collection only works if you use the API key (See at the end of this file)
@ -7,7 +7,7 @@ We are also using the _Live_ feature of Transifex. That means that all strings f
## 1. Translate
* Start translating:
1. Navigate to the [project's page] (https://www.transifex.com/opensuse-community/osem)
1. Navigate to the [project's page](https://www.transifex.com/opensuse-community/osem)
2. Click **translation** button
3. Select **language**
4. Select **resource** (events.opensuse.org)
@ -27,7 +27,7 @@ Eg. Assuming you have signed up yourself as a translator for OSEM, to translate
* How to request to publish translated strings
After you make sure that you have properly reviewed the newly translated strings (they need to be marked as **reviewed** otherwise they won't go live), you can open a [new issue] (https://github.com/openSUSE/osem/issues/new) with the following information:
After you make sure that you have properly reviewed the newly translated strings (they need to be marked as **reviewed** otherwise they won't go live), you can open a [new issue](https://github.com/openSUSE/osem/issues/new) with the following information:
Title: [Transifex] Publish translation for EN

View file

@ -1,18 +1,14 @@
$(function () {
$(document).ready(function() {
$('.datatable').DataTable({
// ajax: ...,
stateSave: true,
autoWidth: false,
pagingType: 'full_numbers',
"lengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]]
});
$('.datatable').DataTable({
// ajax: ...,
stateSave: true,
autoWidth: false,
pagingType: 'full_numbers',
"lengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
});
$('#versionstable').DataTable({
pagingType: 'full_numbers',
order: [[ 0, 'desc' ]]
});
$('#versionstable').DataTable({
pagingType: 'full_numbers',
order: [[ 0, 'desc' ]]
});
});

View file

@ -29,7 +29,7 @@
}
}
.dropdown-menu {
padding: 17px 17px 0px 17px;
padding: 17px;
min-width: 225px;
}
}

View file

@ -89,4 +89,8 @@ p.comment-body {
.changeset{
display: none;
}
}
.box{
height: 230px;
}

View file

@ -7,9 +7,13 @@ module Admin
def show; end
def new; end
def new
@url = admin_conference_booths_path(@conference.short_title)
end
def create
@url = admin_conference_booths_path(@conference.short_title)
@booth = @conference.booths.new(booth_params)
@booth.submitter = current_user
@ -23,9 +27,13 @@ module Admin
end
end
def edit; end
def edit
@url = admin_conference_booth_path(@conference.short_title, @booth.id)
end
def update
@url = admin_conference_booth_path(@conference.short_title, @booth.id)
@booth.update_attributes(booth_params)
if @booth.save
@ -38,18 +46,19 @@ module Admin
end
end
def destroy
if @booth.destroy
redirect_to admin_conference_booths_path,
notice: 'Booth successfully destroyed.'
else
redirect_to admin_conference_booths_path,
error: "Booth couldn't be deleted. #{@booth.errors.full_messages.join('. ')}."
end
end
def accept
update_state(:accept, 'Booth accepted!')
@booth.accept!
if @booth.save
if @conference.email_settings.send_on_booths_acceptance
Mailbot.conference_booths_acceptance_mail(@booth).deliver
end
redirect_to admin_conference_booths_path(conference_id: @conference.short_title),
notice: 'Booth successfully accepted!'
else
redirect_to admin_conference_booths_path(conference_id: @conference.short_title)
flash[:error] = "Booth could not be accepted. #{@booth.errors.full_messages.to_sentence}."
end
end
def to_accept
@ -61,7 +70,16 @@ module Admin
end
def reject
update_state(:reject, 'Booth rejected')
@booth.reject!
if @booth.save
Mailbot.conference_booths_rejection_mail(@booth).deliver
redirect_to admin_conference_booths_path(conference_id: @conference.short_title),
notice: 'Booth successfully rejected.'
else
redirect_to admin_conference_booths_path(conference_id: @conference.short_title)
flash[:error] = "Booth could not be rejected. #{@booth.errors.full_messages.to_sentence}."
end
end
def restart

View file

@ -212,7 +212,7 @@ module Admin
:vpositions_attributes, :use_volunteers, :color,
:sponsorship_levels_attributes, :sponsors_attributes,
:targets, :targets_attributes,
:campaigns, :campaigns_attributes, :registration_limit, :organization_id, :ticket_layout)
:campaigns, :campaigns_attributes, :registration_limit, :organization_id, :ticket_layout, :booth_limit)
end
end
end

View file

@ -30,7 +30,9 @@ module Admin
:send_on_conference_registration_dates_updated, :conference_registration_dates_updated_subject, :conference_registration_dates_updated_body,
:send_on_venue_updated, :venue_updated_subject, :venue_updated_body,
:send_on_cfp_dates_updated, :cfp_dates_updated_subject, :cfp_dates_updated_body,
:send_on_program_schedule_public, :program_schedule_public_subject, :program_schedule_public_body)
:send_on_program_schedule_public, :program_schedule_public_subject, :program_schedule_public_body,
:send_on_booths_acceptance, :booths_acceptance_subject, :booths_acceptance_body,
:send_on_booths_rejection, :booths_rejection_subject, :booths_rejection_body)
end
end
end

View file

@ -17,7 +17,7 @@ module Admin
def index
@events = @program.events
@tracks = @program.tracks
@tracks = @program.tracks.confirmed.cfp_active
@difficulty_levels = @program.difficulty_levels
@event_types = @program.event_types
@tracks_distribution_confirmed = @conference.tracks_distribution(:confirmed)
@ -43,7 +43,7 @@ module Admin
end
def show
@tracks = @program.tracks
@tracks = @program.tracks.confirmed.cfp_active
@event_types = @program.event_types
@comments = @event.root_comments
@comment_count = @event.comment_threads.count
@ -58,7 +58,7 @@ module Admin
def edit
@event_types = @program.event_types
@tracks = Track.all
@tracks = @program.tracks.confirmed.cfp_active
@comments = @event.root_comments
@comment_count = @event.comment_threads.count
@user = @event.submitter

View file

@ -47,7 +47,8 @@ module Admin
:include_tracks, :include_program, :include_cfp,
:include_venue, :include_registrations,
:include_tickets, :include_lodgings,
:include_sponsors, :include_social_media)
:include_sponsors, :include_social_media,
:include_booths)
end
end
end

View file

@ -0,0 +1,16 @@
module Admin
class TicketScanningsController < Admin::BaseController
before_action :authenticate_user!
load_resource :physical_ticket, find_by: :token
# We authorize manually in these actions
skip_authorize_resource only: [:create]
def create
@ticket_scanning = TicketScanning.new(physical_ticket: @physical_ticket)
authorize! :create, @ticket_scanning
@ticket_scanning.save
redirect_to conferences_path,
notice: "Ticket with token #{@physical_ticket.token} successfully scanned."
end
end
end

View file

@ -50,7 +50,7 @@ module Admin
private
def ticket_params
params.require(:ticket).permit(:conference, :title, :url, :description, :conference_id, :price_cents, :price_currency, :price)
params.require(:ticket).permit(:conference, :title, :url, :description, :conference_id, :price_cents, :price_currency, :price, :registration_ticket)
end
end
end

View file

@ -4,6 +4,9 @@ module Admin
load_and_authorize_resource :program, through: :conference, singleton: true
load_and_authorize_resource through: :program, find_by: :short_name
# Show flash message with ajax calls
after_action :prepare_unobtrusive_flash, only: :toggle_cfp_inclusion
def index; end
def show
@ -19,6 +22,8 @@ module Admin
def create
@track = @program.tracks.new(track_params)
@track.state = 'confirmed'
@track.cfp_active = true
if @track.save
redirect_to admin_conference_program_tracks_path(conference_id: @conference.short_title),
notice: 'Track successfully created.'
@ -53,16 +58,65 @@ module Admin
def toggle_cfp_inclusion
@track.cfp_active = !@track.cfp_active
if @track.save
head :ok
flash[:notice] = "Successfully changed cfp inclusion of #{@track.name} to #{@track.cfp_active}"
else
head :unprocessable_entity
flash[:error] = "Failed to toggle cfp inclusion of #{@track.name} to #{@track.cfp_active}"
end
respond_to do |format|
format.js
end
end
def restart
update_state(:restart, "Review for #{@track.name} started!")
end
def to_accept
update_state(:to_accept, "Track #{@track.name} marked as a possible acceptance!")
end
def accept
if @track.room && @track.start_date && @track.end_date
update_state(:accept, "Track #{@track.name} accepted!")
else
flash[:alert] = 'Please make sure that the track has a room and start/end dates before accepting it'
redirect_to edit_admin_conference_program_track_path(@conference.short_title, @track)
end
end
def confirm
update_state(:confirm, "Track #{@track.name} confirmed!")
end
def to_reject
update_state(:to_reject, "Track #{@track.name} marked as a possible rejection!")
end
def reject
update_state(:reject, "Track #{@track.name} rejected!")
end
def cancel
update_state(:cancel, "Track #{@track.name} canceled!")
end
private
def track_params
params.require(:track).permit(:name, :description, :color, :short_name, :cfp_active)
params.require(:track).permit(:name, :description, :color, :short_name, :cfp_active, :start_date, :end_date, :room_id)
end
def update_state(transition, notice)
errors = @track.update_state(transition)
if errors.blank?
flash[:notice] = notice
else
flash[:error] = errors
end
redirect_back_or_to(admin_conference_program_tracks_path(conference_id: @conference.short_title))
end
end
end

View file

@ -0,0 +1,97 @@
class BoothsController < ApplicationController
before_action :authenticate_user!
load_resource :conference, find_by: :short_title
load_and_authorize_resource through: :conference
skip_authorize_resource only: [:withdraw, :confirm, :restart]
def index
@booths = current_user.booths.where(conference_id: @conference.id).uniq
end
def show; end
def new
@url = conference_booths_path(@conference.short_title)
end
def create
@url = conference_booths_path(@conference.short_title)
@booth.submitter = current_user
if @booth.save
redirect_to conference_booths_path,
notice: 'Booth successfully created.'
else
flash[:error] = "Creating booth failed. #{@booth.errors.full_messages.to_sentence}."
render :new
end
end
def edit
@url = conference_booth_path(@conference.short_title, @booth.id)
end
def update
@url = conference_booth_path(@conference.short_title, @booth.id)
@booth.update_attributes(booth_params)
if @booth.save
redirect_to conference_booths_path,
notice: 'Booth successfully updated!'
else
flash[:error] = "Booth could not be updated. #{@booth.errors.full_messages.to_sentence}."
end
end
def destroy; end
def withdraw
authorize! :update, @booth
@url = conference_booth_path(@conference.short_title, @booth.id)
@booth.withdraw!
if @booth.save
redirect_to conference_booths_path,
notice: 'Booth successfully withdrawn'
else
flash[:error] = "Booth could not be withdrawn. #{@booth.errors.full_messages.to_sentence}."
end
end
def confirm
authorize! :update, @booth
@url = conference_booth_path(@conference.short_title, @booth.id)
@booth.confirm!
if @booth.save
redirect_to conference_booths_path,
notice: 'Booth successfully confirmed'
else
flash[:error] = "Booth could not be confirmed. #{@booth.errors.full_messages.to_sentence}."
end
end
def restart
authorize! :update, @booth
@url = conference_booth_path(@conference.short_title, @booth.id)
@booth.restart!
if @booth.save
redirect_to conference_booths_path,
notice: 'Booth successfully re-submitted'
else
flash[:error] = "Booth could not be re-submitted. #{@booth.errors.full_messages.to_sentence}."
end
end
private
def booth_params
params.require(:booth).permit(:title, :description, :reasoning, :state, :picture, :conference_id,
:created_at, :updated_at, :submitter_relationship, :website_url, responsible_ids: [])
end
end

View file

@ -1,7 +1,7 @@
class PhysicalTicketController < ApplicationController
before_action :authenticate_user!
load_resource :conference, find_by: :short_title
load_and_authorize_resource
load_and_authorize_resource find_by: :token
authorize_resource :conference_registrations, class: Registration
def index

View file

@ -5,17 +5,19 @@ class SubscriptionsController < ApplicationController
def create
@subscription = current_user.subscriptions.build(conference_id: @conference.id)
if @subscription.save!
redirect_to root_path, notice: "You have been subscribed to receive email notifications for #{@conference.short_title}."
if @subscription.save
redirect_to root_path, notice: "You have subscribed to receive email notifications for #{@conference.title}."
else
redirect_to root_path, error: subscription.errors.full_messages.to_sentence
redirect_to root_path, error: @subscription.errors.full_messages.to_sentence
end
end
def destroy
@subscription = current_user.subscriptions.find_by(conference_id: @conference.id)
redirect_to(root_path, error: "You are not subscribed to #{@conference.title}.") && return unless @subscription
if @subscription.destroy
redirect_to root_path, notice: "You have been unsubscribed and now you will not be receiving email notifications for #{@conference.short_title}."
redirect_to root_path, notice: "You have unsubscribed and you will not be receiving email notifications for #{@conference.title}."
else
redirect_to root_path, error: @subscription.errors.full_messages.to_sentence
end

View file

@ -4,7 +4,7 @@ class TracksController < ApplicationController
load_and_authorize_resource through: :program, find_by: :short_name
def index
@tracks = current_user.tracks.where(program: @program)
@tracks = @tracks.where(submitter: current_user)
end
def show; end
@ -18,7 +18,6 @@ class TracksController < ApplicationController
def create
@track = @program.tracks.new(track_params)
@track.submitter = current_user
@track.state = 'new'
@track.cfp_active = false
if @track.save
redirect_to conference_program_tracks_path(conference_id: @conference.short_title),
@ -39,9 +38,33 @@ class TracksController < ApplicationController
end
end
def restart
update_state(:restart, "Track #{@track.name} re-submitted.")
end
def confirm
update_state(:confirm, "Track #{@track.name} confirmed.")
end
def withdraw
update_state(:withdraw, "Track #{@track.name} withdrawn.")
end
private
def track_params
params.require(:track).permit(:name, :description, :color, :short_name)
params.require(:track).permit(:name, :description, :color, :short_name, :start_date, :end_date, :relevance)
end
def update_state(transition, notice)
errors = @track.update_state(transition)
if errors.blank?
flash[:notice] = notice
else
flash[:error] = errors
end
redirect_back_or_to(conference_program_tracks_path(conference_id: @conference.short_title))
end
end

View file

@ -56,7 +56,7 @@ module ApplicationHelper
end
def tracks(conference)
all = conference.program.tracks.map {|t| t.name}
all = conference.program.tracks.confirmed.cfp_active.pluck(:name)
first = all[0...-1]
last = all[-1]
ts = ''

View file

@ -39,4 +39,12 @@ module EventsHelper
content_tag :span, 'REPLACEMENT', class: (['label', 'label-info'] + label_classes)
end
end
def track_selector_input(form)
if @program.tracks.any?
form.input :track_id, as: :select,
collection: @program.tracks.where(state: 'confirmed', cfp_active: true).pluck(:name, :id),
include_blank: true
end
end
end

View file

@ -15,6 +15,19 @@ module FormatHelper
end
end
def booth_status_icon(booth)
case booth.state
when 'new', 'to_reject', 'to_accept'
'fa-eye'
when 'accepted'
'fa-check text-muted'
when 'confirmed'
'fa-check text-success'
when 'rejected', 'withdrawn', 'canceled'
'fa-ban'
end
end
def event_progress_color(progress)
progress = progress.to_i
if progress == 100

View file

@ -8,6 +8,22 @@ class Mailbot < ActionMailer::Base
conference.email_settings.registration_body))
end
def ticket_confirmation_mail(ticket_purchase)
@ticket_purchase = ticket_purchase
@conference = ticket_purchase.conference
@user = ticket_purchase.user
PhysicalTicket.last(ticket_purchase.quantity).each do |physical_ticket|
pdf = TicketPdf.new(@conference, @user, physical_ticket, @conference.ticket_layout.to_sym, "ticket_for_#{@conference.short_title}_#{physical_ticket.id}")
attachments["ticket_for_#{@conference.short_title}_#{physical_ticket.id}.pdf"] = pdf.render
end
mail(to: @user.email,
from: @conference.contact.email,
template_name: 'ticket_confirmation_template',
subject: "#{@conference.title} | Ticket Confirmation and PDF!")
end
def acceptance_mail(event)
conference = event.program.conference
@ -81,6 +97,24 @@ class Mailbot < ActionMailer::Base
conference.email_settings.cfp_dates_updated_body))
end
def conference_booths_acceptance_mail(booth)
conference = booth.conference
mail(to: booth.submitter.email,
from: conference.contact.email,
subject: conference.email_settings.booths_acceptance_subject,
body: conference.email_settings.generate_booth_mail(booth, conference.email_settings.booths_acceptance_body))
end
def conference_booths_rejection_mail(booth)
conference = booth.conference
mail(to: booth.submitter.email,
from: conference.contact.email,
subject: conference.email_settings.booths_rejection_subject,
body: conference.email_settings.generate_booth_mail(booth, conference.email_settings.booths_rejection_body))
end
def event_comment_mail(comment, user)
@comment = comment
@event = @comment.commentable

View file

@ -75,13 +75,21 @@ class Ability
can [:new, :create], Payment, user_id: user.id
can [:index, :show], PhysicalTicket, user: user
can [:new, :create], Booth do |booth|
booth.new_record? && booth.conference.program.cfps.for_booths.try(:open?)
end
can [:edit, :update, :index, :show], Booth do |booth|
booth.users.include?(user)
end
can [:create, :destroy], Subscription, user_id: user.id
can [:new, :create], Event do |event|
event.program.cfp_open? && event.new_record?
end
can [:update, :show, :delete, :index], Event do |event|
can [:update, :show, :index], Event do |event|
event.users.include?(user)
end
@ -89,6 +97,16 @@ class Ability
can :manage, Commercial, commercialable_type: 'Event', commercialable_id: user.events.pluck(:id)
can [:destroy], Openid
can [:new, :create], Track do |track|
track.new_record? && track.program.cfps.for_tracks.try(:open?)
end
can [:index, :show, :restart, :confirm, :withdraw], Track, submitter_id: user.id
can [:edit, :update], Track do |track|
user == track.submitter && !(track.accepted? || track.confirmed?)
end
end
# Abilities for users with roles wandering around in non-admin views.

View file

@ -18,7 +18,6 @@ class AdminAbility
end
def common_abilities_for_roles(user)
can :manage, User, id: user.id
can :manage, Registration, user_id: user.id
can :index, Conference
@ -40,7 +39,7 @@ class AdminAbility
event.program.cfp_open? && event.new_record?
end
can [:update, :show, :delete, :index], Event do |event|
can [:update, :show, :index], Event do |event|
event.users.include?(user)
end
@ -75,6 +74,11 @@ class AdminAbility
cannot :destroy, Track do |track|
track.self_organized?
end
# Can't accept a booth when booth_limit is reached
cannot :accept, Booth do |booth|
conference = booth.conference
conference.maximum_accepted_booths?
end
end
# Abilities for signed in users with roles
@ -145,6 +149,10 @@ class AdminAbility
can :manage, Sponsor, conference_id: conf_ids
can :manage, SponsorshipLevel, conference_id: conf_ids
can :manage, Ticket, conference_id: conf_ids
can :create, TicketScanning do |ticket_scanning|
conf_id = ticket_scanning.physical_ticket.ticket_purchase.conference_id
conf_ids.include? conf_id
end
can :index, Comment, commentable_type: 'Event',
commentable_id: Event.where(program_id: Program.where(conference_id: conf_ids).pluck(:id)).pluck(:id)
@ -220,6 +228,10 @@ class AdminAbility
can :manage, Question do |question|
!(question.conferences.pluck(:id) & conf_ids_for_info_desk).empty?
end
can :create, TicketScanning do |ticket_scanning|
conf_id = ticket_scanning.physical_ticket.ticket_purchase.conference_id
conf_ids_for_info_desk.include? conf_id
end
# Abilities for Role (Conference resource)
can [:index, :show], Role do |role|
@ -276,6 +288,10 @@ class AdminAbility
can :manage, Track, id: track_ids_for_track_organizer
cannot [:edit, :update], Track do |track|
track.self_organized_and_accepted_or_confirmed?
end
# Show Roles in the admin sidebar and allow authorization of the index action
can [:index, :show], Role do |role|
role.resource_type == 'Conference' || role.resource_type == 'Track'

View file

@ -25,6 +25,9 @@ class Booth < ActiveRecord::Base
:submitter_relationship,
presence: true
scope :accepted, -> { where(state: 'accepted') }
scope :confirmed, -> { where(state: 'confirmed') }
mount_uploader :picture, PictureUploader, mount_on: :logo_link
state_machine initial: :new do
@ -35,12 +38,16 @@ class Booth < ActiveRecord::Base
state :to_reject
state :rejected
state :canceled
state :confirmed
event :restart do
transitions to: :new, from: [:withdrawn, :to_accept, :to_reject, :canceled]
transitions to: :new, from: [:withdrawn, :rejected, :canceled]
end
event :withdraw do
transitions to: :withdrawn, from: [:new, :to_accept, :accepted, :to_reject, :rejected]
transitions to: :withdrawn, from: [:new, :to_accept, :accepted, :to_reject, :rejected, :confirmed]
end
event :confirm do
transitions to: :confirmed, from: [:accepted]
end
event :to_accept do
transitions to: :to_accept, from: [:new, :to_reject]
@ -55,7 +62,7 @@ class Booth < ActiveRecord::Base
transitions to: :rejected, from: [:new, :to_reject]
end
event :cancel do
transitions to: :canceled, from: [:accepted, :rejected]
transitions to: :canceled, from: [:accepted, :rejected, :to_accept, :to_reject, :confirmed]
end
end

View file

@ -1,9 +1,7 @@
# cannot delete program if there are events submitted
class Cfp < ActiveRecord::Base
TYPES = %w(events booths).freeze
scope :for_events, (-> { find_by(cfp_type: 'events') })
TYPES = %w(events booths tracks).freeze
has_paper_trail ignore: [:updated_at], meta: { conference_id: :conference_id }
belongs_to :program
@ -78,6 +76,33 @@ class Cfp < ActiveRecord::Base
(start_date..end_date).cover?(Date.current)
end
##
# Finds the cfp for events if it exists
#
# ====Returns
# * +Cfp+ -> The cfp with type 'events'
def self.for_events
find_by(cfp_type: 'events')
end
##
# Finds the cfp for tracks if it exists
#
# ====Returns
# * +Cfp+ -> The cfp with type 'tracks'
def self.for_tracks
find_by(cfp_type: 'tracks')
end
##
# Finds the cfp for booths if it exists
#
# ====Returns
# * +Cfp+ -> The cfp with type 'booths'
def self.for_booths
find_by(cfp_type: 'booths')
end
private
def before_end_of_conference

View file

@ -738,6 +738,15 @@ class Conference < ActiveRecord::Base
(start_hour..(end_hour - 1)).cover?(current_hour) ? current_hour - start_hour : 0
end
##
#
# ====Returns
# * +True+ -> if accepted booths are equal to the booth limit
# * +False+ -> Accepted booths have not reached the booth limit
def maximum_accepted_booths?
booth_limit > 0 && booths.accepted.count + booths.confirmed.count >= booth_limit
end
##
# Return the current conference object to be used in RevisionCount
#

View file

@ -3,7 +3,7 @@ class EmailSettings < ActiveRecord::Base
has_paper_trail on: [:update], ignore: [:updated_at], meta: { conference_id: :conference_id }
def get_values(conference, user, event = nil)
def get_values(conference, user, event = nil, booth = nil)
h = {
'email' => user.email,
'name' => user.name,
@ -45,6 +45,10 @@ class EmailSettings < ActiveRecord::Base
h['proposalslink'] = Rails.application.routes.url_helpers.conference_program_proposals_url(
conference.short_title, host: (ENV['OSEM_HOSTNAME'] || 'localhost:3000'))
end
if booth
h['booth_title'] = booth.title
end
h
end
@ -58,6 +62,11 @@ class EmailSettings < ActiveRecord::Base
parse_template(conf_update_template, values)
end
def generate_booth_mail(booth, booth_template)
values = get_values(booth.conference, booth.submitter, nil, booth)
parse_template(booth_template, values)
end
private
def parse_template(text, values)

View file

@ -45,6 +45,7 @@ class Event < ActiveRecord::Base
validates :max_attendees, numericality: { only_integer: true, greater_than_or_equal_to: 1, allow_nil: true }
validate :max_attendees_no_more_than_room_size
validate :acceptable_track
scope :confirmed, -> { where(state: 'confirmed') }
scope :canceled, -> { where(state: 'canceled') }
@ -303,4 +304,11 @@ class Event < ActiveRecord::Base
def conference_id
program.conference_id
end
##
# Allow only confirmed tracks that belong to the same program and are included in the cfp
def acceptable_track
return unless track && track.program && program
errors.add(:track, 'is invalid') unless track.confirmed? && track.cfp_active && track.program == program
end
end

View file

@ -4,4 +4,19 @@ class PhysicalTicket < ActiveRecord::Base
has_one :conference, through: :ticket_purchase
has_one :user, through: :ticket_purchase
has_many :ticket_scannings
before_create :set_token
private
def set_token
self.token = generate_token
end
def generate_token
loop do
token = SecureRandom.hex(10)
break token unless PhysicalTicket.exists?(token: token)
end
end
end

View file

@ -2,6 +2,7 @@ class Room < ActiveRecord::Base
include RevisionCount
belongs_to :venue
has_many :event_schedules, dependent: :destroy
has_many :tracks
has_paper_trail ignore: [:guid], meta: { conference_id: :conference_id }

View file

@ -1,5 +1,4 @@
class Subscription < ActiveRecord::Base
validates :user_id, uniqueness: { scope: [:conference_id] }
belongs_to :conference
belongs_to :user

View file

@ -69,6 +69,7 @@ class TicketPurchase < ActiveRecord::Base
PhysicalTicket.transaction do
quantity.times { physical_tickets.create }
end
Mailbot.ticket_confirmation_mail(self).deliver_later
end
end

View file

@ -1,13 +1,15 @@
class Track < ActiveRecord::Base
include ActiveRecord::Transitions
include RevisionCount
resourcify :roles, dependent: :delete_all
belongs_to :program
belongs_to :submitter, class_name: 'User'
belongs_to :room
has_many :events, dependent: :nullify
has_paper_trail only: [:name, :description, :color], meta: { conference_id: :conference_id }
has_paper_trail ignore: [:updated_at], meta: { conference_id: :conference_id }
before_create :generate_guid
validates :name, presence: true
@ -18,12 +20,58 @@ class Track < ActiveRecord::Base
uniqueness: {
scope: :program
}
validates :state, presence: true, if: :self_organized?
validates :cfp_active, inclusion: { in: [true, false] }, if: :self_organized?
validates :state,
presence: true,
inclusion: { in: %w(new to_accept accepted confirmed to_reject rejected canceled withdrawn) }
validates :cfp_active, inclusion: { in: [true, false] }
validates :start_date, presence: true, if: :self_organized_and_accepted_or_confirmed?
validates :end_date, presence: true, if: :self_organized_and_accepted_or_confirmed?
validates :room, presence: true, if: :self_organized_and_accepted_or_confirmed?
validates :relevance, presence: true, if: :self_organized?
validates :description, presence: true, if: :self_organized?
validate :valid_dates
validate :valid_room, if: :self_organized_and_accepted_or_confirmed?
before_validation :capitalize_color
after_create :create_organizer_role, if: :self_organized?
scope :confirmed, -> { where(state: 'confirmed') }
scope :cfp_active, -> { where(cfp_active: true) }
state_machine initial: :pending do
state :new
state :to_accept
state :accepted
state :confirmed
state :to_reject
state :rejected
state :canceled
state :withdrawn
event :restart do
transitions to: :new, from: [:rejected, :withdrawn, :canceled]
end
event :to_accept do
transitions to: :to_accept, from: [:new]
end
event :accept do
transitions to: :accepted, from: [:new, :to_accept], on_transition: :create_organizer_role
end
event :confirm do
transitions to: :confirmed, from: [:accepted], on_transition: :assign_role_to_submitter
end
event :to_reject do
transitions to: :to_reject, from: [:new]
end
event :reject do
transitions to: :rejected, from: [:new, :to_reject]
end
event :cancel do
transitions to: :canceled, from: [:to_accept, :to_reject, :accepted, :confirmed], on_transition: :revoke_role_and_cleanup
end
event :withdraw do
transitions to: :withdrawn, from: [:new, :to_accept, :to_reject, :accepted, :confirmed], on_transition: :revoke_role_and_cleanup
end
end
def conference
program.conference
@ -43,6 +91,71 @@ class Track < ActiveRecord::Base
short_name
end
def transition_possible?(transition)
self.class.state_machine.events_for(current_state).include?(transition)
end
# Gives the role of the track_organizer to the submitter
def assign_role_to_submitter
submitter.add_role 'track_organizer', self
end
# Revokes the track organizer role and removes the track from events that have it set
def revoke_role_and_cleanup
role = Role.find_by(name: 'track_organizer', resource: self)
if role
role.users.each do |user|
user.remove_role 'track_organizer', self
end
end
events.each do |event|
event.track = nil
event.save!
end
end
##
# Checks if the track is accepted
# ====Returns
# * +true+ -> If the track's state is 'accepted'
# * +false+ -> If the track's state isn't 'accepted'
def accepted?
state == 'accepted'
end
##
# Checks if the track is confirmed
# ====Returns
# * +true+ -> If the track's state is 'confirmed'
# * +false+ -> If the track's state isn't 'confirmed'
def confirmed?
state == 'confirmed'
end
##
# Checks if a self-organized track is accepted or confirmed
# ====Returns
# * +true+ -> If the track's state is 'accepted' or 'confirmed'
# * +false+ -> If the track's state is neither 'accepted' nor 'confirmed'
def self_organized_and_accepted_or_confirmed?
self_organized? && (accepted? || confirmed?)
end
def update_state(transition)
error = ''
begin
send(transition)
rescue Transitions::InvalidTransition => e
error += "State update failed. #{e.message} "
end
error += errors.full_messages.join(', ') unless save
error
end
private
def generate_guid
@ -66,4 +179,34 @@ class Track < ActiveRecord::Base
def create_organizer_role
Role.where(name: 'track_organizer', resource: self).first_or_create(description: 'For the organizers of the Track')
end
def valid_dates
if start_date && program && program.conference && program.conference.start_date && (start_date < program.conference.start_date)
errors.add(:start_date, "can't be before the conference start date (#{program.conference.start_date})")
end
if end_date && program && program.conference && program.conference.start_date && (end_date < program.conference.start_date)
errors.add(:end_date, "can't be before the conference start date (#{program.conference.start_date})")
end
if start_date && program && program.conference && program.conference.end_date && (start_date > program.conference.end_date)
errors.add(:start_date, "can't be after the conference end date (#{program.conference.end_date})")
end
if end_date && program && program.conference && program.conference.end_date && (end_date > program.conference.end_date)
errors.add(:end_date, "can't be after the conference end date (#{program.conference.end_date})")
end
if start_date && end_date && (start_date > end_date)
errors.add(:start_date, 'can\'t be after the end date')
end
end
##
# Verify that the room is a room of the conference
def valid_room
if room && room.venue && room.venue.conference && program && program.conference && (program.conference != room.venue.conference)
errors.add(:room, "must be a room of #{program.conference.venue.name}")
end
end
end

View file

@ -165,7 +165,11 @@ class User < ActiveRecord::Base
def get_roles
result = {}
roles.each do |role|
resource = Conference.find(role.resource_id).short_title
resource = if role.resource_type == 'Conference'
Conference.find(role.resource_id).short_title
elsif role.resource_type == 'Track'
Track.find(role.resource_id).name
end
if result[role.name].nil?
result[role.name] = [resource]
else

View file

@ -1,17 +1,32 @@
- 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 can? :accept, booth
- if @conference.booth_limit > 0
- confirm_message = ' You are able to accept '+ pluralize(@conference.booth_limit - (@conference.booths.accepted.count + @conference.booths.confirmed.count), 'more booth') + " (booth limit set to #{@conference.booth_limit}). Are you sure you want to accept this one?"
- if @conference.email_settings.send_on_booths_acceptance
- link = 'Accept with email'
- confirm_message = "By accepting this booth, an email will be sent informing the submitter for the acceptance. You may change the state to \'To accept\' until you are completely sure." + confirm_message
- else
- link = 'Accept booth'
%li= link_to link,
accept_admin_conference_booth_path(@conference.short_title, booth),
method: :patch ,id: "accept_booth_#{booth.id}",
data: (confirm_message ? { confirm: confirm_message } : nil)
- if booth.transition_possible? :reject
%li= link_to 'Reject booth',
- if @conference.email_settings.send_on_booths_rejection
- link = 'Reject with email'
- else
- link = 'Reject'
%li= link_to link,
reject_admin_conference_booth_path(@conference.short_title, booth),
method: :patch, confirm: 'Are you sure?', id: "reject_booth_#{booth.id}"
method: :patch, id: "reject_booth_#{booth.id}",
data: (@conference.email_settings.send_on_booths_rejection ? { confirm: 'By rejecting this booth, an email will be sent informing the submitter about the rejection. You may change the state to \'To reject\' until you are completely sure.'} : nil)
- if booth.transition_possible? :to_reject
%li= link_to 'To reject booth',
to_reject_admin_conference_booth_path(@conference.short_title, booth),
method: :patch, confirm: 'Are you sure?', id: "to_reject_booth_#{booth.id}"
method: :patch, id: "to_reject_booth_#{booth.id}"
- if booth.transition_possible? :restart
%li= link_to 'Start review',

View file

@ -1,33 +0,0 @@
.row
.col-md-12
.page-header
%title Request a Booth
.row
.col-md-8
= semantic_form_for(@booth, url: @booth.new_record? ? admin_conference_booths_path(@conference.short_title) : admin_conference_booth_path(@conference.short_title, @booth.id), 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,
hint: 'This field becomes public upon request acceptance'
= f.input :reasoning, input_html: { rows: 5, data: { provide: 'markdown-editable' } }, required: true,
label: 'How it fits the conference'
= f.input :submitter_relationship, input_html: { rows: 5, data: { provide: 'markdown-editable' } }, required: true,
label: 'Submitter\'s relation',
hint: 'e.g. employee, comunity manager, etc'
= f.input :website_url
= responsibles_selector_input f
= image_tag f.object.picture.thumb.url if f.object.picture?
= f.input :picture
%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'
:javascript
$(document).ready(function() {
$('#booth_responsible_ids').selectize({
plugins: ['remove_button'],
minItems: 2
} )
});

View file

@ -2,4 +2,4 @@
Editing
= @booth.title
= render 'form'
= render 'booths/form'

View file

@ -9,51 +9,68 @@
= link_to 'Add Booth', new_admin_conference_booth_path(@conference.short_title), class: 'button btn btn-primary'
%p.text-muted
All the booth requests
.row
.col-md-12
.margin-booth-table
%table.table.table-striped.table-bordered.table-hover.datatable
%thead
%th
%b ID
%th
%b Logo
%th
%b Title
%th
%b Submitter
%th
%b Responsibles
%th
%b State
%th
%b Actions
- @booths.each do |booth|
%tr
%h4
- if @conference.booth_limit == 0
%p
Set the
= link_to 'Booth limit', edit_admin_conference_path(@conference.short_title)
to make sure you are not accepting more booths than you can accommodate.
- elsif !@conference.maximum_accepted_booths?
%p
You cannot accept more than
%b
= pluralize(@conference.booth_limit, 'booth')
(
= pluralize(@conference.booths.accepted.count + @conference.booths.confirmed.count, 'accepted booth')
so far)
- else
%p
You have reached the maximum number of accepted booths.
(
= link_to "#{@conference.booth_limit} booths", edit_admin_conference_path(@conference.short_title)
)
%table.table.table-striped.table-bordered.table-hover.datatable
%thead
%th
%b ID
%th
%b Logo
%th
%b Title
%th
%b Submitter
%th
%b Responsibles
%th
%b State
%th
%b Actions
- @booths.each do |booth|
%tr
%td
= booth.id
%td
- if booth.logo_link
= image_tag(booth.picture.thumb.url, width: '20%')
%td
= link_to booth.title, admin_conference_booth_path(@conference.short_title, booth)
%td
= link_to booth.submitter.name, admin_user_path(booth.submitter) if booth.submitter
%td
.responsibles
- booth.responsibles.each_with_index do |responsible, i|
= link_to responsible.name, admin_user_path(responsible)
= ", " unless i == booth.responsibles.length - 1
%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
%td
= booth.id
%td
- if booth.logo_link
= image_tag(booth.picture.thumb.url, width: '20%')
%td
= link_to booth.title, admin_conference_booth_path(@conference.short_title, booth)
%td
= link_to booth.submitter.name, admin_user_path(booth.submitter) if booth.submitter
%td
.responsibles
- booth.responsibles.each do |responsible|
= link_to responsible.name, admin_user_path(responsible)
%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
%td
.btn-group{ role: "group" }
= link_to 'Edit', edit_admin_conference_booth_path(@conference.short_title, booth.id),
class: 'btn btn-primary'
= link_to 'Delete', admin_conference_booth_path(@conference.short_title, booth.id),
method: :delete, class: 'btn btn-danger',
data: {confirm: "Do you really want to delete this booth request?"}
= link_to 'Edit', edit_admin_conference_booth_path(@conference.short_title, booth.id),
class: 'btn btn-primary'

View file

@ -1,3 +1,3 @@
%h1 New booth
= render 'form'
= render 'booths/form'

View file

@ -39,12 +39,13 @@
%td.col-md-2
%b Responsibles
%td
- @booth.responsibles.each do |responsibles|
- @booth.responsibles.each_with_index do |responsibles, i|
.responsibles
= link_to responsibles.name, admin_user_path(responsibles)
(
= responsibles.email
)
= " , " unless i == @booth.responsibles.length - 1
%tr
%td.col-md-2
%b Submitted on

View file

@ -0,0 +1,12 @@
%dt
Start Date:
%dd#start_date
= @cfp.start_date.strftime('%A, %B %-d. %Y')
%dt
End Date:
%dd#end_date
= @cfp.end_date.strftime('%A, %B %-d. %Y')
%dt
Days Left:
%dd
= pluralize(@cfp.remaining_days, 'day')

View file

@ -26,4 +26,7 @@
= f.input :end_hour, input_html: {size: 2, type: 'number', min: 1, max: 24}
= f.inputs name: 'Registrations' do
= f.input :registration_limit, as: :number, in: 0..9999, hint: 'Limit the number of registrations to the conference (0 no limit). Please note that the registration limit doesn\'t apply to speakers of confirmed events (they will still be able to register even if it has been reached). You currently have ' + pluralize(@conference.registrations.count, 'registration')
= f.inputs name: 'Booths' do
= f.input :booth_limit, as: :number, in: 0..9999,
hint: 'Booth limit is the maximum number of booths that you can accept for this conference. By setting this number (0 no limit) you can be sure that you are not going to accept more booths than the conference can accommodate. You currently have ' + pluralize(@conference.booths.accepted.count, 'accepted booth') +'.'
= f.action :submit, as: :button, button_html: {class: 'btn btn-primary'}

View file

@ -55,4 +55,10 @@
%tr
%td {conference_splash_link}
%td The link to conference splash page
- if @conference.booths
%tr
%td {submitter_name}
%td Submitter's name
%tr
%td {booth_title}
%td Booth's title

View file

@ -14,6 +14,8 @@
%a{ 'aria-controls' => 'notifications', 'data-toggle' => 'tab', href: '#notifications', role: 'tab' } Update Notifications
%li{ role: 'presentation' }
%a{ 'aria-controls' => 'cfp', 'data-toggle' => 'tab', href: '#cfp', role: 'tab' } Call for Papers
%li{ role: 'presentation' }
%a{ 'aria-controls' => 'booths', 'data-toggle' => 'tab', href: '#booth', role: 'tab' } Booth
/ Tab panes
.tab-content
#onboarding.tab-pane.active{ role: 'tabpanel' }
@ -100,6 +102,26 @@
'data-body-text' => "Dear {name},\n\nThe Conference Call for Papers Details of {conference} has changed.\nNew Dates : {cfp_start_date} - {cfp_end_date}.\n Link to Schedule {schedule_link} \n\nBest wishes\n\n{conference} Team" } Load Template
%a.btn.btn-link.control_label.template_help_link{ 'data-name' => 'updated_cfp_help' } Show Help
= render partial: 'help', locals: {id: 'updated_cfp_help', show_event_variables: false}
#booth.tab-pane{ role: 'tabpanel' }
= f.input :send_on_booths_acceptance
= f.input :booths_acceptance_subject
= f.input :booths_acceptance_body, input_html: { rows:10, cols: 20 }
%a.btn.btn-link.control_label.load_template{ 'data-subject-input-id' => 'email_settings_booths_acceptance_subject',
'data-subject-text' => 'Your booth has been accepted!',
'data-body-input-id' => 'email_settings_booths_acceptance_body',
'data-body-text' => "Dear {name},\n\nWe are pleased to inform you that your booth request {booth_title} has been accepted for the conference {conference}.\nPlease click the confirm button to let us know you can make it as soon as possible!\n\nFeel free to contact us with any questions or concerns.\n\nWe are looking forward to seeing you there.\n\nBest wishes\n\n{conference} Team"} Load Template
%a.btn.btn-link.control_label.template_help_link{ 'data-name' => 'booth_acceptance_help' } Show help
= render partial: 'help', locals: {id: 'booth_acceptance_help', show_event_variables: false}
= f.input :send_on_booths_rejection
= f.input :booths_rejection_subject
= f.input :booths_rejection_body, input_html: { rows:10, cols:20 }
%a.btn.btn-link.control_label.load_template{ 'data-subject-input-id' => 'email_settings_booths_rejection_subject',
'data-subject-text' => 'Your booth request has been rejected',
'data-body-input-id' => 'email_settings_booths_rejection_body',
'data-body-text' => "Dear {name},\n\nThank you for your booth request {booth_title} for the conference {conference}.\n\nUnfortunately, we are sorry to inform you that your request has been rejected.\n\n\nBest wishes\n\n{conference} Team" } Load Template
%a.btn.btn-link.control_label.template_help_link{ 'data-name' => 'booth_rejection_help' } Show help
= render partial: 'help', locals: {id: 'booth_rejection_help', show_event_variables: false}
.row
.col-md-12
= f.action :submit, as: :button, button_html: { class: 'btn btn-primary' }

View file

@ -32,12 +32,12 @@
.btn-group
= link_to 'Show',
conference_physical_ticket_path(@conference.short_title,
physical_ticket.id),
physical_ticket.token),
class: 'btn btn-primary'
= link_to 'Generate PDF',
conference_physical_ticket_path(@conference.short_title,
physical_ticket.id,
format: :pdf),
physical_ticket.token,
format: :pdf),
class: 'button btn btn-default btn-info'
- else
%h5 No Tickets sold!

View file

@ -14,6 +14,7 @@
= f.input :include_tickets, label: 'Display tickets', input_html: { checked: params[:action] == 'new' || @splashpage.try(:include_tickets) }
= f.input :include_lodgings, label: 'Display the lodgings', input_html: { checked: params[:action] == 'new' || @splashpage.try(:include_lodgings) }
= f.input :include_sponsors, label: 'Display sponsors', input_html: { checked: params[:action] == 'new' || @splashpage.try(:include_sponsors) }
= f.input :include_booths, label: 'Display confirmed booths', input_html: { checked: params[:action] == 'new' || @splashpage.try(:include_booths) }
= f.input :include_social_media, label: 'Display social media', input_html: { checked: params[:action] == 'new' || @splashpage.try(:include_social_media) }
= f.inputs name: 'Access' do
= f.input :public, label: 'Make splash page public?'

View file

@ -66,6 +66,13 @@
Yes
- else
No
%dt
Include Booths
%dd
- if @splashpage.include_booths
Yes
- else
No
%dt
Include Social Media:
%dd

View file

@ -13,5 +13,6 @@
= f.input :description, input_html: { rows: 5, data: { provide: "markdown-editable" } }
= f.input :price
= f.input :price_currency, as: :select, class: 'form-control', collection: ['USD', 'EUR', 'GBP', 'INR', 'CNY'], include_blank: false
= f.input :registration_ticket, hint: 'A registration ticket is with which user register for the conference.'
%p.text-right
= f.action :submit, as: :button, button_html: { class: 'btn btn-primary' }

View file

@ -14,6 +14,7 @@
%th Price
%th Sold
%th Turnover
%th Registration Ticket
%th Actions
%tbody
- @conference.tickets.each do |ticket|
@ -27,6 +28,8 @@
= ticket.tickets_sold
%td
= humanized_money_with_symbol ticket.tickets_turnover
%td
= ticket.registration_ticket? ? 'Yes' : 'No'
%td
.btn-group
= link_to 'Edit', edit_admin_conference_ticket_path(@conference.short_title, ticket.id),

View file

@ -0,0 +1,34 @@
- if track.transition_possible? :restart
%li= link_to 'Start review',
restart_admin_conference_program_track_path(@conference.short_title, track),
method: :patch, id: "restart_track_#{track.id}"
- if track.transition_possible? :to_accept
%li= link_to 'Mark as possible acceptance',
to_accept_admin_conference_program_track_path(@conference.short_title, track),
method: :patch, id: "to_accept_track_#{track.id}"
- if track.transition_possible? :accept
%li= link_to 'Accept track request',
accept_admin_conference_program_track_path(@conference.short_title, track),
method: :patch, id: "accept_track_#{track.id}"
- if track.transition_possible? :confirm
%li= link_to 'Confirm track',
confirm_admin_conference_program_track_path(@conference.short_title, track),
method: :patch, id: "confirm_track_#{track.id}"
- if track.transition_possible? :to_reject
%li= link_to 'Mark as possible rejection',
to_reject_admin_conference_program_track_path(@conference.short_title, track),
method: :patch, id: "to_reject_track_#{track.id}"
- if track.transition_possible? :reject
%li= link_to 'Reject track request',
reject_admin_conference_program_track_path(@conference.short_title, track),
method: :patch, confirm: 'Are you sure?', id: "reject_track_#{track.id}"
- if track.transition_possible? :cancel
%li= link_to 'Cancel track request',
cancel_admin_conference_program_track_path(@conference.short_title, track),
method: :patch, id: "cancel_track_#{track.id}"

View file

@ -8,11 +8,21 @@
Track
.row
.col-md-12
= semantic_form_for(@track, url: (@track.new_record? ? admin_conference_program_tracks_path : admin_conference_program_track_path(@conference.short_title, @track))) do |f|
= semantic_form_for(@track, url: (@track.new_record? ? admin_conference_program_tracks_path(@conference.short_title) : admin_conference_program_track_path(@conference.short_title, @track))) do |f|
= f.input :name
= f.input :short_name, hint: "A short and unique handle for the track, using only letters, numbers, underscores, and dashes. This will be used to identify the track in URLs etc. Example: 'my_awesome_track'", input_html: { required: 'required', pattern: '[a-zA-Z0-9_-]+', title: 'Only letters, numbers, underscores, and dashes.' }
= f.input :color, input_html: {size: 6, type: 'color'}, required: true
= f.input :start_date, as: :string, input_html: { id: 'registration-period-start-datepicker', start_date: @conference.start_date, end_date: @conference.end_date, readonly: 'readonly', required: @track.self_organized_and_accepted_or_confirmed? }
= f.input :end_date, as: :string, input_html: { id: 'registration-period-end-datepicker', readonly: 'readonly', required: @track.self_organized_and_accepted_or_confirmed? }
- if @conference.venue.try(:rooms)
= f.input :room, as: :select, collection: (@conference.venue.rooms).map {|room| ["#{room.name}", room.id]}, include_blank: true, label: 'Room', input_html: { class: 'select-help-toggle', required: @track.self_organized_and_accepted_or_confirmed? }
- else
%b
Please add a
= link_to 'venue', admin_conference_venue_path(@conference.short_title)
with
= link_to 'rooms', admin_conference_venue_rooms_path(@conference.short_title)
, if you want to select a room for the track.
= f.input :description, input_html: {rows: 2, data: { provide: 'markdown-editable' } }, hint: markdown_hint
- if @track.self_organized?
= f.input :cfp_active, label: 'Allow event submitters to select this track for their proposal'
= f.input :cfp_active, label: 'Allow event submitters to select this track for their proposal'
= f.action :submit, as: :button, button_html: { class: 'btn btn-primary' }

View file

@ -1,3 +1,4 @@
.unobtrusive-flash-container
.row
.col-md-12
.page-header
@ -6,59 +7,64 @@
Categorize events in your conference
.row
.col-md-12
%table.table.table-hover#tracks
%table.table.table-hover.table-striped.table-bordered.datatable#tracks
%thead
%th ID
%th Name
%th Short name
%th Description
%th Room
%th Start Date
%th End Date
%th Submitter
%th Color
%th Included in Cfp
%th State
%th Included in the Cfp
%th Actions
%tbody
- @tracks.each do |track|
%tr
%td
= link_to(admin_conference_program_track_path(@conference.short_title, track)) do
= track.name
%td
= track.short_name
= track.id
%td{style: "padding: 15px 0px 0px 10px;"}
= link_to admin_conference_program_track_path(@conference.short_title, track), class: 'btn' do
%span.label{style: "background-color: #{track.color}; color: #{ contrast_color(track.color) }"}
= track.name
%td
%p
= truncate(track.description)
= markdown(truncate(track.description))
%td
= track.room.try(:name)
%td
= track.start_date.strftime('%A, %B %-d. %Y') if track.start_date
%td
= track.end_date.strftime('%A, %B %-d. %Y') if track.end_date
%td
= link_to track.submitter.name, admin_user_path(track.submitter) if track.self_organized?
%td.text-center{ 'id' => "cfp_switch_#{track.id}", 'data-order' => track.cfp_active.to_s }
= check_box_tag "#{@conference.short_title}_#{track.short_name}", track.id, track.cfp_active,
class: 'switch-checkbox', method: :patch,
url: toggle_cfp_inclusion_admin_conference_program_track_path(@conference.short_title, id: track.short_name)+"?included=",
data: { size: 'small',
on_color: 'success',
off_color: 'warning',
on_text: 'Yes',
off_text: 'No' }
%td.text-center
- if track.self_organized?
= link_to track.submitter.name, admin_user_path(track.submitter)
.btn-group
%button{ type: 'button', class: 'btn btn-link dropdown-toggle', 'data-toggle' => 'dropdown' }
= track.state.humanize
%span.caret
%ul.dropdown-menu{ role: 'menu' }
= render 'change_state_dropdown', track: track
- else
N/A
%td
%span.label{style: "background-color: #{track.color}; color: #{ contrast_color(track.color) }"}
= track.color
%td
- if track.self_organized?
= track.state
- else
N/A
%td
- if track.self_organized?
= check_box_tag "#{@conference.short_title}_#{track.short_name}", track.id, track.cfp_active,
class: 'switch-checkbox', method: :patch,
url: toggle_cfp_inclusion_admin_conference_program_track_path(@conference.short_title, id: track.short_name)+"?included=",
data: { size: 'small',
on_color: 'success',
off_color: 'warning',
on_text: 'Yes',
off_text: 'No' }
- else
%i.fa.fa-check
= track.state.humanize
%td
.btn-group{role: "group"}
= link_to 'Edit', edit_admin_conference_program_track_path(@conference.short_title, track),
method: :get, class: 'btn btn-primary'
- if can? :edit, track
= link_to 'Edit', edit_admin_conference_program_track_path(@conference.short_title, track), class: 'btn btn-primary'
- if can? :destroy, track
= link_to 'Delete', admin_conference_program_track_path(@conference.short_title, track),
method: :delete, class: 'btn btn-danger',
= link_to 'Delete', admin_conference_program_track_path(@conference.short_title, track), method: :delete, class: 'btn btn-danger',
data: { confirm: "Do you really want to delete #{track.name}? Attention: This track will be removed from all Events that have it set" }
.row
.col-md-12.text-right

View file

@ -1,30 +1,124 @@
.unobtrusive-flash-container
.row
.col-md-12
.page-header
%h1
= @track.name
Track
%p.text-muted
Events in this track
.row
.col-md-12
%table.table.table-hover.datatable
%thead
%th Title
%th Type
%th Submitter
%th State
%th Time
%tbody
- @track.events.each_with_index do |event|
%tr
%td
=link_to event.title, admin_conference_program_event_path(@conference.short_title, event)
%td
= event.event_type.title
%td
=link_to event.submitter.name, admin_user_path(event.submitter)
%td
= event.state
%td
= event.time
.tabbable
%ul.nav.nav-tabs
%li.active
= link_to 'Details', '#details', 'data-toggle' => 'tab'
%li
= link_to 'Events', '#events', 'data-toggle' => 'tab'
.tab-content
.tab-pane.active#details
.row
.col-md-12
.btn-group.pull-right
- if can? :edit, @track
= link_to 'Edit', edit_admin_conference_program_track_path(@conference.short_title, @track),
method: :get, class: 'btn btn-primary'
- if can? :destroy, @track
= link_to 'Delete', admin_conference_program_track_path(@conference.short_title, @track),
method: :delete, class: 'btn btn-danger',
data: { confirm: "Do you really want to delete #{@track.name}? Attention: This track will be removed from all Events that have it set" }
.row
.col-md-12
%table.table
%tr
%td.col-md-2
%b Color
%td
%span.label{ style: "background-color: #{@track.color}; color: #{ contrast_color(@track.color) }" }
= @track.color
%tr
%td
%b Room
%td
= @track.room.try(:name)
%tr
%td
%b Start date
%td
= @track.start_date.strftime('%A, %B %-d. %Y') if @track.start_date
%tr
%td
%b End date
%td
= @track.end_date.strftime('%A, %B %-d. %Y') if @track.end_date
- if @track.self_organized?
%tr
%td
%b Submitter
%td
= link_to @track.submitter.name, admin_user_path(@track.submitter)
- if @track.confirmed?
%tr
%td
%b Organizers
%td
- Role.find_by(name: 'track_organizer', resource: @track).users.each do |organizer|
%div
= link_to organizer.name, admin_user_path(organizer)
%tr
%td
%b Included in the Cfp?
%td
= check_box_tag "#{@conference.short_title}_#{@track.short_name}", @track.id, @track.cfp_active,
class: 'switch-checkbox', method: :patch,
url: toggle_cfp_inclusion_admin_conference_program_track_path(@conference.short_title, id: @track.short_name)+"?included=",
data: { size: 'small',
on_color: 'success',
off_color: 'warning',
on_text: 'Yes',
off_text: 'No' }
%tr
%td
%b State
%td
- if @track.self_organized?
.btn-group
%button{ type: 'button', class: 'btn btn-link dropdown-toggle', 'data-toggle' => 'dropdown' }
= @track.state.humanize
%span.caret
%ul.dropdown-menu{ role: 'menu' }
= render 'change_state_dropdown', track: @track
- else
= @track.state.humanize
%tr
%td
%b Description
%td
= markdown(@track.description)
- if @track.self_organized?
%tr
%td
%b Relevance
%td
= markdown(@track.relevance)
.tab-pane#events
.col-md-12
%table.table.table-hover.datatable
%thead
%th Title
%th Type
%th Submitter
%th State
%th Time
%tbody
- @track.events.each_with_index do |event|
%tr
%td
=link_to event.title, admin_conference_program_event_path(@conference.short_title, event)
%td
= event.event_type.title
%td
=link_to event.submitter.name, admin_user_path(event.submitter)
%td
= event.state
%td
= event.time

View file

@ -0,0 +1,8 @@
$('.alert').remove();
track_id = <%= @track.id %>;
track_cfp_td = $('#cfp_switch_' + track_id);
track_cfp_value = <%= @track.cfp_active %>;
track_cfp_td.attr('data-order', track_cfp_value);
$('#tracks').DataTable().cell(track_cfp_td).invalidate();

View file

@ -0,0 +1,30 @@
.container
.row
.col-md-8
= semantic_form_for(@booth, url: @url, html: { multipart: true }) do |f|
= f.input :title, as: :string, autofocus: true, required: true
= f.input :description, input_html: { rows: 5, data: { provide: 'markdown-editable' } }, required: true,
hint: 'This field becomes public upon request acceptance'
= f.input :reasoning, input_html: { rows: 5, data: { provide: 'markdown-editable' } }, required: true,
label: 'How it fits the conference'
= f.input :submitter_relationship, input_html: { rows: 5, data: { provide: 'markdown-editable' } }, required: true,
label: 'Submitter\'s relation',
hint: 'e.g. employee, comunity manager, etc'
= f.input :website_url
= responsibles_selector_input f
= image_tag f.object.picture.thumb.url if f.object.picture?
= f.input :picture
%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'
:javascript
$(document).ready(function() {
$('#booth_responsible_ids').selectize({
plugins: ['remove_button'],
minItems: 2
} )
});

View file

@ -0,0 +1,6 @@
.container
%h1
Editing
= @booth.title
= render 'form'

View file

@ -0,0 +1,51 @@
.container
.row
.col-md-12.page-header
%h1
Your booth requests for
= @conference.title
.row
.col-md-12
.margin-booth-table
%table.table.table-striped.table-hover
%thead
%th
%b State
%th
%b Logo
%th
%b Title
%th
%b Actions
- @booths.each do |booth|
%tr
%td{ style: "padding:20px 8px 20px 8px;" }
- if (booth.state == 'to_accept' || booth.state == 'to_reject')
- show_state = 'new'
- else
- show_state = booth.state
%span{ title: show_state, class: "fa #{booth_status_icon(booth)}" }
%td
- if booth.logo_link
= image_tag(booth.picture.thumb.url, width: '20%')
%td
= link_to booth.title, conference_booth_path(@conference.short_title, booth)
%td
-if can? :edit, booth
= link_to 'Edit', edit_conference_booth_path(@conference.short_title, booth.id),
class: 'btn btn-default'
- if booth.transition_possible? :withdraw
= link_to 'Withdraw',
withdraw_conference_booth_path(@conference.short_title, booth),
method: :patch, class: 'btn btn-mini btn-warning', id: "withdraw_booth_#{booth.id}",
data: { confirm: 'Are you sure you really want to withdraw this request?' }
- if booth.transition_possible? :confirm
= link_to 'Confirm',
confirm_conference_booth_path(@conference.short_title, booth),
method: :patch, class: 'btn btn-mini btn-success', id: "confirm_booth_#{booth.id}"
- if booth.transition_possible? :restart
= link_to 'Re-submit',
restart_conference_booth_path(@conference.short_title, booth),
method: :patch, class: 'btn btn-mini btn-success', id: "restart_booth_#{booth.id}"
.pull-right
= link_to 'Add Booth', new_conference_booth_path(@conference.short_title), class: 'button btn btn-primary'

View file

@ -0,0 +1,4 @@
.container
%h1 Request a booth
= render 'form'

View file

@ -0,0 +1,60 @@
.container
.row
.col-md-12
%h3
- if @booth.logo_link
= image_tag(@booth.picture.thumb.url, size: '20%', alt: '')
= @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
= markdown(@booth.description)
%tr
%td.col-md-2
%b Reasoning
%td
= markdown(@booth.reasoning)
%tr
%td.col-md-2
%b Website
%td
- if @booth.website_url.present?
= link_to @booth.website_url, @booth.website_url
%tr
%td.col-md-2
%b Submitter
%td
= link_to @booth.submitter.name, user_path(@booth.submitter)
%tr
%td.col-md-2
%b Submitter's relationship
%td
= @booth.submitter_relationship
%tr
%td.col-md-2
%b Responsibles
%td
- @booth.responsibles.each_with_index do |responsibles, i|
.responsibles
= link_to responsibles.name, user_path(responsibles)
(
= responsibles.email
)
= ", " unless i == @booth.responsibles.length - 1
%tr
%td.col-md-2
%b Submitted on
%td
= @booth.created_at
%tr
%td.col-md-2
%b Last updated on
%td
= @booth.updated_at

View file

@ -0,0 +1,24 @@
= content_for :splash_nav do
%li
%a.smoothscroll{ href: '#booths' } Booths
.container
.row
.col-md-12.text-center
%h2 Booths
- @conference.booths.confirmed.each_slice(3).with_index do |slice, index_for_row|
.row.row-centered
- slice.each.with_index do |booth, index_for_column|
.col-md-4.col-sm-4.col-xs-10.col-centered.col-top
.thumbnail
- if booth.logo_link
= link_to booth.website_url, class: 'thumbnail' do
= image_tag booth.picture.large.url
.caption
%h3.text-center
= booth.title
%p.text-center.text-muted
= link_to "#show_descrition_#{index_for_row}_#{index_for_column}", "data-toggle"=>"collapse" do
learn more
.collapse{ id: "show_descrition_#{index_for_row}_#{index_for_column}" }
= markdown(booth.description)

View file

@ -0,0 +1,30 @@
= content_for :splash_nav do
%li
%a.smoothscroll{ href: '#callfortracks' } Call For Tracks
.container
.row
.col-md-12.text-center
%h2
Call for Tracks
%p.lead
We are ready to accept requests for tracks!
.row
.col-md-6.col-md-offset-3.col-sm-10.col-sm-offset-1
%p
The submission period for track requests has begun
%em.notranslate
= @conference.program.cfps.for_tracks.start_date.strftime('%A, %B %-d. %Y')
and closes
%em.notranslate
= @conference.program.cfps.for_tracks.end_date.strftime('%A, %B %-d. %Y.')
- if @conference.program.cfps.for_tracks.try(:open?)
That means you have only
%b.notranslate= pluralize(@conference.program.cfps.for_tracks.remaining_days, 'day')
left!
- else
The submission period for track requests is closed.
.row
.col-md-12.text-center
%p.cta-button
= link_to "Submit your request for track", conference_program_tracks_path(@conference.short_title), class: 'btn btn-success btn-lg text-center'

View file

@ -30,10 +30,18 @@
= link_to "Register", new_conference_conference_registration_path(conference.short_title), class: "btn btn-default", disabled: cannot?(:new, Registration.new(conference_id: conference.id))
- if cannot?(:new, Registration.new(conference_id: conference.id)) && conference.registration_limit_exceeded?
Sorry, no places left
- if !current_user.nil? && current_user.tracks.where(program: conference.program).length > 0
= link_to "My Track Requests", conference_program_tracks_path(conference.short_title), class: 'btn btn-default'
- elsif can? :new, conference.program.tracks.new
= link_to "Submit Track Request", new_conference_program_track_path(conference.short_title), class: 'btn btn-default'
- if !current_user.nil? && current_user.proposal_count(conference) > 0
= link_to "My Proposals", conference_program_proposals_path(conference.short_title), class: 'btn btn-default'
- elsif can? :new, conference.program.events.new
= link_to "Submit Proposal", new_conference_program_proposal_path(conference.short_title), class: 'btn btn-default'
- if current_user && current_user.booths.where(conference_id: conference.id).count > 0
= link_to 'My Booth Requests', conference_booths_path(conference.short_title), class: 'btn btn-default'
- elsif can? :new, conference.booths.new
= link_to 'Request Booth', new_conference_booth_path(conference.short_title), class: 'btn btn-default'
- if current_user.nil? || !current_user.subscribed?(conference)
= link_to 'Subscribe', conference_subscriptions_path(conference.short_title), method: :post, class: 'btn btn-default'
- else

View file

@ -10,13 +10,22 @@
- if @conference.splashpage and @conference.program.tracks.any? and @conference.splashpage.include_tracks
See rock-star speakers cover the topics of
- if @conference.splashpage and @conference.splashpage.include_tracks
- @conference.program.tracks.each_slice(3) do |slice|
- @conference.program.tracks.confirmed.cfp_active.each_slice(3) do |slice|
.row.row-centered
- slice.each do |track|
.col-md-4.col-sm-4.col-centered.col-top.track
%h4.text-center
= track.name
= markdown(track.description)
- if track.start_date
%br
From: #{track.start_date.strftime('%A, %B %-d. %Y')}
- if track.end_date
%br
To: #{track.end_date.strftime('%A, %B %-d. %Y')}
- if track.room
%br
In: #{track.room.name}
- if @conference.program and @conference.program.schedule_public
.row

View file

@ -45,6 +45,10 @@
%section#program
= render 'schedule_splashpage'
- if @conference.program.cfps.for_tracks.try(:open?) && @conference.splashpage.include_cfp
%section#callfortracks
= render 'call_for_tracks'
- if @conference.program.cfp_open? and @conference.splashpage.include_cfp
%section#callforpapers
= render 'call_for_paper'
@ -61,6 +65,10 @@
%section#tickets
= render 'tickets'
- if @conference.booths.confirmed.any? and @conference.splashpage.include_booths
%section#booths
= render 'booths'
- if @conference.sponsors.any? and @conference.splashpage.include_sponsors
%section#sponsors
= render 'sponsors'

View file

@ -7,7 +7,10 @@
%span.icon-bar
%span.icon-bar
%span.icon-bar
= link_to (ENV['OSEM_NAME'] || 'OSEM'), root_path, class: 'navbar-brand', title: 'Open Source Event Manager'
- if conference.nil? || conference.new_record?
= link_to (ENV['OSEM_NAME'] || 'OSEM'), root_path, class: 'navbar-brand', title: 'Open Source Event Manager'
- else
= link_to conference.organization.name, organizations_path, class: 'navbar-brand', title: 'Open Source Event Manager'
.collapse.navbar-collapse
- if content_for :splash_nav
%ul.nav.navbar-nav#splash-nav

View file

@ -12,6 +12,10 @@
= link_to(conference_program_proposals_path(@conference.short_title)) do
%span.fa.fa-comment
My Submissions
%li
= link_to(conference_program_tracks_path(@conference.short_title)) do
%span.fa.fa-road
My Tracks
%li
- if ENV['OSEM_ICHAIN_ENABLED'] == 'true'
= link_to(destroy_user_ichain_session_path, method: 'delete') do

View file

@ -21,7 +21,7 @@
= yield(:head)
%body
= render 'layouts/navigation'
= render 'layouts/navigation', conference: @conference
-# Admin area
- if controller.class.name.split("::").first=="Admin"
= render 'layouts/admin'

View file

@ -0,0 +1,8 @@
Dear <%= @user.name %>,
Thanks! You have successfully booked <%= @ticket_purchase.quantity %> <%= @ticket_purchase.ticket.title %> ticket(s) for the event <%= @conference.title %>. Your transaction id is <%= @ticket_purchase.id %>.
Please, find the ticket(s) pdf attached.
Best wishes,
<%= @conference.title %> Team

View file

@ -24,11 +24,11 @@
.btn-group
= link_to 'Show',
conference_physical_ticket_path(@conference.short_title,
physical_ticket.id),
physical_ticket.token),
class: 'btn btn-primary'
= link_to 'Generate PDF',
conference_physical_ticket_path(@conference.short_title,
physical_ticket.id,
physical_ticket.token,
format: :pdf),
class: 'button btn btn-default btn-info'
- else

View file

@ -0,0 +1,77 @@
.container
.row
.col-md-12
.page-header
%h1
Ticket for
= @conference.title
%p.text-muted
- if @conference.venue
at
%strong
#{@conference.venue.name},
#{@conference.venue.street},
#{@conference.venue.city} / #{@conference.venue.country_name}.
%small
= date_string(@conference.start_date, @conference.end_date)
.row
.col-md-5.box.well
%h3.text-center
Ticket Holder
%p.text-left
%strong
Name
%br
= @user.name
%br
%br
%strong
Email
%br
= @user.email
.col-md-5.col-md-offset-2.box.well
- if @conference.picture?
- width = @conference.picture.image[:width]
- height = @conference.picture.image[:height]
- if 10 * width > 15 * height
= image_tag(@conference.picture_url, width: '150')
- else
= image_tag(@conference.picture_url, height: '100')
- else
= image_tag('/img/osem-logo.png', class: 'img-responsive')
%p.text-left
%br
%strong
Organization
%br
= @conference.organization.name
.col-md-5.box.well
%p.text-left
%strong
Event
%br
= @conference.title
%br
= @conference.start_date.strftime('%B %d, %Y')
%br
%br
%strong
Ticket
%br
= @physical_ticket.ticket.title
%br
%br
%strong
Ticket Ref.
%br
= @physical_ticket.ticket_purchase.id
%br
.col-md-5.col-md-offset-2.box.well
.row
.col-md-12
%p.text-left
= link_to 'Generate PDF',
conference_physical_ticket_path(@conference.short_title,
@physical_ticket.token,
format: :pdf),
class: 'button btn btn-default btn-info'

View file

@ -4,7 +4,7 @@
= "#{event_types(@conference)}."
- if @program.tracks.any?
Proposals should fit in one of the
= "#{pluralize(@program.tracks.count, 'track')}:"
= "#{pluralize(@program.tracks.confirmed.cfp_active.count, 'track')}:"
= "#{tracks(@conference)}."
- if @program.cfp_open?
The submission period has begun

View file

@ -6,10 +6,7 @@
= speaker_selector_input f
- if @program.tracks.any?
= f.input :track_id, as: :select,
collection: @program.tracks.map {|track| ["#{track.name}", track.id] },
include_blank: true
= track_selector_input f
= f.input :event_type_id, as: :select,
collection: @conference.program.event_types.map {|type| ["#{type.title} - #{show_time(type.length)}", type.id,

View file

@ -9,9 +9,12 @@
Track
.row
.col-md-12
= semantic_form_for(@track, url: (@track.new_record? ? conference_program_tracks_path : conference_program_track_path(@conference.short_title, @track))) do |f|
= semantic_form_for(@track, url: (@track.new_record? ? conference_program_tracks_path(@conference.short_title) : conference_program_track_path(@conference.short_title, @track))) do |f|
= f.input :name
= f.input :short_name, hint: "A short and unique handle for the track, using only letters, numbers, underscores, and dashes. This will be used to identify the track in URLs etc. Example: 'my_awesome_track'", input_html: { required: 'required', pattern: '[a-zA-Z0-9_-]+', title: 'Only letters, numbers, underscores, and dashes.' }
= f.input :color, input_html: {size: 6, type: 'color'}, required: true
= f.input :description, input_html: {rows: 2, data: { provide: 'markdown-editable' } }, required: true, hint: markdown_hint
= f.input :start_date, as: :string, input_html: { id: 'registration-period-start-datepicker', start_date: @conference.start_date, end_date: @conference.end_date, readonly: 'readonly' }
= f.input :end_date, as: :string, input_html: { id: 'registration-period-end-datepicker', readonly: 'readonly' }
= f.input :description, input_html: {rows: 2, data: { provide: 'markdown-editable' } }, required: true, hint: "This will be public #{markdown_hint}".html_safe
= f.input :relevance, input_html: {rows: 5, data: { provide: 'markdown-editable' } }, required: true, hint: "Please explain here how this track relates to the conference, how you are related to it's content and why we should accept it. #{markdown_hint}".html_safe
= f.action :submit, as: :button, button_html: { class: 'btn btn-primary' }

View file

@ -6,38 +6,74 @@
%span.notranslate
= @conference.title
.row
.col-md-12
%p.text-right
= link_to '#status-help', class: 'btn btn-default', "data-toggle"=>"collapse" do
Help?
.collapse#status-help
%p
%strong
What happens next with my track request?
%p
If you submit a track request, the conference organizers will review it and either accept or reject it.
%br
If your track request is accepted, the conference organizers expect you to confirm that you will be able to hold it.
Then you will gain the Track organizer role.
%br
If your track request is rejected, you can either live with that or adapt it and resubmit it for review again.
%br
If something changes and you can't organize the track any more, you should withdraw it.
- if @tracks.any?
.row
.col-md-12
%table.table.table-hover#tracks
%thead
%th Name
%th Short name
%th Description
%th Color
%th State
%th Actions
%tbody
- @tracks.each do |track|
%tr
%td
= link_to(conference_program_track_path(@conference.short_title, track)) do
= track.name
%td
= track.short_name
%td
%p
= truncate(track.description)
%td
%table.table.table-striped#tracks
- @tracks.each do |track|
%tr
%td{style: "padding:15px 0px 0px 8px;"}
- if %w(new to_accept to_reject).include? track.state
%span{ title: 'In review', class: 'fa fa-eye' }
- elsif track.state == 'accepted'
%span{ title: 'Accepted', class: 'fa fa-check text-muted' }
- elsif track.state == 'confirmed'
%spam{ title: 'Confirmed', class: 'fa fa-check text-success' }
- elsif %w(rejected withdrawn canceled).include? track.state
%span{ title: track.state.humanize, class: 'fa fa-ban'}
%td{style: "padding: 15px 0px 0px 0px;"}
= link_to conference_program_track_path(@conference.short_title, track), class: 'btn' do
%span.label{style: "background-color: #{track.color}; color: #{ contrast_color(track.color) }"}
= track.color
%td
= track.state
%td
= link_to 'Edit', edit_conference_program_track_path(@conference.short_title, track),
method: :get, class: 'btn btn-primary'
= track.name
%td
= markdown(truncate(track.description))
%td
- if track.start_date
From:
= track.start_date.strftime('%A, %B %-d. %Y')
%td
- if track.end_date
To:
= track.end_date.strftime('%A, %B %-d. %Y')
%td
- if track.room
In:
= track.room.name
%td
.pull-right
- if track.transition_possible? :confirm
= link_to 'Confirm', confirm_conference_program_track_path(@conference.short_title, track),
method: :patch, class: 'btn btn-mini btn-success', id: "confirm_track_#{track.id}"
- if track.transition_possible? :withdraw
= link_to 'Withdraw', withdraw_conference_program_track_path(@conference.short_title, track),
method: :patch, data: { confirm: 'Are you sure you want to withdraw this track request?' },
class: 'btn btn-mini btn-warning', id: "withdraw_track_request_#{track.id}"
- if track.transition_possible? :restart
= link_to 'Re-Submit', restart_conference_program_track_path(@conference.short_title, track),
method: :patch, class: 'btn btn-mini btn-success', id: "resubmit_track_request_#{track.id}"
- if can? :edit, track
= link_to 'Edit', edit_conference_program_track_path(@conference.short_title, track), class: 'btn btn-default'
.row
.col-md-12
- if can? :create, @track
- if can? :new, @program.tracks.new
= link_to "New Track request", new_conference_program_track_path(@conference.short_title), class: 'btn btn-success pull-right'

View file

@ -2,9 +2,12 @@
.row
.col-md-12
.page-header
%h1
%h2
= @track.name
Track
.btn-group.pull-right
- if can? :edit, @track
= link_to 'Edit Track request', edit_conference_program_track_path(@conference.short_title, @track), class: 'btn btn-primary'
.row
.col-md-8
%dl.dl-horizontal
@ -16,11 +19,27 @@
%dt
State:
%dd
= @track.state
- if %w(new to_accept to_reject).include? @track.state
New
- else
= @track.state.humanize
%dt
Start date:
%dd
= @track.start_date.strftime('%A, %B %-d. %Y') if @track.start_date
%dt
End date:
%dd
= @track.end_date.strftime('%A, %B %-d. %Y') if @track.end_date
%dt
Room:
%dd
= @track.room.try(:name)
%dt
Description
%dd
= @track.description
.row
.col-md-12.text-right
= link_to 'Edit Track request', edit_conference_program_track_path(@conference.short_title, @track), class: 'btn btn-primary'
= markdown(@track.description)
%dt
Relevance
%dd
= markdown(@track.relevance)

View file

@ -2,6 +2,8 @@
pushd /vagrant
echo -e "\ninstalling required software packages...\n"
zypper -q ar -f http://download.opensuse.org/repositories/devel:/languages:/ruby/openSUSE_Leap_42.2/devel:languages:ruby.repo
zypper -q --gpg-auto-import-keys --non-interactive ref
zypper -q -n install update-alternatives ruby2.4-devel make gcc gcc-c++ \
libxml2-devel libxslt-devel nodejs screen mariadb \
libmysqld-devel sqlite3-devel ImageMagick

View file

@ -77,8 +77,9 @@ Osem::Application.configure do
user_name: ENV['OSEM_SMTP_USERNAME'],
password: ENV['OSEM_SMTP_PASSWORD'],
authentication: ENV['OSEM_SMTP_AUTHENTICATION'].try(:to_sym),
domain: ENV['OSEM_SMTP_DOMAIN'],
enable_starttls_auto: true
domain: ENV['OSEM_SMTP_DOMAIN'],
enable_starttls_auto: ENV['OSEM_SMTP_ENABLE_STARTTLS_AUTO'],
openssl_verify_mode: ENV['OSEM_SMTP_OPENSSL_VERIFY_MODE']
}
# Set the secret_key_base from the env, if not set by any other means

View file

@ -26,6 +26,7 @@ Osem::Application.routes.draw do
patch :toggle_confirmation
end
end
resource :ticket_scanning, only: [:create]
resources :comments, only: [:index]
resources :conferences do
resource :contact, except: [:index, :new, :create, :show, :destroy]
@ -41,7 +42,6 @@ Osem::Application.routes.draw do
member do
patch :accept
patch :restart
patch :withdrawn
patch :to_accept
patch :reject
patch :reset
@ -70,6 +70,13 @@ Osem::Application.routes.draw do
resources :tracks do
member do
patch :toggle_cfp_inclusion
patch :restart
patch :to_accept
patch :accept
patch :confirm
patch :to_reject
patch :reject
patch :cancel
end
end
resources :event_types
@ -131,6 +138,13 @@ Osem::Application.routes.draw do
end
resources :organizations, only: [:index]
resources :conferences, only: [:index, :show] do
resources :booths do
member do
patch :withdraw
patch :confirm
patch :restart
end
end
resource :program, only: [] do
resources :proposals, except: :destroy do
get 'commercials/render_commercial' => 'commercials#render_commercial'
@ -143,7 +157,13 @@ Osem::Application.routes.draw do
patch '/restart' => 'proposals#restart'
end
end
resources :tracks, except: :destroy
resources :tracks, except: :destroy do
member do
patch :restart
patch :confirm
patch :withdraw
end
end
end
# TODO: change conference_registrations to singular resource

View file

@ -0,0 +1,7 @@
class AddRoomAndDatesToTracks < ActiveRecord::Migration
def change
add_reference :tracks, :room, index: true, foreign_key: true
add_column :tracks, :start_date, :date
add_column :tracks, :end_date, :date
end
end

View file

@ -0,0 +1,14 @@
class MakeTrackStateNotNullAndAddDefaultValue < ActiveRecord::Migration
class TmpTrack < ActiveRecord::Base
self.table_name = 'tracks'
end
def change
TmpTrack.where(state: nil).each do |track|
track.state = 'confirmed'
track.save!
end
change_column :tracks, :state, :string, null: false, default: 'new'
end
end

View file

@ -0,0 +1,14 @@
class MakeTrackCfpActiveNotNull < ActiveRecord::Migration
class TmpTrack < ActiveRecord::Base
self.table_name = 'tracks'
end
def change
TmpTrack.where(cfp_active: nil).each do |track|
track.cfp_active = true
track.save!
end
change_column_null :tracks, :cfp_active, false
end
end

View file

@ -0,0 +1,6 @@
class AddIndexToPhysicalTickets < ActiveRecord::Migration
def change
add_column :physical_tickets, :token, :string
add_index :physical_tickets, :token, unique: true
end
end

View file

@ -0,0 +1,5 @@
class AddRelevanceToTracks < ActiveRecord::Migration
def change
add_column :tracks, :relevance, :text
end
end

View file

@ -0,0 +1,5 @@
class AddIncludeBoothsToSplashpages < ActiveRecord::Migration
def change
add_column :splashpages, :include_booths, :boolean
end
end

View file

@ -0,0 +1,5 @@
class AddBoothLimitToConferences < ActiveRecord::Migration
def change
add_column :conferences, :booth_limit, :integer, default: 0
end
end

View file

@ -0,0 +1,10 @@
class AddBoothsToEmailSettings < ActiveRecord::Migration
def change
add_column :email_settings, :send_on_booths_acceptance, :boolean, default: false
add_column :email_settings, :booths_acceptance_subject, :string
add_column :email_settings, :booths_acceptance_body, :text
add_column :email_settings, :send_on_booths_rejection, :boolean, default: false
add_column :email_settings, :booths_rejection_subject, :string
add_column :email_settings, :booths_rejection_body, :text
end
end

View file

@ -0,0 +1,5 @@
class AddRegistrationTicketToTickets < ActiveRecord::Migration
def change
add_column :tickets, :registration_ticket, :boolean, default: false
end
end

View file

@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20170711102511) do
ActiveRecord::Schema.define(version: 20170807092805) do
create_table "ahoy_events", force: :cascade do |t|
t.integer "visit_id"
@ -127,6 +127,7 @@ ActiveRecord::Schema.define(version: 20170711102511) do
t.integer "end_hour", default: 20
t.integer "organization_id"
t.integer "ticket_layout", default: 0
t.integer "booth_limit", default: 0
end
add_index "conferences", ["organization_id"], name: "index_conferences_on_organization_id"
@ -205,6 +206,12 @@ ActiveRecord::Schema.define(version: 20170711102511) do
t.string "cfp_dates_updated_subject"
t.text "program_schedule_public_body"
t.text "cfp_dates_updated_body"
t.boolean "send_on_booths_acceptance", default: false
t.string "booths_acceptance_subject"
t.text "booths_acceptance_body"
t.boolean "send_on_booths_rejection", default: false
t.string "booths_rejection_subject"
t.text "booths_rejection_body"
end
create_table "event_schedules", force: :cascade do |t|
@ -317,8 +324,11 @@ ActiveRecord::Schema.define(version: 20170711102511) do
t.integer "ticket_purchase_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "token"
end
add_index "physical_tickets", ["token"], name: "index_physical_tickets_on_token", unique: true
create_table "programs", force: :cascade do |t|
t.integer "conference_id"
t.integer "rating", default: 0
@ -442,6 +452,7 @@ ActiveRecord::Schema.define(version: 20170711102511) do
t.datetime "created_at"
t.datetime "updated_at"
t.boolean "include_cfp", default: false
t.boolean "include_booths"
end
create_table "sponsors", force: :cascade do |t|
@ -504,22 +515,28 @@ ActiveRecord::Schema.define(version: 20170711102511) do
t.text "description"
t.integer "price_cents", default: 0, null: false
t.string "price_currency", default: "USD", null: false
t.boolean "registration_ticket", default: false
end
create_table "tracks", force: :cascade do |t|
t.string "guid", null: false
t.string "name", null: false
t.string "guid", null: false
t.string "name", null: false
t.text "description"
t.string "color"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "program_id"
t.string "short_name", null: false
t.string "state"
t.boolean "cfp_active"
t.string "short_name", null: false
t.string "state", default: "new", null: false
t.boolean "cfp_active", null: false
t.integer "submitter_id"
t.integer "room_id"
t.date "start_date"
t.date "end_date"
t.text "relevance"
end
add_index "tracks", ["room_id"], name: "index_tracks_on_room_id"
add_index "tracks", ["submitter_id"], name: "index_tracks_on_submitter_id"
create_table "users", force: :cascade do |t|

View file

@ -58,6 +58,8 @@ OSEM_SMTP_USERNAME=""
OSEM_SMTP_PASSWORD=""
OSEM_SMTP_AUTHENTICATION=""
OSEM_SMTP_DOMAIN=""
OSEM_SMTP_ENABLE_STARTTLS_AUTO=""
OSEM_SMTP_OPENSSL_VERIFY_MODE=""
# Enable the usage of the devise ichain plugin
OSEM_ICHAIN_ENABLED=false

View file

@ -0,0 +1,130 @@
require 'spec_helper'
describe Admin::BoothsController do
let(:admin) { create(:admin) }
let(:conference) { create(:conference) }
let(:booth) { create(:booth, title: 'Title', conference: conference) }
let(:admin) { create(:admin) }
context 'not logged in user' do
describe 'GET index' do
it 'does not render admin/booths#index' do
get :index, conference_id: conference.short_title
expect(response).to redirect_to(user_session_path)
end
end
describe 'GET show' do
it 'does not render admin/booths#show' do
get :show, id: booth.id, conference_id: conference.short_title
expect(response).to redirect_to(user_session_path)
end
end
end
context 'user is admin' do
before :each do
sign_in admin
end
describe 'GET index' do
before { get :index, conference_id: conference.short_title }
it 'assigns attributes for booths' do
expect(assigns(:booths)).to eq([booth])
end
it 'renders index template' do
expect(response).to render_template('index')
end
end
describe 'GET new' do
before { get :new, conference_id: conference.short_title }
it 'assigns attributes for booths' do
expect(assigns(:booth)).to be_a_new(Booth)
end
it 'renders new template' do
expect(response).to render_template('new')
end
end
describe 'POST #create' do
context 'successfully created' do
before { post :create, booth: attributes_for(:booth), conference_id: conference.short_title }
it 'creates a new booth' do
expected = expect do
post :create, booth: attributes_for(:booth), conference_id: conference.short_title
end
expected.to change { Booth.count }.by(1)
end
it 'redirects to admin booth index' do
expect(response).to redirect_to(admin_conference_booths_path)
end
it 'has responsibles' do
expect(booth.responsibles.count).to_not eq(0)
end
it 'shows success message' do
expect(flash[:notice]).to match('Booth successfully created.')
end
end
context 'create action fails' do
before { post :create, booth: attributes_for(:booth, title: ''), conference_id: conference.short_title }
it 'does not create any record' do
expected = expect do
post :create, booth: attributes_for(:booth, title: ''), conference_id: conference.short_title
end
expected.to_not change(Booth, :count)
end
it 'redirects to new' do
expect(response).to render_template('new')
end
it 'shows flash message' do
expect(flash[:error]).to eq("Creating booth failed. Title can't be blank.")
end
end
end
describe 'GET #edit' do
before { get :edit, id: booth.id, conference_id: conference.short_title }
it 'renders edit template' do
expect(response).to render_template('edit')
end
it 'assigns booth variable' do
expect(assigns(:booth)).to eq booth
end
end
describe 'PATCH #update' do
context 'updates suchessfully' do
before { patch :update, id: booth.id, booth: attributes_for(:booth, title: 'different'), conference_id: conference.short_title }
it 'redirects to admin booth index path' do
expect(response).to redirect_to admin_conference_booths_path
end
it 'shows success message' do
expect(flash[:notice]).to match 'Successfully updated booth.'
end
it 'updates booth' do
booth.reload
expect(booth.title).to eq('different')
end
end
end
end
end

View file

@ -0,0 +1,60 @@
require 'spec_helper'
describe Admin::TicketScanningsController do
let(:admin) { create(:admin) }
let(:conference) { create(:conference) }
let(:user) { create(:user) }
let(:paid_ticket_purchase) { create(:ticket_purchase, conference: conference, user: user) }
let(:physical_ticket) { create(:physical_ticket, ticket_purchase: paid_ticket_purchase) }
context 'logged in as user with no role' do
before :each do
sign_in user
end
describe 'POST #create' do
it 'does not create new ticket scanning' do
expected = expect do
post :create, physical_ticket_id: physical_ticket.token
end
expected.to_not change(TicketScanning, :count)
end
it 'redirects to root' do
post :create, physical_ticket_id: physical_ticket.token
expect(flash[:alert]).to eq('You are not authorized to access this page.')
expect(response).to redirect_to(root_path)
end
end
end
context 'logged in as admin' do
before :each do
sign_in admin
end
describe 'POST #create' do
context 'with valid physical_ticket' do
it 'creates new ticket scanning' do
expected = expect do
post :create, physical_ticket_id: physical_ticket.token
end
expected.to change { TicketScanning.count }.by(1)
end
it 'redirects to index' do
post :create, physical_ticket_id: physical_ticket.token
expect(flash[:notice]).to eq("Ticket with token #{physical_ticket.token} successfully scanned.")
expect(response).to redirect_to(conferences_path)
end
end
context 'with Invalid physical_ticket' do
it 'raises exception' do
expected = expect do
post :create, physical_ticket_id: 'XXXX'
end
expected.to raise_exception(ActiveRecord::RecordNotFound)
end
end
end
end
end

View file

@ -5,7 +5,7 @@ describe Admin::TracksController do
let(:conference) { create(:conference) }
let!(:track) { create(:track, program: conference.program, color: '#800080') }
let!(:self_organized_track) { create(:track, :self_organized, program: conference.program) }
let!(:self_organized_track) { create(:track, :self_organized, program: conference.program, name: 'My awesome track') }
before :each do
sign_in(admin)
@ -80,6 +80,11 @@ describe Admin::TracksController do
it 'creates new track' do
expect(Track.find(assigns(:track).id)).to be_a Track
end
it 'the new tracks has the correct attributes' do
expect(assigns(:track).state).to eq 'confirmed'
expect(assigns(:track).cfp_active).to eq true
end
end
context 'save fails' do
@ -223,16 +228,45 @@ describe Admin::TracksController do
before :each do
self_organized_track.cfp_active = false
self_organized_track.save!
patch :toggle_cfp_inclusion, conference_id: conference.short_title, id: self_organized_track.short_name
self_organized_track.reload
end
it 'assigns the correct track' do
expect(assigns(:track)).to eq self_organized_track
context 'toggles successfully' do
before :each do
patch :toggle_cfp_inclusion, conference_id: conference.short_title, id: self_organized_track.short_name, format: :js
self_organized_track.reload
end
it 'assigns the correct track' do
expect(assigns(:track)).to eq self_organized_track
end
it 'shows success message in flash notice' do
expect(flash[:notice]).to match('Successfully changed cfp inclusion of My awesome track to true')
end
it 'becomes true' do
expect(self_organized_track.cfp_active).to eq true
end
end
it 'becomes true' do
expect(self_organized_track.cfp_active).to eq true
context 'save fails' do
before :each do
allow_any_instance_of(Track).to receive(:save).and_return(false)
patch :toggle_cfp_inclusion, conference_id: conference.short_title, id: self_organized_track.short_name, format: :js
self_organized_track.reload
end
it 'assigns the correct track' do
expect(assigns(:track)).to eq self_organized_track
end
it 'shows error message in flash notice' do
expect(flash[:error]).to match('Failed to toggle cfp inclusion of My awesome track to true')
end
it 'stays false' do
expect(self_organized_track.cfp_active).to eq false
end
end
end
@ -240,7 +274,124 @@ describe Admin::TracksController do
before :each do
self_organized_track.cfp_active = true
self_organized_track.save!
patch :toggle_cfp_inclusion, conference_id: conference.short_title, id: self_organized_track.short_name
end
context 'toggles successfully' do
before :each do
patch :toggle_cfp_inclusion, conference_id: conference.short_title, id: self_organized_track.short_name, format: :js
self_organized_track.reload
end
it 'assigns the correct track' do
expect(assigns(:track)).to eq self_organized_track
end
it 'shows success message in flash notice' do
expect(flash[:notice]).to match('Successfully changed cfp inclusion of My awesome track to false')
end
it 'becomes false' do
expect(self_organized_track.cfp_active).to eq false
end
end
context 'save fails' do
before :each do
allow_any_instance_of(Track).to receive(:save).and_return(false)
patch :toggle_cfp_inclusion, conference_id: conference.short_title, id: self_organized_track.short_name, format: :js
self_organized_track.reload
end
it 'assigns the correct track' do
expect(assigns(:track)).to eq self_organized_track
end
it 'shows error message in flash notice' do
expect(flash[:error]).to match('Failed to toggle cfp inclusion of My awesome track to false')
end
it 'stays true' do
expect(self_organized_track.cfp_active).to eq true
end
end
end
end
describe 'PATCH #restart' do
before :each do
self_organized_track.state = 'canceled'
self_organized_track.save!
patch :restart, conference_id: conference.short_title, id: self_organized_track.short_name
self_organized_track.reload
end
it 'assigns the correct track' do
expect(assigns(:track)).to eq self_organized_track
end
it 'shows message in flash notice' do
expect(flash[:notice]).to eq 'Review for My awesome track started!'
end
it 'changes the track\'s state to new' do
expect(self_organized_track.state).to eq 'new'
end
end
describe 'PATCH #to_accept' do
before :each do
patch :to_accept, conference_id: conference.short_title, id: self_organized_track.short_name
self_organized_track.reload
end
it 'assigns the correct track' do
expect(assigns(:track)).to eq self_organized_track
end
it 'shows message in flash notice' do
expect(flash[:notice]).to eq 'Track My awesome track marked as a possible acceptance!'
end
it 'changes the track\'s state to to_accept' do
expect(self_organized_track.state).to eq 'to_accept'
end
end
describe 'PATCH #accept' do
shared_examples 'fails to accept' do |start_date, end_date, room|
before :each do
self_organized_track.start_date = start_date ? Date.today : nil
self_organized_track.end_date = end_date ? Date.today : nil
if room
conference.venue = create(:venue)
self_organized_track.room = create(:room, venue: conference.venue)
else
self_organized_track.room = nil
end
self_organized_track.save!
patch :accept, conference_id: conference.short_title, id: self_organized_track.short_name
self_organized_track.reload
end
it 'redirects to Tracks#edit' do
expect(response).to redirect_to edit_admin_conference_program_track_path(conference.short_title, self_organized_track)
end
it 'shows message in flash alert' do
expect(flash[:alert]).to eq 'Please make sure that the track has a room and start/end dates before accepting it'
end
end
context 'has start_date, end_date and room' do
before :each do
self_organized_track.start_date = Date.today
self_organized_track.end_date = Date.today
conference.venue = create(:venue)
self_organized_track.room = create(:room, venue: conference.venue)
self_organized_track.save!
patch :accept, conference_id: conference.short_title, id: self_organized_track.short_name
self_organized_track.reload
end
@ -248,9 +399,121 @@ describe Admin::TracksController do
expect(assigns(:track)).to eq self_organized_track
end
it 'becomes false' do
expect(self_organized_track.cfp_active).to eq false
it 'shows message in flash notice' do
expect(flash[:notice]).to eq 'Track My awesome track accepted!'
end
it 'changes the track\'s state to accepted' do
expect(self_organized_track.state).to eq 'accepted'
end
end
context 'has start_date and end_date' do
it_behaves_like 'fails to accept', true, true, false
end
context 'has start_date and room' do
it_behaves_like 'fails to accept', true, false, true
end
context 'has start_date' do
it_behaves_like 'fails to accept', true, false, false
end
context 'has end_date and room' do
it_behaves_like 'fails to accept', false, true, true
end
context 'has end_date' do
it_behaves_like 'fails to accept', false, true, false
end
context 'has room' do
it_behaves_like 'fails to accept', false, false, true
end
context 'has non of start_date, end_date, room' do
it_behaves_like 'fails to accept', false, false, false
end
end
describe 'PATCH #confirm' do
before :each do
self_organized_track.state = 'accepted'
self_organized_track.save!
patch :confirm, conference_id: conference.short_title, id: self_organized_track.short_name
self_organized_track.reload
end
it 'assigns the correct track' do
expect(assigns(:track)).to eq self_organized_track
end
it 'shows message in flash notice' do
expect(flash[:notice]).to eq 'Track My awesome track confirmed!'
end
it 'changes the track\'s state to confirmed' do
expect(self_organized_track.state).to eq 'confirmed'
end
end
describe 'PATCH #to_reject' do
before :each do
patch :to_reject, conference_id: conference.short_title, id: self_organized_track.short_name
self_organized_track.reload
end
it 'assigns the correct track' do
expect(assigns(:track)).to eq self_organized_track
end
it 'shows message in flash notice' do
expect(flash[:notice]).to eq 'Track My awesome track marked as a possible rejection!'
end
it 'changes the track\'s state to to_reject' do
expect(self_organized_track.state).to eq 'to_reject'
end
end
describe 'PATCH #reject' do
before :each do
patch :reject, conference_id: conference.short_title, id: self_organized_track.short_name
self_organized_track.reload
end
it 'assigns the correct track' do
expect(assigns(:track)).to eq self_organized_track
end
it 'shows message in flash notice' do
expect(flash[:notice]).to eq 'Track My awesome track rejected!'
end
it 'changes the track\'s state to rejected' do
expect(self_organized_track.state).to eq 'rejected'
end
end
describe 'PATCH #cancel' do
before :each do
self_organized_track.state = 'confirmed'
self_organized_track.save!
patch :cancel, conference_id: conference.short_title, id: self_organized_track.short_name
self_organized_track.reload
end
it 'assigns the correct track' do
expect(assigns(:track)).to eq self_organized_track
end
it 'shows message in flash notice' do
expect(flash[:notice]).to eq 'Track My awesome track canceled!'
end
it 'changes the track\'s state to canceled' do
expect(self_organized_track.state).to eq 'canceled'
end
end
end

View file

@ -0,0 +1,111 @@
require 'spec_helper'
describe BoothsController do
let(:user) { create(:user) }
let(:conference) { create(:conference) }
let(:booth) { create(:booth, title: 'Title', conference: conference) }
context 'user is signed in with submitter role' do
before :each do
create(:cfp, program: conference.program, cfp_type: 'booths')
sign_in booth.submitter
end
describe 'GET index' do
before { get :index, conference_id: conference.short_title }
it 'assigns attributes for booths' do
expect(assigns(:booths)).to eq([booth])
end
it 'renders index template' do
expect(response).to render_template('index')
end
end
describe 'GET #new' do
before { get :new, conference_id: conference.short_title }
it 'assigns attributes for booths' do
expect(assigns(:booth)).to be_a_new(Booth)
end
it 'renders new template' do
expect(response).to render_template('new')
end
end
describe 'POST #create' do
context 'successfully created' do
before { post :create, booth: attributes_for(:booth), conference_id: conference.short_title }
it 'creates a new booth' do
expect(Booth.count).to_not eq(0)
end
it 'redirects to booth index' do
expect(response).to redirect_to(conference_booths_path)
end
it 'has responsibles' do
expect(booth.responsibles.count).to_not eq(0)
end
it 'shows success message' do
expect(flash[:notice]).to match('Booth successfully created.')
end
end
context 'create action fails' do
before { post :create, booth: attributes_for(:booth, title: ''), conference_id: conference.short_title }
it 'does not create any record' do
expected = expect do
post :create, booth: attributes_for(:booth, title: ''), conference_id: conference.short_title
end
expected.to_not change(Booth, :count)
end
it 'redirects to new' do
expect(response).to render_template('new')
end
it 'shows flash message' do
expect(flash[:error]).to eq("Creating booth failed. Title can't be blank.")
end
end
end
describe 'GET #edit' do
before { get :edit, id: booth.id, conference_id: conference.short_title }
it 'renders edit template' do
expect(response).to render_template('edit')
end
it 'assigns booth variable' do
expect(assigns(:booth)).to eq booth
end
end
describe 'PATCH #update' do
context 'updates suchessfully' do
before { patch :update, id: booth.id, booth: attributes_for(:booth, title: 'different'), conference_id: conference.short_title }
it 'redirects to booth index path' do
expect(response).to redirect_to conference_booths_path
end
it 'shows success message' do
expect(flash[:notice]).to match 'Booth successfully updated!'
end
it 'updates booth' do
booth.reload
expect(booth.title).to eq('different')
end
end
end
end
end

View file

@ -9,7 +9,7 @@ describe PhysicalTicketController do
describe 'GET #show' do
before :each do
sign_in user
get :show, id: physical_ticket.id, conference_id: conference.short_title
get :show, id: physical_ticket.token, conference_id: conference.short_title
end
it 'assigns ticket_layout' do

View file

@ -24,7 +24,7 @@ describe SubscriptionsController do
it 'shows success message in flash notice' do
post :create, conference_id: conference.short_title
expect(flash[:notice]).to match("You have been subscribed to receive email notifications for #{conference.short_title}")
expect(flash[:notice]).to match("You have subscribed to receive email notifications for #{conference.title}")
end
it 'subscribes user to conference' do
@ -47,7 +47,7 @@ describe SubscriptionsController do
it 'shows success message in flash notice' do
delete :destroy, conference_id: conference.short_title
expect(flash[:notice]).to match("You have been unsubscribed and now you will not be receiving email notifications for #{conference.short_title}.")
expect(flash[:notice]).to match("You have unsubscribed and you will not be receiving email notifications for #{conference.title}.")
end
end
end

View file

@ -1,12 +1,11 @@
require 'spec_helper'
describe TracksController do
# A regular user should be used when the track requests have been enabled
let(:user) { create(:admin) }
let(:conference) { create(:conference) }
let!(:regular_track) { create(:track, program: conference.program) }
let!(:self_organized_track) { create(:track, :self_organized, program: conference.program, submitter: user, color: '#800080') }
let!(:self_organized_track) { create(:track, :self_organized, program: conference.program, submitter: user, name: 'My awesome track', color: '#800080') }
before :each do
sign_in(user)
@ -61,7 +60,7 @@ describe TracksController do
describe 'POST #create' do
context 'saves successfuly' do
before :each do
post :create, track: attributes_for(:track, short_name: 'my_track'), conference_id: conference.short_title
post :create, track: attributes_for(:track, :self_organized, short_name: 'my_track'), conference_id: conference.short_title
end
it 'redirects to tracks index path' do
@ -87,7 +86,7 @@ describe TracksController do
context 'save fails' do
before :each do
allow_any_instance_of(Track).to receive(:save).and_return(false)
post :create, track: attributes_for(:track, short_name: 'my_track'), conference_id: conference.short_title
post :create, track: attributes_for(:track, :self_organized, short_name: 'my_track'), conference_id: conference.short_title
end
it 'assigns a new track with the correct conference' do
@ -127,7 +126,7 @@ describe TracksController do
describe 'PATCH #update' do
context 'updates successfully' do
before :each do
patch :update, track: attributes_for(:track, color: '#FF0000'),
patch :update, track: attributes_for(:track, :self_organized, color: '#FF0000'),
conference_id: conference.short_title,
id: self_organized_track.short_name
end
@ -153,7 +152,7 @@ describe TracksController do
context 'update fails' do
before :each do
allow_any_instance_of(Track).to receive(:save).and_return(false)
patch :update, track: attributes_for(:track, color: '#FF0000'),
patch :update, track: attributes_for(:track, :self_organized, color: '#FF0000'),
conference_id: conference.short_title,
id: self_organized_track.short_name
end
@ -176,4 +175,67 @@ describe TracksController do
end
end
end
describe 'PATCH #restart' do
before :each do
self_organized_track.state = 'withdrawn'
self_organized_track.save!
patch :restart, conference_id: conference.short_title, id: self_organized_track.short_name
self_organized_track.reload
end
it 'assigns the correct track' do
expect(assigns(:track)).to eq self_organized_track
end
it 'shows message in flash notice' do
expect(flash[:notice]).to eq 'Track My awesome track re-submitted.'
end
it 'changes the track\'s state to new' do
expect(self_organized_track.state).to eq 'new'
end
end
describe 'PATCH #confirm' do
before :each do
self_organized_track.state = 'accepted'
self_organized_track.save!
patch :confirm, conference_id: conference.short_title, id: self_organized_track.short_name
self_organized_track.reload
end
it 'assigns the correct track' do
expect(assigns(:track)).to eq self_organized_track
end
it 'shows message in flash notice' do
expect(flash[:notice]).to eq 'Track My awesome track confirmed.'
end
it 'changes the track\'s state to confirmed' do
expect(self_organized_track.state).to eq 'confirmed'
end
end
describe 'PATCH #withdraw' do
before :each do
self_organized_track.state = 'confirmed'
self_organized_track.save!
patch :withdraw, conference_id: conference.short_title, id: self_organized_track.short_name
self_organized_track.reload
end
it 'assigns the correct track' do
expect(assigns(:track)).to eq self_organized_track
end
it 'shows message in flash notice' do
expect(flash[:notice]).to eq 'Track My awesome track withdrawn.'
end
it 'changes the track\'s state to withdrawn' do
expect(self_organized_track.state).to eq 'withdrawn'
end
end
end

View file

@ -0,0 +1,8 @@
FactoryGirl.define do
factory :booth_request do
booth
user
role 'responsible'
end
end

Some files were not shown because too many files have changed in this diff Show more