droom 0.4.3 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
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