droom 0.0.1 → 0.2.1

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 (459) hide show
  1. data/README.md +2 -2
  2. data/app/assets/images/droom/Untitled-1.png +0 -0
  3. data/app/assets/images/droom/acceptance.png +0 -0
  4. data/app/assets/images/droom/add.png +0 -0
  5. data/app/assets/images/droom/asterisk.png +0 -0
  6. data/app/assets/images/droom/asterisk_up.png +0 -0
  7. data/app/assets/images/droom/checkboxes.png +0 -0
  8. data/app/assets/images/droom/clear.png +0 -0
  9. data/app/assets/images/droom/cog.png +0 -0
  10. data/app/assets/images/droom/copy.png +0 -0
  11. data/app/assets/images/droom/copy_to_dropbox.png +0 -0
  12. data/app/assets/images/droom/crosses.png +0 -0
  13. data/app/assets/images/droom/dark_scrap_icons.png +0 -0
  14. data/app/assets/images/droom/defilter.png +0 -0
  15. data/app/assets/images/droom/delete.png +0 -0
  16. data/app/assets/images/droom/dropbox.png +0 -0
  17. data/app/assets/images/droom/dropbox_button.png +0 -0
  18. data/app/assets/images/droom/dropbox_button_small.png +0 -0
  19. data/app/assets/images/droom/edit.png +0 -0
  20. data/app/assets/images/droom/expand.png +0 -0
  21. data/app/assets/images/droom/expander.png +0 -0
  22. data/app/assets/images/droom/folder.png +0 -0
  23. data/app/assets/images/droom/image_box.png +0 -0
  24. data/app/assets/images/droom/in_dropbox.png +0 -0
  25. data/app/assets/images/droom/integration_buttons.png +0 -0
  26. data/app/assets/images/droom/leftright.png +0 -0
  27. data/app/assets/images/droom/manage.png +0 -0
  28. data/app/assets/images/droom/medium_object_icons.png +0 -0
  29. data/app/assets/images/droom/object_icons.png +0 -0
  30. data/app/assets/images/droom/playable.png +0 -0
  31. data/app/assets/images/droom/revoke.png +0 -0
  32. data/app/assets/images/droom/scrap_icons.png +0 -0
  33. data/app/assets/images/droom/search.png +0 -0
  34. data/app/assets/images/droom/small_asterisk.png +0 -0
  35. data/app/assets/images/droom/small_cog.png +0 -0
  36. data/app/assets/images/droom/small_download.png +0 -0
  37. data/app/assets/images/droom/small_image_box.png +0 -0
  38. data/app/assets/images/droom/smalladd.png +0 -0
  39. data/app/assets/images/droom/smallarrows.png +0 -0
  40. data/app/assets/images/droom/smallcopy.png +0 -0
  41. data/app/assets/images/droom/smalldelete.png +0 -0
  42. data/app/assets/images/droom/smalldownload.png +0 -0
  43. data/app/assets/images/droom/smalledit.png +0 -0
  44. data/app/assets/images/droom/smallmanage.png +0 -0
  45. data/app/assets/images/droom/star.png +0 -0
  46. data/app/assets/images/droom/symbols.png +0 -0
  47. data/app/assets/images/droom/tinyarrows.png +0 -0
  48. data/app/assets/images/droom/to_dropbox.png +0 -0
  49. data/app/assets/images/droom/twisty.png +0 -0
  50. data/app/assets/images/droom/youtube_icon.png +0 -0
  51. data/app/assets/javascripts/droom.js.coffee +62 -65
  52. data/app/assets/javascripts/droom/actions.js.coffee +492 -0
  53. data/app/assets/javascripts/droom/ajax.js.coffee +84 -0
  54. data/app/assets/javascripts/droom/{lib/extensions.js.coffee → extensions.js.coffee} +22 -15
  55. data/app/assets/javascripts/droom/lib/ZeroClipboard.js +334 -0
  56. data/app/assets/javascripts/droom/lib/ZeroClipboard.swf +0 -0
  57. data/app/assets/javascripts/droom/lib/ZeroClipboard10.swf +0 -0
  58. data/app/assets/javascripts/droom/map.js.coffee +124 -86
  59. data/app/assets/javascripts/droom/popups.js.coffee +252 -0
  60. data/app/assets/javascripts/droom/stream.js.coffee +92 -0
  61. data/app/assets/javascripts/droom/utilities.js.coffee +120 -0
  62. data/app/assets/javascripts/droom/widgets.js.coffee +1209 -0
  63. data/app/assets/stylesheets/_definitions.css.sass +189 -0
  64. data/app/assets/stylesheets/droom.css.sass +1429 -376
  65. data/app/assets/stylesheets/lib/_kalendae.css.sass +2 -5
  66. data/app/assets/stylesheets/lib/_popups.css.sass +86 -0
  67. data/app/assets/stylesheets/lib/_toolbar.css.sass +17 -11
  68. data/app/controllers/droom/agenda_categories_controller.rb +24 -0
  69. data/app/controllers/droom/calendars_controller.rb +29 -0
  70. data/app/controllers/droom/confirmations_controller.rb +38 -0
  71. data/app/controllers/droom/dashboard_controller.rb +2 -0
  72. data/app/controllers/droom/documents_controller.rb +42 -51
  73. data/app/controllers/droom/dropbox_tokens_controller.rb +61 -0
  74. data/app/controllers/droom/engine_controller.rb +8 -23
  75. data/app/controllers/droom/events_controller.rb +39 -27
  76. data/app/controllers/droom/folders_controller.rb +106 -0
  77. data/app/controllers/droom/group_invitations_controller.rb +15 -7
  78. data/app/controllers/droom/groups_controller.rb +4 -4
  79. data/app/controllers/droom/invitations_controller.rb +37 -9
  80. data/app/controllers/droom/memberships_controller.rb +5 -3
  81. data/app/controllers/droom/organisations_controller.rb +53 -0
  82. data/app/controllers/droom/people_controller.rb +46 -27
  83. data/app/controllers/droom/preferences_controller.rb +34 -0
  84. data/app/controllers/droom/scraps_controller.rb +77 -0
  85. data/app/controllers/droom/search_controller.rb +66 -0
  86. data/app/controllers/droom/suggestions_controller.rb +22 -35
  87. data/app/controllers/droom/users_controller.rb +69 -0
  88. data/app/controllers/droom/venues_controller.rb +1 -2
  89. data/app/controllers/droom/youtube_controller.rb +22 -0
  90. data/app/helpers/droom/droom_helper.rb +93 -5
  91. data/app/models/droom/agenda_category.rb +8 -1
  92. data/app/models/droom/calendar.rb +19 -0
  93. data/app/models/droom/category.rb +4 -6
  94. data/app/models/droom/document.rb +103 -64
  95. data/app/models/droom/document_attachment.rb +13 -47
  96. data/app/models/droom/dropbox_document.rb +41 -0
  97. data/app/models/droom/dropbox_token.rb +29 -0
  98. data/app/models/droom/event.rb +125 -90
  99. data/app/models/droom/folder.rb +134 -0
  100. data/app/models/droom/group.rb +68 -27
  101. data/app/models/droom/group_invitation.rb +12 -3
  102. data/app/models/droom/invitation.rb +50 -8
  103. data/app/models/droom/mailing_list_membership.rb +128 -0
  104. data/app/models/droom/membership.rb +71 -9
  105. data/app/models/droom/organisation.rb +22 -0
  106. data/app/models/droom/page.rb +3 -3
  107. data/app/models/droom/person.rb +180 -166
  108. data/app/models/droom/personal_folder.rb +31 -0
  109. data/app/models/droom/preference.rb +35 -0
  110. data/app/models/droom/recurrence_rule.rb +1 -1
  111. data/app/models/droom/scrap.rb +110 -0
  112. data/app/models/droom/tag.rb +120 -0
  113. data/app/models/droom/tagging.rb +13 -0
  114. data/app/models/droom/user.rb +211 -0
  115. data/app/models/droom/user_action_observer.rb +12 -0
  116. data/app/models/droom/venue.rb +56 -39
  117. data/app/views/cropper/uploads/_crop.html.haml +46 -0
  118. data/app/views/devise/mailer/confirmation_instructions.en.html.haml +24 -0
  119. data/app/views/devise/mailer/reset_password_instructions.en.html.haml +21 -0
  120. data/app/views/devise/passwords/edit.html.haml +31 -0
  121. data/app/views/devise/passwords/new.html.haml +21 -0
  122. data/app/views/devise/sessions/new.html.haml +33 -0
  123. data/app/views/droom/agenda_categories/_form.html.haml +22 -0
  124. data/app/views/droom/agenda_categories/new.html.haml +6 -0
  125. data/app/views/droom/calendars/_action_menu.html.haml +6 -0
  126. data/app/views/droom/calendars/index.html.haml +12 -0
  127. data/app/views/droom/calendars/show.rss.builder +0 -0
  128. data/app/views/droom/confirmations/show.html.haml +40 -0
  129. data/app/views/droom/dashboard/_calendar.html.haml +1 -0
  130. data/app/views/droom/dashboard/_folders.html.haml +5 -0
  131. data/app/views/droom/dashboard/_future_events.html.haml +18 -0
  132. data/app/views/droom/dashboard/_invitations.html.haml +1 -0
  133. data/app/views/droom/dashboard/_past_events.haml +14 -0
  134. data/app/views/droom/dashboard/_quicksearch.html.haml +6 -0
  135. data/app/views/droom/dashboard/_stream.html.haml +9 -0
  136. data/app/views/droom/dashboard/index.html.haml +5 -3
  137. data/app/views/droom/documents/_action_menu.html.haml +7 -0
  138. data/app/views/droom/documents/_documents.html.haml +5 -0
  139. data/app/views/droom/documents/_documents_list.html.haml +6 -6
  140. data/app/views/droom/documents/_documents_table.html.haml +29 -10
  141. data/app/views/droom/documents/_form.html.haml +3 -7
  142. data/app/views/droom/documents/_listing.html.haml +5 -6
  143. data/app/views/droom/documents/_pagination.html.haml +8 -0
  144. data/app/views/droom/documents/_search_result.html.haml +14 -0
  145. data/app/views/droom/documents/_suggested.html.haml +0 -5
  146. data/app/views/droom/documents/_table_document.html.haml +2 -8
  147. data/app/views/droom/documents/edit.html.haml +7 -1
  148. data/app/views/droom/documents/index.html.haml +10 -27
  149. data/app/views/droom/documents/new.html.haml +10 -1
  150. data/app/views/droom/dropbox_tokens/new.html.haml +6 -0
  151. data/app/views/droom/events/_action_menu.html.haml +15 -0
  152. data/app/views/droom/events/_event.html.haml +67 -57
  153. data/app/views/droom/events/_form.html.haml +15 -4
  154. data/app/views/droom/events/_invitations.html.haml +4 -19
  155. data/app/views/droom/events/_search_result.html.haml +19 -0
  156. data/app/views/droom/events/_views.html.haml +2 -2
  157. data/app/views/droom/events/edit.html.haml +7 -1
  158. data/app/views/droom/events/index.html.haml +27 -10
  159. data/app/views/droom/events/index.rss.builder +1 -1
  160. data/app/views/droom/events/new.html.haml +6 -1
  161. data/app/views/droom/events/show.html.haml +5 -1
  162. data/app/views/droom/folders/_action_menu.html.haml +14 -0
  163. data/app/views/droom/folders/_attachments.html.haml +3 -0
  164. data/app/views/droom/folders/_contents.html.haml +6 -0
  165. data/app/views/droom/folders/_folder.html.haml +20 -0
  166. data/app/views/droom/folders/_folders.html.haml +2 -0
  167. data/app/views/droom/folders/_form.html.haml +18 -0
  168. data/app/views/droom/folders/edit.html.haml +6 -0
  169. data/app/views/droom/folders/index.html.haml +32 -0
  170. data/app/views/droom/folders/new.html.haml +6 -0
  171. data/app/views/droom/folders/show.html.haml +1 -0
  172. data/app/views/droom/group_invitations/_form.html.haml +15 -4
  173. data/app/views/droom/group_invitations/new.html.haml +6 -1
  174. data/app/views/droom/groups/_action_menu.haml +11 -0
  175. data/app/views/droom/groups/_form.html.haml +10 -11
  176. data/app/views/droom/groups/_group.html.haml +9 -10
  177. data/app/views/droom/groups/_groups.html.haml +2 -3
  178. data/app/views/droom/groups/_search_result.html.haml +16 -0
  179. data/app/views/droom/groups/_suggested.html.haml +7 -0
  180. data/app/views/droom/groups/edit.html.haml +7 -1
  181. data/app/views/droom/groups/index.html.haml +6 -3
  182. data/app/views/droom/groups/new.html.haml +7 -0
  183. data/app/views/droom/groups/show.html.haml +1 -1
  184. data/app/views/droom/invitations/_created.html.haml +1 -1
  185. data/app/views/droom/invitations/_form.html.haml +9 -5
  186. data/app/views/droom/invitations/_invitation.html.haml +9 -0
  187. data/app/views/droom/invitations/_invitations.html.haml +8 -0
  188. data/app/views/droom/invitations/new.html.haml +6 -1
  189. data/app/views/droom/memberships/_member.html.haml +1 -1
  190. data/app/views/droom/memberships/_membership_toggle.html.haml +10 -0
  191. data/app/views/droom/memberships/new.html.haml +10 -0
  192. data/app/views/droom/organisations/_action_menu.html.haml +7 -0
  193. data/app/views/droom/organisations/_form.html.haml +25 -0
  194. data/app/views/droom/organisations/_organisation.html.haml +23 -0
  195. data/app/views/droom/organisations/_organisations.html.haml +2 -0
  196. data/app/views/droom/organisations/_suggested.html.haml +7 -0
  197. data/app/views/droom/organisations/edit.html.haml +6 -0
  198. data/app/views/droom/organisations/index.html.haml +20 -0
  199. data/app/views/droom/organisations/new.html.haml +6 -0
  200. data/app/views/droom/organisations/show.html.haml +1 -0
  201. data/app/views/droom/pages/_full_page.html.haml +1 -1
  202. data/app/views/droom/pages/index.html.haml +1 -1
  203. data/app/views/droom/panels/_account.html.haml +16 -0
  204. data/app/views/droom/panels/_admin.html.haml +23 -0
  205. data/app/views/droom/panels/_devices.html.haml +19 -0
  206. data/app/views/droom/panels/_dropbox.html.haml +17 -0
  207. data/app/views/droom/panels/_email.html.haml +16 -0
  208. data/app/views/droom/panels/_keywords.html.haml +3 -0
  209. data/app/views/droom/panels/_networks.html.haml +3 -0
  210. data/app/views/droom/panels/_readers.html.haml +18 -0
  211. data/app/views/droom/panels/_rss.html.haml +10 -0
  212. data/app/views/droom/panels/_search.html.haml +16 -0
  213. data/app/views/droom/panels/_vcal.html.haml +3 -0
  214. data/app/views/droom/people/_action_menu.html.haml +22 -0
  215. data/app/views/droom/people/_form.html.haml +69 -39
  216. data/app/views/droom/people/_listing.html.haml +19 -0
  217. data/app/views/droom/people/_memberships.html.haml +24 -0
  218. data/app/views/droom/people/_people.html.haml +5 -29
  219. data/app/views/droom/people/_person.html.haml +30 -32
  220. data/app/views/droom/people/_search_result.html.haml +14 -0
  221. data/app/views/droom/people/_suggested.html.haml +10 -5
  222. data/app/views/droom/people/edit.html.haml +9 -1
  223. data/app/views/droom/people/index.html.haml +6 -9
  224. data/app/views/droom/people/new.html.haml +6 -1
  225. data/app/views/droom/people/show.html.haml +1 -1
  226. data/app/views/droom/preferences/_checkbox.html.haml +7 -0
  227. data/app/views/droom/preferences/_radio_set.html.haml +9 -0
  228. data/app/views/droom/scraps/_action_menu.html.haml +9 -0
  229. data/app/views/droom/scraps/_caption.html.haml +9 -0
  230. data/app/views/droom/scraps/_credit.html.haml +10 -0
  231. data/app/views/droom/scraps/_form.html.haml +77 -0
  232. data/app/views/droom/scraps/_heading.html.haml +16 -0
  233. data/app/views/droom/scraps/_scrap.html.haml +17 -0
  234. data/app/views/droom/scraps/_search_result.html.haml +5 -0
  235. data/app/views/droom/scraps/_stream.html.haml +4 -0
  236. data/app/views/droom/scraps/_suggested.html.haml +5 -0
  237. data/app/views/droom/scraps/_thumb.html.haml +5 -0
  238. data/app/views/droom/scraps/edit.html.haml +2 -0
  239. data/app/views/droom/scraps/full/_document.html.haml +6 -0
  240. data/app/views/droom/scraps/full/_event.html.haml +20 -0
  241. data/app/views/droom/scraps/full/_image.html.haml +4 -0
  242. data/app/views/droom/scraps/full/_link.html.haml +5 -0
  243. data/app/views/droom/scraps/full/_quote.html.haml +8 -0
  244. data/app/views/droom/scraps/full/_text.html.haml +4 -0
  245. data/app/views/droom/scraps/full/_video.html.haml +4 -0
  246. data/app/views/droom/scraps/index.atom.builder +26 -0
  247. data/app/views/droom/scraps/index.html.haml +15 -0
  248. data/app/views/droom/scraps/new.html.haml +2 -0
  249. data/app/views/droom/scraps/show.html.haml +4 -0
  250. data/app/views/droom/scraps/thumbs/_document.html.haml +9 -0
  251. data/app/views/droom/scraps/thumbs/_event.html.haml +17 -0
  252. data/app/views/droom/scraps/thumbs/_image.html.haml +6 -0
  253. data/app/views/droom/scraps/thumbs/_link.html.haml +10 -0
  254. data/app/views/droom/scraps/thumbs/_quote.html.haml +8 -0
  255. data/app/views/droom/scraps/thumbs/_text.html.haml +8 -0
  256. data/app/views/droom/scraps/thumbs/_video.html.haml +6 -0
  257. data/app/views/droom/shared/_controls.html.haml +5 -3
  258. data/app/views/droom/shared/_excerpt.html.haml +2 -0
  259. data/app/views/droom/shared/_navigation.html.haml +4 -4
  260. data/app/views/droom/shared/_panels.html.haml +4 -0
  261. data/app/views/droom/shared/_quicklinks.html.haml +5 -0
  262. data/app/views/droom/shared/_search_form.html.haml +2 -1
  263. data/app/views/droom/shared/_search_results.html.haml +9 -0
  264. data/app/views/droom/shared/_suggestions.html.haml +13 -9
  265. data/app/views/droom/shared/_title_excerpt.haml +2 -0
  266. data/app/views/droom/shared/search.html.haml +18 -0
  267. data/app/views/droom/users/_confirmation.html.haml +2 -0
  268. data/app/views/droom/users/_dropbox_status.html.haml +2 -0
  269. data/app/views/droom/users/_form.html.haml +34 -0
  270. data/app/views/droom/users/_user.html.haml +2 -0
  271. data/app/views/droom/users/_user_or_person.html.haml +63 -0
  272. data/app/views/droom/users/_users_table.html.haml +17 -0
  273. data/app/views/droom/users/edit.html.haml +10 -0
  274. data/app/views/droom/users/index.html.haml +42 -0
  275. data/app/views/droom/users/unwelcome.en.html.haml +17 -0
  276. data/app/views/droom/venues/_search_result.html.haml +17 -0
  277. data/app/views/droom/youtube/show.html.haml +12 -0
  278. data/app/views/kaminari/_paginator.html.haml +16 -0
  279. data/app/views/layouts/droom/application.html.haml +17 -17
  280. data/app/views/layouts/droom/email.html.haml +59 -0
  281. data/config/cucumber.yml +8 -0
  282. data/config/initializers/devise.rb +240 -0
  283. data/config/locales/devise.en.yml +58 -0
  284. data/config/locales/en.yml +203 -32
  285. data/config/routes.rb +55 -16
  286. data/config/sunspot.yml +17 -0
  287. data/db/migrate/20121120115447_tags.rb +18 -0
  288. data/db/migrate/20130116155331_dropbox_tokens.rb +9 -0
  289. data/db/migrate/20130118103540_folders.rb +47 -0
  290. data/db/migrate/20130124113715_preferences.rb +10 -0
  291. data/db/migrate/20130125132427_users_in_droom.rb +58 -0
  292. data/db/migrate/20130129142307_mobile_phones.rb +7 -0
  293. data/db/migrate/20130130120124_folder_ancestry_to_parents.rb +7 -0
  294. data/db/migrate/20130131161430_mailing_lists.rb +37 -0
  295. data/db/migrate/20130207091903_preference_uuids.rb +5 -0
  296. data/db/migrate/20130207123614_stream.rb +13 -0
  297. data/db/migrate/20130208035113_access_token_secret.rb +5 -0
  298. data/db/migrate/20130214145014_person_image.rb +9 -0
  299. data/db/migrate/20130217152644_devise_confirmable.rb +13 -0
  300. data/db/migrate/20130225095328_create_droom_calendars.rb +20 -0
  301. data/db/migrate/20130226092944_give_scraps_document.rb +5 -0
  302. data/db/migrate/20130228083509_privateness.rb +9 -0
  303. data/db/migrate/20130228134143_store_metadata.rb +5 -0
  304. data/db/migrate/20130305150648_folders_nicely.rb +6 -0
  305. data/db/migrate/20130305151936_niceties.rb +7 -0
  306. data/db/migrate/20130308103807_create_droom_dropbox_documents.rb +11 -0
  307. data/db/migrate/20130308154552_dropbox_documents_changed.rb +5 -0
  308. data/db/migrate/20130326135738_user_titles.rb +5 -0
  309. data/lib/droom.rb +189 -22
  310. data/lib/droom/engine.rb +6 -1
  311. data/lib/droom/folders.rb +106 -0
  312. data/lib/droom/lazy_hash.rb +73 -0
  313. data/lib/droom/{helpers.rb → model_helpers.rb} +1 -1
  314. data/lib/droom/monkeys.rb +21 -2
  315. data/lib/droom/routing.rb +13 -0
  316. data/lib/droom/searchability.rb +25 -0
  317. data/lib/droom/taggability.rb +60 -0
  318. data/lib/droom/title_case.rb +101 -0
  319. data/lib/droom/user_config.rb +67 -0
  320. data/lib/droom/validators.rb +6 -0
  321. data/lib/droom/version.rb +1 -1
  322. data/lib/generators/droom/install/templates/droom_initializer.rb +0 -1
  323. data/lib/tasks/cucumber.rake +65 -0
  324. data/spec/datasets/calendar_events_dataset.rb +44 -0
  325. data/spec/datasets/calendar_pages_dataset.rb +8 -0
  326. data/spec/datasets/calendar_sites_dataset.rb +6 -0
  327. data/spec/datasets/calendars_dataset.rb +34 -0
  328. data/spec/datasets/documents_dataset.rb +28 -0
  329. data/spec/datasets/recurrence_dataset.rb +7 -0
  330. data/spec/dummy/README.rdoc +261 -0
  331. data/spec/dummy/Rakefile +7 -0
  332. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  333. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  334. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  335. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  336. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  337. data/spec/dummy/config.ru +4 -0
  338. data/spec/dummy/config/application.rb +65 -0
  339. data/spec/dummy/config/boot.rb +10 -0
  340. data/spec/dummy/config/database.yml +21 -0
  341. data/spec/dummy/config/environment.rb +5 -0
  342. data/spec/dummy/config/environments/development.rb +38 -0
  343. data/spec/dummy/config/environments/production.rb +67 -0
  344. data/spec/dummy/config/environments/test.rb +38 -0
  345. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  346. data/spec/dummy/config/initializers/inflections.rb +15 -0
  347. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  348. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  349. data/spec/dummy/config/initializers/session_store.rb +8 -0
  350. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  351. data/spec/dummy/config/locales/en.yml +7 -0
  352. data/spec/dummy/config/routes.rb +3 -0
  353. data/spec/dummy/config/sunspot.yml +17 -0
  354. data/spec/dummy/db/migrate/20120911070124_create_droom_data.droom.rb +135 -0
  355. data/spec/dummy/db/migrate/20120921094604_agenda_sections.droom.rb +14 -0
  356. data/spec/dummy/db/migrate/20120921094605_add_postal_address_to_people.droom.rb +11 -0
  357. data/spec/dummy/db/migrate/20121102064845_give_groups_descriptions.droom.rb +6 -0
  358. data/spec/dummy/db/migrate/20121102064846_more_names.droom.rb +6 -0
  359. data/spec/dummy/db/migrate/20121102064847_event_agenda_sections.droom.rb +14 -0
  360. data/spec/dummy/db/migrate/20121102064848_create_group_invitations.droom.rb +11 -0
  361. data/spec/dummy/db/migrate/20121102064849_give_people_positions.droom.rb +6 -0
  362. data/spec/dummy/db/migrate/20121102064850_help_pages.droom.rb +14 -0
  363. data/spec/dummy/db/migrate/20121102064851_category_slugs.droom.rb +6 -0
  364. data/spec/dummy/db/migrate/20121102064852_document_links.droom.rb +15 -0
  365. data/spec/dummy/db/migrate/20121102064853_people_visibility.droom.rb +8 -0
  366. data/spec/dummy/db/migrate/20121102094820_shy_people.droom.rb +6 -0
  367. data/spec/dummy/db/migrate/20121102095927_visibility_defaults.droom.rb +10 -0
  368. data/spec/dummy/db/migrate/20130121122352_tags.droom.rb +19 -0
  369. data/spec/dummy/db/migrate/20130121122353_dropbox.droom.rb +10 -0
  370. data/spec/dummy/db/migrate/20130121122354_folders.droom.rb +48 -0
  371. data/spec/dummy/db/migrate/20130128142902_memberships_expire.droom.rb +6 -0
  372. data/spec/dummy/db/migrate/20130128142903_give_documents_extracted_text.droom.rb +6 -0
  373. data/spec/dummy/db/migrate/20130128142904_preferences.droom.rb +11 -0
  374. data/spec/dummy/db/migrate/20130128142905_users_in_droom.droom.rb +59 -0
  375. data/spec/dummy/db/migrate/20130130120631_folder_ancestry_to_parents.droom.rb +8 -0
  376. data/spec/dummy/db/migrate/20130201103737_mobile_phones.droom.rb +8 -0
  377. data/spec/dummy/db/migrate/20130201103738_mailing_lists.droom.rb +38 -0
  378. data/spec/dummy/db/schema.rb +327 -0
  379. data/spec/dummy/log/sunspot-solr-test.log.1 +222 -0
  380. data/spec/dummy/public/404.html +26 -0
  381. data/spec/dummy/public/422.html +26 -0
  382. data/spec/dummy/public/500.html +25 -0
  383. data/spec/dummy/public/favicon.ico +0 -0
  384. data/spec/dummy/public/system/droom/documents/files/000/000/001/original/frog.png +0 -0
  385. data/spec/dummy/public/system/droom/documents/files/000/000/001/original/rat.png +0 -0
  386. data/spec/dummy/script/rails +6 -0
  387. data/spec/dummy/solr/conf/admin-extra.html +31 -0
  388. data/spec/dummy/solr/conf/elevate.xml +36 -0
  389. data/spec/dummy/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
  390. data/spec/dummy/solr/conf/protwords.txt +21 -0
  391. data/spec/dummy/solr/conf/schema.xml +238 -0
  392. data/spec/dummy/solr/conf/scripts.conf +24 -0
  393. data/spec/dummy/solr/conf/solrconfig.xml +934 -0
  394. data/spec/dummy/solr/conf/spellings.txt +2 -0
  395. data/spec/dummy/solr/conf/stopwords.txt +58 -0
  396. data/spec/dummy/solr/conf/synonyms.txt +31 -0
  397. data/spec/dummy/solr/data/development/index/segments.gen +0 -0
  398. data/spec/dummy/solr/data/development/index/segments_1 +0 -0
  399. data/spec/dummy/solr/data/development/spellchecker/segments.gen +0 -0
  400. data/spec/dummy/solr/data/development/spellchecker/segments_1 +0 -0
  401. data/spec/dummy/solr/data/test/index/segments.gen +0 -0
  402. data/spec/dummy/solr/data/test/index/segments_3nu +0 -0
  403. data/spec/dummy/solr/data/test/spellchecker/segments.gen +0 -0
  404. data/spec/dummy/solr/data/test/spellchecker/segments_1 +0 -0
  405. data/spec/dummy/webdav/1/group/rat.png +0 -0
  406. data/spec/dummy/webdav/1/unattached/rat.png +0 -0
  407. data/spec/dummy/webdav/group/rat.png +0 -0
  408. data/spec/dummy/webdav/unattached/rat.png +0 -0
  409. data/spec/dummy/webdav/unattached/rat_v1.png +0 -0
  410. data/spec/factories/agenda_categories.rb +5 -0
  411. data/spec/factories/categories.rb +5 -0
  412. data/spec/factories/documents.rb +16 -0
  413. data/spec/factories/events.rb +41 -0
  414. data/spec/factories/folders.rb +5 -0
  415. data/spec/factories/groups.rb +6 -0
  416. data/spec/factories/memberships.rb +5 -0
  417. data/spec/factories/people.rb +16 -0
  418. data/spec/factories/recurrence_rules.rb +25 -0
  419. data/spec/factories/user.rb +6 -0
  420. data/spec/fixtures/dummy.ics +59 -0
  421. data/spec/fixtures/images/frog.png +0 -0
  422. data/spec/fixtures/images/rat.png +0 -0
  423. data/spec/fixtures/ny.ics +36 -0
  424. data/spec/lib/droom/folders_spec.rb +46 -0
  425. data/spec/lib/droom/lazy_hash_spec.rb +33 -0
  426. data/spec/models/droom/agenda_category_spec.rb +15 -0
  427. data/spec/models/droom/document_spec.rb +76 -0
  428. data/spec/models/droom/event_spec.rb +154 -0
  429. data/spec/models/droom/folder_spec.rb +5 -0
  430. data/spec/models/droom/ical_spec.rb +62 -0
  431. data/spec/models/droom/mailing_list_membership_spec.rb +81 -0
  432. data/spec/models/droom/membership_spec.rb +22 -0
  433. data/spec/models/droom/person_spec.rb +72 -0
  434. data/spec/models/droom/recurrence_rule_spec.rb +81 -0
  435. data/spec/models/droom/user_spec.rb +27 -0
  436. data/spec/models/droom/visibility_spec.rb +6 -0
  437. data/spec/spec_helper.rb +119 -0
  438. data/spec/support/matchers/content_type_matcher.rb +17 -0
  439. metadata +591 -36
  440. data/app/assets/javascripts/droom/calendar.js.coffee +0 -121
  441. data/app/assets/javascripts/droom/drag_sort.js.coffee +0 -22
  442. data/app/assets/javascripts/droom/forms.js.coffee +0 -746
  443. data/app/assets/javascripts/droom/sort.js.coffee +0 -126
  444. data/app/assets/javascripts/droom/suggester.js.coffee +0 -230
  445. data/app/controllers/droom/document_attachments_controller.rb +0 -19
  446. data/app/models/droom/document_link.rb +0 -31
  447. data/app/models/droom/personal_document.rb +0 -98
  448. data/app/views/droom/dashboard/_marginalia.html.haml +0 -3
  449. data/app/views/droom/dashboard/_my_future_events.html.haml +0 -9
  450. data/app/views/droom/dashboard/_my_group_documents.html.haml +0 -6
  451. data/app/views/droom/dashboard/_my_past_events.haml +0 -6
  452. data/app/views/droom/documents/_event_document_form.html.haml +0 -15
  453. data/app/views/droom/errors/bang.html.haml +0 -12
  454. data/app/views/droom/errors/not_allowed.html.haml +0 -12
  455. data/app/views/droom/errors/not_found.html.haml +0 -12
  456. data/app/views/droom/events/_attachment.html.haml +0 -1
  457. data/app/views/droom/events/_attachment_list.html.haml +0 -4
  458. data/app/views/droom/invitations/_attending_people.html.haml +0 -8
  459. data/config/initializers/dav.rb +0 -2
@@ -0,0 +1,61 @@
1
+ # This is a RESTful dropbox authentication controller. The access_token is treated as a resource.
2
+ # Later it might be generalised to handle other oauth tokens.
3
+
4
+ require 'dropbox_sdk'
5
+
6
+ module Droom
7
+ class DropboxTokensController < Droom::EngineController
8
+ respond_to :html, :js, :json
9
+ layout :no_layout_if_pjax
10
+ before_filter :authenticate_user!
11
+
12
+ before_filter :get_token, :only => [:show, :destroy]
13
+ skip_before_filter :verify_authenticity_token, :only => :create
14
+
15
+ def new
16
+ dbsession = DropboxSession.new(Droom.dropbox_app_key, Droom.dropbox_app_secret)
17
+ session[:dropbox_session] = dbsession.serialize
18
+ redirect_to dbsession.get_authorize_url(droom.register_dropbox_tokens_url)
19
+ end
20
+
21
+ def create
22
+ if params[:oauth_token]
23
+ dbsession = DropboxSession.deserialize(session[:dropbox_session])
24
+ response = dbsession.get_access_token
25
+ Rails.logger.warn ">>> get_access_token: #{response.inspect}"
26
+ @dropbox_token = current_user.dropbox_tokens.create(:access_token => response.key, :access_token_secret => response.secret)
27
+ session[:dropbox_session] = dbsession.serialize
28
+ flash[:panel] = 'dropbox'
29
+ redirect_to main_app.dashboard_url
30
+ else
31
+ redirect_to new_dropbox_token_url
32
+ end
33
+ end
34
+
35
+ def show
36
+ respond_with @dropbox_token
37
+ end
38
+
39
+ def destroy
40
+ @dropbox_token.destroy
41
+ flash[:panel] = 'dropbox'
42
+ flash[:notice] = t(:dropbox_access_revoked)
43
+ redirect_to main_app.dashboard_url
44
+ end
45
+
46
+ protected
47
+
48
+ def get_token
49
+ @dropbox_token = DropboxToken.find(params[:id])
50
+ end
51
+
52
+ def get_dropbox_session
53
+ if session[:dropbox_session]
54
+ @dbsession = DropboxSession.deserialize(session[:dropbox_session])
55
+ else
56
+ @dbsession = DropboxSession.new(Droom.dropbox_app_key, Droom.dropbox_app_secret)
57
+ end
58
+ end
59
+
60
+ end
61
+ end
@@ -1,32 +1,17 @@
1
+ require 'dropbox_sdk'
2
+
1
3
  module Droom
2
4
  class EngineController < ::ApplicationController
3
- helper Droom::DroomHelper
4
- rescue_from "ActiveRecord::RecordNotFound", :with => :rescue_not_found
5
- rescue_from "Droom::PermissionDenied", :with => :rescue_not_allowed
6
- rescue_from "Droom::DroomError", :with => :rescue_bang
5
+
6
+ before_filter :authenticate_user!
7
+ before_filter :note_current_user
8
+
7
9
  protected
8
10
 
9
11
  def require_admin!
10
12
  raise Droom::PermissionDenied unless current_user && current_user.admin?
11
13
  end
12
14
 
13
- def rescue_not_found(exception)
14
- @exception = exception
15
- render :template => 'droom/errors/not_found', :status => :not_found
16
- end
17
-
18
- def rescue_not_allowed(exception)
19
- @exception = exception
20
- render :template => 'droom/errors/not_allowed', :status => :permission_denied
21
- end
22
-
23
- def rescue_bang(exception)
24
- @exception = exception
25
- render :template => 'droom/errors/bang', :status => 500
26
- end
27
-
28
- protected
29
-
30
15
  def no_layout_if_pjax
31
16
  if request.headers['X-PJAX']
32
17
  false
@@ -35,8 +20,8 @@ module Droom
35
20
  end
36
21
  end
37
22
 
38
- def get_current_person
39
- @current_person = current_user.person if current_user
23
+ def note_current_user
24
+ Droom::User.current = current_user
40
25
  end
41
26
 
42
27
  end
@@ -4,15 +4,16 @@ module Droom
4
4
  require "ri_cal"
5
5
  respond_to :html, :json, :rss, :ics, :js, :zip
6
6
  layout :no_layout_if_pjax
7
-
8
- before_filter :authenticate_user!
7
+
8
+ before_filter :authenticate_user!
9
9
  before_filter :require_admin!, :except => [:index, :show]
10
- before_filter :get_current_person
11
10
  before_filter :numerical_parameters
12
11
  before_filter :get_event, :only => [:show, :edit, :update, :destroy]
12
+ before_filter :find_or_create_calendar, :only => :new
13
13
  before_filter :build_event, :only => [:new, :create]
14
+ before_filter :get_calendar, :only => [:index, :calendar]
14
15
  before_filter :find_events, :only => [:index, :calendar]
15
-
16
+
16
17
  def index
17
18
  respond_with @events do |format|
18
19
  format.js {
@@ -20,7 +21,7 @@ module Droom
20
21
  }
21
22
  end
22
23
  end
23
-
24
+
24
25
  def calendar
25
26
  respond_with @events do |format|
26
27
  format.js {
@@ -28,12 +29,7 @@ module Droom
28
29
  }
29
30
  end
30
31
  end
31
-
32
- def feed
33
- @events = Droom::Event.all
34
- respond_with @events
35
- end
36
-
32
+
37
33
  def show
38
34
  respond_with @event do |format|
39
35
  format.js {
@@ -44,11 +40,11 @@ module Droom
44
40
  }
45
41
  end
46
42
  end
47
-
43
+
48
44
  def new
49
45
  respond_with @event
50
46
  end
51
-
47
+
52
48
  def create
53
49
  if @event.save
54
50
  render :partial => "created"
@@ -56,11 +52,11 @@ module Droom
56
52
  respond_with @event
57
53
  end
58
54
  end
59
-
55
+
60
56
  def edit
61
57
 
62
58
  end
63
-
59
+
64
60
  def update
65
61
  @event.update_attributes(params[:event])
66
62
  if @event.save
@@ -69,34 +65,50 @@ module Droom
69
65
  respond_with @event
70
66
  end
71
67
  end
72
-
68
+
73
69
  def destroy
74
70
  @event.destroy
75
71
  head :ok
76
72
  end
77
-
73
+
78
74
  protected
79
-
75
+
80
76
  def build_event
81
77
  params[:event] ||= {}
82
- @event = Droom::Event.new({:start => Time.now}.merge(params[:event]))
78
+ params[:event][:calendar_id] ||= @calendar.id
79
+ @event = Droom::Event.new({:start => Time.now.floor(30.minutes)}.merge(params[:event]))
83
80
  end
84
81
 
85
82
  def get_event
86
83
  @event = Droom::Event.find(params[:id])
87
84
  end
88
-
85
+
89
86
  def find_events
90
- if current_user.admin?
91
- @events = Event.future_and_current
87
+ @events = @calendar.events
88
+ if params[:direction] == 'past'
89
+ @events = @events.past.order('start DESC')
90
+ @direction = "past"
92
91
  else
93
- @events = Event.visible_to(@current_person).future_and_current
92
+ @events = @events.future_and_current.order('start ASC')
93
+ @direction = "future"
94
+ end
95
+ unless current_user.admin?
96
+ @events = @events.visible_to(current_person)
94
97
  end
98
+
95
99
  @show = params[:show] || 10
96
100
  @page = params[:page] || 1
97
- @events.page(@page).per(@show)
101
+ @events = @events.page(@page).per(@show)
102
+ end
103
+
104
+ def get_calendar
105
+ @calendar = Droom::Calendar.find_by_id(params[:calendar_id]) || Droom::Calendar.find_or_create_by_name("main")
106
+ end
107
+
108
+ def find_or_create_calendar
109
+ name = if Droom.required_calendar_names.include?(params[:calendar]) then params[:calendar] else "main" end
110
+ @calendar = Droom::Calendar.find_or_create_by_name(name)
98
111
  end
99
-
100
112
 
101
113
  # months can be passed around either as names or numbers
102
114
  # any date part can be 'now' or 'next' for ease of linking
@@ -104,7 +116,7 @@ module Droom
104
116
  def month_names
105
117
  ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
106
118
  end
107
-
119
+
108
120
  def numerical_parameters
109
121
  if params[:month] && month_names.include?(params[:month].titlecase)
110
122
  params[:month] = month_names.index(params[:month].titlecase)
@@ -115,6 +127,6 @@ module Droom
115
127
  params[p] = params[p].to_i
116
128
  end
117
129
  end
118
-
130
+
119
131
  end
120
132
  end
@@ -0,0 +1,106 @@
1
+ module Droom
2
+ class FoldersController < Droom::EngineController
3
+ respond_to :html, :json, :js, :zip
4
+ layout :no_layout_if_pjax
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]
10
+
11
+ def index
12
+ respond_with @folders do |format|
13
+ format.js {
14
+ render :partial => 'droom/folders/folders'
15
+ }
16
+ end
17
+ end
18
+
19
+ def show
20
+ respond_with @folder do |format|
21
+ format.js {
22
+ render :partial => 'droom/folders/folder'
23
+ }
24
+ format.zip {
25
+ send_file @folder.documents_zipped.path, :type => 'application/zip', :disposition => 'attachment', :filename => "#{@folder.slug}.zip"
26
+ }
27
+ end
28
+ end
29
+
30
+ def new
31
+ respond_with @folder
32
+ end
33
+
34
+ def create
35
+ @folder.update_attributes(params[:folder])
36
+ respond_with @folder do |format|
37
+ format.js { render :partial => "droom/folders/folder" }
38
+ end
39
+ end
40
+
41
+ def edit
42
+ respond_with @folder
43
+ end
44
+
45
+ def update
46
+ @folder.update_attributes(params[:folder])
47
+ respond_with @folder do |format|
48
+ format.js { render :partial => "droom/folders/folder" }
49
+ end
50
+ end
51
+
52
+ def destroy
53
+ @folder.destroy
54
+ head :ok
55
+ end
56
+
57
+ def dropbox
58
+ @folder.copy_to_dropbox(current_user)
59
+ render :partial => "folder"
60
+ end
61
+
62
+ def dav
63
+ @folder.copy_to_dav
64
+ respond_with @folder
65
+ end
66
+
67
+ def with_parent
68
+
69
+ end
70
+
71
+ 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
79
+ end
80
+
81
+ def get_folder
82
+ @folder = Droom::Folder.find(params[:id])
83
+ end
84
+
85
+ def find_folders
86
+ if current_user.admin?
87
+ @folders = Droom::Folder.roots
88
+ else
89
+ @folders = Droom::Folder.visible_to(current_user.person).roots.populated
90
+ end
91
+ end
92
+
93
+ 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
100
+ end
101
+ @roots = @children['root']
102
+ end
103
+
104
+
105
+ end
106
+ end
@@ -4,7 +4,8 @@ module Droom
4
4
  layout :no_layout_if_pjax
5
5
 
6
6
  before_filter :get_event
7
- before_filter :build_group_invitation, :only => [:new, :create]
7
+ before_filter :build_group_invitation, :only => [:new]
8
+ before_filter :find_or_build_group_invitation, :only => [:create]
8
9
  before_filter :get_group_invitation, :only => :destroy
9
10
 
10
11
  def destroy
@@ -18,7 +19,7 @@ module Droom
18
19
  end
19
20
 
20
21
  def new
21
- render :partial => "form"
22
+ respond_with @group_invitation
22
23
  end
23
24
 
24
25
  def create
@@ -31,17 +32,24 @@ module Droom
31
32
 
32
33
  protected
33
34
 
35
+ def get_event
36
+ @event = Droom::Event.find(params[:event_id])
37
+ end
38
+
34
39
  def build_group_invitation
35
- @group_invitation = @event.group_invitations.new(params[:group_invitation])
40
+ @group_invitation = @event.group_invitations.build(params[:group_invitation])
41
+ end
42
+
43
+ def find_or_build_group_invitation
44
+ @group = Droom::Group.find(params[:group_invitation][:group_id])
45
+ unless @group_invitation = @event.group_invitations.for_group(@group).first()
46
+ @group_invitation = @event.group_invitations.build(params[:group_invitation])
47
+ end
36
48
  end
37
49
 
38
50
  def get_group_invitation
39
51
  @group_invitation = @event.group_invitations.find(params[:id])
40
52
  end
41
53
 
42
- def get_event
43
- @event = Droom::Event.find(params[:event_id])
44
- end
45
-
46
54
  end
47
55
  end
@@ -16,13 +16,13 @@ module Droom
16
16
  end
17
17
 
18
18
  def new
19
- render :partial => "form"
19
+ respond_with @group
20
20
  end
21
21
 
22
22
  def show
23
23
  respond_with @group do |format|
24
24
  format.js {
25
- render :partial => 'droom/memberships/memberships'
25
+ render :partial => 'droom/groups/group'
26
26
  }
27
27
  end
28
28
  end
@@ -58,10 +58,10 @@ module Droom
58
58
  def get_group
59
59
  @group = Droom::Group.find(params[:id])
60
60
  end
61
-
61
+
62
62
  def get_groups
63
63
  @groups = Droom::Group.all
64
64
  end
65
-
65
+
66
66
  end
67
67
  end
@@ -3,21 +3,24 @@ module Droom
3
3
  respond_to :js, :html
4
4
  layout :no_layout_if_pjax
5
5
 
6
- before_filter :build_invitation, :only => [:new, :create]
7
- before_filter :get_invitation, :only => :destroy
6
+ before_filter :get_event
7
+ before_filter :build_invitation, :only => [:new]
8
+ before_filter :find_or_build_invitation, :only => [:create]
9
+ before_filter :get_invitation, :only => [:accept, :refuse, :toggle]
8
10
 
9
11
  def destroy
10
- @invitation.destroy
12
+ @invitation = @event.invitations.find_by_id(params[:id])
13
+ @invitation.destroy if @invitation
11
14
  head :ok
12
15
  end
13
16
 
14
17
  def index
15
18
  @event = Droom::Event.find(params[:event_id])
16
- render :partial => 'attending_people'
19
+ render :partial => 'droom/events/invitations'
17
20
  end
18
21
 
19
22
  def new
20
- render :partial => "form"
23
+ respond_with @invitation
21
24
  end
22
25
 
23
26
  def create
@@ -27,16 +30,41 @@ module Droom
27
30
  respond_with @invitation
28
31
  end
29
32
  end
33
+
34
+ def accept
35
+ @invitation.update_attribute(:response, 2)
36
+ render :partial => "droom/invitations/invitation"
37
+ end
38
+
39
+ def refuse
40
+ @invitation.update_attribute(:response, 0)
41
+ render :partial => "droom/invitations/invitation"
42
+ end
30
43
 
31
- protected
44
+ def toggle
45
+ @invitation.update_attribute(:response, @invitation.response == 0 ? 2 : 0)
46
+ render :partial => "droom/invitations/invitation"
47
+ end
48
+
49
+ protected
32
50
 
33
- def build_invitation
51
+ def get_event
34
52
  @event = Droom::Event.find(params[:event_id])
35
- @invitation = @event.invitations.new(params[:invitation])
53
+ end
54
+
55
+ def build_invitation
56
+ @invitation = @event.invitations.build(params[:invitation])
57
+ end
58
+
59
+ def find_or_build_invitation
60
+ @person = Droom::Person.find(params[:invitation][:person_id])
61
+ unless @invitation = @event.invitations.for_person(@person).first()
62
+ @invitation = @event.invitations.build(params[:invitation])
63
+ end
36
64
  end
37
65
 
38
66
  def get_invitation
39
- @invitation = Droom::Invitation.find(params[:id])
67
+ @invitation = @event.invitations.find(params[:id])
40
68
  end
41
69
 
42
70
  end