Merge branch 'master' into payment_end_date
This commit is contained in:
commit
4ce142d0e3
186 changed files with 1570 additions and 512 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -38,3 +38,5 @@ pickle-email-*.html
|
|||
.env.local
|
||||
docker-compose.env
|
||||
docker-compose.yml
|
||||
.DS_Store
|
||||
.byebug_history
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
14
Dockerfile
14
Dockerfile
|
|
@ -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
54
Gemfile
|
|
@ -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
|
||||
|
|
|
|||
194
Gemfile.lock
194
Gemfile.lock
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
module Admin
|
||||
class BaseController < ApplicationController
|
||||
before_filter :verify_user_admin
|
||||
before_action :verify_user_admin
|
||||
|
||||
private
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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|
|
||||
|
|
|
|||
|
|
@ -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?
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
private
|
||||
|
||||
def sign_up_params
|
||||
params.require(:user).permit(
|
||||
:email,
|
||||
:password,
|
||||
:password_confirmation,
|
||||
:name,
|
||||
:username
|
||||
)
|
||||
end
|
||||
devise_parameter_sanitizer.permit(:sign_up) do |u|
|
||||
u
|
||||
.permit(:email, :password, :password_confirmation, :name, :username)
|
||||
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -5,9 +5,9 @@ module PathsHelper
|
|||
|
||||
def active_nav_li(link)
|
||||
if current_page?(link)
|
||||
return 'active'
|
||||
'active'
|
||||
else
|
||||
return ''
|
||||
''
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
2
app/jobs/application_job.rb
Normal file
2
app/jobs/application_job.rb
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
class ApplicationJob < ActiveJob::Base
|
||||
end
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
class ConferenceCfpUpdateMailJob < ActiveJob::Base
|
||||
class ConferenceCfpUpdateMailJob < ApplicationJob
|
||||
queue_as :default
|
||||
|
||||
def perform(conference)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class ConferenceDateUpdateMailJob < ActiveJob::Base
|
||||
class ConferenceDateUpdateMailJob < ApplicationJob
|
||||
queue_as :default
|
||||
|
||||
def perform(conference)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class ConferenceRegistrationDateUpdateMailJob < ActiveJob::Base
|
||||
class ConferenceRegistrationDateUpdateMailJob < ApplicationJob
|
||||
queue_as :default
|
||||
|
||||
def perform(conference)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class ConferenceScheduleUpdateMailJob < ActiveJob::Base
|
||||
class ConferenceScheduleUpdateMailJob < ApplicationJob
|
||||
queue_as :default
|
||||
|
||||
def perform(conference)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class ConferenceVenueUpdateMailJob < ActiveJob::Base
|
||||
class ConferenceVenueUpdateMailJob < ApplicationJob
|
||||
queue_as :default
|
||||
|
||||
def perform(conference)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class EventCommentMailJob < ActiveJob::Base
|
||||
class EventCommentMailJob < ApplicationJob
|
||||
queue_as :default
|
||||
|
||||
def perform(comment)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
module Ahoy
|
||||
class Event < ActiveRecord::Base
|
||||
class Event < ApplicationRecord
|
||||
self.table_name = 'ahoy_events'
|
||||
|
||||
belongs_to :visit
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Answer < ActiveRecord::Base
|
||||
class Answer < ApplicationRecord
|
||||
has_many :qanswers
|
||||
has_many :questions, through: :qanswers
|
||||
|
||||
|
|
|
|||
3
app/models/application_record.rb
Normal file
3
app/models/application_record.rb
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
class ApplicationRecord < ActiveRecord::Base
|
||||
self.abstract_class = true
|
||||
end
|
||||
|
|
@ -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 }
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class BoothRequest < ActiveRecord::Base
|
||||
class BoothRequest < ApplicationRecord
|
||||
belongs_to :booth
|
||||
belongs_to :user
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Campaign < ActiveRecord::Base
|
||||
class Campaign < ApplicationRecord
|
||||
validates :name, :utm_campaign, presence: true
|
||||
|
||||
has_many :targets, dependent: :nullify
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Commercial < ActiveRecord::Base
|
||||
class Commercial < ApplicationRecord
|
||||
require 'oembed'
|
||||
|
||||
belongs_to :commercialable, polymorphic: true
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class DifficultyLevel < ActiveRecord::Base
|
||||
class DifficultyLevel < ApplicationRecord
|
||||
belongs_to :program
|
||||
has_many :events, dependent: :nullify
|
||||
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
speakers.map(&:name).join(', ')
|
||||
end
|
||||
result.to_a.to_sentence
|
||||
|
||||
# Returns emails of all the speaker belongs to a particular event
|
||||
def speaker_emails
|
||||
speakers.map(&:email).join(', ')
|
||||
end
|
||||
|
||||
##
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class EventSchedule < ActiveRecord::Base
|
||||
class EventSchedule < ApplicationRecord
|
||||
belongs_to :schedule
|
||||
belongs_to :event
|
||||
belongs_to :room
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class EventType < ActiveRecord::Base
|
||||
class EventType < ApplicationRecord
|
||||
belongs_to :program
|
||||
has_many :events, dependent: :restrict_with_error
|
||||
|
||||
|
|
|
|||
|
|
@ -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]]
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class EventsRegistration < ActiveRecord::Base
|
||||
class EventsRegistration < ApplicationRecord
|
||||
belongs_to :registration
|
||||
belongs_to :event
|
||||
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Openid < ActiveRecord::Base
|
||||
class Openid < ApplicationRecord
|
||||
belongs_to :user
|
||||
validates :provider, :uid, presence: true
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Organization < ActiveRecord::Base
|
||||
class Organization < ApplicationRecord
|
||||
resourcify :roles, dependent: :delete_all
|
||||
|
||||
has_paper_trail
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Payment < ActiveRecord::Base
|
||||
class Payment < ApplicationRecord
|
||||
has_many :ticket_purchases
|
||||
belongs_to :user
|
||||
belongs_to :conference
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Qanswer < ActiveRecord::Base
|
||||
class Qanswer < ApplicationRecord
|
||||
belongs_to :question
|
||||
belongs_to :answer, dependent: :delete
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Question < ActiveRecord::Base
|
||||
class Question < ApplicationRecord
|
||||
belongs_to :question_type
|
||||
has_and_belongs_to_many :conferences
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
class QuestionType < ActiveRecord::Base
|
||||
class QuestionType < ApplicationRecord
|
||||
has_many :questions
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Registration < ActiveRecord::Base
|
||||
class Registration < ApplicationRecord
|
||||
belongs_to :user
|
||||
belongs_to :conference
|
||||
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Room < ActiveRecord::Base
|
||||
class Room < ApplicationRecord
|
||||
include RevisionCount
|
||||
belongs_to :venue
|
||||
has_many :event_schedules, dependent: :destroy
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Schedule < ActiveRecord::Base
|
||||
class Schedule < ApplicationRecord
|
||||
belongs_to :program
|
||||
belongs_to :track
|
||||
has_many :event_schedules, dependent: :destroy
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Sponsor < ActiveRecord::Base
|
||||
class Sponsor < ApplicationRecord
|
||||
belongs_to :sponsorship_level
|
||||
belongs_to :conference
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class SponsorshipLevel < ActiveRecord::Base
|
||||
class SponsorshipLevel < ApplicationRecord
|
||||
validates :title, presence: true
|
||||
belongs_to :conference
|
||||
acts_as_list scope: :conference
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Subscription < ActiveRecord::Base
|
||||
class Subscription < ApplicationRecord
|
||||
belongs_to :conference
|
||||
belongs_to :user
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Target < ActiveRecord::Base
|
||||
class Target < ApplicationRecord
|
||||
include ActionView::Helpers::TextHelper
|
||||
|
||||
default_scope { order('due_date ASC') }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class TicketScanning < ActiveRecord::Base
|
||||
class TicketScanning < ApplicationRecord
|
||||
belongs_to :physical_ticket
|
||||
|
||||
before_create :mark_user_present
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Track < ActiveRecord::Base
|
||||
class Track < ApplicationRecord
|
||||
include ActiveRecord::Transitions
|
||||
include RevisionCount
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class UsersRole < ActiveRecord::Base
|
||||
class UsersRole < ApplicationRecord
|
||||
belongs_to :role
|
||||
belongs_to :user
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Vchoice < ActiveRecord::Base
|
||||
class Vchoice < ApplicationRecord
|
||||
belongs_to :vday
|
||||
belongs_to :vposition
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Vday < ActiveRecord::Base
|
||||
class Vday < ApplicationRecord
|
||||
belongs_to :conference
|
||||
|
||||
has_many :vchoices
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Visit < ActiveRecord::Base
|
||||
class Visit < ApplicationRecord
|
||||
has_many :ahoy_events, class_name: 'Ahoy::Event'
|
||||
belongs_to :user
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Vote < ActiveRecord::Base
|
||||
class Vote < ApplicationRecord
|
||||
belongs_to :user
|
||||
belongs_to :event
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
class Vposition < ActiveRecord::Base
|
||||
class Vposition < ApplicationRecord
|
||||
belongs_to :conference
|
||||
|
||||
has_many :vchoices
|
||||
|
|
|
|||
19
app/views/admin/booths/_all_booths.csv.haml
Normal file
19
app/views/admin/booths/_all_booths.csv.haml
Normal 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
|
||||
26
app/views/admin/booths/_all_booths.pdf.prawn
Normal file
26
app/views/admin/booths/_all_booths.pdf.prawn
Normal 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
|
||||
27
app/views/admin/booths/_all_booths.xlsx.axlsx
Normal file
27
app/views/admin/booths/_all_booths.xlsx.axlsx
Normal 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
|
||||
19
app/views/admin/booths/_confirmed_booths.csv.haml
Normal file
19
app/views/admin/booths/_confirmed_booths.csv.haml
Normal 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
|
||||
26
app/views/admin/booths/_confirmed_booths.pdf.prawn
Normal file
26
app/views/admin/booths/_confirmed_booths.pdf.prawn
Normal 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
|
||||
27
app/views/admin/booths/_confirmed_booths.xlsx.axlsx
Normal file
27
app/views/admin/booths/_confirmed_booths.xlsx.axlsx
Normal 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
|
||||
4
app/views/admin/booths/booths.csv.haml
Normal file
4
app/views/admin/booths/booths.csv.haml
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
- if @booth_export_option == 'confirmed'
|
||||
= render 'confirmed_booths'
|
||||
- elsif @booth_export_option == 'all'
|
||||
= render 'all_booths'
|
||||
5
app/views/admin/booths/booths.pdf.prawn
Normal file
5
app/views/admin/booths/booths.pdf.prawn
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
if @booth_export_option == 'confirmed'
|
||||
render 'confirmed_booths'
|
||||
elsif @booth_export_option == 'all'
|
||||
render 'all_booths'
|
||||
end
|
||||
7
app/views/admin/booths/booths.xlsx.axlsx
Normal file
7
app/views/admin/booths/booths.xlsx.axlsx
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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' }
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue