open_conference_ware 1.0.0.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data.tar.gz.sig +0 -0
- data/.autotest +14 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +21 -0
- data/.rspec +1 -0
- data/.travis.yml +18 -0
- data/CHANGES.md +280 -0
- data/CONTRIBUTORS.markdown +17 -0
- data/Gemfile +21 -0
- data/Gemfile.lock +296 -0
- data/Guardfile +24 -0
- data/LICENSE.txt +23 -0
- data/README.markdown +173 -0
- data/Rakefile +27 -0
- data/TODO.txt +22 -0
- data/app/assets/images/open_conference_ware/accept.png +0 -0
- data/app/assets/images/open_conference_ware/arrow-left.png +0 -0
- data/app/assets/images/open_conference_ware/arrow-out.png +0 -0
- data/app/assets/images/open_conference_ware/arrow-right.png +0 -0
- data/app/assets/images/open_conference_ware/arrow-up.png +0 -0
- data/app/assets/images/open_conference_ware/arrow_refresh.png +0 -0
- data/app/assets/images/open_conference_ware/comment.png +0 -0
- data/app/assets/images/open_conference_ware/comment_edit.png +0 -0
- data/app/assets/images/open_conference_ware/delete.png +0 -0
- data/app/assets/images/open_conference_ware/disk.png +0 -0
- data/app/assets/images/open_conference_ware/document-blank.png +0 -0
- data/app/assets/images/open_conference_ware/document.png +0 -0
- data/app/assets/images/open_conference_ware/edit.png +0 -0
- data/app/assets/images/open_conference_ware/extras/001_01.png +0 -0
- data/app/assets/images/open_conference_ware/extras/001_05.png +0 -0
- data/app/assets/images/open_conference_ware/extras/001_05x16.png +0 -0
- data/app/assets/images/open_conference_ware/extras/001_21.png +0 -0
- data/app/assets/images/open_conference_ware/extras/001_23.png +0 -0
- data/app/assets/images/open_conference_ware/extras/001_24.png +0 -0
- data/app/assets/images/open_conference_ware/extras/001_29.png +0 -0
- data/app/assets/images/open_conference_ware/extras/01.png +0 -0
- data/app/assets/images/open_conference_ware/extras/05.png +0 -0
- data/app/assets/images/open_conference_ware/extras/06.png +0 -0
- data/app/assets/images/open_conference_ware/extras/1.png +0 -0
- data/app/assets/images/open_conference_ware/extras/14.png +0 -0
- data/app/assets/images/open_conference_ware/extras/16.png +0 -0
- data/app/assets/images/open_conference_ware/extras/2.png +0 -0
- data/app/assets/images/open_conference_ware/extras/21.png +0 -0
- data/app/assets/images/open_conference_ware/extras/28.png +0 -0
- data/app/assets/images/open_conference_ware/extras/3.png +0 -0
- data/app/assets/images/open_conference_ware/extras/31.png +0 -0
- data/app/assets/images/open_conference_ware/extras/32.png +0 -0
- data/app/assets/images/open_conference_ware/extras/35.png +0 -0
- data/app/assets/images/open_conference_ware/extras/36.png +0 -0
- data/app/assets/images/open_conference_ware/extras/4.png +0 -0
- data/app/assets/images/open_conference_ware/extras/44.png +0 -0
- data/app/assets/images/open_conference_ware/extras/45.png +0 -0
- data/app/assets/images/open_conference_ware/extras/46.png +0 -0
- data/app/assets/images/open_conference_ware/extras/cancel.png +0 -0
- data/app/assets/images/open_conference_ware/extras/cancelx16.png +0 -0
- data/app/assets/images/open_conference_ware/extras/icon.trashcan.gif +0 -0
- data/app/assets/images/open_conference_ware/favorite.png +0 -0
- data/app/assets/images/open_conference_ware/feed.png +0 -0
- data/app/assets/images/open_conference_ware/heart.png +0 -0
- data/app/assets/images/open_conference_ware/house.png +0 -0
- data/app/assets/images/open_conference_ware/ignite_portland_header3_clear.png +0 -0
- data/app/assets/images/open_conference_ware/ignite_portland_header3_clear_cropped.png +0 -0
- data/app/assets/images/open_conference_ware/jquery.wysiwyg.gif +0 -0
- data/app/assets/images/open_conference_ware/lock.png +0 -0
- data/app/assets/images/open_conference_ware/new_window.gif +0 -0
- data/app/assets/images/open_conference_ware/openid-icon.gif +0 -0
- data/app/assets/images/open_conference_ware/pencil.png +0 -0
- data/app/assets/images/open_conference_ware/plus.png +0 -0
- data/app/assets/images/open_conference_ware/quote.png +0 -0
- data/app/assets/images/open_conference_ware/rails.png +0 -0
- data/app/assets/images/open_conference_ware/redx.png +0 -0
- data/app/assets/images/open_conference_ware/reset-fff.png +0 -0
- data/app/assets/images/open_conference_ware/spinner-big.gif +0 -0
- data/app/assets/images/open_conference_ware/spinner.gif +0 -0
- data/app/assets/images/open_conference_ware/star.png +0 -0
- data/app/assets/images/open_conference_ware/tag_blue.png +0 -0
- data/app/assets/images/open_conference_ware/time.png +0 -0
- data/app/assets/javascripts/open_conference_ware/application.js +18 -0
- data/app/assets/javascripts/open_conference_ware/base.js +15 -0
- data/app/assets/javascripts/open_conference_ware/favorites.js +76 -0
- data/app/assets/javascripts/open_conference_ware/ie.js +2 -0
- data/app/assets/javascripts/open_conference_ware/menu.js +47 -0
- data/app/assets/javascripts/open_conference_ware/persona.js +10 -0
- data/app/assets/javascripts/open_conference_ware/proposals.js +208 -0
- data/app/assets/javascripts/open_conference_ware/schedule.js +20 -0
- data/app/assets/javascripts/open_conference_ware/spinner.js +11 -0
- data/app/assets/javascripts/open_conference_ware/util.js +23 -0
- data/app/assets/stylesheets/open_conference_ware/application.css +8 -0
- data/app/assets/stylesheets/open_conference_ware/common.css.scss +491 -0
- data/app/assets/stylesheets/open_conference_ware/custom.css.scss +1033 -0
- data/app/assets/stylesheets/open_conference_ware/scaffold.css +54 -0
- data/app/controllers/open_conference_ware/application_controller.rb +488 -0
- data/app/controllers/open_conference_ware/authentications_controller.rb +42 -0
- data/app/controllers/open_conference_ware/comments_controller.rb +86 -0
- data/app/controllers/open_conference_ware/events_controller.rb +36 -0
- data/app/controllers/open_conference_ware/manage/events_controller.rb +157 -0
- data/app/controllers/open_conference_ware/manage/snippets_controller.rb +110 -0
- data/app/controllers/open_conference_ware/proposals_controller.rb +521 -0
- data/app/controllers/open_conference_ware/rooms_controller.rb +130 -0
- data/app/controllers/open_conference_ware/schedule_items_controller.rb +128 -0
- data/app/controllers/open_conference_ware/selector_votes_controller.rb +71 -0
- data/app/controllers/open_conference_ware/session_types_controller.rb +123 -0
- data/app/controllers/open_conference_ware/tracks_controller.rb +118 -0
- data/app/controllers/open_conference_ware/user_favorites_controller.rb +68 -0
- data/app/controllers/open_conference_ware/users_controller.rb +120 -0
- data/app/helpers/open_conference_ware/application_helper.rb +167 -0
- data/app/helpers/open_conference_ware/authentications_helper.rb +25 -0
- data/app/helpers/open_conference_ware/cache_if_helper.rb +13 -0
- data/app/helpers/open_conference_ware/display_link_to_helper.rb +25 -0
- data/app/helpers/open_conference_ware/display_textile_for_helper.rb +11 -0
- data/app/helpers/open_conference_ware/field_annotation_helper.rb +11 -0
- data/app/helpers/open_conference_ware/focus_helper.rb +16 -0
- data/app/helpers/open_conference_ware/localcss_helper.rb +10 -0
- data/app/helpers/open_conference_ware/page_title_helper.rb +17 -0
- data/app/helpers/open_conference_ware/proposals_helper.rb +54 -0
- data/app/helpers/open_conference_ware/rooms_helper.rb +5 -0
- data/app/helpers/open_conference_ware/scroll_to_helper.rb +15 -0
- data/app/helpers/open_conference_ware/session_types_helper.rb +5 -0
- data/app/helpers/open_conference_ware/snippets_helper.rb +36 -0
- data/app/helpers/open_conference_ware/time_range_helper.rb +198 -0
- data/app/helpers/open_conference_ware/tracks_helper.rb +9 -0
- data/app/helpers/open_conference_ware/user_favorites_helper.rb +15 -0
- data/app/mailers/open_conference_ware/speaker_mailer.rb +51 -0
- data/app/mixins/open_conference_ware/breadcrumbs_mixin.rb +76 -0
- data/app/mixins/open_conference_ware/cache_lookups_mixin.rb +128 -0
- data/app/mixins/open_conference_ware/faux_routes_mixin.rb +83 -0
- data/app/mixins/open_conference_ware/normalize_url_mixin.rb +40 -0
- data/app/mixins/open_conference_ware/public_attributes_mixin.rb +62 -0
- data/app/mixins/open_conference_ware/schedule_overlaps_mixin.rb +12 -0
- data/app/mixins/open_conference_ware/settings_checkers_mixin.rb +50 -0
- data/app/mixins/open_conference_ware/simple_slug_mixin.rb +26 -0
- data/app/models/open_conference_ware/authentication.rb +47 -0
- data/app/models/open_conference_ware/base.rb +6 -0
- data/app/models/open_conference_ware/comment.rb +26 -0
- data/app/models/open_conference_ware/event.rb +227 -0
- data/app/models/open_conference_ware/proposal.rb +625 -0
- data/app/models/open_conference_ware/room.rb +42 -0
- data/app/models/open_conference_ware/schedule.rb +216 -0
- data/app/models/open_conference_ware/schedule_item.rb +55 -0
- data/app/models/open_conference_ware/selector_vote.rb +22 -0
- data/app/models/open_conference_ware/session_type.rb +33 -0
- data/app/models/open_conference_ware/snippet.rb +58 -0
- data/app/models/open_conference_ware/track.rb +51 -0
- data/app/models/open_conference_ware/user.rb +262 -0
- data/app/models/open_conference_ware/user_favorite.rb +42 -0
- data/app/observers/open_conference_ware/cache_watcher.rb +42 -0
- data/app/views/layouts/open_conference_ware/_header.html.erb +106 -0
- data/app/views/layouts/open_conference_ware/application.atom.erb +1 -0
- data/app/views/layouts/open_conference_ware/application.html.erb +126 -0
- data/app/views/layouts/open_conference_ware/scaffold.html.erb +21 -0
- data/app/views/open_conference_ware/404.html.erb +8 -0
- data/app/views/open_conference_ware/422.html.erb +11 -0
- data/app/views/open_conference_ware/500.html.erb +11 -0
- data/app/views/open_conference_ware/_email_link.html.erb +24 -0
- data/app/views/open_conference_ware/_google_analytics.html.erb +9 -0
- data/app/views/open_conference_ware/authentications/_developer.html.erb +7 -0
- data/app/views/open_conference_ware/authentications/_openid.html.erb +11 -0
- data/app/views/open_conference_ware/authentications/_persona.html.erb +17 -0
- data/app/views/open_conference_ware/authentications/sign_in.html.erb +12 -0
- data/app/views/open_conference_ware/comments/_list.html.erb +31 -0
- data/app/views/open_conference_ware/comments/index.atom.builder +25 -0
- data/app/views/open_conference_ware/comments/index.html.erb +3 -0
- data/app/views/open_conference_ware/events/index.html.erb +9 -0
- data/app/views/open_conference_ware/events/show.html.erb +0 -0
- data/app/views/open_conference_ware/events/speakers.html.erb +7 -0
- data/app/views/open_conference_ware/manage/events/_form.html.erb +107 -0
- data/app/views/open_conference_ware/manage/events/edit.html.erb +3 -0
- data/app/views/open_conference_ware/manage/events/index.html.erb +41 -0
- data/app/views/open_conference_ware/manage/events/new.html.erb +3 -0
- data/app/views/open_conference_ware/manage/events/proposals.html.erb +133 -0
- data/app/views/open_conference_ware/manage/events/show.html.erb +181 -0
- data/app/views/open_conference_ware/manage/snippets/_form.html.erb +30 -0
- data/app/views/open_conference_ware/manage/snippets/edit.html.erb +3 -0
- data/app/views/open_conference_ware/manage/snippets/index.html.erb +34 -0
- data/app/views/open_conference_ware/manage/snippets/new.html.erb +3 -0
- data/app/views/open_conference_ware/manage/snippets/show.html.erb +32 -0
- data/app/views/open_conference_ware/proposals/_admin_controls.html.erb +33 -0
- data/app/views/open_conference_ware/proposals/_form.html.erb +381 -0
- data/app/views/open_conference_ware/proposals/_list.html.erb +164 -0
- data/app/views/open_conference_ware/proposals/_list_concise.html.erb +93 -0
- data/app/views/open_conference_ware/proposals/_manage_speakers.html.erb +30 -0
- data/app/views/open_conference_ware/proposals/_room_control.html.erb +21 -0
- data/app/views/open_conference_ware/proposals/_schedule_block.html.erb +8 -0
- data/app/views/open_conference_ware/proposals/_schedule_control.html.erb +13 -0
- data/app/views/open_conference_ware/proposals/_search_speakers.html.erb +20 -0
- data/app/views/open_conference_ware/proposals/_sub_list.html.erb +65 -0
- data/app/views/open_conference_ware/proposals/_sub_list_for_kind.html.erb +31 -0
- data/app/views/open_conference_ware/proposals/_transition_control.html.erb +16 -0
- data/app/views/open_conference_ware/proposals/create.html.erb +29 -0
- data/app/views/open_conference_ware/proposals/edit.html.erb +7 -0
- data/app/views/open_conference_ware/proposals/index.atom.builder +63 -0
- data/app/views/open_conference_ware/proposals/index.html.erb +46 -0
- data/app/views/open_conference_ware/proposals/new.html.erb +3 -0
- data/app/views/open_conference_ware/proposals/schedule.html.erb +108 -0
- data/app/views/open_conference_ware/proposals/sessions_index_terse.html.erb +22 -0
- data/app/views/open_conference_ware/proposals/show.html.erb +316 -0
- data/app/views/open_conference_ware/proposals/stats.html.erb +72 -0
- data/app/views/open_conference_ware/rooms/_form.html.erb +36 -0
- data/app/views/open_conference_ware/rooms/edit.html.erb +3 -0
- data/app/views/open_conference_ware/rooms/index.html.erb +13 -0
- data/app/views/open_conference_ware/rooms/new.html.erb +3 -0
- data/app/views/open_conference_ware/rooms/show.html.erb +27 -0
- data/app/views/open_conference_ware/schedule_items/_form.html.erb +35 -0
- data/app/views/open_conference_ware/schedule_items/edit.html.erb +3 -0
- data/app/views/open_conference_ware/schedule_items/index.html.erb +31 -0
- data/app/views/open_conference_ware/schedule_items/new.html.erb +3 -0
- data/app/views/open_conference_ware/schedule_items/show.html.erb +30 -0
- data/app/views/open_conference_ware/selector_votes/index.html.erb +81 -0
- data/app/views/open_conference_ware/session_types/_form.html.erb +23 -0
- data/app/views/open_conference_ware/session_types/edit.html.erb +3 -0
- data/app/views/open_conference_ware/session_types/index.html.erb +18 -0
- data/app/views/open_conference_ware/session_types/new.html.erb +3 -0
- data/app/views/open_conference_ware/session_types/show.html.erb +14 -0
- data/app/views/open_conference_ware/speaker_mailer/speaker_email.text.erb +14 -0
- data/app/views/open_conference_ware/tracks/_colors.css.erb +7 -0
- data/app/views/open_conference_ware/tracks/_form.html.erb +36 -0
- data/app/views/open_conference_ware/tracks/edit.html.erb +3 -0
- data/app/views/open_conference_ware/tracks/index.html.erb +25 -0
- data/app/views/open_conference_ware/tracks/new.html.erb +3 -0
- data/app/views/open_conference_ware/tracks/show.html.erb +19 -0
- data/app/views/open_conference_ware/user_favorites/index.html.erb +12 -0
- data/app/views/open_conference_ware/users/_account_box.html.erb +10 -0
- data/app/views/open_conference_ware/users/_block.html.erb +80 -0
- data/app/views/open_conference_ware/users/_list.html.erb +17 -0
- data/app/views/open_conference_ware/users/edit.html.erb +73 -0
- data/app/views/open_conference_ware/users/index.html.erb +28 -0
- data/app/views/open_conference_ware/users/new.html.erb +7 -0
- data/app/views/open_conference_ware/users/proposals.html.erb +24 -0
- data/app/views/open_conference_ware/users/show.html.erb +5 -0
- data/app/views/open_conference_ware/welcome/test.html.haml +8 -0
- data/bin/rails +8 -0
- data/ci/Gemfile.ci +13 -0
- data/ci/copy_database_config.rb +6 -0
- data/ci/database.mysql.yml +5 -0
- data/ci/database.postgresql.yml +4 -0
- data/ci/database.sqlite.yml +5 -0
- data/config/initializers/acts_as_taggable_on.rb +2 -0
- data/config/initializers/date_time_formats.rb +9 -0
- data/config/routes.rb +74 -0
- data/db/migrate/20131203235128_create_open_conference_ware_authentications.rb +14 -0
- data/db/migrate/20131203235216_create_open_conference_ware_comments.rb +14 -0
- data/db/migrate/20131203235418_create_open_conference_ware_events.rb +27 -0
- data/db/migrate/20131203235524_create_open_conference_ware_proposals.rb +36 -0
- data/db/migrate/20131203235723_create_open_conference_ware_rooms.rb +20 -0
- data/db/migrate/20131203235831_create_open_conference_ware_schedule_items.rb +18 -0
- data/db/migrate/20131203235910_create_open_conference_ware_selector_votes.rb +10 -0
- data/db/migrate/20131203235934_create_open_conference_ware_session_types.rb +14 -0
- data/db/migrate/20131204000008_create_open_conference_ware_snippets.rb +15 -0
- data/db/migrate/20131204000048_create_open_conference_ware_taggings.rb +16 -0
- data/db/migrate/20131204000129_create_open_conference_ware_tags.rb +7 -0
- data/db/migrate/20131204000147_create_open_conference_ware_tracks.rb +15 -0
- data/db/migrate/20131204000230_create_open_conference_ware_user_favorites.rb +10 -0
- data/db/migrate/20131204000251_create_open_conference_ware_users.rb +24 -0
- data/db/migrate/20131204000355_create_proposals_users_join_table.rb +8 -0
- data/db/seeds.rb +31 -0
- data/features/comment_create.feature +9 -0
- data/features/comment_destroy.feature +22 -0
- data/features/comment_new.feature +22 -0
- data/features/step_definitions/authentication_steps.rb +22 -0
- data/features/step_definitions/comment_create_steps.rb +5 -0
- data/features/step_definitions/comment_destroy_steps.rb +13 -0
- data/features/step_definitions/comment_new_steps.rb +41 -0
- data/features/step_definitions/notification_steps.rb +3 -0
- data/features/step_definitions/web_steps.rb +263 -0
- data/features/support/env.rb +58 -0
- data/features/support/helpers.rb +17 -0
- data/features/support/paths.rb +35 -0
- data/gem-public_cert.pem +22 -0
- data/lib/defer_proxy.rb +127 -0
- data/lib/ext/color_rgb_serializer_fix.rb +18 -0
- data/lib/ext/string_possessiveize.rb +7 -0
- data/lib/ext/vpim_icalendar_extra_properties.rb +25 -0
- data/lib/generators/open_conference_ware/install/USAGE +12 -0
- data/lib/generators/open_conference_ware/install/install_generator.rb +35 -0
- data/lib/generators/open_conference_ware/install/templates/config_initializer.rb +110 -0
- data/lib/generators/open_conference_ware/install/templates/omniauth_initializer.rb +33 -0
- data/lib/open_conference_ware.rb +156 -0
- data/lib/open_conference_ware/dependencies.rb +38 -0
- data/lib/open_conference_ware/engine.rb +38 -0
- data/lib/open_conference_ware/omni_auth_builder.rb +8 -0
- data/lib/open_conference_ware/version.rb +3 -0
- data/lib/rwikibot_page_drone.rb +70 -0
- data/lib/tasks/.gitkeep +0 -0
- data/lib/tasks/audio.rake +53 -0
- data/lib/tasks/cucumber.rake +65 -0
- data/lib/tasks/export.rake +170 -0
- data/lib/tasks/mediawiki.rake +96 -0
- data/lib/tasks/open_conference_ware_tasks.rake +16 -0
- data/lib/tasks/schedule.rake +103 -0
- data/lib/tasks/snippets.rake +23 -0
- data/open_conference_ware.gemspec +67 -0
- data/original_graphics/favorite.psd +0 -0
- data/spec/controllers/open_conference_ware/application_controller_spec.rb +309 -0
- data/spec/controllers/open_conference_ware/authentications_controller_spec.rb +87 -0
- data/spec/controllers/open_conference_ware/comments_controller_spec.rb +146 -0
- data/spec/controllers/open_conference_ware/events_controller_spec.rb +102 -0
- data/spec/controllers/open_conference_ware/manage_events_controller_spec.rb +103 -0
- data/spec/controllers/open_conference_ware/proposals_controller_spec.rb +1273 -0
- data/spec/controllers/open_conference_ware/rooms_controller_spec.rb +190 -0
- data/spec/controllers/open_conference_ware/selector_votes_controller_spec.rb +263 -0
- data/spec/controllers/open_conference_ware/session_types_controller_spec.rb +190 -0
- data/spec/controllers/open_conference_ware/sessions_routing_spec.rb +13 -0
- data/spec/controllers/open_conference_ware/tracks_controller_spec.rb +190 -0
- data/spec/controllers/open_conference_ware/user_favorites_controller_spec.rb +127 -0
- data/spec/controllers/open_conference_ware/users_controller_spec.rb +166 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +30 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +29 -0
- data/spec/dummy/config/environments/production.rb +80 -0
- data/spec/dummy/config/environments/test.rb +36 -0
- data/spec/dummy/config/initializers/01_open_conference_ware.rb +110 -0
- data/spec/dummy/config/initializers/02_omniauth.rb +17 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +12 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/db/schema.rb +219 -0
- data/spec/dummy/db/seeds.rb +10 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/public/404.html +58 -0
- data/spec/dummy/public/422.html +58 -0
- data/spec/dummy/public/500.html +57 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/factories/authentication_factory.rb +16 -0
- data/spec/factories/common_factory.rb +4 -0
- data/spec/factories/event_factory.rb +26 -0
- data/spec/factories/proposal_factory.rb +57 -0
- data/spec/factories/proposal_user_factory.rb +7 -0
- data/spec/factories/room_factory.rb +11 -0
- data/spec/factories/schedule_item_factory.rb +13 -0
- data/spec/factories/session_types_factory.rb +10 -0
- data/spec/factories/snippet_factory.rb +7 -0
- data/spec/factories/track_factory.rb +12 -0
- data/spec/factories/user_factory.rb +22 -0
- data/spec/factories/user_favorite_factory.rb +7 -0
- data/spec/features/sign_in_spec.rb +11 -0
- data/spec/features/snippets_spec.rb +38 -0
- data/spec/fixtures/open_conference_ware_comments.yml +27 -0
- data/spec/fixtures/open_conference_ware_events.yml +56 -0
- data/spec/fixtures/open_conference_ware_proposals.yml +256 -0
- data/spec/fixtures/open_conference_ware_rooms.yml +13 -0
- data/spec/fixtures/open_conference_ware_schedule_items.yml +23 -0
- data/spec/fixtures/open_conference_ware_session_types.yml +19 -0
- data/spec/fixtures/open_conference_ware_snippets.yml +62 -0
- data/spec/fixtures/open_conference_ware_tracks.yml +65 -0
- data/spec/fixtures/open_conference_ware_user_favorites.yml +7 -0
- data/spec/fixtures/open_conference_ware_users.yml +87 -0
- data/spec/helpers/open_conference_ware/application_helper_spec.rb +58 -0
- data/spec/helpers/open_conference_ware/authentications_helper_spec.rb +15 -0
- data/spec/helpers/open_conference_ware/display_link_to_helper_spec.rb +52 -0
- data/spec/helpers/open_conference_ware/proposals_helper_spec.rb +32 -0
- data/spec/helpers/open_conference_ware/rooms_helper_spec.rb +11 -0
- data/spec/helpers/open_conference_ware/session_types_helper_spec.rb +15 -0
- data/spec/helpers/open_conference_ware/time_range_helper_spec.rb +56 -0
- data/spec/helpers/open_conference_ware/tracks_helper_spec.rb +11 -0
- data/spec/helpers/open_conference_ware/user_favorites_helper_spec.rb +11 -0
- data/spec/integration/open_conference_ware/cache_lookups_mixin_spec.rb +122 -0
- data/spec/mixins/open_conference_ware/normalize_url_mixin_spec.rb +65 -0
- data/spec/models/open_conference_ware/authentication_spec.rb +67 -0
- data/spec/models/open_conference_ware/event_spec.rb +211 -0
- data/spec/models/open_conference_ware/proposal_spec.rb +606 -0
- data/spec/models/open_conference_ware/room_spec.rb +14 -0
- data/spec/models/open_conference_ware/schedule_item_spec.rb +12 -0
- data/spec/models/open_conference_ware/schedule_spec.rb +358 -0
- data/spec/models/open_conference_ware/selector_vote_spec.rb +12 -0
- data/spec/models/open_conference_ware/session_type_spec.rb +15 -0
- data/spec/models/open_conference_ware/snippet_spec.rb +13 -0
- data/spec/models/open_conference_ware/speaker_mailer_spec.rb +91 -0
- data/spec/models/open_conference_ware/track_spec.rb +36 -0
- data/spec/models/open_conference_ware/user_favorite_spec.rb +41 -0
- data/spec/models/open_conference_ware/user_spec.rb +77 -0
- data/spec/ocw_config.rb +76 -0
- data/spec/rcov.opts +2 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +55 -0
- data/spec/spec_helper_customizations.rb +125 -0
- data/spec/support/add_all_helpers_to_view.rb +24 -0
- data/spec/support/authenticated_test_helper.rb +27 -0
- data/spec/support/fixture_shortcuts.rb +18 -0
- data/spec/support/omniauth.rb +34 -0
- data/spec/support/valid_params_extraction.rb +15 -0
- data/spec/views/open_conference_ware/proposals/_room_control.html.erb_spec.rb +23 -0
- data/spec/views/open_conference_ware/proposals/_transition_control.html.erb_spec.rb +14 -0
- data/spec/views/open_conference_ware/proposals/show.html.erb_spec.rb +128 -0
- data/spec/views/open_conference_ware/rooms/index.html.erb_spec.rb +19 -0
- data/spec/views/open_conference_ware/rooms/show.html.erb_spec.rb +15 -0
- data/spec/views/open_conference_ware/selector_votes/index.html.erb_spec.rb +41 -0
- data/spec/views/open_conference_ware/session_types/edit.html.erb_spec.rb +25 -0
- data/spec/views/open_conference_ware/session_types/index.html.erb_spec.rb +19 -0
- data/spec/views/open_conference_ware/session_types/new.html.erb_spec.rb +24 -0
- data/spec/views/open_conference_ware/session_types/show.html.erb_spec.rb +18 -0
- data/spec/views/open_conference_ware/tracks/edit.html.erb_spec.rb +25 -0
- data/spec/views/open_conference_ware/tracks/index.html.erb_spec.rb +56 -0
- data/spec/views/open_conference_ware/tracks/new.html.erb_spec.rb +26 -0
- data/spec/views/open_conference_ware/tracks/show.html.erb_spec.rb +23 -0
- data/spec/views/open_conference_ware/user_favorites/index.html.erb_spec.rb +29 -0
- data/spec/views/open_conference_ware/users/index_spec.rb +24 -0
- data/util/add_id3_tags_to_mp3.rb +57 -0
- data/util/schedule_demo.rb +36 -0
- data/util/seed_schedule.rb +61 -0
- data/util/sessions_to_lanyrd.rb +166 -0
- data/util/transfer_schedule_items.rb +25 -0
- data/util/update_proposal_status_from_voting_spreadsheet.rb +26 -0
- data/util/user_favorites_contention_report.rb +42 -0
- data/util/user_favorites_contention_report.sh +9 -0
- data/vendor/assets/fonts/glyphicons-halflings-regular.eot +0 -0
- data/vendor/assets/fonts/glyphicons-halflings-regular.svg +228 -0
- data/vendor/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/vendor/assets/fonts/glyphicons-halflings-regular.woff +0 -0
- data/vendor/assets/images/farbtastic/marker.png +0 -0
- data/vendor/assets/images/farbtastic/mask.png +0 -0
- data/vendor/assets/images/farbtastic/wheel.png +0 -0
- data/vendor/assets/images/idselector/aol.ico +0 -0
- data/vendor/assets/images/idselector/arrow.gif +0 -0
- data/vendor/assets/images/idselector/arrow_white_back.png +0 -0
- data/vendor/assets/images/idselector/arrow_white_forward.png +0 -0
- data/vendor/assets/images/idselector/blogger.ico +0 -0
- data/vendor/assets/images/idselector/claimid.ico +0 -0
- data/vendor/assets/images/idselector/flickr.ico +0 -0
- data/vendor/assets/images/idselector/google.ico +0 -0
- data/vendor/assets/images/idselector/lj.ico +0 -0
- data/vendor/assets/images/idselector/myopenid.ico +0 -0
- data/vendor/assets/images/idselector/openid.ico +0 -0
- data/vendor/assets/images/idselector/technorati.ico +0 -0
- data/vendor/assets/images/idselector/verisign.ico +0 -0
- data/vendor/assets/images/idselector/vidoop2.ico +0 -0
- data/vendor/assets/images/idselector/vox.ico +0 -0
- data/vendor/assets/images/idselector/yahoo.ico +0 -0
- data/vendor/assets/javascripts/audiojs/audio.min.js +23 -0
- data/vendor/assets/javascripts/audiojs/audiojs.swf +0 -0
- data/vendor/assets/javascripts/audiojs/player-graphics.gif +0 -0
- data/vendor/assets/javascripts/bootstrap.js +1999 -0
- data/vendor/assets/javascripts/farbtastic.js +329 -0
- data/vendor/assets/javascripts/html5shiv.js +8 -0
- data/vendor/assets/javascripts/idselector.js +538 -0
- data/vendor/assets/javascripts/idselector~original.js +532 -0
- data/vendor/assets/javascripts/jquery-migrate-1.2.1.js +521 -0
- data/vendor/assets/javascripts/jquery.localScroll.js +106 -0
- data/vendor/assets/javascripts/jquery.scrollTo.js +174 -0
- data/vendor/assets/javascripts/respond.min.js +6 -0
- data/vendor/assets/stylesheets/bootstrap-theme.css +384 -0
- data/vendor/assets/stylesheets/bootstrap.css +6805 -0
- data/vendor/assets/stylesheets/farbtastic.css.scss +38 -0
- data/vendor/assets/stylesheets/persona-buttons.css +229 -0
- data/vendor/assets/stylesheets/reset-fonts-grids.css +7 -0
- metadata +1174 -0
- metadata.gz.sig +0 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
body { background-color: #fff; color: #333; }
|
|
2
|
+
|
|
3
|
+
body, p, ol, ul, td {
|
|
4
|
+
font-family: verdana, arial, helvetica, sans-serif;
|
|
5
|
+
font-size: 13px;
|
|
6
|
+
line-height: 18px;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
pre {
|
|
10
|
+
background-color: #eee;
|
|
11
|
+
padding: 10px;
|
|
12
|
+
font-size: 11px;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
a { color: #000; }
|
|
16
|
+
a:visited { color: #666; }
|
|
17
|
+
a:hover { color: #fff; background-color:#000; }
|
|
18
|
+
|
|
19
|
+
.fieldWithErrors {
|
|
20
|
+
padding: 2px;
|
|
21
|
+
background-color: red;
|
|
22
|
+
display: table;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
#errorExplanation {
|
|
26
|
+
width: 400px;
|
|
27
|
+
border: 2px solid red;
|
|
28
|
+
padding: 7px;
|
|
29
|
+
padding-bottom: 12px;
|
|
30
|
+
margin-bottom: 20px;
|
|
31
|
+
background-color: #f0f0f0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
#errorExplanation h2 {
|
|
35
|
+
text-align: left;
|
|
36
|
+
font-weight: bold;
|
|
37
|
+
padding: 5px 5px 5px 15px;
|
|
38
|
+
font-size: 12px;
|
|
39
|
+
margin: -7px;
|
|
40
|
+
background-color: #c00;
|
|
41
|
+
color: #fff;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
#errorExplanation p {
|
|
45
|
+
color: #333;
|
|
46
|
+
margin-bottom: 0;
|
|
47
|
+
padding: 5px;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
#errorExplanation ul li {
|
|
51
|
+
font-size: 12px;
|
|
52
|
+
list-style: square;
|
|
53
|
+
}
|
|
54
|
+
|
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
module OpenConferenceWare
|
|
2
|
+
# Filters added to this controller apply to all controllers in the application.
|
|
3
|
+
# Likewise, all the methods added will be available for all controllers.
|
|
4
|
+
|
|
5
|
+
class ApplicationController < ActionController::Base
|
|
6
|
+
|
|
7
|
+
helper :all # include all helpers, all the time
|
|
8
|
+
|
|
9
|
+
# See ActionController::RequestForgeryProtection for details
|
|
10
|
+
# Uncomment the :secret if you're not using the cookie session store
|
|
11
|
+
protect_from_forgery # secret: '56b4f0ad244d35b7e0d30ba0c5e1ae61'
|
|
12
|
+
|
|
13
|
+
# Provide methods for checking settings succinctly
|
|
14
|
+
include SettingsCheckersMixin
|
|
15
|
+
|
|
16
|
+
# Provide faux routes, e.g., #tracks_path
|
|
17
|
+
include FauxRoutesMixin
|
|
18
|
+
|
|
19
|
+
# Provide access to page_title in controllers
|
|
20
|
+
include PageTitleHelper
|
|
21
|
+
|
|
22
|
+
# Setup breadcrumbs
|
|
23
|
+
include BreadcrumbsMixin
|
|
24
|
+
add_breadcrumbs(OpenConferenceWare.breadcrumbs)
|
|
25
|
+
|
|
26
|
+
# Filters
|
|
27
|
+
before_filter :assign_events
|
|
28
|
+
before_filter :assign_current_event_without_redirecting
|
|
29
|
+
before_filter :log_the_current_user
|
|
30
|
+
before_filter :log_the_session
|
|
31
|
+
|
|
32
|
+
#---[ Authentication ]--------------------------------------------------
|
|
33
|
+
|
|
34
|
+
# Store the given user in the session.
|
|
35
|
+
def current_user=(new_user)
|
|
36
|
+
session[:user_id] = (new_user.nil? || new_user.is_a?(Symbol)) ? nil : new_user.id
|
|
37
|
+
@current_user = new_user
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Accesses the current user from the session.
|
|
41
|
+
def current_user
|
|
42
|
+
@current_user ||= User.find(session[:user_id]) if session[:user_id]
|
|
43
|
+
rescue ActiveRecord::RecordNotFound
|
|
44
|
+
reset_session
|
|
45
|
+
end
|
|
46
|
+
helper_method :current_user
|
|
47
|
+
|
|
48
|
+
# Returns true or false if the user is logged in.
|
|
49
|
+
# Preloads @current_user with the user model if they're logged in.
|
|
50
|
+
def logged_in?
|
|
51
|
+
!!current_user
|
|
52
|
+
end
|
|
53
|
+
helper_method :logged_in?
|
|
54
|
+
|
|
55
|
+
# Filter method to enforce a login requirement.
|
|
56
|
+
def authentication_required
|
|
57
|
+
logged_in? || access_denied(message: "Please sign in to access the requested page.")
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Redirect as appropriate when an access request fails.
|
|
61
|
+
def access_denied(opts={})
|
|
62
|
+
message = opts[:message] || "Access denied, please sign in with enough privileges to complete that operation."
|
|
63
|
+
fallback_url = opts[:fallback_url] || opts[:fallback] || sign_in_path
|
|
64
|
+
|
|
65
|
+
store_location
|
|
66
|
+
redirect_to fallback_url, alert: message
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Store the URI of the current request in the session.
|
|
70
|
+
#
|
|
71
|
+
# We can return to this location by calling #redirect_back_or_default.
|
|
72
|
+
def store_location(path=nil)
|
|
73
|
+
session[:return_to] = path || request.fullpath
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Redirect to the URI stored by the most recent store_location call or
|
|
77
|
+
# to the passed default.
|
|
78
|
+
def redirect_back_or_default(default=nil)
|
|
79
|
+
redirect_to(session[:return_to] || default || default_path)
|
|
80
|
+
session[:return_to] = nil
|
|
81
|
+
end
|
|
82
|
+
alias_method :redirect_back_or_to, :redirect_back_or_default
|
|
83
|
+
|
|
84
|
+
def default_path
|
|
85
|
+
if @event
|
|
86
|
+
if @event.proposal_status_published?
|
|
87
|
+
event_sessions_path(@event)
|
|
88
|
+
else
|
|
89
|
+
event_proposals_path(@event)
|
|
90
|
+
end
|
|
91
|
+
else
|
|
92
|
+
proposals_path
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
protected
|
|
97
|
+
|
|
98
|
+
#---[ General ]---------------------------------------------------------
|
|
99
|
+
|
|
100
|
+
# Return the current User record or a nil if not logged in.
|
|
101
|
+
def current_user_or_nil
|
|
102
|
+
return(current_user.kind_of?(User) ? current_user : nil)
|
|
103
|
+
end
|
|
104
|
+
helper_method :current_user_or_nil
|
|
105
|
+
|
|
106
|
+
# Return the current_user's email address, from either the currently-logged
|
|
107
|
+
# in user or the cookie, else nil.
|
|
108
|
+
def current_email
|
|
109
|
+
return(current_user_or_nil.try(:email) || session[:email])
|
|
110
|
+
end
|
|
111
|
+
helper_method :current_email
|
|
112
|
+
|
|
113
|
+
# Return a cache key for the currently authenticated or anonymous user.
|
|
114
|
+
def current_user_cache_key
|
|
115
|
+
return current_user_or_nil.try(:id) || -1
|
|
116
|
+
end
|
|
117
|
+
helper_method :current_user_cache_key
|
|
118
|
+
|
|
119
|
+
# Return a cache key for the current event.
|
|
120
|
+
def current_event_cache_key
|
|
121
|
+
return @event.try(:id) || -1
|
|
122
|
+
end
|
|
123
|
+
helper_method :current_event_cache_key
|
|
124
|
+
|
|
125
|
+
# Are we running in a development mode?
|
|
126
|
+
def development_mode?
|
|
127
|
+
return %w[development preview].include?(Rails.env)
|
|
128
|
+
end
|
|
129
|
+
helper_method :development_mode?
|
|
130
|
+
|
|
131
|
+
def event_schedule?
|
|
132
|
+
proposal_start_times? && proposal_statuses? && event_rooms?
|
|
133
|
+
end
|
|
134
|
+
helper_method :event_schedule?
|
|
135
|
+
|
|
136
|
+
def schedule_visible?
|
|
137
|
+
(@event.schedule_published? || admin?) && event_schedule?
|
|
138
|
+
end
|
|
139
|
+
helper_method :schedule_visible?
|
|
140
|
+
|
|
141
|
+
# Flash notification levels allowed by #notify.
|
|
142
|
+
NOTIFY_LEVELS = Set.new([:notice, :success, :failure])
|
|
143
|
+
|
|
144
|
+
# Sets or appends the flash notification.
|
|
145
|
+
#
|
|
146
|
+
# Arguments:
|
|
147
|
+
# * level: Symbol name of the notificaiton level, e.g. "failure".
|
|
148
|
+
# * message: String message to display.
|
|
149
|
+
def notify(level, message)
|
|
150
|
+
level = level.to_sym
|
|
151
|
+
raise ArgumentError, "Invalid flash notification level: #{level}" unless NOTIFY_LEVELS.include?(level)
|
|
152
|
+
flash[level] ?
|
|
153
|
+
flash[level] << " #{message}".html_safe :
|
|
154
|
+
flash[level] = "#{message}".html_safe
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
#---[ Access control ]--------------------------------------------------
|
|
158
|
+
|
|
159
|
+
# Can the current user edit the current +record+?
|
|
160
|
+
def can_edit?(record)
|
|
161
|
+
raise ArgumentError, "No record specified" unless record
|
|
162
|
+
|
|
163
|
+
if logged_in?
|
|
164
|
+
if current_user.admin?
|
|
165
|
+
true
|
|
166
|
+
else
|
|
167
|
+
# Normal user
|
|
168
|
+
case record
|
|
169
|
+
when Proposal
|
|
170
|
+
# FIXME Add setting to determine if users can alter their proposals after the accepting_proposals deadline passed.
|
|
171
|
+
### accepting_proposals?(record) && record.can_alter?(current_user)
|
|
172
|
+
record.can_alter?(current_user)
|
|
173
|
+
when User
|
|
174
|
+
current_user == record
|
|
175
|
+
else
|
|
176
|
+
raise TypeError, "Unknown record type: #{record.class}"
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
else
|
|
180
|
+
false
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
helper_method :can_edit?
|
|
184
|
+
|
|
185
|
+
# Is the current user an admin?
|
|
186
|
+
def admin?
|
|
187
|
+
logged_in? && current_user.admin?
|
|
188
|
+
end
|
|
189
|
+
helper_method :admin?
|
|
190
|
+
|
|
191
|
+
def current_role
|
|
192
|
+
(logged_in? && current_user.role) || :default
|
|
193
|
+
end
|
|
194
|
+
helper_method :current_role
|
|
195
|
+
|
|
196
|
+
# Ensure user is an admin, or bounce them to the admin prompt.
|
|
197
|
+
def require_admin
|
|
198
|
+
admin? || access_denied(message: "You must have administrator privileges to access the requested page.")
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
def current_user_is_proposal_speaker?
|
|
202
|
+
if logged_in?
|
|
203
|
+
return @proposal.users.include?(current_user)
|
|
204
|
+
end
|
|
205
|
+
return false
|
|
206
|
+
end
|
|
207
|
+
helper_method :current_user_is_proposal_speaker?
|
|
208
|
+
|
|
209
|
+
# Is this event accepting proposals?
|
|
210
|
+
def accepting_proposals?(record=nil)
|
|
211
|
+
event = \
|
|
212
|
+
case record
|
|
213
|
+
when Event then record
|
|
214
|
+
when Proposal then record.event
|
|
215
|
+
else @event
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
return event.try(:accepting_proposals?)
|
|
219
|
+
end
|
|
220
|
+
helper_method :accepting_proposals?
|
|
221
|
+
|
|
222
|
+
def selector?
|
|
223
|
+
logged_in? && current_user.selector?
|
|
224
|
+
end
|
|
225
|
+
helper_method :selector?
|
|
226
|
+
|
|
227
|
+
def require_selector
|
|
228
|
+
selector? || access_denied(message: "You must be part of the selection committee to access the requested page.")
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
#---[ Logging ]---------------------------------------------------------
|
|
232
|
+
|
|
233
|
+
def log_the_current_user
|
|
234
|
+
Rails.logger.info("User: #{current_user.id}, #{current_user.label}") if current_user_or_nil
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
def log_the_session
|
|
238
|
+
Rails.logger.info("Session: #{session.to_hash.inspect}") if session.respond_to?(:data)
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
#---[ Assign items ]----------------------------------------------------
|
|
242
|
+
|
|
243
|
+
# Assign an @events variable for use by the layout when displaying available events.
|
|
244
|
+
def assign_events
|
|
245
|
+
@events = Event.lookup
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
# Return the event and a status which describes how the event was assigned. The status can be one of the following:
|
|
249
|
+
# * :assigned_to_param
|
|
250
|
+
# * :invalid_param
|
|
251
|
+
# * :invalid_proposal_event
|
|
252
|
+
# * :assigned_to_current
|
|
253
|
+
# * :empty
|
|
254
|
+
def get_current_event_and_assignment_status
|
|
255
|
+
invalid = false
|
|
256
|
+
|
|
257
|
+
# Try finding event using params:
|
|
258
|
+
event_id_key = controller_name == "events" ? :id : :event_id
|
|
259
|
+
if key = params[event_id_key]
|
|
260
|
+
if event = Event.lookup(key)
|
|
261
|
+
return [event, :assigned_to_param]
|
|
262
|
+
else
|
|
263
|
+
logger.info "error, couldn't find event from key: #{key}"
|
|
264
|
+
invalid = :invalid_param
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
# Try finding event using proposal:
|
|
269
|
+
if controller_name == "proposals" && params[:id]
|
|
270
|
+
if proposal = Proposal.find_by_id(params[:id])
|
|
271
|
+
if proposal.event
|
|
272
|
+
return [proposal.event, :assigned_to_param]
|
|
273
|
+
else
|
|
274
|
+
logger.info "error, couldn't find event from Proposal ##{proposal.id}"
|
|
275
|
+
invalid = :invalid_proposal_event
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
# Try finding the current event.
|
|
281
|
+
if event = Event.current
|
|
282
|
+
logger.info "assigned to current event"
|
|
283
|
+
if invalid
|
|
284
|
+
return [event, invalid]
|
|
285
|
+
else
|
|
286
|
+
return [event, :assigned_to_current]
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
logger.info "error, no current event found"
|
|
291
|
+
return [nil, :empty]
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
# Assign @event if it's not already set. Also set the
|
|
295
|
+
# @event_assignment value to describe how the @event was assigned,
|
|
296
|
+
# which can be one of the following values:
|
|
297
|
+
# * :assigned_already
|
|
298
|
+
# * Or any of the statuses described in
|
|
299
|
+
# #get_current_event_and_assignment_status
|
|
300
|
+
def assign_current_event_without_redirecting
|
|
301
|
+
invalid_param = false
|
|
302
|
+
|
|
303
|
+
# Only assign event if one isn't already assigned.
|
|
304
|
+
if @event
|
|
305
|
+
logger.info "already assigned"
|
|
306
|
+
@event_assignment = :assigned_already
|
|
307
|
+
else
|
|
308
|
+
@event, @event_assignment = get_current_event_and_assignment_status()
|
|
309
|
+
end
|
|
310
|
+
return false
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
# Ensure that @event is assigned (by #assign_current_event_without_redirecting).
|
|
314
|
+
# If not, display an error or force the admin to create a new event.
|
|
315
|
+
def assert_current_event_or_redirect
|
|
316
|
+
case @event_assignment
|
|
317
|
+
when :invalid_proposal_event
|
|
318
|
+
flash[:failure] = "Invalid proposal has no event, redirecting to current event's proposals."
|
|
319
|
+
flash.keep
|
|
320
|
+
return redirect_to(event_proposals_path(@event))
|
|
321
|
+
when :invalid_param
|
|
322
|
+
flash[:failure] = "Couldn't find event, redirected to current event."
|
|
323
|
+
flash.keep
|
|
324
|
+
return redirect_to(event_path(@event))
|
|
325
|
+
when :empty
|
|
326
|
+
flash[:failure] = "No current event available. Admin needs to create one."
|
|
327
|
+
if admin?
|
|
328
|
+
# Allow admin to create an event.
|
|
329
|
+
flash.keep
|
|
330
|
+
return redirect_to(manage_events_path)
|
|
331
|
+
else
|
|
332
|
+
# Display a static error page.
|
|
333
|
+
render template: 'open_conference_ware/events/index'
|
|
334
|
+
return true # Cancel further processing
|
|
335
|
+
end
|
|
336
|
+
else
|
|
337
|
+
return false
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
# Redirect the user to the canonical event path if they're visiting a path that doesn't start with '/events'.
|
|
342
|
+
def normalize_event_path_or_redirect
|
|
343
|
+
# When running under a prefix (e.g., "thin --prefix /omg start"), this value will be set to "/omg", else "".
|
|
344
|
+
if request.format.to_sym == :html
|
|
345
|
+
if request.path.match(%r{^#{OpenConferenceWare.mounted_path("/events")}})
|
|
346
|
+
return false
|
|
347
|
+
else
|
|
348
|
+
if controller_name == "proposals" && action_name == "sessions_index"
|
|
349
|
+
path = event_sessions_path(@event)
|
|
350
|
+
elsif controller_name == "proposals" && action_name == "schedule"
|
|
351
|
+
path = event_schedule_path(@event)
|
|
352
|
+
else
|
|
353
|
+
path = OpenConferenceWare.mounted_path("/events/#{@event.to_param}/#{controller_name}#{action_name == 'index' ? '' : "/#{action_name}" }")
|
|
354
|
+
end
|
|
355
|
+
flash.keep
|
|
356
|
+
return redirect_to(path)
|
|
357
|
+
end
|
|
358
|
+
else
|
|
359
|
+
# Non-HTTP requests don't understand redirects, so leave these alone
|
|
360
|
+
return false
|
|
361
|
+
end
|
|
362
|
+
end
|
|
363
|
+
|
|
364
|
+
# Ensure that the proposal status is defined, else redirect back to proposals
|
|
365
|
+
def assert_proposal_status_published
|
|
366
|
+
display = false
|
|
367
|
+
if @event.proposal_status_published?
|
|
368
|
+
display = true
|
|
369
|
+
else
|
|
370
|
+
if admin?
|
|
371
|
+
display = true
|
|
372
|
+
flash[:notice] = "Session information has not yet been published, only admins can see this page."
|
|
373
|
+
end
|
|
374
|
+
end
|
|
375
|
+
unless display
|
|
376
|
+
flash[:failure] = "Session information has not yet been published for this event."
|
|
377
|
+
return redirect_to((params[:id] && request.path.include?("session")) ? proposal_path(params[:id]) : event_proposals_path(@event))
|
|
378
|
+
end
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
# Ensure that the schedule is published
|
|
382
|
+
def assert_schedule_published
|
|
383
|
+
display = admin? || schedule_visible?
|
|
384
|
+
flash[:notice] = "The schedule has not yet been published, only admins can see this page." if admin? && !schedule_visible?
|
|
385
|
+
|
|
386
|
+
unless display
|
|
387
|
+
flash[:failure] = "The schedule has not yet been published for this event."
|
|
388
|
+
return redirect_to(@event.proposal_status_published? ? event_sessions_path(@event) : event_proposals_path(@event))
|
|
389
|
+
end
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
# Sets @user based on params[:id] and adds related breadcrumbs.
|
|
393
|
+
def assert_user
|
|
394
|
+
case self
|
|
395
|
+
when UsersController
|
|
396
|
+
user_id = params[:id]
|
|
397
|
+
when UserFavoritesController
|
|
398
|
+
user_id = params[:user_id]
|
|
399
|
+
else
|
|
400
|
+
raise TypeError
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
if user_id == "me"
|
|
404
|
+
if logged_in?
|
|
405
|
+
@user = current_user
|
|
406
|
+
else
|
|
407
|
+
return access_denied(message: "Please sign in to access your user profile.")
|
|
408
|
+
end
|
|
409
|
+
else
|
|
410
|
+
begin
|
|
411
|
+
@user = User.find(user_id)
|
|
412
|
+
rescue ActiveRecord::RecordNotFound
|
|
413
|
+
flash[:failure] = "User not found or deleted"
|
|
414
|
+
return redirect_to(users_path)
|
|
415
|
+
end
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
# TODO Move breadcrumbs to filters/actions that rely on user.
|
|
419
|
+
add_breadcrumb "Users", users_path
|
|
420
|
+
add_breadcrumb @user.label, user_path(@user)
|
|
421
|
+
add_breadcrumb "Edit" if ["edit", "update"].include?(action_name)
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
# Assert that #current_user can edit record.
|
|
425
|
+
def assert_record_ownership
|
|
426
|
+
case self
|
|
427
|
+
when ProposalsController
|
|
428
|
+
record = @proposal
|
|
429
|
+
when UsersController, UserFavoritesController
|
|
430
|
+
record = @user
|
|
431
|
+
failure_message = "Sorry, you can't edit other users."
|
|
432
|
+
else
|
|
433
|
+
raise TypeError
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
if admin?
|
|
437
|
+
return false # admin can always edit
|
|
438
|
+
else
|
|
439
|
+
if can_edit?(record)
|
|
440
|
+
return false # current_user can edit
|
|
441
|
+
else
|
|
442
|
+
flash[:failure] = failure_message ||= "Sorry, you can't edit #{record.class.name.pluralize.downcase} that aren't yours."
|
|
443
|
+
return redirect_to(record)
|
|
444
|
+
end
|
|
445
|
+
end
|
|
446
|
+
end
|
|
447
|
+
|
|
448
|
+
# OMFG HORRORS!!1!
|
|
449
|
+
def assign_prefetched_hashes
|
|
450
|
+
@users = Defer { @event.users }
|
|
451
|
+
@users_hash = Defer { Hash[@users.map{|t| [t.id, t]}] }
|
|
452
|
+
@speakers = Defer { @event.speakers }
|
|
453
|
+
@speakers_hash = Defer { Hash[@speakers.map{|t| [t.id, t]}] }
|
|
454
|
+
@tracks_hash = Defer { Hash[@event.tracks.order("title ASC").map{|t| [t.id, t]}] }
|
|
455
|
+
@rooms_hash = Defer { Hash[@event.rooms.map{|t| [t.id, t]}] }
|
|
456
|
+
@session_types_hash = Defer { Hash[@event.session_types.map{|t| [t.id, t]}] }
|
|
457
|
+
@proposals_hash = Defer { Hash[@event.proposals.order("submitted_at DESC").includes(:track, :session_type).map{|t| [t.id, t]}] }
|
|
458
|
+
@sessions_hash = Defer { Hash[@event.proposals.confirmed.order("submitted_at DESC").includes(:track, :session_type).map{|t| [t.id, t]}] }
|
|
459
|
+
@users_and_proposals = Defer { ActiveRecord::Base.connection.select_all(%{select open_conference_ware_proposals_users.user_id, open_conference_ware_proposals_users.proposal_id from open_conference_ware_proposals_users, open_conference_ware_proposals where open_conference_ware_proposals_users.proposal_id = open_conference_ware_proposals.id and open_conference_ware_proposals.event_id = #{@event.id}}) }
|
|
460
|
+
@users_and_sessions = Defer { ActiveRecord::Base.connection.select_all(%{select open_conference_ware_proposals_users.user_id, open_conference_ware_proposals_users.proposal_id from open_conference_ware_proposals_users, open_conference_ware_proposals where open_conference_ware_proposals_users.proposal_id = open_conference_ware_proposals.id and open_conference_ware_proposals.status = 'confirmed' and open_conference_ware_proposals.event_id = #{@event.id}}) }
|
|
461
|
+
@users_for_proposal_hash = Defer { @users_and_proposals.inject({}){|s,v| (s[v["proposal_id"].to_i] ||= Set.new) << @users_hash[v["user_id"].to_i]; s} }
|
|
462
|
+
@sessions_for_user_hash = Defer { @users_and_sessions.inject({}){|s,v| (s[v["user_id"].to_i] ||= Set.new) << @sessions_hash[v["proposal_id"].to_i]; s} }
|
|
463
|
+
@proposals_for_user_hash = Defer { @users_and_proposals.inject({}){|s,v| (s[v["user_id"].to_i] ||= Set.new) << @proposals_hash[v["proposal_id"].to_i]; s} }
|
|
464
|
+
@user_favorites_count_for_user_hash = Defer { ActiveRecord::Base.connection.select_all("select user_id, count(proposal_id) as favorites from open_conference_ware_user_favorites group by user_id").inject({}){|s,v| s[v["user_id"].to_i] = v["favorites"].to_i; s} }
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
# Warn admin to create event's session type and track if needed.
|
|
468
|
+
def warn_about_incomplete_event
|
|
469
|
+
if @event
|
|
470
|
+
if event_tracks? && @event.tracks.size == 0
|
|
471
|
+
if admin?
|
|
472
|
+
notify :notice, "This event needs a track, you should #{view_context.link_to 'create one', new_event_track_path(@event)}."
|
|
473
|
+
else
|
|
474
|
+
notify :failure, "This event has no tracks, an admin must create at least one."
|
|
475
|
+
end
|
|
476
|
+
end
|
|
477
|
+
|
|
478
|
+
if event_session_types? && @event.session_types.size == 0
|
|
479
|
+
if admin?
|
|
480
|
+
notify :notice, "This event needs a session type, you should #{view_context.link_to 'create one', new_event_session_type_path(@event)}."
|
|
481
|
+
else
|
|
482
|
+
notify :failure, "This event has no session types, an admin must create at least one."
|
|
483
|
+
end
|
|
484
|
+
end
|
|
485
|
+
end
|
|
486
|
+
end
|
|
487
|
+
end
|
|
488
|
+
end
|