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
@@ -1,6 +1,5 @@
1
1
  module Droom
2
2
  class AgendaCategory < ActiveRecord::Base
3
- attr_accessible :event_id, :category_id
4
3
  belongs_to :category
5
4
  belongs_to :event
6
5
  belongs_to :created_by, :class_name => "Droom::User"
@@ -1,18 +1,23 @@
1
1
  module Droom
2
2
  class Calendar < ActiveRecord::Base
3
- attr_accessible :name, :created_by_id, :events_private, :documents_private
3
+ include Droom::Concerns::Slugged
4
+
4
5
  belongs_to :created_by, :class_name => "Droom::User"
5
-
6
- before_save :ensure_slug
7
-
8
6
  has_many :events
7
+
8
+ before_validation :slug_from_name
9
+ validates :slug, :presence => true, :uniqueness => true
9
10
 
10
11
  def self.for_selection
11
12
  self.all.map{|c| [c.name, c.id] }
12
13
  end
13
-
14
- def ensure_slug
15
- ensure_presence_and_uniqueness_of(:slug, name.parameterize)
14
+
15
+ def self.default_calendar
16
+ where(:name => "main").first_or_create
17
+ end
18
+
19
+ def self.stream_calendar
20
+ where(:name => "stream").first_or_create
16
21
  end
17
22
 
18
23
  end
@@ -1,25 +1,19 @@
1
1
  module Droom
2
2
  class Category < ActiveRecord::Base
3
- attr_accessible :name, :description, :slug
4
-
3
+ include Droom::Concerns::Slugged
4
+
5
5
  belongs_to :created_by, :class_name => "Droom::User"
6
6
  has_many :document_attachments
7
7
 
8
- before_validation :ensure_slug
8
+ before_validation :slug_from_name
9
9
  validates :slug, :presence => true, :uniqueness => true
10
10
 
11
- default_scope order("droom_categories.name ASC")
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
15
  self.all.map{|c| [c.name, c.id] }
16
16
  end
17
17
 
18
- protected
19
-
20
- def ensure_slug
21
- ensure_presence_and_uniqueness_of(:slug, name.parameterize)
22
- end
23
-
24
18
  end
25
19
  end
@@ -0,0 +1,21 @@
1
+ module Droom::Concerns::Slugged
2
+ extend ActiveSupport::Concern
3
+
4
+ def slug_from_name
5
+ ensure_presence_of_unique(:slug, name.parameterize)
6
+ end
7
+
8
+ def slug_from_name_and_year
9
+ ensure_presence_of_unique(:slug, "#{year} #{name}".parameterize)
10
+ end
11
+
12
+ def ensure_presence_of_unique(column, base, skope=self.class.all)
13
+ unless self.send "#{column}?".to_sym
14
+ value = base
15
+ addendum = 0
16
+ value = "#{base}_#{addendum+=1}" while skope.find_by(column => value)
17
+ self.send :"#{column}=", value
18
+ end
19
+ end
20
+
21
+ end
@@ -4,10 +4,9 @@ require 'yomu'
4
4
 
5
5
  module Droom
6
6
  class Document < ActiveRecord::Base
7
- attr_accessible :name, :file, :description, :folder, :folder_id
8
-
9
7
  belongs_to :created_by, :class_name => "Droom::User"
10
8
  belongs_to :folder
9
+ belongs_to :scrap, :dependent => :destroy
11
10
  has_many :dropbox_documents
12
11
  has_attached_file :file
13
12
 
@@ -15,39 +14,38 @@ module Droom
15
14
  after_destroy :mark_dropbox_documents_deleted
16
15
 
17
16
  validates :file, :presence => true
17
+ do_not_validate_attachment_file_type :file
18
+
19
+ scope :all_private, -> { where("private = 1") }
20
+ scope :not_private, -> { where("private <> 1 OR private IS NULL") }
21
+ scope :all_public, -> { where("public = 1 AND private <> 1 OR private IS NULL") }
22
+ scope :not_public, -> { where("public <> 1 OR private = 1)") }
18
23
 
19
- scope :all_private, where("private = 1")
20
- scope :not_private, where("private <> 1 OR private IS NULL")
21
- scope :all_public, where("public = 1 AND private <> 1 OR private IS NULL")
22
- scope :not_public, where("public <> 1 OR private = 1)")
23
-
24
- scope :visible_to, lambda { |person|
25
- if person
24
+ scope :visible_to, -> user {
25
+ if user
26
26
  select('droom_documents.*')
27
27
  .joins('LEFT OUTER JOIN droom_folders AS df ON droom_documents.folder_id = df.id')
28
28
  .joins('LEFT OUTER JOIN droom_personal_folders AS dpf ON df.id = dpf.folder_id')
29
- .where(["(droom_documents.public = 1 OR dpf.person_id = ?)", person.id])
29
+ .where(["(droom_documents.public = 1 OR dpf.user_id = ?)", user.id])
30
30
  .group('droom_documents.id')
31
31
  else
32
32
  all_public
33
33
  end
34
34
  }
35
35
 
36
- scope :matching, lambda { |fragment|
36
+ scope :matching, -> fragment {
37
37
  fragment = "%#{fragment}%"
38
38
  where('droom_documents.name LIKE :f OR droom_documents.file_file_name LIKE :f', :f => fragment)
39
39
  }
40
40
 
41
- scope :in_folders, lambda{ |folders|
41
+ scope :in_folders, -> folders{
42
42
  placeholders = folders.map { "?" }.join(',')
43
43
  where(["folder_id IN(#{placeholders})", *folders.map(&:id)])
44
44
  }
45
45
 
46
- scope :by_date, order("droom_documents.updated_at DESC, droom_documents.created_at DESC")
46
+ scope :by_date, -> { order("droom_documents.updated_at DESC, droom_documents.created_at DESC") }
47
47
 
48
- scope :latest, lambda {|limit|
49
- order("droom_documents.updated_at DESC, droom_documents.created_at DESC").limit(limit)
50
- }
48
+ scope :latest, -> limit { order("droom_documents.updated_at DESC, droom_documents.created_at DESC").limit(limit) }
51
49
 
52
50
  def attach_to(holder)
53
51
  self.folder = holder.folder
@@ -100,7 +98,7 @@ module Droom
100
98
  end
101
99
 
102
100
  def copy_to_dropbox(user)
103
- dropbox_documents.create(:person_id => user.person.id)
101
+ dropbox_documents.create(:user => user)
104
102
  end
105
103
 
106
104
  def mark_dropbox_documents_deleted
@@ -1,14 +1,11 @@
1
1
  module Droom
2
2
  class DropboxDocument < ActiveRecord::Base
3
- attr_accessible :person_id
4
-
5
- belongs_to :person
3
+ belongs_to :user
6
4
  belongs_to :document
7
5
 
8
- validates_uniqueness_of :person_id, :scope => :document_id
6
+ validates_uniqueness_of :user_id, :scope => :document_id
9
7
 
10
8
  after_save :get_file
11
-
12
9
  after_destroy :remove_dropbox_document
13
10
 
14
11
  def get_file
@@ -22,7 +19,7 @@ module Droom
22
19
  end
23
20
 
24
21
  def dropbox_client
25
- person.user.dropbox_client
22
+ user.dropbox_client
26
23
  end
27
24
 
28
25
  def deleted=(boolean)
@@ -1,11 +1,10 @@
1
1
  module Droom
2
2
  class DropboxToken < ActiveRecord::Base
3
- attr_accessible :access_token, :access_token_secret, :created_by
4
3
  belongs_to :created_by, :class_name => "Droom::User"
5
4
  after_create :delete_previous
6
5
 
7
- scope :by_date, order("created_at DESC")
8
- scope :other_than, lambda { |token| where "id <> ?", token.id }
6
+ scope :by_date, -> {order("created_at DESC")}
7
+ scope :other_than, -> token { where "id <> ?", token.id }
9
8
 
10
9
  def dropbox_session
11
10
  unless @dbsession
@@ -1,18 +1,21 @@
1
1
  require 'open-uri'
2
2
  require 'uuidtools'
3
- require 'chronic'
4
- require 'ri_cal'
3
+ require 'icalendar'
4
+ require 'date_validator'
5
+ require 'tod'
5
6
 
6
7
  module Droom
7
8
  class Event < ActiveRecord::Base
8
- attr_accessible :start, :finish, :name, :description, :event_set_id, :created_by_id, :uuid, :all_day, :master_id, :url, :start_date, :start_time, :finish_date, :finish_time, :venue, :venue_id, :private, :public, :venue_name, :calendar_id
9
+ include Droom::Concerns::Slugged
10
+ include ActionView::Helpers::SanitizeHelper
9
11
 
10
12
  belongs_to :created_by, :class_name => "Droom::User"
11
13
 
12
- has_folder #... and subfolders via agenda_categories
14
+ belongs_to :event_type
15
+ has_folder :within => :event_type #... and subfolders via agenda_categories
13
16
 
14
17
  has_many :invitations, :dependent => :destroy
15
- has_many :people, :through => :invitations
18
+ has_many :users, :through => :invitations
16
19
 
17
20
  has_many :group_invitations, :dependent => :destroy
18
21
  has_many :groups, :through => :group_invitations
@@ -27,106 +30,72 @@ module Droom
27
30
  accepts_nested_attributes_for :event_set
28
31
 
29
32
  belongs_to :calendar
30
-
31
33
  has_many :scraps
32
34
 
33
- belongs_to :master, :class_name => 'Event'
34
- has_many :occurrences, :class_name => 'Event', :foreign_key => 'master_id', :dependent => :destroy
35
- has_many :recurrence_rules, :dependent => :destroy, :conditions => {:active => true}
36
- accepts_nested_attributes_for :recurrence_rules, :allow_destroy => true
37
-
38
35
  validates :start, :presence => true, :date => true
39
36
  validates :finish, :date => {:after => :start, :allow_nil => true}
40
37
  validates :uuid, :presence => true, :uniqueness => true
41
38
  validates :name, :presence => true
39
+ validates :event_type_id, :presence => true
42
40
 
43
41
  before_validation :set_uuid
44
- before_save :ensure_slug
45
- after_save :update_occurrences
46
-
47
- scope :primary, where("master_id IS NULL")
48
- scope :recurrent, where(:conditions => "master_id IS NOT NULL")
42
+ before_validation :slug_from_name_and_year
43
+ before_validation :set_default_event_type
49
44
 
50
45
  ## Event retrieval in various ways
51
46
  #
52
47
  # Events differ from other models in that they are visible to all unless marked 'private'.
53
48
  # The documents attached to them are only visible to all if marked 'public'.
54
49
  #
55
- scope :all_private, where("private = 1")
56
- scope :not_private, where("private <> 1 OR private IS NULL")
57
- scope :all_public, where("public = 1 AND private <> 1 OR private IS NULL")
58
- scope :not_public, where("public <> 1 OR private = 1)")
59
-
60
- # events are visible by default. Private events are made invisible except to the people
61
- # invited to them.
62
-
63
- scope :visible_to, lambda { |person|
64
- if person
65
- select('droom_events.*')
66
- .joins('LEFT OUTER JOIN droom_invitations ON droom_events.id = droom_invitations.event_id')
67
- .where(["(NOT(droom_events.private = 1) OR droom_invitations.person_id = ?)", person.id])
68
- .group('droom_events.id')
69
- else
70
- all_public
71
- end
72
- }
50
+
51
+ scope :all_private, -> { where("private = 1") }
52
+ scope :not_private, -> { where("private <> 1 OR private IS NULL") }
53
+ scope :all_public, -> { where("public = 1 AND private <> 1 OR private IS NULL") }
54
+ scope :not_public, -> { where("public <> 1 OR private = 1)") }
73
55
 
74
- scope :after, lambda { |datetime| # datetime. eg calendar.occurrences.after(Time.now)
75
- where(['start > ?', datetime])
76
- }
56
+ scope :after, -> datetime { where(['start > ?', datetime]) }
77
57
 
78
- scope :before, lambda { |datetime| # datetime. eg calendar.occurrences.before(Time.now)
79
- where(['start < :date AND (finish IS NULL or finish < :date)', :date => datetime])
80
- }
58
+ scope :before, -> datetime { where(['start < :date AND (finish IS NULL or finish < :date)', :date => datetime]) }
81
59
 
82
- scope :between, lambda { |start, finish| # datetimable objects. eg. Event.between(reader.last_login, Time.now)
83
- where(['start > :start AND start < :finish AND (finish IS NULL or finish < :finish)', :start => start, :finish => finish])
84
- }
60
+ scope :between, -> start, finish { where(['start > :start AND start < :finish AND (finish IS NULL or finish < :finish)', :start => start, :finish => finish]) }
85
61
 
86
- scope :future_and_current, lambda {
87
- where(['(finish > :now) OR (finish IS NULL AND start > :now)', :now => Time.now])
88
- }
62
+ scope :future_and_current, -> { where(['(finish > :now) OR (finish IS NULL AND start > :now)', :now => Time.zone.now]) }
89
63
 
90
- scope :finished, lambda {
91
- where(['(finish < :now) OR (finish IS NULL AND start < :now)', :now => Time.now])
92
- }
64
+ scope :finished, -> { where(['(finish < :now) OR (finish IS NULL AND start < :now)', :now => Time.zone.now]) }
93
65
 
94
- scope :unbegun, lambda {
95
- where(['start > :now', :now => Time.now])
96
- }
66
+ scope :unbegun, -> { where(['start > :now', :now => Time.zone.now])}
97
67
 
98
- scope :by_finish, order("finish ASC")
68
+ scope :by_finish, -> { order("finish ASC") }
99
69
 
100
- scope :coincident_with, lambda { |start, finish| # datetimable objects.
101
- where(['(start < :finish AND finish > :start) OR (finish IS NULL AND start > :start AND start < :finish)', {:start => start, :finish => finish}])
102
- }
70
+ scope :coincident_with, -> start, finish { where(['(start < :finish AND finish >= :start) OR (finish IS NULL AND start >= :start AND start < :finish)', {:start => start, :finish => finish}]) }
103
71
 
104
- scope :limited_to, lambda { |limit|
105
- limit(limit)
106
- }
72
+ scope :limited_to, -> limit { limit(limit) }
107
73
 
108
- scope :at_venue, lambda { |venue| # EventVenue object
109
- where(["venue_id = ?", venue.id])
110
- }
74
+ scope :at_venue, -> venue { where(:venue_id => venue.id) }
75
+
76
+ scope :in_calendar, -> calendar { where(:calendar_id => calendar.id) }
111
77
 
112
- scope :except_these_uuids, lambda { |uuids| # array of uuid strings
78
+ scope :added_since, -> date { where("created_at > ?", date)}
79
+
80
+ scope :except_these_uuids, -> uuids {
113
81
  placeholders = uuids.map{'?'}.join(',')
114
82
  where(["uuid NOT IN (#{placeholders})", *uuids])
115
83
  }
116
84
 
117
- scope :without_invitations_to, lambda { |person| # Person object
85
+ scope :without_invitations_to, -> user {
118
86
  select("droom_events.*")
119
- .joins("LEFT OUTER JOIN droom_invitations ON droom_events.id = droom_invitations.event_id AND droom_invitations.person_id = #{sanitize(person.id)}")
87
+ .joins("LEFT OUTER JOIN droom_invitations ON droom_events.id = droom_invitations.event_id AND droom_invitations.user_id = #{sanitize(user.id)}")
120
88
  .group("droom_events.id")
121
89
  .having("COUNT(droom_invitations.id) = 0")
122
90
  }
123
91
 
124
- scope :with_documents,
92
+ scope :with_documents, -> {
125
93
  select("droom_events.*")
126
94
  .joins("INNER JOIN droom_document_attachments ON droom_events.id = droom_document_attachments.attachee_id AND droom_document_attachments.attachee_type = 'Droom::Event'")
127
95
  .group("droom_events.id")
96
+ }
128
97
 
129
- scope :matching, lambda { |fragment|
98
+ scope :matching, -> fragment {
130
99
  fragment = "%#{fragment}%"
131
100
  where('droom_events.name like :f OR droom_events.description like :f', :f => fragment)
132
101
  }
@@ -134,7 +103,7 @@ module Droom
134
103
  # All of these class methods also return scopes.
135
104
  #
136
105
  def self.in_the_last(period) # seconds. eg calendar.occurrences.in_the_last(1.week)
137
- finish = Time.now
106
+ finish = Time.zone.now
138
107
  start = finish - period
139
108
  between(start, finish)
140
109
  end
@@ -181,8 +150,8 @@ module Droom
181
150
 
182
151
  ## Instance methods
183
152
  #
184
- def invite(person)
185
- self.people << person
153
+ def invite(user)
154
+ self.users << user
186
155
  end
187
156
 
188
157
  def attach(doc)
@@ -196,7 +165,7 @@ module Droom
196
165
  # event.start = "Tuesday at 11pm"
197
166
  # event.start = "12/12/1969 at 10pm"
198
167
  # event.start = "1347354111"
199
- # event.start = Time.now + 1.hour
168
+ # event.start = Time.zone.now + 1.hour
200
169
  #
201
170
  def start=(value)
202
171
  write_attribute :start, parse_date(value)
@@ -205,56 +174,53 @@ module Droom
205
174
  def finish=(value)
206
175
  write_attribute :finish, parse_date(value)
207
176
  end
208
-
177
+
209
178
  # For interface purposes we often want to separate date and time parts. These getters will return the
210
179
  # corresponding Date or Time object.
211
180
  #
212
- # The `time_of_day` gem makes time handling a bit more intuitive by concealing the date part of a Time object.
181
+ # The `tod` gem makes time handling a bit more intuitive by concealing the date part of a Time object.
213
182
  #
183
+
184
+ def start
185
+ tz = timezone || Time.zone
186
+ if start = read_attribute(:start)
187
+ start.in_time_zone(tz)
188
+ end
189
+ end
190
+
214
191
  def start_time
215
- start.time_of_day if start
192
+ start.to_time_of_day if start
216
193
  end
217
194
 
218
195
  def start_date
219
196
  start.to_date if start
220
197
  end
221
198
 
199
+ def finish
200
+ tz = timezone || Time.zone
201
+ if finish = read_attribute(:finish)
202
+ finish.in_time_zone(tz)
203
+ end
204
+ end
205
+
222
206
  def finish_time
223
- finish.time_of_day if finish
207
+ finish.to_time_of_day if finish
224
208
  end
225
209
 
226
210
  def finish_date
227
211
  finish.to_date if finish
228
212
  end
229
-
230
- # And these setters will adjust the current value so that its date or time part corresponds to the given
231
- # value. The value is passed through the same parsing mechanism as above, so:
232
- #
233
- # event.start = "Tuesday at 11pm" -> next Tuesday at 11pm
234
- # event.start_time = "8pm" -> next Tuesday at 8pm
235
- # event.start_date = "Wednesday" -> next Wednesday at 8pm
236
- # event.start_date = "26 February 2016" -> 26/2/16 at 8pm
237
- # event.start_time = "18:00" -> 26/2/16 at 6pm
238
- #
239
- # If the time is set before the date, we default to that time today. Times default to 00:00 in the usual way.
240
- #
241
- def start_time=(value)
242
- self.start = (start_date || Date.today).to_time + parse_date(value).seconds_since_midnight
243
- end
244
213
 
245
- def start_date=(value)
246
- self.start = parse_date(value).to_date# + start_time
214
+ def month
215
+ start.strftime("%m")
247
216
  end
248
217
 
249
- def finish_time=(value)
250
- if value && !value.blank?
251
- time_portion = parse_date(value).seconds_since_midnight
252
- self.finish = (finish_date || start_date || Date.today).to_time + time_portion
253
- end
218
+ def month_name
219
+ start.strftime("%b")
254
220
  end
255
221
 
256
- def finish_date=(value)
257
- self.finish = parse_date(value).to_date# + finish_time
222
+ def year
223
+ start.strftime("%Y")
258
224
  end
259
225
 
260
226
  def duration
@@ -264,17 +230,17 @@ module Droom
264
230
  0
265
231
  end
266
232
  end
267
-
233
+
268
234
  def venue_name
269
235
  venue.name if venue
270
236
  end
271
237
 
272
238
  def venue_name=(name)
273
- self.venue = Droom::Venue.find_or_create_by_name(name)
239
+ self.venue = Droom::Venue.where(name: name).first_or_create
274
240
  end
275
241
 
276
242
  def find_or_create_agenda_category(category)
277
- agenda_categories.find_or_create_by_category_id(category.id)
243
+ agenda_categories.where(category_id: category.id).first_or_create
278
244
  end
279
245
 
280
246
  def categories_for_selection
@@ -283,27 +249,26 @@ module Droom
283
249
  cats
284
250
  end
285
251
 
286
- def attended_by?(person)
287
- person && person.invited_to?(self)
252
+ def attended_by?(user)
253
+ user && user.invited_to?(self)
288
254
  end
289
255
 
290
- def visible_to?(user_or_person)
256
+ def visible_to?(user)
291
257
  return true if self.public?
292
258
  return false if self.private?# || Droom.events_private_by_default?
293
259
  return true
294
260
  end
295
261
 
296
- def detail_visible_to?(user_or_person)
262
+ def detail_visible_to?(user)
297
263
  return true if self.public?
298
- return false unless user_or_person
299
- return true if user_or_person.admin?
300
- return true if user_or_person.privileged?
301
- return true if user_or_person.person.invited_to?(self)
264
+ return false unless user
265
+ return true if user.admin?
266
+ return true if user.invited_to?(self)
302
267
  return false if self.private?
303
268
  return true
304
269
  end
305
270
 
306
- def has_people?
271
+ def has_anyone?
307
272
  invitations.any?
308
273
  end
309
274
 
@@ -320,48 +285,50 @@ module Droom
320
285
  end
321
286
 
322
287
  def continuing?
323
- finish && start < Time.now && finish > Time.now
288
+ finish && start < Time.zone.now && finish > Time.zone.now
324
289
  end
325
290
 
326
291
  def finished?
327
- start < Time.now && (!finish || finish < Time.now)
328
- end
329
-
330
- def recurs?
331
- master || occurrences.any?
332
- end
333
-
334
- def recurrence
335
- recurrence_rules.first.to_s
336
- end
337
-
338
- def add_recurrence(rule)
339
- self.recurrence_rules << Droom::RecurrenceRule.from(rule)
292
+ start < Time.zone.now && (!finish || finish < Time.zone.now)
340
293
  end
341
294
 
342
295
  def url_with_protocol
343
- url =~ /^https?:\/\// ? url : "http://#{url}"
296
+ if url? && url !~ /^https?:\/\//
297
+ "http://#{url}"
298
+ else
299
+ url
300
+ end
344
301
  end
345
302
 
346
303
  def url_without_protocol
347
- url.sub(/^https?:\/\//, '')
348
- end
349
-
350
- def to_rical
351
- RiCal.Event do |cal_event|
352
- cal_event.uid = uuid
353
- cal_event.summary = name
354
- cal_event.description = description if description
355
- cal_event.dtstart = (all_day? ? start_date : start) if start
356
- cal_event.dtend = (all_day? ? finish_date : finish) if finish
357
- cal_event.url = url_with_protocol if url
358
- cal_event.rrules = recurrence_rules.map(&:to_rical) if recurrence_rules.any?
359
- cal_event.location = venue.name if venue
304
+ if url?
305
+ url.sub(/^https?:\/\//, '')
306
+ else
307
+ ""
360
308
  end
361
309
  end
310
+
311
+ def plain_description
312
+ strip_tags(description)
313
+ end
314
+
315
+ def icalendar_event
316
+ event = Icalendar::Event.new
317
+ event.uid = uuid
318
+ event.summary = name
319
+ event.description = plain_description if description?
320
+ event.dtstart = (all_day? ? start_date : start) if start?
321
+ event.dtend = (all_day? ? finish_date : finish) if finish?
322
+ event.url = url_with_protocol if url?
323
+ event.attendees = invitations.accepted.map{|inv| "mailto:#{inv.user.email}"} if invitations.accepted.any?
324
+ event.location = venue.name if venue
325
+ event
326
+ end
362
327
 
363
328
  def to_ics
364
- to_rical.to_s
329
+ cal = Icalendar::Calendar.new
330
+ cal.add_event(icalendar_event)
331
+ cal.to_ical
365
332
  end
366
333
 
367
334
  def as_json(options={})
@@ -387,34 +354,21 @@ module Droom
387
354
  :id => id
388
355
  }
389
356
  end
390
-
391
- protected
392
-
393
- def ensure_slug
394
- ensure_presence_and_uniqueness_of(:slug, "#{start.strftime("%Y %m %d")} #{name}".parameterize)
357
+
358
+ def folder_name
359
+ "#{name} (#{month_name} #{year})"
395
360
  end
396
361
 
362
+ protected
363
+
364
+ # This is mostly for ical/webcal distributions but we also use it in the API.
365
+ #
397
366
  def set_uuid
398
367
  self.uuid = UUIDTools::UUID.timestamp_create.to_s if uuid.blank?
399
368
  end
400
369
 
401
- # doesn't yet observe exceptions
402
- def update_occurrences
403
- occurrences.destroy_all
404
- if recurrence_rules.any?
405
- recurrence_horizon = Time.now + 10.years
406
- to_rical.occurrences(:before => recurrence_horizon).each do |occ|
407
- occurrences.create!({
408
- :name => self.name,
409
- :url => self.url_with_protocol,
410
- :description => self.description,
411
- :venue => self.venue,
412
- :start => occ.dtstart,
413
- :finish => occ.dtend,
414
- :uuid => nil
415
- }) unless occ.dtstart == self.start
416
- end
417
- end
370
+ def set_default_event_type
371
+ self.event_type ||= Droom::EventType.default
418
372
  end
419
373
 
420
374
  def parse_date(value)
@@ -422,7 +376,7 @@ module Droom
422
376
  when Numeric
423
377
  Time.at(value)
424
378
  when String
425
- Chronic.parse(value)
379
+ Time.zone.parse(value)
426
380
  else
427
381
  value
428
382
  end