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
@@ -0,0 +1,82 @@
1
+ require 'signed_json'
2
+ require "active_support/core_ext/hash/slice"
3
+
4
+ module Droom
5
+ class AuthCookie
6
+
7
+ def initialize(cookies)
8
+ @cookies = cookies
9
+ end
10
+
11
+ # Sets the cookie, referencing the given resource.id (e.g. User)
12
+ def set(resource, opts={})
13
+ cookie_values = cookie_options.merge(opts).merge(:value => set_auth_values(resource))
14
+ @cookies[cookie_name] = cookie_values
15
+ end
16
+
17
+ # Unsets the cookie via the HTTP response.
18
+ def unset
19
+ @cookies.delete cookie_name, cookie_options
20
+ end
21
+
22
+ def token
23
+ values[0]
24
+ end
25
+
26
+ # The Time at which the cookie was created.
27
+ def created_at
28
+ valid? ? DateTime.parse(values[1]) : nil
29
+ end
30
+
31
+ # Whether the cookie appears valid.
32
+ def valid?
33
+ present? && values.all?
34
+ end
35
+
36
+ def present?
37
+ @cookies[cookie_name].present?
38
+ end
39
+
40
+ # Whether the cookie was set since the given Time
41
+ def set_since?(time)
42
+ created_at && created_at >= time
43
+ end
44
+
45
+ def store?
46
+ false
47
+ end
48
+
49
+ private
50
+
51
+ # cookie value format is [uid, auth_token, time]
52
+ #
53
+ def values
54
+ begin
55
+ @values = signer.decode(@cookies[cookie_name])
56
+ rescue SignedJson::Error
57
+ [nil, nil]
58
+ end
59
+ end
60
+
61
+ def cookie_name
62
+ Settings.auth.cookie_name
63
+ end
64
+
65
+ # Note that this is destructive to all previous authentication tokens even if the cookie is not eventually set.
66
+ def set_auth_values(resource)
67
+ signer.encode [ resource.reset_authentication_token!, Time.now ]
68
+ end
69
+
70
+ def cookie_options
71
+ @session_options ||= Rails.configuration.session_options
72
+ @session_options[:domain] = Settings.auth.cookie_domain
73
+ @session_options.slice(:path, :domain, :secure, :httponly)
74
+ end
75
+
76
+ def signer
77
+ secret = Settings.auth.secret
78
+ @signer ||= SignedJson::Signer.new(secret)
79
+ end
80
+
81
+ end
82
+ end
@@ -0,0 +1,24 @@
1
+ require "paperclip"
2
+ require "paperclip/validators/attachment_height_validator"
3
+ require "paperclip/validators/attachment_width_validator"
4
+ require "paperclip/geometry_transformation"
5
+ require "paperclip_processors/offset_thumbnail"
6
+
7
+ # For inclusion into any model class with a croppable image. Turns crop values into Imagemagick `convert` paramaters.
8
+ #
9
+ module Paperclip::Croppable
10
+ # Offset+crop geometry is taken from model attributes at runtime
11
+ # and scaled up by the resolution_multiplier to produce the larger images required by high resolution screens on mobile devices.
12
+ #
13
+ def scale_geometry
14
+ "#{image_scale_width}x"
15
+ end
16
+
17
+ def crop_geometry
18
+ p ">>> crop_geometry: self is #{self.inspect}"
19
+ properties = [image_scale_width, image_scale_height, image_offset_left, image_offset_top]
20
+ p ">>> crop_geometry: #{properties.inspect}"
21
+ "%dx%d%+-d%+-d" % properties
22
+ end
23
+
24
+ end
@@ -1,15 +1,33 @@
1
- require 'msg'
1
+ require 'rubygems'
2
+ require 'paperclip'
3
+ require 'fog'
4
+ require 'devise'
5
+ require 'devise-encryptable' #TODO only until passwords have migrated to bcrypt
6
+ require 'cancan'
7
+ require 'kaminari'
8
+ require 'icalendar'
9
+ require 'haml'
2
10
 
3
11
  module Droom
4
12
  class Engine < ::Rails::Engine
5
13
  isolate_namespace Droom
14
+
6
15
  initializer "droom.integration" do
7
- ActiveRecord::Base.send :include, Droom::ModelHelpers
16
+ Devise.parent_controller = "Droom::EngineController"
8
17
  ActiveRecord::Base.send :include, Droom::Taggability
9
18
  ActiveRecord::Base.send :include, Droom::Folders
10
19
  ActiveSupport.on_load :action_controller do
11
20
  helper Droom::DroomHelper
12
21
  end
13
22
  end
23
+
24
+ config.to_prepare do
25
+ Devise::SessionsController.layout Droom.devise_layout
26
+ Devise::RegistrationsController.layout Droom.devise_layout
27
+ Devise::ConfirmationsController.layout Droom.devise_layout
28
+ Devise::UnlocksController.layout Droom.devise_layout
29
+ Devise::PasswordsController.layout Droom.devise_layout
30
+ end
31
+
14
32
  end
15
33
  end
@@ -74,17 +74,17 @@ module Droom
74
74
  Droom::Document.in_folders(folder.family)
75
75
  end
76
76
 
77
- #
78
77
  # Here we refer to the class variable defined during `has_folder` configuration. If it exists, we will put our folder
79
78
  # inside that of the named associate. The containing folder might be created as a side effect.
79
+ # if it looks like an association name, we ask the associate for a folder. Otherwise we'll just use it as a name.
80
80
  #
81
81
  def get_parent_folder
82
- pfh = self.class.class_variable_get(:"@@parent_folder_holder")
83
- if pfh && holder = send(pfh.to_sym)
84
- holder.folder
82
+ parent_folder_option = self.class.class_variable_get(:"@@parent_folder_holder")
83
+ if parent_folder_option && respond_to?(parent_folder_option.to_sym) && folder_holder = send(parent_folder_option.to_sym)
84
+ folder_holder.folder
85
85
  else
86
- # otherwise we want a root folder like /Events
87
- Droom::Folder.find_or_create_by_slug_and_parent_id(self.class.to_s.titlecase.split('/').last.pluralize, nil)
86
+ slug = parent_folder_option || self.class.to_s.titlecase.split('/').last.pluralize
87
+ Droom::Folder.where(:slug => slug, :parent_id => nil).first_or_create
88
88
  end
89
89
  end
90
90
 
@@ -49,6 +49,16 @@ module Droom
49
49
  end
50
50
  end
51
51
 
52
+ def get_or_set(path, default_value)
53
+ key, subkeys = split_path(path)
54
+ if subkeys.any?
55
+ self[key] ||= Droom::LazyHash.new
56
+ self[key].get_or_set(subkeys, default_value)
57
+ else
58
+ self[key] ||= default_value
59
+ end
60
+ end
61
+
52
62
  # *set* will set the value at the named bucket. Note that you should only ever do this from an
53
63
  # initializer or some other thread-global event that can be relied upon always to have run. Never call
54
64
  # LazyHash#set at runtime unless what you want is a local, non-thread-global nested hash construction.
@@ -65,7 +75,7 @@ module Droom
65
75
 
66
76
  #
67
77
  def split_path(key)
68
- keys = key.is_a?(Array) ? key : key.to_s.split('.')
78
+ keys = key.is_a?(Array) ? key.dup : key.to_s.split('.')
69
79
  keys.any? ? [keys.shift.to_sym, keys] : [nil, []]
70
80
  end
71
81
 
@@ -1,14 +1,14 @@
1
1
  class Array
2
2
  def to_ics
3
- to_rical.to_s
3
+ to_icalendar.to_ical
4
4
  end
5
5
 
6
- def to_rical
7
- RiCal.Calendar do |cal|
8
- self.flatten.each do |item|
9
- cal.add_subcomponent(item.to_rical) if item.respond_to?(:to_rical)
10
- end
6
+ def to_icalendar
7
+ cal = Icalendar::Calendar.new
8
+ self.flatten.each do |item|
9
+ cal.add_event(item.icalendar_event) if item.respond_to? :icalendar_event
11
10
  end
11
+ cal
12
12
  end
13
13
  end
14
14
 
@@ -34,7 +34,7 @@ module Droom
34
34
  end
35
35
 
36
36
  def remove_tag(word=nil)
37
- tag = Tag.find_by_title(word) if word && !word.blank?
37
+ tag = Tag.find_by(title: word) if word && !word.blank?
38
38
  self.tags.delete(tag) if tag
39
39
  end
40
40
 
@@ -6,6 +6,6 @@ end
6
6
 
7
7
  class UniquenessAmongSiblingsValidator < ActiveModel::EachValidator
8
8
  def validate_each(record, attribute, value)
9
- record.errors.add(attribute, :taken) if record.siblings.send(:"find_by_#{attribute}", value)
9
+ record.errors.add(attribute, :taken) if record.siblings.send(:"find_by", {attribute: value})
10
10
  end
11
11
  end
@@ -1,3 +1,3 @@
1
1
  module Droom
2
- VERSION = "0.4.3"
2
+ VERSION = "0.5.3"
3
3
  end
@@ -1,5 +1,13 @@
1
- #Droom.dav_subdomain = "dav"
2
- #Droom.dav_root = "webdav"
1
+ #Droom.layout = "application"
2
+ #Droom.email_layout = "email"
3
3
  #Droom.use_forenames = false
4
4
  #Droom.show_venue_map = false
5
5
  #Droom.home_country = 'gb'
6
+ #Droom.main_dashboard_modules = %w{welcome future_events past_events documents}
7
+ #Droom.margin_dashboard_modules = %w{calendar invitations stream}
8
+ #Droom.home_url = Settings.host
9
+ #Droom.email_from = Settings.email.address
10
+ #Droom.email_from_name = Settings.email.name
11
+ #Droom.dropbox_app_key = Settings.dropbox.key
12
+ #Droom.dropbox_app_secret = Settings.dropbox.secret
13
+ #Droom.dropbox_app_name = Settings.dropbox.name
@@ -0,0 +1,80 @@
1
+ module Paperclip
2
+
3
+ class TransformationError < RuntimeError; end
4
+ class StyleError < RuntimeError; end
5
+
6
+ class Geometry
7
+
8
+ # Returns a new Geometry object with the the same dimensions as this but with no modifier.
9
+ def without_modifier
10
+ Geometry.new(self.width, self.height)
11
+ end
12
+
13
+ # Returns the dimensions that would result if a thumbnail was created by transforming this geometry into that geometry.
14
+ # Its purpose is to mimic imagemagick conversions. Used like so:
15
+ # file_geometry.transformed_by(style_geometry)
16
+ # it returns the size of the thumbnail image you would get by applying that rule.
17
+ # This saves us having to go back to the file, which is expensive with S3.
18
+ # We understand all the Imagemagick geometry arguments described at http://www.imagemagick.org/script/command-line-processing.php#geometry
19
+ # including both '^' and paperclip's own '#' modifier.
20
+ #
21
+ def transformed_by (other)
22
+ other = Geometry.parse(other) unless other.is_a? Geometry
23
+ # if the two geometries are similar, or the destination geometry is a fixed size, the resulting dimensions are fixed
24
+ return other.without_modifier if self =~ other || ['#', '!', '^'].include?(other.modifier)
25
+ # otherwise, we apply the transformation
26
+ raise TransformationError, "geometry is not transformable without both width and height" if self.height == 0 or self.width == 0
27
+ case other.modifier
28
+ when '>'
29
+ (other.width < self.width || other.height < self.height) ? scaled_to_fit(other) : self
30
+ when '<'
31
+ (other.width > self.width && other.height > self.height) ? scaled_to_fit(other) : self
32
+ when '%'
33
+ scaled_by(other)
34
+ when '@'
35
+ scaled_by(other.width * 100 / (self.width * self.height))
36
+ else
37
+ scaled_to_fit(other)
38
+ end
39
+ end
40
+ alias :* :transformed_by
41
+
42
+ # Tests whether two geometries are identical in dimensions and modifier.
43
+ def == (other)
44
+ self.to_s == other.to_s
45
+ end
46
+
47
+ # Tests whether two geometries have the same dimensions, ignoring modifier.
48
+ def =~ (other)
49
+ self.height.to_i == other.height.to_i && self.width.to_i == other.width.to_i
50
+ end
51
+
52
+ # Scales this geometry to fit within that geometry.
53
+ def scaled_to_fit(other)
54
+ if (other.width > 0 && other.height == 0)
55
+ Geometry.new(other.width, self.height * other.width / self.width)
56
+ elsif (other.width == 0 && other.height > 0)
57
+ Geometry.new(self.width * other.height / self.height, other.height)
58
+ else
59
+ ratio = Geometry.new( other.width / self.width, other.height / self.height )
60
+ if ratio.square?
61
+ other.without_modifier
62
+ elsif ratio.horizontal?
63
+ Geometry.new(ratio.height * self.width, other.height)
64
+ else
65
+ Geometry.new(other.width, ratio.width * self.height)
66
+ end
67
+ end
68
+ end
69
+
70
+ # Scales this geometry by the percentage(s) specified in that geometry.
71
+ def scaled_by(other)
72
+ other = Geometry.new("#{other}%") unless other.is_a? Geometry
73
+ if other.height > 0
74
+ Geometry.new(self.width * other.width / 100, self.height * other.height / 100)
75
+ else
76
+ Geometry.new(self.width * other.width / 100, self.height * other.width / 100)
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,89 @@
1
+ require 'active_model/validations/numericality'
2
+
3
+ module Paperclip
4
+ module Validators
5
+ class AttachmentHeightValidator < ActiveModel::Validations::NumericalityValidator
6
+ AVAILABLE_CHECKS = [:less_than, :less_than_or_equal_to, :greater_than, :greater_than_or_equal_to]
7
+
8
+ def initialize(options)
9
+ extract_options(options)
10
+ super
11
+ end
12
+
13
+ def validate_each(record, attr_name, value)
14
+ attachment = record.send(attr_name)
15
+ dimensions = Paperclip::Geometry.from_file(attachment.queued_for_write[:original])
16
+ value = dimensions.height.to_i
17
+ options.slice(*AVAILABLE_CHECKS).each do |option, option_value|
18
+ option_value = extract_option_value(option, option_value)
19
+ unless value.send(CHECKS[option], option_value)
20
+ error_message_key = options[:in] ? :in_between : option
21
+ record.errors.add(attr_name, error_message_key, filtered_options(value).merge(
22
+ :min => min_value,
23
+ :max => max_value
24
+ ))
25
+ end
26
+ end
27
+ end
28
+
29
+ def check_validity!
30
+ unless (AVAILABLE_CHECKS + [:in]).any? { |argument| options.has_key?(argument) }
31
+ raise ArgumentError, "You must pass either :less_than, :greater_than, or :in to the validator"
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def extract_options(options)
38
+ if range = options[:in]
39
+ if !options[:in].respond_to?(:call)
40
+ options[:less_than_or_equal_to] = range.max
41
+ options[:greater_than_or_equal_to] = range.min
42
+ else
43
+ options[:less_than_or_equal_to] = range
44
+ options[:greater_than_or_equal_to] = range
45
+ end
46
+ end
47
+ end
48
+
49
+ def extract_option_value(option, option_value)
50
+ if option_value.is_a?(Range)
51
+ if [:less_than, :less_than_or_equal_to].include?(option)
52
+ option_value.max
53
+ else
54
+ option_value.min
55
+ end
56
+ else
57
+ option_value
58
+ end
59
+ end
60
+
61
+ def min_value
62
+ value = options[:greater_than_or_equal_to] || options[:greater_than]
63
+ value = value.min if value.respond_to?(:min)
64
+ value
65
+ end
66
+
67
+ def max_value
68
+ value = options[:less_than_or_equal_to] || options[:less_than]
69
+ value = value.max if value.respond_to?(:max)
70
+ value
71
+ end
72
+ end
73
+
74
+ module HelperMethods
75
+ # Places ActiveRecord-style validations on the pixel height of the file assigned.
76
+ # The possible options are:
77
+ # * +in+: a Range of bytes (i.e. +1..1.megabyte+),
78
+ # * +less_than+: equivalent to :in => 0..options[:less_than]
79
+ # * +greater_than+: equivalent to :in => options[:greater_than]..Infinity
80
+ # * +message+: error message to display, use :min and :max as replacements
81
+ # * +if+: A lambda or name of an instance method. Validation will only
82
+ # be run if this lambda or method returns true.
83
+ # * +unless+: Same as +if+ but validates if lambda or method returns false.
84
+ def validates_attachment_height(*attr_names)
85
+ validates_with AttachmentHeightValidator, _merge_attributes(attr_names)
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,89 @@
1
+ require 'active_model/validations/numericality'
2
+
3
+ module Paperclip
4
+ module Validators
5
+ class AttachmentWidthValidator < ActiveModel::Validations::NumericalityValidator
6
+ AVAILABLE_CHECKS = [:less_than, :less_than_or_equal_to, :greater_than, :greater_than_or_equal_to]
7
+
8
+ def initialize(options)
9
+ extract_options(options)
10
+ super
11
+ end
12
+
13
+ def validate_each(record, attr_name, value)
14
+ attachment = record.send(attr_name)
15
+ dimensions = Paperclip::Geometry.from_file(attachment.queued_for_write[:original])
16
+ value = dimensions.width.to_i
17
+ options.slice(*AVAILABLE_CHECKS).each do |option, option_value|
18
+ option_value = extract_option_value(option, option_value)
19
+ unless value.send(CHECKS[option], option_value)
20
+ error_message_key = options[:in] ? :in_between : option
21
+ record.errors.add(attr_name, error_message_key, filtered_options(value).merge(
22
+ :min => min_value,
23
+ :max => max_value
24
+ ))
25
+ end
26
+ end
27
+ end
28
+
29
+ def check_validity!
30
+ unless (AVAILABLE_CHECKS + [:in]).any? { |argument| options.has_key?(argument) }
31
+ raise ArgumentError, "You must pass either :less_than, :greater_than, or :in to the validator"
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def extract_options(options)
38
+ if range = options[:in]
39
+ if !options[:in].respond_to?(:call)
40
+ options[:less_than_or_equal_to] = range.max
41
+ options[:greater_than_or_equal_to] = range.min
42
+ else
43
+ options[:less_than_or_equal_to] = range
44
+ options[:greater_than_or_equal_to] = range
45
+ end
46
+ end
47
+ end
48
+
49
+ def extract_option_value(option, option_value)
50
+ if option_value.is_a?(Range)
51
+ if [:less_than, :less_than_or_equal_to].include?(option)
52
+ option_value.max
53
+ else
54
+ option_value.min
55
+ end
56
+ else
57
+ option_value
58
+ end
59
+ end
60
+
61
+ def min_value
62
+ value = options[:greater_than_or_equal_to] || options[:greater_than]
63
+ value = value.min if value.respond_to?(:min)
64
+ value
65
+ end
66
+
67
+ def max_value
68
+ value = options[:less_than_or_equal_to] || options[:less_than]
69
+ value = value.max if value.respond_to?(:max)
70
+ value
71
+ end
72
+ end
73
+
74
+ module HelperMethods
75
+ # Places ActiveRecord-style validations on the pixel width of the file assigned.
76
+ # The possible options are:
77
+ # * +in+: a Range of bytes (i.e. +1..1.megabyte+),
78
+ # * +less_than+: equivalent to :in => 0..options[:less_than]
79
+ # * +greater_than+: equivalent to :in => options[:greater_than]..Infinity
80
+ # * +message+: error message to display, use :min and :max as replacements
81
+ # * +if+: A lambda or name of an instance method. Validation will only
82
+ # be run if this lambda or method returns true.
83
+ # * +unless+: Same as +if+ but validates if lambda or method returns false.
84
+ def validates_attachment_width(*attr_names)
85
+ validates_with AttachmentWidthValidator, _merge_attributes(attr_names)
86
+ end
87
+ end
88
+ end
89
+ end