droom 0.4.3 → 0.5.3

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 (396) hide show
  1. checksums.yaml +7 -0
  2. data/app/assets/images/droom/admin_menu.png +0 -0
  3. data/app/assets/images/droom/applications_menu.png +0 -0
  4. data/app/assets/images/droom/arrows_small.png +0 -0
  5. data/app/assets/images/droom/config_menu.png +0 -0
  6. data/app/assets/images/droom/dropdown.png +0 -0
  7. data/app/assets/images/droom/menu/asterisk.png +0 -0
  8. data/app/assets/images/droom/{smalladd.png → menu/smalladd.png} +0 -0
  9. data/app/assets/images/droom/{small_asterisk.png → menu/smallasterisk.png} +0 -0
  10. data/app/assets/images/droom/{smalldelete.png → menu/smalldelete.png} +0 -0
  11. data/app/assets/images/droom/{smalldownload.png → menu/smalldownload.png} +0 -0
  12. data/app/assets/images/droom/{smalledit.png → menu/smalledit.png} +0 -0
  13. data/app/assets/images/droom/message.png +0 -0
  14. data/app/assets/images/droom/missing/scrap.jpg +0 -0
  15. data/app/assets/images/droom/missing/scrap.png +0 -0
  16. data/app/assets/images/droom/missing/thumb.png +0 -0
  17. data/app/assets/images/droom/missing/user.png +0 -0
  18. data/app/assets/images/droom/object_icons.png +0 -0
  19. data/app/assets/images/droom/panel/add.png +0 -0
  20. data/app/assets/images/droom/panel/edit.png +0 -0
  21. data/app/assets/images/droom/panel/manage.png +0 -0
  22. data/app/assets/images/droom/pointer_upwards.png +0 -0
  23. data/app/assets/images/droom/search_menu.png +0 -0
  24. data/app/assets/images/droom/setter.png +0 -0
  25. data/app/assets/images/droom/small_icons.png +0 -0
  26. data/app/assets/images/droom/stream/closer.png +0 -0
  27. data/app/assets/images/droom/stream/next.png +0 -0
  28. data/app/assets/images/droom/stream/prev.png +0 -0
  29. data/app/assets/images/droom/stream/previous.png +0 -0
  30. data/app/assets/images/droom/subscribe.png +0 -0
  31. data/app/assets/javascripts/droom.js.coffee +23 -13
  32. data/app/assets/javascripts/droom/actions.js.coffee +104 -10
  33. data/app/assets/javascripts/droom/ajax.js.coffee +36 -24
  34. data/app/assets/javascripts/droom/extensions.js.coffee +13 -0
  35. data/app/assets/javascripts/droom/lib/jquery.datepicker.js +1026 -0
  36. data/app/assets/javascripts/droom/lib/jquery.deserialize.js +142 -0
  37. data/app/assets/javascripts/droom/lib/jquery_ujs.js +416 -0
  38. data/app/assets/javascripts/droom/lib/swipe.js +568 -0
  39. data/app/assets/javascripts/droom/lib/underscore.js +1276 -0
  40. data/app/assets/javascripts/droom/popups.js.coffee +98 -37
  41. data/app/assets/javascripts/droom/stream.js.coffee +119 -77
  42. data/app/assets/javascripts/droom/utilities.js.coffee +25 -3
  43. data/app/assets/javascripts/droom/widgets.js.coffee +318 -253
  44. data/app/assets/stylesheets/droom.css.sass +482 -955
  45. data/app/assets/stylesheets/droom/_mixins.css.sass +12 -42
  46. data/app/assets/stylesheets/droom/_popups.css.sass +28 -11
  47. data/app/assets/stylesheets/droom/_stream.css.sass +375 -0
  48. data/app/assets/stylesheets/droom/_toolbar.css.sass +0 -6
  49. data/app/assets/stylesheets/droom/_variables.css.sass +4 -2
  50. data/app/controllers/droom/agenda_categories_controller.rb +6 -14
  51. data/app/controllers/droom/api/api_controller.rb +56 -0
  52. data/app/controllers/droom/api/events_controller.rb +74 -0
  53. data/app/controllers/droom/api/users_controller.rb +92 -0
  54. data/app/controllers/droom/api/venues_controller.rb +71 -0
  55. data/app/controllers/droom/calendars_controller.rb +4 -10
  56. data/app/controllers/droom/{user_confirmations_controller.rb → confirmations_controller.rb} +8 -7
  57. data/app/controllers/droom/dashboard_controller.rb +2 -19
  58. data/app/controllers/droom/documents_controller.rb +12 -60
  59. data/app/controllers/droom/dropbox_tokens_controller.rb +3 -4
  60. data/app/controllers/droom/engine_controller.rb +39 -11
  61. data/app/controllers/droom/events_controller.rb +62 -84
  62. data/app/controllers/droom/folders_controller.rb +30 -40
  63. data/app/controllers/droom/group_invitations_controller.rb +6 -23
  64. data/app/controllers/droom/group_permissions_controller.rb +26 -0
  65. data/app/controllers/droom/groups_controller.rb +10 -14
  66. data/app/controllers/droom/invitations_controller.rb +7 -25
  67. data/app/controllers/droom/memberships_controller.rb +13 -18
  68. data/app/controllers/droom/organisations_controller.rb +6 -25
  69. data/app/controllers/droom/permissions_controller.rb +50 -0
  70. data/app/controllers/droom/preferences_controller.rb +9 -10
  71. data/app/controllers/droom/scraps_controller.rb +23 -26
  72. data/app/controllers/droom/services_controller.rb +50 -0
  73. data/app/controllers/droom/suggestions_controller.rb +6 -4
  74. data/app/controllers/droom/users/confirmations_controller.rb +24 -0
  75. data/app/controllers/droom/users/passwords_controller.rb +39 -0
  76. data/app/controllers/droom/users/sessions_controller.rb +7 -0
  77. data/app/controllers/droom/users_controller.rb +60 -38
  78. data/app/controllers/droom/venues_controller.rb +8 -15
  79. data/app/controllers/droom/youtube_controller.rb +1 -1
  80. data/app/helpers/droom/droom_helper.rb +22 -17
  81. data/app/models/droom/ability.rb +81 -0
  82. data/app/models/droom/agenda_category.rb +0 -1
  83. data/app/models/droom/calendar.rb +12 -7
  84. data/app/models/droom/category.rb +4 -10
  85. data/app/models/droom/concerns/slugged.rb +21 -0
  86. data/app/models/droom/document.rb +15 -17
  87. data/app/models/droom/dropbox_document.rb +3 -6
  88. data/app/models/droom/dropbox_token.rb +2 -3
  89. data/app/models/droom/event.rb +117 -163
  90. data/app/models/droom/event_type.rb +25 -0
  91. data/app/models/droom/folder.rb +36 -48
  92. data/app/models/droom/group.rb +35 -27
  93. data/app/models/droom/group_invitation.rb +7 -10
  94. data/app/models/droom/group_permission.rb +29 -0
  95. data/app/models/droom/invitation.rb +14 -23
  96. data/app/models/droom/mailing_list_membership.rb +0 -1
  97. data/app/models/droom/membership.rb +32 -31
  98. data/app/models/droom/organisation.rb +6 -3
  99. data/app/models/droom/permission.rb +19 -0
  100. data/app/models/droom/personal_folder.rb +9 -21
  101. data/app/models/droom/preference.rb +1 -2
  102. data/app/models/droom/scrap.rb +31 -26
  103. data/app/models/droom/service.rb +31 -0
  104. data/app/models/droom/tag.rb +10 -9
  105. data/app/models/droom/tagging.rb +1 -1
  106. data/app/models/droom/user.rb +453 -130
  107. data/app/models/droom/user_permission.rb +8 -0
  108. data/app/models/droom/venue.rb +21 -32
  109. data/app/serializers/droom/user_serializer.rb +45 -0
  110. data/app/serializers/droom/venue_serializer.rb +5 -0
  111. data/app/views/droom/dashboard/_documents.html.haml +1 -1
  112. data/app/views/droom/dashboard/_folders.html.haml +1 -1
  113. data/app/views/droom/dashboard/_future_events.html.haml +10 -8
  114. data/app/views/droom/dashboard/_groups.html.haml +1 -1
  115. data/app/views/droom/dashboard/_past_events.haml +19 -12
  116. data/app/views/droom/dashboard/_stream.html.haml +2 -2
  117. data/app/views/droom/{users/_extra_columns.html.haml → dashboard/_welcome.html.haml} +0 -0
  118. data/app/views/droom/dashboard/index.html.haml +3 -0
  119. data/app/views/droom/documents/_document.html.haml +0 -2
  120. data/app/views/droom/documents/_documents.html.haml +1 -1
  121. data/app/views/droom/documents/_documents_list.html.haml +1 -1
  122. data/app/views/droom/documents/_documents_table.html.haml +1 -1
  123. data/app/views/droom/documents/_form.html.haml +8 -5
  124. data/app/views/droom/documents/_listing.html.haml +4 -2
  125. data/app/views/droom/documents/index.html.haml +13 -7
  126. data/app/views/droom/documents/new.html.haml +1 -4
  127. data/app/views/droom/events/_action_menu.html.haml +2 -2
  128. data/app/views/droom/events/_attachments.html.haml +8 -0
  129. data/app/views/droom/events/_calendar.html.haml +4 -8
  130. data/app/views/droom/events/_event.html.haml +44 -63
  131. data/app/views/droom/events/_event_line.html.haml +1 -1
  132. data/app/views/droom/events/_events.html.haml +18 -2
  133. data/app/views/droom/events/_form.html.haml +26 -19
  134. data/app/views/droom/events/_invitations.html.haml +7 -3
  135. data/app/views/droom/events/_scrap_events.html.haml +8 -0
  136. data/app/views/droom/events/_suggested.html.haml +4 -1
  137. data/app/views/droom/events/calendar.html.haml +8 -0
  138. data/app/views/droom/events/index.html.haml +24 -26
  139. data/app/views/droom/events/show.html.haml +6 -6
  140. data/app/views/droom/folders/_contents.html.haml +34 -4
  141. data/app/views/droom/folders/_folder.html.haml +7 -2
  142. data/app/views/droom/folders/_form.html.haml +11 -8
  143. data/app/views/droom/folders/index.html.haml +19 -22
  144. data/app/views/droom/group_invitations/_attending_groups.html.haml +1 -1
  145. data/app/views/droom/group_permissions/_toggle.html.haml +18 -0
  146. data/app/views/droom/groups/_action_menu.haml +0 -2
  147. data/app/views/droom/groups/_created.html.haml +0 -1
  148. data/app/views/droom/groups/_form.html.haml +3 -0
  149. data/app/views/droom/groups/_group.html.haml +10 -8
  150. data/app/views/droom/groups/_groups.html.haml +1 -1
  151. data/app/views/droom/groups/_search_result.html.haml +1 -1
  152. data/app/views/droom/groups/_suggested.html.haml +1 -1
  153. data/app/views/droom/groups/index.html.haml +15 -16
  154. data/app/views/droom/invitations/_form.html.haml +1 -1
  155. data/app/views/droom/invitations/_invitation.html.haml +1 -1
  156. data/app/views/droom/invitations/_invitations.html.haml +4 -4
  157. data/app/views/droom/memberships/_button.html.haml +5 -5
  158. data/app/views/droom/memberships/_form.html.haml +26 -7
  159. data/app/views/droom/memberships/_member.html.haml +1 -1
  160. data/app/views/droom/memberships/{_membership_toggle.html.haml → _toggle.html.haml} +4 -4
  161. data/app/views/droom/memberships/index.html.haml +9 -0
  162. data/app/views/droom/organisations/_action_menu.html.haml +1 -1
  163. data/app/views/droom/organisations/_organisation.html.haml +2 -2
  164. data/app/views/droom/organisations/_suggested.html.haml +1 -1
  165. data/app/views/droom/organisations/index.html.haml +11 -11
  166. data/app/views/droom/panels/_admin.html.haml +2 -2
  167. data/app/views/droom/panels/_configuration.html.haml +28 -0
  168. data/app/views/droom/panels/_devices.html.haml +2 -4
  169. data/app/views/droom/panels/_search.html.haml +9 -0
  170. data/app/views/droom/permissions/_action_menu.html.haml +10 -0
  171. data/app/views/droom/permissions/_created.html.haml +3 -0
  172. data/app/views/droom/permissions/_form.html.haml +17 -0
  173. data/app/views/droom/permissions/edit.html.haml +7 -0
  174. data/app/views/droom/permissions/new.html.haml +8 -0
  175. data/app/views/droom/permissions/show.html.haml +4 -0
  176. data/app/views/droom/preferences/_checkbox.html.haml +4 -2
  177. data/app/views/droom/scraps/_caption.html.haml +0 -2
  178. data/app/views/droom/scraps/_credit.html.haml +1 -1
  179. data/app/views/droom/scraps/_form.html.haml +68 -69
  180. data/app/views/droom/scraps/_preload.html.haml +4 -0
  181. data/app/views/droom/scraps/_stream.html.haml +11 -3
  182. data/app/views/droom/scraps/_thumb.html.haml +33 -1
  183. data/app/views/droom/scraps/edit.html.haml +6 -1
  184. data/app/views/droom/scraps/full/_document.html.haml +4 -3
  185. data/app/views/droom/scraps/full/_event.html.haml +17 -16
  186. data/app/views/droom/scraps/full/_image.html.haml +1 -2
  187. data/app/views/droom/scraps/full/_link.html.haml +4 -3
  188. data/app/views/droom/scraps/full/_quote.html.haml +4 -7
  189. data/app/views/droom/scraps/full/_text.html.haml +3 -2
  190. data/app/views/droom/scraps/full/_video.html.haml +2 -2
  191. data/app/views/droom/scraps/new.html.haml +6 -1
  192. data/app/views/droom/scraps/show.html.haml +4 -3
  193. data/app/views/droom/services/_action_menu.html.haml +12 -0
  194. data/app/views/droom/services/_created.html.haml +3 -0
  195. data/app/views/droom/services/_form.html.haml +18 -0
  196. data/app/views/droom/services/_services.html.haml +44 -0
  197. data/app/views/droom/services/edit.html.haml +7 -0
  198. data/app/views/droom/services/index.html.haml +5 -0
  199. data/app/views/droom/{people → services}/new.html.haml +4 -3
  200. data/app/views/droom/services/show.html.haml +4 -0
  201. data/app/views/droom/shared/_controls.html.haml +2 -2
  202. data/app/views/droom/shared/_navigation.html.haml +2 -2
  203. data/app/views/droom/shared/_toolbar.html.haml +1 -1
  204. data/app/views/droom/suggestions/index.html.haml +1 -0
  205. data/app/views/droom/users/_action_menu.html.haml +21 -0
  206. data/app/views/droom/users/_suggested.html.haml +14 -0
  207. data/app/views/droom/users/_user.html.haml +2 -2
  208. data/app/views/droom/users/_users.html.haml +7 -0
  209. data/app/views/droom/users/_users_table.html.haml +21 -22
  210. data/app/views/droom/users/admin.html.haml +10 -0
  211. data/app/views/droom/users/confirmations/_after_confirmation.html.haml +2 -0
  212. data/app/views/droom/users/confirmations/_password_required.html.haml +30 -0
  213. data/app/views/droom/users/confirmations/failure.en.html.haml +22 -0
  214. data/app/views/droom/users/confirmations/show.html.haml +13 -0
  215. data/app/views/droom/users/edit.html.haml +2 -10
  216. data/app/views/droom/users/edit/_details.html.haml +13 -0
  217. data/app/views/droom/users/edit/_memberships.html.haml +13 -0
  218. data/app/views/droom/users/edit/_password_fields.html.haml +16 -0
  219. data/app/views/droom/users/edit/_preferences.html.haml +37 -0
  220. data/app/views/droom/users/edit/_profile.html.haml +26 -0
  221. data/app/views/droom/users/edit/_user_fields.html.haml +66 -0
  222. data/app/views/droom/users/index.html.haml +6 -32
  223. data/app/views/droom/users/new.html.haml +3 -0
  224. data/app/views/droom/users/passwords/completed.html.haml +13 -0
  225. data/app/views/{devise → droom/users}/passwords/edit.html.haml +10 -4
  226. data/app/views/{devise → droom/users}/passwords/new.html.haml +4 -3
  227. data/app/views/droom/users/passwords/show.html.haml +6 -0
  228. data/app/views/droom/users/show.html.haml +2 -0
  229. data/app/views/droom/users/show/_listed.html.haml +46 -0
  230. data/app/views/droom/users/show/_profile.html.haml +33 -0
  231. data/app/views/droom/users/show/_tabled.html.haml +28 -0
  232. data/config/initializers/chronic.rb +2 -0
  233. data/config/initializers/devise.rb +35 -2
  234. data/config/initializers/paperclip.rb +11 -6
  235. data/config/locales/devise.en.yml +1 -1
  236. data/config/locales/en.yml +198 -103
  237. data/config/routes.rb +37 -45
  238. data/db/migrate/20130207123614_stream.rb +5 -1
  239. data/db/migrate/20130225095328_create_droom_calendars.rb +0 -1
  240. data/db/migrate/20130627065459_permissions.rb +34 -0
  241. data/db/migrate/20130627071938_users_take_over.rb +38 -0
  242. data/db/migrate/20130627073759_user_properties.rb +34 -0
  243. data/db/migrate/20130627080021_no_more_people.rb +11 -0
  244. data/db/migrate/20130701122935_directory_groups.rb +8 -0
  245. data/db/migrate/20130701123152_remove_old_access_control.rb +16 -0
  246. data/db/migrate/20130729102857_more_scrap_data.rb +12 -0
  247. data/db/migrate/20130904080340_international_names.rb +17 -0
  248. data/db/migrate/20130904080341_honours.rb +5 -0
  249. data/db/migrate/20131124082222_simple_addresses.rb +25 -0
  250. data/db/migrate/20131201093351_event_time_zone.rb +5 -0
  251. data/db/migrate/20131217060311_session_revocable.rb +5 -0
  252. data/db/migrate/20131219180311_event_types.rb +15 -0
  253. data/lib/devise/strategies/cookie_authenticatable.rb +46 -0
  254. data/lib/droom.rb +48 -33
  255. data/lib/droom/auth_cookie.rb +82 -0
  256. data/lib/droom/cropper.rb +24 -0
  257. data/lib/droom/engine.rb +20 -2
  258. data/lib/droom/folders.rb +6 -6
  259. data/lib/droom/lazy_hash.rb +11 -1
  260. data/lib/droom/monkeys.rb +6 -6
  261. data/lib/droom/taggability.rb +1 -1
  262. data/lib/droom/validators.rb +1 -1
  263. data/lib/droom/version.rb +1 -1
  264. data/lib/generators/droom/install/templates/droom_initializer.rb +10 -2
  265. data/lib/paperclip/geometry_transformation.rb +80 -0
  266. data/lib/paperclip/validators/attachment_height_validator.rb +89 -0
  267. data/lib/paperclip/validators/attachment_width_validator.rb +89 -0
  268. data/lib/paperclip_processors/offset_thumbnail.rb +85 -0
  269. data/spec/dummy/config/application.rb +0 -7
  270. data/spec/dummy/config/environments/development.rb +1 -10
  271. data/spec/dummy/config/environments/production.rb +1 -0
  272. data/spec/dummy/config/environments/test.rb +2 -7
  273. data/spec/dummy/db/migrate/20130130120631_folder_ancestry_to_parents.droom.rb +1 -1
  274. data/spec/dummy/db/migrate/20130724124758_dropbox_tokens.droom.rb +10 -0
  275. data/spec/dummy/db/migrate/20130724124759_preference_uuids.droom.rb +6 -0
  276. data/spec/dummy/db/migrate/20130724124760_stream.droom.rb +14 -0
  277. data/spec/dummy/db/migrate/20130724124761_access_token_secret.droom.rb +6 -0
  278. data/spec/dummy/db/migrate/20130724124762_person_image.droom.rb +10 -0
  279. data/spec/dummy/db/migrate/20130724124763_devise_confirmable.droom.rb +14 -0
  280. data/spec/dummy/db/migrate/20130724124764_create_droom_calendars.droom.rb +20 -0
  281. data/spec/dummy/db/migrate/20130724124765_give_scraps_document.droom.rb +6 -0
  282. data/spec/dummy/db/migrate/20130724124766_privateness.droom.rb +10 -0
  283. data/spec/dummy/db/migrate/20130724124767_store_metadata.droom.rb +6 -0
  284. data/spec/dummy/db/migrate/20130724124768_folders_nicely.droom.rb +7 -0
  285. data/spec/dummy/db/migrate/20130724124769_niceties.droom.rb +8 -0
  286. data/spec/dummy/db/migrate/20130724124770_create_droom_dropbox_documents.droom.rb +12 -0
  287. data/spec/dummy/db/migrate/20130724124771_dropbox_documents_changed.droom.rb +6 -0
  288. data/spec/dummy/db/migrate/20130724124772_user_titles.droom.rb +6 -0
  289. data/spec/dummy/db/migrate/20130724124773_permissions.droom.rb +35 -0
  290. data/spec/dummy/db/migrate/20130724124774_users_take_over.droom.rb +39 -0
  291. data/spec/dummy/db/migrate/20130724124775_user_properties.droom.rb +35 -0
  292. data/spec/dummy/db/migrate/20130724124776_no_more_people.droom.rb +12 -0
  293. data/spec/dummy/db/migrate/20130724124777_directory_groups.droom.rb +9 -0
  294. data/spec/dummy/db/migrate/20130724124778_remove_old_access_control.droom.rb +17 -0
  295. data/spec/dummy/db/schema.rb +217 -140
  296. data/spec/factories/documents.rb +0 -5
  297. data/spec/factories/events.rb +0 -9
  298. data/spec/factories/user.rb +4 -2
  299. data/spec/lib/droom/folders_spec.rb +8 -8
  300. data/spec/models/droom/document_spec.rb +6 -43
  301. data/spec/models/droom/event_spec.rb +0 -34
  302. data/spec/models/droom/mailing_list_membership_spec.rb +4 -4
  303. data/spec/models/droom/membership_spec.rb +2 -2
  304. data/spec/spec_helper.rb +1 -10
  305. metadata +322 -282
  306. data/app/assets/images/droom/Untitled-1.png +0 -0
  307. data/app/assets/images/droom/asterisk.png +0 -0
  308. data/app/assets/images/droom/smallmanage.png +0 -0
  309. data/app/assets/javascripts/droom/lib/kalendae.js +0 -1692
  310. data/app/assets/stylesheets/lib/_kalendae.css.sass +0 -139
  311. data/app/controllers/droom/pages_controller.rb +0 -61
  312. data/app/controllers/droom/people_controller.rb +0 -111
  313. data/app/models/droom/document_attachment.rb +0 -37
  314. data/app/models/droom/page.rb +0 -26
  315. data/app/models/droom/person.rb +0 -309
  316. data/app/models/droom/recurrence_rule.rb +0 -82
  317. data/app/models/droom/user_action_observer.rb +0 -12
  318. data/app/views/devise/confirmations/failure.en.html.haml +0 -20
  319. data/app/views/devise/confirmations/show.html.haml +0 -19
  320. data/app/views/droom/confirmations/show.html.haml +0 -40
  321. data/app/views/droom/documents/_document_line.html.haml +0 -2
  322. data/app/views/droom/events/_created.html.haml +0 -2
  323. data/app/views/droom/folders/_attachments.html.haml +0 -3
  324. data/app/views/droom/pages/_contents.html.haml +0 -10
  325. data/app/views/droom/pages/_form.html.haml +0 -36
  326. data/app/views/droom/pages/_full_page.html.haml +0 -17
  327. data/app/views/droom/pages/_page.html.haml +0 -5
  328. data/app/views/droom/pages/_pages.html.haml +0 -2
  329. data/app/views/droom/pages/admin.html.haml +0 -24
  330. data/app/views/droom/pages/edit.html.haml +0 -1
  331. data/app/views/droom/pages/index.html.haml +0 -10
  332. data/app/views/droom/pages/new.html.haml +0 -4
  333. data/app/views/droom/pages/show.html.haml +0 -5
  334. data/app/views/droom/panels/_account.html.haml +0 -16
  335. data/app/views/droom/panels/_readers.html.haml +0 -18
  336. data/app/views/droom/panels/_suggestions.html.haml +0 -15
  337. data/app/views/droom/people/_action_menu.html.haml +0 -22
  338. data/app/views/droom/people/_created.html.haml +0 -6
  339. data/app/views/droom/people/_form.html.haml +0 -66
  340. data/app/views/droom/people/_listing.html.haml +0 -19
  341. data/app/views/droom/people/_memberships.html.haml +0 -24
  342. data/app/views/droom/people/_people.html.haml +0 -5
  343. data/app/views/droom/people/_person.html.haml +0 -32
  344. data/app/views/droom/people/_search_result.html.haml +0 -14
  345. data/app/views/droom/people/_suggested.html.haml +0 -14
  346. data/app/views/droom/people/edit.html.haml +0 -9
  347. data/app/views/droom/people/index.html.haml +0 -8
  348. data/app/views/droom/people/show.html.haml +0 -31
  349. data/app/views/droom/scraps/_heading.html.haml +0 -16
  350. data/app/views/droom/scraps/thumbs/_document.html.haml +0 -9
  351. data/app/views/droom/scraps/thumbs/_event.html.haml +0 -17
  352. data/app/views/droom/scraps/thumbs/_image.html.haml +0 -6
  353. data/app/views/droom/scraps/thumbs/_link.html.haml +0 -10
  354. data/app/views/droom/scraps/thumbs/_quote.html.haml +0 -8
  355. data/app/views/droom/scraps/thumbs/_text.html.haml +0 -8
  356. data/app/views/droom/scraps/thumbs/_video.html.haml +0 -6
  357. data/app/views/droom/users/_extra_columns_header.html.haml +0 -0
  358. data/app/views/droom/users/_extra_columns_note.html.haml +0 -0
  359. data/app/views/droom/users/_form.html.haml +0 -14
  360. data/app/views/droom/users/_password_fields.html.haml +0 -15
  361. data/app/views/droom/users/_user_or_person.html.haml +0 -72
  362. data/app/views/kaminari/_paginator.html.haml +0 -16
  363. data/lib/droom/dav_resource.rb +0 -36
  364. data/lib/droom/model_helpers.rb +0 -25
  365. data/lib/droom/routing.rb +0 -13
  366. data/spec/datasets/calendar_events_dataset.rb +0 -44
  367. data/spec/datasets/calendar_pages_dataset.rb +0 -8
  368. data/spec/datasets/calendar_sites_dataset.rb +0 -6
  369. data/spec/datasets/calendars_dataset.rb +0 -34
  370. data/spec/datasets/documents_dataset.rb +0 -28
  371. data/spec/datasets/recurrence_dataset.rb +0 -7
  372. data/spec/dummy/config/sunspot.yml +0 -17
  373. data/spec/dummy/log/dav.log +0 -1
  374. data/spec/dummy/log/development.log +0 -2
  375. data/spec/dummy/log/test.log +0 -1
  376. data/spec/dummy/solr/conf/admin-extra.html +0 -31
  377. data/spec/dummy/solr/conf/elevate.xml +0 -36
  378. data/spec/dummy/solr/conf/mapping-ISOLatin1Accent.txt +0 -246
  379. data/spec/dummy/solr/conf/protwords.txt +0 -21
  380. data/spec/dummy/solr/conf/schema.xml +0 -238
  381. data/spec/dummy/solr/conf/scripts.conf +0 -24
  382. data/spec/dummy/solr/conf/solrconfig.xml +0 -934
  383. data/spec/dummy/solr/conf/spellings.txt +0 -2
  384. data/spec/dummy/solr/conf/stopwords.txt +0 -58
  385. data/spec/dummy/solr/conf/synonyms.txt +0 -31
  386. data/spec/dummy/solr/data/development/index/segments.gen +0 -0
  387. data/spec/dummy/solr/data/development/index/segments_1 +0 -0
  388. data/spec/dummy/solr/data/development/spellchecker/segments.gen +0 -0
  389. data/spec/dummy/solr/data/development/spellchecker/segments_1 +0 -0
  390. data/spec/dummy/solr/data/test/index/segments.gen +0 -0
  391. data/spec/dummy/solr/data/test/index/segments_3nu +0 -0
  392. data/spec/dummy/solr/data/test/spellchecker/segments.gen +0 -0
  393. data/spec/dummy/solr/data/test/spellchecker/segments_1 +0 -0
  394. data/spec/factories/recurrence_rules.rb +0 -25
  395. data/spec/models/droom/person_spec.rb +0 -72
  396. data/spec/models/droom/recurrence_rule_spec.rb +0 -81
@@ -2,32 +2,20 @@ module Droom
2
2
  class DocumentsController < Droom::EngineController
3
3
  respond_to :html, :js, :json
4
4
  layout :no_layout_if_pjax
5
-
6
- before_filter :authenticate_user!
7
- # before_filter :require_admin!, :except => [:index, :show]
8
- before_filter :get_folder
9
- before_filter :find_documents, :only => [:index]
10
- before_filter :get_document, :only => [:show, :edit, :update, :destroy]
11
- before_filter :build_document, :only => [:new, :create]
5
+
6
+ before_filter :get_folder, :except => [:index]
7
+ load_and_authorize_resource :document, :class => Droom::Document, :through => :folder, :shallow => true
12
8
 
13
9
  def index
10
+ @documents = @documents.matching(params[:q]) unless params[:q].blank?
11
+ @documents = paginated(@documents)
14
12
  respond_with @documents do |format|
15
13
  format.js { render :partial => 'droom/documents/documents' }
16
14
  end
17
15
  end
18
-
16
+
19
17
  def show
20
18
  if @document.file
21
- # master documents are stored in private S3 buckets
22
- # To keep the documents secure, we:
23
- # * publish them only through this controller (so no S3 links appear on the page)
24
- # * deliver them only to authenticated users
25
- # * delivery by redirecting to a URL that expires in ten minutes
26
- #
27
- # We could channel all file delivery through this controller and may do so in future but it
28
- # creates a nasty performance bottleneck. For now the redirect approach seems more robust
29
- # and the expiring URLs sufficiently obscure.
30
- #
31
19
  redirect_to @document.file.expiring_url(Time.now + 600)
32
20
  else
33
21
  raise ActiveRecord::RecordNotFound
@@ -39,7 +27,6 @@ module Droom
39
27
  end
40
28
 
41
29
  def create
42
- @document.update_attributes(params[:document])
43
30
  @document.save!
44
31
  render :partial => 'created'
45
32
  end
@@ -49,7 +36,6 @@ module Droom
49
36
  end
50
37
 
51
38
  def update
52
- @document.update_attributes(params[:document])
53
39
  @document.save!
54
40
  render :partial => 'listing', :object => @document.with_event
55
41
  end
@@ -58,50 +44,16 @@ module Droom
58
44
  @document.destroy
59
45
  head :ok
60
46
  end
47
+
48
+ protected
61
49
 
50
+ def document_params
51
+ params.require(:document).permit(:name, :file, :description, :folder_id)
52
+ end
62
53
 
63
- protected
64
54
  def get_folder
65
- @folder = Droom::Folder.find_by_id(params[:folder_id])
55
+ @folder = Droom::Folder.find(params[:folder_id])
66
56
  end
67
57
 
68
- def build_document
69
- @document = @folder.documents.build(params[:document])
70
- end
71
-
72
- def get_document
73
- @document = @folder.documents.find(params[:id])
74
- end
75
-
76
- def find_documents
77
- sort_orders = {
78
- 'asc' => "ASC",
79
- 'desc' => "DESC"
80
- }
81
- @order = sort_orders[params[:order]] || "DESC"
82
-
83
- sort_parameters = {
84
- 'name' => "droom_documents.name #{@order}",
85
- 'filename' => "droom_documents.file_file_name #{@order}",
86
- 'filesize' => "droom_documents.file_file_size #{@order}",
87
- 'created' => "droom_documents.created_at #{@order}",
88
- 'event' => "event_name #{@order}",
89
- 'category' => "case when category_name is null then 1 else 0 end #{@order}, category_name #{@order}"
90
- }
91
- params[:sort] = 'created' unless sort_parameters[params[:sort]]
92
- @sort = params[:sort]
93
- @show = params[:show] || 10
94
- @page = params[:page] || 1
95
-
96
- if current_user.admin?
97
- @documents = Droom::Document.scoped({})
98
- else
99
- @documents = Droom::Document.visible_to(@current_person)
100
- end
101
-
102
- @documents = @documents.matching(params[:q]) unless params[:q].blank?
103
- @documents = @documents.order(sort_parameters[@sort]).page(@page).per(@show)
104
- end
105
-
106
58
  end
107
59
  end
@@ -1,4 +1,5 @@
1
- # This is a RESTful dropbox authentication controller. The access_token is treated as a resource.
1
+ # This is a more or less RESTful dropbox authentication controller.
2
+ # The access_token is treated as a resource.
2
3
  # Later it might be generalised to handle other oauth tokens.
3
4
 
4
5
  require 'dropbox_sdk'
@@ -7,10 +8,9 @@ module Droom
7
8
  class DropboxTokensController < Droom::EngineController
8
9
  respond_to :html, :js, :json
9
10
  layout :no_layout_if_pjax
10
- before_filter :authenticate_user!
11
-
12
11
  before_filter :get_token, :only => [:show, :destroy]
13
12
  skip_before_filter :verify_authenticity_token, :only => :create
13
+ skip_authorization_check
14
14
 
15
15
  def new
16
16
  dbsession = DropboxSession.new(Droom.dropbox_app_key, Droom.dropbox_app_secret)
@@ -22,7 +22,6 @@ module Droom
22
22
  if params[:oauth_token]
23
23
  dbsession = DropboxSession.deserialize(session[:dropbox_session])
24
24
  response = dbsession.get_access_token
25
- Rails.logger.warn ">>> get_access_token: #{response.inspect}"
26
25
  @dropbox_token = current_user.dropbox_tokens.create(:access_token => response.key, :access_token_secret => response.secret)
27
26
  session[:dropbox_session] = dbsession.serialize
28
27
  flash[:panel] = 'dropbox'
@@ -2,31 +2,59 @@ require 'dropbox_sdk'
2
2
 
3
3
  module Droom
4
4
  class EngineController < ::ApplicationController
5
+ helper Droom::DroomHelper
5
6
 
6
- before_filter :authenticate_user!
7
- before_filter :note_current_user
7
+ rescue_from "CanCan::AccessDenied", :with => :not_allowed
8
8
 
9
- protected
10
-
11
- def require_admin!
12
- raise Droom::PermissionDenied unless current_user && current_user.admin?
9
+ def current_ability
10
+ @current_ability ||= Droom::Ability.new(current_user)
13
11
  end
14
12
 
15
- def current_person
16
- current_user.person if user_signed_in?
13
+ protected
14
+
15
+ def paginated(collection, default_show=10, default_page=1)
16
+ @show = (params[:show] || default_show).to_i
17
+ @page = (params[:page] || default_page).to_i
18
+ collection.page(@page).per(@show)
17
19
  end
18
20
 
21
+ def not_allowed(exception)
22
+ respond_to do |format|
23
+ format.html { render :file => "#{Rails.root}/public/403.html", :status => 403, :layout => false }
24
+ format.js { head :forbidden }
25
+ format.json { head :forbidden }
26
+ end
27
+ end
28
+
19
29
  def no_layout_if_pjax
20
- if request.headers['X-PJAX'] || request.format == 'js'
30
+ if pjax?
21
31
  false
22
32
  else
23
33
  Droom.layout
24
34
  end
25
35
  end
26
36
 
27
- def note_current_user
28
- Droom::User.current = current_user
37
+ def pjax?
38
+ request.headers['X-PJAX']
29
39
  end
30
40
 
41
+ def set_access_control_headers
42
+ headers['Access-Control-Allow-Origin'] = '*'
43
+ headers["Access-Control-Allow-Headers"] = %w{Origin Accept Content-Type X-Requested-With X-CSRF-Token}.join(",")
44
+ headers["Access-Control-Allow-Methods"] = %{GET PATCH POST}
45
+ end
46
+
47
+ def set_pagination_headers
48
+ if results = instance_variable_get("@#{name_from_controller}")
49
+ if results.respond_to? :total_count
50
+ headers["X-Pagination"] = {
51
+ limit: results.limit_value,
52
+ offset: results.offset_value,
53
+ total_count: results.total_count
54
+ }.to_json
55
+ end
56
+ end
57
+ end
58
+
31
59
  end
32
60
  end
@@ -1,65 +1,49 @@
1
+ require 'tod'
2
+
1
3
  module Droom
2
4
  class EventsController < Droom::EngineController
3
5
  require "uri"
4
- require "ri_cal"
5
- respond_to :html, :json, :rss, :ics, :js, :zip
6
+ require "icalendar"
7
+ respond_to :html, :json, :ics, :js
6
8
  layout :no_layout_if_pjax
7
-
8
- before_filter :authenticate_user!
9
- before_filter :require_admin!, :except => [:index, :show]
10
- before_filter :numerical_parameters
11
- before_filter :get_event, :only => [:show, :edit, :update, :destroy]
12
- before_filter :find_or_create_calendar, :only => :new
13
- before_filter :build_event, :only => [:new, :create]
14
- before_filter :get_calendar, :only => [:index, :calendar]
15
- before_filter :find_events, :only => [:index, :calendar]
9
+
10
+ before_filter :get_events, :only => [:index]
11
+ before_filter :composite_dates, :only => [:update, :create]
12
+ before_filter :build_event, :only => [:create]
13
+ load_and_authorize_resource
16
14
 
17
15
  def index
18
16
  respond_with @events do |format|
19
- format.js {
20
- render :partial => 'droom/events/events'
21
- }
17
+ format.js { render :partial => 'droom/events/events' }
22
18
  end
23
19
  end
24
20
 
25
21
  def calendar
26
- respond_with @events do |format|
27
- format.js {
28
- render :partial => 'droom/events/calendar'
29
- }
30
- end
22
+ respond_with @events
31
23
  end
32
24
 
33
25
  def show
34
26
  respond_with @event do |format|
35
- format.js {
36
- render :partial => 'droom/events/event'
37
- }
38
- format.zip {
39
- send_file @event.documents_zipped.path, :type => 'application/zip', :disposition => 'attachment', :filename => "#{@event.slug}.zip"
40
- }
27
+ format.js { render :partial => 'droom/events/event' }
28
+ format.zip { send_file @event.documents_zipped.path, :type => 'application/zip', :disposition => 'attachment', :filename => "#{@event.slug}.zip" }
41
29
  end
42
30
  end
43
31
 
44
32
  def new
33
+ @event.start = Time.zone.now.change(hour: 10)
45
34
  respond_with @event
46
35
  end
47
36
 
48
37
  def create
49
38
  if @event.save
50
- render :partial => "created"
39
+ render :partial => "event"
51
40
  else
52
41
  respond_with @event
53
42
  end
54
43
  end
55
44
 
56
- def edit
57
-
58
- end
59
-
60
45
  def update
61
- @event.update_attributes(params[:event])
62
- if @event.save
46
+ if @event.update_attributes(event_params)
63
47
  render :partial => "event"
64
48
  else
65
49
  respond_with @event
@@ -72,64 +56,58 @@ module Droom
72
56
  end
73
57
 
74
58
  protected
75
-
76
- def build_event
77
- params[:event] ||= {}
78
- params[:event][:calendar_id] ||= @calendar.id if @calendar
79
- @event = Droom::Event.new({:start => Time.now.floor(30.minutes)}.merge(params[:event]))
80
- end
81
-
82
- def get_event
83
- @event = Droom::Event.find(params[:id])
84
- end
85
-
86
- def find_events
87
- if params[:direction] == 'past'
88
- @events = @calendar.events.past.order('start DESC')
89
- @direction = "past"
90
- else
91
- @events = @calendar.events.future_and_current.order('start ASC')
92
- @direction = "future"
59
+
60
+ def get_events
61
+ events = Droom::Event.accessible_by(current_ability)
62
+ if Droom.separate_calendars?
63
+ events = events.in_calendar(Droom::Calendar.default_calendar)
93
64
  end
94
- unless current_user.admin?
95
- if current_person
96
- @events = @events.visible_to(current_person)
97
- else
98
- @events = @events.all_public
99
- end
65
+ if params[:year].present?
66
+ @year = params[:year].to_i
67
+ @events = paginated(events.in_year(@year).order('start ASC'))
68
+ elsif params[:direction] == 'past'
69
+ @direction = 'past'
70
+ @events = paginated(events.past.order('start DESC'))
71
+ else
72
+ @direction = 'future'
73
+ @events = paginated(events.future_and_current.order('start ASC'))
100
74
  end
101
-
102
- @show = params[:show] || 10
103
- @page = params[:page] || 1
104
- @events = @events.page(@page).per(@show)
105
- end
106
-
107
- def get_calendar
108
- @calendar = Droom::Calendar.find_by_id(params[:calendar_id]) || find_or_create_calendar
109
- end
110
-
111
- def find_or_create_calendar
112
- name = if Droom.required_calendar_names.include?(params[:calendar]) then params[:calendar] else "main" end
113
- @calendar = Droom::Calendar.find_or_create_by_name(name)
114
75
  end
115
-
116
- # months can be passed around either as names or numbers
117
- # any date part can be 'now' or 'next' for ease of linking
118
- # and everything is converted to_i to save clutter later
119
- def month_names
120
- ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
76
+
77
+ def build_event
78
+ @event = Droom::Event.new(event_params)
79
+ @event.created_by = current_user
121
80
  end
122
-
123
- def numerical_parameters
124
- if params[:month] && month_names.include?(params[:month].titlecase)
125
- params[:month] = month_names.index(params[:month].titlecase)
126
- end
127
- [:year, :month, :mday].select{|p| params[p] }.each do |p|
128
- params[p] = Date.today.send(p) if params[p] == 'now'
129
- params[p] = (Date.today + 1.send(p == :mday ? :day : p)).send(p) if params[p] == 'next'
130
- params[p] = params[p].to_i
81
+
82
+ # NB. the stored timezone parameter is just an interface convenience: we use it to check boxes in the form.
83
+ # The event start and finish dates are stored as datetimes with zones.
84
+ #
85
+ def composite_dates
86
+ if params[:event]
87
+ if params[:event][:start_date].present?
88
+ # We adjust the given datetimes so that they are considered to happen in the given zone, if there is one.
89
+ # If none is given, everything happen within the configured time zone for the application.
90
+ date = Time.zone.parse(params[:event][:start_date])
91
+ timezone = ActiveSupport::TimeZone.new(params[:event][:timezone]) if params[:event][:timezone].present?
92
+ timezone ||= Time.zone
93
+
94
+ # This is done without changing the apparent time: it is already correct with the given zone and no translation is required.
95
+ date = date.change(offset: timezone) if timezone
96
+ if params[:event][:start_time].present?
97
+ start_time = TimeOfDay.parse(params[:event][:start_time])
98
+ params[:event][:start] = start_time.on(date, timezone)
99
+ end
100
+ if params[:event][:finish_time].present?
101
+ finish_time = TimeOfDay.parse(params[:event][:finish_time])
102
+ params[:event][:finish] = finish_time.on(date, timezone)
103
+ end
104
+ end
131
105
  end
132
106
  end
107
+
108
+ def event_params
109
+ params.require(:event).permit(:name, :description, :event_set_id, :event_type_id, :calendar_id, :all_day, :master_id, :url, :start, :finish, :timezone, :venue_id, :venue_name)
110
+ end
133
111
 
134
112
  end
135
113
  end
@@ -1,14 +1,14 @@
1
1
  module Droom
2
2
  class FoldersController < Droom::EngineController
3
- respond_to :html, :json, :js, :zip
3
+ respond_to :html, :json, :js
4
4
  layout :no_layout_if_pjax
5
5
 
6
- before_filter :authenticate_user!
7
- before_filter :find_folders, :only => [:index]
8
- before_filter :get_folder, :only => [:show, :edit, :update, :destroy, :dropbox]
9
- before_filter :build_folder, :only => [:new, :create]
6
+ before_filter :get_root_folders, :only => [:index]
7
+ before_filter :get_parent_folder, :only => [:new, :create]
8
+ load_and_authorize_resource
10
9
 
11
10
  def index
11
+ @folders = @folders.populated unless current_user.admin?
12
12
  respond_with @folders do |format|
13
13
  format.js {
14
14
  render :partial => 'droom/folders/folders'
@@ -21,9 +21,6 @@ module Droom
21
21
  format.js {
22
22
  render :partial => 'droom/folders/folder'
23
23
  }
24
- format.zip {
25
- send_file @folder.documents_zipped.path, :type => 'application/zip', :disposition => 'attachment', :filename => "#{@folder.slug}.zip"
26
- }
27
24
  end
28
25
  end
29
26
 
@@ -32,7 +29,7 @@ module Droom
32
29
  end
33
30
 
34
31
  def create
35
- @folder.update_attributes(params[:folder])
32
+ @folder.update_attributes(folder_params)
36
33
  respond_with @folder do |format|
37
34
  format.js { render :partial => "droom/folders/folder" }
38
35
  end
@@ -43,7 +40,11 @@ module Droom
43
40
  end
44
41
 
45
42
  def update
46
- @folder.update_attributes(params[:folder])
43
+ if @folder.update_attributes(folder_params)
44
+ Rails.logger.warn "√√ folder updated: #{@folder.inspect}"
45
+ else
46
+ Rails.logger.warn "xx folder save problems: #{@folder.errors.to_a.inspect}"
47
+ end
47
48
  respond_with @folder do |format|
48
49
  format.js { render :partial => "droom/folders/folder" }
49
50
  end
@@ -59,48 +60,37 @@ module Droom
59
60
  render :partial => "folder"
60
61
  end
61
62
 
62
- def dav
63
- @folder.copy_to_dav
64
- respond_with @folder
65
- end
66
-
67
63
  def with_parent
68
64
 
69
65
  end
70
66
 
71
67
  protected
72
-
73
- def build_folder
74
- if @parent = Droom::Folder.find_by_id(params[:folder_id])
75
- @folder = @parent.children.build(params[:folder])
76
- else
77
- @folder = Droom::Folder.new(params[:folder])
78
- end
68
+
69
+ def folder_params
70
+ params.require(:folder).permit(:name, :slug, :parent_id)
79
71
  end
80
-
81
- def get_folder
82
- @folder = Droom::Folder.find(params[:id])
72
+
73
+ def get_root_folders
74
+ @folders = Droom::Folder.roots
83
75
  end
84
-
85
- def find_folders
86
- if current_user.admin?
87
- @folders = Droom::Folder.roots
76
+
77
+ def get_parent_folder
78
+ if @parent = Droom::Folder.find_by(id: params[:folder_id])
79
+ @folder = @parent.children.build
88
80
  else
89
- @folders = Droom::Folder.visible_to(current_user.person).roots.populated
81
+ @folder = Droom::Folder.new
90
82
  end
91
83
  end
92
-
84
+
93
85
  def get_folder_tree
94
- @folders = current_user.admin? ? Droom::Folder.all : Droom::Folder.visible_to(current_user.person).populated
95
- @roots = []
96
- @children = @folders.each_with_object({}) do |folder, hash|
97
- parent = folder.parent_id || 'root'
98
- hash[parent] ||= []
99
- hash[parent] << folder
86
+ @child_map = Droom::Folder.non_roots.each_with_object({}) do |f, children|
87
+ children[f.parent_id] ||= []
88
+ children[f.parent_id].push(f)
89
+ end
90
+ @document_map = Droom::Document.all.each_with_object({}) do |d, contents|
91
+ contents[d.folder_id] ||= []
92
+ contents[d.folder_id].push(d)
100
93
  end
101
- @roots = @children['root']
102
94
  end
103
-
104
-
105
95
  end
106
96
  end