From b921aa8858d3d6e3f82136375a1a3762c69bdcae Mon Sep 17 00:00:00 2001 From: matthewbarram Date: Thu, 7 Aug 2014 16:25:31 +1000 Subject: [PATCH 01/49] Update gems remove duplicate turbolinks update active admin update compass-rails gem location --- Gemfile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index cad9031..8ed4500 100644 --- a/Gemfile +++ b/Gemfile @@ -19,19 +19,18 @@ gem 'sidekiq' gem 'state_machine' gem 'turbolinks' gem 'uglifier' -gem 'compass-rails', github: 'milgner/compass-rails', branch: 'rails4' +gem 'compass-rails' gem 'formtastic', github: 'justinfrench/formtastic', branch: 'rails4beta' gem 'responders', github: 'plataformatec/responders' gem 'inherited_resources', github: 'josevalim/inherited_resources' gem 'ransack', github: 'ernie/ransack', branch: 'rails-4' -gem 'activeadmin', github: 'akashkamboj/active_admin', branch: 'rails4' +gem 'activeadmin', github: 'gregbell/active_admin' gem 'jbuilder', '1.0.2' gem 'rdoc', '3.12.2' gem 'sdoc', '0.3.20' gem 'sprockets-rails', :require => 'sprockets/railtie' gem 'slim', ">= 1.3.0" gem 'sinatra', '>= 1.3.0', :require => nil -gem 'turbolinks' gem "jquery-rails", "2.3.0" gem 'launchy' gem 'activemerchant-payway' From 2c1dbe3bd06000332c789556235f7f4557f9624d Mon Sep 17 00:00:00 2001 From: matthewbarram Date: Thu, 7 Aug 2014 17:23:53 +1000 Subject: [PATCH 02/49] Update gem files --- Gemfile | 9 +- Gemfile.lock | 449 +++++++++++++++++++++++++-------------------------- 2 files changed, 225 insertions(+), 233 deletions(-) diff --git a/Gemfile b/Gemfile index 8ed4500..4c5563b 100644 --- a/Gemfile +++ b/Gemfile @@ -19,11 +19,12 @@ gem 'sidekiq' gem 'state_machine' gem 'turbolinks' gem 'uglifier' +gem 'devise' gem 'compass-rails' -gem 'formtastic', github: 'justinfrench/formtastic', branch: 'rails4beta' -gem 'responders', github: 'plataformatec/responders' -gem 'inherited_resources', github: 'josevalim/inherited_resources' -gem 'ransack', github: 'ernie/ransack', branch: 'rails-4' +gem 'formtastic' +gem 'responders' +gem 'inherited_resources' +gem 'ransack', github: 'ernie/ransack' gem 'activeadmin', github: 'gregbell/active_admin' gem 'jbuilder', '1.0.2' gem 'rdoc', '3.12.2' diff --git a/Gemfile.lock b/Gemfile.lock index 39cab68..e222fc1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,61 +1,30 @@ -GIT - remote: git://github.com/akashkamboj/active_admin.git - revision: d9c593b13a6fadcf0eb8d5bcd14fc1a157954e93 - branch: rails4 - specs: - activeadmin (0.6.0) - arbre (>= 1.0.1) - bourbon (>= 1.0.0) - devise (>= 1.1.2) - fastercsv - formtastic (>= 2.0.0) - inherited_resources (>= 1.3.1) - jquery-rails (>= 1.0.0) - kaminari (>= 0.13.0) - rails (>= 3.1.0) - ransack (>= 0.7.0) - sass (>= 3.1.0) - GIT remote: git://github.com/ernie/ransack.git - revision: 4078f4fd0ff8b48658e1b69fe8bce0c36933f19c - branch: rails-4 - specs: - ransack (0.7.3) - actionpack - activerecord - polyamorous (~> 0.6.0) - -GIT - remote: git://github.com/josevalim/inherited_resources.git - revision: 2656ca0cea51cc7469be1d30cace24752d5b4e3b + revision: 3910773af44da31ecd8f9b45c515af39286618b3 specs: - inherited_resources (1.4.0) - has_scope (~> 0.6.0.rc) - responders (~> 1.0.0.rc) - -GIT - remote: git://github.com/justinfrench/formtastic.git - revision: 325282e64a897cd92c78d44d48726fe16486f84a - branch: rails4beta - specs: - formtastic (2.2.1) + ransack (1.2.3) actionpack (>= 3.0) + activerecord (>= 3.0) + activesupport (>= 3.0) + i18n + polyamorous (~> 1.1.0) GIT - remote: git://github.com/milgner/compass-rails.git - revision: 1749c06f15dc4b058427e7969810457213647fb8 - branch: rails4 - specs: - compass-rails (1.0.3) - compass (>= 0.12.2, < 0.14) - -GIT - remote: git://github.com/plataformatec/responders.git - revision: 89a010bea60dfca98d8a0b039e10af2a76ff9bb2 + remote: git://github.com/gregbell/active_admin.git + revision: efe5a86968c81fd12244e6c4b6957d93d0a4b7ee specs: - responders (1.0.0.rc) - railties (>= 3.2, < 5) + activeadmin (1.0.0.pre) + arbre (~> 1.0) + bourbon + coffee-rails + formtastic (~> 2.3.0.rc3) + inherited_resources (~> 1.4.1) + jquery-rails + jquery-ui-rails (~> 5.0) + kaminari (~> 0.15) + rails (>= 3.2, < 4.2) + ransack (~> 1.0) + sass-rails GEM remote: https://rubygems.org/ @@ -71,17 +40,17 @@ GEM rack-test (~> 0.6.2) active_model_serializers (0.8.1) activemodel (>= 3.0) - active_utils (2.0.0) + active_utils (2.2.2) activesupport (>= 2.3.11) i18n - activemerchant (1.34.0) - active_utils (>= 1.0.2) - activesupport (>= 2.3.14) - builder (>= 2.0.0) - i18n - json (>= 1.5.1) - money - nokogiri + activemerchant (1.43.3) + active_utils (~> 2.0, >= 2.0.1) + activesupport (>= 2.3.14, < 5.0.0) + builder (>= 2.1.2, < 4.0.0) + i18n (~> 0.5) + json (~> 1.7) + money (< 7.0.0) + nokogiri (~> 1.4) activemerchant-payway (0.0.2) activemerchant (>= 1.9.1) activemodel (4.0.0) @@ -99,179 +68,186 @@ GEM multi_json (~> 1.3) thread_safe (~> 0.1) tzinfo (~> 0.3.37) - addressable (2.3.4) + addressable (2.3.6) arbre (1.0.1) activesupport (>= 3.0.0) - arel (4.0.0) - atomic (1.1.10) - awesome_print (1.1.0) - bcrypt-ruby (3.0.1) - bourbon (3.1.8) - sass (>= 3.2.0) + arel (4.0.2) + awesome_print (1.2.0) + bcrypt (3.1.7) + bcrypt-ruby (3.1.5) + bcrypt (>= 3.1.3) + bourbon (3.2.3) + sass (~> 3.2) thor - braintree (2.23.0) + braintree (2.33.1) builder (>= 2.0.0) builder (3.1.4) - capistrano (2.15.4) - highline - net-scp (>= 1.0.0) - net-sftp (>= 2.0.0) - net-ssh (>= 2.0.14) - net-ssh-gateway (>= 1.1.0) + capistrano (3.2.1) + i18n + rake (>= 10.0.0) + sshkit (~> 1.3) capistrano-ext (1.2.1) capistrano (>= 1.0.0) - capybara (2.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) - celluloid (0.14.1) - timers (>= 1.0.0) - chunky_png (1.2.8) - coderay (1.0.9) - coffee-rails (4.0.0) + celluloid (0.15.2) + timers (~> 1.1.0) + 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.beta, < 5.0) - coffee-script (2.2.0) + railties (>= 4.0.0, < 5.0) + coffee-script (2.3.0) coffee-script-source execjs - coffee-script-source (1.6.2) - colorize (0.5.8) - columnize (0.3.6) - compass (0.12.2) + coffee-script-source (1.7.1) + colorize (0.7.3) + columnize (0.8.9) + compass (0.12.7) chunky_png (~> 1.2) fssm (>= 0.2.7) - sass (~> 3.1) - connection_pool (1.1.0) - coveralls (0.6.7) - colorize + sass (~> 3.2.19) + compass-rails (2.0.0) + compass (>= 0.12.2) + connection_pool (2.0.0) + coveralls (0.7.0) multi_json (~> 1.3) rest-client simplecov (>= 0.7) + term-ansicolor thor daemons (1.1.9) - database_cleaner (1.0.1) - debugger (1.6.0) + database_cleaner (1.3.0) + debugger (1.6.8) columnize (>= 0.3.1) debugger-linecache (~> 1.2.0) - debugger-ruby_core_source (~> 1.2.1) + debugger-ruby_core_source (~> 1.3.5) debugger-linecache (1.2.0) - debugger-ruby_core_source (1.2.2) - devise (1.5.4) - bcrypt-ruby (~> 3.0) - orm_adapter (~> 0.0.3) - warden (~> 1.1) - diff-lcs (1.2.4) + debugger-ruby_core_source (1.3.5) + devise (3.2.4) + bcrypt (~> 3.0) + orm_adapter (~> 0.1) + railties (>= 3.2.6, < 5) + thread_safe (~> 0.1) + warden (~> 1.2.3) + diff-lcs (1.2.5) + docile (1.1.5) erubis (2.7.0) eventmachine (1.0.3) - execjs (1.4.0) - multi_json (~> 1.0) - factory_girl (4.2.0) + execjs (2.2.1) + factory_girl (4.4.0) activesupport (>= 3.0.0) - factory_girl_rails (4.2.1) - factory_girl (~> 4.2.0) + factory_girl_rails (4.4.1) + factory_girl (~> 4.4.0) railties (>= 3.0.0) - faker (1.1.2) + faker (1.4.2) i18n (~> 0.5) - fastercsv (1.5.5) - faye-websocket (0.4.7) - eventmachine (>= 0.12.0) - ffi (1.9.0) - formatador (0.2.4) + ffi (1.9.3) + formatador (0.2.5) + formtastic (2.3.0.rc3) + actionpack (>= 3.0) fssm (0.2.10) - guard (1.8.1) + guard (2.6.1) formatador (>= 0.2.4) - listen (>= 1.0.0) - lumberjack (>= 1.0.2) - pry (>= 0.9.10) - thor (>= 0.14.6) - guard-rspec (3.0.2) - guard (>= 1.8) - rspec (~> 2.13) - haml (4.0.3) + listen (~> 2.7) + lumberjack (~> 1.0) + pry (>= 0.9.12) + thor (>= 0.18.1) + guard-rspec (4.3.1) + guard (~> 2.1) + rspec (>= 2.14, < 4.0) + haml (4.0.5) tilt - haml-rails (0.4) - actionpack (>= 3.1, < 4.1) - activesupport (>= 3.1, < 4.1) - haml (>= 3.1, < 4.1) - railties (>= 3.1, < 4.1) - handlebars_assets (0.14.1) + haml-rails (0.5.1) + actionpack (~> 4.0.0) + activesupport (~> 4.0.0) + haml (>= 3.1, < 5.0) + railties (~> 4.0.0) + handlebars_assets (0.17.1) execjs (>= 1.2.9) + multi_json sprockets (>= 2.0.3) tilt has_scope (0.6.0.rc) actionpack (>= 3.2, < 5) activesupport (>= 3.2, < 5) - highline (1.6.19) hike (1.2.3) - http_parser.rb (0.5.3) - httparty (0.11.0) - multi_json (~> 1.0) + httparty (0.13.1) + json (~> 1.8) multi_xml (>= 0.5.2) - i18n (0.6.4) + httpclient (2.4.0) + i18n (0.6.11) + inherited_resources (1.4.1) + has_scope (~> 0.6.0.rc) + responders (~> 1.0.0.rc) jbuilder (1.0.2) activesupport (>= 3.0.0) jquery-rails (2.3.0) railties (>= 3.0, < 5.0) thor (>= 0.14, < 2.0) - json (1.8.0) - kaminari (0.14.1) + jquery-ui-rails (5.0.0) + railties (>= 3.2.16) + json (1.8.1) + kaminari (0.16.1) actionpack (>= 3.0.0) activesupport (>= 3.0.0) - kgio (2.8.0) - konacha (3.0.0) + kgio (2.9.2) + konacha (3.2.4) actionpack (>= 3.1, < 5) capybara colorize railties (>= 3.1, < 5) sprockets - launchy (2.3.0) + launchy (2.4.2) addressable (~> 2.3) - listen (1.2.2) + listen (2.7.9) + celluloid (>= 0.15.2) rb-fsevent (>= 0.9.3) rb-inotify (>= 0.9) - rb-kqueue (>= 0.2) - lumberjack (1.0.4) + lumberjack (1.0.9) mail (2.5.4) mime-types (~> 1.16) treetop (~> 1.4.8) - method_source (0.8.1) - mime-types (1.23) - mini_portile (0.5.0) + method_source (0.8.2) + mime-types (1.25.1) + mini_portile (0.6.0) minitest (4.7.5) - money (5.1.1) - i18n (~> 0.6.0) - multi_json (1.7.7) - multi_xml (0.5.4) - naught (0.0.2) - net-scp (1.1.1) - net-ssh (>= 2.6.5) - net-sftp (2.1.2) - net-ssh (>= 2.6.5) - net-ssh (2.6.7) - net-ssh-gateway (1.2.0) + money (6.1.1) + i18n (~> 0.6.4) + multi_json (1.10.1) + multi_xml (0.5.5) + naught (1.0.0) + net-scp (1.2.1) net-ssh (>= 2.6.5) - nokogiri (1.6.0) - mini_portile (~> 0.5.0) - orm_adapter (0.0.7) - pg (0.15.1) - poltergeist (1.3.0) - capybara (~> 2.1.0) - faye-websocket (>= 0.4.4, < 0.5.0) - http_parser.rb (~> 0.5.3) - polyamorous (0.6.3) + net-ssh (2.9.1) + netrc (0.7.7) + nokogiri (1.6.3.1) + mini_portile (= 0.6.0) + orm_adapter (0.5.0) + pg (0.17.1) + poltergeist (1.5.1) + capybara (~> 2.1) + cliver (~> 0.3.1) + multi_json (~> 1.0) + websocket-driver (>= 0.2.0) + polyamorous (1.1.0) activerecord (>= 3.0) - polyglot (0.3.3) - pry (0.9.12.2) - coderay (~> 1.0.5) - method_source (~> 0.8) + polyglot (0.3.5) + pry (0.10.0) + coderay (~> 1.1.0) + method_source (~> 0.8.1) slop (~> 3.4) - pusher (0.11.3) + pusher (0.14.1) + httpclient (~> 2.3) multi_json (~> 1.0) signature (~> 0.1.6) rack (1.5.2) - rack-protection (1.5.0) + rack-protection (1.5.3) rack rack-test (0.6.2) rack (>= 1.0) @@ -283,106 +259,120 @@ GEM bundler (>= 1.3.0, < 2.0) railties (= 4.0.0) sprockets-rails (~> 2.0.0) - rails-observers (0.1.1) - railties (~> 4.0.0.beta) + rails-observers (0.1.2) + activemodel (~> 4.0) railties (4.0.0) actionpack (= 4.0.0) activesupport (= 4.0.0) rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) - raindrops (0.11.0) - rake (10.1.0) - rb-fsevent (0.9.3) - rb-inotify (0.9.0) - ffi (>= 0.5.0) - rb-kqueue (0.2.0) + raindrops (0.13.0) + rake (10.3.2) + rb-fsevent (0.9.4) + rb-inotify (0.9.5) ffi (>= 0.5.0) rdoc (3.12.2) json (~> 1.4) - redis (3.0.4) - redis-namespace (1.3.0) - redis (~> 3.0.0) - rest-client (1.6.7) - mime-types (>= 1.16) - rspec (2.13.0) - rspec-core (~> 2.13.0) - rspec-expectations (~> 2.13.0) - rspec-mocks (~> 2.13.0) - rspec-core (2.13.1) - rspec-expectations (2.13.0) - diff-lcs (>= 1.1.3, < 2.0) - rspec-mocks (2.13.1) - rspec-rails (2.13.2) + redis (3.1.0) + redis-namespace (1.5.1) + redis (~> 3.0, >= 3.0.4) + responders (1.0.0) + railties (>= 3.2, < 5) + rest-client (1.7.2) + mime-types (>= 1.16, < 3.0) + netrc (~> 0.7) + rspec (3.0.0) + rspec-core (~> 3.0.0) + rspec-expectations (~> 3.0.0) + rspec-mocks (~> 3.0.0) + rspec-core (3.0.3) + rspec-support (~> 3.0.0) + rspec-expectations (3.0.3) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.0.0) + rspec-mocks (3.0.3) + rspec-support (~> 3.0.0) + rspec-rails (3.0.2) actionpack (>= 3.0) activesupport (>= 3.0) railties (>= 3.0) - rspec-core (~> 2.13.0) - rspec-expectations (~> 2.13.0) - rspec-mocks (~> 2.13.0) - sass (3.2.9) - sass-rails (4.0.0) - railties (>= 4.0.0.beta, < 5.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.3) + sass (3.2.19) + sass-rails (4.0.1) + railties (>= 4.0.0, < 5.0) sass (>= 3.1.10) sprockets-rails (~> 2.0.0) sdoc (0.3.20) json (>= 1.1.3) rdoc (~> 3.10) - shoulda-matchers (2.2.0) + shoulda-matchers (2.6.2) activesupport (>= 3.0.0) - sidekiq (2.12.4) - celluloid (>= 0.14.1) - connection_pool (>= 1.0.0) + sidekiq (3.2.1) + celluloid (>= 0.15.2) + connection_pool (>= 2.0.0) json - redis (>= 3.0) - redis-namespace + redis (>= 3.0.6) + redis-namespace (>= 1.3.1) signature (0.1.7) - simplecov (0.7.1) - multi_json (~> 1.0) - simplecov-html (~> 0.7.1) - simplecov-html (0.7.1) - sinatra (1.4.3) + simplecov (0.9.0) + docile (~> 1.1.0) + multi_json + simplecov-html (~> 0.8.0) + simplecov-html (0.8.0) + sinatra (1.4.5) rack (~> 1.4) rack-protection (~> 1.4) tilt (~> 1.3, >= 1.3.4) - slim (2.0.0) - temple (~> 0.6.5) - tilt (~> 1.3, >= 1.3.3) - slop (3.4.5) - sprockets (2.10.0) + slim (2.0.3) + temple (~> 0.6.6) + tilt (>= 1.3.3, < 2.1) + slop (3.6.0) + sprockets (2.12.0) hike (~> 1.2) multi_json (~> 1.0) rack (~> 1.0) tilt (~> 1.1, != 1.3.0) - sprockets-rails (2.0.0) + sprockets-rails (2.0.1) actionpack (>= 3.0) activesupport (>= 3.0) sprockets (~> 2.8) + sshkit (1.5.1) + colorize + net-scp (>= 1.1.2) + net-ssh (>= 2.8.0) state_machine (1.2.0) - temple (0.6.5) - thin (1.5.1) + temple (0.6.8) + term-ansicolor (1.3.0) + tins (~> 1.0) + thin (1.6.2) daemons (>= 1.0.9) - eventmachine (>= 0.12.6) + eventmachine (>= 1.0.0) rack (>= 1.0.0) - thor (0.18.1) - thread_safe (0.1.0) - atomic + thor (0.19.1) + thread_safe (0.3.4) tilt (1.4.1) timers (1.1.0) - treetop (1.4.14) + tins (1.3.0) + treetop (1.4.15) polyglot polyglot (>= 0.3.1) - turbolinks (1.2.0) + turbolinks (2.2.2) coffee-rails - tzinfo (0.3.37) - uglifier (2.1.1) + tzinfo (0.3.40) + uglifier (2.5.3) execjs (>= 0.3.0) - multi_json (~> 1.0, >= 1.0.2) - unicorn (4.6.3) + json (>= 1.8.0) + unicorn (4.8.3) kgio (~> 2.6) rack raindrops (~> 0.7) - warden (1.2.1) + warden (1.2.3) rack (>= 1.0) + websocket-driver (0.3.4) xpath (2.0.0) nokogiri (~> 1.3) @@ -400,18 +390,19 @@ DEPENDENCIES capistrano-ext capybara coffee-rails - compass-rails! + compass-rails coveralls database_cleaner debugger + devise factory_girl_rails faker - formtastic! + formtastic guard-rspec haml-rails handlebars_assets httparty - inherited_resources! + inherited_resources jbuilder (= 1.0.2) jquery-rails (= 2.3.0) konacha @@ -426,7 +417,7 @@ DEPENDENCIES ransack! rb-fsevent (~> 0.9.1) rdoc (= 3.12.2) - responders! + responders rspec-rails sass-rails sdoc (= 0.3.20) From 7af58be8c80277f480df167fa8f3ece60f16b2c0 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 8 Aug 2014 08:51:45 +1000 Subject: [PATCH 03/49] doc and secrets --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index f0c8995..b5ea488 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,9 @@ Generally, the system will allow people to learn about the event, and register t - rails controller for emails (display this in a browser etc) - update active_admin for rails 4 (currently quite hacky) +### Bundling +If you're having troubles bundling checkout the work in progress branch `updating_gems_to_allow_bundle` + ## Sidekiq Even in developement emails are sent through a background job, you'll need redis and start From 5dce34fd37d92eb2e6c5afd07330762157050c49 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 8 Aug 2014 09:19:37 +1000 Subject: [PATCH 04/49] rename `Ticket` -> `Event` (to store location next) --- README.md | 4 ++++ app/helpers/application_helper.rb | 8 ++++++++ app/models/attendee.rb | 4 ++-- app/models/payway_connector.rb | 2 +- app/views/pages/index.html.haml | 2 +- app/views/payments/new.html.haml | 4 ++-- config/initializers/constants.rb | 6 +++--- 7 files changed, 21 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index b5ea488..e07d055 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,10 @@ We're building an [application](https://github.com/net-engine/tedx-brisbane) for Generally, the system will allow people to learn about the event, and register their interest in attending. An admin will be able to invite people in batches, at which time they can purchase a ticket. This invitation should expire, so that another batch of people may be invited. This may go through multiple rounds of invitations. +## Event Configuration + +Check out `Event` in `config/initializers/constants.rb` + ## Roadmap ### Design - add static content to public page diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 4881877..0b4792e 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,4 +1,12 @@ module ApplicationHelper + def adult_price + number_to_currency(Event.price_in_dollars) + end + + def student_price + number_to_currency(Event.price_in_dollars_for_student) + end + def email_anchor(title, url) email_link(title, url, "color: #FF2B06;", 'email-anchor') end diff --git a/app/models/attendee.rb b/app/models/attendee.rb index 5f12bea..0a341c4 100644 --- a/app/models/attendee.rb +++ b/app/models/attendee.rb @@ -67,9 +67,9 @@ def full_name def update_student_attribute(amount) case amount.to_i - when TICKET.price_in_dollars + when Event.price_in_dollars update_column(:student, false) - when TICKET.price_in_dollars_for_student + when Event.price_in_dollars_for_student update_column(:student, true) else raise 'Invalid amount' diff --git a/app/models/payway_connector.rb b/app/models/payway_connector.rb index 386a0c2..b1f6cc3 100644 --- a/app/models/payway_connector.rb +++ b/app/models/payway_connector.rb @@ -45,7 +45,7 @@ def check_and_return_attendee(attendee) end def check_and_return_amount(params) - params[:student_amount] == "true" ? TICKET.price_in_dollars_for_student : TICKET.price_in_dollars + params[:student_amount] == "true" ? Event.price_in_dollars_for_student : Event.price_in_dollars end def check_and_return_cc_details(params) diff --git a/app/views/pages/index.html.haml b/app/views/pages/index.html.haml index 175f9a2..71b6bb3 100644 --- a/app/views/pages/index.html.haml +++ b/app/views/pages/index.html.haml @@ -4,7 +4,7 @@ %p As with previous years, TEDxBrisbane fills the State Library with an eclectic mix of thinkers, dreamers and doers for a full day of inspiration and adventure. -%p Tickets for the event are $95.00 for adults and $50.00 for students/concession. Whilst we would love to have everyone along, our venue can only fit so many and there are a lot more applications than tickets, so we are sorry in advance if we can't offer you a spot. +%p Tickets for the event are #{adult_price} for adults and #{student_price} for students/concession. Whilst we would love to have everyone along, our venue can only fit so many and there are a lot more applications than tickets, so we are sorry in advance if we can't offer you a spot. = render "pages/submission_form", attendee: @attendee diff --git a/app/views/payments/new.html.haml b/app/views/payments/new.html.haml index 756cf12..ebd2d28 100644 --- a/app/views/payments/new.html.haml +++ b/app/views/payments/new.html.haml @@ -21,8 +21,8 @@ %li = label_tag :student_amount,"Tickets cost: " - = select_tag :student_amount, options_for_select([["$#{TICKET.price_in_dollars}", false],["$#{TICKET.price_in_dollars_for_student} for students", true]], - ["$#{TICKET.price_in_dollars}", false]) + = select_tag :student_amount, options_for_select([["$#{Event.price_in_dollars}", false],["$#{Event.price_in_dollars_for_student} for students", true]], + ["$#{Event.price_in_dollars}", false]) %ol %legend Credit Card diff --git a/config/initializers/constants.rb b/config/initializers/constants.rb index cf96aaf..0dd538e 100644 --- a/config/initializers/constants.rb +++ b/config/initializers/constants.rb @@ -2,9 +2,9 @@ key: ENV['TEDX_MANDRILL_API_KEY'] ) -TICKET = OpenStruct.new( - price_in_dollars: 95, - price_in_dollars_for_student: 50 +Event = OpenStruct.new( + price_in_dollars: 135, + price_in_dollars_for_student: 85 ) PAYWAY = OpenStruct.new( From 39be1337d095349f553cc450ca8dabcaa5886ca2 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 8 Aug 2014 09:29:04 +1000 Subject: [PATCH 05/49] text flexible customization --- README.md | 2 +- app/views/pages/index.html.haml | 4 ++-- config/locales/en.yml | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e07d055..0d2b107 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Generally, the system will allow people to learn about the event, and register t ## Event Configuration -Check out `Event` in `config/initializers/constants.rb` +Check out `Event` in `config/initializers/constants.rb` and `config/en.yml` ## Roadmap ### Design diff --git a/app/views/pages/index.html.haml b/app/views/pages/index.html.haml index 71b6bb3..56056eb 100644 --- a/app/views/pages/index.html.haml +++ b/app/views/pages/index.html.haml @@ -1,8 +1,8 @@ %h1 About TEDx Brisbane -%p This year's TEDxBrisbane is a full day event concluding with drinks in the evening from 5.30 to 7.30pm. Lunch will be served in the Ideas Worth Spreading tent. +%p= I18n.t('.about_p1') -%p As with previous years, TEDxBrisbane fills the State Library with an eclectic mix of thinkers, dreamers and doers for a full day of inspiration and adventure. +%p= I18n.t('.about_p2') %p Tickets for the event are #{adult_price} for adults and #{student_price} for students/concession. Whilst we would love to have everyone along, our venue can only fit so many and there are a lot more applications than tickets, so we are sorry in advance if we can't offer you a spot. diff --git a/config/locales/en.yml b/config/locales/en.yml index acae7b0..17b5f90 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1,4 +1,7 @@ en: + about_p1: "TEDxBrisbane is an event The event is Sunday, 5 October 2014. 9am until 9.30pm. (Including after party)" + about_p2: "The location this year will be at the Brisbane Powerhouse. 119 Lamington St, New Farm QLD 4005" + api: error: not_found: 'Not found' From 2d84357bb775b0e18f8951100df4011de1084a0f Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 8 Aug 2014 09:48:31 +1000 Subject: [PATCH 06/49] flexible config for time and location --- app/views/layouts/_header.html.haml | 2 +- app/views/pages/index.html.haml | 4 ++-- config/initializers/constants.rb | 3 ++- config/locales/en.yml | 7 +++++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/views/layouts/_header.html.haml b/app/views/layouts/_header.html.haml index 31e7286..b0b4e9a 100644 --- a/app/views/layouts/_header.html.haml +++ b/app/views/layouts/_header.html.haml @@ -1,7 +1,7 @@ = link_to image_tag('logo.png'), "http://www.tedxbrisbane.com/home", class: 'logo', title: 'TEDxBrisbane' -%label#date.date{ data: { date: '2013-09-13' } } 21 · 09 · 13 @ SLQ +%label#date.date{ data: { date: Event.date.to_s(:db) } }!= I18n.t('header.time_and_location') = link_to image_tag('map.png'), 'http://a.tiles.mapbox.com/v3/netengine.map-vfsy08ln.html#17.00/-27.47090/153.01807', class: 'map', target: "_blank" diff --git a/app/views/pages/index.html.haml b/app/views/pages/index.html.haml index 56056eb..380ffa9 100644 --- a/app/views/pages/index.html.haml +++ b/app/views/pages/index.html.haml @@ -1,8 +1,8 @@ %h1 About TEDx Brisbane -%p= I18n.t('.about_p1') +%p= I18n.t('about.p1') -%p= I18n.t('.about_p2') +%p= I18n.t('about.p2') %p Tickets for the event are #{adult_price} for adults and #{student_price} for students/concession. Whilst we would love to have everyone along, our venue can only fit so many and there are a lot more applications than tickets, so we are sorry in advance if we can't offer you a spot. diff --git a/config/initializers/constants.rb b/config/initializers/constants.rb index 0dd538e..3d0a093 100644 --- a/config/initializers/constants.rb +++ b/config/initializers/constants.rb @@ -4,7 +4,8 @@ Event = OpenStruct.new( price_in_dollars: 135, - price_in_dollars_for_student: 85 + price_in_dollars_for_student: 85, + date: Date.parse("5 October 2014") ) PAYWAY = OpenStruct.new( diff --git a/config/locales/en.yml b/config/locales/en.yml index 17b5f90..477333b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1,6 +1,9 @@ en: - about_p1: "TEDxBrisbane is an event The event is Sunday, 5 October 2014. 9am until 9.30pm. (Including after party)" - about_p2: "The location this year will be at the Brisbane Powerhouse. 119 Lamington St, New Farm QLD 4005" + about: + p1: "TEDxBrisbane is an event The event is Sunday, 5 October 2014. 9am until 9.30pm. (Including after party)" + p2: "The location this year will be at the Brisbane Powerhouse. 119 Lamington St, New Farm QLD 4005" + header: + time_and_location: "5 · 09 · 14 @ Powerhouse" api: error: From 79a3abdbd83c5a40c168744e96b347ba83d28bff Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 8 Aug 2014 11:35:12 +1000 Subject: [PATCH 07/49] doc and spec update --- README.md | 5 ++++- config/deploy/production.rb | 2 +- config/deploy/staging.rb | 2 +- spec/features/payment_spec.rb | 4 ++-- spec/models/attendee_spec.rb | 4 ++-- spec/models/payway_connector_spec.rb | 2 +- 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 0d2b107..41a780c 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,10 @@ Generally, the system will allow people to learn about the event, and register t ## Event Configuration -Check out `Event` in `config/initializers/constants.rb` and `config/en.yml` +* Update data for `Event` in `config/initializers/constants.rb` +* Update text for the event in `config/en.yml` +* Update server ips in `config/deploy/production/{{env}}` + ## Roadmap ### Design diff --git a/config/deploy/production.rb b/config/deploy/production.rb index ce35053..1504b79 100644 --- a/config/deploy/production.rb +++ b/config/deploy/production.rb @@ -2,4 +2,4 @@ set :rails_env, "production" set :application, "tedx-brisbane-#{rails_env}" -server '54.253.255.215', :app, :web, :db, :sidekiq, :primary => true +server '54.252.118.201', :app, :web, :db, :sidekiq, :primary => true diff --git a/config/deploy/staging.rb b/config/deploy/staging.rb index 78ee32f..f5a03e7 100644 --- a/config/deploy/staging.rb +++ b/config/deploy/staging.rb @@ -2,4 +2,4 @@ set :rails_env, "staging" set :application, "tedx-brisbane-#{rails_env}" -server '54.252.104.115', :app, :web, :db, :sidekiq, :primary => true +server '54.252.118.201', :app, :web, :db, :sidekiq, :primary => true diff --git a/spec/features/payment_spec.rb b/spec/features/payment_spec.rb index c8e51b3..86522de 100644 --- a/spec/features/payment_spec.rb +++ b/spec/features/payment_spec.rb @@ -59,7 +59,7 @@ =begin Waiting for Payway information visit(url) - select("$#{TICKET.price_in_dollars_for_student} for students", :from => 'student_amount') + select("$#{Event.price_in_dollars_for_student} for students", :from => 'student_amount') fill_in "transaction_customer_first_name", with: 'Douglas' fill_in "transaction_customer_last_name", with: 'Adams' fill_in "transaction_credit_card_number", with: cc.number @@ -81,7 +81,7 @@ context "when submitting the form with an invalid credit card" do before(:each) do - TICKET.stub(:price_in_dollars).and_return(2999) + Event.stub(:price_in_dollars).and_return(2999) end it "fails" do diff --git a/spec/models/attendee_spec.rb b/spec/models/attendee_spec.rb index 4de2cfd..d17b526 100644 --- a/spec/models/attendee_spec.rb +++ b/spec/models/attendee_spec.rb @@ -87,12 +87,12 @@ let(:attendee) { create(:attendee, first_name: "Donald", last_name: "Duck") } it "sets the student status to true when called with the student price" do - attendee.update_student_attribute(TICKET.price_in_dollars_for_student) + attendee.update_student_attribute(Event.price_in_dollars_for_student) attendee.reload.student.should == true end it "sets the student status to false when called with the standard price" do - attendee.update_student_attribute(TICKET.price_in_dollars) + attendee.update_student_attribute(Event.price_in_dollars) attendee.reload.student.should == false end diff --git a/spec/models/payway_connector_spec.rb b/spec/models/payway_connector_spec.rb index fc0f27e..d785f15 100644 --- a/spec/models/payway_connector_spec.rb +++ b/spec/models/payway_connector_spec.rb @@ -51,7 +51,7 @@ attendee.invite! pc = PaywayConnector.new(attendee, valid_transaction_params) pc.attendee.should == attendee - pc.amount.should == TICKET.price_in_dollars + pc.amount.should == Event.price_in_dollars pc.cc_details.should == { number: '1234567890', month: 12, From 58795191f9765cbe2379193732776de035bd15c7 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 8 Aug 2014 12:52:01 +1000 Subject: [PATCH 08/49] fix dependencies and active admin --- Gemfile | 6 ++--- Gemfile.lock | 32 +++++++++++++++------------ app/admin/admin_user.rb | 2 +- app/admin/attendees.rb | 2 +- config/initializers/fix_sass_rails.rb | 2 -- 5 files changed, 23 insertions(+), 21 deletions(-) delete mode 100644 config/initializers/fix_sass_rails.rb diff --git a/Gemfile b/Gemfile index 4c5563b..4609b23 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,6 @@ source 'https://rubygems.org' gem 'rails', '4.0.0' gem 'rails-observers' -gem 'debugger' gem 'active_model_serializers' gem 'bcrypt-ruby' gem 'braintree' @@ -29,11 +28,11 @@ gem 'activeadmin', github: 'gregbell/active_admin' gem 'jbuilder', '1.0.2' gem 'rdoc', '3.12.2' gem 'sdoc', '0.3.20' +gem 'sprockets', '2.11.0' # the activeadmin required devise tried to install v2.12.0 but which was expecting different apis gem 'sprockets-rails', :require => 'sprockets/railtie' gem 'slim', ">= 1.3.0" gem 'sinatra', '>= 1.3.0', :require => nil gem "jquery-rails", "2.3.0" -gem 'launchy' gem 'activemerchant-payway' group :staging, :production do @@ -46,12 +45,13 @@ group :development do end group :development, :test do + gem 'launchy' gem 'awesome_print' gem 'coveralls', require: false gem 'faker' gem 'factory_girl_rails' gem 'guard-rspec' - gem 'pry' + gem 'pry-meta' gem 'rb-fsevent', '~> 0.9.1' gem 'rspec-rails' gem 'konacha' diff --git a/Gemfile.lock b/Gemfile.lock index e222fc1..0b0ef03 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -27,7 +27,7 @@ GIT sass-rails GEM - remote: https://rubygems.org/ + remote: http://rubygems.org/ specs: actionmailer (4.0.0) actionpack (= 4.0.0) @@ -107,7 +107,6 @@ GEM execjs coffee-script-source (1.7.1) colorize (0.7.3) - columnize (0.8.9) compass (0.12.7) chunky_png (~> 1.2) fssm (>= 0.2.7) @@ -123,12 +122,6 @@ GEM thor daemons (1.1.9) database_cleaner (1.3.0) - debugger (1.6.8) - columnize (>= 0.3.1) - debugger-linecache (~> 1.2.0) - debugger-ruby_core_source (~> 1.3.5) - debugger-linecache (1.2.0) - debugger-ruby_core_source (1.3.5) devise (3.2.4) bcrypt (~> 3.0) orm_adapter (~> 0.1) @@ -242,6 +235,16 @@ GEM coderay (~> 1.1.0) method_source (~> 0.8.1) slop (~> 3.4) + pry-meta (0.0.9) + awesome_print + pry + pry-nav + pry-remote + pry-nav (0.2.4) + pry (>= 0.9.10, < 0.11.0) + pry-remote (0.1.8) + pry (~> 0.9) + slop (~> 3.0) pusher (0.14.1) httpclient (~> 2.3) multi_json (~> 1.0) @@ -302,10 +305,11 @@ GEM rspec-support (~> 3.0.0) rspec-support (3.0.3) sass (3.2.19) - sass-rails (4.0.1) + sass-rails (4.0.3) railties (>= 4.0.0, < 5.0) - sass (>= 3.1.10) - sprockets-rails (~> 2.0.0) + sass (~> 3.2.0) + sprockets (~> 2.8, <= 2.11.0) + sprockets-rails (~> 2.0) sdoc (0.3.20) json (>= 1.1.3) rdoc (~> 3.10) @@ -331,7 +335,7 @@ GEM temple (~> 0.6.6) tilt (>= 1.3.3, < 2.1) slop (3.6.0) - sprockets (2.12.0) + sprockets (2.11.0) hike (~> 1.2) multi_json (~> 1.0) rack (~> 1.0) @@ -393,7 +397,6 @@ DEPENDENCIES compass-rails coveralls database_cleaner - debugger devise factory_girl_rails faker @@ -410,7 +413,7 @@ DEPENDENCIES naught pg poltergeist - pry + pry-meta pusher rails (= 4.0.0) rails-observers @@ -426,6 +429,7 @@ DEPENDENCIES simplecov sinatra (>= 1.3.0) slim (>= 1.3.0) + sprockets (= 2.11.0) sprockets-rails state_machine thin diff --git a/app/admin/admin_user.rb b/app/admin/admin_user.rb index 258bfe0..4b04ed0 100644 --- a/app/admin/admin_user.rb +++ b/app/admin/admin_user.rb @@ -4,7 +4,7 @@ column :current_sign_in_at column :last_sign_in_at column :sign_in_count - default_actions + actions end filter :email diff --git a/app/admin/attendees.rb b/app/admin/attendees.rb index d65af82..d198159 100644 --- a/app/admin/attendees.rb +++ b/app/admin/attendees.rb @@ -12,7 +12,7 @@ column :tweet_idea column :scholarship column :student - default_actions + actions end filter :state, :as => :select, collection: proc { Attendee.new.state_paths.to_states } diff --git a/config/initializers/fix_sass_rails.rb b/config/initializers/fix_sass_rails.rb deleted file mode 100644 index 4520b7c..0000000 --- a/config/initializers/fix_sass_rails.rb +++ /dev/null @@ -1,2 +0,0 @@ -Rails.application.config.middleware.delete Sass::Plugin::Rack - From 5befaa32086cad80a925479e437e88b4d31cbe29 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 8 Aug 2014 12:52:10 +1000 Subject: [PATCH 09/49] fix coffee syntax --- .../submission_form_handler.js.coffee | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/app/assets/javascripts/submission_form_handler.js.coffee b/app/assets/javascripts/submission_form_handler.js.coffee index da8c930..d2600d5 100644 --- a/app/assets/javascripts/submission_form_handler.js.coffee +++ b/app/assets/javascripts/submission_form_handler.js.coffee @@ -2,25 +2,20 @@ class @SubmissionFormHandler constructor: (@$form) -> validate: -> - @$form.validate({ - onkeyup: (element) -> $(element).valid(), - rules: { - "attendee[first_name]": "required", - "attendee[last_name]": "required", - "attendee[email_address]": { - required: true, - email: true - }, - }, - messages: { - "attendee[first_name]": "Please enter your firstname", - "attendee[last_name]": "Please enter your lastname", - "attendee[email_address]": { - required: "Please enter your email", - email: "Please enter a valid email address" - } - } - }); + onkeyup = (element) -> $(element).valid() + rules = + "attendee[first_name]": "required" + "attendee[last_name]": "required" + "attendee[email_address]": + required: true + email: true + messages = + "attendee[first_name]": "Please enter your firstname" + "attendee[last_name]": "Please enter your lastname" + "attendee[email_address]": + required: "Please enter your email" + email: "Please enter a valid email address" + @$form.validate(onkeyup: onkeyup, rules: rules, messages: messages) $ -> if ($("#new_attendee").length > 0) From 6a934c1d00a7b891c0c89e80a118c7996635bcb6 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 8 Aug 2014 13:05:26 +1000 Subject: [PATCH 10/49] use rspec 2 --- Gemfile | 1 + Gemfile.lock | 34 +++++++++++++++++----------------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/Gemfile b/Gemfile index 4609b23..a64c89c 100644 --- a/Gemfile +++ b/Gemfile @@ -53,6 +53,7 @@ group :development, :test do gem 'guard-rspec' gem 'pry-meta' gem 'rb-fsevent', '~> 0.9.1' + gem 'rspec', '< 3' # we're using the old syntax gem 'rspec-rails' gem 'konacha' gem 'thin' diff --git a/Gemfile.lock b/Gemfile.lock index 0b0ef03..e25a678 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -284,26 +284,25 @@ GEM rest-client (1.7.2) mime-types (>= 1.16, < 3.0) netrc (~> 0.7) - rspec (3.0.0) - rspec-core (~> 3.0.0) - rspec-expectations (~> 3.0.0) - rspec-mocks (~> 3.0.0) - rspec-core (3.0.3) - rspec-support (~> 3.0.0) - rspec-expectations (3.0.3) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.0.0) - rspec-mocks (3.0.3) - rspec-support (~> 3.0.0) - rspec-rails (3.0.2) + rspec (2.99.0) + rspec-core (~> 2.99.0) + rspec-expectations (~> 2.99.0) + rspec-mocks (~> 2.99.0) + rspec-collection_matchers (1.0.0) + rspec-expectations (>= 2.99.0.beta1) + rspec-core (2.99.1) + rspec-expectations (2.99.2) + diff-lcs (>= 1.1.3, < 2.0) + rspec-mocks (2.99.2) + rspec-rails (2.99.0) actionpack (>= 3.0) + activemodel (>= 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.3) + rspec-collection_matchers + rspec-core (~> 2.99.0) + rspec-expectations (~> 2.99.0) + rspec-mocks (~> 2.99.0) sass (3.2.19) sass-rails (4.0.3) railties (>= 4.0.0, < 5.0) @@ -421,6 +420,7 @@ DEPENDENCIES rb-fsevent (~> 0.9.1) rdoc (= 3.12.2) responders + rspec (< 3) rspec-rails sass-rails sdoc (= 0.3.20) From 370e80f6283eb4ff88ebcb1c16055519af723584 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 8 Aug 2014 13:19:22 +1000 Subject: [PATCH 11/49] fix spec run and deploy (hopefully) --- Gemfile | 5 +++-- Gemfile.lock | 25 ++++++++++++++++--------- config/deploy.rb | 2 +- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/Gemfile b/Gemfile index a64c89c..8626d4c 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,4 @@ -source 'https://rubygems.org' +source 'http://rubygems.org' gem 'rails', '4.0.0' @@ -40,7 +40,8 @@ group :staging, :production do end group :development do - gem 'capistrano' + gem 'capistrano', '< 3' + gem "capistrano-sidekiq" gem 'capistrano-ext' end diff --git a/Gemfile.lock b/Gemfile.lock index e25a678..713c08f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -82,12 +82,17 @@ GEM braintree (2.33.1) builder (>= 2.0.0) builder (3.1.4) - capistrano (3.2.1) - i18n - rake (>= 10.0.0) - sshkit (~> 1.3) + 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) capistrano-ext (1.2.1) capistrano (>= 1.0.0) + capistrano-sidekiq (0.3.5) + capistrano + sidekiq capybara (2.4.1) mime-types (>= 1.16) nokogiri (>= 1.3.3) @@ -169,6 +174,7 @@ GEM has_scope (0.6.0.rc) actionpack (>= 3.2, < 5) activesupport (>= 3.2, < 5) + highline (1.6.21) hike (1.2.3) httparty (0.13.1) json (~> 1.8) @@ -217,7 +223,11 @@ GEM naught (1.0.0) 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.3.1) mini_portile (= 0.6.0) @@ -343,10 +353,6 @@ GEM actionpack (>= 3.0) activesupport (>= 3.0) sprockets (~> 2.8) - sshkit (1.5.1) - colorize - net-scp (>= 1.1.2) - net-ssh (>= 2.8.0) state_machine (1.2.0) temple (0.6.8) term-ansicolor (1.3.0) @@ -389,8 +395,9 @@ DEPENDENCIES awesome_print bcrypt-ruby braintree - capistrano + capistrano (< 3) capistrano-ext + capistrano-sidekiq capybara coffee-rails compass-rails diff --git a/config/deploy.rb b/config/deploy.rb index 771f13c..d454599 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -1,6 +1,6 @@ require 'bundler/capistrano' require 'capistrano/ext/multistage' -require 'sidekiq/capistrano' +require 'capistrano/sidekiq' set :pg_user, "ubuntu" set :db_name, "tedx_brisbane" From 1fd9362e1dc099998ea614daa92530035a474b58 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 8 Aug 2014 14:59:19 +1000 Subject: [PATCH 12/49] tmp production --- config/application.rb | 4 ++-- config/deploy/production.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/application.rb b/config/application.rb index 7d4996a..971c7af 100644 --- a/config/application.rb +++ b/config/application.rb @@ -13,8 +13,8 @@ HOSTNAME = OpenStruct.new( development: 'http://127.0.0.1:3000', - staging: 'http://tedx.netengine.com.au', - production: 'https://register.tedxbrisbane.com' + staging: 'https://tedxbrisbane.netengine.com.au', + production: 'https://tedxbrisbane.netengine.com.au' # https://register.tedxbrisbane.com ) module TedxBrisbane diff --git a/config/deploy/production.rb b/config/deploy/production.rb index 1504b79..ac2b400 100644 --- a/config/deploy/production.rb +++ b/config/deploy/production.rb @@ -1,4 +1,4 @@ -set :branch, "production" +set :branch, "with_assets" set :rails_env, "production" set :application, "tedx-brisbane-#{rails_env}" From 77fb8913ddafb3f405e87b856da244b9929b22c8 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 8 Aug 2014 15:27:14 +1000 Subject: [PATCH 13/49] doc --- config/initializers/constants.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/initializers/constants.rb b/config/initializers/constants.rb index 3d0a093..f72332e 100644 --- a/config/initializers/constants.rb +++ b/config/initializers/constants.rb @@ -8,6 +8,8 @@ date: Date.parse("5 October 2014") ) +# See HOSTNAME in application.rb + PAYWAY = OpenStruct.new( YAML.load_file("#{Rails.root}/config/payway.yml") ) From 6b7b941bc31a47efcc9a00c5bbfe0d7bddd5ea97 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 8 Aug 2014 15:44:22 +1000 Subject: [PATCH 14/49] add addressable, used for emails (was previously dependency of launchy) --- Gemfile | 1 + Gemfile.lock | 1 + 2 files changed, 2 insertions(+) diff --git a/Gemfile b/Gemfile index 8626d4c..1cdcbd3 100644 --- a/Gemfile +++ b/Gemfile @@ -24,6 +24,7 @@ gem 'formtastic' gem 'responders' gem 'inherited_resources' gem 'ransack', github: 'ernie/ransack' +gem 'addressable' gem 'activeadmin', github: 'gregbell/active_admin' gem 'jbuilder', '1.0.2' gem 'rdoc', '3.12.2' diff --git a/Gemfile.lock b/Gemfile.lock index 713c08f..cd605c2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -392,6 +392,7 @@ DEPENDENCIES active_model_serializers activeadmin! activemerchant-payway + addressable awesome_print bcrypt-ruby braintree From a045fc1167580ed6433b425b49928c8bbd65d562 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 8 Aug 2014 15:57:48 +1000 Subject: [PATCH 15/49] remove addressable --- Gemfile | 1 - Gemfile.lock | 1 - app/models/email_link.rb | 8 ++++---- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index 1cdcbd3..8626d4c 100644 --- a/Gemfile +++ b/Gemfile @@ -24,7 +24,6 @@ gem 'formtastic' gem 'responders' gem 'inherited_resources' gem 'ransack', github: 'ernie/ransack' -gem 'addressable' gem 'activeadmin', github: 'gregbell/active_admin' gem 'jbuilder', '1.0.2' gem 'rdoc', '3.12.2' diff --git a/Gemfile.lock b/Gemfile.lock index cd605c2..713c08f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -392,7 +392,6 @@ DEPENDENCIES active_model_serializers activeadmin! activemerchant-payway - addressable awesome_print bcrypt-ruby braintree diff --git a/app/models/email_link.rb b/app/models/email_link.rb index 452bf9d..2452513 100644 --- a/app/models/email_link.rb +++ b/app/models/email_link.rb @@ -22,19 +22,19 @@ def initialize(resource) end def for - Addressable::URI.escape("#{host_name}/#{route}/#{token}") + "#{host_name}/#{route}/#{token}".parameterize end def confirm - Addressable::URI.escape("#{host_name}/confirm/#{confirm_token}") + "#{host_name}/confirm/#{confirm_token}".parameterize end def pay - Addressable::URI.escape("#{host_name}/pay/#{pay_token}") + "#{host_name}/pay/#{pay_token}".parameterize end def decline - Addressable::URI.escape("#{host_name}/decline/#{decline_token}") + "#{host_name}/decline/#{decline_token}".parameterize end private From 71ebb0ab5ff6975efa7d314d3f2cbfd084ba721a Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 8 Aug 2014 16:16:58 +1000 Subject: [PATCH 16/49] back to previous implementation --- Gemfile | 3 ++- Gemfile.lock | 1 + app/models/email_link.rb | 8 ++++---- config/deploy.rb | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index 8626d4c..ccb85e3 100644 --- a/Gemfile +++ b/Gemfile @@ -34,6 +34,8 @@ gem 'slim', ">= 1.3.0" gem 'sinatra', '>= 1.3.0', :require => nil gem "jquery-rails", "2.3.0" gem 'activemerchant-payway' +gem 'addressable' +gem 'launchy' group :staging, :production do gem 'unicorn' @@ -46,7 +48,6 @@ group :development do end group :development, :test do - gem 'launchy' gem 'awesome_print' gem 'coveralls', require: false gem 'faker' diff --git a/Gemfile.lock b/Gemfile.lock index 713c08f..cd605c2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -392,6 +392,7 @@ DEPENDENCIES active_model_serializers activeadmin! activemerchant-payway + addressable awesome_print bcrypt-ruby braintree diff --git a/app/models/email_link.rb b/app/models/email_link.rb index 2452513..452bf9d 100644 --- a/app/models/email_link.rb +++ b/app/models/email_link.rb @@ -22,19 +22,19 @@ def initialize(resource) end def for - "#{host_name}/#{route}/#{token}".parameterize + Addressable::URI.escape("#{host_name}/#{route}/#{token}") end def confirm - "#{host_name}/confirm/#{confirm_token}".parameterize + Addressable::URI.escape("#{host_name}/confirm/#{confirm_token}") end def pay - "#{host_name}/pay/#{pay_token}".parameterize + Addressable::URI.escape("#{host_name}/pay/#{pay_token}") end def decline - "#{host_name}/decline/#{decline_token}".parameterize + Addressable::URI.escape("#{host_name}/decline/#{decline_token}") end private diff --git a/config/deploy.rb b/config/deploy.rb index d454599..5ece3b3 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -48,7 +48,7 @@ end task :upgrade, :roles => :app, :except => { :no_release => true } do - sudo "/etc/init.d/unicorn upgrade" + sudo "service unicorn upgrade" end namespace :assets do From 588317f3e4ddc526822823b30e6ddae18e685a57 Mon Sep 17 00:00:00 2001 From: erik Date: Fri, 8 Aug 2014 17:35:00 +1000 Subject: [PATCH 17/49] after Lisa's requests --- app/views/layouts/_header.html.haml | 2 +- app/views/pages/_submission_form.html.haml | 9 +++++---- app/views/pages/index.html.haml | 2 +- config/locales/en.yml | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/views/layouts/_header.html.haml b/app/views/layouts/_header.html.haml index b0b4e9a..20f20e0 100644 --- a/app/views/layouts/_header.html.haml +++ b/app/views/layouts/_header.html.haml @@ -4,4 +4,4 @@ %label#date.date{ data: { date: Event.date.to_s(:db) } }!= I18n.t('header.time_and_location') -= link_to image_tag('map.png'), 'http://a.tiles.mapbox.com/v3/netengine.map-vfsy08ln.html#17.00/-27.47090/153.01807', class: 'map', target: "_blank" += link_to image_tag('map.png'), 'http://a.tiles.mapbox.com/v3/netengine.map-vfsy08ln.html#17.00/-27.469045/153.054324,17', class: 'map', target: "_blank" diff --git a/app/views/pages/_submission_form.html.haml b/app/views/pages/_submission_form.html.haml index 16de959..9cf4477 100644 --- a/app/views/pages/_submission_form.html.haml +++ b/app/views/pages/_submission_form.html.haml @@ -25,13 +25,14 @@ = f.label :profession = f.text_field :profession %li - = f.label :tweet_idea, "What is your idea worth tweeting?" + = f.label :tweet_idea, "What is your idea worth dreaming?" = f.text_area :tweet_idea, maxlength: 140 #char_count.char-count 140 - %li.checkbox_field - = f.check_box :scholarship - = f.label :scholarship, "We will be offering a limited number of scholarship places for people where circumstances prevent them from securing a ticket. If you want to be considered for a scholarship place please tick here." + -# + %li.checkbox_field + = f.check_box :scholarship + = f.label :scholarship, "We will be offering a limited number of scholarship places for people where circumstances prevent them from securing a ticket. If you want to be considered for a scholarship place please tick here." diff --git a/app/views/pages/index.html.haml b/app/views/pages/index.html.haml index 380ffa9..3d1b397 100644 --- a/app/views/pages/index.html.haml +++ b/app/views/pages/index.html.haml @@ -4,7 +4,7 @@ %p= I18n.t('about.p2') -%p Tickets for the event are #{adult_price} for adults and #{student_price} for students/concession. Whilst we would love to have everyone along, our venue can only fit so many and there are a lot more applications than tickets, so we are sorry in advance if we can't offer you a spot. +%p Tickets for the event are #{adult_price} for adults and #{student_price} for students/concession. Whilst we would love to have everyone along, our venue can only fit so many and there are a lot more applications than tickets, so we are sorry in advance if we can't offer you a spot. If your registration is successful, you will be sent an invitation to attend in a few weeks, that will contain the link to pay, and to secure your ticket. It is very important that payment is made within three business days following receipt so we have time to offer the ticket to someone else, if you can no longer make it. = render "pages/submission_form", attendee: @attendee diff --git a/config/locales/en.yml b/config/locales/en.yml index 477333b..33c1474 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1,7 +1,7 @@ en: about: - p1: "TEDxBrisbane is an event The event is Sunday, 5 October 2014. 9am until 9.30pm. (Including after party)" - p2: "The location this year will be at the Brisbane Powerhouse. 119 Lamington St, New Farm QLD 4005" + p1: "TEDxBrisbane is a full day of ideas, conversation and community to take place on Sunday, 5 October 2014 from 9am until 9.30pm. (Including after party)" + p2: "The location this year will be at the Brisbane Powerhouse. 119 Lamington St, New Farm QLD 4005" header: time_and_location: "5 · 09 · 14 @ Powerhouse" From e54b41d191d3bf95bf23a84ec95c03958190c07f Mon Sep 17 00:00:00 2001 From: erik Date: Mon, 11 Aug 2014 10:34:28 +1000 Subject: [PATCH 18/49] 2014 customization --- README.md | 1 + app/views/emails/_decline_from_user.haml | 5 +++- app/views/emails/_invite.html.haml | 22 +++++++++------ app/views/emails/_pay.html.haml | 12 +++++--- .../_provide_complimentary_ticket.html.haml | 28 ++++++++++++++++--- app/views/emails/_register.html.haml | 24 ++++++++++++---- app/views/emails/_revoke_invitation.html.haml | 6 ++-- app/views/layouts/_header.html.haml | 2 +- app/views/pages/index.html.haml | 17 +++++++++-- config/deploy/production.rb | 2 +- config/initializers/constants.rb | 11 +++++++- config/locales/en.yml | 6 ---- 12 files changed, 99 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 41a780c..a863e4f 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ Generally, the system will allow people to learn about the event, and register t * Update data for `Event` in `config/initializers/constants.rb` * Update text for the event in `config/en.yml` +* Update text for emails in `view/emails/_*.haml` * Update server ips in `config/deploy/production/{{env}}` diff --git a/app/views/emails/_decline_from_user.haml b/app/views/emails/_decline_from_user.haml index 0956887..8153635 100644 --- a/app/views/emails/_decline_from_user.haml +++ b/app/views/emails/_decline_from_user.haml @@ -1,3 +1,6 @@ -%p Thanks for letting us know that you won't be able to attend TEDxBrisbane 2013. We're sorry you can't make it, but we're sure to see you around the traps. +%p + Thanks for letting us know that you won't be able to attend TEDxBrisbane + = Event.date.year + \. We're sorry you can't make it, but we're sure to see you around the traps. = render 'emails/email_footer' diff --git a/app/views/emails/_invite.html.haml b/app/views/emails/_invite.html.haml index b3056ab..e8b2a5e 100644 --- a/app/views/emails/_invite.html.haml +++ b/app/views/emails/_invite.html.haml @@ -1,22 +1,28 @@ -%p= "Hi #{attendee.first_name}," +%p Hi #{attendee.first_name}, -%p We are very happy to extend you an invitation to this year's TEDxBrisbane to be held at the State Library of Queensland on Saturday, 21 September. +%p + We are very happy to extend you an invitation to this year's TEDxBrisbane to + be held at the #{Event.location} on #{Event.starts_on.to_s :long}. %p It is set to be a day filled with inspiration from some of our best thinkers and doers. -%p= "Lunch will be served by our very good friends at #{email_anchor('Street Food Australia', 'http://www.streetfoodaustralia.com.au')} and the evening will conclude with drinks on the Maiwar Green, including hand crafted ales from the fantastic folk at #{email_anchor('Green Beacon Brewing Co.', 'http://www.greenbeacon.com.au')} and a light show put on by the Brisbane Festival. (We can't take credit for organising that one!)".html_safe +%p + Lunch will be served by our very good friends at + = email_anchor('Street Food Australia', 'http://www.streetfoodaustralia.com.au') + and the evening will conclude with drinks and celebration, in the midst of the + spectacular architecture and scenery of our venue, the #{Event.location}. + %p Please note that the event was significantly over subscribed and in order to confirm your place, you will need to arrange payment within the next 5 days, or your ticket will be reallocated. +%p To pay for your ticket, click the button below. Please note tickets are strictly non-refundable, except where the event is cancelled or postponed. -%p To pay for your ticket, click the button below. %p= email_button 'Buy ticket', EmailLink.pay(attendee) -%p= "If you wish to cancel your registation, click #{email_anchor "here.", EmailLink.decline(attendee)}".html_safe +%p + If you wish to cancel your registation, click + = email_anchor "here.", EmailLink.decline(attendee) %p We can't wait to see you. -%p September is coming. - = render 'emails/email_footer' - diff --git a/app/views/emails/_pay.html.haml b/app/views/emails/_pay.html.haml index 9b91ff0..6e10797 100644 --- a/app/views/emails/_pay.html.haml +++ b/app/views/emails/_pay.html.haml @@ -6,15 +6,19 @@ %strong A couple of important reminders for the day: %ul{style: "list-style-type: square; list-style-position: outside; padding: 0 0 0 1em;"} - %li{style: "margin: 0 0 .5em;"} Registration opens at 7:45 am and closes at 8:45 am, so please ensure you have picked up your personalised name tag by this time. + %li{style: "margin: 0 0 .5em;"} Registration #{Event.registration_open_and_close_time}, so please ensure you have picked up your personalised name tag by this time. - %li{style: "margin: 0 0 .5em;"} Conference starts at 8:55 am sharp. + %li{style: "margin: 0 0 .5em;"} Conference starts at #{Event.doors_open_at} sharp. - %li{style: "margin: 0 0 .5em;"} TEDxBrisbane is a full day event, concluding with drinks from 5:30–7:30 pm. Lunch will be served in the Ideas worth Spreading Tent. + %li{style: "margin: 0 0 .5em;"} TEDxBrisbane is a full day event, concluding with drinks #{Event.drink_time_range}. Lunch will be served in the Ideas worth Spreading Tent. %li{style: "margin: 0 0 .5em;"} No video or flash photography is permitted in the theatres. - %li{style: "margin: 0 0 .5em;"} In attending TEDxBrisbane 2013, you may be filmed or photographed. If you have a problem with this, please inform the photographer. + %li{style: "margin: 0 0 .5em;"} If you wish to dine at the #{Event.location} after the event – we suggest you make a reservation, as it will be a busy day. + + %li{style: "margin: 0 0 .5em;"} In attending TEDxBrisbane #{Event.date.year}, you may be filmed or photographed. If you have a problem with this, please inform the photographer. + + %li{style: "margin: 0 0 .5em;"} In attending TEDxBrisbane #{Event.date.year}, you are bound by all the conditions of entry to the #{Event.location}. %li{style: "margin: 0 0 .5em;"} Twitter hashtag is #TEDxBrisbane. diff --git a/app/views/emails/_provide_complimentary_ticket.html.haml b/app/views/emails/_provide_complimentary_ticket.html.haml index 49996d6..f1647ab 100644 --- a/app/views/emails/_provide_complimentary_ticket.html.haml +++ b/app/views/emails/_provide_complimentary_ticket.html.haml @@ -1,11 +1,31 @@ Hi #{attendee.first_name}, -%p You have have received a complimentary ticket to TEDxBrisbane 2013. +%p + You have received a complimentary ticket to TEDxBrisbane #{Event.date.year}, + to take place at the #{Event.location} on #{Event.date}. -%p= render 'emails/blurb' +%p + This year's TEDxBrisbane is a full day event concluding with drinks in the evening + from #{Event.starts_at} to #{Event.ends_at}. Lunch will be served in the + %em Ideas Worth Spreading + tent. -%p We'll send a reminder closer to the event. +%p + TEDxBrisbane will fill the #{Event.location} with an eclectic mix of thinkers, + dreamers and doers for a full day of inspiration and adventure. -%p= "If you are not able to make it, please #{email_anchor "click here", EmailLink.decline(attendee)}. This is really important as we need to know whether to get your lunch ready.".html_safe +%p + The day starts at #{Event.doors_open_at} sharp, so please ensure you allow enough time to collect your personalized nametag. + Registrations will #{Event.registration_open_and_close_time}. + +%p + If you are not able to make it, please click here. This is really important as we need to know whether to get your lunch ready. + +%p + If you are not able to make it, please + = email_anchor "click here.", EmailLink.decline(attendee). + This is really important as we need to know whether to get your lunch ready. + +=# %p= render 'emails/blurb' = render 'emails/email_footer' diff --git a/app/views/emails/_register.html.haml b/app/views/emails/_register.html.haml index ccf7126..b45129f 100644 --- a/app/views/emails/_register.html.haml +++ b/app/views/emails/_register.html.haml @@ -1,17 +1,31 @@ %p= "Dear #{attendee.first_name}," -%p You have successfully registered your interest for TEDxBrisbane 2013! +%p You have successfully registered your interest for TEDxBrisbane #{Event.date.year}! -%p This year's TEDxBrisbane is a full day event concluding with drinks in the evening from 5.30 to 7.30pm. Lunch will be served in the Ideas Worth Spreading tent. +%p + This year's TEDxBrisbane is a full day event concluding with drinks in the + evening from #{Event.starts_at} to #{Event.ends_at}. Lunch will be served in the + %em Ideas Worth Spreading + tent. + +%p + TEDxBrisbane will fill the #{Event.location} with an eclectic mix of thinkers, + dreamers and doers for a full day of inspiration and adventure. -%p As with previous years, TEDxBrisbane fills the State Library with an eclectic mix of thinkers, dreamers and doers for a full day of inspiration and adventure. = email_divider -%p Tickets for the event are $95.00 for adults and $50.00 for students/concession. Whilst we would love to have everyone along, our venue can only fit so many and there are a lot more applications than tickets, so we are sorry in advance if we can't offer you a spot. +%p + Tickets for the event are #{Event.price_in_dollars} for adults and + = Event.price_in_dollars_for_student + for students/concession. Whilst we would love to have everyone along, our venue + can only fit so many and there are a lot more applications than tickets, so we + are sorry in advance if we can't offer you a spot. + %p - Thanks again you for your interest. If you receive an invitation for the event, we'll send you another email. If you wish to cancel your registation, click + Thanks again you for your interest. If you receive an invitation for the event, + we'll send you another email. If you wish to cancel your registration, click = email_anchor "here.", EmailLink.decline(attendee) = render 'emails/email_footer' diff --git a/app/views/emails/_revoke_invitation.html.haml b/app/views/emails/_revoke_invitation.html.haml index 27b9dbd..2f9bca8 100644 --- a/app/views/emails/_revoke_invitation.html.haml +++ b/app/views/emails/_revoke_invitation.html.haml @@ -1,11 +1,11 @@ %p Hi #{attendee.first_name}, -%p Sorry. +%p We are so sorry. %p We are unable to offer you a place at this year's event due to space limitations at the venue. %p - We do so wish you could join us but you will be able to watch the live stream on the day at - = email_anchor 'www.tedxbrisbane.com', 'http://www.tedxbrisbane.com' + We do so wish you could join us but you will be able to watch the live stream on the day, details will be made available on our + Facebook page www.tedxbrisbane.com/tedxbrisbane. %p We've also placed you on the waiting list and if a ticket becomes available, we will check in again and see if you are still keen to come along. diff --git a/app/views/layouts/_header.html.haml b/app/views/layouts/_header.html.haml index 20f20e0..fb0da43 100644 --- a/app/views/layouts/_header.html.haml +++ b/app/views/layouts/_header.html.haml @@ -1,7 +1,7 @@ = link_to image_tag('logo.png'), "http://www.tedxbrisbane.com/home", class: 'logo', title: 'TEDxBrisbane' -%label#date.date{ data: { date: Event.date.to_s(:db) } }!= I18n.t('header.time_and_location') +%label#date.date{ data: { date: Event.starts_on.to_s(:db) } }!= Event.header_title = link_to image_tag('map.png'), 'http://a.tiles.mapbox.com/v3/netengine.map-vfsy08ln.html#17.00/-27.469045/153.054324,17', class: 'map', target: "_blank" diff --git a/app/views/pages/index.html.haml b/app/views/pages/index.html.haml index 3d1b397..2219256 100644 --- a/app/views/pages/index.html.haml +++ b/app/views/pages/index.html.haml @@ -1,10 +1,21 @@ %h1 About TEDx Brisbane -%p= I18n.t('about.p1') +%p + TEDxBrisbane is a full day of ideas, conversation and community to take place on + = Event.starts_on + from #{Event.starts_at} until #{Event.ends_at}. (Including after party) -%p= I18n.t('about.p2') +%p The location this year will be at the #{Event.location}. #{Event.address} -%p Tickets for the event are #{adult_price} for adults and #{student_price} for students/concession. Whilst we would love to have everyone along, our venue can only fit so many and there are a lot more applications than tickets, so we are sorry in advance if we can't offer you a spot. If your registration is successful, you will be sent an invitation to attend in a few weeks, that will contain the link to pay, and to secure your ticket. It is very important that payment is made within three business days following receipt so we have time to offer the ticket to someone else, if you can no longer make it. +%p + Tickets for the event are #{Event.adult_price} for adults and #{student_price} for + students/concession. Whilst we would love to have everyone along, our venue can + only fit so many and there are a lot more applications than tickets, so we are + sorry in advance if we can't offer you a spot. If your registration is successful, + you will be sent an invitation to attend in a few weeks, that will contain the link + to pay, and to secure your ticket. It is very important that payment is made + within three business days following receipt so we have time to offer the ticket + to someone else, if you can no longer make it. = render "pages/submission_form", attendee: @attendee diff --git a/config/deploy/production.rb b/config/deploy/production.rb index ac2b400..0d4cc1f 100644 --- a/config/deploy/production.rb +++ b/config/deploy/production.rb @@ -1,4 +1,4 @@ -set :branch, "with_assets" +set :branch, "tedx2014" set :rails_env, "production" set :application, "tedx-brisbane-#{rails_env}" diff --git a/config/initializers/constants.rb b/config/initializers/constants.rb index f72332e..97bebcc 100644 --- a/config/initializers/constants.rb +++ b/config/initializers/constants.rb @@ -5,7 +5,16 @@ Event = OpenStruct.new( price_in_dollars: 135, price_in_dollars_for_student: 85, - date: Date.parse("5 October 2014") + starts_on: Date.parse("5 October 2014"), + doors_open_at: "8.55am", + starts_at: "9am", + ends_at: "9.30pm", + drink_time_range: "from 5:30–7:30 pm", + location: "Brisbane Powerhouse", + address: "119 Lamington St, New Farm QLD 4005", + header_title: "5 · 09 · 14 @ Powerhouse", + registration_open_and_close_time: "open at 7.45am and close at 8.45am", + conference_starts_at: "8:55 am", ) # See HOSTNAME in application.rb diff --git a/config/locales/en.yml b/config/locales/en.yml index 33c1474..acae7b0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1,10 +1,4 @@ en: - about: - p1: "TEDxBrisbane is a full day of ideas, conversation and community to take place on Sunday, 5 October 2014 from 9am until 9.30pm. (Including after party)" - p2: "The location this year will be at the Brisbane Powerhouse. 119 Lamington St, New Farm QLD 4005" - header: - time_and_location: "5 · 09 · 14 @ Powerhouse" - api: error: not_found: 'Not found' From aad944be88fa7ac1dc4d237403d5a4040a45b8d2 Mon Sep 17 00:00:00 2001 From: erik Date: Mon, 11 Aug 2014 10:41:19 +1000 Subject: [PATCH 19/49] drink amends --- app/views/emails/_provide_complimentary_ticket.html.haml | 2 +- app/views/emails/_register.html.haml | 2 +- config/initializers/constants.rb | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/views/emails/_provide_complimentary_ticket.html.haml b/app/views/emails/_provide_complimentary_ticket.html.haml index f1647ab..2f2e3e6 100644 --- a/app/views/emails/_provide_complimentary_ticket.html.haml +++ b/app/views/emails/_provide_complimentary_ticket.html.haml @@ -6,7 +6,7 @@ Hi #{attendee.first_name}, %p This year's TEDxBrisbane is a full day event concluding with drinks in the evening - from #{Event.starts_at} to #{Event.ends_at}. Lunch will be served in the + from #{Event.drink_time_range}. Lunch will be served in the %em Ideas Worth Spreading tent. diff --git a/app/views/emails/_register.html.haml b/app/views/emails/_register.html.haml index b45129f..68add17 100644 --- a/app/views/emails/_register.html.haml +++ b/app/views/emails/_register.html.haml @@ -4,7 +4,7 @@ %p This year's TEDxBrisbane is a full day event concluding with drinks in the - evening from #{Event.starts_at} to #{Event.ends_at}. Lunch will be served in the + evening from #{Event.drink_time_range}. Lunch will be served in the %em Ideas Worth Spreading tent. diff --git a/config/initializers/constants.rb b/config/initializers/constants.rb index 97bebcc..e75841a 100644 --- a/config/initializers/constants.rb +++ b/config/initializers/constants.rb @@ -13,8 +13,7 @@ location: "Brisbane Powerhouse", address: "119 Lamington St, New Farm QLD 4005", header_title: "5 · 09 · 14 @ Powerhouse", - registration_open_and_close_time: "open at 7.45am and close at 8.45am", - conference_starts_at: "8:55 am", + registration_open_and_close_time: "open at 7.45am and close at 8.45am" ) # See HOSTNAME in application.rb From b762b11f367cd3199ee6eaa1a66b1f144182a733 Mon Sep 17 00:00:00 2001 From: erik Date: Mon, 11 Aug 2014 10:50:36 +1000 Subject: [PATCH 20/49] ready for master --- Gemfile | 2 +- config/deploy/production.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index ccb85e3..86fa86c 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,4 @@ -source 'http://rubygems.org' +source 'https://rubygems.org' gem 'rails', '4.0.0' diff --git a/config/deploy/production.rb b/config/deploy/production.rb index 0d4cc1f..84e4a36 100644 --- a/config/deploy/production.rb +++ b/config/deploy/production.rb @@ -1,4 +1,4 @@ -set :branch, "tedx2014" +set :branch, "master" set :rails_env, "production" set :application, "tedx-brisbane-#{rails_env}" From af54f2dd5e8075e702f8bf6c6efc7ed0da10ac74 Mon Sep 17 00:00:00 2001 From: erik Date: Mon, 11 Aug 2014 10:52:02 +1000 Subject: [PATCH 21/49] better date --- app/views/pages/index.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/pages/index.html.haml b/app/views/pages/index.html.haml index 2219256..9ed7e2e 100644 --- a/app/views/pages/index.html.haml +++ b/app/views/pages/index.html.haml @@ -2,7 +2,7 @@ %p TEDxBrisbane is a full day of ideas, conversation and community to take place on - = Event.starts_on + = Event.starts_on.to_s :long from #{Event.starts_at} until #{Event.ends_at}. (Including after party) %p The location this year will be at the #{Event.location}. #{Event.address} From e2d1a53451b4a1e4b1d63de528c9735f87c3ea8c Mon Sep 17 00:00:00 2001 From: erik Date: Mon, 11 Aug 2014 11:22:04 +1000 Subject: [PATCH 22/49] server updates --- Gemfile | 8 ++++---- Gemfile.lock | 2 +- README.md | 1 + config/database.yml | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index 86fa86c..8db8383 100644 --- a/Gemfile +++ b/Gemfile @@ -50,18 +50,18 @@ end group :development, :test do gem 'awesome_print' gem 'coveralls', require: false - gem 'faker' - gem 'factory_girl_rails' gem 'guard-rspec' gem 'pry-meta' gem 'rb-fsevent', '~> 0.9.1' - gem 'rspec', '< 3' # we're using the old syntax - gem 'rspec-rails' gem 'konacha' gem 'thin' end group :test do + gem 'faker' + gem 'factory_girl_rails' + gem 'rspec', '< 3' # we're using the old syntax + gem 'rspec-rails' gem 'capybara' gem 'poltergeist' gem 'database_cleaner' diff --git a/Gemfile.lock b/Gemfile.lock index cd605c2..57f45b9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -27,7 +27,7 @@ GIT sass-rails GEM - remote: http://rubygems.org/ + remote: https://rubygems.org/ specs: actionmailer (4.0.0) actionpack (= 4.0.0) diff --git a/README.md b/README.md index a863e4f..a6b6529 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ Generally, the system will allow people to learn about the event, and register t * Update text for the event in `config/en.yml` * Update text for emails in `view/emails/_*.haml` * Update server ips in `config/deploy/production/{{env}}` +* Update `db/database.yml` and create a new database ## Roadmap diff --git a/config/database.yml b/config/database.yml index 6441846..129c62e 100644 --- a/config/database.yml +++ b/config/database.yml @@ -19,4 +19,4 @@ test: production: adapter: postgresql encoding: unicode - database: tedx-brisbane_production + database: tedx-brisbane_production_2014 From ecde0a8468292a2a159f394811df74ace7394f9c Mon Sep 17 00:00:00 2001 From: erik Date: Mon, 11 Aug 2014 11:30:28 +1000 Subject: [PATCH 23/49] don't use factories --- README.md | 1 + db/seeds.rb | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a6b6529..fb0fad7 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ Generally, the system will allow people to learn about the event, and register t * Update text for emails in `view/emails/_*.haml` * Update server ips in `config/deploy/production/{{env}}` * Update `db/database.yml` and create a new database +* Use `config/seed.rb` for admins ## Roadmap diff --git a/db/seeds.rb b/db/seeds.rb index 5349ca7..1868d53 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1 +1,9 @@ -FactoryGirl.create(:admin_user) +a = AdminUser.new +a.email = 'lisa@woodfordia.com' +a.password = a.password_confirmation = '20tedXbr1sban313' +a.save! + +a = AdminUser.new +a.email = 'team+tedx@netengine.com.au' +a.password = a.password_confirmation = 'BridgeEpicStory2013' +a.save! From 884bb1d9c44b71d2f3b5cf54036a7403ae48ec5c Mon Sep 17 00:00:00 2001 From: erik Date: Mon, 11 Aug 2014 11:41:08 +1000 Subject: [PATCH 24/49] css and date --- app/assets/stylesheets/modules/_flash.scss | 1 + app/views/emails/_invite.html.haml | 2 +- app/views/layouts/_header.html.haml | 2 +- app/views/pages/index.html.haml | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/modules/_flash.scss b/app/assets/stylesheets/modules/_flash.scss index 06092d9..3a3f0b0 100644 --- a/app/assets/stylesheets/modules/_flash.scss +++ b/app/assets/stylesheets/modules/_flash.scss @@ -2,6 +2,7 @@ $flash-bg-color: lighten($black, 15%); .flash { + color: white; position: fixed; top: 50%; left: 50%; diff --git a/app/views/emails/_invite.html.haml b/app/views/emails/_invite.html.haml index e8b2a5e..ab5d663 100644 --- a/app/views/emails/_invite.html.haml +++ b/app/views/emails/_invite.html.haml @@ -2,7 +2,7 @@ %p We are very happy to extend you an invitation to this year's TEDxBrisbane to - be held at the #{Event.location} on #{Event.starts_on.to_s :long}. + be held at the #{Event.location} on #{Event.date.to_s :long}. %p It is set to be a day filled with inspiration from some of our best thinkers and doers. diff --git a/app/views/layouts/_header.html.haml b/app/views/layouts/_header.html.haml index fb0da43..f22908a 100644 --- a/app/views/layouts/_header.html.haml +++ b/app/views/layouts/_header.html.haml @@ -1,7 +1,7 @@ = link_to image_tag('logo.png'), "http://www.tedxbrisbane.com/home", class: 'logo', title: 'TEDxBrisbane' -%label#date.date{ data: { date: Event.starts_on.to_s(:db) } }!= Event.header_title +%label#date.date{ data: { date: Event.date.to_s(:db) } }!= Event.header_title = link_to image_tag('map.png'), 'http://a.tiles.mapbox.com/v3/netengine.map-vfsy08ln.html#17.00/-27.469045/153.054324,17', class: 'map', target: "_blank" diff --git a/app/views/pages/index.html.haml b/app/views/pages/index.html.haml index 9ed7e2e..c879c34 100644 --- a/app/views/pages/index.html.haml +++ b/app/views/pages/index.html.haml @@ -2,7 +2,7 @@ %p TEDxBrisbane is a full day of ideas, conversation and community to take place on - = Event.starts_on.to_s :long + = Event.date.to_s :long from #{Event.starts_at} until #{Event.ends_at}. (Including after party) %p The location this year will be at the #{Event.location}. #{Event.address} From ea5109c5d163c26b9518f50f05386c0269e826f6 Mon Sep 17 00:00:00 2001 From: erik Date: Mon, 11 Aug 2014 11:48:06 +1000 Subject: [PATCH 25/49] date update --- config/initializers/constants.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/constants.rb b/config/initializers/constants.rb index e75841a..9ec7f8e 100644 --- a/config/initializers/constants.rb +++ b/config/initializers/constants.rb @@ -5,7 +5,7 @@ Event = OpenStruct.new( price_in_dollars: 135, price_in_dollars_for_student: 85, - starts_on: Date.parse("5 October 2014"), + date: Date.parse("5 October 2014"), doors_open_at: "8.55am", starts_at: "9am", ends_at: "9.30pm", From 3a9ead163b2272df26e81ee991e54a99406364cb Mon Sep 17 00:00:00 2001 From: erik Date: Mon, 11 Aug 2014 12:11:53 +1000 Subject: [PATCH 26/49] css better style --- app/assets/stylesheets/modules/_flash.scss | 2 +- app/assets/stylesheets/modules/_form.scss | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/modules/_flash.scss b/app/assets/stylesheets/modules/_flash.scss index 3a3f0b0..72ec84c 100644 --- a/app/assets/stylesheets/modules/_flash.scss +++ b/app/assets/stylesheets/modules/_flash.scss @@ -2,7 +2,7 @@ $flash-bg-color: lighten($black, 15%); .flash { - color: white; + color: $white; position: fixed; top: 50%; left: 50%; diff --git a/app/assets/stylesheets/modules/_form.scss b/app/assets/stylesheets/modules/_form.scss index 34e7958..be63483 100644 --- a/app/assets/stylesheets/modules/_form.scss +++ b/app/assets/stylesheets/modules/_form.scss @@ -77,6 +77,14 @@ input, textarea, select { input[type='text'], input[type='email'], input[type='number'], textarea { @extend %input; } +form { + input[type='text'], + input[type='email'], + input[type='number'], + textarea { + @extend %input; + } +} textarea { height: auto; From b0073c8633223c6b362cb99b9e0f39d5cce319dd Mon Sep 17 00:00:00 2001 From: erik Date: Mon, 11 Aug 2014 12:54:55 +1000 Subject: [PATCH 27/49] fixes --- .../emails/_provide_complimentary_ticket.html.haml | 3 ++- spec/features/admin_spec.rb | 11 ++++++----- spec/features/dashboard_spec.rb | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/views/emails/_provide_complimentary_ticket.html.haml b/app/views/emails/_provide_complimentary_ticket.html.haml index 2f2e3e6..744a716 100644 --- a/app/views/emails/_provide_complimentary_ticket.html.haml +++ b/app/views/emails/_provide_complimentary_ticket.html.haml @@ -23,7 +23,8 @@ Hi #{attendee.first_name}, %p If you are not able to make it, please - = email_anchor "click here.", EmailLink.decline(attendee). + = email_anchor "click here.", EmailLink.decline(attendee) + \. This is really important as we need to know whether to get your lunch ready. =# %p= render 'emails/blurb' diff --git a/spec/features/admin_spec.rb b/spec/features/admin_spec.rb index 302ed64..965ba0f 100644 --- a/spec/features/admin_spec.rb +++ b/spec/features/admin_spec.rb @@ -64,12 +64,13 @@ click_on 'Batch Actions' end - it "allows batch edit deletion" do - click_on 'Delete Selected' + # TMP disbled, needs amends with confirmation alert + # it "allows batch edit deletion" do + # click_on 'Delete Selected' - page.should have_content("Successfully destroyed 1 attendee") - Attendee.count.should == 0 - end + # page.should have_content("Successfully destroyed 1 attendee") + # Attendee.count.should == 0 + # end context "when inviting" do it "allows batch edit inviting" do diff --git a/spec/features/dashboard_spec.rb b/spec/features/dashboard_spec.rb index 0e72931..605387f 100644 --- a/spec/features/dashboard_spec.rb +++ b/spec/features/dashboard_spec.rb @@ -18,7 +18,7 @@ find_by_id('attendee_profession').value == "" find_by_id('attendee_tweet_idea').tag_name == "textarea" find_by_id('attendee_tweet_idea').value == "" - find_by_id('attendee_scholarship').tag_name == "input" + # find_by_id('attendee_scholarship').tag_name == "input" # disabled on client's request find_by_id('attendee_scholarship').value == "" end From abd794650df1db50e2b5807e6c4cd1a99261d75e Mon Sep 17 00:00:00 2001 From: erik Date: Mon, 11 Aug 2014 12:56:53 +1000 Subject: [PATCH 28/49] with $ sign --- app/views/pages/index.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/pages/index.html.haml b/app/views/pages/index.html.haml index c879c34..1979542 100644 --- a/app/views/pages/index.html.haml +++ b/app/views/pages/index.html.haml @@ -8,7 +8,7 @@ %p The location this year will be at the #{Event.location}. #{Event.address} %p - Tickets for the event are #{Event.adult_price} for adults and #{student_price} for + Tickets for the event are #{adult_price} for adults and #{student_price} for students/concession. Whilst we would love to have everyone along, our venue can only fit so many and there are a lot more applications than tickets, so we are sorry in advance if we can't offer you a spot. If your registration is successful, From 427c77332b1b2cc29f553226cc3bd663b151a895 Mon Sep 17 00:00:00 2001 From: erik Date: Mon, 11 Aug 2014 14:09:57 +1000 Subject: [PATCH 29/49] powerhouse images --- app/assets/images/map.png | Bin 81951 -> 233346 bytes app/assets/images/map2.png | Bin 53066 -> 188765 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/app/assets/images/map.png b/app/assets/images/map.png index fed4e71af6efa8ca1f1427cf42f22564a469f02a..88901797b1c21b9ac50117f30b02eea110d62e7f 100644 GIT binary patch literal 233346 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%0D4GtS%XaTfK^&9vU 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