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.
Files changed (471) hide show
  1. data.tar.gz.sig +0 -0
  2. data/.autotest +14 -0
  3. data/.coveralls.yml +1 -0
  4. data/.gitignore +21 -0
  5. data/.rspec +1 -0
  6. data/.travis.yml +18 -0
  7. data/CHANGES.md +280 -0
  8. data/CONTRIBUTORS.markdown +17 -0
  9. data/Gemfile +21 -0
  10. data/Gemfile.lock +296 -0
  11. data/Guardfile +24 -0
  12. data/LICENSE.txt +23 -0
  13. data/README.markdown +173 -0
  14. data/Rakefile +27 -0
  15. data/TODO.txt +22 -0
  16. data/app/assets/images/open_conference_ware/accept.png +0 -0
  17. data/app/assets/images/open_conference_ware/arrow-left.png +0 -0
  18. data/app/assets/images/open_conference_ware/arrow-out.png +0 -0
  19. data/app/assets/images/open_conference_ware/arrow-right.png +0 -0
  20. data/app/assets/images/open_conference_ware/arrow-up.png +0 -0
  21. data/app/assets/images/open_conference_ware/arrow_refresh.png +0 -0
  22. data/app/assets/images/open_conference_ware/comment.png +0 -0
  23. data/app/assets/images/open_conference_ware/comment_edit.png +0 -0
  24. data/app/assets/images/open_conference_ware/delete.png +0 -0
  25. data/app/assets/images/open_conference_ware/disk.png +0 -0
  26. data/app/assets/images/open_conference_ware/document-blank.png +0 -0
  27. data/app/assets/images/open_conference_ware/document.png +0 -0
  28. data/app/assets/images/open_conference_ware/edit.png +0 -0
  29. data/app/assets/images/open_conference_ware/extras/001_01.png +0 -0
  30. data/app/assets/images/open_conference_ware/extras/001_05.png +0 -0
  31. data/app/assets/images/open_conference_ware/extras/001_05x16.png +0 -0
  32. data/app/assets/images/open_conference_ware/extras/001_21.png +0 -0
  33. data/app/assets/images/open_conference_ware/extras/001_23.png +0 -0
  34. data/app/assets/images/open_conference_ware/extras/001_24.png +0 -0
  35. data/app/assets/images/open_conference_ware/extras/001_29.png +0 -0
  36. data/app/assets/images/open_conference_ware/extras/01.png +0 -0
  37. data/app/assets/images/open_conference_ware/extras/05.png +0 -0
  38. data/app/assets/images/open_conference_ware/extras/06.png +0 -0
  39. data/app/assets/images/open_conference_ware/extras/1.png +0 -0
  40. data/app/assets/images/open_conference_ware/extras/14.png +0 -0
  41. data/app/assets/images/open_conference_ware/extras/16.png +0 -0
  42. data/app/assets/images/open_conference_ware/extras/2.png +0 -0
  43. data/app/assets/images/open_conference_ware/extras/21.png +0 -0
  44. data/app/assets/images/open_conference_ware/extras/28.png +0 -0
  45. data/app/assets/images/open_conference_ware/extras/3.png +0 -0
  46. data/app/assets/images/open_conference_ware/extras/31.png +0 -0
  47. data/app/assets/images/open_conference_ware/extras/32.png +0 -0
  48. data/app/assets/images/open_conference_ware/extras/35.png +0 -0
  49. data/app/assets/images/open_conference_ware/extras/36.png +0 -0
  50. data/app/assets/images/open_conference_ware/extras/4.png +0 -0
  51. data/app/assets/images/open_conference_ware/extras/44.png +0 -0
  52. data/app/assets/images/open_conference_ware/extras/45.png +0 -0
  53. data/app/assets/images/open_conference_ware/extras/46.png +0 -0
  54. data/app/assets/images/open_conference_ware/extras/cancel.png +0 -0
  55. data/app/assets/images/open_conference_ware/extras/cancelx16.png +0 -0
  56. data/app/assets/images/open_conference_ware/extras/icon.trashcan.gif +0 -0
  57. data/app/assets/images/open_conference_ware/favorite.png +0 -0
  58. data/app/assets/images/open_conference_ware/feed.png +0 -0
  59. data/app/assets/images/open_conference_ware/heart.png +0 -0
  60. data/app/assets/images/open_conference_ware/house.png +0 -0
  61. data/app/assets/images/open_conference_ware/ignite_portland_header3_clear.png +0 -0
  62. data/app/assets/images/open_conference_ware/ignite_portland_header3_clear_cropped.png +0 -0
  63. data/app/assets/images/open_conference_ware/jquery.wysiwyg.gif +0 -0
  64. data/app/assets/images/open_conference_ware/lock.png +0 -0
  65. data/app/assets/images/open_conference_ware/new_window.gif +0 -0
  66. data/app/assets/images/open_conference_ware/openid-icon.gif +0 -0
  67. data/app/assets/images/open_conference_ware/pencil.png +0 -0
  68. data/app/assets/images/open_conference_ware/plus.png +0 -0
  69. data/app/assets/images/open_conference_ware/quote.png +0 -0
  70. data/app/assets/images/open_conference_ware/rails.png +0 -0
  71. data/app/assets/images/open_conference_ware/redx.png +0 -0
  72. data/app/assets/images/open_conference_ware/reset-fff.png +0 -0
  73. data/app/assets/images/open_conference_ware/spinner-big.gif +0 -0
  74. data/app/assets/images/open_conference_ware/spinner.gif +0 -0
  75. data/app/assets/images/open_conference_ware/star.png +0 -0
  76. data/app/assets/images/open_conference_ware/tag_blue.png +0 -0
  77. data/app/assets/images/open_conference_ware/time.png +0 -0
  78. data/app/assets/javascripts/open_conference_ware/application.js +18 -0
  79. data/app/assets/javascripts/open_conference_ware/base.js +15 -0
  80. data/app/assets/javascripts/open_conference_ware/favorites.js +76 -0
  81. data/app/assets/javascripts/open_conference_ware/ie.js +2 -0
  82. data/app/assets/javascripts/open_conference_ware/menu.js +47 -0
  83. data/app/assets/javascripts/open_conference_ware/persona.js +10 -0
  84. data/app/assets/javascripts/open_conference_ware/proposals.js +208 -0
  85. data/app/assets/javascripts/open_conference_ware/schedule.js +20 -0
  86. data/app/assets/javascripts/open_conference_ware/spinner.js +11 -0
  87. data/app/assets/javascripts/open_conference_ware/util.js +23 -0
  88. data/app/assets/stylesheets/open_conference_ware/application.css +8 -0
  89. data/app/assets/stylesheets/open_conference_ware/common.css.scss +491 -0
  90. data/app/assets/stylesheets/open_conference_ware/custom.css.scss +1033 -0
  91. data/app/assets/stylesheets/open_conference_ware/scaffold.css +54 -0
  92. data/app/controllers/open_conference_ware/application_controller.rb +488 -0
  93. data/app/controllers/open_conference_ware/authentications_controller.rb +42 -0
  94. data/app/controllers/open_conference_ware/comments_controller.rb +86 -0
  95. data/app/controllers/open_conference_ware/events_controller.rb +36 -0
  96. data/app/controllers/open_conference_ware/manage/events_controller.rb +157 -0
  97. data/app/controllers/open_conference_ware/manage/snippets_controller.rb +110 -0
  98. data/app/controllers/open_conference_ware/proposals_controller.rb +521 -0
  99. data/app/controllers/open_conference_ware/rooms_controller.rb +130 -0
  100. data/app/controllers/open_conference_ware/schedule_items_controller.rb +128 -0
  101. data/app/controllers/open_conference_ware/selector_votes_controller.rb +71 -0
  102. data/app/controllers/open_conference_ware/session_types_controller.rb +123 -0
  103. data/app/controllers/open_conference_ware/tracks_controller.rb +118 -0
  104. data/app/controllers/open_conference_ware/user_favorites_controller.rb +68 -0
  105. data/app/controllers/open_conference_ware/users_controller.rb +120 -0
  106. data/app/helpers/open_conference_ware/application_helper.rb +167 -0
  107. data/app/helpers/open_conference_ware/authentications_helper.rb +25 -0
  108. data/app/helpers/open_conference_ware/cache_if_helper.rb +13 -0
  109. data/app/helpers/open_conference_ware/display_link_to_helper.rb +25 -0
  110. data/app/helpers/open_conference_ware/display_textile_for_helper.rb +11 -0
  111. data/app/helpers/open_conference_ware/field_annotation_helper.rb +11 -0
  112. data/app/helpers/open_conference_ware/focus_helper.rb +16 -0
  113. data/app/helpers/open_conference_ware/localcss_helper.rb +10 -0
  114. data/app/helpers/open_conference_ware/page_title_helper.rb +17 -0
  115. data/app/helpers/open_conference_ware/proposals_helper.rb +54 -0
  116. data/app/helpers/open_conference_ware/rooms_helper.rb +5 -0
  117. data/app/helpers/open_conference_ware/scroll_to_helper.rb +15 -0
  118. data/app/helpers/open_conference_ware/session_types_helper.rb +5 -0
  119. data/app/helpers/open_conference_ware/snippets_helper.rb +36 -0
  120. data/app/helpers/open_conference_ware/time_range_helper.rb +198 -0
  121. data/app/helpers/open_conference_ware/tracks_helper.rb +9 -0
  122. data/app/helpers/open_conference_ware/user_favorites_helper.rb +15 -0
  123. data/app/mailers/open_conference_ware/speaker_mailer.rb +51 -0
  124. data/app/mixins/open_conference_ware/breadcrumbs_mixin.rb +76 -0
  125. data/app/mixins/open_conference_ware/cache_lookups_mixin.rb +128 -0
  126. data/app/mixins/open_conference_ware/faux_routes_mixin.rb +83 -0
  127. data/app/mixins/open_conference_ware/normalize_url_mixin.rb +40 -0
  128. data/app/mixins/open_conference_ware/public_attributes_mixin.rb +62 -0
  129. data/app/mixins/open_conference_ware/schedule_overlaps_mixin.rb +12 -0
  130. data/app/mixins/open_conference_ware/settings_checkers_mixin.rb +50 -0
  131. data/app/mixins/open_conference_ware/simple_slug_mixin.rb +26 -0
  132. data/app/models/open_conference_ware/authentication.rb +47 -0
  133. data/app/models/open_conference_ware/base.rb +6 -0
  134. data/app/models/open_conference_ware/comment.rb +26 -0
  135. data/app/models/open_conference_ware/event.rb +227 -0
  136. data/app/models/open_conference_ware/proposal.rb +625 -0
  137. data/app/models/open_conference_ware/room.rb +42 -0
  138. data/app/models/open_conference_ware/schedule.rb +216 -0
  139. data/app/models/open_conference_ware/schedule_item.rb +55 -0
  140. data/app/models/open_conference_ware/selector_vote.rb +22 -0
  141. data/app/models/open_conference_ware/session_type.rb +33 -0
  142. data/app/models/open_conference_ware/snippet.rb +58 -0
  143. data/app/models/open_conference_ware/track.rb +51 -0
  144. data/app/models/open_conference_ware/user.rb +262 -0
  145. data/app/models/open_conference_ware/user_favorite.rb +42 -0
  146. data/app/observers/open_conference_ware/cache_watcher.rb +42 -0
  147. data/app/views/layouts/open_conference_ware/_header.html.erb +106 -0
  148. data/app/views/layouts/open_conference_ware/application.atom.erb +1 -0
  149. data/app/views/layouts/open_conference_ware/application.html.erb +126 -0
  150. data/app/views/layouts/open_conference_ware/scaffold.html.erb +21 -0
  151. data/app/views/open_conference_ware/404.html.erb +8 -0
  152. data/app/views/open_conference_ware/422.html.erb +11 -0
  153. data/app/views/open_conference_ware/500.html.erb +11 -0
  154. data/app/views/open_conference_ware/_email_link.html.erb +24 -0
  155. data/app/views/open_conference_ware/_google_analytics.html.erb +9 -0
  156. data/app/views/open_conference_ware/authentications/_developer.html.erb +7 -0
  157. data/app/views/open_conference_ware/authentications/_openid.html.erb +11 -0
  158. data/app/views/open_conference_ware/authentications/_persona.html.erb +17 -0
  159. data/app/views/open_conference_ware/authentications/sign_in.html.erb +12 -0
  160. data/app/views/open_conference_ware/comments/_list.html.erb +31 -0
  161. data/app/views/open_conference_ware/comments/index.atom.builder +25 -0
  162. data/app/views/open_conference_ware/comments/index.html.erb +3 -0
  163. data/app/views/open_conference_ware/events/index.html.erb +9 -0
  164. data/app/views/open_conference_ware/events/show.html.erb +0 -0
  165. data/app/views/open_conference_ware/events/speakers.html.erb +7 -0
  166. data/app/views/open_conference_ware/manage/events/_form.html.erb +107 -0
  167. data/app/views/open_conference_ware/manage/events/edit.html.erb +3 -0
  168. data/app/views/open_conference_ware/manage/events/index.html.erb +41 -0
  169. data/app/views/open_conference_ware/manage/events/new.html.erb +3 -0
  170. data/app/views/open_conference_ware/manage/events/proposals.html.erb +133 -0
  171. data/app/views/open_conference_ware/manage/events/show.html.erb +181 -0
  172. data/app/views/open_conference_ware/manage/snippets/_form.html.erb +30 -0
  173. data/app/views/open_conference_ware/manage/snippets/edit.html.erb +3 -0
  174. data/app/views/open_conference_ware/manage/snippets/index.html.erb +34 -0
  175. data/app/views/open_conference_ware/manage/snippets/new.html.erb +3 -0
  176. data/app/views/open_conference_ware/manage/snippets/show.html.erb +32 -0
  177. data/app/views/open_conference_ware/proposals/_admin_controls.html.erb +33 -0
  178. data/app/views/open_conference_ware/proposals/_form.html.erb +381 -0
  179. data/app/views/open_conference_ware/proposals/_list.html.erb +164 -0
  180. data/app/views/open_conference_ware/proposals/_list_concise.html.erb +93 -0
  181. data/app/views/open_conference_ware/proposals/_manage_speakers.html.erb +30 -0
  182. data/app/views/open_conference_ware/proposals/_room_control.html.erb +21 -0
  183. data/app/views/open_conference_ware/proposals/_schedule_block.html.erb +8 -0
  184. data/app/views/open_conference_ware/proposals/_schedule_control.html.erb +13 -0
  185. data/app/views/open_conference_ware/proposals/_search_speakers.html.erb +20 -0
  186. data/app/views/open_conference_ware/proposals/_sub_list.html.erb +65 -0
  187. data/app/views/open_conference_ware/proposals/_sub_list_for_kind.html.erb +31 -0
  188. data/app/views/open_conference_ware/proposals/_transition_control.html.erb +16 -0
  189. data/app/views/open_conference_ware/proposals/create.html.erb +29 -0
  190. data/app/views/open_conference_ware/proposals/edit.html.erb +7 -0
  191. data/app/views/open_conference_ware/proposals/index.atom.builder +63 -0
  192. data/app/views/open_conference_ware/proposals/index.html.erb +46 -0
  193. data/app/views/open_conference_ware/proposals/new.html.erb +3 -0
  194. data/app/views/open_conference_ware/proposals/schedule.html.erb +108 -0
  195. data/app/views/open_conference_ware/proposals/sessions_index_terse.html.erb +22 -0
  196. data/app/views/open_conference_ware/proposals/show.html.erb +316 -0
  197. data/app/views/open_conference_ware/proposals/stats.html.erb +72 -0
  198. data/app/views/open_conference_ware/rooms/_form.html.erb +36 -0
  199. data/app/views/open_conference_ware/rooms/edit.html.erb +3 -0
  200. data/app/views/open_conference_ware/rooms/index.html.erb +13 -0
  201. data/app/views/open_conference_ware/rooms/new.html.erb +3 -0
  202. data/app/views/open_conference_ware/rooms/show.html.erb +27 -0
  203. data/app/views/open_conference_ware/schedule_items/_form.html.erb +35 -0
  204. data/app/views/open_conference_ware/schedule_items/edit.html.erb +3 -0
  205. data/app/views/open_conference_ware/schedule_items/index.html.erb +31 -0
  206. data/app/views/open_conference_ware/schedule_items/new.html.erb +3 -0
  207. data/app/views/open_conference_ware/schedule_items/show.html.erb +30 -0
  208. data/app/views/open_conference_ware/selector_votes/index.html.erb +81 -0
  209. data/app/views/open_conference_ware/session_types/_form.html.erb +23 -0
  210. data/app/views/open_conference_ware/session_types/edit.html.erb +3 -0
  211. data/app/views/open_conference_ware/session_types/index.html.erb +18 -0
  212. data/app/views/open_conference_ware/session_types/new.html.erb +3 -0
  213. data/app/views/open_conference_ware/session_types/show.html.erb +14 -0
  214. data/app/views/open_conference_ware/speaker_mailer/speaker_email.text.erb +14 -0
  215. data/app/views/open_conference_ware/tracks/_colors.css.erb +7 -0
  216. data/app/views/open_conference_ware/tracks/_form.html.erb +36 -0
  217. data/app/views/open_conference_ware/tracks/edit.html.erb +3 -0
  218. data/app/views/open_conference_ware/tracks/index.html.erb +25 -0
  219. data/app/views/open_conference_ware/tracks/new.html.erb +3 -0
  220. data/app/views/open_conference_ware/tracks/show.html.erb +19 -0
  221. data/app/views/open_conference_ware/user_favorites/index.html.erb +12 -0
  222. data/app/views/open_conference_ware/users/_account_box.html.erb +10 -0
  223. data/app/views/open_conference_ware/users/_block.html.erb +80 -0
  224. data/app/views/open_conference_ware/users/_list.html.erb +17 -0
  225. data/app/views/open_conference_ware/users/edit.html.erb +73 -0
  226. data/app/views/open_conference_ware/users/index.html.erb +28 -0
  227. data/app/views/open_conference_ware/users/new.html.erb +7 -0
  228. data/app/views/open_conference_ware/users/proposals.html.erb +24 -0
  229. data/app/views/open_conference_ware/users/show.html.erb +5 -0
  230. data/app/views/open_conference_ware/welcome/test.html.haml +8 -0
  231. data/bin/rails +8 -0
  232. data/ci/Gemfile.ci +13 -0
  233. data/ci/copy_database_config.rb +6 -0
  234. data/ci/database.mysql.yml +5 -0
  235. data/ci/database.postgresql.yml +4 -0
  236. data/ci/database.sqlite.yml +5 -0
  237. data/config/initializers/acts_as_taggable_on.rb +2 -0
  238. data/config/initializers/date_time_formats.rb +9 -0
  239. data/config/routes.rb +74 -0
  240. data/db/migrate/20131203235128_create_open_conference_ware_authentications.rb +14 -0
  241. data/db/migrate/20131203235216_create_open_conference_ware_comments.rb +14 -0
  242. data/db/migrate/20131203235418_create_open_conference_ware_events.rb +27 -0
  243. data/db/migrate/20131203235524_create_open_conference_ware_proposals.rb +36 -0
  244. data/db/migrate/20131203235723_create_open_conference_ware_rooms.rb +20 -0
  245. data/db/migrate/20131203235831_create_open_conference_ware_schedule_items.rb +18 -0
  246. data/db/migrate/20131203235910_create_open_conference_ware_selector_votes.rb +10 -0
  247. data/db/migrate/20131203235934_create_open_conference_ware_session_types.rb +14 -0
  248. data/db/migrate/20131204000008_create_open_conference_ware_snippets.rb +15 -0
  249. data/db/migrate/20131204000048_create_open_conference_ware_taggings.rb +16 -0
  250. data/db/migrate/20131204000129_create_open_conference_ware_tags.rb +7 -0
  251. data/db/migrate/20131204000147_create_open_conference_ware_tracks.rb +15 -0
  252. data/db/migrate/20131204000230_create_open_conference_ware_user_favorites.rb +10 -0
  253. data/db/migrate/20131204000251_create_open_conference_ware_users.rb +24 -0
  254. data/db/migrate/20131204000355_create_proposals_users_join_table.rb +8 -0
  255. data/db/seeds.rb +31 -0
  256. data/features/comment_create.feature +9 -0
  257. data/features/comment_destroy.feature +22 -0
  258. data/features/comment_new.feature +22 -0
  259. data/features/step_definitions/authentication_steps.rb +22 -0
  260. data/features/step_definitions/comment_create_steps.rb +5 -0
  261. data/features/step_definitions/comment_destroy_steps.rb +13 -0
  262. data/features/step_definitions/comment_new_steps.rb +41 -0
  263. data/features/step_definitions/notification_steps.rb +3 -0
  264. data/features/step_definitions/web_steps.rb +263 -0
  265. data/features/support/env.rb +58 -0
  266. data/features/support/helpers.rb +17 -0
  267. data/features/support/paths.rb +35 -0
  268. data/gem-public_cert.pem +22 -0
  269. data/lib/defer_proxy.rb +127 -0
  270. data/lib/ext/color_rgb_serializer_fix.rb +18 -0
  271. data/lib/ext/string_possessiveize.rb +7 -0
  272. data/lib/ext/vpim_icalendar_extra_properties.rb +25 -0
  273. data/lib/generators/open_conference_ware/install/USAGE +12 -0
  274. data/lib/generators/open_conference_ware/install/install_generator.rb +35 -0
  275. data/lib/generators/open_conference_ware/install/templates/config_initializer.rb +110 -0
  276. data/lib/generators/open_conference_ware/install/templates/omniauth_initializer.rb +33 -0
  277. data/lib/open_conference_ware.rb +156 -0
  278. data/lib/open_conference_ware/dependencies.rb +38 -0
  279. data/lib/open_conference_ware/engine.rb +38 -0
  280. data/lib/open_conference_ware/omni_auth_builder.rb +8 -0
  281. data/lib/open_conference_ware/version.rb +3 -0
  282. data/lib/rwikibot_page_drone.rb +70 -0
  283. data/lib/tasks/.gitkeep +0 -0
  284. data/lib/tasks/audio.rake +53 -0
  285. data/lib/tasks/cucumber.rake +65 -0
  286. data/lib/tasks/export.rake +170 -0
  287. data/lib/tasks/mediawiki.rake +96 -0
  288. data/lib/tasks/open_conference_ware_tasks.rake +16 -0
  289. data/lib/tasks/schedule.rake +103 -0
  290. data/lib/tasks/snippets.rake +23 -0
  291. data/open_conference_ware.gemspec +67 -0
  292. data/original_graphics/favorite.psd +0 -0
  293. data/spec/controllers/open_conference_ware/application_controller_spec.rb +309 -0
  294. data/spec/controllers/open_conference_ware/authentications_controller_spec.rb +87 -0
  295. data/spec/controllers/open_conference_ware/comments_controller_spec.rb +146 -0
  296. data/spec/controllers/open_conference_ware/events_controller_spec.rb +102 -0
  297. data/spec/controllers/open_conference_ware/manage_events_controller_spec.rb +103 -0
  298. data/spec/controllers/open_conference_ware/proposals_controller_spec.rb +1273 -0
  299. data/spec/controllers/open_conference_ware/rooms_controller_spec.rb +190 -0
  300. data/spec/controllers/open_conference_ware/selector_votes_controller_spec.rb +263 -0
  301. data/spec/controllers/open_conference_ware/session_types_controller_spec.rb +190 -0
  302. data/spec/controllers/open_conference_ware/sessions_routing_spec.rb +13 -0
  303. data/spec/controllers/open_conference_ware/tracks_controller_spec.rb +190 -0
  304. data/spec/controllers/open_conference_ware/user_favorites_controller_spec.rb +127 -0
  305. data/spec/controllers/open_conference_ware/users_controller_spec.rb +166 -0
  306. data/spec/dummy/README.rdoc +28 -0
  307. data/spec/dummy/Rakefile +6 -0
  308. data/spec/dummy/app/assets/images/.keep +0 -0
  309. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  310. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  311. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  312. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  313. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  314. data/spec/dummy/app/mailers/.keep +0 -0
  315. data/spec/dummy/app/models/.keep +0 -0
  316. data/spec/dummy/app/models/concerns/.keep +0 -0
  317. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  318. data/spec/dummy/bin/bundle +3 -0
  319. data/spec/dummy/bin/rails +4 -0
  320. data/spec/dummy/bin/rake +4 -0
  321. data/spec/dummy/config.ru +4 -0
  322. data/spec/dummy/config/application.rb +30 -0
  323. data/spec/dummy/config/boot.rb +5 -0
  324. data/spec/dummy/config/database.yml +25 -0
  325. data/spec/dummy/config/environment.rb +5 -0
  326. data/spec/dummy/config/environments/development.rb +29 -0
  327. data/spec/dummy/config/environments/production.rb +80 -0
  328. data/spec/dummy/config/environments/test.rb +36 -0
  329. data/spec/dummy/config/initializers/01_open_conference_ware.rb +110 -0
  330. data/spec/dummy/config/initializers/02_omniauth.rb +17 -0
  331. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  332. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  333. data/spec/dummy/config/initializers/inflections.rb +16 -0
  334. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  335. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  336. data/spec/dummy/config/initializers/session_store.rb +3 -0
  337. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  338. data/spec/dummy/config/locales/en.yml +23 -0
  339. data/spec/dummy/config/routes.rb +3 -0
  340. data/spec/dummy/db/schema.rb +219 -0
  341. data/spec/dummy/db/seeds.rb +10 -0
  342. data/spec/dummy/lib/assets/.keep +0 -0
  343. data/spec/dummy/log/.keep +0 -0
  344. data/spec/dummy/public/404.html +58 -0
  345. data/spec/dummy/public/422.html +58 -0
  346. data/spec/dummy/public/500.html +57 -0
  347. data/spec/dummy/public/favicon.ico +0 -0
  348. data/spec/factories/authentication_factory.rb +16 -0
  349. data/spec/factories/common_factory.rb +4 -0
  350. data/spec/factories/event_factory.rb +26 -0
  351. data/spec/factories/proposal_factory.rb +57 -0
  352. data/spec/factories/proposal_user_factory.rb +7 -0
  353. data/spec/factories/room_factory.rb +11 -0
  354. data/spec/factories/schedule_item_factory.rb +13 -0
  355. data/spec/factories/session_types_factory.rb +10 -0
  356. data/spec/factories/snippet_factory.rb +7 -0
  357. data/spec/factories/track_factory.rb +12 -0
  358. data/spec/factories/user_factory.rb +22 -0
  359. data/spec/factories/user_favorite_factory.rb +7 -0
  360. data/spec/features/sign_in_spec.rb +11 -0
  361. data/spec/features/snippets_spec.rb +38 -0
  362. data/spec/fixtures/open_conference_ware_comments.yml +27 -0
  363. data/spec/fixtures/open_conference_ware_events.yml +56 -0
  364. data/spec/fixtures/open_conference_ware_proposals.yml +256 -0
  365. data/spec/fixtures/open_conference_ware_rooms.yml +13 -0
  366. data/spec/fixtures/open_conference_ware_schedule_items.yml +23 -0
  367. data/spec/fixtures/open_conference_ware_session_types.yml +19 -0
  368. data/spec/fixtures/open_conference_ware_snippets.yml +62 -0
  369. data/spec/fixtures/open_conference_ware_tracks.yml +65 -0
  370. data/spec/fixtures/open_conference_ware_user_favorites.yml +7 -0
  371. data/spec/fixtures/open_conference_ware_users.yml +87 -0
  372. data/spec/helpers/open_conference_ware/application_helper_spec.rb +58 -0
  373. data/spec/helpers/open_conference_ware/authentications_helper_spec.rb +15 -0
  374. data/spec/helpers/open_conference_ware/display_link_to_helper_spec.rb +52 -0
  375. data/spec/helpers/open_conference_ware/proposals_helper_spec.rb +32 -0
  376. data/spec/helpers/open_conference_ware/rooms_helper_spec.rb +11 -0
  377. data/spec/helpers/open_conference_ware/session_types_helper_spec.rb +15 -0
  378. data/spec/helpers/open_conference_ware/time_range_helper_spec.rb +56 -0
  379. data/spec/helpers/open_conference_ware/tracks_helper_spec.rb +11 -0
  380. data/spec/helpers/open_conference_ware/user_favorites_helper_spec.rb +11 -0
  381. data/spec/integration/open_conference_ware/cache_lookups_mixin_spec.rb +122 -0
  382. data/spec/mixins/open_conference_ware/normalize_url_mixin_spec.rb +65 -0
  383. data/spec/models/open_conference_ware/authentication_spec.rb +67 -0
  384. data/spec/models/open_conference_ware/event_spec.rb +211 -0
  385. data/spec/models/open_conference_ware/proposal_spec.rb +606 -0
  386. data/spec/models/open_conference_ware/room_spec.rb +14 -0
  387. data/spec/models/open_conference_ware/schedule_item_spec.rb +12 -0
  388. data/spec/models/open_conference_ware/schedule_spec.rb +358 -0
  389. data/spec/models/open_conference_ware/selector_vote_spec.rb +12 -0
  390. data/spec/models/open_conference_ware/session_type_spec.rb +15 -0
  391. data/spec/models/open_conference_ware/snippet_spec.rb +13 -0
  392. data/spec/models/open_conference_ware/speaker_mailer_spec.rb +91 -0
  393. data/spec/models/open_conference_ware/track_spec.rb +36 -0
  394. data/spec/models/open_conference_ware/user_favorite_spec.rb +41 -0
  395. data/spec/models/open_conference_ware/user_spec.rb +77 -0
  396. data/spec/ocw_config.rb +76 -0
  397. data/spec/rcov.opts +2 -0
  398. data/spec/spec.opts +3 -0
  399. data/spec/spec_helper.rb +55 -0
  400. data/spec/spec_helper_customizations.rb +125 -0
  401. data/spec/support/add_all_helpers_to_view.rb +24 -0
  402. data/spec/support/authenticated_test_helper.rb +27 -0
  403. data/spec/support/fixture_shortcuts.rb +18 -0
  404. data/spec/support/omniauth.rb +34 -0
  405. data/spec/support/valid_params_extraction.rb +15 -0
  406. data/spec/views/open_conference_ware/proposals/_room_control.html.erb_spec.rb +23 -0
  407. data/spec/views/open_conference_ware/proposals/_transition_control.html.erb_spec.rb +14 -0
  408. data/spec/views/open_conference_ware/proposals/show.html.erb_spec.rb +128 -0
  409. data/spec/views/open_conference_ware/rooms/index.html.erb_spec.rb +19 -0
  410. data/spec/views/open_conference_ware/rooms/show.html.erb_spec.rb +15 -0
  411. data/spec/views/open_conference_ware/selector_votes/index.html.erb_spec.rb +41 -0
  412. data/spec/views/open_conference_ware/session_types/edit.html.erb_spec.rb +25 -0
  413. data/spec/views/open_conference_ware/session_types/index.html.erb_spec.rb +19 -0
  414. data/spec/views/open_conference_ware/session_types/new.html.erb_spec.rb +24 -0
  415. data/spec/views/open_conference_ware/session_types/show.html.erb_spec.rb +18 -0
  416. data/spec/views/open_conference_ware/tracks/edit.html.erb_spec.rb +25 -0
  417. data/spec/views/open_conference_ware/tracks/index.html.erb_spec.rb +56 -0
  418. data/spec/views/open_conference_ware/tracks/new.html.erb_spec.rb +26 -0
  419. data/spec/views/open_conference_ware/tracks/show.html.erb_spec.rb +23 -0
  420. data/spec/views/open_conference_ware/user_favorites/index.html.erb_spec.rb +29 -0
  421. data/spec/views/open_conference_ware/users/index_spec.rb +24 -0
  422. data/util/add_id3_tags_to_mp3.rb +57 -0
  423. data/util/schedule_demo.rb +36 -0
  424. data/util/seed_schedule.rb +61 -0
  425. data/util/sessions_to_lanyrd.rb +166 -0
  426. data/util/transfer_schedule_items.rb +25 -0
  427. data/util/update_proposal_status_from_voting_spreadsheet.rb +26 -0
  428. data/util/user_favorites_contention_report.rb +42 -0
  429. data/util/user_favorites_contention_report.sh +9 -0
  430. data/vendor/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  431. data/vendor/assets/fonts/glyphicons-halflings-regular.svg +228 -0
  432. data/vendor/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  433. data/vendor/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  434. data/vendor/assets/images/farbtastic/marker.png +0 -0
  435. data/vendor/assets/images/farbtastic/mask.png +0 -0
  436. data/vendor/assets/images/farbtastic/wheel.png +0 -0
  437. data/vendor/assets/images/idselector/aol.ico +0 -0
  438. data/vendor/assets/images/idselector/arrow.gif +0 -0
  439. data/vendor/assets/images/idselector/arrow_white_back.png +0 -0
  440. data/vendor/assets/images/idselector/arrow_white_forward.png +0 -0
  441. data/vendor/assets/images/idselector/blogger.ico +0 -0
  442. data/vendor/assets/images/idselector/claimid.ico +0 -0
  443. data/vendor/assets/images/idselector/flickr.ico +0 -0
  444. data/vendor/assets/images/idselector/google.ico +0 -0
  445. data/vendor/assets/images/idselector/lj.ico +0 -0
  446. data/vendor/assets/images/idselector/myopenid.ico +0 -0
  447. data/vendor/assets/images/idselector/openid.ico +0 -0
  448. data/vendor/assets/images/idselector/technorati.ico +0 -0
  449. data/vendor/assets/images/idselector/verisign.ico +0 -0
  450. data/vendor/assets/images/idselector/vidoop2.ico +0 -0
  451. data/vendor/assets/images/idselector/vox.ico +0 -0
  452. data/vendor/assets/images/idselector/yahoo.ico +0 -0
  453. data/vendor/assets/javascripts/audiojs/audio.min.js +23 -0
  454. data/vendor/assets/javascripts/audiojs/audiojs.swf +0 -0
  455. data/vendor/assets/javascripts/audiojs/player-graphics.gif +0 -0
  456. data/vendor/assets/javascripts/bootstrap.js +1999 -0
  457. data/vendor/assets/javascripts/farbtastic.js +329 -0
  458. data/vendor/assets/javascripts/html5shiv.js +8 -0
  459. data/vendor/assets/javascripts/idselector.js +538 -0
  460. data/vendor/assets/javascripts/idselector~original.js +532 -0
  461. data/vendor/assets/javascripts/jquery-migrate-1.2.1.js +521 -0
  462. data/vendor/assets/javascripts/jquery.localScroll.js +106 -0
  463. data/vendor/assets/javascripts/jquery.scrollTo.js +174 -0
  464. data/vendor/assets/javascripts/respond.min.js +6 -0
  465. data/vendor/assets/stylesheets/bootstrap-theme.css +384 -0
  466. data/vendor/assets/stylesheets/bootstrap.css +6805 -0
  467. data/vendor/assets/stylesheets/farbtastic.css.scss +38 -0
  468. data/vendor/assets/stylesheets/persona-buttons.css +229 -0
  469. data/vendor/assets/stylesheets/reset-fonts-grids.css +7 -0
  470. metadata +1174 -0
  471. metadata.gz.sig +0 -0
@@ -0,0 +1,96 @@
1
+ namespace :open_conference_ware do
2
+ namespace :mediawiki do
3
+ def get_wiki_credentials
4
+ return @get_wiki_credentials ||= begin
5
+ require 'ostruct'
6
+
7
+ missing = nil
8
+
9
+ credentials = OpenStruct.new
10
+ credentials.user = ENV['USER'] or missing = "USER"
11
+ credentials.password = ENV['PASSWORD'] or missing = "PASSWORD"
12
+ credentials.url = ENV['URL'] or missing = "URL"
13
+
14
+ if missing
15
+ puts <<-HERE
16
+ MediaWiki credentials must include:
17
+ * USER: The admin user to login to the wiki as.
18
+ * PASSWORD: The admin user's password.
19
+ * URL: The URL for the server's "api.php".
20
+
21
+ For example:
22
+ rake --trace open_conference_ware:mediawiki:populate USER=admin PASSWORD=secret URL=http://opensourcebridge.org/2011/w/api.php EVENT=2011
23
+ HERE
24
+
25
+ raise ArgumentError, "No #{missing} defined"
26
+ else
27
+ credentials
28
+ end
29
+ end
30
+ end
31
+
32
+ def sanitize_string(string)
33
+ return CGI.unescape(OpenConferenceWare::Proposal._session_notes_url_escape(string))
34
+ end
35
+
36
+ def event_wiki_title(event)
37
+ return "Category:#{sanitize_string(event.title)}"
38
+ end
39
+
40
+ def tracks_wiki_title(event)
41
+ return "Category:#{sanitize_string(event.title)} tracks"
42
+ end
43
+
44
+ def track_wiki_title(track)
45
+ #IK# return "Category:#{track.title} :: #{track.event.title}"
46
+ return "Category:#{sanitize_string(track.title)}"
47
+ end
48
+
49
+ def session_wiki_title(session)
50
+ #IK# return "#{session.title} :: #{session.event.title}"
51
+ return "#{sanitize_string(session.event.slug)}/#{sanitize_string(session.title)}"
52
+ end
53
+
54
+ desc "Populates the attendee wiki with pages to hold session notes."
55
+ task :populate => :environment do
56
+ require 'lib/rwikibot_page_drone'
57
+
58
+ credentials = get_wiki_credentials
59
+ wiki = RWikiBot::Bot.new(credentials.user, credentials.password, credentials.url, '', true)
60
+ event = ENV['EVENT'] ? OpenConferenceWare::Event.find_by_slug(ENV['EVENT']) : OpenConferenceWare::Event.current
61
+
62
+ # Event page
63
+ drone = RwikibotPageDrone.new(wiki, event_wiki_title(event))
64
+ drone.replace_span "description", "For details, see [#{OpenConferenceWare.public_url} #{OpenConferenceWare.organization}]."
65
+ drone.save(true)
66
+
67
+ # Tracks page
68
+ drone = RwikibotPageDrone.new(wiki, tracks_wiki_title(event))
69
+ drone.replace_span "description", "Tracks for [#{OpenConferenceWare.public_url} #{OpenConferenceWare.organization}]."
70
+ drone.save(true)
71
+
72
+ # Tracks
73
+ event.tracks.includes(:event).each do |track|
74
+ drone = RwikibotPageDrone.new(wiki, track_wiki_title(track))
75
+ drone.append "[[#{event_wiki_title(track.event)}]]"
76
+ drone.append "[[#{tracks_wiki_title(track.event)}]]"
77
+ drone.replace_span "description", "#{textilize track.description}"
78
+ drone.save(true)
79
+ end
80
+
81
+ # Sessions
82
+ event.proposals.confirmed.includes(:event, :track, :session_type).each do |proposal|
83
+ drone = RwikibotPageDrone.new(wiki, session_wiki_title(proposal))
84
+ content = "[[#{event_wiki_title(proposal.event)} notes]] [[#{track_wiki_title(proposal.track)} notes]]"
85
+ content << "#{textilize proposal.excerpt} " unless proposal.excerpt.blank?
86
+ content << "<p>Speaker#{proposal.users.size > 1 ? 's' : ''}: #{proposal.users.map{|user| sprintf('[%susers/%s %s]', OpenConferenceWare.app_root_url, user.id, user.fullname)}.join(', ')}</p>"
87
+ content << "<p>Return to [#{sprintf '%ssessions/%s', OpenConferenceWare.app_root_url, proposal.id} this session's details]</p>"
88
+ content << "\n= Contributed notes =\n"
89
+ drone.replace_span("generated", content)
90
+ drone.append "<!-- DO NOT CHANGE ANYTHING ABOVE THIS LINE -->"
91
+ drone.append "(Add your notes here!)"
92
+ drone.save(true)
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,16 @@
1
+ namespace :open_conference_ware do
2
+ desc %{Setup application's database and seed data}
3
+ task :setup => ['db:migrate', 'db:seed'] do
4
+ puts <<-HERE
5
+
6
+ TO FINISH SETUP
7
+ 1. See README.markdown for information about security and customization
8
+ 2. Start the server, e.g.: bin/rails server
9
+ 3. Sign in as an admin in development mode
10
+ 4. Use the web-based admin interface to create and configure an event
11
+ HERE
12
+ end
13
+ end
14
+
15
+ Rake::Task["open_conference_ware:install:migrations"].clear
16
+
@@ -0,0 +1,103 @@
1
+ namespace :open_conference_ware do
2
+ namespace :schedule do
3
+ namespace :import do
4
+ desc "Import schedule from CSV file."
5
+ task :csv => :environment do
6
+ unless ENV['CSV'] and ENV['EVENT']
7
+ puts <<-HERE
8
+ schedule:import:csv
9
+
10
+ Usage:
11
+ rake schedule:import:csv RAILS_ENV=production EVENT=2010 CSV=schedule.csv
12
+
13
+ CSV format:
14
+ Your CSV file must have a header with these titles and data:
15
+ * date
16
+ * time
17
+ * proposal_id
18
+ HERE
19
+ exit 1
20
+ end
21
+
22
+ event_slug = ENV['EVENT']
23
+ csv_file = ENV['CSV']
24
+
25
+ event = Event.find_by_slug(event_slug)
26
+ puts "* Loaded event by slug: #{event.slug}"
27
+
28
+ has_seen_header = false
29
+ puts "* Reading CSV file: #{csv_file}"
30
+ CSV.foreach(csv_file) do |row|
31
+ date, time, proposal_id = row
32
+ if has_seen_header
33
+ proposal = Proposal.find(proposal_id)
34
+ datetime = Time.zone.parse "#{date} #{time}"
35
+ puts "- Setting #{datetime.inspect} for #{proposal.title}"
36
+ proposal.update_attribute(:start_time, datetime)
37
+ else
38
+ expected_header = %w[date time proposal_id]
39
+ unless expected_header == row
40
+ puts "ERROR: your CSV file header must be #{expected_header.inspect}"
41
+ exit 1
42
+ end
43
+ puts "* Validated CSV header"
44
+ has_seen_header = true
45
+ end
46
+ end
47
+ end
48
+
49
+ desc "Import schedule from Google Spread Sheet"
50
+ task :google_spreadsheet => :environment do
51
+ require 'google_spreadsheet'
52
+
53
+ if raw = SECRETS.schedule_google_spreadsheet
54
+ auth = OpenStruct.new(raw)
55
+ else
56
+ puts <<-HERE
57
+ ERROR: No credentials found for importing. Please add your credentials in the
58
+ following format to your "config/secrets.yml" file:
59
+
60
+ schedule_google_spreadsheet:
61
+ login: 'your@google.account'
62
+ password: 'your_password'
63
+ key: 'your_key'
64
+
65
+ HERE
66
+ raise ArgumentError, "No credentials"
67
+ end
68
+
69
+ gs = GoogleSpreadsheet.login(auth.login, auth.password).spreadsheet_by_key(auth.key)
70
+
71
+ print "- Loading ... "
72
+ STDOUT.flush
73
+ data = gs.worksheets.select{|sheet| sheet.title.include?("Exportable")}.map do |sheet|
74
+ sheet.rows[1..-1].map do |row|
75
+ {
76
+ :id => row[0],
77
+ :room_id => row[1],
78
+ :start_time => Time.zone.parse("#{row[2]} #{row[3]}")
79
+ }
80
+ end
81
+ end.flatten
82
+ puts "#{data.size} records"
83
+
84
+ print "- Saving ..."
85
+ STDOUT.flush
86
+ data.each do |scheduled|
87
+ if scheduled[:id].to_i > 0
88
+ begin
89
+ session = Proposal.find(scheduled[:id])
90
+ session.room_id = scheduled[:room_id]
91
+ session.start_time = scheduled[:start_time]
92
+ session.save
93
+ rescue ActiveRecord::RecordNotFound
94
+ puts "! Unknown record: #{scheduled.inspect}"
95
+ end
96
+ end
97
+ end
98
+ puts "done!"
99
+
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,23 @@
1
+ namespace :open_conference_ware do
2
+ namespace :snippets do
3
+ desc "Load initial snippets of text. Use FORCE environmental variable to avoid prompt if these are already present."
4
+ task :reload => ["environment"] do
5
+ replace = false
6
+ perform = true
7
+ if OpenConferenceWare::Snippet.count > 0 and not ENV["FORCE"]
8
+ replace = true
9
+ print "?? WARNING: Reset snippets back to defaults? (y/N) "
10
+ STDOUT.flush
11
+ response = STDIN.readline
12
+ unless response.strip.match(/y/i)
13
+ puts "** Not resetting snippets back to defaults"
14
+ perform = false
15
+ end
16
+ end
17
+
18
+ # TODO Merge snippets for Tickets and Proposals apps
19
+ #IK# Rake::Task["snippets:load"].invoke if perform
20
+ OpenConferenceWare::Snippet.reload_from_fixtures! if perform
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,67 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+
3
+ # Maintain your gem's version:
4
+ require "open_conference_ware/version"
5
+
6
+ # Describe your gem and declare its dependencies:
7
+ Gem::Specification.new do |s|
8
+ s.name = "open_conference_ware"
9
+ s.version = OpenConferenceWare::VERSION
10
+ s.authors = ["Igal Koshevoy", "Reid Beels", "Kirsten Comandich", "Audrey Eschright", "et al."]
11
+ s.email = ["reid@opensourcebridge.org"]
12
+ s.homepage = "http://openconferenceware.org"
13
+ s.summary = "An open source web application for events and conferences. "
14
+ s.description = "OpenConferenceWare is an open source web application for events and conferences. This customizable, general-purpose platform provides proposals, sessions, schedules, tracks and more."
15
+
16
+ s.require_paths = ["lib"]
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- spec/*`.split("\n")
19
+
20
+ cert = File.expand_path("~/.ssh/gem-private_key_ocw.pem")
21
+ if File.exist?(cert)
22
+ s.signing_key = cert
23
+ s.cert_chain = ["gem-public_cert.pem"]
24
+ end
25
+
26
+ s.add_dependency "rails", "~> 4.0.2"
27
+ s.add_dependency "rails-observers", "~> 0.1.2"
28
+
29
+ # Authentication
30
+ s.add_dependency "omniauth", "~> 1.1.4"
31
+
32
+ s.add_dependency "hashery"
33
+
34
+ s.add_dependency 'RedCloth'
35
+ s.add_dependency 'aasm'
36
+ s.add_dependency 'acts-as-taggable-on'
37
+ s.add_dependency 'color'
38
+ s.add_dependency 'comma', '~> 3.0'
39
+ s.add_dependency 'gchartrb', '~> 0.8.0' #, :require => 'google_chart'
40
+ s.add_dependency 'paperclip'
41
+ s.add_dependency 'vpim'
42
+ s.add_dependency 'nokogiri'
43
+ s.add_dependency 'prawn'
44
+ s.add_dependency 'dalli'
45
+ s.add_dependency "dynamic_form"
46
+ s.add_dependency 'rinku' #, :require => 'rails_rinku'
47
+
48
+ # Assets
49
+ s.add_dependency 'jquery-rails'
50
+ s.add_dependency 'sass-rails', " ~> 4.0.0"
51
+ s.add_dependency 'uglifier'
52
+
53
+ # Development
54
+ s.add_development_dependency "sqlite3"
55
+
56
+ # Testing
57
+ s.add_development_dependency 'omniauth-openid'
58
+ s.add_development_dependency 'rspec-rails'
59
+ s.add_development_dependency 'capybara'
60
+ s.add_development_dependency 'factory_girl_rails'
61
+ s.add_development_dependency 'database_cleaner'
62
+ s.add_development_dependency 'cucumber-rails'
63
+ s.add_development_dependency 'guard-rspec'
64
+ s.add_development_dependency 'simplecov'
65
+ s.add_development_dependency 'cadre'
66
+ s.add_development_dependency 'coveralls'
67
+ end
Binary file
@@ -0,0 +1,309 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenConferenceWare::ApplicationController do
4
+ fixtures :all
5
+ routes { OpenConferenceWare::Engine.routes }
6
+
7
+ def can_edit?(*args)
8
+ return @controller.send(:can_edit?, *args)
9
+ end
10
+
11
+ def accepting_proposals?(*args)
12
+ return @controller.send(:accepting_proposals?, *args)
13
+ end
14
+
15
+ describe "can_edit?" do
16
+ describe "users" do
17
+ it "should allow user to edit own" do
18
+ login_as :quentin
19
+ can_edit?(users(:quentin)).should be_true
20
+ end
21
+
22
+ it "should not allow user to edit other's" do
23
+ login_as :quentin
24
+ can_edit?(users(:clio)).should be_false
25
+ end
26
+
27
+ it "should allow admin to edit other's" do
28
+ login_as :aaron
29
+ can_edit?(users(:clio)).should be_true
30
+ end
31
+ end
32
+
33
+ describe "proposals" do
34
+ describe "accepting_proposals?" do
35
+ it "should be false without anything defined" do
36
+ accepting_proposals?.should_not be_true
37
+ end
38
+
39
+ it "should be true when given open event" do
40
+ accepting_proposals?(events(:open)).should be_true
41
+ end
42
+
43
+ it "should be false when given closed event" do
44
+ accepting_proposals?(events(:closed)).should_not be_true
45
+ end
46
+
47
+ it "should be true when given open proposal" do
48
+ accepting_proposals?(proposals(:quentin_widgets)).should be_true
49
+ end
50
+
51
+ it "should be false when given closed proposal" do
52
+ accepting_proposals?(proposals(:clio_chupacabras)).should_not be_true
53
+ end
54
+
55
+ it "should be true when assigned open event instance" do
56
+ @controller.instance_variable_set(:@event, events(:open))
57
+ accepting_proposals?.should be_true
58
+ end
59
+
60
+ it "should be false when assigned closed instance" do
61
+ @controller.instance_variable_set(:@event, events(:closed))
62
+ accepting_proposals?.should_not be_true
63
+ end
64
+ end
65
+
66
+ describe "when accepting" do
67
+ it "should allow user to edit own when accepting proposals" do
68
+ login_as :quentin
69
+ proposal = proposals(:quentin_widgets)
70
+ can_edit?(proposal).should be_true
71
+ end
72
+
73
+ it "should allow user to edit own before a status has been set" do
74
+ login_as :quentin
75
+ proposal = proposals(:quentin_widgets)
76
+ proposal.status = 'proposed'
77
+ can_edit?(proposal).should be_true
78
+ end
79
+
80
+ it "should not allow user to edit own once a status has been set" do
81
+ login_as :quentin
82
+ proposal = proposals(:quentin_widgets)
83
+ proposal.status = 'accepted'
84
+ pending # TODO decide when to stop editing
85
+ can_edit?(proposal).should be_false
86
+ end
87
+
88
+ it "should not allow user to edit other's when accepting proposals" do
89
+ login_as :quentin
90
+ can_edit?(proposals(:aaron_aardvarks)).should be_false
91
+ end
92
+ end
93
+
94
+ describe "when not accepting" do
95
+ it "should not allow user to edit own when not accepting proposals" do
96
+ login_as :clio
97
+ pending "FIXME do we really want people to be able to edit forever?"
98
+ can_edit?(proposals(:clio_chupacabras)).should be_false
99
+ end
100
+
101
+ it "should allow admin to edit other's when not accepting proposals" do
102
+ login_as :aaron
103
+ can_edit?(proposals(:clio_chupacabras)).should be_true
104
+ end
105
+ end
106
+ end
107
+
108
+ it "should not allow anonymous to edit anything" do
109
+ can_edit?(Proposal.first).should be_false
110
+ end
111
+
112
+ it "should fail on nil" do
113
+ login_as :quentin
114
+ lambda { can_edit? }.should raise_error(ArgumentError)
115
+ end
116
+
117
+ it "should fail on unknown record type" do
118
+ login_as :quentin
119
+ lambda { can_edit?(42) }.should raise_error(TypeError)
120
+ end
121
+ end
122
+
123
+ describe "assign_current_event_without_redirecting" do
124
+ it "should detected :assigned_already" do
125
+ @controller.instance_variable_set(:@event, events(:open))
126
+ @controller.send(:assign_current_event_without_redirecting)
127
+
128
+ @controller.instance_variable_get(:@event_assignment).should == :assigned_already
129
+ end
130
+ end
131
+
132
+ describe "assert_current_event_or_redirect" do
133
+ describe "when no events" do
134
+ it "should direct admin users to event manager" do
135
+ login_as :aaron
136
+ @controller.instance_variable_set(:@event_assignment, :empty)
137
+ @controller.should_receive(:manage_events_path)
138
+ @controller.should_receive(:redirect_to)
139
+ @controller.send(:assert_current_event_or_redirect)
140
+
141
+ flash[:failure].should_not be_blank
142
+ end
143
+
144
+ it "should display a failure for non-admins" do
145
+ logout
146
+ @controller.instance_variable_set(:@event_assignment, :empty)
147
+ @controller.should_receive(:render)
148
+ @controller.send(:assert_current_event_or_redirect)
149
+
150
+ flash[:failure].should_not be_blank
151
+ end
152
+ end
153
+ end
154
+
155
+ # These specs are evil. Surely there's a better way to describe the behavior of controller methods that rely on a request without testing them through an action?
156
+ describe "normalize_event_path_or_redirect" do
157
+ describe "with HTML" do
158
+ it "should not redirect canonical requests" do
159
+ @controller.should_receive(:request).at_least(:once).and_return(double(OpenStruct,
160
+ path: OpenConferenceWare.mounted_path('/events/123/proposals'),
161
+ format: 'html'))
162
+ @controller.send(:normalize_event_path_or_redirect).should be_false
163
+ end
164
+
165
+ it "should redirect incomplete requests and keep flash" do
166
+ event = events(:open)
167
+ @flash = double("Flash Container")
168
+ @controller.stub(:request).and_return(double("Request",
169
+ path: '/proposals',
170
+ format: 'html',
171
+ protocol: 'http',
172
+ host_with_port: 'foo:80',
173
+ flash: @flash
174
+ ))
175
+
176
+ @controller.instance_variable_set(:@event, event)
177
+ @controller.should_receive(:redirect_to).with(OpenConferenceWare.mounted_path("/events/#{event.to_param}/application/"))
178
+ @flash.should_receive(:keep)
179
+
180
+ @controller.send(:normalize_event_path_or_redirect)
181
+ end
182
+ end
183
+
184
+ describe "with JSON" do
185
+ it "should not redirect canonical requests" do
186
+ @controller.should_receive(:request).at_least(:once).and_return(double(OpenStruct,
187
+ path: '/events/123/proposals',
188
+ format: 'json'))
189
+ @controller.send(:normalize_event_path_or_redirect).should be_false
190
+ end
191
+
192
+ it "should redirect incomplete requests" do
193
+ @controller.should_receive(:request).at_least(:once).and_return(double(OpenStruct,
194
+ path: '/proposals',
195
+ format: 'json'))
196
+ @controller.send(:normalize_event_path_or_redirect).should be_false
197
+ end
198
+ end
199
+ end
200
+
201
+ describe "assert_schedule_published" do
202
+ before(:each) do
203
+ @event = stub_current_event!
204
+ @controller.instance_variable_set(:@event, @event)
205
+ end
206
+
207
+ describe "as admin" do
208
+ before(:each) do
209
+ login_as :aaron
210
+ end
211
+
212
+ it "should be able to view schedule when it's published" do
213
+ @controller.stub(:schedule_visible?).and_return(true)
214
+ @controller.should_not_receive(:redirect_to)
215
+
216
+ result = @controller.send(:assert_schedule_published)
217
+ flash[:failure].should be_blank
218
+ end
219
+
220
+ it "should be able to view schedule before it's published" do
221
+ @controller.stub(:schedule_visible?).and_return(false)
222
+ @controller.should_not_receive(:redirect_to)
223
+
224
+ result = @controller.send(:assert_schedule_published)
225
+ flash[:failure].should be_blank
226
+ flash[:notice].should_not be_blank
227
+ end
228
+ end
229
+
230
+ describe "as non-admin" do
231
+ before(:each) do
232
+ logout
233
+ end
234
+
235
+ it "should be able to view schedule when it's published" do
236
+ @controller.stub(:schedule_visible?).and_return(true)
237
+ @controller.should_not_receive(:redirect_to)
238
+
239
+ result = @controller.send(:assert_schedule_published)
240
+ flash[:failure].should be_blank
241
+ end
242
+
243
+ it "should not be able to view schedule before it's published" do
244
+ @controller.stub(:schedule_visible?).and_return(false)
245
+ @controller.should_receive(:redirect_to)
246
+
247
+ @controller.send(:assert_schedule_published)
248
+ flash[:failure].should_not be_blank
249
+ end
250
+ end
251
+
252
+ end
253
+
254
+ describe "current_user_cache_key" do
255
+ it "should return id of currently logged-in user" do
256
+ user = users(:quentin)
257
+ login_as user
258
+
259
+ @controller.send(:current_user_cache_key).should == user.id
260
+ end
261
+
262
+ it "should return -1 if not logged in" do
263
+ logout
264
+
265
+ @controller.send(:current_user_cache_key).should == -1
266
+ end
267
+ end
268
+
269
+ describe "current_event_cache_key" do
270
+ it "should return id of current event" do
271
+ event = events(:open)
272
+ @controller.instance_variable_set(:@event, event)
273
+
274
+ @controller.send(:current_event_cache_key).should == event.id
275
+ end
276
+
277
+ it "should return -1 if no current event" do
278
+ @controller.instance_variable_set(:@event, nil)
279
+
280
+ @controller.send(:current_event_cache_key).should == -1
281
+ end
282
+ end
283
+
284
+ describe "developer_mode?" do
285
+ it "should not be in development mode when testing" do
286
+ @controller.send(:development_mode?).should be_false
287
+ end
288
+ end
289
+
290
+ describe "#notify" do
291
+ it "should set a message if one isn't defined" do
292
+ @controller.send(:notify, :failure, "OMG")
293
+
294
+ flash[:failure].should == "OMG"
295
+ end
296
+
297
+ it "should append a message if one is defined" do
298
+ @controller.send(:notify, :failure, "OMG.")
299
+ @controller.send(:notify, :failure, "WTF.")
300
+ @controller.send(:notify, :failure, "BBQ.")
301
+
302
+ flash[:failure].should == "OMG. WTF. BBQ."
303
+ end
304
+
305
+ it "should fail if given an invalid level" do
306
+ lambda { @controller.send(:notify, :omg, "kittens") }.should raise_error(ArgumentError)
307
+ end
308
+ end
309
+ end