Merge branch 'master' into payment_end_date

This commit is contained in:
James Mason 2017-12-11 15:10:50 -08:00 • committed by GitHub
commit 4ce142d0e3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
186 changed files with 1570 additions and 512 deletions

2
.gitignore vendored
View file

@ -38,3 +38,5 @@ pickle-email-*.html
.env.local
docker-compose.env
docker-compose.yml
.DS_Store
.byebug_history

View file

@ -1,19 +1,11 @@
# This configuration was generated by
# `rubocop --auto-gen-config`
# on 2017-07-14 12:03:16 +0000 using RuboCop version 0.49.1.
# on 2017-11-27 22:40:12 +0530 using RuboCop version 0.51.0.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
# Offense count: 15
# Cop supports --auto-correct.
# Configuration parameters: Include, TreatCommentsAsGroupSeparators.
# Include: **/Gemfile, **/gems.rb
Bundler/OrderedGems:
Exclude:
- 'Gemfile'
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, IndentationWidth.
@ -46,7 +38,7 @@ Layout/EmptyLineAfterMagicComment:
Exclude:
- 'spec/models/conference_spec.rb'
# Offense count: 104
# Offense count: 109
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: empty_lines, no_empty_lines
@ -151,7 +143,7 @@ Layout/MultilineHashBraceLayout:
Layout/MultilineMethodCallBraceLayout:
Enabled: false
# Offense count: 55
# Offense count: 53
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, IndentationWidth.
# SupportedStyles: aligned, indented, indented_relative_to_receiver
@ -192,10 +184,11 @@ Layout/SpaceAroundOperators:
Exclude:
- 'lib/tasks/data.rake'
# Offense count: 416
# Offense count: 463
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# Configuration parameters: EnforcedStyle, SupportedStyles, SupportedStylesForEmptyBraces.
# SupportedStyles: space, no_space
# SupportedStylesForEmptyBraces: space, no_space
Layout/SpaceBeforeBlockBraces:
Enabled: false
@ -205,20 +198,13 @@ Layout/SpaceBeforeComma:
Exclude:
- 'lib/tasks/data_demo.rake'
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: AllowForAlignment.
Layout/SpaceBeforeFirstArg:
Exclude:
- 'spec/controllers/admin/roles_controller_spec.rb'
# Offense count: 1
# Cop supports --auto-correct.
Layout/SpaceBeforeSemicolon:
Exclude:
- 'Guardfile'
# Offense count: 51
# Offense count: 54
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, EnforcedStyleForEmptyBraces, SupportedStylesForEmptyBraces, SpaceBeforeBlockParameters.
# SupportedStyles: space, no_space
@ -293,6 +279,13 @@ Lint/IneffectiveAccessModifier:
- 'app/models/conference.rb'
# Offense count: 2
Lint/RescueWithoutErrorClass:
Exclude:
- 'app/controllers/users/omniauth_callbacks_controller.rb'
- 'lib/tasks/migrate_config.rake'
# Offense count: 2
# Cop supports --auto-correct.
Lint/ScriptPermission:
Exclude:
- 'Guardfile'
@ -305,49 +298,41 @@ Lint/UnusedBlockArgument:
Exclude:
- 'lib/tasks/user.rake'
# Offense count: 114
# Offense count: 136
Metrics/AbcSize:
Max: 86
# Offense count: 233
# Offense count: 258
# Configuration parameters: CountComments, ExcludedMethods.
Metrics/BlockLength:
Max: 471
# Offense count: 23
# Offense count: 28
Metrics/CyclomaticComplexity:
Max: 12
Exclude:
- 'app/models/track.rb'
Max: 14
# Offense count: 2353
# Offense count: 2774
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
# URISchemes: http, https
Metrics/LineLength:
Max: 619
# Offense count: 120
# Offense count: 133
# Configuration parameters: CountComments.
Metrics/MethodLength:
Max: 56
Exclude:
- 'app/models/admin_ability.rb'
# Offense count: 3
# Offense count: 4
# Configuration parameters: CountComments.
Metrics/ModuleLength:
Max: 159
Exclude:
- 'app/helpers/format_helper.rb'
# Offense count: 15
Metrics/PerceivedComplexity:
Max: 16
Exclude:
- 'app/models/track.rb'
Max: 171
# Offense count: 20
Style/AccessorMethodName:
Metrics/PerceivedComplexity:
Max: 16
# Offense count: 20
Naming/AccessorMethodName:
Exclude:
- 'app/controllers/admin/events_controller.rb'
- 'app/controllers/application_controller.rb'
@ -356,6 +341,51 @@ Style/AccessorMethodName:
- 'app/models/target.rb'
- 'app/models/user.rb'
# Offense count: 2
# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts, AllowedAcronyms.
# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
Naming/FileName:
Exclude:
- 'Gemfile'
- 'Vagrantfile'
# Offense count: 2
# Configuration parameters: Blacklist.
# Blacklist: END, (?-mix:EO[A-Z]{1})
Naming/HeredocDelimiterNaming:
Exclude:
- 'spec/factories/users.rb'
- 'spec/models/user_spec.rb'
# Offense count: 2
# Configuration parameters: NamePrefix, NamePrefixBlacklist, NameWhitelist, MethodDefinitionMacros.
# NamePrefix: is_, has_, have_
# NamePrefixBlacklist: is_, has_, have_
# NameWhitelist: is_a?
# MethodDefinitionMacros: define_method, define_singleton_method
Naming/PredicateName:
Exclude:
- 'spec/**/*'
- 'app/models/comment.rb'
- 'app/models/contact.rb'
# Offense count: 2
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: snake_case, normalcase, non_integer
Naming/VariableNumber:
Exclude:
- 'spec/models/ticket_purchase_spec.rb'
# Offense count: 4
# Cop supports --auto-correct.
# Configuration parameters: AutoCorrect.
Performance/HashEachMethods:
Exclude:
- 'app/controllers/admin/conferences_controller.rb'
- 'app/helpers/application_helper.rb'
- 'db/migrate/20140701123203_add_events_per_week_to_conference.rb'
- 'spec/factories/event_users.rb'
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
@ -386,7 +416,14 @@ Style/ConditionalAssignment:
- 'db/migrate/20140610165551_migrate_data_person_to_user.rb'
- 'db/migrate/20140820124117_undo_wrong_migration20140801080705_add_users_to_events.rb'
# Offense count: 464
# Offense count: 9
Style/DateTime:
Exclude:
- 'app/models/conference.rb'
- 'app/models/program.rb'
- 'spec/models/conference_spec.rb'
# Offense count: 488
Style/Documentation:
Enabled: false
@ -419,14 +456,13 @@ Style/EmptyMethod:
- 'db/migrate/20130216122155_set_registration_defaults_to_false.rb'
# Offense count: 2
# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts, AllowedAcronyms.
# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
Style/FileName:
# Cop supports --auto-correct.
Style/Encoding:
Exclude:
- 'Gemfile'
- 'Vagrantfile'
- 'app/uploaders/picture_uploader.rb'
- 'spec/models/conference_spec.rb'
# Offense count: 24
# Offense count: 32
# Configuration parameters: MinBodyLength.
Style/GuardClause:
Enabled: false
@ -445,7 +481,6 @@ Style/HashSyntax:
# Configuration parameters: MaxLineLength.
Style/IfUnlessModifier:
Exclude:
- 'app/controllers/admin/booths_controller.rb'
- 'app/controllers/admin/events_controller.rb'
- 'app/controllers/api/v1/events_controller.rb'
- 'app/controllers/conference_registrations_controller.rb'
@ -454,7 +489,6 @@ Style/IfUnlessModifier:
- 'app/models/commercial.rb'
- 'app/models/conference.rb'
- 'app/models/email_settings.rb'
- 'app/models/ticket_purchase.rb'
- 'app/models/user.rb'
- 'db/migrate/20151031092713_change_conference_id_to_venue_id_in_rooms.rb'
- 'lib/tasks/events_registrations.rake'
@ -469,7 +503,7 @@ Style/LineEndConcatenation:
- 'spec/features/conference_spec.rb'
- 'spec/features/registration_periods_spec.rb'
# Offense count: 6
# Offense count: 9
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: require_parentheses, require_no_parentheses, require_no_parentheses_except_multiline
@ -498,12 +532,14 @@ Style/MutableConstant:
# Offense count: 4
# Cop supports --auto-correct.
# Configuration parameters: Whitelist.
# Whitelist: be, be_a, be_an, be_between, be_falsey, be_kind_of, be_instance_of, be_truthy, be_within, eq, eql, end_with, include, match, raise_error, respond_to, start_with
Style/NestedParenthesizedCalls:
Exclude:
- 'spec/features/conference_spec.rb'
- 'spec/models/conference_spec.rb'
# Offense count: 26
# Offense count: 27
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, MinBodyLength, SupportedStyles.
# SupportedStyles: skip_modifier_ifs, always
@ -548,6 +584,12 @@ Style/OptionalArguments:
Exclude:
- 'app/models/event.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/OrAssignment:
Exclude:
- 'app/controllers/schedules_controller.rb'
# Offense count: 3
# Cop supports --auto-correct.
# Configuration parameters: AllowSafeAssignment.
@ -557,7 +599,7 @@ Style/ParenthesesAroundCondition:
- 'app/controllers/application_controller.rb'
- 'app/helpers/format_helper.rb'
# Offense count: 14
# Offense count: 15
# Cop supports --auto-correct.
# Configuration parameters: PreferredDelimiters.
Style/PercentLiteralDelimiters:
@ -571,20 +613,9 @@ Style/PercentLiteralDelimiters:
- 'app/models/contact.rb'
- 'app/models/registration.rb'
- 'app/models/subscription.rb'
- 'app/models/track.rb'
- 'app/uploaders/picture_uploader.rb'
- 'spec/models/program_spec.rb'
- 'app/models/track.rb'
# Offense count: 2
# Configuration parameters: NamePrefix, NamePrefixBlacklist, NameWhitelist.
# NamePrefix: is_, has_, have_
# NamePrefixBlacklist: is_, has_, have_
# NameWhitelist: is_a?
Style/PredicateName:
Exclude:
- 'spec/**/*'
- 'app/models/comment.rb'
- 'app/models/contact.rb'
# Offense count: 1
# Cop supports --auto-correct.
@ -607,16 +638,6 @@ Style/RedundantParentheses:
Exclude:
- 'app/controllers/admin/base_controller.rb'
# Offense count: 9
# Cop supports --auto-correct.
# Configuration parameters: AllowMultipleReturnValues.
Style/RedundantReturn:
Exclude:
- 'app/helpers/application_helper.rb'
- 'app/helpers/format_helper.rb'
- 'app/helpers/paths_helper.rb'
- 'app/helpers/users_helper.rb'
# Offense count: 2
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, AllowInnerSlashes.
@ -662,7 +683,7 @@ Style/StringLiteralsInInterpolation:
Exclude:
- 'lib/tasks/dump_db.rake'
# Offense count: 73
# Offense count: 79
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, MinSize, SupportedStyles.
# SupportedStyles: percent, brackets
@ -701,17 +722,3 @@ Style/TrailingCommaInLiteral:
- 'Guardfile'
- 'db/migrate/20140701123203_add_events_per_week_to_conference.rb'
- 'spec/models/conference_spec.rb'
# Offense count: 3
# Cop supports --auto-correct.
Style/UnneededInterpolation:
Exclude:
- 'app/helpers/format_helper.rb'
- 'spec/controllers/admin/conferences_controller_spec.rb'
# Offense count: 2
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: snake_case, normalcase, non_integer
Style/VariableNumber:
Exclude:
- 'spec/models/ticket_purchase_spec.rb'

View file

@ -22,7 +22,7 @@ before_script:
- cp config/database.yml.travis config/database.yml
- cp config/secrets.yml.example config/secrets.yml
- mysql -u root -e 'create database osem_test;'
- RAILS_ENV=test bundle exec rake db:migrate --trace
- RAILS_ENV=test bundle exec rake db:schema:load --trace
script:
- "./travis_script.sh $TEST_SUITE"
env:

View file

@ -16,6 +16,12 @@ RUN cd /usr/bin && \
tar -xf dockerize.tar.gz && \
rm dockerize.tar.gz
# dumb-init for a proper PID 1
RUN cd /tmp && \
wget https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64.deb && \
dpkg -i dumb-init_1.2.0_amd64.deb && \
rm dumb-init_1.2.0_amd64.deb
# explicitly add Gemfile and install dependencies using bundler to make use of
# Docker's caching
WORKDIR /osem/
@ -25,12 +31,13 @@ RUN bundle install --without test development
# add OSEM files and prepare them for use inside a Docker container
COPY . /osem/
RUN chown osem.osem /osem/ -R && \
RUN chown -R osem.root /osem/ && \
chmod -R g=u /osem/ && \
mv /osem/config/database.yml.docker /osem/config/database.yml
# data directory is used to cache the secret key in a file
ENV DATA_DIR /data
RUN install -d -m 0700 -o osem $DATA_DIR
RUN install -d -m 0770 -o osem -g root $DATA_DIR
VOLUME ["$DATA_DIR"]
USER osem
@ -42,4 +49,7 @@ COPY docker/init.sh /init.sh
# from a webserver
ENV RAILS_SERVE_STATIC_FILES 1
# Runs "/usr/bin/dumb-init -- /my/script --with --args"
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
CMD ["bash", "/init.sh"]

54
Gemfile
View file

@ -6,7 +6,10 @@ if Gem::Version.new(Bundler::VERSION) < Gem::Version.new('1.8.4')
end
# as web framework
gem 'rails', '~> 4.2.8'
gem 'rails', '~> 5.0.5'
# Use Puma as the app server
gem 'puma', '~> 3.0'
# enables serving assets in production and setting your logger to standard out
# both of which are required to run an application on a twelve-factor provider
@ -27,11 +30,11 @@ gem 'paper_trail'
# for upload management
gem 'carrierwave'
gem 'mini_magick'
gem 'carrierwave-bombshelter'
gem 'mini_magick'
# for internationalizing
gem 'rails-i18n', '~> 4.0.0'
gem 'rails-i18n', '~> 5.0.0'
# as authentification framework
gem 'devise'
@ -40,12 +43,15 @@ gem 'devise_ichain_authenticatable'
# for openID authentication
gem 'omniauth'
gem 'omniauth-facebook'
gem 'omniauth-openid'
gem 'omniauth-google-oauth2'
gem 'omniauth-github'
gem 'omniauth-google-oauth2'
gem 'omniauth-openid'
# Bot-filtering
gem 'recaptcha', require: 'recaptcha/rails'
# as authorization framework
gem 'cancancan'
gem 'cancancan', '~> 2.0'
# for roles
gem 'rolify'
@ -57,8 +63,8 @@ gem 'unobtrusive_flash', '>=3'
gem 'transitions', :require => %w( transitions active_record/transitions )
# for comments
gem 'awesome_nested_set', '~> 3.1.3'
gem 'acts_as_commentable_with_threading'
gem 'awesome_nested_set', '~> 3.1.3'
# as templating language
gem 'haml-rails'
@ -70,11 +76,11 @@ gem 'sass-rails', '>= 4.0.2'
gem 'uglifier', '>= 1.3.0'
# as the front-end framework
gem 'bootstrap-sass', '~> 3.3.4.1'
gem 'autoprefixer-rails'
gem 'formtastic-bootstrap'
gem 'formtastic', '~> 3.1.1'
gem 'bootstrap-sass', '~> 3.3.4.1'
gem 'cocoon'
gem 'formtastic', '~> 3.1.5'
gem 'formtastic-bootstrap'
# as the JavaScript library
gem 'jquery-rails'
@ -105,8 +111,8 @@ source 'https://rails-assets.org' do
gem 'rails-assets-waypoints'
# for markdown editors
gem 'rails-assets-bootstrap-markdown'
gem 'rails-assets-to-markdown'
gem 'rails-assets-markdown'
gem 'rails-assets-to-markdown'
end
# as date picker
@ -126,9 +132,9 @@ gem 'gravtastic'
gem 'country_select'
# as PDF generator
gem 'prawn-qrcode', '~> 0.2.2.1'
gem 'prawn_rails'
gem 'rqrcode'
gem 'prawn-qrcode', '~> 0.2.2.1'
# to render XLS spreadsheets
gem 'axlsx', git: 'https://github.com/randym/axlsx.git'
@ -154,12 +160,11 @@ gem 'rdoc-generator-fivefish'
# for visitor tracking
gem 'ahoy_matey'
gem 'activeuuid'
gem 'piwik_analytics', '~> 1.0.1'
# for recurring jobs
gem 'whenever', :require => false
gem 'delayed_job_active_record'
gem 'whenever', :require => false
# to run scripts
gem 'daemons'
@ -182,6 +187,10 @@ gem 'cloudinary'
# for setting app configuration in the environment
gem 'dotenv-rails'
# configurable toggles for functionality
# https://github.com/mgsnova/feature
gem 'feature'
# For countable.js
gem "countable-rails", "~> 0.0.1"
@ -200,14 +209,19 @@ gem 'sprockets-rails'
# for multiple speakers select on proposal/event forms
gem 'selectize-rails'
# Nokogiri < 1.8.1 is subject to:
# CVE-2017-0663, CVE-2017-7375, CVE-2017-7376, CVE-2017-9047, CVE-2017-9048,
# CVE-2017-9049, CVE-2017-9050
gem 'nokogiri', '>= 1.8.1'
# Use guard and spring for testing in development
group :development do
# to launch specs when files are modified
gem 'guard-rspec'
gem 'spring-commands-rspec'
gem 'haml_lint', '~> 0.24.0'
gem 'spring-commands-rspec'
# for static code analisys
gem 'rubocop', '~> 0.49.0', require: false
gem 'rubocop', '~> 0.51.0', require: false
# as database
gem 'sqlite3'
# to open mails
@ -222,11 +236,11 @@ end
group :test do
# as test framework
gem 'rspec-rails', '~> 3.5', '>= 3.5.2'
gem 'database_cleaner'
gem 'capybara'
gem 'poltergeist'
gem 'database_cleaner'
gem 'phantomjs', :require => 'phantomjs/poltergeist'
gem 'poltergeist'
gem 'rspec-rails', '~> 3.5', '>= 3.5.2'
# for measuring test coverage
gem 'coveralls', require: false
# for describing models
@ -241,6 +255,8 @@ group :test do
gem 'stripe-ruby-mock'
# For validating JSON schemas
gem 'json-schema'
# For using 'assigns' in tests
gem 'rails-controller-testing'
end
group :development, :test do

View file

@ -12,62 +12,65 @@ GEM
remote: https://rubygems.org/
remote: https://rails-assets.org/
specs:
actionmailer (4.2.9)
actionpack (= 4.2.9)
actionview (= 4.2.9)
activejob (= 4.2.9)
actioncable (5.0.5)
actionpack (= 5.0.5)
nio4r (>= 1.2, < 3.0)
websocket-driver (~> 0.6.1)
actionmailer (5.0.5)
actionpack (= 5.0.5)
actionview (= 5.0.5)
activejob (= 5.0.5)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 1.0, >= 1.0.5)
actionpack (4.2.9)
actionview (= 4.2.9)
activesupport (= 4.2.9)
rack (~> 1.6)
rack-test (~> 0.6.2)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-dom-testing (~> 2.0)
actionpack (5.0.5)
actionview (= 5.0.5)
activesupport (= 5.0.5)
rack (~> 2.0)
rack-test (~> 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (4.2.9)
activesupport (= 4.2.9)
actionview (5.0.5)
activesupport (= 5.0.5)
builder (~> 3.1)
erubis (~> 2.7.0)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.3)
active_model_serializers (0.9.4)
activemodel (>= 3.2)
activejob (4.2.9)
activesupport (= 4.2.9)
globalid (>= 0.3.0)
activemodel (4.2.9)
activesupport (= 4.2.9)
builder (~> 3.1)
activerecord (4.2.9)
activemodel (= 4.2.9)
activesupport (= 4.2.9)
arel (~> 6.0)
activesupport (4.2.9)
activejob (5.0.5)
activesupport (= 5.0.5)
globalid (>= 0.3.6)
activemodel (5.0.5)
activesupport (= 5.0.5)
activerecord (5.0.5)
activemodel (= 5.0.5)
activesupport (= 5.0.5)
arel (~> 7.0)
activesupport (5.0.5)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (~> 0.7)
minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
activeuuid (0.6.1)
activerecord (>= 3.1)
uuidtools
acts_as_commentable_with_threading (1.2.0)
activerecord (>= 3.0)
activesupport (>= 3.0)
awesome_nested_set (>= 2.0)
acts_as_list (0.4.0)
acts_as_list (0.9.7)
activerecord (>= 3.0)
addressable (2.5.1)
public_suffix (~> 2.0, >= 2.0.2)
ahoy_matey (1.0.0)
ahoy_matey (1.6.0)
addressable
browser (>= 0.4.0)
browser (~> 2.0)
geocoder
referer-parser
rack-attack (< 6)
railties
referer-parser (>= 0.3.0)
request_store
safely_block (>= 0.1.1)
user_agent_parser
uuidtools
arel (6.0.4)
arel (7.1.4)
ast (2.3.0)
autoprefixer-rails (7.1.1)
execjs
@ -86,10 +89,10 @@ GEM
bootstrap-switch-rails (3.0.2)
bootstrap3-datetimepicker-rails (3.0.3)
momentjs-rails (>= 2.8.1)
browser (0.6.0)
browser (2.5.1)
builder (3.2.3)
byebug (9.0.6)
cancancan (1.13.1)
cancancan (2.0.0)
capybara (2.6.2)
addressable
mime-types (>= 1.16)
@ -144,7 +147,7 @@ GEM
daemons (1.1.9)
dante (0.2.0)
database_cleaner (1.3.0)
debug_inspector (0.0.2)
debug_inspector (0.0.3)
delayed_job (4.1.3)
activesupport (>= 3.0, < 5.2)
delayed_job_active_record (4.1.2)
@ -166,6 +169,7 @@ GEM
dotenv-rails (2.2.1)
dotenv (= 2.2.1)
railties (>= 3.2, < 5.2)
errbase (0.0.3)
erubis (2.7.0)
execjs (2.6.0)
factory_girl (4.5.0)
@ -179,15 +183,16 @@ GEM
multipart-post (>= 1.2, < 3)
fastimage (2.0.0)
addressable (~> 2)
feature (1.4.0)
ffi (1.9.18)
font-awesome-rails (4.7.0.2)
railties (>= 3.2, < 5.2)
formatador (0.2.5)
formtastic (3.1.3)
formtastic (3.1.5)
actionpack (>= 3.2.13)
formtastic-bootstrap (3.1.1)
formtastic (>= 3.0)
geocoder (1.2.2)
geocoder (1.4.4)
globalid (0.4.0)
activesupport (>= 4.2.0)
gravtastic (3.2.6)
@ -270,7 +275,7 @@ GEM
open4 (~> 1.3.4)
rake
mini_magick (4.5.1)
mini_portile2 (2.2.0)
mini_portile2 (2.3.0)
minitest (5.10.2)
momentjs-rails (2.8.1)
railties (>= 3.1)
@ -290,8 +295,9 @@ GEM
mysql2 (0.4.9)
nenv (0.3.0)
netrc (0.11.0)
nokogiri (1.8.0)
mini_portile2 (~> 2.2.0)
nio4r (2.1.0)
nokogiri (1.8.1)
mini_portile2 (~> 2.3.0)
notiffany (0.1.1)
nenv (~> 0.1)
shellany (~> 0.0)
@ -324,9 +330,9 @@ GEM
activerecord (>= 3.0, < 6.0)
activesupport (>= 3.0, < 6.0)
request_store (~> 1.1)
parallel (1.11.2)
parser (2.4.0.0)
ast (~> 2.2)
parallel (1.12.0)
parser (2.4.0.2)
ast (~> 2.3)
pdf-core (0.2.5)
phantomjs (2.1.1.0)
piwik_analytics (1.0.2)
@ -353,23 +359,27 @@ GEM
method_source (~> 0.8.1)
slop (~> 3.4)
public_suffix (2.0.5)
rack (1.6.8)
puma (3.10.0)
rack (2.0.3)
rack-attack (5.0.1)
rack
rack-openid (1.3.1)
rack (>= 1.1.0)
ruby-openid (>= 2.1.8)
rack-test (0.6.3)
rack (>= 1.0)
rails (4.2.9)
actionmailer (= 4.2.9)
actionpack (= 4.2.9)
actionview (= 4.2.9)
activejob (= 4.2.9)
activemodel (= 4.2.9)
activerecord (= 4.2.9)
activesupport (= 4.2.9)
bundler (>= 1.3.0, < 2.0)
railties (= 4.2.9)
sprockets-rails
rails (5.0.5)
actioncable (= 5.0.5)
actionmailer (= 5.0.5)
actionpack (= 5.0.5)
actionview (= 5.0.5)
activejob (= 5.0.5)
activemodel (= 5.0.5)
activerecord (= 5.0.5)
activesupport (= 5.0.5)
bundler (>= 1.3.0)
railties (= 5.0.5)
sprockets-rails (>= 2.0.0)
rails-assets-bootstrap (3.3.6)
rails-assets-jquery (>= 1.9.1, < 3)
rails-assets-bootstrap-markdown (2.10.0)
@ -387,30 +397,32 @@ GEM
rails-assets-to-markdown (1.3.0)
rails-assets-trianglify (0.4.0)
rails-assets-waypoints (4.0.0)
rails-deprecated_sanitizer (1.0.3)
activesupport (>= 4.2.0.alpha)
rails-dom-testing (1.0.8)
activesupport (>= 4.2.0.beta, < 5.0)
nokogiri (~> 1.6)
rails-deprecated_sanitizer (>= 1.0.1)
rails-controller-testing (1.0.2)
actionpack (~> 5.x, >= 5.0.1)
actionview (~> 5.x, >= 5.0.1)
activesupport (~> 5.x)
rails-dom-testing (2.0.3)
activesupport (>= 4.2.0)
nokogiri (>= 1.6)
rails-html-sanitizer (1.0.3)
loofah (~> 2.0)
rails-i18n (4.0.8)
rails-i18n (5.0.4)
i18n (~> 0.7)
railties (~> 4.0)
railties (~> 5.0)
rails_12factor (0.0.3)
rails_serve_static_assets
rails_stdout_logging
rails_serve_static_assets (0.0.4)
rails_stdout_logging (0.0.3)
railties (4.2.9)
actionpack (= 4.2.9)
activesupport (= 4.2.9)
railties (5.0.5)
actionpack (= 5.0.5)
activesupport (= 5.0.5)
method_source
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rainbow (2.2.2)
rake
rake (12.0.0)
rake (12.3.0)
rb-fsevent (0.10.2)
rb-inotify (0.9.10)
ffi (>= 0.5.0, < 2)
@ -420,8 +432,10 @@ GEM
loggability (~> 0.12)
rdoc (~> 5.0)
yajl-ruby (~> 1.3)
recaptcha (4.6.2)
json
redcarpet (3.2.3)
referer-parser (0.2.1)
referer-parser (0.3.0)
request_store (1.1.0)
responders (2.4.0)
actionpack (>= 4.2.0, < 5.3)
@ -458,19 +472,21 @@ GEM
rspec-mocks (~> 3.6.0)
rspec-support (~> 3.6.0)
rspec-support (3.6.0)
rubocop (0.49.1)
rubocop (0.51.0)
parallel (~> 1.10)
parser (>= 2.3.3.1, < 3.0)
powerpack (~> 0.1)
rainbow (>= 1.99.1, < 3.0)
rainbow (>= 2.2.2, < 3.0)
ruby-progressbar (~> 1.7)
unicode-display_width (~> 1.0, >= 1.0.1)
ruby-oembed (0.8.14)
ruby-openid (2.5.0)
ruby-progressbar (1.8.1)
ruby-progressbar (1.9.0)
ruby_dep (1.5.0)
rubyzip (1.2.1)
safe_yaml (1.0.4)
safely_block (0.2.0)
errbase
sass (3.2.19)
sass-rails (5.0.6)
railties (>= 4.0.0, < 6)
@ -497,10 +513,10 @@ GEM
sprockets (3.7.1)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
sprockets-rails (2.3.3)
actionpack (>= 3.0)
activesupport (>= 3.0)
sprockets (>= 2.8, < 4.0)
sprockets-rails (3.2.1)
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
sqlite3 (1.3.9)
stripe (1.43.0)
rest-client (~> 1.4)
@ -531,11 +547,11 @@ GEM
unicode_utils (1.4.0)
unobtrusive_flash (3.1.0)
railties
user_agent_parser (2.1.5)
user_agent_parser (2.4.0)
uuidtools (2.1.5)
warden (1.2.4)
rack (>= 1.0)
web-console (2.2.1)
web-console (2.3.0)
activemodel (>= 4.0)
binding_of_caller (>= 0.7.2)
railties (>= 4.0)
@ -552,14 +568,13 @@ GEM
chronic (>= 0.6.3)
xpath (2.0.0)
nokogiri (~> 1.3)
yajl-ruby (1.3.0)
yajl-ruby (1.3.1)
PLATFORMS
ruby
DEPENDENCIES
active_model_serializers
activeuuid
acts_as_commentable_with_threading
acts_as_list
ahoy_matey
@ -571,7 +586,7 @@ DEPENDENCIES
bootstrap-switch-rails (~> 3.0.0)
bootstrap3-datetimepicker-rails (~> 3.0.2)
byebug
cancancan
cancancan (~> 2.0)
capybara
carrierwave
carrierwave-bombshelter
@ -589,8 +604,9 @@ DEPENDENCIES
dotenv-rails
factory_girl_rails
faker
feature
font-awesome-rails
formtastic (~> 3.1.1)
formtastic (~> 3.1.5)
formtastic-bootstrap
gravtastic
guard-rspec
@ -609,6 +625,7 @@ DEPENDENCIES
mini_magick
money-rails
mysql2
nokogiri (>= 1.8.1)
omniauth
omniauth-facebook
omniauth-github
@ -620,7 +637,8 @@ DEPENDENCIES
poltergeist
prawn-qrcode (~> 0.2.2.1)
prawn_rails
rails (~> 4.2.8)
puma (~> 3.0)
rails (~> 5.0.5)
rails-assets-bootstrap-markdown!
rails-assets-date.format!
rails-assets-holderjs!
@ -632,16 +650,18 @@ DEPENDENCIES
rails-assets-to-markdown!
rails-assets-trianglify!
rails-assets-waypoints!
rails-i18n (~> 4.0.0)
rails-controller-testing
rails-i18n (~> 5.0.0)
rails_12factor
rdoc-generator-fivefish
recaptcha
redcarpet
responders (~> 2.0)
rolify
rqrcode
rspec-activemodel-mocks
rspec-rails (~> 3.5, >= 3.5.2)
rubocop (~> 0.49.0)
rubocop (~> 0.51.0)
ruby-oembed
sass-rails (>= 4.0.2)
selectize-rails
@ -662,4 +682,4 @@ DEPENDENCIES
whenever
BUNDLED WITH
1.15.1
1.16.0

View file

@ -42,7 +42,7 @@ There are two configurations to deploy OSEM with Docker: *evaluation mode* and *
If you want to evaluate OSEM to see if it fits your needs, the default configuration in `docker-compose.env` will work perfectly fine for you.
For convenience reasons, `docker-compose.yml` already contains a [MailHog](https://github.com/mailhog/MailHog) service configuration. MailHog
is going to catch every email sent by OSEM and displays them on a special web service. Thus, it eliminitates the need to set up an SMTP server just to try out OSEM.
is going to catch every email sent by OSEM and displays them on a special web service. Thus, it eliminates the need to set up an SMTP server just to try out OSEM.
Just point your browser to http://localhost:8025 to get access to registration confirmation links etc.
Run `docker-compose up --build` to start the services. On first run, it will take a few minutes to initialize the database. Thus, wait a few minutes before you open up
@ -105,6 +105,7 @@ There are a couple of environment variables you can set to configure OSEM. Check
| CLOUDINARY_URL | *string* | Configure your cloudinary.com cloud name and api key/secret
| STRIPE_PUBLISHABLE_KEY | *string* | Publishable Key for Stripe Gateway
| STRIPE_SECRET_KEY | *string* | Secret Key for Stripe Gateway
| OSEM_REDIS_URL | *string* | Redis server URL e.g. redis://localhost:6379/1
### Online Ticket Payments
We use [Stripe](https://stripe.com) for accepting your ticket payments securely over the web.

View file

@ -79,11 +79,23 @@ $(function () {
$("#conference-start-datepicker").on("dp.change",function (e) {
$('#conference-end-datepicker').data("DateTimePicker").setMinDate(e.date);
if (!$('#conference-end-datepicker').val()) {
$('#conference-end-datepicker').data("DateTimePicker").setDate(e.date);
}
});
$("#conference-start-datepicker").change(function (e) {
$('#conference-start-datepicker').val()?$('#conference-end-datepicker').data("DateTimePicker").setMinDate(e.date):$('#conference-end-datepicker').data("DateTimePicker").setMinDate(null);
});
$("#conference-end-datepicker").on("dp.change",function (e) {
$('#conference-start-datepicker').data("DateTimePicker").setMaxDate(e.date);
});
$("#conference-end-datepicker").change(function (e) {
$('#conference-end-datepicker').val()?$('#conference-start-datepicker').data("DateTimePicker").setMaxDate(e.date):$('#conference-start-datepicker').data("DateTimePicker").setMaxDate(null);
});
$("#registration-period-start-datepicker").on("dp.change",function (e) {
$('#registration-period-end-datepicker').data("DateTimePicker").setMinDate(e.date);
});

View file

@ -11,7 +11,7 @@ function update_price($this){
$('.total_row').each(function( index ) {
total += parseFloat($(this).text());
});
$('#total_price').text(total);
$('#total_price').text(total.toFixed(2));
}
$( document ).ready(function() {

View file

@ -1,3 +1,5 @@
@import "bootstrap/mixins";
html {
position: relative;
min-height: 100%;
@ -104,3 +106,12 @@ p.comment-body {
.qr-image{
margin-left: 120px;
}
.g-recaptcha {
@include clearfix;
padding-bottom: 12px;
div {
float: right;
}
}

View file

@ -1,6 +1,6 @@
module Admin
class BaseController < ApplicationController
before_filter :verify_user_admin
before_action :verify_user_admin
private

View file

@ -3,7 +3,24 @@ module Admin
load_and_authorize_resource :conference, find_by: :short_title
load_and_authorize_resource through: :conference
def index; end
def index
@file_name = "booths_for_#{@conference.short_title}"
@booth_export_option = params[:booth_export_option]
respond_to do |format|
format.html
# Explicity call #to_json to avoid the use of EventSerializer
format.json { render json: Booth.where(state: :confirmed, program: @program).to_json }
format.xlsx do
response.headers['Content-Disposition'] = "attachment; filename=\"#{@file_name}.xlsx\""
render 'booths'
end
format.pdf { render 'booths' }
format.csv do
response.headers['Content-Disposition'] = "attachment; filename=\"#{@file_name}.csv\""
render 'booths'
end
end
end
def show; end

View file

@ -55,7 +55,7 @@ module Admin
private
def cfp_params
params.require(:cfp).permit(:start_date, :end_date, :cfp_type)
params.require(:cfp).permit(:start_date, :end_date, :description, :cfp_type)
end
end
end

View file

@ -193,6 +193,7 @@ module Admin
def edit
@conferences = Conference.all
@date_string = date_string(@conference.start_date, @conference.end_date)
@affected_event_count = @conference.program.events.scheduled(@conference.program.selected_schedule_id).count
respond_to do |format|
format.html
format.json { render json: @conference.to_json }

View file

@ -2,7 +2,7 @@ module Admin
class RegistrationsController < Admin::BaseController
load_and_authorize_resource :conference, find_by: :short_title
load_and_authorize_resource :registration, through: :conference
before_filter :set_user, except: [:index]
before_action :set_user, except: [:index]
def index
authorize! :show, Registration.new(conference_id: @conference.id)

View file

@ -7,7 +7,25 @@ module Admin
# Show flash message with ajax calls
after_action :prepare_unobtrusive_flash, only: :toggle_cfp_inclusion
def index; end
def index
@file_name = "tracks_for_#{@conference.short_title}"
@track_export_option = params[:track_export_option]
respond_to do |format|
format.html
# Explicity call #to_json to avoid the use of EventSerializer
format.json { render json: Track.where(state: :confirmed, program: @program).to_json }
format.xlsx do
response.headers['Content-Disposition'] = "attachment; filename=\"#{@file_name}.xlsx\""
render 'tracks'
end
format.pdf { render 'tracks' }
format.csv do
response.headers['Content-Disposition'] = "attachment; filename=\"#{@file_name}.csv\""
render 'tracks'
end
end
end
def show
respond_to do |format|

View file

@ -1,10 +1,10 @@
class ApplicationController < ActionController::Base
before_filter :set_paper_trail_whodunnit
before_action :set_paper_trail_whodunnit
include ApplicationHelper
add_flash_types :error
protect_from_forgery with: :exception
before_filter :get_conferences
before_filter :store_location
protect_from_forgery with: :exception, prepend: true
before_action :get_conferences
before_action :store_location
# Ensure every controller authorizes resource or skips authorization (skip_authorization_check)
check_authorization unless: :devise_controller?

View file

@ -1,5 +1,5 @@
class ConferenceRegistrationsController < ApplicationController
before_filter :authenticate_user!, except: [:new, :create]
before_action :authenticate_user!, except: [:new, :create]
load_resource :conference, find_by: :short_title
authorize_resource :conference_registrations, class: Registration, except: [:new, :create]
before_action :set_registration, only: [:edit, :update, :destroy, :show]
@ -27,8 +27,9 @@ class ConferenceRegistrationsController < ApplicationController
end
def show
@total_price = Ticket.total_price(@conference, current_user, paid: true)
@total_price = Ticket.total_price_user(@conference, current_user, paid: true)
@tickets = current_user.ticket_purchases.by_conference(@conference).paid
@total_price_per_ticket = @tickets.group(:ticket_id).sum('amount_paid * quantity')
@ticket_payments = @tickets.group_by(&:ticket_id)
@total_quantity = @tickets.group(:ticket_id).sum(:quantity)
end

View file

@ -4,4 +4,10 @@ class OrganizationsController < ApplicationController
def index
@organizations = Organization.all
end
def conferences
@current = @organization.conferences.upcoming.reorder(start_date: :asc)
@antiquated = @organization.conferences.past
render '/conferences/index'
end
end

View file

@ -1,5 +1,5 @@
class RegistrationsController < Devise::RegistrationsController
before_action :configure_permitted_parameters, if: :devise_controller?
prepend_before_action :check_captcha, only: [:create]
def edit
@openids = Openid.where(user_id: current_user.id).order(:provider)
@ -21,14 +21,34 @@ class RegistrationsController < Devise::RegistrationsController
edit_user_registration_path(resource)
end
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:account_update) do |u|
u
.permit(:email, :password, :password_confirmation, :current_password, :username, :email_public)
end
devise_parameter_sanitizer.permit(:sign_up) do |u|
u
.permit(:email, :password, :password_confirmation, :name, :username)
private
def sign_up_params
params.require(:user).permit(
:email,
:password,
:password_confirmation,
:name,
:username
)
end
def account_update_params
params.require(:user).permit(
:email,
:password,
:password_confirmation,
:current_password,
:username,
:email_public
)
end
def check_captcha
unless Feature.inactive?(:recaptcha) || verify_recaptcha
self.resource = resource_class.new sign_up_params
resource.validate # Look for any other validation errors besides Recaptcha
respond_with_navigational(resource) { render :new }
end
end
end

View file

@ -1,5 +1,5 @@
class SubscriptionsController < ApplicationController
before_filter :authenticate_user!
before_action :authenticate_user!
load_resource :conference, find_by: :short_title
load_and_authorize_resource only: [:create, :destroy], through: :conference

View file

@ -1,5 +1,5 @@
class TicketPurchasesController < ApplicationController
before_filter :authenticate_user!
before_action :authenticate_user!
load_resource :conference, find_by: :short_title
authorize_resource :conference_registrations, class: Registration
authorize_resource

View file

@ -1,9 +1,9 @@
class TicketsController < ApplicationController
before_filter :authenticate_user!
before_action :authenticate_user!
load_resource :conference, find_by: :short_title
load_resource :ticket, through: :conference
authorize_resource :conference_registrations, class: Registration
before_filter :check_load_resource, only: :index
before_action :check_load_resource, only: :index
def index; end

View file

@ -11,13 +11,13 @@ module Users
def handle(provider)
auth_hash = request.env['omniauth.auth']
uid = auth_hash[:uid]
username = auth_hash.info.email.split('@')[0]
openid = Openid.find_for_oauth(auth_hash) # Get or create openid
# If openid exists and is associated with a user, sign in with associated user,
# even if the email of the associated user and the email of the provided openid are different
unless (user = openid.user)
user = User.find_for_auth(auth_hash, current_user) # Get or create users
user.username = "#{uid}@#{provider}" if user.username.blank?
user.username = "#{username}@#{provider}" if user.username.blank?
end
begin

View file

@ -66,7 +66,7 @@ module ApplicationHelper
else
ts = all.join
end
return ts
ts
end
def difficulty_levels(conference)
@ -80,7 +80,7 @@ module ApplicationHelper
else
ts = all.join
end
return ts
ts
end
def unread_notifications(user)
@ -163,6 +163,12 @@ module ApplicationHelper
end
end
def rescheduling_hint(affected_event_count)
if affected_event_count > 0
"You have #{affected_event_count} scheduled #{'event'.pluralize(affected_event_count)}. Changing the conference hours will unschedule those scheduled outside the conference hours."
end
end
##
# ====Gets
# a conference object
@ -171,4 +177,18 @@ module ApplicationHelper
def hidden_if_conference_over(conference)
'hidden' if Date.today > conference.end_date
end
def nav_root_link_for(conference)
link_text = (
conference.try(:organization).try(:name) ||
ENV['OSEM_NAME'] ||
'OSEM'
)
link_to(
link_text,
root_path,
class: 'navbar-brand',
title: 'Open Source Event Manager'
)
end
end

View file

@ -101,17 +101,17 @@ module FormatHelper
def icon_for_todo(bool)
if bool
return 'fa fa-check'
'fa fa-check'
else
return 'fa fa-times'
'fa fa-times'
end
end
def class_for_todo(bool)
if bool
return 'todolist-ok'
'todolist-ok'
else
return 'todolist-missing'
'todolist-missing'
end
end
@ -122,7 +122,7 @@ module FormatHelper
plural || singular.pluralize
end
"#{word}"
word
end
# Returns black or white deppending on what of them contrast more with the

View file

@ -5,9 +5,9 @@ module PathsHelper
def active_nav_li(link)
if current_page?(link)
return 'active'
'active'
else
return ''
''
end
end
end

View file

@ -18,7 +18,7 @@ module UsersHelper
providers << provider if !ENV["OSEM_#{provider.upcase}_KEY"].blank? && !ENV["OSEM_#{provider.upcase}_SECRET"].blank?
end
return providers.uniq
providers.uniq
end
# Receives a hash, generated from User model, function get_roles

View file

@ -0,0 +1,2 @@
class ApplicationJob < ActiveJob::Base
end

View file

@ -1,4 +1,4 @@
class ConferenceCfpUpdateMailJob < ActiveJob::Base
class ConferenceCfpUpdateMailJob < ApplicationJob
queue_as :default
def perform(conference)

View file

@ -1,4 +1,4 @@
class ConferenceDateUpdateMailJob < ActiveJob::Base
class ConferenceDateUpdateMailJob < ApplicationJob
queue_as :default
def perform(conference)

View file

@ -1,4 +1,4 @@
class ConferenceRegistrationDateUpdateMailJob < ActiveJob::Base
class ConferenceRegistrationDateUpdateMailJob < ApplicationJob
queue_as :default
def perform(conference)

View file

@ -1,4 +1,4 @@
class ConferenceScheduleUpdateMailJob < ActiveJob::Base
class ConferenceScheduleUpdateMailJob < ApplicationJob
queue_as :default
def perform(conference)

View file

@ -1,4 +1,4 @@
class ConferenceVenueUpdateMailJob < ActiveJob::Base
class ConferenceVenueUpdateMailJob < ApplicationJob
queue_as :default
def perform(conference)

View file

@ -1,4 +1,4 @@
class EventCommentMailJob < ActiveJob::Base
class EventCommentMailJob < ApplicationJob
queue_as :default
def perform(comment)

View file

@ -15,7 +15,7 @@ class Ability
# Abilities for not signed in users (guests)
def not_signed_in
can [:index], Organization
can [:index, :conferences], Organization
can [:index], Conference
can [:show], Conference do |conference|
conference.splashpage && conference.splashpage.public == true

View file

@ -1,5 +1,5 @@
module Ahoy
class Event < ActiveRecord::Base
class Event < ApplicationRecord
self.table_name = 'ahoy_events'
belongs_to :visit

View file

@ -1,4 +1,4 @@
class Answer < ActiveRecord::Base
class Answer < ApplicationRecord
has_many :qanswers
has_many :questions, through: :qanswers

View file

@ -0,0 +1,3 @@
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
end

View file

@ -1,4 +1,4 @@
class Booth < ActiveRecord::Base
class Booth < ApplicationRecord
include ActiveRecord::Transitions
has_paper_trail ignore: [:updated_at], meta: { conference_id: :conference_id }

View file

@ -1,4 +1,4 @@
class BoothRequest < ActiveRecord::Base
class BoothRequest < ApplicationRecord
belongs_to :booth
belongs_to :user

View file

@ -1,4 +1,4 @@
class Campaign < ActiveRecord::Base
class Campaign < ApplicationRecord
validates :name, :utm_campaign, presence: true
has_many :targets, dependent: :nullify

View file

@ -1,6 +1,6 @@
# cannot delete program if there are events submitted
class Cfp < ActiveRecord::Base
class Cfp < ApplicationRecord
TYPES = %w(events booths tracks).freeze
has_paper_trail ignore: [:updated_at], meta: { conference_id: :conference_id }

View file

@ -1,4 +1,4 @@
class Comment < ActiveRecord::Base
class Comment < ApplicationRecord
acts_as_nested_set scope: %i(commentable_id commentable_type)
validates :body, presence: true
validates :user, presence: true

View file

@ -1,4 +1,4 @@
class Commercial < ActiveRecord::Base
class Commercial < ApplicationRecord
require 'oembed'
belongs_to :commercialable, polymorphic: true

View file

@ -1,4 +1,4 @@
class Conference < ActiveRecord::Base
class Conference < ApplicationRecord
include RevisionCount
require 'uri'
serialize :events_per_week, Hash
@ -496,7 +496,7 @@ class Conference < ActiveRecord::Base
if tickets && ticket_purchases
tickets.each do |ticket|
result[ticket.title] = {
'value' => ApplicationController.helpers.humanized_money(ticket.tickets_turnover).delete(',').to_i,
'value' => ApplicationController.helpers.humanized_money(ticket.tickets_turnover_total(ticket.id)).delete(',').to_i,
'color' => "\##{Digest::MD5.hexdigest(ticket.title)[0..5]}"
}
end

View file

@ -1,4 +1,4 @@
class Contact < ActiveRecord::Base
class Contact < ApplicationRecord
has_paper_trail on: [:update], ignore: [:updated_at], meta: { conference_id: :conference_id }
belongs_to :conference

View file

@ -1,4 +1,4 @@
class DifficultyLevel < ActiveRecord::Base
class DifficultyLevel < ApplicationRecord
belongs_to :program
has_many :events, dependent: :nullify

View file

@ -1,4 +1,4 @@
class EmailSettings < ActiveRecord::Base
class EmailSettings < ApplicationRecord
belongs_to :conference
has_paper_trail on: [:update], ignore: [:updated_at], meta: { conference_id: :conference_id }

View file

@ -1,4 +1,4 @@
class Event < ActiveRecord::Base
class Event < ApplicationRecord
include ActiveRecord::Transitions
include RevisionCount
has_paper_trail on: [:create, :update], ignore: [:updated_at, :guid, :week], meta: { conference_id: :conference_id }
@ -204,11 +204,12 @@ class Event < ActiveRecord::Base
end
def speaker_names
result = Set.new
speakers.each do |speaker|
result.add(speaker.name)
end
result.to_a.to_sentence
speakers.map(&:name).join(', ')
end
# Returns emails of all the speaker belongs to a particular event
def speaker_emails
speakers.map(&:email).join(', ')
end
##

View file

@ -1,4 +1,4 @@
class EventSchedule < ActiveRecord::Base
class EventSchedule < ApplicationRecord
belongs_to :schedule
belongs_to :event
belongs_to :room

View file

@ -1,4 +1,4 @@
class EventType < ActiveRecord::Base
class EventType < ApplicationRecord
belongs_to :program
has_many :events, dependent: :restrict_with_error

View file

@ -1,4 +1,4 @@
class EventUser < ActiveRecord::Base
class EventUser < ApplicationRecord
# TODO: Do we need these roles?
ROLES = [%w[Speaker speaker], %w[Submitter submitter], %w[Moderator moderator]]

View file

@ -1,4 +1,4 @@
class EventsRegistration < ActiveRecord::Base
class EventsRegistration < ApplicationRecord
belongs_to :registration
belongs_to :event

View file

@ -1,4 +1,4 @@
class Lodging < ActiveRecord::Base
class Lodging < ApplicationRecord
belongs_to :conference
has_paper_trail ignore: [:updated_at], meta: { conference_id: :conference_id }

View file

@ -1,4 +1,4 @@
class Openid < ActiveRecord::Base
class Openid < ApplicationRecord
belongs_to :user
validates :provider, :uid, presence: true

View file

@ -1,4 +1,4 @@
class Organization < ActiveRecord::Base
class Organization < ApplicationRecord
resourcify :roles, dependent: :delete_all
has_paper_trail

View file

@ -1,4 +1,4 @@
class Payment < ActiveRecord::Base
class Payment < ApplicationRecord
has_many :ticket_purchases
belongs_to :user
belongs_to :conference

View file

@ -1,4 +1,4 @@
class PhysicalTicket < ActiveRecord::Base
class PhysicalTicket < ApplicationRecord
belongs_to :ticket_purchase
has_one :ticket, through: :ticket_purchase
has_one :conference, through: :ticket_purchase

View file

@ -1,6 +1,6 @@
# cannot delete program if there are events submitted
class Program < ActiveRecord::Base
class Program < ApplicationRecord
has_paper_trail on: [:update], ignore: [:updated_at], meta: { conference_id: :conference_id }
belongs_to :conference
@ -42,7 +42,8 @@ class Program < ActiveRecord::Base
has_many :event_schedules, through: :events
has_many :event_users, through: :events
has_many :speakers, -> { distinct }, through: :event_users, source: :user do
has_many :program_events_speakers, -> {where(event_role: 'speaker')}, through: :events, source: :event_users
has_many :speakers, -> { distinct }, through: :program_events_speakers, source: :user do
def confirmed
joins(:events).where(events: { state: :confirmed })
end

View file

@ -1,4 +1,4 @@
class Qanswer < ActiveRecord::Base
class Qanswer < ApplicationRecord
belongs_to :question
belongs_to :answer, dependent: :delete

View file

@ -1,4 +1,4 @@
class Question < ActiveRecord::Base
class Question < ApplicationRecord
belongs_to :question_type
has_and_belongs_to_many :conferences

View file

@ -1,3 +1,3 @@
class QuestionType < ActiveRecord::Base
class QuestionType < ApplicationRecord
has_many :questions
end

View file

@ -1,4 +1,4 @@
class Registration < ActiveRecord::Base
class Registration < ApplicationRecord
belongs_to :user
belongs_to :conference

View file

@ -1,4 +1,4 @@
class RegistrationPeriod < ActiveRecord::Base
class RegistrationPeriod < ApplicationRecord
belongs_to :conference
has_paper_trail ignore: [:updated_at], meta: { conference_id: :conference_id }

View file

@ -1,4 +1,4 @@
class Resource < ActiveRecord::Base
class Resource < ApplicationRecord
belongs_to :conference
validates :name, :used, :quantity, presence: true
validates :used, :quantity, numericality: { greater_than_or_equal_to: 0, only_integer: true }

View file

@ -1,4 +1,4 @@
class Role < ActiveRecord::Base
class Role < ApplicationRecord
belongs_to :resource, polymorphic: true
has_many :users_roles
has_many :users, through: :users_roles

View file

@ -1,4 +1,4 @@
class Room < ActiveRecord::Base
class Room < ApplicationRecord
include RevisionCount
belongs_to :venue
has_many :event_schedules, dependent: :destroy

View file

@ -1,4 +1,4 @@
class Schedule < ActiveRecord::Base
class Schedule < ApplicationRecord
belongs_to :program
belongs_to :track
has_many :event_schedules, dependent: :destroy

View file

@ -1,4 +1,4 @@
class Splashpage < ActiveRecord::Base
class Splashpage < ApplicationRecord
belongs_to :conference
has_paper_trail ignore: [:updated_at], meta: { conference_id: :conference_id }

View file

@ -1,4 +1,4 @@
class Sponsor < ActiveRecord::Base
class Sponsor < ApplicationRecord
belongs_to :sponsorship_level
belongs_to :conference

View file

@ -1,4 +1,4 @@
class SponsorshipLevel < ActiveRecord::Base
class SponsorshipLevel < ApplicationRecord
validates :title, presence: true
belongs_to :conference
acts_as_list scope: :conference

View file

@ -1,4 +1,4 @@
class Subscription < ActiveRecord::Base
class Subscription < ApplicationRecord
belongs_to :conference
belongs_to :user

View file

@ -1,4 +1,4 @@
class Target < ActiveRecord::Base
class Target < ApplicationRecord
include ActionView::Helpers::TextHelper
default_scope { order('due_date ASC') }

View file

@ -1,4 +1,4 @@
class Ticket < ActiveRecord::Base
class Ticket < ApplicationRecord
belongs_to :conference
has_many :ticket_purchases, dependent: :destroy
has_many :buyers, -> { distinct }, through: :ticket_purchases, source: :user
@ -55,12 +55,18 @@ class Ticket < ActiveRecord::Base
result ? result : Money.new(0, 'USD')
end
def tickets_sold
ticket_purchases.paid.sum(:quantity)
def self.total_price_user(conference, user, paid: false)
tickets = TicketPurchase.where(conference: conference, user: user, paid: paid)
tickets.inject(0){ |sum, ticket| sum + (ticket.amount_paid * ticket.quantity) }
end
def tickets_turnover
tickets_sold * price
def tickets_turnover_total(id)
tickets = TicketPurchase.where(ticket_id: id).paid
tickets.inject(0){ |sum, ticket| sum + (ticket.amount_paid * ticket.quantity) }
end
def tickets_sold
ticket_purchases.paid.sum(:quantity)
end
private

View file

@ -1,4 +1,4 @@
class TicketPurchase < ActiveRecord::Base
class TicketPurchase < ApplicationRecord
belongs_to :ticket
belongs_to :user
belongs_to :conference
@ -52,7 +52,8 @@ class TicketPurchase < ActiveRecord::Base
purchase = new(ticket_id: ticket.id,
conference_id: conference.id,
user_id: user.id,
quantity: quantity)
quantity: quantity,
amount_paid: ticket.price)
purchase.pay(nil) if ticket.price_cents.zero?
end
purchase

View file

@ -1,4 +1,4 @@
class TicketScanning < ActiveRecord::Base
class TicketScanning < ApplicationRecord
belongs_to :physical_ticket
before_create :mark_user_present

View file

@ -1,4 +1,4 @@
class Track < ActiveRecord::Base
class Track < ApplicationRecord
include ActiveRecord::Transitions
include RevisionCount

View file

@ -4,7 +4,7 @@ end
class UserDisabled < StandardError
end
class User < ActiveRecord::Base
class User < ApplicationRecord
rolify
has_many :physical_tickets, through: :ticket_purchases do
def by_conference(conference)

View file

@ -1,4 +1,4 @@
class UsersRole < ActiveRecord::Base
class UsersRole < ApplicationRecord
belongs_to :role
belongs_to :user

View file

@ -1,4 +1,4 @@
class Vchoice < ActiveRecord::Base
class Vchoice < ApplicationRecord
belongs_to :vday
belongs_to :vposition

View file

@ -1,4 +1,4 @@
class Vday < ActiveRecord::Base
class Vday < ApplicationRecord
belongs_to :conference
has_many :vchoices

View file

@ -1,4 +1,4 @@
class Venue < ActiveRecord::Base
class Venue < ApplicationRecord
belongs_to :conference
has_one :commercial, as: :commercialable, dependent: :destroy
has_many :rooms, dependent: :destroy

View file

@ -1,4 +1,4 @@
class Visit < ActiveRecord::Base
class Visit < ApplicationRecord
has_many :ahoy_events, class_name: 'Ahoy::Event'
belongs_to :user
end

View file

@ -1,4 +1,4 @@
class Vote < ActiveRecord::Base
class Vote < ApplicationRecord
belongs_to :user
belongs_to :event

View file

@ -1,4 +1,4 @@
class Vposition < ActiveRecord::Base
class Vposition < ApplicationRecord
belongs_to :conference
has_many :vchoices

View file

@ -0,0 +1,19 @@
- headers = ['Booth ID',
'Title',
'Description',
'Reasoning',
'Submitter Name',
'Submitter Relationship',
'Website Url',
'State']
= CSV.generate_line ['All booths']
= CSV.generate_line headers
- @booths.each do |booth|
= CSV.generate_line([booth.id,
booth.title,
booth.description,
booth.reasoning,
booth.submitter.name,
booth.submitter_relationship,
booth.website_url,
booth.state]).html_safe

View file

@ -0,0 +1,26 @@
prawn_document(force_download: true, filename: "#{@file_name}.pdf", page_layout: :landscape) do |pdf|
booths_array = []
header_array = ['Booth ID',
'Title',
'Description',
'Reasoning',
'Submitter Name',
'Submitter Relationship',
'Website Url',
'State']
booths_array << header_array
@booths.each do |booth|
row = []
row << booth.id
row << booth.title
row << booth.description
row << booth.reasoning
row << booth.submitter.name
row << booth.submitter_relationship
row << booth.website_url
row << booth.state
booths_array << row
end
pdf.text "#{@conference.short_title} booths", font_size: 25, align: :center
pdf.table booths_array, header: true, cell_style: {size: 8, border_width: 1},column_widths: [45,70,153,152,70,80,105,45]
end

View file

@ -0,0 +1,27 @@
wb.add_worksheet(name: 'all booths') do |sheet|
bold_style = wb.styles.add_style(b: true)
wrap_text = wb.styles.add_style alignment: {wrap_text: true}
row = ['Booth ID',
'Title',
'Description',
'Reasoning',
'Submitter Name',
'Submitter Relationship',
'Website Url',
'State']
sheet.add_row row, style: bold_style
@booths.each do |booth|
row = []
row << booth.id
row << booth.title
row << booth.description
row << booth.reasoning
row << booth.submitter.name
row << booth.submitter_relationship
row << booth.website_url
row << booth.state
sheet.add_row row , style: wrap_text
sheet.column_widths 10,20,35,35,20,30,35,10
end
end

View file

@ -0,0 +1,19 @@
- headers = ['Booth ID',
'Title',
'Description',
'Reasoning',
'Submitter Name',
'Submitter Relationship',
'Website Url',
'State']
= CSV.generate_line ['All booths']
= CSV.generate_line headers
- @booths.confirmed.each do |booth|
= CSV.generate_line([booth.id,
booth.title,
booth.description,
booth.reasoning,
booth.submitter.name,
booth.submitter_relationship,
booth.website_url,
booth.state]).html_safe

View file

@ -0,0 +1,26 @@
prawn_document(force_download: true, filename: "#{@file_name}.pdf", page_layout: :landscape) do |pdf|
booths_array = []
header_array = ['Booth ID',
'Title',
'Description',
'Reasoning',
'Submitter Name',
'Submitter Relationship',
'Website Url',
'State']
booths_array << header_array
@booths.confirmed.each do |booth|
row = []
row << booth.id
row << booth.title
row << booth.description
row << booth.reasoning
row << booth.submitter.name
row << booth.submitter_relationship
row << booth.website_url
row << booth.state
booths_array << row
end
pdf.text "#{@conference.short_title} booths", font_size: 25, align: :center
pdf.table booths_array, header: true, cell_style: {size: 8, border_width: 1},column_widths: [45,70,153,152,70,80,105,45]
end

View file

@ -0,0 +1,27 @@
wb.add_worksheet(name: 'all booths') do |sheet|
bold_style = wb.styles.add_style(b: true)
wrap_text = wb.styles.add_style alignment: {wrap_text: true}
row = ['Booth ID',
'Title',
'Description',
'Reasoning',
'Submitter Name',
'Submitter Relationship',
'Website Url',
'State']
sheet.add_row row, style: bold_style
@booths.confirmed.each do |booth|
row = []
row << booth.id
row << booth.title
row << booth.description
row << booth.reasoning
row << booth.submitter.name
row << booth.submitter_relationship
row << booth.website_url
row << booth.state
sheet.add_row row , style: wrap_text
sheet.column_widths 10,20,35,35,20,30,35,10
end
end

View file

@ -0,0 +1,4 @@
- if @booth_export_option == 'confirmed'
= render 'confirmed_booths'
- elsif @booth_export_option == 'all'
= render 'all_booths'

View file

@ -0,0 +1,5 @@
if @booth_export_option == 'confirmed'
render 'confirmed_booths'
elsif @booth_export_option == 'all'
render 'all_booths'
end

View file

@ -0,0 +1,7 @@
wb = xlsx_package.workbook
xlsx_package.use_autowidth = true
if @booth_export_option == 'confirmed'
render partial: 'confirmed_booths', locals: { wb: wb }
elsif @booth_export_option == 'all'
render partial: 'all_booths', locals: { wb: wb }
end

View file

@ -3,6 +3,30 @@
.page-header
%h1
Booths
.pull-right
- if can? :read, Booth
.btn-group
.btn-group
%button.btn.btn-default.dropdown-toggle{ 'data-toggle' => 'dropdown', type: 'button', class: 'btn btn-success' }
Export PDF
%span.caret
%ul.dropdown-menu{ role: 'menu' }
%li= link_to 'All Booths', admin_conference_booths_path(@conference.short_title, format: :pdf, booth_export_option: 'all')
%li= link_to 'Confirmed Booths', admin_conference_booths_path(@conference.short_title, format: :pdf, booth_export_option: 'confirmed')
.btn-group
%button.btn.btn-default.dropdown-toggle{ 'data-toggle' => 'dropdown', type: 'button', class: 'btn btn-success' }
Export CSV
%span.caret
%ul.dropdown-menu{ role: 'menu' }
%li= link_to 'All', admin_conference_booths_path(@conference.short_title, format: :csv, booth_export_option: 'all')
%li= link_to 'Confirmed', admin_conference_booths_path(@conference.short_title, format: :csv, booth_export_option: 'confirmed')
.btn-group
%button.btn.btn-default.dropdown-toggle{ 'data-toggle' => 'dropdown', type: 'button', class: 'btn btn-success' }
Export XLS
%span.caret
%ul.dropdown-menu{ role: 'menu' }
%li= link_to 'All', admin_conference_booths_path(@conference.short_title, format: :xlsx, booth_export_option: 'all')
%li= link_to 'Confirmed', admin_conference_booths_path(@conference.short_title, format: :xlsx, booth_export_option: 'confirmed')
= "(#{@booths.length})" if @booths.any?
%p.text-muted
All the booth requests

View file

@ -11,6 +11,10 @@
%dd
= @cfp.end_date.strftime('%A, %B %e. %Y')
%dt
Days Left:
Description
%dd
= markdown(@cfp.description)
%dt
Days Left
%dd
= pluralize(@cfp.remaining_days, 'day')

View file

@ -10,6 +10,10 @@
End Date:
%dd#end_date
= @cfp.end_date.strftime('%A, %B %-d. %Y')
%dt
Description:
%dd#description
= markdown(@cfp.description)
%dt
Days Left:
%dd

View file

@ -8,5 +8,6 @@
= f.input :start_date, as: :string, input_html: { id: 'registration-period-start-datepicker', start_date: @conference.start_date, end_date: @conference.end_date, readonly: 'readonly' }
= f.input :end_date, as: :string, input_html: { id: 'registration-period-end-datepicker', readonly: 'readonly' }
= f.input :cfp_type, as: :select, collection: (@cfp.new_record? ? @program.remaining_cfp_types : [@cfp.cfp_type] + @program.remaining_cfp_types).map {|type| ["#{type.capitalize}", type]}, include_blank: false, label: 'Type', input_html: { class: 'select-help-toggle' }
= f.input :description, input_html: {rows: 2, data: { provide: 'markdown-editable' } }, hint: markdown_hint
%p.text-right
= f.action :submit, as: :button, button_html: { class: 'btn btn-primary' }

View file

@ -10,6 +10,10 @@
End Date:
%dd#end_date
= @cfp.end_date.strftime('%A, %B %-d. %Y')
%dt
Description:
%dd#description
= markdown(@cfp.description)
%dt
Days Left:
%dd

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