Browse Source

Paypal Registration

development
Godwin 10 years ago
parent
commit
1430e505a0
  1. 3
      Gemfile
  2. 417
      Gemfile.lock
  3. BIN
      app/assets/images/Thumbs.db
  4. BIN
      app/assets/images/bblogo.png
  5. 81
      app/assets/stylesheets/sass/_base.scss
  6. 54
      app/assets/stylesheets/sass/_layout.scss
  7. 23
      app/controllers/application_controller.rb
  8. 456
      app/controllers/conferences_controller.rb
  9. 4
      app/controllers/organizations_controller.rb
  10. 14
      app/controllers/pages_controller.rb
  11. 69
      app/helpers/application_helper.rb
  12. 16
      app/mailers/user_mailer.rb
  13. 4
      app/models/conference.rb
  14. 1
      app/models/location.rb
  15. 30
      app/models/organization.rb
  16. 4
      app/models/user.rb
  17. 30
      app/models/workshop.rb
  18. 34
      app/views/conferences/_header.html.haml
  19. 1
      app/views/conferences/_register.html.haml
  20. 14
      app/views/conferences/_register_already_registered.html.haml
  21. 15
      app/views/conferences/_register_new_organization.html.haml
  22. 17
      app/views/conferences/_register_new_workshop.html.haml
  23. 10
      app/views/conferences/_register_organizations.html.haml
  24. 4
      app/views/conferences/_register_primary.html.haml
  25. 24
      app/views/conferences/_register_questions.html.haml
  26. 27
      app/views/conferences/_register_thanks.html.haml
  27. 16
      app/views/conferences/_register_volunteer_questions.html.haml
  28. 7
      app/views/conferences/show.html.haml
  29. 9
      app/views/layouts/application.html.haml
  30. 76
      app/views/layouts/user_mailer.html.haml
  31. 5
      app/views/layouts/user_mailer.text.haml
  32. 10
      app/views/pages/404.html.haml
  33. 9
      app/views/pages/language_not_enabled.html.haml
  34. 6
      app/views/pages/permission_denied.html.haml
  35. 6
      app/views/pages/translation_list.html.haml
  36. 11
      app/views/pages/translations.html.haml
  37. 10
      app/views/user_mailer/conference_registration_confirmed_email.html.haml
  38. 9
      app/views/user_mailer/conference_registration_confirmed_email.text.haml
  39. 7
      app/views/user_mailer/conference_registration_email.html.haml
  40. 2
      app/views/user_mailer/conference_registration_email.text.haml
  41. 1
      config/application.rb
  42. 2
      config/environments/development.rb
  43. 1
      config/environments/test.rb
  44. 71
      config/initializers/i18n.rb
  45. 423
      config/locales/translation-info.yml
  46. 4
      config/routes.rb
  47. 5
      db/migrate/20140719172749_add_email_to_conference_registrations.rb
  48. 5
      db/migrate/20140719185914_add_is_complete_to_conference_registrations.rb
  49. 5
      db/migrate/20140719204949_add_completed_to_conference_registrations.rb
  50. 5
      db/migrate/20140723174550_add_payment_confirmation_token_to_conference_registration.rb
  51. 5
      db/migrate/20140723174648_add_payment_info_to_conference_registration.rb
  52. 5
      db/migrate/20140723182548_add_order_to_workshop_streams.rb
  53. 5
      db/migrate/20140723183557_add_order_to_workshop_presentation_styles.rb
  54. 9
      db/schema.rb
  55. 29
      features/landing_page.feature
  56. 0
      features/organizations.feature
  57. 0
      features/registration-two.feature
  58. 593
      features/registration.feature
  59. 216
      features/step_definitions/interface_steps.rb
  60. 88
      features/support/env.rb
  61. 22
      features/support/factory_girl.rb
  62. 22
      features/support/paths.rb
  63. 16
      features/translations.feature
  64. 46
      features/volunteer-registration.feature
  65. BIN
      public/maps/Thumbs.db
  66. BIN
      public/registration_data/1ehptyshk26pjbe8/ba.png
  67. BIN
      public/registration_data/2zizzr5nokd1rh7d/Thumbs.db
  68. BIN
      public/registration_data/2zizzr5nokd1rh7d/bikeagaindoor[1].jpg
  69. BIN
      public/registration_data/9vpeci4qzca7qs3o/Thumbs.db
  70. BIN
      public/registration_data/9vpeci4qzca7qs3o/bikeagaincolourlogo[1].gif
  71. BIN
      public/registration_data/c1g7e2jsyqrp62rv/Thumbs.db
  72. BIN
      public/registration_data/c1g7e2jsyqrp62rv/bikeagaindoor[1].jpg
  73. BIN
      public/registration_data/c7evv341mlp3k4ek/Thumbs.db
  74. BIN
      public/registration_data/c7evv341mlp3k4ek/bikeagaindoor[1].jpg
  75. BIN
      public/registration_data/e0vs4ovunuo2i32i/ba.png
  76. BIN
      public/registration_data/lqgjjhzaew2klf7y/Thumbs.db
  77. BIN
      public/registration_data/lqgjjhzaew2klf7y/bikeagaincolourlogo.gif
  78. BIN
      public/registration_data/qabyxh5an79d1sf1/Thumbs.db
  79. BIN
      public/registration_data/qabyxh5an79d1sf1/bikeagaindoor[1].jpg
  80. BIN
      public/registration_data/tlxsjj1ljiqbvoai/lb.jpg
  81. 1
      spec/spec_helper.rb

3
Gemfile

@ -19,6 +19,7 @@ gem 'oauth2', '~> 0.8.0'
gem 'carrierwave' gem 'carrierwave'
gem 'carrierwave-imageoptimizer' gem 'carrierwave-imageoptimizer'
gem 'mini_magick' gem 'mini_magick'
gem 'carmen', :path => '../carmen/' if File.directory?('../carmen/') && RbConfig::CONFIG['target_os'] =~ /mswin|mingw|cygwin/i
gem 'carmen-rails' gem 'carmen-rails'
gem 'nested_form' gem 'nested_form'
gem 'acts_as_list' gem 'acts_as_list'
@ -30,6 +31,7 @@ gem 'wysiwyg-rails'
gem 'rails-assets-cdn' gem 'rails-assets-cdn'
gem 'sitemap_generator' gem 'sitemap_generator'
gem 'activerecord-session_store' gem 'activerecord-session_store'
gem 'paypal-express'
group :development, :test do group :development, :test do
gem 'rspec' gem 'rspec'
@ -47,6 +49,7 @@ end
group :test do group :test do
gem 'capybara' gem 'capybara'
gem 'poltergeist'
gem 'guard-rspec' gem 'guard-rspec'
gem 'factory_girl_rails' gem 'factory_girl_rails'
gem 'coveralls', require: false gem 'coveralls', require: false

417
Gemfile.lock

@ -0,0 +1,417 @@
GIT
remote: git://github.com/josevalim/rails-footnotes.git
revision: 087914beabb56c2e9979f63eeb0183591065dde3
specs:
rails-footnotes (4.0.2)
rails (>= 3.2)
GIT
remote: git://github.com/svenfuchs/i18n-active_record.git
revision: 2d9a22b6a4e5d809782cdbfa65b14d9e47aa27fc
specs:
i18n-active_record (0.0.2)
i18n (>= 0.5.0)
PATH
remote: ../carmen/
specs:
carmen (1.0.1)
GEM
remote: http://rubygems.org/
specs:
actionmailer (4.0.0)
actionpack (= 4.0.0)
mail (~> 2.5.3)
actionpack (4.0.0)
activesupport (= 4.0.0)
builder (~> 3.1.0)
erubis (~> 2.7.0)
rack (~> 1.5.2)
rack-test (~> 0.6.2)
activemodel (4.0.0)
activesupport (= 4.0.0)
builder (~> 3.1.0)
activerecord (4.0.0)
activemodel (= 4.0.0)
activerecord-deprecated_finders (~> 1.0.2)
activesupport (= 4.0.0)
arel (~> 4.0.0)
activerecord-deprecated_finders (1.0.3)
activerecord-session_store (0.1.0)
actionpack (>= 4.0.0, < 5)
activerecord (>= 4.0.0, < 5)
railties (>= 4.0.0, < 5)
activesupport (4.0.0)
i18n (~> 0.6, >= 0.6.4)
minitest (~> 4.2)
multi_json (~> 1.3)
thread_safe (~> 0.1)
tzinfo (~> 0.3.37)
acts_as_list (0.4.0)
activerecord (>= 3.0)
addressable (2.3.6)
arel (4.0.2)
attr_required (1.0.0)
awesome_print (1.2.0)
bcrypt (3.1.7-x86-mingw32)
better_errors (1.1.0)
coderay (>= 1.0.0)
erubis (>= 2.6.6)
binding_of_caller (0.7.2)
debug_inspector (>= 0.0.1)
builder (3.1.4)
callsite (0.0.11)
capistrano (2.15.5)
highline
net-scp (>= 1.0.0)
net-sftp (>= 2.0.0)
net-ssh (>= 2.0.14)
net-ssh-gateway (>= 1.1.0)
capybara (2.4.1)
mime-types (>= 1.16)
nokogiri (>= 1.3.3)
rack (>= 1.0.0)
rack-test (>= 0.5.4)
xpath (~> 2.0)
carmen-rails (1.0.1)
carmen (~> 1.0.0)
rails
carrierwave (0.10.0)
activemodel (>= 3.2.0)
activesupport (>= 3.2.0)
json (>= 1.7)
mime-types (>= 1.16)
carrierwave-imageoptimizer (1.2.1)
carrierwave (~> 0.8)
image_optimizer (~> 1.2)
celluloid (0.15.2)
timers (~> 1.1.0)
childprocess (0.5.3)
ffi (~> 1.0, >= 1.0.11)
chunky_png (1.3.1)
cliver (0.3.2)
coderay (1.1.0)
coffee-rails (4.0.1)
coffee-script (>= 2.2.0)
railties (>= 4.0.0, < 5.0)
coffee-script (2.3.0)
coffee-script-source
execjs
coffee-script-source (1.7.1)
compass (0.12.7)
chunky_png (~> 1.2)
fssm (>= 0.2.7)
sass (~> 3.2.19)
compass-rails (1.1.7)
compass (>= 0.12.2)
sprockets (<= 2.11.0)
coveralls (0.7.0)
multi_json (~> 1.3)
rest-client
simplecov (>= 0.7)
term-ansicolor
thor
crack (0.4.2)
safe_yaml (~> 1.0.0)
cucumber (1.3.15)
builder (>= 2.1.2)
diff-lcs (>= 1.1.3)
gherkin (~> 2.12)
multi_json (>= 1.7.5, < 2.0)
multi_test (>= 0.1.1)
cucumber-rails (1.4.1)
capybara (>= 1.1.2, < 3)
cucumber (>= 1.3.8, < 2)
mime-types (~> 1.16)
nokogiri (~> 1.5)
rails (>= 3, < 5)
database_cleaner (1.3.0)
debug_inspector (0.0.2)
diff-lcs (1.2.5)
docile (1.1.5)
erubis (2.7.0)
execjs (2.2.1)
factory_girl (4.4.0)
activesupport (>= 3.0.0)
factory_girl_rails (4.4.1)
factory_girl (~> 4.4.0)
railties (>= 3.0.0)
faraday (0.9.0)
multipart-post (>= 1.2, < 3)
ffi (1.9.3-x86-mingw32)
font-awesome-rails (4.1.0.0)
railties (>= 3.2, < 5.0)
forgery (0.6.0)
formatador (0.2.5)
foundation-rails (5.3.1.0)
railties (>= 3.1.0)
sass (>= 3.2.0)
fssm (0.2.10)
geocoder (1.2.3)
gherkin (2.12.2-x86-mingw32)
multi_json (~> 1.3)
guard (2.6.1)
formatador (>= 0.2.4)
listen (~> 2.7)
lumberjack (~> 1.0)
pry (>= 0.9.12)
thor (>= 0.18.1)
guard-rspec (4.2.10)
guard (~> 2.1)
rspec (>= 2.14, < 4.0)
haml (4.0.5)
tilt
haml-rails (0.5.1)
actionpack (~> 4.0.0)
activesupport (~> 4.0.0)
haml (>= 3.1, < 5.0)
railties (~> 4.0.0)
highline (1.6.21)
hike (1.2.3)
httpauth (0.2.1)
i18n (0.6.11)
image_optimizer (1.2.1)
jquery-rails (3.1.1)
railties (>= 3.0, < 5.0)
thor (>= 0.14, < 2.0)
jquery-ui-rails (5.0.0)
railties (>= 3.2.16)
json (1.8.1)
jwt (0.1.13)
multi_json (>= 1.5)
launchy (2.4.2)
addressable (~> 2.3)
listen (2.7.9)
celluloid (>= 0.15.2)
rb-fsevent (>= 0.9.3)
rb-inotify (>= 0.9)
lumberjack (1.0.9)
mail (2.5.4)
mime-types (~> 1.16)
treetop (~> 1.4.8)
meta_request (0.3.3)
callsite (~> 0.0, >= 0.0.11)
rack-contrib (~> 1.1)
railties (>= 3.0.0, < 5.0.0)
method_source (0.8.2)
mime-types (1.25.1)
mini_magick (3.7.0)
subexec (~> 0.2.1)
mini_portile (0.6.0)
minitest (4.7.5)
multi_json (1.10.1)
multi_test (0.1.1)
multipart-post (2.0.0)
nested_form (0.3.2)
net-scp (1.2.1)
net-ssh (>= 2.6.5)
net-sftp (2.1.2)
net-ssh (>= 2.6.5)
net-ssh (2.9.1)
net-ssh-gateway (1.2.0)
net-ssh (>= 2.6.5)
netrc (0.7.7)
nokogiri (1.6.2.1-x86-mingw32)
mini_portile (= 0.6.0)
oauth (0.4.7)
oauth2 (0.8.1)
faraday (~> 0.8)
httpauth (~> 0.1)
jwt (~> 0.1.4)
multi_json (~> 1.0)
rack (~> 1.2)
paper_trail (3.0.3)
activerecord (>= 3.0, < 5.0)
activesupport (>= 3.0, < 5.0)
paypal-express (0.5.5)
activesupport (>= 2.3)
attr_required (>= 0.0.5)
restclient_with_cert
pg (0.17.1-x86-mingw32)
poltergeist (1.5.1)
capybara (~> 2.1)
cliver (~> 0.3.1)
multi_json (~> 1.0)
websocket-driver (>= 0.2.0)
polyglot (0.3.5)
pry (0.10.0-x86-mingw32)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
win32console (~> 1.3)
rack (1.5.2)
rack-contrib (1.1.0)
rack (>= 0.9.1)
rack-test (0.6.2)
rack (>= 1.0)
rails (4.0.0)
actionmailer (= 4.0.0)
actionpack (= 4.0.0)
activerecord (= 4.0.0)
activesupport (= 4.0.0)
bundler (>= 1.3.0, < 2.0)
railties (= 4.0.0)
sprockets-rails (~> 2.0.0)
rails-assets-cdn (0.1.0)
rails
rails_12factor (0.0.2)
rails_serve_static_assets
rails_stdout_logging
rails_serve_static_assets (0.0.2)
rails_stdout_logging (0.0.3)
railties (4.0.0)
actionpack (= 4.0.0)
activesupport (= 4.0.0)
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rake (10.3.2)
rb-fsevent (0.9.4)
rb-inotify (0.9.5)
ffi (>= 0.5.0)
rest-client (1.7.2-x86-mingw32)
ffi (~> 1.9)
mime-types (>= 1.16, < 3.0)
netrc (~> 0.7)
restclient_with_cert (0.0.8)
rest-client (>= 1.6)
rspec (3.0.0)
rspec-core (~> 3.0.0)
rspec-expectations (~> 3.0.0)
rspec-mocks (~> 3.0.0)
rspec-core (3.0.2)
rspec-support (~> 3.0.0)
rspec-expectations (3.0.2)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.0.0)
rspec-mocks (3.0.2)
rspec-support (~> 3.0.0)
rspec-rails (3.0.1)
actionpack (>= 3.0)
activesupport (>= 3.0)
railties (>= 3.0)
rspec-core (~> 3.0.0)
rspec-expectations (~> 3.0.0)
rspec-mocks (~> 3.0.0)
rspec-support (~> 3.0.0)
rspec-support (3.0.2)
rubyzip (1.1.6)
rvm-capistrano (1.5.3)
capistrano (~> 2.15.4)
safe_yaml (1.0.3)
sass (3.2.19)
sass-rails (4.0.3)
railties (>= 4.0.0, < 5.0)
sass (~> 3.2.0)
sprockets (~> 2.8, <= 2.11.0)
sprockets-rails (~> 2.0)
selenium-webdriver (2.42.0)
childprocess (>= 0.5.0)
multi_json (~> 1.0)
rubyzip (~> 1.0)
websocket (~> 1.0.4)
simplecov (0.9.0)
docile (~> 1.1.0)
multi_json
simplecov-html (~> 0.8.0)
simplecov-html (0.8.0)
sitemap_generator (5.0.4)
builder
slop (3.6.0)
sorcery (0.8.6)
bcrypt (~> 3.1)
oauth (~> 0.4, >= 0.4.4)
oauth2 (>= 0.8.0, < 1.0.0)
sprockets (2.11.0)
hike (~> 1.2)
multi_json (~> 1.0)
rack (~> 1.0)
tilt (~> 1.1, != 1.3.0)
sprockets-rails (2.0.1)
actionpack (>= 3.0)
activesupport (>= 3.0)
sprockets (~> 2.8)
subexec (0.2.3)
term-ansicolor (1.3.0)
tins (~> 1.0)
thor (0.19.1)
thread_safe (0.3.4)
tilt (1.4.1)
timers (1.1.0)
tins (1.3.0)
treetop (1.4.15)
polyglot
polyglot (>= 0.3.1)
tzinfo (0.3.40)
uglifier (2.5.3)
execjs (>= 0.3.0)
json (>= 1.8.0)
wdm (0.1.0)
webmock (1.18.0)
addressable (>= 2.3.6)
crack (>= 0.3.2)
websocket (1.0.7)
websocket-driver (0.3.4)
win32console (1.3.2-x86-mingw32)
wysiwyg-rails (1.1.6)
font-awesome-rails (= 4.1.0.0)
railties (>= 3.2, < 5.0)
xpath (2.0.0)
nokogiri (~> 1.3)
PLATFORMS
x86-mingw32
DEPENDENCIES
activerecord-session_store
acts_as_list
awesome_print
better_errors
binding_of_caller
capistrano
capybara
carmen!
carmen-rails
carrierwave
carrierwave-imageoptimizer
coffee-rails (~> 4.0.0)
compass-rails (~> 1.1.3)
coveralls
cucumber-rails
database_cleaner
factory_girl_rails
font-awesome-rails
forgery
foundation-rails
geocoder
guard-rspec
haml
haml-rails
i18n-active_record!
jquery-rails
jquery-ui-rails
launchy
meta_request
mini_magick
nested_form
oauth2 (~> 0.8.0)
paper_trail
paypal-express
pg
poltergeist
rails (= 4.0.0)
rails-assets-cdn
rails-footnotes!
rails_12factor
rspec
rspec-rails
rvm-capistrano
sass-rails (~> 4.0.0)
selenium-webdriver
simplecov
sitemap_generator
sorcery (>= 0.8.1)
uglifier (>= 1.3.0)
wdm (>= 0.1.0)
webmock
wysiwyg-rails

BIN
app/assets/images/Thumbs.db

Binary file not shown.

BIN
app/assets/images/bblogo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

81
app/assets/stylesheets/sass/_base.scss

@ -1,4 +1,43 @@
table#translations { table#translations {
table-layout: fixed;
padding: 0;
.key, .pages {
width: 25%;
overflow: hidden;
&:hover {
overflow: visible;
}
}
.pages {
position: relative;
ul {
font-size: 1em;
margin: 0;
list-style: none;
position: absolute;
left: 0;
top: 0;
}
a {
display: block;
}
&:hover {
ul {
z-index: 100;
}
a {
background-color: $white;
}
}
}
td.value { td.value {
position: relative; position: relative;
cursor: text; cursor: text;
@ -396,6 +435,48 @@ ul.tags,
outline: none !important; outline: none !important;
} }
#register-dlg {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: transparent;
visibility: hidden;
z-index: 100;
@include text-shadow(none);
@include transition(background-color 250ms ease-in-out 125ms, visibility 0 linear 250ms);
form {
position: fixed;
min-width: 30em;
left: 110%;
right: 0;
max-width: 30em;
bottom: 0;
margin: auto;
top: 0;
background-color: $white;
height: 10em;
padding: 1em;
z-index: 101;
@include transform(skewX(-30deg));
@include transition(all 250ms ease-in-out 0);
}
&.open {
background-color: rgba($primary-color, 0.8);
visibility: visible;
@include transition(background-color 250ms ease-in-out);
form {
left: 0;
@include transform(skewX(0));
@include transition(all 250ms ease-in-out 125ms);
}
}
}
@include breakpoint(medium) { @include breakpoint(medium) {
.organizations-index, .organizations-index,
.conferences-index { .conferences-index {

54
app/assets/stylesheets/sass/_layout.scss

@ -85,7 +85,7 @@ body {
float: left; float: left;
.logo { .logo {
width: auto; width: 100%;
height: 90%;//2em; height: 90%;//2em;
fill: $primary-color; fill: $primary-color;
position: absolute; position: absolute;
@ -236,6 +236,11 @@ body {
text-align: center; text-align: center;
} }
form {
text-align: center;
padding: 2em 0;
}
@include breakpoint(medium) { @include breakpoint(medium) {
+ #content { + #content {
padding-top: 0; padding-top: 0;
@ -333,23 +338,33 @@ main {
//} //}
} }
.align-bottom > div { //.align-bottom > div {
margin-bottom: 3em; //margin-bottom: 3em;
} //}
.button { .button {
width: 75%; width: 75%;
color: inherit; color: inherit;
border-color: inherit; border-color: inherit;
background-color: rgba(darken($article-color, 0), 0.33); background-color: rgba(darken($primary-color, 0), 0.33);
padding: 0.75em 1em; padding: 0.75em 1em;
white-space: nowrap;
@include text-shadow(none); @include text-shadow(none);
&:hover { &:hover {
background-color: $article-color; background-color: $primary-color;
color: $white; color: $white;
border-color: transparent; border-color: transparent;
} }
&#register-now {
background-color: rgba(darken($warning-color, 0), 0.33);
margin-top: 0;
&:hover {
background-color: $warning-color;
}
}
} }
.organizations & { .organizations & {
@ -433,7 +448,8 @@ main {
} }
} }
.page-style-emphasize-banner & { .page-style-emphasize-banner &,
.conferences & {
figure img { figure img {
box-shadow: 0 0 2em $black; box-shadow: 0 0 2em $black;
} }
@ -495,6 +511,10 @@ main {
} }
} }
.page-style-article.small-banner & {
min-height: 10em;
}
.page-style-list & { .page-style-list & {
min-height: 10em; min-height: 10em;
height: 30em; height: 30em;
@ -505,6 +525,10 @@ main {
font-size: 6vw; font-size: 6vw;
} }
} }
.row .align-bottom.buttons {
height: 14em;
}
} }
@include breakpoint(large) { @include breakpoint(large) {
@ -526,6 +550,10 @@ main {
border-bottom-left-radius: inherit; border-bottom-left-radius: inherit;
} }
.button {
//margin-top: 20%;
}
.page-style-list & { .page-style-list & {
height: 15em; height: 15em;
height: 15vw; height: 15vw;
@ -560,6 +588,10 @@ main {
.row .align-bottom { .row .align-bottom {
height: auto; height: auto;
&.buttons {
height: 10em;
}
} }
} }
} }
@ -623,13 +655,15 @@ main {
position: absolute; position: absolute;
top: 100%; top: 100%;
right: 0.25em; right: 0.25em;
margin: 0.25em 0.25em 0 0; //margin: 0.25em 0.25em 0 0;
margin: -1em 0.25em 0 0;
font-size: 0.8em; font-size: 0.8em;
text-align: right; text-align: right;
text-shadow: none; text-shadow: none;
@include opacity(0.5); @include opacity(0.5);
clear: right; clear: right;
z-index: 2; z-index: 2;
mix-blend-mode: luminosity;
> span { > span {
display: none; display: none;
@ -1043,3 +1077,7 @@ table {
.clearfix { .clearfix {
@include clearfix; @include clearfix;
} }
article.row {
margin-left: 0;
}

23
app/controllers/application_controller.rb

@ -14,9 +14,32 @@ class ApplicationController < ActionController::Base
before_filter :capture_page_info before_filter :capture_page_info
@@test_host
@@test_location
def capture_page_info def capture_page_info
init_vars init_vars
$page_info = {:path => request.env['PATH_INFO'], :controller => params['controller'], :action => params['action']} $page_info = {:path => request.env['PATH_INFO'], :controller => params['controller'], :action => params['action']}
ActionMailer::Base.default_url_options = {:host => "#{request.protocol}#{request.host_with_port}"}
lang = I18n.backend.set_locale (is_test? && @@test_host.present? ? @@test_host : request.host)
if lang.blank?
do_404
elsif lang != true
@lang = lang
render 'pages/language_not_enabled', status: 404
end
end
def self.set_host(host)
@@test_host = host
end
def self.set_location(location)
@@test_location = location#.nil? nil : Geocoder.search(location)
end
def self.get_location()
@@test_location
end end
def do_404 def do_404

456
app/controllers/conferences_controller.rb

@ -6,7 +6,6 @@ class ConferencesController < ApplicationController
# GET /conferences # GET /conferences
def index def index
#puts params
@conference_type = nil @conference_type = nil
if params['conference_type'] if params['conference_type']
@conference_type = ConferenceType.find_by!(:slug => params['conference_type']) @conference_type = ConferenceType.find_by!(:slug => params['conference_type'])
@ -111,50 +110,72 @@ class ConferencesController < ApplicationController
end end
def register_submit def register_submit
#set_conference
next_step = nil next_step = nil
if !session[:registration] if !session[:registration]
session[:registration] = Hash.new session[:registration] = Hash.new
session[:registration][:path] = Array.new session[:registration][:path] = Array.new
end end
case params['step']
case session[:registration_step] || params['step']
when 'confirm'
if session[:registration][:is_participant]
registration = ConferenceRegistration.find(session[:registration][:registration_id])
if registration.completed
complete_registration
next_step = 'thanks'
else
next_step = 'organizations'
end
else
complete_registration
next_step = 'thanks'
end
when 'register' when 'register'
session[:registration][:email] = params[:email] session[:registration][:email] = params[:email]
registration = ConferenceRegistration.find_by(:email => params[:email])
if !registration.nil?
session[:registration] = YAML.load(registration.data)
session[:registration][:registration_id] = registration.id
next_step = (registration.completed.blank? && registration.is_participant.present? ? 'organizations' : 'thanks')
else
if !session[:registration][:user] || !session[:registration][:user][:firstname]
user = User.find_by(:email => params[:email]) user = User.find_by(:email => params[:email])
#registration = ConferenceRegistration.new(:conference_id => @conference.id, :is_attending => 'yes', :is_participant => params[:is_participant], :is_volunteer => params[:is_volunteer])
session[:registration][:user] = Hash.new session[:registration][:user] = Hash.new
session[:registration][:organizations] = Array.new
session[:registration][:user][:id] = user ? user.id : nil session[:registration][:user][:id] = user ? user.id : nil
if user
user.organizations.each { |org| session[:registration][:organizations] << org.id }
end
session[:registration][:user][:firstname] = user ? (user.firstname || user.username) : nil session[:registration][:user][:firstname] = user ? (user.firstname || user.username) : nil
session[:registration][:user][:lastname] = user ? user.lastname : nil session[:registration][:user][:lastname] = user ? user.lastname : nil
session[:registration][:user][:username] = user ? user.username : nil session[:registration][:user][:username] = user ? user.username : nil
end
next_step = 'primary' next_step = 'primary'
end
when 'primary' when 'primary'
if !params[:firstname] || !params[:lastname] if params[:firstname].blank? || params[:lastname].blank?
error = _'registration.register.no_name_error','Oh, c\'mon, please tell us your name. We promise not to share it with anyone, we just don\'t want to get you mixed up with someone else.' error = _'registration.register.no_name_error',"Oh, c'mon, please tell us your name. We promise not to share it with anyone, we just don't want to get you mixed up with someone else."
end
if (params[:is_volunteer] || 'false').to_sym != :true && (params[:is_participant] || 'false').to_sym != :true
error ||= _'registration.register.no_role_error',"Please let us know if you're attending the conference or volunteering (or both)"
end end
session[:registration][:user][:firstname] = params[:firstname] session[:registration][:user][:firstname] = params[:firstname]
session[:registration][:user][:firstname] = params[:lastname] session[:registration][:user][:lastname] = params[:lastname]
session[:registration][:is_volunteer] = params[:is_volunteer] session[:registration][:is_volunteer] = (params[:is_volunteer] || 'false').to_sym == :true
session[:registration][:is_participant] = params[:is_participant] session[:registration][:is_participant] = (params[:is_participant] || 'false').to_sym == :true
if !session[:registration][:user][:id] if !session[:registration][:user][:id]
session[:registration][:user][:username] = params[:username] || (params[:firstname] + ' ' + params[:lastname]) session[:registration][:user][:username] = !error && params[:username].blank? ? (params[:firstname] + ' ' + params[:lastname]) : params[:username]
end end
if params[:is_volunteer] if session[:registration][:is_volunteer]
next_step = 'volunteer_questions' next_step = 'volunteer_questions'
elsif params[:is_participant] elsif session[:registration][:is_participant]
next_step = 'organizations' next_step = 'questions'
else
error = _'registration.register.no_role_error',"Please let us know if you're attending the conference or volunteering (or both)"
end end
when 'organizations' when 'organizations'
@registration = ConferenceRegistration.find(session[:registration][:registration_id])
if (params[:org] && params[:org].length > 0) || params[:add_new_org]
session[:registration][:organizations] = Array.new session[:registration][:organizations] = Array.new
if params[:org].length > 0 if params[:org]
params[:org].each { |org| session[:registration][:organizations] << org } params[:org].each { |org| session[:registration][:organizations] << (org.is_a?(Array) ? org.first : org).to_i }
end
update_registration_data
if params[:add_new_org] if params[:add_new_org]
session[:registration][:new_organization] ||= Array.new session[:registration][:new_organization] ||= Array.new
@ -168,28 +189,43 @@ class ConferencesController < ApplicationController
end end
next_step = 'new_organization' next_step = 'new_organization'
else else
next_step = 'questions' if session[:registration][:is_workshop_host]
next_step = 'new_workshop'
session[:registration][:workshop] ||= Array.new
session[:registration][:workshop][0] ||= Hash.new
session[:registration][:workshop_index] = 0
else
complete_registration
next_step = 'thanks'
end
end
elsif params[:no_org]
if !session[:registration][:is_workshop_host]
next_step = 'new_workshop'
session[:registration][:workshop] ||= Array.new
session[:registration][:workshop][0] ||= Hash.new
session[:registration][:workshop_index] = 0
else
complete_registration
next_step = 'thanks'
end end
elsif params[:add_new_org]
session[:registration][:questions] ||= Hash.new
next_step = 'questions'
else else
error = _'registration.register.no_organization_error',"Please select an organization or enter a new one" error = _'registration.register.no_organization_error',"Please select an organization or enter a new one"
end end
when 'new_organization' when 'new_organization'
if !params[:city] if params[:name].blank?
message = _'register.new_organization.no_city_error','Please enter your organization\'s city' error = _'register.new_organization.no_name_error',"Please tell us your organization's name"
end
if !params[:street]
message = _'register.new_organization.no_street_error','Please enter your organization\'s street address'
end end
if !params[:organization_email] if params[:organization_email].blank?
message = _'register.new_organization.no_email_error','Please tell us your organization\'s email address. We need it so that we can send out invitaions for upcoming conferences. No spam, we promise, and you\'ll be able to edit your preferences before we start ending out email.' error ||= _'register.new_organization.no_email_error',"Please tell us your organization's email address. We need it so that we can send out invitations for upcoming conferences. No spam, we promise, and you'll be able to edit your preferences before we start ending out email."
elsif params[:organization_email].strip.casecmp(session[:registration][:email].strip) elsif params[:organization_email].strip.casecmp(session[:registration][:email].strip)
message = _'register.new_organization.same_email_as_attendee_error','This email needs to be different than your own personal email, we need to keep in touch with your organization even if you\'re gone in years to come.' error ||= _'register.new_organization.same_email_as_attendee_error',"This email needs to be different than your own personal email, we need to keep in touch with your organization even if you're gone in years to come."
end end
if !params[:name] if params[:street].blank?
message = _'register.new_organization.no_name_error','Please tell us your organization\'s name' error ||= _'register.new_organization.no_street_error','Please enter your organization\'s street address'
end
if params[:city].blank?
error ||= _'register.new_organization.no_city_error','Please enter your organization\'s city'
end end
i = params[:new_org_index].to_i i = params[:new_org_index].to_i
session[:registration][:new_organization][i][:country] = params[:organization_country] session[:registration][:new_organization][i][:country] = params[:organization_country]
@ -200,23 +236,26 @@ class ConferencesController < ApplicationController
session[:registration][:new_organization][i][:email] = params[:organization_email] session[:registration][:new_organization][i][:email] = params[:organization_email]
session[:registration][:new_organization][i][:name] = params[:organization_name] session[:registration][:new_organization][i][:name] = params[:organization_name]
if params[:organization_logo] if params[:logo] && !session[:registration][:new_organization][i][:saved]
if session[:registration][:new_organization][i][:organization_logo] begin
FileUtils.rm session[:registration][:new_organization][i][:organization_logo] if session[:registration][:new_organization][i][:logo]
FileUtils.rm session[:registration][:new_organization][i][:logo]
end end
rescue; end
base_dir = File.join("public", "registration_data") base_dir = File.join("public", "registration_data")
FileUtils.mkdir_p(base_dir) unless File.directory?(base_dir) FileUtils.mkdir_p(base_dir) unless File.directory?(base_dir)
hash_dir = rand(36**16).to_s(36) hash_dir = rand_hash
dir = File.join(base_dir, hash_dir) dir = File.join(base_dir, hash_dir)
while File.directory?(dir) while File.directory?(dir)
hash_dir = rand(36**16).to_s(36) hash_dir = rand_hash
dir = File.join(base_dir, hash_dir) dir = File.join(base_dir, hash_dir)
end end
FileUtils.mkdir_p(dir) FileUtils.mkdir_p(dir)
session[:registration][:new_organization][i][:organization_logo] = File.join("registration_data", hash_dir, params[:organization_logo].original_filename) session[:registration][:new_organization][i][:logo] = File.join("registration_data", hash_dir, params[:logo].original_filename)
FileUtils.cp params[:organization_logo].tempfile.path, File.join("public", session[:registration][:new_organization][i][:organization_logo]) FileUtils.cp params[:logo].tempfile.path, File.join("public", session[:registration][:new_organization][i][:logo])
end end
if params[:add_another_org] && params[:add_another_org].to_sym == :on update_registration_data
if params[:add_another_org] && params[:add_another_org].to_sym == :true
next_step = 'new_organization' next_step = 'new_organization'
if params[:previous] if params[:previous]
session[:registration][:new_org_index] = [0, i - 1].max session[:registration][:new_org_index] = [0, i - 1].max
@ -233,25 +272,37 @@ class ConferencesController < ApplicationController
if session[:registration][:new_organization][i + 1] if session[:registration][:new_organization][i + 1]
session[:registration][:new_organization] = session[:registration][:new_organization].first(i + 1) session[:registration][:new_organization] = session[:registration][:new_organization].first(i + 1)
end end
next_step = 'questions' if session[:registration][:is_workshop_host]
end
when 'questions'
session[:registration][:questions] = params[:questions].deep_symbolize_keys
session[:registration][:is_workshop_host] = params[:is_workshop_host].to_i
if !params[:is_workshop_host].to_i.zero?
next_step = 'new_workshop' next_step = 'new_workshop'
session[:registration][:workshop] ||= Array.new session[:registration][:workshop] ||= Array.new
session[:registration][:workshop][0] ||= Hash.new session[:registration][:workshop][0] ||= Hash.new
session[:registration][:workshop_index] = 0 session[:registration][:workshop_index] = 0
else else
next_step = 'submit' complete_registration
next_step = 'thanks'
end
end
when 'questions'
session[:registration][:questions] = params[:questions].deep_symbolize_keys
session[:registration][:is_workshop_host] = !params[:is_workshop_host].to_i.zero?
next_step = 'organizations'
if params[:submit] || params[:next]
if !session[:registration][:organizations]
user = User.find_by(:email => session[:registration][:email])
session[:registration][:organizations] = Array.new
if user
user.organizations.each { |org| session[:registration][:organizations] << org.id }
end
end
create_registration
end end
when 'volunteer_questions' when 'volunteer_questions'
session[:registration][:volunteer_questions] = params[:volunteer_questions].deep_symbolize_keys session[:registration][:volunteer_questions] = params[:volunteer_questions].deep_symbolize_keys
if session[:registration][:is_participant] if session[:registration][:is_participant]
next_step = 'organizations' next_step = 'questions'
else else
next_step = 'submit' create_registration
next_step = 'thanks'
end end
when 'new_workshop' when 'new_workshop'
i = params[:workshop_index].to_i i = params[:workshop_index].to_i
@ -259,15 +310,18 @@ class ConferencesController < ApplicationController
session[:registration][:workshop][i][:info] = params[:workshop_info] session[:registration][:workshop][i][:info] = params[:workshop_info]
session[:registration][:workshop][i][:stream] = params[:workshop_stream] session[:registration][:workshop][i][:stream] = params[:workshop_stream]
session[:registration][:workshop][i][:presentation_style] = params[:workshop_presentation_style] session[:registration][:workshop][i][:presentation_style] = params[:workshop_presentation_style]
session[:registration][:workshop][i][:notes] = params[:workshop_notes]
if !params[:workshop_info] if params[:workshop_title].blank?
error = _'registration.register.no_workshop_info_error','Please describe your workshop as best as you can to give other participants an idea of what to expect' error = _'registration.register.no_workshop_title_error','Please give your workshop a title'
end end
if !params[:workshop_title] if params[:workshop_info].blank?
error = _'registration.register.no_workshop_title_error','Please give your workshop a title' error ||= _'registration.register.no_workshop_info_error','Please describe your workshop as best as you can to give other participants an idea of what to expect'
end end
update_registration_data
if params[:previous] if params[:previous]
session[:registration][:workshop_index] = [0, i - 1].max session[:registration][:workshop_index] = [0, i - 1].max
elsif params[:add_another_workshop] elsif params[:add_another_workshop]
@ -281,11 +335,14 @@ class ConferencesController < ApplicationController
if session[:registration][:workshop][i + 1] if session[:registration][:workshop][i + 1]
session[:registration][:workshop] = session[:registration][:workshop].first(i + 1) session[:registration][:workshop] = session[:registration][:workshop].first(i + 1)
end end
next_step = 'submit' next_step = 'thanks'
complete_registration
end
when 'thanks'
@registration = ConferenceRegistration.find(session[:registration][:registration_id])
if @registration.is_confirmed.blank?
send_confirmation
end end
when 'submit'
UserMailer.conference_registration_email(@conference, session[:registration]).deliver
session.delete(:registration)
next_step = 'thanks' next_step = 'thanks'
when 'cancel' when 'cancel'
if params[:yes] if params[:yes]
@ -294,45 +351,77 @@ class ConferencesController < ApplicationController
else else
return {error: false, next_step: session[:registration][:path].pop} return {error: false, next_step: session[:registration][:path].pop}
end end
when 'already_registered'
send_confirmation
next_step = 'thanks'
when 'pay_now', 'payment-confirmed', 'payment-cancelled'
next_step = 'thanks'
end end
if params[:previous] session.delete(:registration_step)
next_step = session[:registration][:path].pop #if params[:previous]
else # next_step = session[:registration][:path].pop
#else
if !params[:cancel] && error if !params[:cancel] && error
return {error: true, message: error, next_step: params['step']} return {error: true, message: error, next_step: params['step']}
end end
if session[:registration] && params['step'] if session[:registration] && session[:registration][:path] && params['step']
session[:registration][:path] << params['step'] session[:registration][:path] << params['step']
end end
end #end
{error: false, next_step: params[:cancel] ? 'cancel' : next_step} {error: false, next_step: params[:cancel] ? 'cancel' : next_step}
end end
def register def register
is_post = request.post? || session[:registration_step]
set_conference set_conference
if !@conference.registration_open
do_404
return
end
data = register_submit data = register_submit
@register_step = request.post? ? data[:next_step] : 'register' @register_step = is_post ? data[:next_step] : 'register'
@error_message = data[:error] ? data[:message] : nil @error_message = data[:error] ? data[:message] : nil
template = (@register_step == 'register' ? '' : 'register_') + @register_step template = (@register_step == 'register' ? '' : 'register_') + @register_step
if !File.exists?(Rails.root.join("app", "views", params[:controller], "_#{template}.html.haml")) if !File.exists?(Rails.root.join("app", "views", params[:controller], "_#{template}.html.haml"))
do_404 do_404
return return
end end
if session[:registration] if session[:registration]
session[:registration][@register_step.to_sym] ||= Hash.new session[:registration][@register_step.to_sym] ||= Hash.new
end end
@actions = nil @actions = nil
@multipart = false
case @register_step case @register_step
when 'register' when 'register', 'organizations', 'new_organization', 'new_workshop', 'volunteer_questions'
@actions = :next @actions = :next
when 'primary', 'organizations', 'new_organization', 'new_workshop', 'volunteer_questions' if @register_step == 'new_organization'
@actions = [:previous, :cancel, :next] @multipart = true
end
when 'thanks'
@registration = ConferenceRegistration.find(session[:registration][:registration_id])
if @registration.is_confirmed.blank?
@actions = :resend_confirmation_email
end
next_step = 'thanks'
#if @registration.complete && @registration.is_participant && @registration.payment_info.nil?
#` @actions = [:submit_payment]
when 'primary'
@actions = [:cancel, :next]
when 'submit' when 'submit'
@actions = [:previous, :cancel, :submit] @actions = [:cancel, :submit]
when 'cancel' when 'cancel'
@actions = [:no, :yes] @actions = [:no, :yes]
when 'already_registered'
@registration = ConferenceRegistration.find_by(:email => session[:registration][:email])
if !@registration.complete
@actions = :resend_confirmation_email
end
when 'questions' when 'questions'
@actions = [:previous, :cancel, :next] @actions = [:cancel, :submit]
@housing_options = { @housing_options = {
'I will fend for myself thanks' => 'none', 'I will fend for myself thanks' => 'none',
'I will need a real bed' => 'bed', 'I will need a real bed' => 'bed',
@ -342,13 +431,17 @@ class ConferencesController < ApplicationController
session[:registration][:questions][:housing] ||= 'couch' session[:registration][:questions][:housing] ||= 'couch'
@loaner_bike_options = { @loaner_bike_options = {
'No' => 'no', 'No' => 'no',
'Yes' => 'medium', 'Yes, an average size should do' => 'medium',
'Yes but a small one please' => 'small', 'Yes but a small one please' => 'small',
'Yes but a large one please' => 'large' 'Yes but a large one please' => 'large'
} }
session[:registration][:questions][:loaner_bike] ||= 'medium' session[:registration][:questions][:loaner_bike] ||= 'medium'
session[:registration][:questions][:diet] ||= Hash.new #session[:registration][:questions][:diet] ||= Hash.new
end end
#puts ' ------yyyy----------------- '
#puts @register_step
if request.xhr? if request.xhr?
@register_content = render_to_string :partial => template @register_content = render_to_string :partial => template
render :json => {status: 200, html: @register_content} render :json => {status: 200, html: @register_content}
@ -358,6 +451,94 @@ class ConferencesController < ApplicationController
end end
end end
def register_confirm
set_conference
@conference_registration = ConferenceRegistration.find_by(confirmation_token: params[:confirmation_token])
if !@conference_registration.nil? && @conference_registration.conference_id == @conference.id && !@conference_registration.complete
@conference_registration.is_confirmed = true
@conference_registration.save!
session[:registration] = YAML.load(@conference_registration.data)
session[:registration][:path] = Array.new
session[:registration][:registration_id] = @conference_registration.id
session[:registration_step] = 'confirm'
redirect_to action: 'register'
else
do_404
end
end
def register_pay_registration
set_conference
@conference_registration = ConferenceRegistration.find_by(confirmation_token: params[:confirmation_token])
if !@conference_registration.nil? && @conference_registration.conference_id == @conference.id && @conference_registration.complete
if params[:payment_amount].nil?
session[:registration] = YAML.load(@conference_registration.data)
session[:registration][:registration_id] = @conference_registration.id
session[:registration][:path] = Array.new
session[:registration_step] = 'pay_now'
redirect_to action: 'register'
else
host = "#{request.protocol}#{request.host_with_port}"
begin
paypal_info = get_secure_info(:paypal)
request = Paypal::Express::Request.new(
:username => paypal_info[:username].strip!,
:password => paypal_info[:password].strip!,
:signature => paypal_info[:signature].strip!
)
payment_request = Paypal::Payment::Request.new(
:currency_code => 'USD', # if nil, PayPal use USD as default
:description => 'Conference Registration', # item description
:quantity => 1, # item quantity
:amount => params[:payment_amount].to_f, # item value
:custom_fields => {
CARTBORDERCOLOR: "00ADEF",
LOGOIMG: "https://cdn.bikebike.org/assets/bblogo.png"
}
)
response = request.setup(
payment_request,
host + (@conference.url + "/register/confirm-payment/#{@conference_registration.payment_confirmation_token}/").gsub(/\/\/+/, '/'),
host + (@conference.url + "/register/cancel-payment/#{@conference_registration.confirmation_token}/").gsub(/\/\/+/, '/')
)
redirect_to response.redirect_uri
rescue Exception => e
ddd
end
end
else
do_404
end
end
def register_confirm_payment
set_conference
@conference_registration = ConferenceRegistration.find_by(payment_confirmation_token: params[:confirmation_token])
if !@conference_registration.nil? && @conference_registration.conference_id == @conference.id && @conference_registration.complete && @conference_registration.payment_info.nil?
@conference_registration.payment_info = "#{params[:PayerID]}:#{params[:token]}"
@conference_registration.save!
session[:registration] = YAML.load(@conference_registration.data)
session[:registration][:registration_id] = @conference_registration.id
session[:registration][:path] = Array.new
session[:registration_step] = 'payment-confirmed'
redirect_to action: 'register'
else
do_404
end
end
def register_cancel_payment
set_conference
@conference_registration = ConferenceRegistration.find_by(confirmation_token: params[:confirmation_token])
if !@conference_registration.nil? && @conference_registration.conference_id == @conference.id && @conference_registration.complete && @conference_registration.payment_info.nil?
session[:registration] = YAML.load(@conference_registration.data)
session[:registration][:registration_id] = @conference_registration.id
session[:registration][:path] = Array.new
session[:registration_step] = 'payment-cancelled'
redirect_to action: 'register'
end
end
def register_step def register_step
set_conference set_conference
data = params data = params
@ -456,4 +637,133 @@ class ConferencesController < ApplicationController
end end
end end
end end
def update_registration_data
if session[:registration][:registration_id]
registration = ConferenceRegistration.find(session[:registration][:registration_id])
registration.data = YAML.load(registration.data).merge(session[:registration]).to_yaml
registration.save!
end
end
def complete_registration
if session[:registration][:registration_id]
registration = ConferenceRegistration.find(session[:registration][:registration_id])
session[:registration] = YAML.load(registration.data)
registration.completed = true
if registration.is_confirmed
registration.complete = true
user = User.find_by(:email => session[:registration][:email])
if !user
user = User.new(:email => session[:registration][:email], :username => session[:registration][:user][:username], :role => 'user')
end
user.firstname = session[:registration][:user][:firstname]
user.lastname = session[:registration][:user][:lastname]
user.save!
if session[:registration][:is_participant]
UserOrganizationRelationship.destroy_all(:user_id => user.id)
session[:registration][:organizations].each { |org_id|
found = false
org = Organization.find(org_id.is_a?(Array) ? org_id.first : org_id)
org.user_organization_relationships.each {|rel| found = found && rel.user_id == user.id}
if !found
org.user_organization_relationships << UserOrganizationRelationship.new(:user_id => user.id, :relationship => UserOrganizationRelationship::Administrator)
end
org.save!
}
if session[:registration][:new_organization]
session[:registration][:new_organization].each { |new_org|
found = false
org = Organization.find_by(:email_address => new_org[:email])
if org.nil?
org = Organization.new(
:name => new_org[:name],
:email_address => new_org[:email],
:info => new_org[:info]
)
org.locations << Location.new(:country => new_org[:country], :territory => new_org[:territory], :city => new_org[:city], :street => new_org[:street])
end
org.user_organization_relationships.each {|rel| found = found && rel.user_id == user.id}
if !found
org.user_organization_relationships << UserOrganizationRelationship.new(:user_id => user.id, :relationship => UserOrganizationRelationship::Administrator)
end
org.save!
org.avatar = "#{request.protocol}#{request.host_with_port}/#{new_org[:logo]}"
cover = get_panoramio_image(org.locations.first)
org.cover = cover[:image]
org.cover_attribution_id = cover[:attribution_id]
org.cover_attribution_user_id = cover[:attribution_user_id]
org.cover_attribution_name = cover[:attribution_user_name]
org.cover_attribution_src = cover[:attribution_src]
org.save!
}
end
if session[:registration][:is_workshop_host] && session[:registration][:workshop]
session[:registration][:workshop].each { |new_workshop|
workshop = Workshop.new(
:conference_id => @conference.id,
:title => new_workshop[:title],
:info => new_workshop[:info],
:workshop_stream_id => WorkshopStream.find_by(:slug => new_workshop[:stream]).id,
:workshop_presentation_style => WorkshopPresentationStyle.find_by(:slug => new_workshop[:presentation_style])
)
workshop.workshop_facilitators << WorkshopFacilitator.new(:user_id => user.id)
workshop.save!
}
end
end
send_confirmation_confirmation(registration, session[:registration])
session.delete(:registration)
session[:registration] = Hash.new
session[:registration][:registration_id] = registration.id
end
registration.save!
end
end
def create_registration
if !session[:registration][:registration_id]
registration = ConferenceRegistration.new(
:conference_id => @conference.id,
:user_id => session[:registration][:user][:id],
:email => session[:registration][:email],
:is_attending => 'yes',
:is_participant => session[:registration][:is_participant],
:is_volunteer => session[:registration][:is_volunteer],
:is_confirmed => false,
:complete => false,
:completed => false,
:confirmation_token => rand_hash(32, :conference_registration, :confirmation_token),
:payment_confirmation_token => rand_hash(32, :conference_registration, :payment_confirmation_token),
:data => session[:registration].to_yaml
)
registration.save!
session[:registration][:registration_id] = registration.id
send_confirmation(registration, session[:registration])
end
end
def send_confirmation(registration = nil, data = nil)
registration ||= ConferenceRegistration.find(session[:registration][:registration_id])
data ||= YAML.load(registration.data)
UserMailer.conference_registration_email(@conference, data, registration).deliver
end
def send_confirmation_confirmation(registration = nil, data = nil)
registration ||= ConferenceRegistration.find(session[:registration][:registration_id])
data ||= YAML.load(registration.data)
UserMailer.conference_registration_confirmed_email(@conference, data, registration).deliver
end
def send_payment_received(registration = nil, data = nil)
registration ||= ConferenceRegistration.find(session[:registration][:registration_id])
data ||= YAML.load(registration.data)
UserMailer.conference_registration_payment_received(@conference, data, registration).deliver
end
end end

4
app/controllers/organizations_controller.rb

@ -22,8 +22,8 @@ class OrganizationsController < ApplicationController
if !@organizations.has_key?(country.name) if !@organizations.has_key?(country.name)
@organizations[country.name] = Hash.new @organizations[country.name] = Hash.new
end end
territory = country.subregions.coded(location.territory) territory = country.subregions? ? country.subregions.coded(location.territory) : nil
territory_name = territory ? territory.name : 0 territory_name = territory.nil? ? 0 : territory.name
if !@organizations[country.name].has_key?(territory_name) if !@organizations[country.name].has_key?(territory_name)
@organizations[country.name][territory_name] = Hash.new @organizations[country.name][territory_name] = Hash.new
end end

14
app/controllers/pages_controller.rb

@ -5,8 +5,8 @@ class PagesController < ApplicationController
#skip_before_filter :verify_authenticity_token, only: [:translate] #skip_before_filter :verify_authenticity_token, only: [:translate]
def home def home
@conferences = Conference.all #@conferences = Conference.all
@conference = Conference.find(:first, :order => "start_date DESC") @conference = Conference.order("start_date DESC").first
end end
def resources def resources
@ -58,16 +58,16 @@ class PagesController < ApplicationController
end end
def translations def translations
if !current_user #if !current_user
raise ActiveRecord::PremissionDenied # raise ActiveRecord::PremissionDenied
end #end
@lang = params[:lang] @lang = params[:lang]
@translations = I18n.backend.get_translation_info @translations = is_test? ? {} : I18n.backend.get_translation_info
I18n.config.enforce_available_locales = false I18n.config.enforce_available_locales = false
end end
def translation_list def translation_list
if !current_user if !current_user && is_production?
raise ActiveRecord::PremissionDenied raise ActiveRecord::PremissionDenied
end end
total = 0 total = 0

69
app/helpers/application_helper.rb

@ -9,6 +9,8 @@ module ApplicationHelper
@@banner_image = nil @@banner_image = nil
@@has_content = true @@has_content = true
@@front_page = false @@front_page = false
@@body_class = nil
@@test_location = nil
def init_vars def init_vars
@@keyQueue = nil @@keyQueue = nil
@ -20,6 +22,7 @@ module ApplicationHelper
@@banner_image = nil @@banner_image = nil
@@has_content = true @@has_content = true
@@front_page = false @@front_page = false
@@body_class = nil
end end
def this_is_the_front_page def this_is_the_front_page
@ -100,6 +103,11 @@ module ApplicationHelper
content_for(:dom_ready, &block) content_for(:dom_ready, &block)
end end
def body_class(c)
@@body_class ||= Array.new
@@body_class << (c.is_a?(Array) ? c.join(' ') : c)
end
def page_style(style) def page_style(style)
classes = ['page-style-' + style.to_s] classes = ['page-style-' + style.to_s]
#if @@no_banner #if @@no_banner
@ -114,6 +122,9 @@ module ApplicationHelper
if @@banner_image if @@banner_image
classes << 'has-banner-image' classes << 'has-banner-image'
end end
if @@body_class
classes << @@body_class.join(' ')
end
if params[:controller] if params[:controller]
classes << params[:controller] classes << params[:controller]
@ -440,7 +451,9 @@ module ApplicationHelper
end end
def lookup_ip_location def lookup_ip_location
if request.remote_ip == '127.0.0.1' if is_test? && ApplicationController::get_location.present?
Geocoder.search(ApplicationController::get_location).first
elsif request.remote_ip == '127.0.0.1'
Geocoder.search(session['remote_ip'] || (session['remote_ip'] = open("http://checkip.dyndns.org").first.gsub(/^.*\s([\d\.]+).*$/s, '\1').gsub(/[^\.\d]/, ''))).first Geocoder.search(session['remote_ip'] || (session['remote_ip'] = open("http://checkip.dyndns.org").first.gsub(/^.*\s([\d\.]+).*$/s, '\1').gsub(/[^\.\d]/, ''))).first
else else
request.location request.location
@ -492,6 +505,10 @@ module ApplicationHelper
Rails.env == 'production' Rails.env == 'production'
end end
def is_test?
Rails.env == 'test'
end
def subdomain def subdomain
request.env['SERVER_NAME'].gsub(/^(\w+)\..*$/, '\1') request.env['SERVER_NAME'].gsub(/^(\w+)\..*$/, '\1')
end end
@ -505,6 +522,56 @@ module ApplicationHelper
location.city + (territory ? ' ' + territory.name : '') + ', ' + Carmen::Country.coded(location.country).name location.city + (territory ? ' ' + territory.name : '') + ', ' + Carmen::Country.coded(location.country).name
end end
def rand_hash(length = 16, model = nil, field = nil)
if field
hash = rand_hash(length)
while !model.to_s.to_s.singularize.classify.constantize.find_by(field => hash).nil?
hash = rand_hash(length)
end
end
rand(36**length).to_s(36)
end
def get_panoramio_image(location)
if is_test?
params[:image] = 'panoramio.jpg'
params[:attribution_id] = 1234
params[:attribution_user_id] = 5678
params[:attribution_name] = 'Some Guy'
params[:attribution_src] = 'panoramio'
return params
end
location = location.city + ', ' + (location.territory ? location.territory + ' ' : '') + location.country
$panoramios ||= Hash.new
$panoramios[location] ||= 0
$panoramios[location] += 1
result = Geocoder.search(location).first
if result
points = Geocoder::Calculations.bounding_box([result.latitude, result.longitude], 5, { :unit => :km })
options = {:set => :public, :size => :original, :from => 0, :to => 20, :mapfilter => false, :miny => points[0], :minx => points[1], :maxy => points[2], :maxx => points[3]}
url = 'http://www.panoramio.com/map/get_panoramas.php?' + options.to_query
response = JSON.parse(open(url).read)
response['photos'].each { |img|
if img['width'].to_i > 980
if Organization.find_by(:cover_attribution_id => img['photo_id'], :cover_attribution_src => 'panoramio').nil? && Conference.find_by(:cover_attribution_id => img['photo_id'], :cover_attribution_src => 'panoramio').nil?
params[:image] = img['photo_file_url']
params[:attribution_id] = img['photo_id']
params[:attribution_user_id] = img['owner_id']
params[:attribution_name] = img['owner_name']
params[:attribution_src] = 'panoramio'
return params
end
end
}
end
return nil
end
def get_secure_info(name)
YAML.load(File.read(Rails.root.parent.join("secure/#{name.to_s}.yml")))[Rails.env].symbolize_keys
end
private private
def _form_field(type, name, value, options) def _form_field(type, name, value, options)
if type == 'check_box' if type == 'check_box'

16
app/mailers/user_mailer.rb

@ -1,5 +1,5 @@
class UserMailer < ActionMailer::Base class UserMailer < ActionMailer::Base
default from: "noreply@bikebike.org" default from: "Bike!Bike! <noreply@bikebike.org>"
# Subject can be set in your I18n file at config/locales/en.yml # Subject can be set in your I18n file at config/locales/en.yml
# with the following lookup: # with the following lookup:
@ -23,9 +23,19 @@ class UserMailer < ActionMailer::Base
mail to: "to@example.org" mail to: "to@example.org"
end end
def conference_registration_email(conference, data) def conference_registration_email(conference, data, conference_registration)
@data = data @data = data
@conference = conference @conference = conference
mail to: data[:email], subject: 'Please confirm your registration for ' + conference.title @url = "https://bikebike.org"#UserMailer.default_url_options[:host]
@confirmation_url = UserMailer.default_url_options[:host] + "/#{@conference.url}/register/confirm/#{conference_registration.confirmation_token}/".gsub(/\/\/+/, '/')
mail to: data[:email], subject: (_'register.email.registration.subject',"Please confirm your registration for #{conference.title}", vars: {:conference_title => conference.title})
end
def conference_registration_confirmed_email(conference, data, conference_registration)
@data = data
@conference = conference
@url = "https://bikebike.org"#UserMailer.default_url_options[:host]
@confirmation_url = UserMailer.default_url_options[:host] + "/#{@conference.url}/register/pay-registration/#{conference_registration.confirmation_token}/".gsub(/\/\/+/, '/')
mail to: data[:email], subject: (_'register.email.registration_confirmed.subject',"Thanks for confirming your registration for #{conference.title}", vars: {:conference_title => conference.title})
end end
end end

4
app/models/conference.rb

@ -7,8 +7,8 @@ class Conference < ActiveRecord::Base
has_many :conference_host_organizations, :dependent => :destroy has_many :conference_host_organizations, :dependent => :destroy
has_many :organizations, :through => :conference_host_organizations has_many :organizations, :through => :conference_host_organizations
has_many :conference_registration_form_fields, :order => 'position ASC', :dependent => :destroy#, :class_name => '::ConferenceRegistrationFormField' #has_many :conference_registration_form_fields, :order => 'position ASC', :dependent => :destroy#, :class_name => '::ConferenceRegistrationFormField'
has_many :registration_form_fields, :through => :conference_registration_form_fields #has_many :registration_form_fields, :through => :conference_registration_form_fields
has_many :workshops has_many :workshops

1
app/models/location.rb

@ -4,6 +4,7 @@ class Location < ActiveRecord::Base
has_many :organizations, :through => :locations_organization has_many :organizations, :through => :locations_organization
geocoded_by :full_address geocoded_by :full_address
reverse_geocoded_by :latitude, :longitude, :address => :full_address reverse_geocoded_by :latitude, :longitude, :address => :full_address
after_validation :geocode, if: ->(obj){ obj.country_changed? or obj.territory_changed? or obj.city_changed? or obj.street_changed? or obj.postal_code_changed? } after_validation :geocode, if: ->(obj){ obj.country_changed? or obj.territory_changed? or obj.city_changed? or obj.street_changed? or obj.postal_code_changed? }

30
app/models/organization.rb

@ -11,6 +11,7 @@ class Organization < ActiveRecord::Base
accepts_nested_attributes_for :locations, :reject_if => proc {|l| l[id].blank?} accepts_nested_attributes_for :locations, :reject_if => proc {|l| l[id].blank?}
accepts_nested_attributes_for :user_organization_relationships, :reject_if => proc {|u| u[:user_id].blank?}, :allow_destroy => true accepts_nested_attributes_for :user_organization_relationships, :reject_if => proc {|u| u[:user_id].blank?}, :allow_destroy => true
before_create :make_slug
def location def location
locations.first locations.first
@ -28,4 +29,33 @@ class Organization < ActiveRecord::Base
slug slug
end end
def generate_slug(name, location = nil)
s = name.gsub(/[^a-z1-9]+/i, '-').chomp('-').gsub(/\-([A-Z])/, '\1')
if Organization.find_by(:slug => s).present? && !location.nil?
if location.city.present?
s += '-' + location.city
end
if Organization.find_by(:slug => s).present? && location.territory.present?
s += '-' + location.territory
end
if Organization.find_by(:slug => s).present?
s += '-' + location.country
end
end
attempt = 1
ss = s
while Organization.find_by(:slug => s)
attempt += 1
s = ss + '-' + attempt.to_s
end
s
end
private
def make_slug
if !self.slug
self.slug = generate_slug(self.name, self.locations && self.locations[0])
end
end
end end

4
app/models/user.rb

@ -3,8 +3,8 @@ class User < ActiveRecord::Base
config.authentications_class = Authentication config.authentications_class = Authentication
end end
validates :password, presence: true, confirmation: true, length: { minimum: 3 }, unless: ("id?" || "password_confirmation?") #validates :password, presence: true, confirmation: true, length: { minimum: 3 }, unless: ("id?" || "password_confirmation?")
validates :password_confirmation, presence: true, unless: ("id?" || "password?") #validates :password_confirmation, presence: true, unless: ("id?" || "password?")
validates :email, uniqueness: true validates :email, uniqueness: true

30
app/models/workshop.rb

@ -1,7 +1,37 @@
class Workshop < ActiveRecord::Base class Workshop < ActiveRecord::Base
belongs_to :conference belongs_to :conference
has_many :workshop_facilitators, :dependent => :destroy
has_many :users, :through => :workshop_facilitators
accepts_nested_attributes_for :workshop_facilitators, :reject_if => proc {|u| u[:user_id].blank?}, :allow_destroy => true
before_create :make_slug
def to_param def to_param
slug slug
end end
private
def make_slug
if !self.slug
s = self.title.gsub(/[^a-z1-9]+/i, '-').chomp('-').gsub(/\-([A-Z])/, '\1')
if Organization.find_by(:slug => s) && self.locations && self.locations[0]
s += '-' + self.locations[0].city
if Organization.find_by(:slug => s) && locations[0].territory
s += '-' + self.locations[0].territory
end
if Organization.find_by(:slug => s)
s += '-' + self.locations[0].country
end
end
attempt = 1
ss = s
while Organization.find_by(:slug => s)
attempt += 1
s = ss + '-' + attempt
end
self.slug = s
end
end
end end

34
app/views/conferences/_header.html.haml

@ -1,12 +1,16 @@
- banner_image @conference.cover_url, id: @conference.cover_attribution_id, name: @conference.cover_attribution_name, user_id: @conference.cover_attribution_user_id, src: @conference.cover_attribution_src - banner_image @conference.cover_url, id: @conference.cover_attribution_id, name: @conference.cover_attribution_name, user_id: @conference.cover_attribution_user_id, src: @conference.cover_attribution_src
- small_banner = (params['controller'] == 'conferences' && params['action'] != 'show')
- if small_banner
- body_class('small-banner')
- page_style (params['controller'] == 'conferences' ? 'article' : 'emphasize-banner') - page_style (params['controller'] == 'conferences' ? 'article' : 'emphasize-banner')
- content_for :banner do - content_for :banner do
.row .row
- if !small_banner
.columns.small-12.banner .columns.small-12.banner
%figure %figure
%img{src: @conference.poster.full.url} %img{src: @conference.poster.full.url}
.columns.medium-8.align-bottom .columns.medium-7.align-bottom
- title = @conference.conference_type.slug == 'bikebike' ? 'Bike!Bike! '+@conference.start_date.year.to_s : @conference.title - title = @conference.conference_type.slug == 'bikebike' ? 'Bike!Bike! '+@conference.start_date.year.to_s : @conference.title
%div %div
%h1 %h1
@ -33,11 +37,31 @@
= info.html_safe = info.html_safe
- else - else
%p= ActionView::Base.full_sanitizer.sanitize(@conference.info).gsub(/^(.{300,350}\.)(.*)$/m, '\1...') %p= ActionView::Base.full_sanitizer.sanitize(@conference.info).gsub(/^(.{300,350}\.)(.*)$/m, '\1...')
.columns.medium-4.centered.align-bottom .columns.medium-5.centered.align-bottom.buttons
%div %div
- if @conference.registration_open
%a.button.arrow-r{href: @conference.url(:register)}
=_'conference.Register_Now'
- if params['controller'] != 'conferences' - if params['controller'] != 'conferences'
%a.button.more{href: @conference.url} %a.button.more{href: @conference.url}
=_'conference.More_Info' =_'conference.More_Info'
- if @conference.registration_open && !small_banner
%a.button#register-now{href: @conference.url(:register)}
=_'conference.Register_Now'
#register-dlg
= form_tag (@conference.url + '/register/').gsub(/\/\/+/, '/'), :method => :post do
= hidden_field_tag :step, 'register'
= email_field_tag :email
= form_actions :register
- if !small_banner && @conference.registration_open
- content_for :dom_ready do
:plain
$('#register-now').click(function(e) {
e.preventDefault();
if ($('#register-dlg').hasClass('open')) {
$('#register-dlg form').submit();
}
$('#register-dlg').toggleClass('open');
});
$('#register-dlg').click(function(e) {
if ($(e.target).attr('id') == 'register-dlg') {
$('#register-dlg').toggleClass('open');
}
});

1
app/views/conferences/_register.html.haml

@ -1 +1,2 @@
= email_field_tag :email, session[:registration][:email] = email_field_tag :email, session[:registration][:email]

14
app/views/conferences/_register_already_registered.html.haml

@ -0,0 +1,14 @@
- if @registration.complete
%h3=_'registration.already_registered.complete.title','You Have Already Registered'
.columns.medium-10.medium-offset-1.end
%p.help
=_'registration.already_registered.complete.help','There\'s nothing more to do, you have already registered so we\'ll see you in '
= @conference.organizations.first.locations.first.city
- elsif @registration.is_confirmed
%h3=_'registration.already_registered.confirmed.title','You\'re Already Registered but we are missing some Information'
.columns.medium-10.medium-offset-1.end
%p.help=_'registration.already_registered.complete.help','You\'re already set to go but we had a few more questions for you. If you need us to resed your confirmation, just click the button below.'
- else
%h3=_'registration.already_registered.not_confirmed.title','We\'re awaiting your Confirmation'
.columns.medium-10.medium-offset-1.end
%p.help=_'registration.already_registered.not_confirmed.help','You already sent us the information we need but we need you to confirm. If you don\'t have the email anymore, we can resend it to you.'

15
app/views/conferences/_register_new_organization.html.haml

@ -2,16 +2,17 @@
= hidden_field_tag :new_org_index, org_index = hidden_field_tag :new_org_index, org_index
- if session[:registration][:new_organization].length > 1 - if session[:registration][:new_organization].length > 1
%h3=_'registration.new_organization.list.title','Your New Organizations' %h3=_'registration.new_organization.list.title','Your New Organizations'
%ul.columns.medium-10.medium-offset-1 %ul.columns.medium-11.medium-offset-1.end
- session[:registration][:new_organization].each_with_index do |new_organization, index| - session[:registration][:new_organization].each_with_index do |new_organization, index|
- if new_organization[:title] - if new_organization[:name]
%li %li
- if index == org_index && new_organization[:title] - if index == org_index && new_organization[:name]
%strong=new_organization[:title] %strong=new_organization[:name]
- else - else
= new_organization[:title] = new_organization[:name]
%h3=_'registration.new_organization.title','Your Organization Information' %h3=_'registration.new_organization.title','Your Organization Information'
.columns.medium-12= text_field_tag :organization_name, session[:registration][:new_organization][org_index][:name], :required => true .columns.medium-12
= text_field_tag :organization_name, session[:registration][:new_organization][org_index][:name], :required => true
.columns.medium-12= text_area_tag :organization_info, session[:registration][:new_organization][org_index][:info], :data => {:editor => ""} .columns.medium-12= text_area_tag :organization_info, session[:registration][:new_organization][org_index][:info], :data => {:editor => ""}
.columns.medium-7 .columns.medium-7
= email_field_tag :organization_email, session[:registration][:new_organization][org_index][:email], :required => true = email_field_tag :organization_email, session[:registration][:new_organization][org_index][:email], :required => true
@ -20,7 +21,7 @@
= country_select_tag :organization_country, session[:registration][:new_organization][org_index][:country], :required => true = country_select_tag :organization_country, session[:registration][:new_organization][org_index][:country], :required => true
= subregion_select_tag :organization_territory, session[:registration][:new_organization][org_index][:territory], session[:registration][:new_organization][org_index][:country] || 'US', html: {class: session[:registration][:new_organization][org_index][:country] ? 'can' : 'cant', data: {:country => session[:registration][:new_organization][org_index][:country]}} = subregion_select_tag :organization_territory, session[:registration][:new_organization][org_index][:territory], session[:registration][:new_organization][org_index][:country] || 'US', html: {class: session[:registration][:new_organization][org_index][:country] ? 'can' : 'cant', data: {:country => session[:registration][:new_organization][org_index][:country]}}
.columns.medium-5 .columns.medium-5
= image_field_tag :organization_logo = image_field_tag :logo
.columns .columns
= check_box_tag :add_another_org, (org_index <= session[:registration][:new_organization].length - 1) = check_box_tag :add_another_org, (org_index <= session[:registration][:new_organization].length - 1)

17
app/views/conferences/_register_new_workshop.html.haml

@ -14,11 +14,11 @@
.columns.medium-10.medium-offset-1= text_field_tag :workshop_title, session[:registration][:workshop][workshop_index][:title], :required => true .columns.medium-10.medium-offset-1= text_field_tag :workshop_title, session[:registration][:workshop][workshop_index][:title], :required => true
.columns.medium-10.medium-offset-1= text_area_tag :workshop_info, session[:registration][:workshop][workshop_index][:info], :required => true, :data => {:editor => ""} .columns.medium-10.medium-offset-1= text_area_tag :workshop_info, session[:registration][:workshop][workshop_index][:info], :required => true, :data => {:editor => ""}
.columns.medium-5.medium-offset-1 .columns.medium-5.medium-offset-1
%h4=_'registration.workshop.streams.title','Stream' %h4=_'registration.workshop.streams.title','Themes'
%p.help=_'registration.workshop.streams.help','Select the stream that best categorizes your workshop' %p.help=_'registration.workshop.streams.help','Select the theme that best categorizes your workshop'
- streams = Hash.new - streams = Hash.new
- streams[_'workshop_stream.select_one','Select a stream'] = '' - streams[_'workshop_stream.select_one','Select a theme'] = ''
- WorkshopStream.all.each do |stream| - WorkshopStream.order('"order" ASC').each do |stream|
- streams[_'workshop_stream.' + stream.slug] = stream.slug - streams[_'workshop_stream.' + stream.slug] = stream.slug
= select_tag :workshop_stream, options_for_select(streams, session[:registration][:workshop][workshop_index][:stream] || '') = select_tag :workshop_stream, options_for_select(streams, session[:registration][:workshop][workshop_index][:stream] || '')
.columns.medium-5.end .columns.medium-5.end
@ -26,12 +26,15 @@
%p.help=_'registration.workshop.styles.help','Select the style that best describes how you will run your workshop' %p.help=_'registration.workshop.styles.help','Select the style that best describes how you will run your workshop'
- styles = Hash.new - styles = Hash.new
- styles[_'workshop_presentation_style.select_one','Select a style'] = '' - styles[_'workshop_presentation_style.select_one','Select a style'] = ''
- WorkshopPresentationStyle.all.each do |style| - WorkshopPresentationStyle.order('"order" ASC').each do |style|
- styles[_'workshop_presentation_style.' + style.slug] = style.slug - styles[_'workshop_presentation_style.' + style.slug] = style.slug
= select_tag :workshop_presentation_style, options_for_select(styles, session[:registration][:workshop][workshop_index][:presentation_style] || '') = select_tag :workshop_presentation_style, options_for_select(styles, session[:registration][:workshop][workshop_index][:presentation_style] || '')
.columns.medium-10.medium-offset-1.end
%h4=_'registration.workshop.notes.title','Additional notes for Organizers'
%p=_'registration.workshop.notes.help','Anything else that the conference organizers should know? Is anyone helping you facilitate?'
= text_area_tag :workshop_notes, session[:registration][:workshop][workshop_index][:notes], :label => false
.columns.medium-10.medium-offset-1 .columns.medium-10.medium-offset-1
- #xx
= check_box_tag :add_another_workshop, "1", (workshop_index < session[:registration][:workshop].length - 1) = check_box_tag :add_another_workshop, "1", (workshop_index < session[:registration][:workshop].length - 1)
- content_for :footer_scripts do - content_for :footer_scripts do
= javascript_include_tag 'editor' = javascript_include_tag 'editor'

10
app/views/conferences/_register_organizations.html.haml

@ -1,3 +1,11 @@
- registration = ConferenceRegistration.find(session[:registration][:registration_id])
- if registration && registration.is_confirmed
%h3=_'register.organizations.confirm_thanks.title','Thanks for confirming!'
- if session[:registration][:is_workshop_host]
%p=_'register.organizations.confirm_thanks.is_workshop_host.help','Before you finish, we would just like to find out where you\'re coming from and get some info about your workshop.'
- else
%p=_'register.organizations.confirm_thanks.is_not_workshop_host.help','Before you finish, we would just like to find out where you\'re coming from.'
%p=_'register.organizations.confirm_thanks.payment_notice','After that you will also be able to pay for registration.'
%h3 %h3
=_'register.organizations.title','Who do you Represent?' =_'register.organizations.title','Who do you Represent?'
%p=_'register.organizations.description','Please let us know where you\'re coming from! Find your organizations on the right, they are listed by how close they are to you right now.' %p=_'register.organizations.description','Please let us know where you\'re coming from! Find your organizations on the right, they are listed by how close they are to you right now.'
@ -8,8 +16,6 @@
- my_location = lookup_ip_location - my_location = lookup_ip_location
- lids = Location.near(my_location.latitude.to_s+', '+my_location.longitude.to_s, 999999, order: 'distance').map{|l|l.id} - lids = Location.near(my_location.latitude.to_s+', '+my_location.longitude.to_s, 999999, order: 'distance').map{|l|l.id}
- orgs = Hash.new - orgs = Hash.new
-# orgs = Organization.joins(:locations_organization).where('locations_organizations.location_id' => lids)
-# orgs.each do |org|
- lids.each do |lid| - lids.each do |lid|
- org = Organization.joins(:locations_organization).where('locations_organizations.location_id' => lid).first - org = Organization.joins(:locations_organization).where('locations_organizations.location_id' => lid).first
- if org && !orgs.has_key?(org.id) - if org && !orgs.has_key?(org.id)

4
app/views/conferences/_register_primary.html.haml

@ -6,5 +6,5 @@
.columns .columns
%h3=_'registration.primary.role_title','Attending as:' %h3=_'registration.primary.role_title','Attending as:'
.columns.small-offset-1 .columns.small-offset-1
= check_box_tag :is_participant, session[:registration][:is_participant] = check_box_tag :is_participant, 'true', session[:registration][:is_participant]
= check_box_tag :is_volunteer, session[:registration][:is_volunteer] = check_box_tag :is_volunteer, 'true', session[:registration][:is_volunteer]

24
app/views/conferences/_register_questions.html.haml

@ -13,19 +13,19 @@
.columns.medium-8.medium-offset-2.end .columns.medium-8.medium-offset-2.end
= select_tag '[questions][loaner_bike]', options_for_select(@loaner_bike_options, session[:registration][:questions][:loaner_bike]) = select_tag '[questions][loaner_bike]', options_for_select(@loaner_bike_options, session[:registration][:questions][:loaner_bike])
-#.columns.medium-offset-1.end
-# %h4=_'registration.questions.diet','We\'ll be serving some food. Do you have any dietary restrictions?'
-#.columns.medium-8.medium-offset-2.end
-# = check_box_tag '[questions][diet][no_meat]', session[:registration][:questions][:diet][:no_meat]
-# = check_box_tag '[questions][diet][no_dairy]', session[:registration][:questions][:diet][:no_dairy]
-# = check_box_tag '[questions][diet][no_animal_products]', session[:registration][:questions][:diet][:no_animal_products]
-# = check_box_tag '[questions][diet][no_gluten]', session[:registration][:questions][:diet][:no_gluten]
-# = check_box_tag '[questions][diet][no_nuts]', session[:registration][:questions][:diet][:no_nuts]
-# %h5=_'registration.questions.diet_extra.title','Anything else?'
-# = text_area_tag '[questions][diet][diet_extra]', session[:registration][:questions][:diet_extra], :label => false
.columns.medium-offset-1.end .columns.medium-offset-1.end
%h4=_'registration.questions.diet','We\'ll be serving some food. Do you have any dietary restrictions?' %h4=_'registration.questions.workshop','Would you like to host a workshop?'
.columns.medium-8.medium-offset-2.end %p.help=_'registration.questions.workshop.help','Did you have an idea for a workshop that you\'d like to help run? If so, we\'ll ask some follow-up questions later on.'
= check_box_tag '[questions][diet][no_meat]', session[:registration][:questions][:diet][:no_meat]
= check_box_tag '[questions][diet][no_dairy]', session[:registration][:questions][:diet][:no_dairy]
= check_box_tag '[questions][diet][no_animal_products]', session[:registration][:questions][:diet][:no_animal_products]
= check_box_tag '[questions][diet][no_gluten]', session[:registration][:questions][:diet][:no_gluten]
= check_box_tag '[questions][diet][no_nuts]', session[:registration][:questions][:diet][:no_nuts]
%h5=_'registration.questions.diet_extra.title','Anything else?'
= text_area_tag '[questions][diet][diet_extra]', session[:registration][:questions][:diet_extra], :label => false
.columns.medium-offset-1.end
%h4=_'registration.questions.workshop','Would you ilke to host a workshop?'
%p.help=_'registration.questions.workshop.help','Did you have an idea for a workshop that you\d like to help run? If so, we\'ll ask some follow-up questions on the following page.'
.columns.medium-8.medium-offset-2.end .columns.medium-8.medium-offset-2.end
= select_tag :is_workshop_host, options_for_select({(_'Yes') => 1, (_'No') => 0}, session[:registration][:is_workshop_host] || 0) = select_tag :is_workshop_host, options_for_select({(_'Yes') => 1, (_'No') => 0}, session[:registration][:is_workshop_host] || 0)
.columns.medium-offset-1.end .columns.medium-offset-1.end

27
app/views/conferences/_register_thanks.html.haml

@ -1,6 +1,25 @@
%h3=_'registration.thanks.title','Thanks for submitting your registration' - if @registration && @registration.complete
.columns.medium-offset-1.end - city = @conference.organizations.first.locations.first.city
%h4=_'registration.thanks.remember_to_confirm','Remember to confirm your registration upon receiving the confirmation email' %h3=_'registration.thanks.complete.title','Thanks for completing your registration'
%p.help .columns
- if !@registration.is_participant
%p=_'registration.thanks.all_done.volunteer','Thanks for submitting your volunteer infomation. We\'ll see you at Bike!Bike!'
- elsif @registration.payment_info.nil?
%p=_'registration.thanks.all_done.please_pay',"Thank you for completing your registration. We'll see you at Bike!Bike! If you have not already done so, we ask that you pay the registration donation as soon as you can."
= form_tag ("#{@conference.url}/register/pay-registration/#{@registration.confirmation_token}/").gsub(/\/\/+/, '/'), :method => :post, :class => 'row' do
= hidden_field_tag :confirmation_token, @registration.confirmation_token
.columns.small-4.small-offset-2
= number_field_tag :payment_amount, 25.00, :step => 0.01, :min => 0.01
.columns.small-4.end
= form_actions :submit_payment
- else
%p=_'registration.thanks.all_done.paid',"You're all done and paid up! We'll see you in #{city}.", vars: {:city => city}
%p=_'register.email.registration_confirmed.info',"We'll have housing, loaner bikes, and food arranged for your arrival. If you have any other questions or concerns, please email bikebike2014columbus@gmail.com."
%p=_'register.email.registration_confirmed.contact',"For urgent/emergency matters, you can reach our Outreach Coordinator, Reda, at 503-984-9191 or Jason at 614-364-3636."
- else
%h3=_'registration.thanks.title','Thanks for submitting your registration'
.columns
%h4=_'registration.thanks.remember_to_confirm','Remember to confirm your registration upon receiving the confirmation email. If you need it to be resent, just press the button below.'
%p.help
=_'registration.thanks.remember_to_confirm.help','If you experience any technical issues, please contact Godwin directly at' =_'registration.thanks.remember_to_confirm.help','If you experience any technical issues, please contact Godwin directly at'
%a{href: 'mailto:goodgodwin@hotmail.com'}='goodgodwin@hotmail.com' %a{href: 'mailto:goodgodwin@hotmail.com'}='goodgodwin@hotmail.com'

16
app/views/conferences/_register_volunteer_questions.html.haml

@ -6,25 +6,31 @@
= text_field_tag '[volunteer_questions][address]', session[:registration][:volunteer_questions][:address] = text_field_tag '[volunteer_questions][address]', session[:registration][:volunteer_questions][:address]
= text_field_tag '[volunteer_questions][phone_number]', session[:registration][:volunteer_questions][:phone_number] = text_field_tag '[volunteer_questions][phone_number]', session[:registration][:volunteer_questions][:phone_number]
-#.columns.medium-offset-1.end
-# %h4=_'registration.volunteer_questions.has_kitchen','Do have a kitchen / cook space to offer?'
-#.columns.medium-8.medium-offset-2.end
-# = select_tag '[volunteer_questions][has_kitchen]', options_for_select({(_'Yes') => 1, (_'No') => 0}, session[:registration][:volunteer_questions][:has_kitchen] || 0)
.columns.medium-offset-1.end .columns.medium-offset-1.end
%h4=_'registration.volunteer_questions.has_kitchen','Do have a kitchen / cook space to offer?' %h4=_'registration.volunteer_questions.tasks.title','How can you help out?'
.columns.medium-8.medium-offset-2.end .columns.medium-8.medium-offset-2.end
= select_tag '[volunteer_questions][has_kitchen]', options_for_select({(_'Yes') => 1, (_'No') => 0}, session[:registration][:volunteer_questions][:has_kitchen] || 0) - session[:registration][:volunteer_questions][:tasks] ||= Hash.new
= check_box_tag '[volunteer_questions][tasks][cooking]', session[:registration][:volunteer_questions][:tasks][:cooking]
= check_box_tag '[volunteer_questions][tasks][manual_labour]', session[:registration][:volunteer_questions][:tasks][:manual_labour]
.columns.medium-offset-1.end .columns.medium-offset-1.end
%h4=_'registration.volunteer_questions.has_housing','Do you have housing to offer for out of town attendees?' %h4=_'registration.volunteer_questions.has_housing','Do you have housing to offer for out of town attendees?'
.columns.medium-offset-2.medium-5 .columns.medium-offset-2.medium-5
%h5=_'registration.volunteer_questions.beds','Spare Beds:' %h5=_'registration.volunteer_questions.beds','Spare Beds:'
.columns.medium-3.end .columns.medium-3.end
= number_field_tag '[volunteer_questions][beds]', session[:registration][:volunteer_questions][:beds] || 0, :label => false = number_field_tag '[volunteer_questions][beds]', session[:registration][:volunteer_questions][:beds] || 0, :label => false, min: 0
.columns.medium-offset-2.medium-5 .columns.medium-offset-2.medium-5
%h5=_'registration.volunteer_questions.couch_space','Number you can accomodate on couches/floor space:' %h5=_'registration.volunteer_questions.couch_space','Number you can accomodate on couches/floor space:'
.columns.medium-3.end .columns.medium-3.end
= number_field_tag '[volunteer_questions][beds]', session[:registration][:volunteer_questions][:couch_space] || 0, :label => false = number_field_tag '[volunteer_questions][couch_space]', session[:registration][:volunteer_questions][:couch_space] || 0, :label => false, min: 0
.columns.medium-offset-2.medium-5 .columns.medium-offset-2.medium-5
%h5=_'registration.volunteer_questions.tents','Estimated number of tests you\'d be willing to have in your yard:' %h5=_'registration.volunteer_questions.tents','Estimated number of tests you\'d be willing to have in your yard:'
.columns.medium-3.end .columns.medium-3.end
= number_field_tag '[volunteer_questions][tents]', session[:registration][:volunteer_questions][:tents] || 0, :label => false = number_field_tag '[volunteer_questions][tents]', session[:registration][:volunteer_questions][:tents] || 0, :label => false, min: 0
.columns.medium-offset-1.end .columns.medium-offset-1.end
%h4=_'registration.volunteer_questions.other','Anything else you\'d like to tell us?' %h4=_'registration.volunteer_questions.other','Anything else you\'d like to tell us?'
.columns.medium-8.medium-offset-2.end .columns.medium-8.medium-offset-2.end

7
app/views/conferences/show.html.haml

@ -4,15 +4,12 @@
- title @conference.title - title @conference.title
- description "#{@conference.title} conference in #{location_name} for DIY bicycle collectives, co-ops, and advocacy groups" - description "#{@conference.title} conference in #{location_name} for DIY bicycle collectives, co-ops, and advocacy groups"
= render 'header' = render 'header'
=# tabs!
%article.row %article.row
.columns.large-10 .columns.large-10
- if @register_step - if @register_step
%h2='Register!' %h2='Conference Registration'
- if @actions - if @actions
= form_tag (@conference.url + '/register/').gsub(/\/\/+/, '/'), :method => :post do = form_tag (@conference.url + '/register/').gsub(/\/\/+/, '/'), :method => :post, :multipart => @multipart do
= hidden_field_tag :step, @register_step = hidden_field_tag :step, @register_step
- if @error_message - if @error_message
.columns.medium-8.medium-centered .columns.medium-8.medium-centered

9
app/views/layouts/application.html.haml

@ -36,6 +36,15 @@
- if content_for?(:side_bar) - if content_for?(:side_bar)
%aside#side-bar %aside#side-bar
= yield :side_bar = yield :side_bar
%form{action: 'https://www.paypal.com/cgi-bin/webscr', method: 'post', target: '_top'}
%input{type: 'hidden', name: 'cmd', value: '_donations'}
%input{type: 'hidden', name: 'business', value: 'info@thirdhand.org'}
%input{type: 'hidden', name: 'lc', value: 'US'}
%input{type: 'hidden', name: 'item_name', value: 'Bike!Bike!'}
%input{type: 'hidden', name: 'no_note', value: '0'}
%input{type: 'hidden', name: 'currency_code', value: 'USD'}
%button{type: 'submit', value: 'PP-DonationsBF:paypal_logo.png:NonHostedGuest'}=_'donate.button_label','Make a Donation!'
- if has_content? - if has_content?
#content=yield #content=yield
- else - else

76
app/views/layouts/user_mailer.html.haml

@ -0,0 +1,76 @@
!!! Strict
%html{xmlns: "http://www.w3.org/1999/xhtml"}
%head
%meta{content: "text/html; charset=utf-8", "http-equiv" => "Content-Type"}/
%meta{content: "width=device-width, initial-scale=1.0", name: "viewport"}/
%title Your Message Subject or Title
:css
#outlook a {padding:0;}
body{width:100% !important; -webkit-text-size-adjust:100%; -ms-text-size-adjust:100%; margin:0; padding:0;}
.ExternalClass {width:100%;}
.ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div {line-height: 100%;}
#backgroundTable {margin:0; padding:0; width:100% !important; line-height: 100% !important;}
img {outline:none; text-decoration:none; -ms-interpolation-mode: bicubic;}
a img {border:none;}
.image_fix {display:block;}
p {margin: 1em 0;text-align:left;font-size: 1.25em}
h1, h2, h3, h4, h5, h6 {color: black !important;margin-bottom: 1.5em;line-height:1.5em}
h2 {text-align:left;font-size:1.3em;}
h1 a, h2 a, h3 a, h4 a, h5 a, h6 a {color: white !important;margin-bottom:1em}
h1 a:active, h2 a:active, h3 a:active, h4 a:active, h5 a:active, h6 a:active {color: white !important;}
h1 a:visited, h2 a:visited, h3 a:visited, h4 a:visited, h5 a:visited, h6 a:visited {color: white !important;}
table td {border-collapse: collapse;}
table { border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt; }
a {color: #00ADEF;}
@media only screen and (max-device-width: 480px) {
a[href^="tel"], a[href^="sms"] {
text-decoration: none;
color: #00ADEF;
pointer-events: none;
cursor: default;
}
.mobile_link a[href^="tel"], .mobile_link a[href^="sms"] {
text-decoration: default;
color: #00ADEF !important;
pointer-events: auto;
cursor: default;
}
}
@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) {
a[href^="tel"], a[href^="sms"] {
text-decoration: none;
color: blue; /* or whatever your want */
pointer-events: none;
cursor: default;
}
.mobile_link a[href^="tel"], .mobile_link a[href^="sms"] {
text-decoration: default;
color: #00ADEF !important;
pointer-events: auto;
cursor: default;
}
}
@media only screen and (-webkit-min-device-pixel-ratio: 2) {}
@media only screen and (-webkit-device-pixel-ratio:.75){}
@media only screen and (-webkit-device-pixel-ratio:1){}
@media only screen and (-webkit-device-pixel-ratio:1.5){}
/[if IEMobile 7]
<style type="text/css">
</style>
/[if gte mso 9]
<style>
\/* Target Outlook 2007 and 2010 */
</style>
%body
%table#backgroundTable{border: "0", cellpadding: "0", cellspacing: "0"}
%tr
%td
%div{style:'width:100%;background-color:#00ADEF;padding: 25px 0 200px;text-align: center;'}
%div{style:'max-width:600px;border:3px solid #00ADEF;margin:25px auto;background-color:#FFF;display:inline-block;width:75%;'}
= yield
%div{style: 'text-align:center;padding-bottom:25px'}
%a{href: "#{@url}"}
2014 Bike!Bike!

5
app/views/layouts/user_mailer.text.haml

@ -0,0 +1,5 @@
='========== Bike!Bike! =========='
= yield
="===== #{@url} ======"

10
app/views/pages/404.html.haml

@ -1 +1,9 @@
404!d - page_title = _'error.404.page_title.This_Page_Does_Not_Exist'
- title page_title
- banner_title page_title
.row
%h1
=_'error.404.title','This page does not exist!'
%p
=_'error.404.description', :p

9
app/views/pages/language_not_enabled.html.haml

@ -0,0 +1,9 @@
- page_title = _'error.no_lang.page_title.Language_not_enabled'
- title page_title
- banner_title page_title
.row
%h1
=(_ 'language_not_yet_translated', vars: {:language => (_ ('languages.' + @lang))})
%p
=_'error.no_lang.description', :p

6
app/views/pages/permission_denied.html.haml

@ -1,9 +1,9 @@
- page_title = _'error.title.Permission_Denied' - page_title = _'error.403.page_title.Permission_Denied'
- title page_title - title page_title
- banner_title page_title - banner_title page_title
.row .row
%h1 %h1
='This page is inaccessible to you' =_'error.403.title','This page is inaccessible to you'
%p %p
=_'error.desc.permission_denied', :p =_'error.403.description', :p

6
app/views/pages/translation_list.html.haml

@ -12,11 +12,11 @@
- if code && @completeness.has_key?(code.to_s) - if code && @completeness.has_key?(code.to_s)
%li.text-center %li.text-center
- completeness = @completeness[code.to_s] - completeness = @completeness[code.to_s]
- percent = @total_translations ? ((completeness / @total_translations.to_f) * 100).to_i : 0 -# percent = @total_translations ? ((completeness / @total_translations.to_f) * 100).to_i : 0
%a{:href => "/translations/#{code}/", :class => (percent > 99 ? 'complete' : percent > 67 ? 'needs-work' : nil)} %a{:href => "/translations/#{code}/", :class => (completeness > 99 ? 'complete' : completeness > 67 ? 'needs-work' : nil)}
%h3=_"languages.#{code}" %h3=_"languages.#{code}"
.completeness .completeness
= "#{completeness} / #{@total_translations} (#{percent}%)" = "#{completeness} / #{@total_translations} (#{completeness}%)"
%h2= _ 'languages.inactive' %h2= _ 'languages.inactive'
%ul.languages.inactive.small-block-grid-1.medium-block-grid-3.large-block-grid-4.grid.links %ul.languages.inactive.small-block-grid-1.medium-block-grid-3.large-block-grid-4.grid.links
- @language_codes.each do |code| - @language_codes.each do |code|

11
app/views/pages/translations.html.haml

@ -11,10 +11,10 @@
%th.key=_'translations.Pages' %th.key=_'translations.Pages'
%th.key=_'translations.Value' %th.key=_'translations.Value'
- @translations.sort{| a1, a2 | a1[0].downcase <=> a2[0].downcase}.each do |k,translation| - @translations.sort{| a1, a2 | a1[0].downcase <=> a2[0].downcase}.each do |k,translation|
- current_translation = Translation.locale(@lang.to_sym).lookup(k)#[0].value #_ translation[0], :strict, locale: @lang.to_sym - current_translation = Translation.locale(@lang.to_sym).lookup(k)
- current_translation = current_translation.size() > 0 ? current_translation = current_translation[0].value : nil - current_translation = current_translation.size() > 0 ? current_translation = current_translation[0].value : nil
- cached = (translation['languages'] && translation['languages'].include?(@lang)) - cached = (translation && translation['languages'] && translation['languages'].include?(@lang))
- vars = translation.has_key?('vars') && translation['vars'].size() > 0 ? translation['vars'] : nil - vars = translation && translation.has_key?('vars') && translation['vars'].size() > 0 ? translation['vars'] : nil
- (vars && vars.include?(:count) ? I18n.backend.get_pluralization_rules(@lang) : [nil]).each do |pluralization| - (vars && vars.include?(:count) ? I18n.backend.get_pluralization_rules(@lang) : [nil]).each do |pluralization|
- key = k + (pluralization ? ".#{pluralization.to_s}" : '') - key = k + (pluralization ? ".#{pluralization.to_s}" : '')
%tr{:class => current_translation ? 'exists' : 'not-exists', :data => {:key => key}} %tr{:class => current_translation ? 'exists' : 'not-exists', :data => {:key => key}}
@ -28,6 +28,7 @@
%li=v %li=v
%td.pages %td.pages
%ul %ul
- if translation
- translation['pages'].each do |page| - translation['pages'].each do |page|
%li %li
%a{:href => page}=page %a{:href => page}=page
@ -43,5 +44,5 @@
- unless current_translation - unless current_translation
%a{:href => '#', :class => 'auto-translate button small'}='Auto' %a{:href => '#', :class => 'auto-translate button small'}='Auto'
-# content_for :footer_scripts - content_for :footer_scripts do
= javascript_include_tag 'translations' = javascript_include_tag 'translations'

10
app/views/user_mailer/conference_registration_confirmed_email.html.haml

@ -0,0 +1,10 @@
%img{src: "#{@url}/#{@conference.poster.full.url}", style: "max-width: 100%;"}
%div{style: 'padding: 25px'}
%h1=_'register.email.registration_confirmed.thank_you',"Hi #{@data[:user][:username]}, thank you for completing your registration. We'll see you at Bike!Bike!"
%h2=_'register.email.registration_confirmed.please_pay',"If you have not already done so, we ask that you pay the registration donation as soon as you can. At your convenience please visit the link below."
%div{style: 'text-align:center'}
%h1{style: 'background-color:#F11845;text-align:center;display:inline-block;padding: 5px 20px 10px;'}
%a{href: @confirmation_url, style: 'color:#FFF;text-decoration:none;'}
=_'register.email.registration_confirmed.pay_now',"Pay Registration Fees"
%p=(_'register.email.registration_confirmed.info',"We'll have housing, loaner bikes, and food arranged for your arrival. If you have any other questions or concerns, please email bikebike2014columbus@gmail.com").gsub(/(\w+@\w+\.\w{2,3})/, '<a href="mailto:\1">\1</a>').html_safe
%p=_'register.email.registration_confirmed.contact',"For urgent/emergency matters, you can reach our Outreach Coordinator, Reda, at 503-984-9191 or Jason at 614-364-3636."

9
app/views/user_mailer/conference_registration_confirmed_email.text.haml

@ -0,0 +1,9 @@
=_'register.email.registration_confirmed.thank_you',"Hi #{@data[:user][:username]}, thank you for completing your registration. We'll see you at Bike!Bike!"
=_'register.email.registration_confirmed.please_pay',"If you have not already done so, we ask that you pay the registration donation as soon as you can. At your convenience please visit the link below."
= @confirmation_url
=_'register.email.registration_confirmed.info',"We'll have housing, loaner bikes, and food arranged for your arrival. If you have any other questions or concerns, please email bikebike2014columbus@gmail.com."
=_'register.email.registration_confirmed.contact',"For urgent/emergency matters, you can reach our Outreach Coordinator, Reda, at 503-984-9191 or Jason at 614-364-3636."

7
app/views/user_mailer/conference_registration_email.html.haml

@ -0,0 +1,7 @@
%img{src: "#{@url}/#{@conference.poster.full.url}", style: "max-width: 100%;"}
%div{style: 'padding: 25px'}
%h1=_'register.email.registration.please_confirm',"Hi #{@data[:user][:username]}, please confirm your registration for #{@conference.title}", vars: {:username => @data[:user][:username]}
%div{style: 'text-align:center'}
%h1{style: 'background-color:#F11845;text-align:center;display:inline-block;padding: 5px 20px 10px;'}
%a{href: @confirmation_url, style: 'color:#FFF;text-decoration:none;'}
=_'register.email.registration.confirm_button',"Yes I'm Really Coming!"

2
app/views/user_mailer/conference_registration_email.text.haml

@ -1 +1 @@
= @data.to_json.to_s =_('register.email.registration.please_confirm',"Hi #{@data[:user][:username]}, please confirm your registration for #{@conference.title}", vars: {:username => @data[:user][:username]}) + ": #{@confirmation_url}"

1
config/application.rb

@ -26,6 +26,7 @@ module BikeBike
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
config.i18n.default_locale = :en #:de config.i18n.default_locale = :en #:de
config.i18n.enforce_available_locales = false config.i18n.enforce_available_locales = false
self.paths['config/database'] = Rails.root.parent.join("secure/database.yml").to_s
# config.action_controller.default_url_options = { :trailing_slash => true } # config.action_controller.default_url_options = { :trailing_slash => true }
#config.middleware.swap 'Rack::MethodOverride', 'Rack::MethodOverrideWithParams' #config.middleware.swap 'Rack::MethodOverride', 'Rack::MethodOverrideWithParams'
#config.i18n.exception_handler = I18n::MissingTranslationExceptionHandler.new #config.i18n.exception_handler = I18n::MissingTranslationExceptionHandler.new

2
config/environments/development.rb

@ -54,4 +54,6 @@ BikeBike::Application.configure do
#PerfTools::CpuProfiler.start('/tmp/dev_prof') #PerfTools::CpuProfiler.start('/tmp/dev_prof')
config.serve_static_assets = true config.serve_static_assets = true
#config.assets.precompile = false #config.assets.precompile = false
Paypal.sandbox!
#Paypal.sandbox = false
end end

1
config/environments/test.rb

@ -34,4 +34,5 @@ BikeBike::Application.configure do
# Print deprecation notices to the stderr. # Print deprecation notices to the stderr.
config.active_support.deprecation = :stderr config.active_support.deprecation = :stderr
Paypal.sandbox!
end end

71
config/initializers/i18n.rb

@ -48,7 +48,8 @@ module I18n
end end
return self.lorem_ipsum(behavior, behavior_size) return self.lorem_ipsum(behavior, behavior_size)
end end
key.to_s.gsub(/^world\..*\.(.+)\.name$/, '\1').gsub(/^.*\.(.+)?$/, '\1').gsub('_', ' ') #key.to_s.gsub(/^world\..*\.(.+)\.name$/, '\1').gsub(/^.*\.(.+)?$/, '\1').gsub('_', ' ')
key.to_s.gsub(/^world\.(.+)\.name$/, '\1').gsub(/^.*\.(.+)?$/, '\1').gsub('_', ' ')
end end
def call(exception, locale, key, options) def call(exception, locale, key, options)
@ -68,6 +69,21 @@ module I18n
@@translation_cache_file = 'config/locales/.translation-cache.yml' @@translation_cache_file = 'config/locales/.translation-cache.yml'
@@pluralization_rules_file = 'config/locales/pluralization-rules.yml' @@pluralization_rules_file = 'config/locales/pluralization-rules.yml'
@@translation_cache @@translation_cache
@@testing_started = false
@@hosts
def self.init_tests!(new_translations = nil)
if Rails.env.test?
if !@@testing_started
@@testing_started = true
File.open(@@translations_file, 'w+')
File.open(@@translation_cache_file, 'w+')
end
if !new_translations.nil?
record_translation(new_translations)
end
end
end
def needs_translation(key) def needs_translation(key)
@@needs_translation ||= Array.new @@needs_translation ||= Array.new
@ -90,12 +106,9 @@ module I18n
end end
def initialize def initialize
if Rails.env.test? || !File.exist?(@@translation_cache_file) if !File.exist?(@@translation_cache_file)
File.open(@@translation_cache_file, 'w+') File.open(@@translation_cache_file, 'w+')
end end
if Rails.env.test?
File.open(@@translations_file, 'w+')
end
@@translation_cache = YAML.load(File.read(@@translation_cache_file)) || Hash.new @@translation_cache = YAML.load(File.read(@@translation_cache_file)) || Hash.new
super super
end end
@ -105,8 +118,6 @@ module I18n
YAML.load_file(@@translations_file) || {} YAML.load_file(@@translations_file) || {}
rescue Exception => e rescue Exception => e
# sometimes concurrency issues cause an exception during testing # sometimes concurrency issues cause an exception during testing
puts e.class
x
sleep(1/2.0) sleep(1/2.0)
get_translation_info() get_translation_info()
end end
@ -121,6 +132,30 @@ module I18n
YAML.load_file(@@pluralization_rules_file).keys YAML.load_file(@@pluralization_rules_file).keys
end end
def set_locale(host)
@@hosts ||= Hash.new
default = I18n.default_locale.to_s
lang = @@hosts[host]
if lang === false
lang = nil
elsif lang.nil?
if (lang = host.gsub(/^(dev|test|www)[\-\.](.*)$/, '\2').gsub(/^(([^\.]+)\.)?[^\.]+\.[^\.]+$/, '\2')).blank?
lang = default
end
if get_language_codes().include? lang
if !language_enabled? lang
I18n.locale = default
return lang
end
else
lang = nil
end
end
I18n.locale = default unless lang.present?
# return nil if the language doesn exist, false if it is not enabled, or the code if it is enabled
lang.present? ? true : false
end
def get_language_completion(lang) def get_language_completion(lang)
total = 0 total = 0
complete = 0 complete = 0
@ -128,7 +163,11 @@ module I18n
total += 1 total += 1
complete += v['languages'].include?(lang.to_s) ? 1 : 0 complete += v['languages'].include?(lang.to_s) ? 1 : 0
} }
total ? complete / total : 0 (total ? complete / total.to_f : 0.0) * 100.0
end
def language_enabled?(lang)
lang.to_s == I18n.default_locale.to_s || get_language_completion(lang) > 66
end end
def request_translation(key, vars, options) def request_translation(key, vars, options)
@ -142,10 +181,26 @@ module I18n
return result return result
end end
def record_translation(key)
translations = get_translation_info()
translations ||= Hash.new
if key.is_a(Array)
key.each { |k| translations[k.to_s] ||= Hash.new }
else
translations[key.to_s] ||= Hash.new
end
File.open(@@translations_file, 'w') { |f| f.write translations.to_yaml }
end
protected protected
def lookup(locale, key, scope = [], options = {}) def lookup(locale, key, scope = [], options = {})
result = nil result = nil
if key.is_a?(String)
key = key.gsub(/(^\[|\])/, '').gsub(/\[/, '.')
end
if @@translation_cache && @@translation_cache.has_key?(locale.to_s) && @@translation_cache[locale.to_s].has_key?(key.to_s) if @@translation_cache && @@translation_cache.has_key?(locale.to_s) && @@translation_cache[locale.to_s].has_key?(key.to_s)
result = @@translation_cache[locale.to_s][key.to_s] result = @@translation_cache[locale.to_s][key.to_s]
end end

423
config/locales/translation-info.yml

@ -1,31 +1,430 @@
--- ---
nola_2013.about: world.ca.ns.name:
languages:
- en
pages:
- "/"
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":1489,"locale":"en","key":"world.ca.ns.name","value":"Nova Scotia","interpolations":[],"is_proc":false,"created_at":"2014-05-04T05:27:57.814Z","updated_at":"2014-05-04T05:27:57.821Z"}'
time.formats.date:
languages:
- en
pages:
- "/"
data:
- '{"id":1618,"locale":"en","key":"time.formats.date","value":"%B %d, %Y","interpolations":[],"is_proc":false,"created_at":null,"updated_at":null}'
date.month_names:
languages:
- en
pages:
- "/"
data:
- '{"id":1620,"locale":"en","key":"date.month_names","value":["~","January","February","March","April","May","June","July","August","September","October","November","December"],"interpolations":[],"is_proc":true,"created_at":"2014-07-06T19:53:45.689Z","updated_at":"2014-07-06T19:53:45.689Z"}'
conference.More_Info:
languages:
- en
pages:
- "/"
data:
- '{"id":92004,"locale":"en","key":"conference.More_Info","value":"More Info","interpolations":[],"is_proc":false,"created_at":"2014-07-22T00:04:56.683Z","updated_at":"2014-07-22T00:04:56.696Z"}'
Conferences:
languages:
- de
- en
pages:
- "/"
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":1503,"locale":"de","key":"Conferences","value":"Konferenzen","interpolations":[],"is_proc":false,"created_at":"2014-05-04T14:27:46.772Z","updated_at":"2014-05-04T14:27:46.789Z"}'
- '{"id":1481,"locale":"en","key":"Conferences","value":"Conferences","interpolations":[],"is_proc":false,"created_at":"2014-05-04T05:05:06.760Z","updated_at":"2014-05-04T05:26:07.021Z"}'
Organizations:
languages:
- en
- de
pages:
- "/"
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":1482,"locale":"en","key":"Organizations","value":"Organizations","interpolations":[],"is_proc":false,"created_at":"2014-05-04T05:05:46.445Z","updated_at":"2014-07-21T01:51:57.345Z"}'
- '{"id":1505,"locale":"de","key":"Organizations","value":"Organisationen","interpolations":[],"is_proc":false,"created_at":"2014-05-04T14:29:44.542Z","updated_at":"2014-05-04T14:29:44.557Z"}'
Resources:
languages:
- en
- de
pages:
- "/"
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":1483,"locale":"en","key":"Resources","value":"Resources","interpolations":[],"is_proc":false,"created_at":"2014-05-04T05:05:50.964Z","updated_at":"2014-05-04T05:25:53.510Z"}'
- '{"id":1506,"locale":"de","key":"Resources","value":"Ressourcen","interpolations":[],"is_proc":false,"created_at":"2014-05-04T14:36:08.331Z","updated_at":"2014-05-04T14:36:08.438Z"}'
donate.button_label:
languages: [] languages: []
pages: pages:
- / - "/"
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: [] data: []
home.its_awesome: conference.Register_Now:
languages:
- en
pages:
- "/"
data:
- '{"id":92005,"locale":"en","key":"conference.Register_Now","value":"Register Now","interpolations":[],"is_proc":false,"created_at":"2014-07-22T00:05:01.141Z","updated_at":"2014-07-22T00:05:01.155Z"}'
form.placeholder.Enter_your_step:
languages:
- en
pages:
- "/"
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":91970,"locale":"en","key":"form.placeholder.Enter_your_step","value":"NIL","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:48:28.017Z","updated_at":"2014-07-21T01:48:28.028Z"}'
form.placeholder.Enter_your_email:
languages:
- en
pages:
- "/"
data:
- '{"id":91961,"locale":"en","key":"form.placeholder.Enter_your_email","value":"someone@example.com","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:39:53.873Z","updated_at":"2014-07-21T02:17:18.066Z"}'
form.label.email:
languages:
- en
pages:
- "/"
data:
- '{"id":91944,"locale":"en","key":"form.label.email","value":"Email","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:33:11.129Z","updated_at":"2014-07-21T01:33:11.140Z"}'
register:
languages:
- en
pages:
- "/"
data:
- '{"id":91980,"locale":"en","key":"register","value":"Register","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:52:22.219Z","updated_at":"2014-07-21T01:52:22.261Z"}'
- '{"id":92009,"locale":"en","key":"register.new_organization.no_city_error","value":"Please
enter your organization''s city","interpolations":[],"is_proc":false,"created_at":"2014-07-22T00:08:55.720Z","updated_at":"2014-07-22T00:08:55.758Z"}'
- '{"id":92010,"locale":"en","key":"register.new_organization.no_street_error","value":"Please
enter your organization''s street address","interpolations":[],"is_proc":false,"created_at":"2014-07-22T00:09:13.603Z","updated_at":"2014-07-22T00:09:13.616Z"}'
- '{"id":92012,"locale":"en","key":"register.organizations.confirm_thanks.is_not_workshop_host.help","value":"","interpolations":[],"is_proc":false,"created_at":"2014-07-22T00:10:09.190Z","updated_at":"2014-07-22T00:10:09.203Z"}'
- '{"id":92013,"locale":"en","key":"register.organizations.confirm_thanks.title","value":"","interpolations":[],"is_proc":false,"created_at":"2014-07-22T00:10:13.343Z","updated_at":"2014-07-22T00:10:13.355Z"}'
- '{"id":92011,"locale":"en","key":"register.new_organization.same_email_as_attendee_error","value":"This
email needs to be different than your own personal email, we need to keep in touch
with your organization even if you''re gone in years to come.","interpolations":[],"is_proc":false,"created_at":"2014-07-22T00:09:49.895Z","updated_at":"2014-07-22T00:11:24.105Z"}'
- '{"id":92008,"locale":"en","key":"register.new_organization.no_name_error","value":"Please
tell us your organization''s name","interpolations":[],"is_proc":false,"created_at":"2014-07-22T00:06:48.248Z","updated_at":"2014-07-22T00:12:21.428Z"}'
world.ca.nb.name:
languages:
- en
pages:
- "/"
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":1487,"locale":"en","key":"world.ca.nb.name","value":"New Brunswick","interpolations":[],"is_proc":false,"created_at":"2014-05-04T05:27:41.999Z","updated_at":"2014-05-04T05:27:42.039Z"}'
form.placeholder.Enter_your_firstname:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":91962,"locale":"en","key":"form.placeholder.Enter_your_firstname","value":"Francis?
Frances? Phransiz?","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:40:00.075Z","updated_at":"2014-07-21T01:53:51.732Z"}'
form.label.firstname:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":91945,"locale":"en","key":"form.label.firstname","value":"First name","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:33:15.267Z","updated_at":"2014-07-21T01:33:15.278Z"}'
form.placeholder.Enter_your_lastname:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":91963,"locale":"en","key":"form.placeholder.Enter_your_lastname","value":"Smith?
Ng?","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:42:51.398Z","updated_at":"2014-07-21T01:42:51.409Z"}'
form.label.lastname:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":91948,"locale":"en","key":"form.label.lastname","value":"Last name","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:34:35.847Z","updated_at":"2014-07-21T01:34:35.859Z"}'
form.placeholder.Enter_your_username:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":91971,"locale":"en","key":"form.placeholder.Enter_your_username","value":"How
would you like to be known?","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:48:51.318Z","updated_at":"2014-07-21T01:48:56.170Z"}'
form.label.username:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":91955,"locale":"en","key":"form.label.username","value":"Preferred name","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:36:18.747Z","updated_at":"2014-07-21T01:36:18.758Z"}'
registration.primary.role_title:
languages: [] languages: []
pages: pages:
- / - "/conferences/:conference_type/:conference_slug/register(/:step)"
data: [] data: []
Conferences: form.label.is_participant:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":91946,"locale":"en","key":"form.label.is_participant","value":"A conference
participant","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:34:27.255Z","updated_at":"2014-07-21T01:34:27.267Z"}'
form.label.is_volunteer:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":91947,"locale":"en","key":"form.label.is_volunteer","value":"A volunteer","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:34:33.243Z","updated_at":"2014-07-21T01:34:33.255Z"}'
cancel:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":92003,"locale":"en","key":"cancel","value":"Cancel","interpolations":[],"is_proc":false,"created_at":"2014-07-22T00:04:53.461Z","updated_at":"2014-07-22T00:04:53.473Z"}'
next:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":91977,"locale":"en","key":"next","value":"next","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:51:54.465Z","updated_at":"2014-07-21T01:51:54.477Z"}'
registration.cancel.title:
languages: [] languages: []
pages: pages:
- / - "/conferences/:conference_type/:conference_slug/register(/:step)"
data: [] data: []
Organizations: registration.cancel.help:
languages: [] languages: []
pages: pages:
- / - "/conferences/:conference_type/:conference_slug/register(/:step)"
data: [] data: []
Resources: 'no':
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
'yes':
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
registration.cancelled.title:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
registration.cancelled.help:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
registration.questions.title:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
registration.questions.housing:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
registration.questions.housing.help:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
registration.questions.housing_extra.title:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
form.placeholder.Enter_your_.questions.housing_extra:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":91959,"locale":"en","key":"form.placeholder.Enter_your_.questions.housing_extra","value":"Preferences?
Concerns? Whatever.","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:39:27.543Z","updated_at":"2014-07-21T01:39:27.555Z"}'
registration.questions.loaner_bike:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
registration.questions.loaner_bike.help:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
registration.questions.workshop:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
registration.questions.workshop.help:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
'Yes':
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":91981,"locale":"en","key":"Yes","value":"Yes","interpolations":[],"is_proc":false,"created_at":"2014-07-21T02:03:02.555Z","updated_at":"2014-07-21T02:03:02.627Z"}'
'No':
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":91978,"locale":"en","key":"No","value":"No","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:51:55.944Z","updated_at":"2014-07-21T01:51:55.955Z"}'
registration.questions.other:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
form.placeholder.Enter_your_.questions.other:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":91960,"locale":"en","key":"form.placeholder.Enter_your_.questions.other","value":"Anything
else that we should know....","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:39:45.419Z","updated_at":"2014-07-21T01:39:45.431Z"}'
submit:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
register.email.registration.subject:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
vars:
- :conference_title
data: []
register.email.registration.please_confirm:
languages: [] languages: []
pages: pages:
- / - "/conferences/:conference_type/:conference_slug/register(/:step)"
vars:
- :username
data: [] data: []
Sign_In: register.email.registration.confirm_button:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
register.organizations.title:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
register.organizations.description:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
all_organizations:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":92002,"locale":"en","key":"all_organizations","value":"All organizations","interpolations":[],"is_proc":false,"created_at":"2014-07-22T00:04:45.086Z","updated_at":"2014-07-22T00:04:48.200Z"}'
world.ca.name:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":113,"locale":"en","key":"world.ca.name","value":"Canada","interpolations":[],"is_proc":false,"created_at":null,"updated_at":"2014-04-27T21:35:22.347Z"}'
orgnizations_filter.placeholder:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":91979,"locale":"en","key":"orgnizations_filter.placeholder","value":"Organization
name or location","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:52:13.721Z","updated_at":"2014-07-21T01:52:13.732Z"}'
my_organizations:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":91976,"locale":"en","key":"my_organizations","value":"My Organizations","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:51:51.454Z","updated_at":"2014-07-21T01:51:51.465Z"}'
form.label.add_new_org:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":91943,"locale":"en","key":"form.label.add_new_org","value":"My organization
isn''t listed here","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:33:04.823Z","updated_at":"2014-07-21T01:33:04.834Z"}'
form.label.no_org:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":91949,"locale":"en","key":"form.label.no_org","value":"I currently do not
belong to any organization","interpolations":[],"is_proc":false,"created_at":"2014-07-21T01:35:06.287Z","updated_at":"2014-07-21T01:35:06.299Z"}'
registration.thanks.title:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
registration.thanks.remember_to_confirm:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
registration.thanks.remember_to_confirm.help:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
resend_confirmation_email:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data: []
register.email.registration_confirmed.subject:
languages: []
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
vars:
- :conference_title
data: []
register.organizations.confirm_thanks.title:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":92013,"locale":"en","key":"register.organizations.confirm_thanks.title","value":"","interpolations":[],"is_proc":false,"created_at":"2014-07-22T00:10:13.343Z","updated_at":"2014-07-22T00:10:13.355Z"}'
register.organizations.confirm_thanks.is_not_workshop_host.help:
languages:
- en
pages:
- "/conferences/:conference_type/:conference_slug/register(/:step)"
data:
- '{"id":92012,"locale":"en","key":"register.organizations.confirm_thanks.is_not_workshop_host.help","value":"","interpolations":[],"is_proc":false,"created_at":"2014-07-22T00:10:09.190Z","updated_at":"2014-07-22T00:10:09.203Z"}'
register.organizations.confirm_thanks.payment_notice:
languages: [] languages: []
pages: pages:
- / - "/conferences/:conference_type/:conference_slug/register(/:step)"
data: [] data: []

4
config/routes.rb

@ -15,6 +15,10 @@ BikeBike::Application.routes.draw do
#get :register, :param => 'step' #get :register, :param => 'step'
#post 'register/next' => 'conferences#register_submit' #post 'register/next' => 'conferences#register_submit'
match 'register(/:step)' => 'conferences#register', via: [:get, :post] match 'register(/:step)' => 'conferences#register', via: [:get, :post]
get 'register/confirm/:confirmation_token' => 'conferences#register_confirm'
match 'register/pay-registration/:confirmation_token' => 'conferences#register_pay_registration', via: [:get, :post]
get 'register/confirm-payment/:confirmation_token' => 'conferences#register_confirm_payment'
get 'register/cancel-payment/:confirmation_token' => 'conferences#register_cancel_payment'
#patch 'register/step/:step' => 'conferences#register_step' #patch 'register/step/:step' => 'conferences#register_step'
#resources :registrations, :path => 'registration' do #resources :registrations, :path => 'registration' do
# get :form, on: :collection # get :form, on: :collection

5
db/migrate/20140719172749_add_email_to_conference_registrations.rb

@ -0,0 +1,5 @@
class AddEmailToConferenceRegistrations < ActiveRecord::Migration
def change
add_column :conference_registrations, :email, :string
end
end

5
db/migrate/20140719185914_add_is_complete_to_conference_registrations.rb

@ -0,0 +1,5 @@
class AddIsCompleteToConferenceRegistrations < ActiveRecord::Migration
def change
add_column :conference_registrations, :complete, :boolean
end
end

5
db/migrate/20140719204949_add_completed_to_conference_registrations.rb

@ -0,0 +1,5 @@
class AddCompletedToConferenceRegistrations < ActiveRecord::Migration
def change
add_column :conference_registrations, :completed, :boolean
end
end

5
db/migrate/20140723174550_add_payment_confirmation_token_to_conference_registration.rb

@ -0,0 +1,5 @@
class AddPaymentConfirmationTokenToConferenceRegistration < ActiveRecord::Migration
def change
add_column :conference_registrations, :payment_confirmation_token, :string
end
end

5
db/migrate/20140723174648_add_payment_info_to_conference_registration.rb

@ -0,0 +1,5 @@
class AddPaymentInfoToConferenceRegistration < ActiveRecord::Migration
def change
add_column :conference_registrations, :payment_info, :string
end
end

5
db/migrate/20140723182548_add_order_to_workshop_streams.rb

@ -0,0 +1,5 @@
class AddOrderToWorkshopStreams < ActiveRecord::Migration
def change
add_column :workshop_streams, :order, :integer
end
end

5
db/migrate/20140723183557_add_order_to_workshop_presentation_styles.rb

@ -0,0 +1,5 @@
class AddOrderToWorkshopPresentationStyles < ActiveRecord::Migration
def change
add_column :workshop_presentation_styles, :order, :integer
end
end

9
db/schema.rb

@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20140716002152) do ActiveRecord::Schema.define(version: 20140723183557) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@ -66,6 +66,11 @@ ActiveRecord::Schema.define(version: 20140716002152) do
t.boolean "is_volunteer" t.boolean "is_volunteer"
t.string "confirmation_token" t.string "confirmation_token"
t.binary "data" t.binary "data"
t.string "email"
t.boolean "complete"
t.boolean "completed"
t.string "payment_confirmation_token"
t.string "payment_info"
end end
create_table "conference_types", force: true do |t| create_table "conference_types", force: true do |t|
@ -267,6 +272,7 @@ ActiveRecord::Schema.define(version: 20140716002152) do
t.string "info" t.string "info"
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
t.integer "order"
end end
create_table "workshop_requested_resources", force: true do |t| create_table "workshop_requested_resources", force: true do |t|
@ -291,6 +297,7 @@ ActiveRecord::Schema.define(version: 20140716002152) do
t.string "info" t.string "info"
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
t.integer "order"
end end
create_table "workshops", force: true do |t| create_table "workshops", force: true do |t|

29
features/landing_page.feature

@ -1,9 +1,24 @@
Feature: Landing Page Feature: Landing Page
As a person interested in bikebike In order to learn about Bike!Bike!
I want to find out about the current bikebike As a visitor
In order to attend the conference
Scenario: Read landing page content Scenario: See a more info link
Given I am on the landing page Given There is an upcoming conference in Halifax NS
Then I can read about the current bikebike And I am on the landing page
And I can register for the conference Then I see the Bike!Bike! logo
And I see the Conferences menu item
And I see the Organizations menu item
And I see the Resources menu item
And I see Halifax
And I see More Info
Scenario: See a register link
Given There is an upcoming conference in Halifax NS
And Registration is open
And I am on the landing page
Then I see the Bike!Bike! logo
And I see the Conferences menu item
And I see the Organizations menu item
And I see the Resources menu item
And I see Halifax
And I see a Register Now link

0
features/organizations.feature

0
features/registration-two.feature

593
features/registration.feature

@ -0,0 +1,593 @@
Feature: Registration
In order to register for the latest Bike!Bike!
As a visitor
@javascript
Scenario: Register as participant with some second thoughts
Given There is an upcoming conference in Moncton NB
And Registration is open
And an organization named The Bike Bush exists in Musquodoboit Harbour NS
And an organization named Cool Cats Bikes exists in Sackville NB
When I go to the landing page
Then I see a Register Now link
And I click on the Register Now link
And I fill in my email with shout@me.com
And I press register
And I fill in my firstname with Joe
And I fill in my lastname with Smith
And I fill in my username with Joey
And I check is_participant
And I press cancel
Then I should see you will lose the infomation you have submitted
Then I press no
And I should see Attending as
And firstname should be set to Joe
And lastname should be set to Smith
And username should be set to Joey
And is_participant should be checked
And is_volunteer should not be checked
Then I press cancel
And press yes
Then I should see Your registration has been cancelled
@javascript
Scenario: Register as participant
Given There is an upcoming conference in Moncton NB
And Registration is open
And an organization named The Bike Bush exists in Musquodoboit Harbour NS
And an organization named Cool Cats Bikes exists in Sackville NB
When I go to the landing page
Then I see a Register Now link
And I click on the Register Now link
And I fill in my email with shout@me.com
And I press register
And I fill in my firstname with Joe
And I fill in my lastname with Smith
And I fill in my username with Joey
And I check is_participant
And I press next
And I see Do you require housing?
And I select couch from housing
And I fill in housing extra with I'm easy
And I see Do you want to borrow a bike?
And I select Yes, from loaner bike
And I see Would you like to host a workshop?
And I select No from workshop host
And I see Anything else
And I fill in other with Nope
And I should not be registered for the conference
And I press submit
Then I should be registered for the conference
But my registration should not be confirmed
And I should get a confirm email
And I should see Who do you Represent
But my registration is not complete
And my registration is not completed
Then I click on The Bike Bush
And press next
And my registration is completed
Then in the email I should see please confirm your registration
And in the email I should see a confirmation link registration
And I am not a user
When I go to the confirmation page
And I should see Thanks for completing your registration
And my registration is confirmed
And my registration is complete
And my registration is completed
And I am a user
And I am a member of The Bike Bush
@javascript
Scenario: Register as eager participant
Given There is an upcoming conference in Moncton NB
And Registration is open
And an organization named Cool Cats Bikes exists in Sackville NB
When I go to the landing page
Then I see a Register Now link
And I click on the Register Now link
And I fill in my email with goodgodwin@hotmail.com
And I press register
And I fill in my firstname with Michael
And I fill in my lastname with Godwin
And I fill in my username with Godwin
And I check is_participant
And I press next
And I see Do you require housing?
And I select bed from housing
And I fill in housing extra with I have a bad back
And I see Do you want to borrow a bike?
And I select large from loaner bike
And I see Would you like to host a workshop?
And I select No from workshop host
And I see Anything else
And I fill in other with I'm coming two months early
And I should not be registered for the conference
And I press submit
Then I should be registered for the conference
And my registration should not be confirmed
And I should get a confirm email
And in the email I should see please confirm your registration
And in the email I should see a confirmation link
And I see Who do you Represent
When I go to the confirmation page
Then I see Thanks for confirming
And I see Who do you Represent
And my registration is confirmed
But my registration is not complete
And my registration is not completed
Then I click on Cool Cats Bikes
And press next
Then I should see Thanks for completing your registration
And my registration is complete
And my registration is completed
But my registration is not paid
Then I should get a Thanks email
And in the email I should see pay the registration donation
And in the email I should see a pay registration link
When I go to the pay registration page
Then I see Thanks for completing your registration
And I see we ask that you pay
And I see payment amount
And I see submit payment
Then I fill in payment amount with 12.34
And press submit payment
Then I should see Your order summary
When I finish paying
Then I should see We'll see you in Moncton
And my registration is paid
@javascript
Scenario: Register as really eager participant
Given There is an upcoming conference in Moncton NB
And Registration is open
And an organization named Cool Cats Bikes exists in Sackville NB
When I go to the landing page
Then I see a Register Now link
And I click on the Register Now link
And I fill in my email with goodgodwin@hotmail.com
And I press register
And I fill in my firstname with Michael
And I fill in my lastname with Godwin
And I fill in my username with Godwin
And I check is_participant
And I press next
And I see Do you require housing?
And I select bed from housing
And I fill in housing extra with I have a bad back
And I see Do you want to borrow a bike?
And I select large from loaner bike
And I see Would you like to host a workshop?
And I select No from workshop host
And I see Anything else
And I fill in other with I'm coming two months early
And I should not be registered for the conference
And I press submit
Then I should be registered for the conference
And my registration should not be confirmed
And I should get a confirm email
And in the email I should see please confirm your registration
And in the email I should see a confirmation link
And I see Who do you Represent
When I go to the confirmation page
Then I see Thanks for confirming
And I see Who do you Represent
And my registration is confirmed
But my registration is not complete
And my registration is not completed
Then I click on Cool Cats Bikes
And press next
Then I should see Thanks for completing your registration
And my registration is complete
And my registration is completed
But my registration is not paid
Then I should get a Thanks email
And in the email I should see pay the registration donation
And in the email I should see a pay registration link
Then I should see Thanks for completing your registration
And I see we ask that you pay
And I see payment amount
And I see submit payment
Then I fill in payment amount with 12.34
And press submit payment
Then I should see Your order summary
When I finish paying
Then I should see We'll see you in Moncton
And my registration is paid
@javascript
Scenario: Register as eager with second thoughts
Given There is an upcoming conference in Moncton NB
And Registration is open
And an organization named Cool Cats Bikes exists in Sackville NB
When I go to the landing page
Then I see a Register Now link
And I click on the Register Now link
And I fill in my email with goodgodwin@hotmail.com
And I press register
And I fill in my firstname with Michael
And I fill in my lastname with Godwin
And I fill in my username with Godwin
And I check is_participant
And I press next
And I see Do you require housing?
And I select bed from housing
And I fill in housing extra with I have a bad back
And I see Do you want to borrow a bike?
And I select large from loaner bike
And I see Would you like to host a workshop?
And I select No from workshop host
And I see Anything else
And I fill in other with I'm coming two months early
And I should not be registered for the conference
And I press submit
Then I should be registered for the conference
And my registration should not be confirmed
And I should get a confirm email
And in the email I should see please confirm your registration
And in the email I should see a confirmation link
And I see Who do you Represent
When I go to the confirmation page
Then I see Thanks for confirming
And I see Who do you Represent
And my registration is confirmed
But my registration is not complete
And my registration is not completed
Then I click on Cool Cats Bikes
And press next
Then I should see Thanks for completing your registration
And my registration is complete
And my registration is completed
But my registration is not paid
Then I should get a Thanks email
And in the email I should see pay the registration donation
And in the email I should see a pay registration link
Then I should see Thanks for completing your registration
And I see we ask that you pay
And I see payment amount
And I see submit payment
Then I fill in payment amount with 12.34
And press submit payment
Then I should see Your order summary
When I cancel the payment
Then I should see Thanks for completing your registration
And I see we ask that you pay
And my registration is not paid
@javascript
Scenario: Register as workshop host
Given There is an upcoming conference in Moncton NB
And Registration is open
And an organization named The Bike Bush exists in Musquodoboit Harbour NS
And an organization named Cool Cats Bikes exists in Sackville NB
When I go to the landing page
Then I see a Register Now link
And I click on the Register Now link
And I fill in my email with scream@me.com
And I press register
And I fill in my firstname with Joe
And I fill in my lastname with Smith
And I fill in my username with Joey
And I check is_participant
And I press next
And I see Do you require housing?
And I select couch from housing
And I fill in housing extra with I'm easy
And I see Do you want to borrow a bike?
And I select Yes, from loaner bike
And I see Would you like to host a workshop?
And I select Yes from workshop host
And I see Anything else
And I fill in other with Nope
And I should not be registered for the conference
And I press submit
Then I should be registered for the conference
But my registration should not be confirmed
And I should get a confirm email
And I should see Who do you Represent
But my registration is not complete
And my registration is not completed
Then I click on The Bike Bush
And press next
Then I should see Workshop Information
Then I fill in title with How make your shop more Capitalist
Then I set info to Lorem Ipsum and Stuff
Then I select organization management from stream
Then I select presentation from presentation style
Then I fill in notes with Down with all the anarchists
Then press next
Then in the email I should see please confirm your registration
And in the email I should see a confirmation link registration
When I go to the confirmation page
And I should see Thanks for completing your registration
And my registration is confirmed
And my registration is complete
And my registration is completed
@javascript
Scenario: Register with new organization
Given There is an upcoming conference in Moncton NB
And Registration is open
And an organization named The Bike Bush exists in Musquodoboit Harbour NS
And an organization named Cool Cats Bikes exists in Sackville NB
When I go to the landing page
Then I see a Register Now link
And I click on the Register Now link
And I fill in my email with example@example.com
And I press register
And I fill in my firstname with Emma
And I fill in my lastname with Smith
And I fill in my username with Em
And I check is_participant
And I press next
And I see Do you require housing?
And I select couch from housing
And I fill in housing extra with I'm easy
And I see Do you want to borrow a bike?
And I select small from loaner bike
And I see Would you like to host a workshop?
And I select No from workshop host
And I see Anything else
And I fill in other with Nope
And I should not be registered for the conference
And I press submit
Then I should be registered for the conference
But my registration should not be confirmed
And I should get a confirm email
And I should see Who do you Represent
But my registration is not complete
And my registration is not completed
Then I check add new org
And I press next
Then I should see Your Organization Information
Then I fill in name with The Bike Fridge
Then I set info to Lorem Ipsum and Stuff
Then I fill in organization email with info@bikefridge.org
Then I fill in street with 1044 Mushaboom Road
Then I fill in city with Mushaboom
Then I select ca from country
Then I select ns from territory
Then press next
Then in the email I should see please confirm your registration
And in the email I should see a confirmation link registration
When I go to the confirmation page
And I should see Thanks for completing your registration
And my registration is confirmed
And my registration is complete
And my registration is completed
And I am a member of The Bike Fridge
@javascript
Scenario: Register with new organization in usa
Given There is an upcoming conference in Moncton NB
And Registration is open
And I am in San Francisco, California, USA
And an organization named The Bike Bush exists in Musquodoboit Harbour NS
And an organization named Cool Cats Bikes exists in Sackville NB
When I go to the landing page
Then I see a Register Now link
And I click on the Register Now link
And I fill in my email with example@example.com
And I press register
And I fill in my firstname with Emma
And I fill in my lastname with Smith
And I fill in my username with Em
And I check is_participant
And I press next
And I see Do you require housing?
And I select couch from housing
And I fill in housing extra with I'm easy
And I see Do you want to borrow a bike?
And I select small from loaner bike
And I see Would you like to host a workshop?
And I select No from workshop host
And I see Anything else
And I fill in other with Nope
And I should not be registered for the conference
And I press submit
Then I should be registered for the conference
But my registration should not be confirmed
And I should get a confirm email
And I should see Who do you Represent
But my registration is not complete
And my registration is not completed
Then I check add new org
And I press next
Then I should see Your Organization Information
Then I fill in name with The Bike Fridge
Then I set info to Lorem Ipsum and Stuff
Then I fill in organization email with info@bikefridge.org
Then I fill in street with 1044 Mushaboom Road
Then I fill in city with Mushaboom
Then I select us from country
Then I select ny from territory
Then press next
Then in the email I should see please confirm your registration
And in the email I should see a confirmation link registration
When I go to the confirmation page
And I should see Thanks for completing your registration
And my registration is confirmed
And my registration is complete
And my registration is completed
And I am a member of The Bike Fridge
@javascript
Scenario: Lazy participant
Given There is an upcoming conference in Moncton NB
And Registration is open
And an organization named The Bike Bush exists in Musquodoboit Harbour NS
And an organization named Cool Cats Bikes exists in Sackville NB
When I go to the landing page
Then I see a Register Now link
And I click on the Register Now link
And I fill in my email with example@example.com
And I press register
And I press next
But I see please tell us your name
Then I fill in my firstname with Emma
And I press next
But I see please tell us your name
Then I fill in my lastname with Smith
And I press next
But I see attending the conference or volunteering
Then I check is_participant
And I press next
Then I select Yes from workshop host
And press submit
Then I should be registered for the conference
But my registration should not be confirmed
And I should get a confirm email
And I should see Who do you Represent
But my registration is not complete
And my registration is not completed
Then I press next
But I see Please select an organization
Then I click on The Bike Bush
And press next
Then I should see Workshop Information
But press next
But I should see Please give your workshop a title
Then I fill in title with Why do I have to give all this info right now?
And press next
But I should see Please describe your workshop
Then I set info to Lorem Ipsum and Stuff
Then I select organization management from stream
And I select presentation from presentation style
And press next
Then I should see Thanks for submitting your registration
Then in the email I should see please confirm your registration
And in the email I should see a confirmation link registration
When I go to the confirmation page
And I should see Thanks for completing your registration
And my registration is confirmed
And my registration is complete
And my registration is completed
And I am a member of The Bike Bush
And My firstname should be Emma
And My lastname should be Smith
And My username should be Emma Smith

216
features/step_definitions/interface_steps.rb

@ -1,13 +1,215 @@
Given(/^I am on the (.+) page$/) do |page_name| Given(/^I am on the (.+) page$/) do |page_name|
visit path_to(page_name) visit path_to(page_name.to_sym)
end end
Then(/^I can read about the current bikebike$/) do Given(/^I am on the (.+) site$/) do |language|
within('#conference-name') { expect(page).to have_text 'Bike!Bike!' } ApplicationController::set_host (get_language_code(language) + '.bikebike.org')
within('#conference-location') { expect(page).to have_text 'Columbus, Ohio' }
within('#conference-date') { expect(page).to have_text 'August 30 - September 1' }
end end
Then(/^I can register for the conference$/) do Given(/^I am in (.+)$/) do |location|
expect(page).to have_link 'Register' ApplicationController::set_location (location)
end
When(/^I go to the (.+) page$/) do |page_name|
visit path_to(page_name.to_sym)
end
When(/^(I )?(finish|cancel) (paying|(the )?payment)$/) do |a, action, b, c|
visit path_to((action == 'finish' ? 'confirm' : action) + ' payment')
end
Given(/^There is an upcoming conference( in .+)?$/) do |location|
@last_conference = FactoryGirl.create(:upcoming_conference)
if location
@org = create_org(nil, location)
@last_conference.organizations << @org
@last_conference.save!
end
end
Given(/^an organization( named .+)? exists( in .+)?$/) do |name, location|
if location =~ /every country/i
Carmen::World.instance.subregions.each { |country|
#puts "#{country.code}"
if country.subregions?
country.subregions.each { |region|
org = Organization.new(name: rand(36**16).to_s(36), slug: rand(36**16).to_s(36))#create_org#(Forgery::LoremIpsum.sentence)
org.locations << Location.new(city: 'City', country: country.code, territory: region.code)
org.save!
}
else
org = Organization.new(name: rand(36**16).to_s(36), slug: rand(36**16).to_s(36))#create_org#(Forgery::LoremIpsum.sentence)
org.locations << Location.new(city: 'City', country: country.code)
org.save!
end
}
else
create_org(name ? name.gsub(/^\s*named\s+(.*?)\s*$/, '\1') : nil, location ? location.gsub(/^\s*in\s+(.*?)\s*$/, '\1') : nil)
end
end
Given(/^Registration is (open|closed)$/) do |status|
@last_conference.registration_open = (status == 'open')
@last_conference.save!
end
Then(/^I (should )?see (.+)$/) do | a, item |
if /(the )?Bike!Bike! logo$/ =~ item
expect(page).to have_selector('svg.logo')
elsif /(the|a)?\s?(.+) menu item$/ =~ item
within('#main-nav') { expect(page).to have_link Regexp.last_match(2) }
elsif /(the|a)?\s?(.+) image$/ =~ item
expect(page).to have_selector('#'+Regexp.last_match(2)+' img')
elsif /(the|a)?\s?(.+) link$/ =~ item
expect(page).to have_link Regexp.last_match(2)
else
expect(page).to have_text item
end
end
## ======= Forms ======= ##
Then(/^(I )?click on (.+?)( button| link| which is hidden)?$/) do | a, item, type |
item = item.gsub(/^\s*(a|the)\s*(.*)$/, '\2')
if type && type.strip == 'button'
click_button(item)
elsif type && type.strip == 'link'
click_link(item)
elsif type && type =~ /hidden/
find('[id$="' + item.gsub(/\s+/, '_') + '"]', :visible => false).click
else
page.find_link(item).trigger('click')
end
end
Then(/^(I )?press (.+)$/) do | a, item |
click_link_or_button(locate(item))
end
Then(/^I (un)?check (.+)$/) do | state, item |
if state == 'un'
uncheck(locate(item))
else
check(locate(item))
end
end
Then(/^I fill in (.+?) with (.+)$/) do | field, value |
field = field.gsub(/^\s*(my|the)\s*(.+)$/, '\2')
fill_in(locate(field), :with => value)
if /email/ =~ field && !(/organization/ =~ field)
@last_email_entered = value
end
end
Then(/^(my )?(.+)? should (not )?be set to (.+)$/) do | a, field, should, value |
field = field.gsub(/^\s*(my|the)\s*(.+)$/, '\2')
page.find('[id$="' + field.gsub(/\s+/, '_') + '"]').value.send(should.nil? ? 'should' : 'should_not', eq(value))
end
Then(/^(my )?(.+)? should (not )?be checked$/) do | a, field, should |
field = field.gsub(/^\s*(my|the)\s*(.+)$/, '\2')
page.find('[id$="' + field.gsub(/\s+/, '_') + '"]').send(should.nil? ? 'should' : 'should_not', be_checked)
end
Then(/^I set (.+?) to (.+)$/) do | field, value |
field = field.gsub(/^\s*(my|the)\s*(.+)$/, '\2')
page.find('[id$="' + field.gsub(/\s+/, '_') + '"]', :visible => false).set value
end
Then(/^(I )wait for (.+?) to appear$/) do | a, field |
count = 0
element = nil
while element.nil? && count < 120
begin element = page.find('[id$="' + field.gsub(/\s+/, '_') + '"]'); rescue; end
begin element ||= page.find('[id$="' + field.gsub(/\s+/, '_') + '"]', :visible => false); rescue; end
sleep(1)
count += 1
end
end
Then(/^show the page$/) do
print page.html
save_and_open_page
end
Then(/^I select (.+?) from (.+)$/) do | value, field |
select(value, :from => locate(field))
end
## ======= Emails ======= ##
Then(/^I should not get an email$/) do
ActionMailer::Base.deliveries.size.should eq 0
end
Then (/^I should get an? (.+) email$/) do |subject|
@last_email = ActionMailer::Base.deliveries.last
if @last_email_entered
@last_email.to.should include @last_email_entered
end
@last_email.subject.should include(subject)
end
Then (/^the email should contain (.+)$/) do |value|
@last_email.parts.first.body.raw_source.should include(value)
@last_email.parts.last.body.raw_source.should include(value)
end
Then (/^in the email I should see (.+)$/) do |value|
if /(an?|the|my) (.+) link/ =~ value
test = path_to Regexp.last_match(2)
@last_email.parts.first.body.raw_source.should include(test)
@last_email.parts.last.body.raw_source.should include(test)
else
@last_email.parts.first.body.raw_source.should include(value)
@last_email.parts.last.body.raw_source.should include(value)
end
end
Then (/^I should (not )?be registered for the conference$/) do |state|
@last_registration = ConferenceRegistration.find_by(:email => @last_email_entered)
if state && state.strip == 'not'
@last_registration.should be_nil
else
@last_registration.should_not be_nil
end
end
Then (/^my registration (should( not)? be|is( not)?) (confirmed|completed?|paid)$/) do |state, x, y, field|
ConferenceRegistration.find_by!(:email => @last_email_entered).
send(field == 'confirmed' ? 'is_confirmed' : (field == 'paid' ? 'payment_info' : field)).
send(state =~ / not/ ? 'should_not' : 'should', be)
end
Then (/^I am( not)? a user$/) do |state|
User.find_by(:email => @last_email_entered).
send(state =~ / not/ ? 'should_not' : 'should', be)
end
Then (/^I am( not)? a member of (.+)$/) do |state, org_name|
user = nil
should_be = !(state =~ / not/)
org = Organization.find_by(:name => org_name)
if should_be
org.should be
org.users.should be
elsif org.nil? || org.users.nil?
return
end
org.users.each { |u|
if u.email == @last_email_entered
user = u
end
}
user.send(should_be ? 'should' : 'should_not', be)
end
Then (/^My (.+) should(not )? be (.+)$/) do |field, state, value|
User.find_by(:email => @last_email_entered).
send(field.gsub(/\s/, '_')).
send(state =~ / not/ ? 'should_not' : 'should', eq(value))
end end

88
features/support/env.rb

@ -5,6 +5,7 @@
# files. # files.
require 'cucumber/rails' require 'cucumber/rails'
require 'capybara/poltergeist'
# Capybara defaults to CSS3 selectors rather than XPath. # Capybara defaults to CSS3 selectors rather than XPath.
# If you'd prefer to use XPath, just uncomment this line and adjust any # If you'd prefer to use XPath, just uncomment this line and adjust any
@ -31,11 +32,53 @@ ActionController::Base.allow_rescue = false
# Remove/comment out the lines below if your app doesn't have a database. # Remove/comment out the lines below if your app doesn't have a database.
# For some databases (like MongoDB and CouchDB) you may need to use :truncation instead. # For some databases (like MongoDB and CouchDB) you may need to use :truncation instead.
begin begin
DatabaseCleaner.strategy = :transaction DatabaseCleaner.strategy = :truncation
#DatabaseCleaner.clean_with(:truncation)
rescue NameError rescue NameError
raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it." raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it."
end end
add_translations = Array.new
Carmen::World.instance.subregions.each { |country|
add_translations << "world.#{country.code.downcase}.name"
if country.subregions?
country.subregions.each { |region| add_translations << "world.#{country.code.downcase}.#{region.code.downcase}.name" }
end
}
I18n::Backend::BikeBike::init_tests!# add_translations
#at_exit do
# I18n::Backend::BikeBike::end_tests!
#end
Before('@javascript') do
ActiveRecord::Base.shared_connection = nil
ActiveRecord::Base.descendants.each do |model|
model.shared_connection = nil
end
end
Before do
#DatabaseCleaner.start
Translation.connection.execute("INSERT INTO translations (locale, key, value) VALUES('en', 'time.formats.date', '%B %d, %Y');")
Translation.connection.execute("INSERT INTO translations (locale, key, value, is_proc) VALUES('en', 'date.month_names', '[\"~\", \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"]', TRUE);")
ConferenceType.connection.execute("INSERT INTO conference_types (slug) VALUES ('bikebike'), ('regional'), ('bici-congreso')")
WorkshopStream.connection.execute("INSERT INTO workshop_streams (slug) VALUES ('mechanics'), ('leisure'), ('interorganizational_relations'), ('ethics_public_relations'), ('organization_management')")
WorkshopPresentationStyle.connection.execute("INSERT INTO workshop_presentation_styles (slug) VALUES ('discussion'), ('panel'), ('presentation'), ('hands-on'), ('other')")
#host! 'en.bikebike.org'
ApplicationController::set_host 'en.bikebike.org'
ApplicationController::set_location nil
end
After do |scenario|
save_and_open_page if scenario.failed?
end
#After do
# DatabaseCleaner.clean
#end
# You may also want to configure DatabaseCleaner to use different strategies for certain features and scenarios. # You may also want to configure DatabaseCleaner to use different strategies for certain features and scenarios.
# See the DatabaseCleaner documentation for details. Example: # See the DatabaseCleaner documentation for details. Example:
# #
@ -54,5 +97,46 @@ end
# Possible values are :truncation and :transaction # Possible values are :truncation and :transaction
# The :transaction strategy is faster, but might give you threading problems. # The :transaction strategy is faster, but might give you threading problems.
# See https://github.com/cucumber/cucumber-rails/blob/master/features/choose_javascript_database_strategy.feature # See https://github.com/cucumber/cucumber-rails/blob/master/features/choose_javascript_database_strategy.feature
Cucumber::Rails::Database.javascript_strategy = :truncation Cucumber::Rails::Database.javascript_strategy = :transaction
Capybara.register_driver :poltergeist_debug do |app|
Capybara::Poltergeist::Driver.new(app, :timeout => 120, inspector: true)
end
Capybara.javascript_driver = :poltergeist_debug
Geocoder.configure(:timeout => 60)
def locate(id)
page.find('[id$="' + id.gsub(/\s+/, '_') + '"]')[:id]
end
def create_org(name = nil, location = nil)
org = FactoryGirl.create(:org)
found_location = nil
if !location.nil?
l = Geocoder.search(location).first
begin
found_location = Location.new(city: l.city, territory: l.province_code, country: l.country_code, latitude: l.latitude, longitude: l.longitude)
rescue; end
if found_location.nil?
return
end
end
if !name.nil?
org.name = name
org.slug = org.generate_slug(name, found_location)
end
if !found_location.nil?
org.locations << found_location
end
org.save!
org
end
def get_language_code(language)
languages = {
'english' => 'en',
'french' => 'fr',
'spanish' => 'es',
'german' => 'de'
}
languages[language.downcase]
end

22
features/support/factory_girl.rb

@ -0,0 +1,22 @@
FactoryGirl.define do
factory :upcoming_conference, :class => 'Conference' do
title 'My Bike!Bike!'
slug 'MyBikeBike'
info 'Curabitur non nulla sit amet nisl tempus convallis quis ac lectus.'
poster 'poster.jpg'
cover 'cover.jpg'
registration_open false
start_date Date.today - 30.days
end_date Date.today - 26.days
conference_type_id (ConferenceType.find_by(:slug => 'bikebike') || ConferenceType.create(:slug => 'bikebike')).id
end
factory :org, :class => 'Organization' do
name 'My Organization'
info 'Curabitur non nulla sit amet nisl tempus convallis quis ac lectus.'
avatar 'avatar.jpg'
cover 'cover.jpg'
end
end
World(FactoryGirl::Syntax::Methods)

22
features/support/paths.rb

@ -1,18 +1,36 @@
module NavigationHelpers module NavigationHelpers
def path_to(page_name) def path_to(page_name)
append_root = false
case page_name case page_name
when /^landing$/i when /^landing$/i
path = 'root' path = :root
when /^confirmation$/i
path = "/conferences/bikebike/#{@last_conference.slug}/register/confirm/#{@last_registration.confirmation_token}"
when /^pay registration$/i
path = "/conferences/bikebike/#{@last_conference.slug}/register/pay-registration/#{@last_registration.confirmation_token}"
when /^confirm payment$/i
path = "/conferences/bikebike/#{@last_conference.slug}/register/confirm-payment/#{@last_registration.payment_confirmation_token}"
when /^cancel payment$/i
path = "/conferences/bikebike/#{@last_conference.slug}/register/cancel-payment/#{@last_registration.confirmation_token}"
when /^translation list$/i
path = '/translations/'
when /^(.+) translations?$/i
path = '/translations/' + get_language_code(Regexp.last_match(1))
when /^organization list$/i
path = '/organizations/'
end end
if path.is_a?(Symbol)
begin begin
self.send((path + '_url').to_sym) path = self.send((path.to_s + '_url').to_sym).gsub(/^http:\/\/.+?(\/.*)$/, '\1')
rescue Object => e rescue Object => e
raise "Can't find mapping from \"#{page_name}\" to a path.\n" + raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
"#{path}_url\n" + "#{path}_url\n" +
"Now, go and add a mapping in #{__FILE__}" "Now, go and add a mapping in #{__FILE__}"
end end
end end
path
end
end end
World(NavigationHelpers) World(NavigationHelpers)

16
features/translations.feature

@ -0,0 +1,16 @@
Feature: Translation Pages
In order to Translate Bike!Bike!
As a visitor
Scenario: Visit Translation List Page
Given I am on the English site
And I am on the translation list page
Then I see Translations
And I see list
And I see active
And I see inactive
Scenario: Visit English Translation Page
Given I am on the English site
And I am on the english translations page
Then I see language translations

46
features/volunteer-registration.feature

@ -0,0 +1,46 @@
Feature: Volunteer Registration
In order to register to volunteer at the latest Bike!Bike!
As a visitor
@javascript
Scenario: Register as volunteer
Given There is an upcoming conference in Moncton NB
And Registration is open
When I go to the landing page
Then I see a Register Now link
And I click on the Register Now link
And I fill in my email with example@example.com
And I press register
And I fill in my firstname with Francis
And I fill in my lastname with Bacon
And I fill in my username with Bacon
And I check is_volunteer
And I press next
Then I see Contact Information
And I fill in address with 1234 Some St.
And I fill in phone number with 555-555-5555
Then I see Do you have housing
And I fill in beds with 0
And I fill in couch_space with 5
And I fill in tents with 2
Then I see Anything else
And I fill in other with So excited!
And I press next
Then I should be registered for the conference
And my registration should not be confirmed
And I should get a confirm email
And in the email I should see please confirm your registration
And in the email I should see a confirmation link registration
When I go to the confirmation page
Then I should see Thanks for completing your registration
And my registration is complete
And my registration is completed

BIN
public/maps/Thumbs.db

Binary file not shown.

BIN
public/registration_data/1ehptyshk26pjbe8/ba.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
public/registration_data/2zizzr5nokd1rh7d/Thumbs.db

Binary file not shown.

BIN
public/registration_data/2zizzr5nokd1rh7d/bikeagaindoor[1].jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

BIN
public/registration_data/9vpeci4qzca7qs3o/Thumbs.db

Binary file not shown.

BIN
public/registration_data/9vpeci4qzca7qs3o/bikeagaincolourlogo[1].gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

BIN
public/registration_data/c1g7e2jsyqrp62rv/Thumbs.db

Binary file not shown.

BIN
public/registration_data/c1g7e2jsyqrp62rv/bikeagaindoor[1].jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

BIN
public/registration_data/c7evv341mlp3k4ek/Thumbs.db

Binary file not shown.

BIN
public/registration_data/c7evv341mlp3k4ek/bikeagaindoor[1].jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

BIN
public/registration_data/e0vs4ovunuo2i32i/ba.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
public/registration_data/lqgjjhzaew2klf7y/Thumbs.db

Binary file not shown.

BIN
public/registration_data/lqgjjhzaew2klf7y/bikeagaincolourlogo.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

BIN
public/registration_data/qabyxh5an79d1sf1/Thumbs.db

Binary file not shown.

BIN
public/registration_data/qabyxh5an79d1sf1/bikeagaindoor[1].jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

BIN
public/registration_data/tlxsjj1ljiqbvoai/lb.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

1
spec/spec_helper.rb

@ -43,6 +43,7 @@ RSpec.configure do |config|
config.order = "random" config.order = "random"
config.before(:each) do config.before(:each) do
fu
Translation.connection.execute("TRUNCATE TABLE translations RESTART IDENTITY;") Translation.connection.execute("TRUNCATE TABLE translations RESTART IDENTITY;")
translations = DevTranslation.connection.select_all("SELECT * FROM translations") translations = DevTranslation.connection.select_all("SELECT * FROM translations")

Loading…
Cancel
Save