Merge branch 'master' into org-name-in-conf
This commit is contained in:
commit
e652880dd1
120 changed files with 2844 additions and 408 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
2
Gemfile
2
Gemfile
|
|
@ -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
|
||||
|
|
|
|||
86
Gemfile.lock
86
Gemfile.lock
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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' ]]
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
}
|
||||
}
|
||||
.dropdown-menu {
|
||||
padding: 17px 17px 0px 17px;
|
||||
padding: 17px;
|
||||
min-width: 225px;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -89,4 +89,8 @@ p.comment-body {
|
|||
|
||||
.changeset{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.box{
|
||||
height: 230px;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
16
app/controllers/admin/ticket_scannings_controller.rb
Normal file
16
app/controllers/admin/ticket_scannings_controller.rb
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
97
app/controllers/booths_controller.rb
Normal file
97
app/controllers/booths_controller.rb
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 = ''
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
#
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
class Subscription < ActiveRecord::Base
|
||||
validates :user_id, uniqueness: { scope: [:conference_id] }
|
||||
belongs_to :conference
|
||||
belongs_to :user
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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
|
||||
} )
|
||||
});
|
||||
|
|
@ -2,4 +2,4 @@
|
|||
Editing
|
||||
= @booth.title
|
||||
|
||||
= render 'form'
|
||||
= render 'booths/form'
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
%h1 New booth
|
||||
|
||||
= render 'form'
|
||||
= render 'booths/form'
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
12
app/views/admin/cfps/_tracks_cfp.html.haml
Normal file
12
app/views/admin/cfps/_tracks_cfp.html.haml
Normal 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')
|
||||
|
|
@ -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'}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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' }
|
||||
|
|
|
|||
|
|
@ -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!
|
||||
|
|
|
|||
|
|
@ -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?'
|
||||
|
|
|
|||
|
|
@ -66,6 +66,13 @@
|
|||
Yes
|
||||
- else
|
||||
No
|
||||
%dt
|
||||
Include Booths
|
||||
%dd
|
||||
- if @splashpage.include_booths
|
||||
Yes
|
||||
- else
|
||||
No
|
||||
%dt
|
||||
Include Social Media:
|
||||
%dd
|
||||
|
|
|
|||
|
|
@ -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' }
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
34
app/views/admin/tracks/_change_state_dropdown.html.haml
Normal file
34
app/views/admin/tracks/_change_state_dropdown.html.haml
Normal 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}"
|
||||
|
|
@ -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' }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
8
app/views/admin/tracks/toggle_cfp_inclusion.js.erb
Normal file
8
app/views/admin/tracks/toggle_cfp_inclusion.js.erb
Normal 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();
|
||||
30
app/views/booths/_form.html.haml
Normal file
30
app/views/booths/_form.html.haml
Normal 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
|
||||
} )
|
||||
});
|
||||
6
app/views/booths/edit.html.haml
Normal file
6
app/views/booths/edit.html.haml
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
.container
|
||||
%h1
|
||||
Editing
|
||||
= @booth.title
|
||||
|
||||
= render 'form'
|
||||
51
app/views/booths/index.html.haml
Normal file
51
app/views/booths/index.html.haml
Normal 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'
|
||||
4
app/views/booths/new.html.haml
Normal file
4
app/views/booths/new.html.haml
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
.container
|
||||
%h1 Request a booth
|
||||
|
||||
= render 'form'
|
||||
60
app/views/booths/show.html.haml
Normal file
60
app/views/booths/show.html.haml
Normal 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
|
||||
24
app/views/conferences/_booths.html.haml
Normal file
24
app/views/conferences/_booths.html.haml
Normal 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)
|
||||
30
app/views/conferences/_call_for_tracks.html.haml
Normal file
30
app/views/conferences/_call_for_tracks.html.haml
Normal 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'
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
8
app/views/mailbot/ticket_confirmation_template.text.erb
Normal file
8
app/views/mailbot/ticket_confirmation_template.text.erb
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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' }
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
14
db/migrate/20170720134353_make_track_cfp_active_not_null.rb
Normal file
14
db/migrate/20170720134353_make_track_cfp_active_not_null.rb
Normal 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
|
||||
|
|
@ -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
|
||||
5
db/migrate/20170726065629_add_relevance_to_tracks.rb
Normal file
5
db/migrate/20170726065629_add_relevance_to_tracks.rb
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
class AddRelevanceToTracks < ActiveRecord::Migration
|
||||
def change
|
||||
add_column :tracks, :relevance, :text
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
class AddIncludeBoothsToSplashpages < ActiveRecord::Migration
|
||||
def change
|
||||
add_column :splashpages, :include_booths, :boolean
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
class AddBoothLimitToConferences < ActiveRecord::Migration
|
||||
def change
|
||||
add_column :conferences, :booth_limit, :integer, default: 0
|
||||
end
|
||||
end
|
||||
10
db/migrate/20170731161207_add_booths_to_email_settings.rb
Normal file
10
db/migrate/20170731161207_add_booths_to_email_settings.rb
Normal 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
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
class AddRegistrationTicketToTickets < ActiveRecord::Migration
|
||||
def change
|
||||
add_column :tickets, :registration_ticket, :boolean, default: false
|
||||
end
|
||||
end
|
||||
29
db/schema.rb
29
db/schema.rb
|
|
@ -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|
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
130
spec/controllers/admin/booths_controller_spec.rb
Normal file
130
spec/controllers/admin/booths_controller_spec.rb
Normal 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
|
||||
60
spec/controllers/admin/ticket_scannings_controller_spec.rb
Normal file
60
spec/controllers/admin/ticket_scannings_controller_spec.rb
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
111
spec/controllers/booths_controller_spec.rb
Normal file
111
spec/controllers/booths_controller_spec.rb
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
8
spec/factories/booth_request.rb
Normal file
8
spec/factories/booth_request.rb
Normal 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
Loading…
Add table
Add a link
Reference in a new issue