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,69 @@
1
+ module Droom
2
+ class UsersController < Droom::EngineController
3
+ helper Droom::DroomHelper
4
+ respond_to :html, :js
5
+ layout :no_layout_if_pjax
6
+ before_filter :authenticate_user!
7
+ before_filter :require_admin!, :only => [:index, :new, :create, :destroy]
8
+ before_filter :require_self_or_admin!, :only => [:edit, :update]
9
+ before_filter :remember_token_auth
10
+ before_filter :get_user, :only => :edit
11
+ before_filter :get_user, :only => [:show, :edit, :update, :destroy, :welcome]
12
+
13
+ def index
14
+ @everyone = Droom::Person.all + Droom::User.unpersoned
15
+ end
16
+
17
+ def edit
18
+ respond_with @user
19
+ end
20
+
21
+ # This has to handle small preference updates over js and large account-management forms over html.
22
+ #
23
+ def update
24
+ if @user.update_attributes(params[:user])
25
+ sign_in(@user, :bypass => true) if @user == current_user # changing the password invalidates the session unless we refresh it with the new one
26
+ respond_to do |format|
27
+ format.js {
28
+ partial = params[:response_partial] || "confirmation"
29
+ render :partial => "droom/users/#{partial}"
30
+ }
31
+ format.html {
32
+ if current_user.admin? && @user != current_user
33
+ flash[:notice] = t(:user_updated, :name => @user.name)
34
+ else
35
+ flash[:notice] = t(:your_preferences_saved)
36
+ end
37
+ redirect_to droom.dashboard_url
38
+ }
39
+ end
40
+ else
41
+ render :edit
42
+ end
43
+ end
44
+
45
+ protected
46
+
47
+ def get_user
48
+ if current_user.admin? && params[:id]
49
+ @user = User.find(params[:id])
50
+ else
51
+ @user = current_user
52
+ end
53
+ end
54
+
55
+ private
56
+
57
+ def require_self_or_admin!
58
+ raise Droom::PermissionDenied unless current_user && (current_user.admin? || @user == current_user)
59
+ end
60
+
61
+ def remember_token_auth
62
+ if params[:auth_token] && user_signed_in?
63
+ current_user.remember_me = true
64
+ sign_in current_user
65
+ end
66
+ end
67
+
68
+ end
69
+ end
@@ -3,7 +3,6 @@ module Droom
3
3
  respond_to :json, :html
4
4
 
5
5
  before_filter :authenticate_user!
6
- before_filter :get_current_person
7
6
  before_filter :get_venues, :only => ["index"]
8
7
  before_filter :get_venue, :only => [:show, :update]
9
8
 
@@ -32,7 +31,7 @@ module Droom
32
31
 
33
32
  def get_venue
34
33
  @venue = Venue.find(params[:id])
35
- @events = @venue.events.visible_to(@current_person).future_and_current
34
+ @events = @venue.events.visible_to(current_person).future_and_current
36
35
  end
37
36
 
38
37
  end
@@ -0,0 +1,22 @@
1
+ module Droom
2
+ class YoutubeController < Droom::EngineController
3
+ respond_to :js, :json
4
+ before_filter :authenticate_user!
5
+ layout nil
6
+
7
+ def show
8
+ @video = Droom.yt_client.video_by(params[:yt_id])
9
+ respond_with @video
10
+ end
11
+
12
+ def index
13
+ fragment = params[:term]
14
+ max = params[:limit] || 10
15
+ @suggestions = []
16
+ unless fragment.blank?
17
+ @suggestions = Droom.yt_client.videos_by(:query => fragment, :per_page => max).videos
18
+ end
19
+ respond_with @suggestions
20
+ end
21
+ end
22
+ end
@@ -1,6 +1,94 @@
1
+ require 'dropbox_sdk'
2
+
1
3
  module Droom
2
4
  module DroomHelper
5
+
6
+ def action_menulink(thing, html_options={})
7
+ classname = thing.class.to_s.downcase.underscore.split('/').last
8
+ html_options.reverse_merge!({
9
+ :class => "",
10
+ :data => {:menu => "#{classname}_#{thing.id}"}
11
+ })
12
+ html_options[:class] << " menu"
13
+ link_to t(:edit), "#", html_options if editable?(thing)
14
+ end
15
+
16
+ def action_menu(thing, locals={})
17
+ if editable?(thing)
18
+ type = thing.class.to_s.downcase.underscore
19
+ classname = type.split('/').last
20
+ locals[classname.to_sym] = thing
21
+ render :partial => "#{type.pluralize}/action_menu", :locals => locals
22
+ end
23
+ end
3
24
 
25
+ def dropbox_link(folder)
26
+ if dropbox? && current_user.pref('dropbox.strategy') == 'clicked' && folder.populated? && !folder.dropboxed_for?(current_user)
27
+ link_to t(:copy_to_dropbox), droom.dropbox_folder_url(folder), :id => "dropbox_folder_#{folder.id}", :class => 'dropboxer minimal', :data => {:action => "remove", :removed => "#dropbox_folder_#{folder.id}"}
28
+ end
29
+ end
30
+
31
+ def dropbox_session
32
+ # note that we usually don't want to pick up an existing dropbox session. That happens in the dropbox_tokens_controller, when
33
+ # following up an access token round trip, but in the view any existing session has probably expired and we're better off with a new one.
34
+ DropboxSession.new(Droom.dropbox_app_key, Droom.dropbox_app_secret)
35
+ end
36
+
37
+ def current_person
38
+ current_user.person if current_user
39
+ end
40
+
41
+ def admin?
42
+ current_user and current_user.admin?
43
+ end
44
+
45
+ def pageclass
46
+ controller.controller_name
47
+ end
48
+
49
+ def preference_checkbox(key)
50
+ render :partial => "droom/preferences/checkbox", :locals => {:key => key}
51
+ end
52
+
53
+ def preference_radio_set(key, *values)
54
+ render :partial => "droom/preferences/radio_set", :locals => {:key => key, :values => values}
55
+ end
56
+
57
+ def shorten(text, length=64)
58
+ length = length[:length] if length.is_a?(Hash)
59
+ truncate(strip_tags(text), {:length => length, :separator => " "})
60
+ end
61
+
62
+ def dropbox?
63
+ current_user and !!current_user.dropbox_token
64
+ end
65
+
66
+ def show_dropbox_links?
67
+ dropbox?# && preference is 'clicked'
68
+ end
69
+
70
+ def dropbox_auth_url
71
+ dbs = dropbox_session
72
+ # get an auth link address, with our register action as the callback
73
+ authorization_url = dbs.get_authorize_url(droom.register_dropbox_tokens_url)
74
+ # store the requesting dropbox session, serialized, in our user's session cookie
75
+ # if the oauth confirmation is successful, we will need it.
76
+ session[:dropbox_session] = dbs.serialize
77
+ authorization_url
78
+ end
79
+
80
+ def visible?(thing)
81
+ admin? || privileged? || current_user.can_see?(thing)
82
+ end
83
+
84
+ def editable?(thing)
85
+ admin? || current_user == thing.created_by
86
+ end
87
+
88
+ def deletable?(thing)
89
+ admin? || current_user == thing.created_by
90
+ end
91
+
4
92
  def nav_link_to(name, url, options={})
5
93
  options[:class] ||= ""
6
94
  options[:class] << "here" if (request.path == url) || (request.path =~ /^#{url}/ && url != "/")
@@ -57,18 +145,18 @@ module Droom
57
145
  end
58
146
  end
59
147
  end
60
-
148
+
61
149
  def url_for_month(date)
62
- calendar_url(:year => date.year, :month => date.month)
150
+ droom.events_url(:year => date.year, :month => date.month)
63
151
  end
64
152
 
65
153
  def url_for_date(date)
66
- calendar_url(:year => date.year, :month => date.month, :mday => date.day)
154
+ droom.events_url(:year => date.year, :month => date.month, :mday => date.day)
67
155
  end
68
-
156
+
69
157
  def day_names
70
158
  ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
71
159
  end
72
-
160
+
73
161
  end
74
162
  end
@@ -3,6 +3,13 @@ module Droom
3
3
  attr_accessible :event_id, :category_id
4
4
  belongs_to :category
5
5
  belongs_to :event
6
- belongs_to :created_by, :class_name => Droom.user_class
6
+ belongs_to :created_by, :class_name => "Droom::User"
7
+ has_folder :within => :event
8
+ accepts_nested_attributes_for :category
9
+
10
+ validates :event, :presence => true
11
+ validates :category, :presence => true
12
+
13
+ delegate :slug, :name, :to => :category
7
14
  end
8
15
  end
@@ -0,0 +1,19 @@
1
+ module Droom
2
+ class Calendar < ActiveRecord::Base
3
+ attr_accessible :name, :created_by_id, :events_private, :documents_private
4
+ belongs_to :created_by, :class_name => "Droom::User"
5
+
6
+ before_save :ensure_slug
7
+
8
+ has_many :events
9
+
10
+ def self.for_selection
11
+ self.all.map{|c| [c.name, c.id] }
12
+ end
13
+
14
+ def ensure_slug
15
+ ensure_presence_and_uniqueness_of(:slug, name.parameterize)
16
+ end
17
+
18
+ end
19
+ end
@@ -2,24 +2,22 @@ module Droom
2
2
  class Category < ActiveRecord::Base
3
3
  attr_accessible :name, :description, :slug
4
4
 
5
- belongs_to :created_by, :class_name => 'User'
5
+ belongs_to :created_by, :class_name => "Droom::User"
6
6
  has_many :document_attachments
7
7
 
8
- before_validation :check_slug
8
+ before_validation :ensure_slug
9
9
  validates :slug, :presence => true, :uniqueness => true
10
10
 
11
11
  default_scope order("droom_categories.name ASC")
12
12
 
13
13
  # *for_selection* returns a set of [name, id] pairs suitable for use as select options.
14
14
  def self.for_selection
15
- categories = self.all.map{|c| [c.name, c.id] }
16
- categories.unshift(['', ''])
17
- categories
15
+ self.all.map{|c| [c.name, c.id] }
18
16
  end
19
17
 
20
18
  protected
21
19
 
22
- def check_slug
20
+ def ensure_slug
23
21
  ensure_presence_and_uniqueness_of(:slug, name.parameterize)
24
22
  end
25
23
 
@@ -1,91 +1,86 @@
1
+ require 'open-uri'
2
+ require 'dropbox_sdk'
3
+ require 'yomu'
4
+
1
5
  module Droom
2
6
  class Document < ActiveRecord::Base
3
- attr_accessible :name, :file, :description, :attachment_category_id, :event_id
7
+ attr_accessible :name, :file, :description, :folder, :folder_id
4
8
 
5
- # attachment_category and event_id are used on document creation to create an associated attachment
6
- # this is a temporary shortcut
7
- attr_accessor :old_version, :attachment_category_id, :event_id
9
+ belongs_to :created_by, :class_name => "Droom::User"
10
+ belongs_to :folder
11
+ has_many :dropbox_documents
12
+ has_attached_file :file
8
13
 
9
- belongs_to :created_by, :class_name => 'User'
14
+ after_create :read_and_reindex
15
+
16
+ after_save :update_dropbox_documents
17
+ after_destroy :mark_dropbox_documents_deleted
10
18
 
11
- has_many :document_attachments, :dependent => :destroy
12
- has_many :document_links, :through => :document_attachments
13
- has_many :people, :through => :document_links
14
-
15
- has_attached_file :file
16
-
17
- before_save :set_version
18
19
  validates :file, :presence => true
19
20
 
20
- scope :all_private, where("secret = 1")
21
- scope :not_private, where("secret <> 1")
22
- scope :all_public, where("public = 1 AND secret <> 1")
23
- scope :not_public, where("public <> 1 OR secret = 1)")
24
-
21
+ searchable :auto_index => false, :auto_remove => true do
22
+ text :name, :boost => 10, :stored => true
23
+ text :description, :stored => true
24
+ text :extracted_text, :stored => true
25
+ end
26
+
27
+ scope :all_private, where("private = 1")
28
+ scope :not_private, where("private <> 1 OR private IS NULL")
29
+ scope :all_public, where("public = 1 AND private <> 1 OR private IS NULL")
30
+ scope :not_public, where("public <> 1 OR private = 1)")
31
+
25
32
  scope :visible_to, lambda { |person|
26
33
  if person
27
34
  select('droom_documents.*')
28
- .joins('LEFT OUTER JOIN droom_document_attachments ON droom_documents.id = droom_document_attachments.document_id')
29
- .joins('LEFT OUTER JOIN droom_document_links ON droom_document_attachments.id = droom_document_links.document_attachment_id')
30
- .where(["(droom_documents.public = 1 OR droom_document_links.person_id = ?)", person.id])
35
+ .joins('LEFT OUTER JOIN droom_folders AS df ON droom_documents.folder_id = df.id')
36
+ .joins('LEFT OUTER JOIN droom_personal_folders AS dpf ON df.id = dpf.folder_id')
37
+ .where(["(droom_documents.public = 1 OR dpf.person_id = ?)", person.id])
31
38
  .group('droom_documents.id')
32
39
  else
33
40
  all_public
34
41
  end
35
42
  }
36
-
37
- scope :name_matching, lambda { |fragment|
43
+
44
+ scope :matching, lambda { |fragment|
38
45
  fragment = "%#{fragment}%"
39
- where('droom_documents.name like ?', fragment)
40
- }
41
-
42
- scope :attached_to_these_groups, lambda { |groups|
43
- placeholders = groups.map{'?'}.join(',')
44
- select('droom_documents.*')
45
- .joins('INNER JOIN droom_document_attachments ON droom_documents.id = droom_document_attachments.document_id AND droom_document_attachments.attachee_type = "Droom::Group"')
46
- .where(["droom_document_attachments.attachee_id IN(#{placeholders})", *groups.map(&:id)])
46
+ where('droom_documents.name LIKE :f OR droom_documents.file_file_name LIKE :f', :f => fragment)
47
47
  }
48
48
 
49
- scope :with_latest_event,
50
- select('droom_documents.*, droom_categories.name AS category_name, droom_events.id AS latest_event_id, droom_events.name AS latest_event_name')
51
- .joins('LEFT OUTER JOIN droom_document_attachments AS dda ON droom_documents.id = dda.document_id
52
- LEFT OUTER JOIN droom_categories ON dda.category_id = droom_categories.id
53
- LEFT OUTER JOIN droom_events ON dda.attachee_id = droom_events.id AND dda.attachee_type = "Droom::Event"')
54
- .group('droom_documents.id')
55
-
56
- # so that we can apply the joined finders above to an existing object
57
- #
58
- scope :this_document, lambda { |doc|
59
- where(["droom_documents.id = ?", doc.id])
49
+ scope :in_folders, lambda{ |folders|
50
+ placeholders = folders.map { "?" }.join(',')
51
+ where(["folder_id IN(#{placeholders})", *folders.map(&:id)])
60
52
  }
61
53
 
62
54
  scope :by_date, order("droom_documents.updated_at DESC, droom_documents.created_at DESC")
63
55
 
64
- def identifier
65
- 'document'
56
+ def self.highlight_fields
57
+ [:name, :description, :extracted_text]
58
+ end
59
+
60
+ def attach_to(holder)
61
+ self.folder = holder.folder
62
+ end
63
+
64
+ def detach_from(holder)
65
+ self.folder = nil if self.folder == holder.folder
66
66
  end
67
67
 
68
68
  def file_ok?
69
69
  file.exists?
70
70
  end
71
71
 
72
- def changed_since_creation?
73
- file_updated_at > created_at
74
- end
75
-
76
- def attachment_category_id=(id)
77
- attach_to(Droom::Event.find(event_id), {:category_id => id})
72
+ def original_file
73
+ open(self.file.url)
78
74
  end
79
75
 
80
- def attach_to(attachee, attributes={})
81
- save!
82
- document_attachments.create(attributes.merge(:attachee => attachee))
76
+ def full_path
77
+ "#{folder.path if folder}/#{file_file_name}"
83
78
  end
84
79
 
85
- def detach_from(attachee)
86
- document_attachments.attached_to(attachee).destroy_all
80
+ def changed_since_creation?
81
+ file_updated_at > created_at
87
82
  end
88
-
83
+
89
84
  def file_extension
90
85
  if file_file_name
91
86
  File.extname(file_file_name).sub(/^\./, '')
@@ -93,16 +88,60 @@ module Droom
93
88
  ""
94
89
  end
95
90
  end
96
-
97
- def with_event
98
- self.class.this_document(self).with_latest_event.first
91
+
92
+ def as_suggestion
93
+ {
94
+ :type => 'document',
95
+ :prompt => name,
96
+ :value => name,
97
+ :id => id
98
+ }
99
99
  end
100
-
101
- protected
102
-
103
- def set_version
104
- if file.dirty?
105
- self.version = (version || 0) + 1
100
+
101
+ def as_search_result
102
+ {
103
+ :type => 'document',
104
+ :prompt => name,
105
+ :value => name,
106
+ :id => id
107
+ }
108
+ end
109
+
110
+ def copy_to_dropbox(user)
111
+ dropbox_documents.create(:person_id => user.person.id)
112
+ end
113
+
114
+ def read_and_reindex
115
+ temp = Paperclip.io_adapters.for(self.file)
116
+ data = File.read(temp.path)
117
+ begin
118
+ self.extracted_text = Yomu.read :text, data
119
+ self.extracted_metadata = Yomu.read :metadata, data
120
+ rescue Exception => e
121
+ Rails.logger.warn "Failed to parse document text or metadata from #{file_file_name}: #{e}"
122
+ end
123
+ if self.extracted_text or self.extracted_metadata
124
+ solr_index
125
+ end
126
+ save
127
+ end
128
+ handle_asynchronously :read_and_reindex, :priority => 20
129
+
130
+ def mark_dropbox_documents_deleted
131
+ dropbox_documents.each do |dd|
132
+ dd.mark_deleted(true)
133
+ end
134
+ end
135
+
136
+ def create_dropbox_documents
137
+ # after create, in a delayed job
138
+ # for each user who is syncing our folder, create a dropbox document
139
+ # that is: everyone who has the sync everything preference or who is associated with the holder of this folder
140
+ end
141
+
142
+ def update_dropbox_documents
143
+ dropbox_documents.each do |dd|
144
+ dd.update
106
145
  end
107
146
  end
108
147