diff --git a/Gemfile b/Gemfile index 851267c..1d0c2bd 100644 --- a/Gemfile +++ b/Gemfile @@ -5,15 +5,18 @@ gem 'pg' gem 'rake', '11.1.2' gem 'ruby_dep', '1.3.1' # Lock at 1.3.1 since 1.4 requires ruby 2.5. We should unlock once we upgrade the ruby version on our server +# gem 'bcrypt-ruby', '3.0.0', require: 'bcrypt' +# gem 'bcrypt', '3.1.9' +# gem 'bcrypt', require: :ruby gem 'rack-mini-profiler' gem 'haml' gem 'nokogiri', '~> 1.6.8.rc2' if Dir.exists?('../lingua_franca') - gem 'lingua_franca', :path => '../lingua_franca' + gem 'lingua_franca', :path => '../lingua_franca' else - gem 'lingua_franca', :git => 'git://github.com/lingua-franca/lingua_franca.git' + gem 'lingua_franca', :git => 'git://github.com/lingua-franca/lingua_franca.git' end gem 'tzinfo-data' @@ -21,15 +24,15 @@ gem 'sass' gem 'sass-rails' if Dir.exists?('../bumbleberry') - gem 'bumbleberry', :path => "../bumbleberry" + gem 'bumbleberry', :path => "../bumbleberry" else - gem 'bumbleberry', :git => 'git://github.com/bumbleberry/bumbleberry.git' + gem 'bumbleberry', :git => 'git://github.com/bumbleberry/bumbleberry.git' end if Dir.exists?('../paypal-express') - gem 'paypal-express', :path => "../paypal-express" + gem 'paypal-express', :path => "../paypal-express" else - gem 'paypal-express', :git => 'git://github.com/bikebike/paypal-express.git' + gem 'paypal-express', :git => 'git://github.com/bikebike/paypal-express.git' end gem 'uglifier', '>= 1.3.0' @@ -51,52 +54,52 @@ gem 'launchy' gem 'to_spreadsheet', :git => 'git://github.com/glebm/to_spreadsheet.git' group :test do - gem 'rspec' - gem 'rspec-rails' + gem 'rspec' + gem 'rspec-rails' end group :development do - gem 'better_errors' - gem 'binding_of_caller' - gem 'meta_request' - - gem 'capistrano', '~> 3.1' - gem 'capistrano-rails', '~> 1.1' - gem 'capistrano-faster-assets', '~> 1.0' - - gem 'eventmachine', :github => 'krzcho/eventmachine', :branch => 'master' - gem 'thin'# , :github => 'krzcho/thin', :branch => 'master' + gem 'better_errors' + gem 'binding_of_caller' + gem 'meta_request' + + gem 'capistrano', '~> 3.1' + gem 'capistrano-rails', '~> 1.1' + gem 'capistrano-faster-assets', '~> 1.0' + + gem 'eventmachine', :github => 'krzcho/eventmachine', :branch => 'master' + gem 'thin'# , :github => 'krzcho/thin', :branch => 'master' end group :test do - gem 'gherkin3', '>= 3.1.0' - gem 'cucumber' - gem 'cucumber-core' - gem 'cucumber-rails' - - gem 'poltergeist' - gem 'guard-rspec' - gem 'factory_girl_rails' - gem 'coveralls', require: false - gem 'selenium-webdriver' - gem 'simplecov', require: false - gem 'webmock', require: false - gem 'database_cleaner' - gem 'mocha' -end - -group :staging, :production, :preview do - gem 'rails_12factor' + gem 'gherkin3', '>= 3.1.0' + gem 'cucumber' + gem 'cucumber-core' + gem 'cucumber-rails' + + gem 'poltergeist' + gem 'guard-rspec' + gem 'factory_girl_rails' + gem 'coveralls', require: false + gem 'selenium-webdriver' + gem 'simplecov', require: false + gem 'webmock', require: false + gem 'database_cleaner' + gem 'mocha' end group :production, :preview do - gem 'unicorn' - gem 'daemon-spawn' - gem 'daemons' + gem 'rails_12factor' + gem 'daemon-spawn' + gem 'daemons' + + platforms :ruby do + gem 'unicorn' + end end platforms 'mswin', 'mingw' do - group :test do - gem 'wdm', '>= 0.1.0' - end + group :test do + gem 'wdm', '>= 0.1.0' + end end diff --git a/app/assets/stylesheets/bumbleberry-settings.json b/app/assets/stylesheets/bumbleberry-settings.json index c0bafee..0ca48d3 100644 --- a/app/assets/stylesheets/bumbleberry-settings.json +++ b/app/assets/stylesheets/bumbleberry-settings.json @@ -5,8 +5,8 @@ "chrome": ["51"] }, "development": { - "and_chr": ["55"], - "chrome": ["55"], + "and_chr": ["56"], + "chrome": ["56"], "edge": ["13"], "firefox": ["50"], "ie": ["11"], diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7f6039b..131f5da 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -78,11 +78,15 @@ class ApplicationController < LinguaFrancaApplicationController end def home - @workshops = Workshop.where(:conference_id => @conference.id) + @workshops = [] - if @conference.workshop_schedule_published - @event_dlg = true - get_scheule_data(false) + if @conference.present? + @workshops = Workshop.where(conference_id: @conference.id) + + if @conference.workshop_schedule_published + @event_dlg = true + get_scheule_data(false) + end end end diff --git a/app/controllers/conference_administration_controller.rb b/app/controllers/conference_administration_controller.rb index e64d547..193edb3 100644 --- a/app/controllers/conference_administration_controller.rb +++ b/app/controllers/conference_administration_controller.rb @@ -62,7 +62,10 @@ class ConferenceAdministrationController < ApplicationController set_flash_messages # redirect to the step unless the method handled redirection itself - unless self.send(method_name) + case self.send(method_name) + when true + administration_step(@admin_step) + when false redirect_to administration_step_path(@this_conference.slug, @admin_step) end end @@ -100,6 +103,9 @@ class ConferenceAdministrationController < ApplicationController end def administrate_broadcast + if @this_conference.start_date.blank? || @this_conference.end_date.blank? + @warning_message = :no_date_warning + end end def administrate_broadcast_sent @@ -120,6 +126,9 @@ class ConferenceAdministrationController < ApplicationController end def administrate_registration_status + if @this_conference.start_date.blank? || @this_conference.end_date.blank? + @warning_message = :no_date_warning + end end def administrate_organizations @@ -165,6 +174,11 @@ class ConferenceAdministrationController < ApplicationController end def administrate_registrations + if @this_conference.start_date.blank? || @this_conference.end_date.blank? + @warning_message = :no_date_warning + return + end + get_stats(!request.format.xlsx?) if request.format.xlsx? @@ -200,6 +214,11 @@ class ConferenceAdministrationController < ApplicationController end def administrate_stats + if @this_conference.start_date.blank? || @this_conference.end_date.blank? + @warning_message = :no_date_warning + return + end + get_stats(!request.format.xlsx?) if request.format.xlsx? @@ -736,7 +755,7 @@ class ConferenceAdministrationController < ApplicationController end else do_404 - return true + return nil end return false @@ -945,7 +964,7 @@ class ConferenceAdministrationController < ApplicationController do_404 end - return true + return nil end def admin_update_housing @@ -985,7 +1004,7 @@ class ConferenceAdministrationController < ApplicationController do_404 end - return true + return nil end def admin_update_broadcast @@ -1007,7 +1026,7 @@ class ConferenceAdministrationController < ApplicationController end end redirect_to administration_step_path(@this_conference.slug, :broadcast_sent) - return true + return nil elsif params[:button] == 'preview' @send_to_count = view_context.broadcast_to(@send_to).size @broadcast_step = :preview @@ -1024,7 +1043,7 @@ class ConferenceAdministrationController < ApplicationController end @send_to_count = view_context.broadcast_to(@send_to).size end - return false + return true end def admin_update_locations @@ -1087,14 +1106,14 @@ class ConferenceAdministrationController < ApplicationController end do_404 - return true + return nil end def admin_update_events case params[:button] when 'edit' redirect_to edit_event_path(@this_conference.slug, params[:id]) - return true + return nil when 'save' if params[:id].present? event = Event.find_by!(conference_id: @this_conference.id, id: params[:id]) @@ -1124,7 +1143,7 @@ class ConferenceAdministrationController < ApplicationController end do_404 - return true + return nil end def admin_update_workshop_times @@ -1141,7 +1160,7 @@ class ConferenceAdministrationController < ApplicationController end do_404 - return true + return nil end def admin_update_schedule @@ -1155,7 +1174,6 @@ class ConferenceAdministrationController < ApplicationController @entire_page = false get_scheule_data render partial: 'schedule' - return true when 'get-workshop-list' get_scheule_data(true) @@ -1171,7 +1189,6 @@ class ConferenceAdministrationController < ApplicationController end render partial: 'select_workshop_table' - return true when 'set-workshop' workshop = Workshop.find_by!(conference_id: @this_conference.id, id: params[:workshop].to_i) workshop.event_location_id = params[:location] @@ -1183,11 +1200,11 @@ class ConferenceAdministrationController < ApplicationController get_scheule_data render partial: 'schedule' - return true + else + do_404 end - do_404 - return true + return nil end def admin_update_schedule diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 1fbd759..9c9797b 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -991,7 +991,8 @@ module ApplicationHelper def administration_sub_steps { location_edit: :locations, - event_edit: :events + event_edit: :events, + broadcast_sent: :broadcast } end diff --git a/app/models/event_location.rb b/app/models/event_location.rb index bb09ffb..a179995 100644 --- a/app/models/event_location.rb +++ b/app/models/event_location.rb @@ -4,22 +4,21 @@ require 'geocoder/railtie' Geocoder::Railtie.insert class EventLocation < ActiveRecord::Base - belongs_to :conference - geocoded_by :full_address + belongs_to :conference + geocoded_by :full_address - reverse_geocoded_by :latitude, :longitude, :address => :full_address - after_validation :geocode, if: ->(obj){ obj.address_changed? } + reverse_geocoded_by :latitude, :longitude, :address => :full_address + after_validation :geocode, if: ->(obj){ obj.address_changed? } - def full_address - l = conference.location - [address, l.city, l.territory, l.country].join(', ') - end + def full_address + [address, conference.city.city, conference.city.territory, conference.city.country].join(', ') + end - def self.all_spaces - Workshop.all_spaces + [:event_space] - end + def self.all_spaces + Workshop.all_spaces + [:event_space] + end - def self.all_amenities - Workshop.all_needs - end + def self.all_amenities + Workshop.all_needs + end end diff --git a/app/views/application/home.html.haml b/app/views/application/home.html.haml index 8e827c1..4d3d522 100644 --- a/app/views/application/home.html.haml +++ b/app/views/application/home.html.haml @@ -1,5 +1,5 @@ - content_for :og_image do - = @conference.poster.full.url || image_path('default_poster.jpg') -- if @conferences + = (@conference.present? ? @conference.poster.full.url : nil) || image_path('default_poster.jpg') +- if @conferences.present? - @conferences.each do | conference | = render 'conferences/conference', conference: conference, links: [ :read_more, :register ] diff --git a/app/views/conference_administration/_broadcast.html.haml b/app/views/conference_administration/_broadcast.html.haml index 2990e25..ff1ae50 100644 --- a/app/views/conference_administration/_broadcast.html.haml +++ b/app/views/conference_administration/_broadcast.html.haml @@ -1,23 +1,27 @@ -= columns(medium: 12) do - = admin_update_form do - - if @broadcast_step == :preview || @broadcast_step == :test - = hidden_field_tag :subject, @subject - = hidden_field_tag :body, @body - = hidden_field_tag :send_to, @send_to - - if @broadcast_step == :preview - %p= _'articles.conference_registration.paragraphs.admin.broadcast.test', vars: { send_to_count: "#{(@send_to_count || 0)}".html_safe } +- if @warning_message + = columns(medium: 12) do + .warning-info=_"articles.admin.registrations.#{@warning_message}" +- else + = columns(medium: 12) do + = admin_update_form do + - if @broadcast_step == :preview || @broadcast_step == :test + = hidden_field_tag :subject, @subject + = hidden_field_tag :body, @body + = hidden_field_tag :send_to, @send_to + - if @broadcast_step == :preview + %p= _'articles.conference_registration.paragraphs.admin.broadcast.test', vars: { send_to_count: "#{(@send_to_count || 0)}".html_safe } + - else + .warning-info.make-room= _'articles.conference_registration.paragraphs.admin.broadcast.preview', vars: { send_to_count: "#{(@send_to_count || 0)}".html_safe } + .test-preview + %h3=@subject + = richtext @body, 4 + .actions.right + = button_tag :test, value: :test, class: :secondary if @broadcast_step == :preview + = button_with_confirmation :send, (_'modals.admin.broadcast.confirm', vars: { number: "#{(@send_to_count || 0)}".html_safe }), value: :send, class: :delete if @broadcast_step == :test + = button_tag :edit, value: :edit - else - .warning-info.make-room= _'articles.conference_registration.paragraphs.admin.broadcast.preview', vars: { send_to_count: "#{(@send_to_count || 0)}".html_safe } - .test-preview - %h3=@subject - = richtext @body, 4 - .actions.right - = button_tag :test, value: :test, class: :secondary if @broadcast_step == :preview - = button_with_confirmation :send, (_'modals.admin.broadcast.confirm', vars: { number: "#{(@send_to_count || 0)}".html_safe }), value: :send, class: :delete if @broadcast_step == :test - = button_tag :edit, value: :edit - - else - = selectfield :send_to, nil, broadcast_options, full: true - = textfield :subject, @subject, required: true, big: true - = textarea :body, @body, lang: @this_conference.locale, edit_on: :focus - .actions.right - = button_tag :preview, value: :preview + = selectfield :send_to, nil, broadcast_options, full: true + = textfield :subject, @subject, required: true, big: true + = textarea :body, @body, lang: @this_conference.locale, edit_on: :focus + .actions.right + = button_tag :preview, value: :preview diff --git a/app/views/conference_administration/_registration_status.html.haml b/app/views/conference_administration/_registration_status.html.haml index 7558d58..7fef8de 100644 --- a/app/views/conference_administration/_registration_status.html.haml +++ b/app/views/conference_administration/_registration_status.html.haml @@ -1,5 +1,9 @@ -= columns(medium: 12) do - = form_tag administration_update_path(@this_conference.slug, @admin_step) do - = selectfield :registration_status, @this_conference.registration_status || 'closed', registration_status_options_list, inline_label: true - .actions.left - = button_tag :save, value: :save +- if @warning_message + = columns(medium: 12) do + .warning-info=_"articles.admin.registrations.#{@warning_message}" +- else + = columns(medium: 12) do + = form_tag administration_update_path(@this_conference.slug, @admin_step) do + = selectfield :registration_status, @this_conference.registration_status || 'closed', registration_status_options_list, inline_label: true + .actions.left + = button_tag :save, value: :save diff --git a/app/views/conference_administration/_registrations.html.haml b/app/views/conference_administration/_registrations.html.haml index 25f07e0..c6a24fa 100644 --- a/app/views/conference_administration/_registrations.html.haml +++ b/app/views/conference_administration/_registrations.html.haml @@ -1,17 +1,21 @@ -- add_inline_script :registrations -= columns(medium: 12) do - .goes-fullscreen#registrations-table - .flex-column - = searchfield :search, nil, big: true, stretch: true - %a.button{data: { expands: 'registrations-table' }}='expand' - %a.button.delete{data: { contracts: 'registrations-table' }}='close' - %a.button.modify{data: { 'opens-modal': 'new-registration' }}='+' - .table-scroller - = html_table @excel_data, registrations_table_options - = admin_update_form id: 'new-registration', class: 'modal-edit' do - .modal-edit-overlay{data: { 'closes-modal': 'new-registration' }} - .modal-edit-content - = html_edit_table @excel_data, registrations_edit_table_options - .actions.right - %a.button.subdued{data: { 'closes-modal': 'new-registration' }}='Cancel' - = button_tag :save, value: :save, class: :modify +- if @warning_message + = columns(medium: 12) do + .warning-info=_"articles.admin.registrations.#{@warning_message}" +- else + - add_inline_script :registrations + = columns(medium: 12) do + .goes-fullscreen#registrations-table + .flex-column + = searchfield :search, nil, big: true, stretch: true + %a.button{data: { expands: 'registrations-table' }}='expand' + %a.button.delete{data: { contracts: 'registrations-table' }}='close' + %a.button.modify{data: { 'opens-modal': 'new-registration' }}='+' + .table-scroller + = html_table @excel_data, registrations_table_options + = admin_update_form id: 'new-registration', class: 'modal-edit' do + .modal-edit-overlay{data: { 'closes-modal': 'new-registration' }} + .modal-edit-content + = html_edit_table @excel_data, registrations_edit_table_options + .actions.right + %a.button.subdued{data: { 'closes-modal': 'new-registration' }}='Cancel' + = button_tag :save, value: :save, class: :modify diff --git a/app/views/conference_administration/_stats.html.haml b/app/views/conference_administration/_stats.html.haml index 5cd1972..da621f1 100644 --- a/app/views/conference_administration/_stats.html.haml +++ b/app/views/conference_administration/_stats.html.haml @@ -1,21 +1,25 @@ -= columns(medium: 12) do - .details - = data_set(:h3, 'articles.admin.stats.headings.completed_registrations') do - = (@completed_registrations || 0).to_s - = data_set(:h3, 'articles.admin.stats.headings.incomplete_registrations') do - = ((@registration_count - @completed_registrations) || 0).to_s - = data_set(:h3, 'articles.admin.stats.headings.bikes') do - = (@completed_registrations || 0) > 0 ? "#{@bikes} (#{number_to_percentage(@bikes / @completed_registrations.to_f * 100.0)})" : "0" - = data_set(:h3, 'articles.admin.stats.headings.food.meat') do - = (@food[:all] || 0) > 0 ? "#{@food[:meat]} (#{number_to_percentage(@food[:meat] / @food[:all].to_f * 100.0)})" : "0" - = data_set(:h3, 'articles.admin.stats.headings.food.vegetarian') do - = (@food[:all] || 0) > 0 ? "#{@food[:vegetarian]} (#{number_to_percentage(@food[:vegetarian] / @food[:all].to_f * 100.0)})" : "0" - = data_set(:h3, 'articles.admin.stats.headings.food.vegan') do - = (@food[:all] || 0) > 0 ? "#{@food[:vegan]} (#{number_to_percentage(@food[:vegan] / @food[:all].to_f * 100.0)})" : "0" - = data_set(:h3, 'articles.admin.stats.headings.donation_count') do - = (@completed_registrations || 0) > 0 ? "#{@donation_count} (#{number_to_percentage(@donation_count / @completed_registrations.to_f * 100.0)})" : "0" - = data_set(:h3, 'articles.admin.stats.headings.donation_total') do - = "$#{@donations || 0.00}" - .actions - = link_to (_'links.download.Excel'), administration_step_path(@this_conference.slug, :stats, :format => :xlsx), class: [:button, :download] - = link_to (_'links.download.Organizations_Excel'), administration_step_path(@this_conference.slug, :organizations, :format => :xlsx), class: [:button, :download, :subdued] +- if @warning_message + = columns(medium: 12) do + .warning-info=_"articles.admin.registrations.#{@warning_message}" +- else + = columns(medium: 12) do + .details + = data_set(:h3, 'articles.admin.stats.headings.completed_registrations') do + = (@completed_registrations || 0).to_s + = data_set(:h3, 'articles.admin.stats.headings.incomplete_registrations') do + = ((@registration_count - @completed_registrations) || 0).to_s + = data_set(:h3, 'articles.admin.stats.headings.bikes') do + = (@completed_registrations || 0) > 0 ? "#{@bikes} (#{number_to_percentage(@bikes / @completed_registrations.to_f * 100.0)})" : "0" + = data_set(:h3, 'articles.admin.stats.headings.food.meat') do + = (@food[:all] || 0) > 0 ? "#{@food[:meat]} (#{number_to_percentage(@food[:meat] / @food[:all].to_f * 100.0)})" : "0" + = data_set(:h3, 'articles.admin.stats.headings.food.vegetarian') do + = (@food[:all] || 0) > 0 ? "#{@food[:vegetarian]} (#{number_to_percentage(@food[:vegetarian] / @food[:all].to_f * 100.0)})" : "0" + = data_set(:h3, 'articles.admin.stats.headings.food.vegan') do + = (@food[:all] || 0) > 0 ? "#{@food[:vegan]} (#{number_to_percentage(@food[:vegan] / @food[:all].to_f * 100.0)})" : "0" + = data_set(:h3, 'articles.admin.stats.headings.donation_count') do + = (@completed_registrations || 0) > 0 ? "#{@donation_count} (#{number_to_percentage(@donation_count / @completed_registrations.to_f * 100.0)})" : "0" + = data_set(:h3, 'articles.admin.stats.headings.donation_total') do + = "$#{@donations || 0.00}" + .actions + = link_to (_'links.download.Excel'), administration_step_path(@this_conference.slug, :stats, :format => :xlsx), class: [:button, :download] + = link_to (_'links.download.Organizations_Excel'), administration_step_path(@this_conference.slug, :organizations, :format => :xlsx), class: [:button, :download, :subdued] diff --git a/app/views/conference_administration/administration_step.html.haml b/app/views/conference_administration/administration_step.html.haml index b35ea89..b45ea15 100644 --- a/app/views/conference_administration/administration_step.html.haml +++ b/app/views/conference_administration/administration_step.html.haml @@ -35,4 +35,4 @@ = columns(medium: 12) do %p=((_"articles.admin.#{@admin_group}.descriptions.#{@admin_step}", :s)) unless @hide_description === true = row do - = render @admin_step + = render @admin_step.to_s diff --git a/app/views/conferences/stats.html.haml b/app/views/conference_administration/stats.html.haml similarity index 97% rename from app/views/conferences/stats.html.haml rename to app/views/conference_administration/stats.html.haml index 98e9848..ba4bd86 100644 --- a/app/views/conferences/stats.html.haml +++ b/app/views/conference_administration/stats.html.haml @@ -1,63 +1,63 @@ -= render 'page_header', :page_key => 'Registration_Stats' -%article - = row do - = columns(medium: 12) do - %h2=_'articles.conference_registration.headings.Stats' - %p=_'articles.conference_registration.paragraphs.Stats', :p - = link_to (_'links.download.Excel','Download Data in Excel Format'), stats_path(@this_conference.slug, :format => :xls), {:class => :button} - = columns(medium: 6) do - %ul.stats - %li - %h3=_'articles.conference_registration.terms.Total_Registrations' - .stat.important=_!@total_registrations - %li.money - %h3=_'articles.conference_registration.terms.Total_Donations' - .stat=money @total_donations - %li - %h3=_'articles.conference_registration.terms.Donation_Count' - .stat - = _!"#{@donation_count} / #{@total_registrations}" - %li - %h3=_'articles.conference_registration.terms.Housing' - .breakdown - - @housing.each do |h, v| - - unless h == :none - .stat-with-label - .label=_"articles.conference_registration.questions.housing.#{h}" - .stat=_!v - %li - %h3=_'articles.conference_registration.terms.Bikes' - .breakdown - .stat=_!"#{@bike_count} / #{@total_registrations}" - - @bikes.each do |h, v| - - unless h == :none - .stat-with-label - .label=_"articles.conference_registration.questions.bike.#{h}" - .stat.percent=_!percent(v.to_f / @bike_count) - %li - %h3=_'articles.conference_registration.terms.Food' - .breakdown - - @food.each do |h, v| - .stat-with-label - .label=_"articles.conference_registration.questions.food.#{h}" - .stat.percent=_!percent(v.to_f / @total_registrations) - %li - %h3=_'articles.conference_registration.terms.Languages' - .breakdown - - @languages.each do |h, v| - .stat-with-label - .label=_"languages.#{h}" - .stat.percent=_!percent(v.to_f / @total_registrations) - = columns(medium: 6) do - .allergies - %h3=_'articles.conference_registration.headings.Allergies' - %ul - - @allergies.each do |a| - %li - %p=_!a - .other - %h3=_'articles.conference_registration.headings.other' - %ul - - @other.each do |o| - %li - %p=_!o += render 'page_header', :page_key => 'Registration_Stats' +%article + = row do + = columns(medium: 12) do + %h2=_'articles.conference_registration.headings.Stats' + %p=_'articles.conference_registration.paragraphs.Stats', :p + = link_to (_'links.download.Excel','Download Data in Excel Format'), stats_path(@this_conference.slug, :format => :xls), {:class => :button} + = columns(medium: 6) do + %ul.stats + %li + %h3=_'articles.conference_registration.terms.Total_Registrations' + .stat.important=_!@total_registrations + %li.money + %h3=_'articles.conference_registration.terms.Total_Donations' + .stat=money @total_donations + %li + %h3=_'articles.conference_registration.terms.Donation_Count' + .stat + = _!"#{@donation_count} / #{@total_registrations}" + %li + %h3=_'articles.conference_registration.terms.Housing' + .breakdown + - @housing.each do |h, v| + - unless h == :none + .stat-with-label + .label=_"articles.conference_registration.questions.housing.#{h}" + .stat=_!v + %li + %h3=_'articles.conference_registration.terms.Bikes' + .breakdown + .stat=_!"#{@bike_count} / #{@total_registrations}" + - @bikes.each do |h, v| + - unless h == :none + .stat-with-label + .label=_"articles.conference_registration.questions.bike.#{h}" + .stat.percent=_!percent(v.to_f / @bike_count) + %li + %h3=_'articles.conference_registration.terms.Food' + .breakdown + - @food.each do |h, v| + .stat-with-label + .label=_"articles.conference_registration.questions.food.#{h}" + .stat.percent=_!percent(v.to_f / @total_registrations) + %li + %h3=_'articles.conference_registration.terms.Languages' + .breakdown + - @languages.each do |h, v| + .stat-with-label + .label=_"languages.#{h}" + .stat.percent=_!percent(v.to_f / @total_registrations) + = columns(medium: 6) do + .allergies + %h3=_'articles.conference_registration.headings.Allergies' + %ul + - @allergies.each do |a| + %li + %p=_!a + .other + %h3=_'articles.conference_registration.headings.other' + %ul + - @other.each do |o| + %li + %p=_!o diff --git a/app/views/conferences/stats.xlsx.haml b/app/views/conference_administration/stats.xlsx.haml similarity index 96% rename from app/views/conferences/stats.xlsx.haml rename to app/views/conference_administration/stats.xlsx.haml index 7490ac9..54d73d1 100644 --- a/app/views/conferences/stats.xlsx.haml +++ b/app/views/conference_administration/stats.xlsx.haml @@ -1 +1 @@ -= excel_table(@excel_data) += excel_table(@excel_data) diff --git a/config/environments/preview.rb b/config/environments/preview.rb index 8c77f27..f39d999 100644 --- a/config/environments/preview.rb +++ b/config/environments/preview.rb @@ -1,105 +1,104 @@ BikeBike::Application.configure do - # Settings specified here will take precedence over those in config/application.rb. + # Settings specified here will take precedence over those in config/application.rb. - # Code is not reloaded between requests. - config.cache_classes = true + # Code is not reloaded between requests. + config.cache_classes = true - # Eager load code on boot. This eager loads most of Rails and - # your application in memory, allowing both thread web servers - # and those relying on copy on write to perform better. - # Rake tasks automatically ignore this option for performance. - config.eager_load = true + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both thread web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true - # Full error reports are disabled and caching is turned on. - config.consider_all_requests_local = false - config.action_controller.perform_caching = true + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true - # Enable Rack::Cache to put a simple HTTP cache in front of your application - # Add `rack-cache` to your Gemfile before enabling this. - # For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid. - # config.action_dispatch.rack_cache = true + # Enable Rack::Cache to put a simple HTTP cache in front of your application + # Add `rack-cache` to your Gemfile before enabling this. + # For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid. + # config.action_dispatch.rack_cache = true - # Disable Rails's static asset server (Apache or nginx will already do this). - config.serve_static_files = true + # Disable Rails's static asset server (Apache or nginx will already do this). + config.serve_static_files = true - # Compress JavaScripts and CSS. - config.assets.js_compressor = :uglifier - # config.assets.css_compressor = :sass + # Compress JavaScripts and CSS. + config.assets.js_compressor = :uglifier + # config.assets.css_compressor = :sass - # Do not fallback to assets pipeline if a precompiled asset is missed. - #config.assets.compile = true + # Do not fallback to assets pipeline if a precompiled asset is missed. + #config.assets.compile = true - # Generate digests for assets URLs. - config.assets.digest = true + # Generate digests for assets URLs. + config.assets.digest = true - # Version of your assets, change this if you want to expire all your assets. - config.assets.version = '1.0101' + # Version of your assets, change this if you want to expire all your assets. + config.assets.version = '1.0101' - # Specifies the header that your server uses for sending files. - # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache - # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx - # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. - #config.force_ssl = true + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + #config.force_ssl = true - # Set to :debug to see everything in the log. - config.log_level = :info + # Set to :debug to see everything in the log. + config.log_level = :info - #config.cache_classes = true - #config.serve_static_assets = true - #config.assets.compile = true - # config.assets.digest = true + #config.cache_classes = true + #config.serve_static_assets = true + #config.assets.compile = true + # config.assets.digest = true - # Prepend all log lines with the following tags. - # config.log_tags = [ :subdomain, :uuid ] + # Prepend all log lines with the following tags. + # config.log_tags = [ :subdomain, :uuid ] - # Use a different logger for distributed setups. - # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) + # Use a different logger for distributed setups. + # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) - # Use a different cache store in production. - # config.cache_store = :mem_cache_store + # Use a different cache store in production. + # config.cache_store = :mem_cache_store - # Enable serving of images, stylesheets, and JavaScripts from an asset server. - # config.action_controller.asset_host = "http://assets.example.com" + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = "http://assets.example.com" - # Precompile additional assets. - # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. - # config.assets.precompile += %w( search.js ) - config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif) - #config.action_controller.asset_host = "https://preview-cdn.bikebike.org" + # Precompile additional assets. + # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. + # config.assets.precompile += %w( search.js ) + config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif) + #config.action_controller.asset_host = "https://preview-cdn.bikebike.org" - # Ignore bad email addresses and do not raise email delivery errors. - # Set this to true and configure the email server for immediate delivery to raise delivery errors. - # config.action_mailer.raise_delivery_errors = false + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false - # Enable locale fallbacks for I18n (makes lookups for any locale fall back to - # the I18n.default_locale when a translation can not be found). - config.i18n.fallbacks = true + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation can not be found). + config.i18n.fallbacks = true - # Send deprecation notices to registered listeners. - config.active_support.deprecation = :notify + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify - # Disable automatic flushing of the log to improve performance. - # config.autoflush_log = false + # Disable automatic flushing of the log to improve performance. + # config.autoflush_log = false - # Use default logging formatter so that PID and timestamp are not suppressed. - config.log_formatter = ::Logger::Formatter.new + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new - config.action_mailer.delivery_method = :smtp - config.action_mailer.smtp_settings = { - :address => 'mail.bikebike.org', - :domain => 'preview.bikebike.org', - :port => 587, - :authentication => :plain, - :enable_starttls_auto => true, - :openssl_verify_mode => 'none', - :user_name => 'info@preview.bikebike.org', - :password => 'test' - } - config.action_mailer.raise_delivery_errors = true - config.action_mailer.perform_deliveries = true + config.action_mailer.delivery_method = :smtp + config.action_mailer.smtp_settings = { + :address => 'smtp.gmail.com', + :domain => 'localhost:3000', + :port => 587, + :authentication => :plain, + :enable_starttls_auto => true, + :user_name => ENV['MAILER_USER'], + :password => ENV['MAILER_PASSWORD'] + } + config.action_mailer.raise_delivery_errors = true + config.action_mailer.perform_deliveries = true - I18n.config.language_detection_method = I18n::Config::DETECT_LANGUAGE_FROM_SUBDOMAIN - I18n.config.subdomain_format = 'preview-%' - I18n.config.host_locale_regex = /^preview\-([a-z]{2})\.[^\.]+\..*$/ + I18n.config.language_detection_method = I18n::Config::DETECT_LANGUAGE_FROM_SUBDOMAIN + I18n.config.subdomain_format = 'preview-%' + I18n.config.host_locale_regex = /^preview\-([a-z]{2})\.[^\.]+\..*$/ end diff --git a/config/environments/production.rb b/config/environments/production.rb index c10c435..82fd268 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,103 +1,102 @@ BikeBike::Application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # Code is not reloaded between requests. - config.cache_classes = true - - # Eager load code on boot. This eager loads most of Rails and - # your application in memory, allowing both thread web servers - # and those relying on copy on write to perform better. - # Rake tasks automatically ignore this option for performance. - config.eager_load = true - - # Full error reports are disabled and caching is turned on. - config.consider_all_requests_local = false - config.action_controller.perform_caching = true - - # Enable Rack::Cache to put a simple HTTP cache in front of your application - # Add `rack-cache` to your Gemfile before enabling this. - # For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid. - # config.action_dispatch.rack_cache = true - - # Disable Rails's static asset server (Apache or nginx will already do this). - config.serve_static_files = true - - # Compress JavaScripts and CSS. - config.assets.js_compressor = :uglifier - # config.assets.css_compressor = :sass - - # Do not fallback to assets pipeline if a precompiled asset is missed. - #config.assets.compile = true - - # Generate digests for assets URLs. - config.assets.digest = true - - # Version of your assets, change this if you want to expire all your assets. - config.assets.version = '1.01' - - # Specifies the header that your server uses for sending files. - # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache - # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx - - # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. - #config.force_ssl = true - - # Set to :debug to see everything in the log. - config.log_level = :info - - #config.cache_classes = true - #config.serve_static_assets = true - #config.assets.compile = true - # config.assets.digest = true - - # Prepend all log lines with the following tags. - # config.log_tags = [ :subdomain, :uuid ] - - # Use a different logger for distributed setups. - # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) - - # Use a different cache store in production. - # config.cache_store = :mem_cache_store - - # Enable serving of images, stylesheets, and JavaScripts from an asset server. - # config.action_controller.asset_host = "http://assets.example.com" - - # Precompile additional assets. - # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. - # config.assets.precompile += %w( search.js ) - #config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif) - config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif *.svg) - #config.action_controller.asset_host = "https://cdn.bikebike.org" - - # Ignore bad email addresses and do not raise email delivery errors. - # Set this to true and configure the email server for immediate delivery to raise delivery errors. - # config.action_mailer.raise_delivery_errors = false - - # Enable locale fallbacks for I18n (makes lookups for any locale fall back to - # the I18n.default_locale when a translation can not be found). - config.i18n.fallbacks = true - - # Send deprecation notices to registered listeners. - config.active_support.deprecation = :notify - - # Disable automatic flushing of the log to improve performance. - # config.autoflush_log = false - - # Use default logging formatter so that PID and timestamp are not suppressed. - config.log_formatter = ::Logger::Formatter.new - - config.action_mailer.delivery_method = :smtp - config.action_mailer.smtp_settings = { - :address => 'mail.bikebike.org', - :domain => 'preview.bikebike.org', - :port => 587, - :authentication => :plain, - :enable_starttls_auto => true, - :openssl_verify_mode => 'none', - :user_name => 'info@preview.bikebike.org', - :password => 'test' - } - config.action_mailer.raise_delivery_errors = true - config.action_mailer.perform_deliveries = true - I18n.config.language_detection_method = I18n::Config::DETECT_LANGUAGE_FROM_SUBDOMAIN + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both thread web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Enable Rack::Cache to put a simple HTTP cache in front of your application + # Add `rack-cache` to your Gemfile before enabling this. + # For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid. + # config.action_dispatch.rack_cache = true + + # Disable Rails's static asset server (Apache or nginx will already do this). + config.serve_static_files = true + + # Compress JavaScripts and CSS. + config.assets.js_compressor = :uglifier + # config.assets.css_compressor = :sass + + # Do not fallback to assets pipeline if a precompiled asset is missed. + #config.assets.compile = true + + # Generate digests for assets URLs. + config.assets.digest = true + + # Version of your assets, change this if you want to expire all your assets. + config.assets.version = '1.01' + + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + #config.force_ssl = true + + # Set to :debug to see everything in the log. + config.log_level = :info + + #config.cache_classes = true + #config.serve_static_assets = true + #config.assets.compile = true + # config.assets.digest = true + + # Prepend all log lines with the following tags. + # config.log_tags = [ :subdomain, :uuid ] + + # Use a different logger for distributed setups. + # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = "http://assets.example.com" + + # Precompile additional assets. + # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. + # config.assets.precompile += %w( search.js ) + #config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif) + config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif *.svg) + #config.action_controller.asset_host = "https://cdn.bikebike.org" + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation can not be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Disable automatic flushing of the log to improve performance. + # config.autoflush_log = false + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new + + config.action_mailer.delivery_method = :smtp + config.action_mailer.smtp_settings = { + :address => 'smtp.gmail.com', + :domain => 'localhost:3000', + :port => 587, + :authentication => :plain, + :enable_starttls_auto => true, + :user_name => ENV['MAILER_USER'], + :password => ENV['MAILER_PASSWORD'] + } + config.action_mailer.raise_delivery_errors = true + config.action_mailer.perform_deliveries = true + I18n.config.language_detection_method = I18n::Config::DETECT_LANGUAGE_FROM_SUBDOMAIN end diff --git a/config/locales/en.yml b/config/locales/en.yml index 7183d34..3bb98c0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -961,6 +961,8 @@ en: completed_registrations: Number of registrations incomplete_registrations: Incomplete registrations Registrations: Registrations + registrations: + no_date_warning: Before users can register, you must first set your conference start and end dates. meals: description: On this page you can schedule the meals that you will be serving. no_locations_warning: Before you can add meals, you must first add locations. @@ -1054,12 +1056,14 @@ en: stats: Statistics registrations: Modify Registrations broadcast: Contact Users + broadcast_sent: You email has been dispatched description: Open or close registration, view registration statistics, modify information subbmitted by registratnts and contact users. descriptions: registration_status: Open or close registration to your conference. stats: View a breakdown of statictics, how many users have registered, how much money have been collected, etc. registrations: View and edit all data collected through the registration process. broadcast: Send emails to targeted subsets of users. + broadcast_sent: Your email has been queued to send, depending on the number of users you have sent to, it may take several hours to send to everyone. broadcast: heading: Broadcast description: The broadcast tool is used to contact users through email. You can send messages en masse to select groups of users. diff --git a/db/schema.rb b/db/schema.rb index 0edeb71..f2e36ba 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -16,15 +16,6 @@ ActiveRecord::Schema.define(version: 20170111172147) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" - create_table "applications", force: :cascade do |t| - t.string "slug" - t.string "name" - t.string "path" - t.string "url" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end - create_table "authentications", force: :cascade do |t| t.integer "user_id", null: false t.string "provider", null: false