droom 0.4.3 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (396) hide show
  1. checksums.yaml +7 -0
  2. data/app/assets/images/droom/admin_menu.png +0 -0
  3. data/app/assets/images/droom/applications_menu.png +0 -0
  4. data/app/assets/images/droom/arrows_small.png +0 -0
  5. data/app/assets/images/droom/config_menu.png +0 -0
  6. data/app/assets/images/droom/dropdown.png +0 -0
  7. data/app/assets/images/droom/menu/asterisk.png +0 -0
  8. data/app/assets/images/droom/{smalladd.png → menu/smalladd.png} +0 -0
  9. data/app/assets/images/droom/{small_asterisk.png → menu/smallasterisk.png} +0 -0
  10. data/app/assets/images/droom/{smalldelete.png → menu/smalldelete.png} +0 -0
  11. data/app/assets/images/droom/{smalldownload.png → menu/smalldownload.png} +0 -0
  12. data/app/assets/images/droom/{smalledit.png → menu/smalledit.png} +0 -0
  13. data/app/assets/images/droom/message.png +0 -0
  14. data/app/assets/images/droom/missing/scrap.jpg +0 -0
  15. data/app/assets/images/droom/missing/scrap.png +0 -0
  16. data/app/assets/images/droom/missing/thumb.png +0 -0
  17. data/app/assets/images/droom/missing/user.png +0 -0
  18. data/app/assets/images/droom/object_icons.png +0 -0
  19. data/app/assets/images/droom/panel/add.png +0 -0
  20. data/app/assets/images/droom/panel/edit.png +0 -0
  21. data/app/assets/images/droom/panel/manage.png +0 -0
  22. data/app/assets/images/droom/pointer_upwards.png +0 -0
  23. data/app/assets/images/droom/search_menu.png +0 -0
  24. data/app/assets/images/droom/setter.png +0 -0
  25. data/app/assets/images/droom/small_icons.png +0 -0
  26. data/app/assets/images/droom/stream/closer.png +0 -0
  27. data/app/assets/images/droom/stream/next.png +0 -0
  28. data/app/assets/images/droom/stream/prev.png +0 -0
  29. data/app/assets/images/droom/stream/previous.png +0 -0
  30. data/app/assets/images/droom/subscribe.png +0 -0
  31. data/app/assets/javascripts/droom.js.coffee +23 -13
  32. data/app/assets/javascripts/droom/actions.js.coffee +104 -10
  33. data/app/assets/javascripts/droom/ajax.js.coffee +36 -24
  34. data/app/assets/javascripts/droom/extensions.js.coffee +13 -0
  35. data/app/assets/javascripts/droom/lib/jquery.datepicker.js +1026 -0
  36. data/app/assets/javascripts/droom/lib/jquery.deserialize.js +142 -0
  37. data/app/assets/javascripts/droom/lib/jquery_ujs.js +416 -0
  38. data/app/assets/javascripts/droom/lib/swipe.js +568 -0
  39. data/app/assets/javascripts/droom/lib/underscore.js +1276 -0
  40. data/app/assets/javascripts/droom/popups.js.coffee +98 -37
  41. data/app/assets/javascripts/droom/stream.js.coffee +119 -77
  42. data/app/assets/javascripts/droom/utilities.js.coffee +25 -3
  43. data/app/assets/javascripts/droom/widgets.js.coffee +318 -253
  44. data/app/assets/stylesheets/droom.css.sass +482 -955
  45. data/app/assets/stylesheets/droom/_mixins.css.sass +12 -42
  46. data/app/assets/stylesheets/droom/_popups.css.sass +28 -11
  47. data/app/assets/stylesheets/droom/_stream.css.sass +375 -0
  48. data/app/assets/stylesheets/droom/_toolbar.css.sass +0 -6
  49. data/app/assets/stylesheets/droom/_variables.css.sass +4 -2
  50. data/app/controllers/droom/agenda_categories_controller.rb +6 -14
  51. data/app/controllers/droom/api/api_controller.rb +56 -0
  52. data/app/controllers/droom/api/events_controller.rb +74 -0
  53. data/app/controllers/droom/api/users_controller.rb +92 -0
  54. data/app/controllers/droom/api/venues_controller.rb +71 -0
  55. data/app/controllers/droom/calendars_controller.rb +4 -10
  56. data/app/controllers/droom/{user_confirmations_controller.rb → confirmations_controller.rb} +8 -7
  57. data/app/controllers/droom/dashboard_controller.rb +2 -19
  58. data/app/controllers/droom/documents_controller.rb +12 -60
  59. data/app/controllers/droom/dropbox_tokens_controller.rb +3 -4
  60. data/app/controllers/droom/engine_controller.rb +39 -11
  61. data/app/controllers/droom/events_controller.rb +62 -84
  62. data/app/controllers/droom/folders_controller.rb +30 -40
  63. data/app/controllers/droom/group_invitations_controller.rb +6 -23
  64. data/app/controllers/droom/group_permissions_controller.rb +26 -0
  65. data/app/controllers/droom/groups_controller.rb +10 -14
  66. data/app/controllers/droom/invitations_controller.rb +7 -25
  67. data/app/controllers/droom/memberships_controller.rb +13 -18
  68. data/app/controllers/droom/organisations_controller.rb +6 -25
  69. data/app/controllers/droom/permissions_controller.rb +50 -0
  70. data/app/controllers/droom/preferences_controller.rb +9 -10
  71. data/app/controllers/droom/scraps_controller.rb +23 -26
  72. data/app/controllers/droom/services_controller.rb +50 -0
  73. data/app/controllers/droom/suggestions_controller.rb +6 -4
  74. data/app/controllers/droom/users/confirmations_controller.rb +24 -0
  75. data/app/controllers/droom/users/passwords_controller.rb +39 -0
  76. data/app/controllers/droom/users/sessions_controller.rb +7 -0
  77. data/app/controllers/droom/users_controller.rb +60 -38
  78. data/app/controllers/droom/venues_controller.rb +8 -15
  79. data/app/controllers/droom/youtube_controller.rb +1 -1
  80. data/app/helpers/droom/droom_helper.rb +22 -17
  81. data/app/models/droom/ability.rb +81 -0
  82. data/app/models/droom/agenda_category.rb +0 -1
  83. data/app/models/droom/calendar.rb +12 -7
  84. data/app/models/droom/category.rb +4 -10
  85. data/app/models/droom/concerns/slugged.rb +21 -0
  86. data/app/models/droom/document.rb +15 -17
  87. data/app/models/droom/dropbox_document.rb +3 -6
  88. data/app/models/droom/dropbox_token.rb +2 -3
  89. data/app/models/droom/event.rb +117 -163
  90. data/app/models/droom/event_type.rb +25 -0
  91. data/app/models/droom/folder.rb +36 -48
  92. data/app/models/droom/group.rb +35 -27
  93. data/app/models/droom/group_invitation.rb +7 -10
  94. data/app/models/droom/group_permission.rb +29 -0
  95. data/app/models/droom/invitation.rb +14 -23
  96. data/app/models/droom/mailing_list_membership.rb +0 -1
  97. data/app/models/droom/membership.rb +32 -31
  98. data/app/models/droom/organisation.rb +6 -3
  99. data/app/models/droom/permission.rb +19 -0
  100. data/app/models/droom/personal_folder.rb +9 -21
  101. data/app/models/droom/preference.rb +1 -2
  102. data/app/models/droom/scrap.rb +31 -26
  103. data/app/models/droom/service.rb +31 -0
  104. data/app/models/droom/tag.rb +10 -9
  105. data/app/models/droom/tagging.rb +1 -1
  106. data/app/models/droom/user.rb +453 -130
  107. data/app/models/droom/user_permission.rb +8 -0
  108. data/app/models/droom/venue.rb +21 -32
  109. data/app/serializers/droom/user_serializer.rb +45 -0
  110. data/app/serializers/droom/venue_serializer.rb +5 -0
  111. data/app/views/droom/dashboard/_documents.html.haml +1 -1
  112. data/app/views/droom/dashboard/_folders.html.haml +1 -1
  113. data/app/views/droom/dashboard/_future_events.html.haml +10 -8
  114. data/app/views/droom/dashboard/_groups.html.haml +1 -1
  115. data/app/views/droom/dashboard/_past_events.haml +19 -12
  116. data/app/views/droom/dashboard/_stream.html.haml +2 -2
  117. data/app/views/droom/{users/_extra_columns.html.haml → dashboard/_welcome.html.haml} +0 -0
  118. data/app/views/droom/dashboard/index.html.haml +3 -0
  119. data/app/views/droom/documents/_document.html.haml +0 -2
  120. data/app/views/droom/documents/_documents.html.haml +1 -1
  121. data/app/views/droom/documents/_documents_list.html.haml +1 -1
  122. data/app/views/droom/documents/_documents_table.html.haml +1 -1
  123. data/app/views/droom/documents/_form.html.haml +8 -5
  124. data/app/views/droom/documents/_listing.html.haml +4 -2
  125. data/app/views/droom/documents/index.html.haml +13 -7
  126. data/app/views/droom/documents/new.html.haml +1 -4
  127. data/app/views/droom/events/_action_menu.html.haml +2 -2
  128. data/app/views/droom/events/_attachments.html.haml +8 -0
  129. data/app/views/droom/events/_calendar.html.haml +4 -8
  130. data/app/views/droom/events/_event.html.haml +44 -63
  131. data/app/views/droom/events/_event_line.html.haml +1 -1
  132. data/app/views/droom/events/_events.html.haml +18 -2
  133. data/app/views/droom/events/_form.html.haml +26 -19
  134. data/app/views/droom/events/_invitations.html.haml +7 -3
  135. data/app/views/droom/events/_scrap_events.html.haml +8 -0
  136. data/app/views/droom/events/_suggested.html.haml +4 -1
  137. data/app/views/droom/events/calendar.html.haml +8 -0
  138. data/app/views/droom/events/index.html.haml +24 -26
  139. data/app/views/droom/events/show.html.haml +6 -6
  140. data/app/views/droom/folders/_contents.html.haml +34 -4
  141. data/app/views/droom/folders/_folder.html.haml +7 -2
  142. data/app/views/droom/folders/_form.html.haml +11 -8
  143. data/app/views/droom/folders/index.html.haml +19 -22
  144. data/app/views/droom/group_invitations/_attending_groups.html.haml +1 -1
  145. data/app/views/droom/group_permissions/_toggle.html.haml +18 -0
  146. data/app/views/droom/groups/_action_menu.haml +0 -2
  147. data/app/views/droom/groups/_created.html.haml +0 -1
  148. data/app/views/droom/groups/_form.html.haml +3 -0
  149. data/app/views/droom/groups/_group.html.haml +10 -8
  150. data/app/views/droom/groups/_groups.html.haml +1 -1
  151. data/app/views/droom/groups/_search_result.html.haml +1 -1
  152. data/app/views/droom/groups/_suggested.html.haml +1 -1
  153. data/app/views/droom/groups/index.html.haml +15 -16
  154. data/app/views/droom/invitations/_form.html.haml +1 -1
  155. data/app/views/droom/invitations/_invitation.html.haml +1 -1
  156. data/app/views/droom/invitations/_invitations.html.haml +4 -4
  157. data/app/views/droom/memberships/_button.html.haml +5 -5
  158. data/app/views/droom/memberships/_form.html.haml +26 -7
  159. data/app/views/droom/memberships/_member.html.haml +1 -1
  160. data/app/views/droom/memberships/{_membership_toggle.html.haml → _toggle.html.haml} +4 -4
  161. data/app/views/droom/memberships/index.html.haml +9 -0
  162. data/app/views/droom/organisations/_action_menu.html.haml +1 -1
  163. data/app/views/droom/organisations/_organisation.html.haml +2 -2
  164. data/app/views/droom/organisations/_suggested.html.haml +1 -1
  165. data/app/views/droom/organisations/index.html.haml +11 -11
  166. data/app/views/droom/panels/_admin.html.haml +2 -2
  167. data/app/views/droom/panels/_configuration.html.haml +28 -0
  168. data/app/views/droom/panels/_devices.html.haml +2 -4
  169. data/app/views/droom/panels/_search.html.haml +9 -0
  170. data/app/views/droom/permissions/_action_menu.html.haml +10 -0
  171. data/app/views/droom/permissions/_created.html.haml +3 -0
  172. data/app/views/droom/permissions/_form.html.haml +17 -0
  173. data/app/views/droom/permissions/edit.html.haml +7 -0
  174. data/app/views/droom/permissions/new.html.haml +8 -0
  175. data/app/views/droom/permissions/show.html.haml +4 -0
  176. data/app/views/droom/preferences/_checkbox.html.haml +4 -2
  177. data/app/views/droom/scraps/_caption.html.haml +0 -2
  178. data/app/views/droom/scraps/_credit.html.haml +1 -1
  179. data/app/views/droom/scraps/_form.html.haml +68 -69
  180. data/app/views/droom/scraps/_preload.html.haml +4 -0
  181. data/app/views/droom/scraps/_stream.html.haml +11 -3
  182. data/app/views/droom/scraps/_thumb.html.haml +33 -1
  183. data/app/views/droom/scraps/edit.html.haml +6 -1
  184. data/app/views/droom/scraps/full/_document.html.haml +4 -3
  185. data/app/views/droom/scraps/full/_event.html.haml +17 -16
  186. data/app/views/droom/scraps/full/_image.html.haml +1 -2
  187. data/app/views/droom/scraps/full/_link.html.haml +4 -3
  188. data/app/views/droom/scraps/full/_quote.html.haml +4 -7
  189. data/app/views/droom/scraps/full/_text.html.haml +3 -2
  190. data/app/views/droom/scraps/full/_video.html.haml +2 -2
  191. data/app/views/droom/scraps/new.html.haml +6 -1
  192. data/app/views/droom/scraps/show.html.haml +4 -3
  193. data/app/views/droom/services/_action_menu.html.haml +12 -0
  194. data/app/views/droom/services/_created.html.haml +3 -0
  195. data/app/views/droom/services/_form.html.haml +18 -0
  196. data/app/views/droom/services/_services.html.haml +44 -0
  197. data/app/views/droom/services/edit.html.haml +7 -0
  198. data/app/views/droom/services/index.html.haml +5 -0
  199. data/app/views/droom/{people → services}/new.html.haml +4 -3
  200. data/app/views/droom/services/show.html.haml +4 -0
  201. data/app/views/droom/shared/_controls.html.haml +2 -2
  202. data/app/views/droom/shared/_navigation.html.haml +2 -2
  203. data/app/views/droom/shared/_toolbar.html.haml +1 -1
  204. data/app/views/droom/suggestions/index.html.haml +1 -0
  205. data/app/views/droom/users/_action_menu.html.haml +21 -0
  206. data/app/views/droom/users/_suggested.html.haml +14 -0
  207. data/app/views/droom/users/_user.html.haml +2 -2
  208. data/app/views/droom/users/_users.html.haml +7 -0
  209. data/app/views/droom/users/_users_table.html.haml +21 -22
  210. data/app/views/droom/users/admin.html.haml +10 -0
  211. data/app/views/droom/users/confirmations/_after_confirmation.html.haml +2 -0
  212. data/app/views/droom/users/confirmations/_password_required.html.haml +30 -0
  213. data/app/views/droom/users/confirmations/failure.en.html.haml +22 -0
  214. data/app/views/droom/users/confirmations/show.html.haml +13 -0
  215. data/app/views/droom/users/edit.html.haml +2 -10
  216. data/app/views/droom/users/edit/_details.html.haml +13 -0
  217. data/app/views/droom/users/edit/_memberships.html.haml +13 -0
  218. data/app/views/droom/users/edit/_password_fields.html.haml +16 -0
  219. data/app/views/droom/users/edit/_preferences.html.haml +37 -0
  220. data/app/views/droom/users/edit/_profile.html.haml +26 -0
  221. data/app/views/droom/users/edit/_user_fields.html.haml +66 -0
  222. data/app/views/droom/users/index.html.haml +6 -32
  223. data/app/views/droom/users/new.html.haml +3 -0
  224. data/app/views/droom/users/passwords/completed.html.haml +13 -0
  225. data/app/views/{devise → droom/users}/passwords/edit.html.haml +10 -4
  226. data/app/views/{devise → droom/users}/passwords/new.html.haml +4 -3
  227. data/app/views/droom/users/passwords/show.html.haml +6 -0
  228. data/app/views/droom/users/show.html.haml +2 -0
  229. data/app/views/droom/users/show/_listed.html.haml +46 -0
  230. data/app/views/droom/users/show/_profile.html.haml +33 -0
  231. data/app/views/droom/users/show/_tabled.html.haml +28 -0
  232. data/config/initializers/chronic.rb +2 -0
  233. data/config/initializers/devise.rb +35 -2
  234. data/config/initializers/paperclip.rb +11 -6
  235. data/config/locales/devise.en.yml +1 -1
  236. data/config/locales/en.yml +198 -103
  237. data/config/routes.rb +37 -45
  238. data/db/migrate/20130207123614_stream.rb +5 -1
  239. data/db/migrate/20130225095328_create_droom_calendars.rb +0 -1
  240. data/db/migrate/20130627065459_permissions.rb +34 -0
  241. data/db/migrate/20130627071938_users_take_over.rb +38 -0
  242. data/db/migrate/20130627073759_user_properties.rb +34 -0
  243. data/db/migrate/20130627080021_no_more_people.rb +11 -0
  244. data/db/migrate/20130701122935_directory_groups.rb +8 -0
  245. data/db/migrate/20130701123152_remove_old_access_control.rb +16 -0
  246. data/db/migrate/20130729102857_more_scrap_data.rb +12 -0
  247. data/db/migrate/20130904080340_international_names.rb +17 -0
  248. data/db/migrate/20130904080341_honours.rb +5 -0
  249. data/db/migrate/20131124082222_simple_addresses.rb +25 -0
  250. data/db/migrate/20131201093351_event_time_zone.rb +5 -0
  251. data/db/migrate/20131217060311_session_revocable.rb +5 -0
  252. data/db/migrate/20131219180311_event_types.rb +15 -0
  253. data/lib/devise/strategies/cookie_authenticatable.rb +46 -0
  254. data/lib/droom.rb +48 -33
  255. data/lib/droom/auth_cookie.rb +82 -0
  256. data/lib/droom/cropper.rb +24 -0
  257. data/lib/droom/engine.rb +20 -2
  258. data/lib/droom/folders.rb +6 -6
  259. data/lib/droom/lazy_hash.rb +11 -1
  260. data/lib/droom/monkeys.rb +6 -6
  261. data/lib/droom/taggability.rb +1 -1
  262. data/lib/droom/validators.rb +1 -1
  263. data/lib/droom/version.rb +1 -1
  264. data/lib/generators/droom/install/templates/droom_initializer.rb +10 -2
  265. data/lib/paperclip/geometry_transformation.rb +80 -0
  266. data/lib/paperclip/validators/attachment_height_validator.rb +89 -0
  267. data/lib/paperclip/validators/attachment_width_validator.rb +89 -0
  268. data/lib/paperclip_processors/offset_thumbnail.rb +85 -0
  269. data/spec/dummy/config/application.rb +0 -7
  270. data/spec/dummy/config/environments/development.rb +1 -10
  271. data/spec/dummy/config/environments/production.rb +1 -0
  272. data/spec/dummy/config/environments/test.rb +2 -7
  273. data/spec/dummy/db/migrate/20130130120631_folder_ancestry_to_parents.droom.rb +1 -1
  274. data/spec/dummy/db/migrate/20130724124758_dropbox_tokens.droom.rb +10 -0
  275. data/spec/dummy/db/migrate/20130724124759_preference_uuids.droom.rb +6 -0
  276. data/spec/dummy/db/migrate/20130724124760_stream.droom.rb +14 -0
  277. data/spec/dummy/db/migrate/20130724124761_access_token_secret.droom.rb +6 -0
  278. data/spec/dummy/db/migrate/20130724124762_person_image.droom.rb +10 -0
  279. data/spec/dummy/db/migrate/20130724124763_devise_confirmable.droom.rb +14 -0
  280. data/spec/dummy/db/migrate/20130724124764_create_droom_calendars.droom.rb +20 -0
  281. data/spec/dummy/db/migrate/20130724124765_give_scraps_document.droom.rb +6 -0
  282. data/spec/dummy/db/migrate/20130724124766_privateness.droom.rb +10 -0
  283. data/spec/dummy/db/migrate/20130724124767_store_metadata.droom.rb +6 -0
  284. data/spec/dummy/db/migrate/20130724124768_folders_nicely.droom.rb +7 -0
  285. data/spec/dummy/db/migrate/20130724124769_niceties.droom.rb +8 -0
  286. data/spec/dummy/db/migrate/20130724124770_create_droom_dropbox_documents.droom.rb +12 -0
  287. data/spec/dummy/db/migrate/20130724124771_dropbox_documents_changed.droom.rb +6 -0
  288. data/spec/dummy/db/migrate/20130724124772_user_titles.droom.rb +6 -0
  289. data/spec/dummy/db/migrate/20130724124773_permissions.droom.rb +35 -0
  290. data/spec/dummy/db/migrate/20130724124774_users_take_over.droom.rb +39 -0
  291. data/spec/dummy/db/migrate/20130724124775_user_properties.droom.rb +35 -0
  292. data/spec/dummy/db/migrate/20130724124776_no_more_people.droom.rb +12 -0
  293. data/spec/dummy/db/migrate/20130724124777_directory_groups.droom.rb +9 -0
  294. data/spec/dummy/db/migrate/20130724124778_remove_old_access_control.droom.rb +17 -0
  295. data/spec/dummy/db/schema.rb +217 -140
  296. data/spec/factories/documents.rb +0 -5
  297. data/spec/factories/events.rb +0 -9
  298. data/spec/factories/user.rb +4 -2
  299. data/spec/lib/droom/folders_spec.rb +8 -8
  300. data/spec/models/droom/document_spec.rb +6 -43
  301. data/spec/models/droom/event_spec.rb +0 -34
  302. data/spec/models/droom/mailing_list_membership_spec.rb +4 -4
  303. data/spec/models/droom/membership_spec.rb +2 -2
  304. data/spec/spec_helper.rb +1 -10
  305. metadata +322 -282
  306. data/app/assets/images/droom/Untitled-1.png +0 -0
  307. data/app/assets/images/droom/asterisk.png +0 -0
  308. data/app/assets/images/droom/smallmanage.png +0 -0
  309. data/app/assets/javascripts/droom/lib/kalendae.js +0 -1692
  310. data/app/assets/stylesheets/lib/_kalendae.css.sass +0 -139
  311. data/app/controllers/droom/pages_controller.rb +0 -61
  312. data/app/controllers/droom/people_controller.rb +0 -111
  313. data/app/models/droom/document_attachment.rb +0 -37
  314. data/app/models/droom/page.rb +0 -26
  315. data/app/models/droom/person.rb +0 -309
  316. data/app/models/droom/recurrence_rule.rb +0 -82
  317. data/app/models/droom/user_action_observer.rb +0 -12
  318. data/app/views/devise/confirmations/failure.en.html.haml +0 -20
  319. data/app/views/devise/confirmations/show.html.haml +0 -19
  320. data/app/views/droom/confirmations/show.html.haml +0 -40
  321. data/app/views/droom/documents/_document_line.html.haml +0 -2
  322. data/app/views/droom/events/_created.html.haml +0 -2
  323. data/app/views/droom/folders/_attachments.html.haml +0 -3
  324. data/app/views/droom/pages/_contents.html.haml +0 -10
  325. data/app/views/droom/pages/_form.html.haml +0 -36
  326. data/app/views/droom/pages/_full_page.html.haml +0 -17
  327. data/app/views/droom/pages/_page.html.haml +0 -5
  328. data/app/views/droom/pages/_pages.html.haml +0 -2
  329. data/app/views/droom/pages/admin.html.haml +0 -24
  330. data/app/views/droom/pages/edit.html.haml +0 -1
  331. data/app/views/droom/pages/index.html.haml +0 -10
  332. data/app/views/droom/pages/new.html.haml +0 -4
  333. data/app/views/droom/pages/show.html.haml +0 -5
  334. data/app/views/droom/panels/_account.html.haml +0 -16
  335. data/app/views/droom/panels/_readers.html.haml +0 -18
  336. data/app/views/droom/panels/_suggestions.html.haml +0 -15
  337. data/app/views/droom/people/_action_menu.html.haml +0 -22
  338. data/app/views/droom/people/_created.html.haml +0 -6
  339. data/app/views/droom/people/_form.html.haml +0 -66
  340. data/app/views/droom/people/_listing.html.haml +0 -19
  341. data/app/views/droom/people/_memberships.html.haml +0 -24
  342. data/app/views/droom/people/_people.html.haml +0 -5
  343. data/app/views/droom/people/_person.html.haml +0 -32
  344. data/app/views/droom/people/_search_result.html.haml +0 -14
  345. data/app/views/droom/people/_suggested.html.haml +0 -14
  346. data/app/views/droom/people/edit.html.haml +0 -9
  347. data/app/views/droom/people/index.html.haml +0 -8
  348. data/app/views/droom/people/show.html.haml +0 -31
  349. data/app/views/droom/scraps/_heading.html.haml +0 -16
  350. data/app/views/droom/scraps/thumbs/_document.html.haml +0 -9
  351. data/app/views/droom/scraps/thumbs/_event.html.haml +0 -17
  352. data/app/views/droom/scraps/thumbs/_image.html.haml +0 -6
  353. data/app/views/droom/scraps/thumbs/_link.html.haml +0 -10
  354. data/app/views/droom/scraps/thumbs/_quote.html.haml +0 -8
  355. data/app/views/droom/scraps/thumbs/_text.html.haml +0 -8
  356. data/app/views/droom/scraps/thumbs/_video.html.haml +0 -6
  357. data/app/views/droom/users/_extra_columns_header.html.haml +0 -0
  358. data/app/views/droom/users/_extra_columns_note.html.haml +0 -0
  359. data/app/views/droom/users/_form.html.haml +0 -14
  360. data/app/views/droom/users/_password_fields.html.haml +0 -15
  361. data/app/views/droom/users/_user_or_person.html.haml +0 -72
  362. data/app/views/kaminari/_paginator.html.haml +0 -16
  363. data/lib/droom/dav_resource.rb +0 -36
  364. data/lib/droom/model_helpers.rb +0 -25
  365. data/lib/droom/routing.rb +0 -13
  366. data/spec/datasets/calendar_events_dataset.rb +0 -44
  367. data/spec/datasets/calendar_pages_dataset.rb +0 -8
  368. data/spec/datasets/calendar_sites_dataset.rb +0 -6
  369. data/spec/datasets/calendars_dataset.rb +0 -34
  370. data/spec/datasets/documents_dataset.rb +0 -28
  371. data/spec/datasets/recurrence_dataset.rb +0 -7
  372. data/spec/dummy/config/sunspot.yml +0 -17
  373. data/spec/dummy/log/dav.log +0 -1
  374. data/spec/dummy/log/development.log +0 -2
  375. data/spec/dummy/log/test.log +0 -1
  376. data/spec/dummy/solr/conf/admin-extra.html +0 -31
  377. data/spec/dummy/solr/conf/elevate.xml +0 -36
  378. data/spec/dummy/solr/conf/mapping-ISOLatin1Accent.txt +0 -246
  379. data/spec/dummy/solr/conf/protwords.txt +0 -21
  380. data/spec/dummy/solr/conf/schema.xml +0 -238
  381. data/spec/dummy/solr/conf/scripts.conf +0 -24
  382. data/spec/dummy/solr/conf/solrconfig.xml +0 -934
  383. data/spec/dummy/solr/conf/spellings.txt +0 -2
  384. data/spec/dummy/solr/conf/stopwords.txt +0 -58
  385. data/spec/dummy/solr/conf/synonyms.txt +0 -31
  386. data/spec/dummy/solr/data/development/index/segments.gen +0 -0
  387. data/spec/dummy/solr/data/development/index/segments_1 +0 -0
  388. data/spec/dummy/solr/data/development/spellchecker/segments.gen +0 -0
  389. data/spec/dummy/solr/data/development/spellchecker/segments_1 +0 -0
  390. data/spec/dummy/solr/data/test/index/segments.gen +0 -0
  391. data/spec/dummy/solr/data/test/index/segments_3nu +0 -0
  392. data/spec/dummy/solr/data/test/spellchecker/segments.gen +0 -0
  393. data/spec/dummy/solr/data/test/spellchecker/segments_1 +0 -0
  394. data/spec/factories/recurrence_rules.rb +0 -25
  395. data/spec/models/droom/person_spec.rb +0 -72
  396. data/spec/models/droom/recurrence_rule_spec.rb +0 -81
@@ -0,0 +1,25 @@
1
+ module Droom
2
+ class EventType < ActiveRecord::Base
3
+ include Droom::Concerns::Slugged
4
+
5
+ has_many :events, :dependent => :nullify
6
+ has_folder within: "Events" # here the within arguments sets the name of our parent folder
7
+
8
+ before_validation :slug_from_name
9
+ default_scope -> {order(:name)}
10
+
11
+ def self.for_selection
12
+ self.all.map {|et| [et.name, et.id]}
13
+ end
14
+
15
+ def self.default
16
+ default_type = self.where(:slug => "other_events").first_or_initialize
17
+ if default_type.new_record?
18
+ default_type.name = "Other Events"
19
+ default_type.save
20
+ end
21
+ default_type
22
+ end
23
+
24
+ end
25
+ end
@@ -1,74 +1,66 @@
1
- require 'zip/zip'
2
1
  require 'open-uri'
2
+ require 'acts_as_tree'
3
3
 
4
4
  module Droom
5
5
  class Folder < ActiveRecord::Base
6
- attr_accessible :name, :parent, :parent_id
6
+ include ActsAsTree
7
+ include Droom::Concerns::Slugged
7
8
 
8
9
  belongs_to :created_by, :class_name => "Droom::User"
9
10
  belongs_to :holder, :polymorphic => true
10
11
  has_many :documents, :dependent => :destroy
11
12
  has_many :personal_folders, :dependent => :destroy
12
- acts_as_tree :order => "name ASC"
13
+ acts_as_tree :order => "droom_folders.name ASC"
13
14
 
14
15
  validates :slug, :presence => true, :uniqueness => { :scope => :parent_id }
15
16
 
16
17
  before_validation :set_properties
17
- before_validation :ensure_slug
18
+ before_validation :slug_from_name
18
19
 
19
- default_scope includes(:documents)
20
-
21
- scope :all_private, where("#{table_name}.private = 1")
22
- scope :not_private, where("#{table_name}.private <> 1 OR #{table_name}.private IS NULL")
23
- scope :all_public, where("#{table_name}.public = 1 AND #{table_name}.private <> 1 OR #{table_name}.private IS NULL")
24
- scope :not_public, where("#{table_name}.public <> 1 OR #{table_name}.private = 1)")
25
- scope :by_name, order("#{table_name}.name ASC")
26
- scope :visible_to, lambda { |person|
27
- if person
20
+ default_scope -> { includes(:documents) }
21
+
22
+ scope :all_private, -> { where("#{table_name}.private = 1") }
23
+ scope :not_private, -> { where("#{table_name}.private <> 1 OR #{table_name}.private IS NULL") }
24
+ scope :all_public, -> { where("#{table_name}.public = 1 AND #{table_name}.private <> 1 OR #{table_name}.private IS NULL") }
25
+ scope :not_public, -> { where("#{table_name}.public <> 1 OR #{table_name}.private = 1)") }
26
+ scope :by_name, -> { order("#{table_name}.name ASC") }
27
+ scope :visible_to, -> user {
28
+ if user
28
29
  select('droom_folders.*')
29
30
  .joins('LEFT OUTER JOIN droom_personal_folders AS dpf ON droom_folders.id = dpf.folder_id')
30
- .where(["(droom_folders.public = 1 OR dpf.person_id = ?)", person.id])
31
+ .where(["(droom_folders.public = 1 OR dpf.user_id = ?)", user.id])
31
32
  .group('droom_folders.id')
32
33
  else
33
34
  all_public
34
35
  end
35
36
  }
36
37
 
37
- def visible_to?(person)
38
- true
38
+ def visible_to?(user)
39
+ return true if self.public?
40
+ return false unless user
41
+ return true if user.admin?
42
+ return true if user.has_folder?(self)
43
+ return false if self.private?
44
+ return true
39
45
  end
40
46
 
41
47
  # A root folder is created automatically for each class that has_folders,
42
48
  # the first time something in that class asks for its folder.
43
49
  # scope :roots, where('droom_folders.holder_type IS NULL AND droom_folders.parent_id IS NULL')
44
50
 
45
- scope :loose, where('parent_id IS NULL')
46
-
47
- scope :populated, select('droom_folders.*')
48
- .joins('LEFT OUTER JOIN droom_documents AS dd ON droom_folders.id = dd.folder_id LEFT OUTER JOIN droom_folders AS df ON droom_folders.id = df.parent_id')
49
- .having('count(dd.id) > 0 OR count(df.id) > 0')
50
- .group('droom_folders.id')
51
-
52
- scope :latest, lambda {|limit|
53
- order("updated_at DESC, created_at DESC").limit(limit)
51
+ scope :loose, -> { where('parent_id IS NULL') }
52
+ scope :latest, -> limit { order("updated_at DESC, created_at DESC").limit(limit) }
53
+ scope :populated, -> {
54
+ select('droom_folders.*')
55
+ .joins('LEFT OUTER JOIN droom_documents AS dd ON droom_folders.id = dd.folder_id LEFT OUTER JOIN droom_folders AS df ON droom_folders.id = df.parent_id')
56
+ .having('count(dd.id) > 0 OR count(df.id) > 0')
57
+ .group('droom_folders.id')
54
58
  }
55
59
 
56
60
  def path
57
61
  "#{parent.path if parent}/#{slug}"
58
62
  end
59
63
 
60
- def documents_zipped
61
- if self.documents.any?
62
- tempfile = Tempfile.new("droom-temp-#{slug}-#{Time.now}.zip")
63
- Zip::ZipOutputStream.open(tempfile.path) do |z|
64
- self.documents.each do |doc|
65
- z.add(doc.file_file_name, doc.original_file)
66
- end
67
- end
68
- tempfile
69
- end
70
- end
71
-
72
64
  def populated?
73
65
  children.any? || documents.any?
74
66
  end
@@ -78,7 +70,7 @@ module Droom
78
70
  end
79
71
 
80
72
  def simple?
81
- children.empty? && documents.count <= 2
73
+ children.empty? && documents.count <= 3
82
74
  end
83
75
 
84
76
  # If we start to get deep folder trees we'll have to use ancestry instead of acts_as_tree.
@@ -100,13 +92,9 @@ module Droom
100
92
  end
101
93
 
102
94
  def dropboxed_for?(user)
103
- # user.person && dropbox_documents.for_person(person).any?
95
+ # dropbox_documents.for_user(user).any?
104
96
  end
105
97
 
106
- def copy_to_dav
107
- Rails.logger.warn ">>> copy folder #{@folder.inspect} to DAV"
108
- end
109
-
110
98
  def get_name_from_holder
111
99
  send :set_properties
112
100
  self.save if self.changed?
@@ -116,7 +104,11 @@ module Droom
116
104
 
117
105
  def set_properties
118
106
  if holder
119
- self.name ||= holder.name
107
+ if holder.respond_to?(:folder_name)
108
+ self.name ||= holder.folder_name
109
+ else
110
+ self.name ||= holder.name
111
+ end
120
112
  self.slug ||= holder.slug
121
113
  end
122
114
  # folders originally only had slugs, so this happens from time to time
@@ -125,9 +117,5 @@ module Droom
125
117
  true
126
118
  end
127
119
 
128
- def ensure_slug
129
- ensure_presence_and_uniqueness_of(:slug, name.parameterize)
130
- end
131
-
132
120
  end
133
121
  end
@@ -1,19 +1,22 @@
1
1
  module Droom
2
2
  class Group < ActiveRecord::Base
3
- attr_accessible :name, :leader_id, :description
3
+ include Droom::Concerns::Slugged
4
4
 
5
5
  belongs_to :created_by, :class_name => "Droom::User"
6
- belongs_to :leader, :class_name => 'Person'
6
+ belongs_to :leader, :class_name => 'Droom::User'
7
7
 
8
8
  has_folder
9
9
 
10
- has_many :group_invitations, :dependent => :destroy, :uniq => true
11
- has_many :events, :through => :group_invitations
10
+ has_many :group_invitations, :dependent => :destroy
11
+ has_many :events, -> { uniq }, :through => :group_invitations
12
12
 
13
13
  has_many :memberships, :dependent => :destroy
14
- has_many :people, :through => :memberships, :uniq => true
14
+ has_many :users, -> { uniq.order("family_name ASC, given_name ASC") }, :through => :memberships
15
15
 
16
- before_validation :ensure_slug
16
+ has_many :group_permissions, :dependent => :destroy
17
+ has_many :permissions, -> { uniq }, :through => :group_permissions
18
+
19
+ before_validation :slug_from_name
17
20
  before_validation :ensure_mailing_list_name
18
21
 
19
22
  validates :slug, :uniqueness => true, :presence => true
@@ -23,19 +26,19 @@ module Droom
23
26
  [:name, :description]
24
27
  end
25
28
 
26
- scope :all_private, where("private = 1")
27
- scope :not_private, where("private <> 1 OR private IS NULL")
28
- scope :all_public, where("public = 1 AND private <> 1 OR private IS NULL")
29
- scope :not_public, where("public <> 1 OR private = 1)")
29
+ scope :all_private, -> { where("private = 1") }
30
+ scope :not_private, -> { where("private <> 1 OR private IS NULL") }
31
+ scope :all_public, -> { where("public = 1 AND private <> 1 OR private IS NULL") }
32
+ scope :not_public, -> { where("public <> 1 OR private = 1)") }
30
33
 
31
- scope :visible_to, lambda { |person|
32
- if person
33
- if person.admin?
34
+ scope :visible_to, -> user {
35
+ if user
36
+ if user.admin?
34
37
  scoped({})
35
38
  else
36
39
  select('droom_groups.*')
37
40
  .joins('INNER JOIN droom_memberships as dm on droom_groups.id = dm.group_id')
38
- .where(['dm.person_id = ?', person.id])
41
+ .where(['dm.user_id = ?', user.id])
39
42
  .group('droom_groups.id')
40
43
  end
41
44
  else
@@ -43,31 +46,40 @@ module Droom
43
46
  end
44
47
  }
45
48
 
46
- scope :matching, lambda { |fragment|
49
+ scope :matching, -> fragment {
47
50
  fragment = "%#{fragment}%"
48
51
  where('droom_groups.name like ?', fragment)
49
52
  }
53
+
54
+ scope :not_shown_in_directory, -> {
55
+ where(:directory => false)
56
+ }
57
+
58
+ scope :shown_in_directory, -> {
59
+ where(:directory => true)
60
+ }
50
61
 
51
- default_scope order("droom_groups.created_at ASC")
62
+ default_scope -> { order("droom_groups.created_at ASC") }
52
63
 
53
- def admit(person)
54
- self.people << person
64
+ def admit(users)
65
+ users = *[users].flatten
66
+ self.users << users
55
67
  end
56
68
 
57
69
  def attach(doc)
58
70
  # self.documents << doc
59
71
  end
60
72
 
61
- def membership_for(person)
62
- self.memberships.for(person).first
73
+ def membership_for(user)
74
+ self.memberships.for(user).first
63
75
  end
64
76
 
65
77
  def invite_to(event)
66
- group_invitations.find_or_create_by_event_id(event.id)
78
+ group_invitations.where(event_id: event.id).first_or_create
67
79
  end
68
80
 
69
81
  def uninvite_from(event)
70
- group_invitation = group_invitations.find_by_event_id(event.id)
82
+ group_invitation = group_invitations.find_by(event_id: event.id)
71
83
  group_invitation.invitations.to_event(event).each do |invitation|
72
84
  invitation.destroy!
73
85
  end
@@ -89,12 +101,8 @@ module Droom
89
101
 
90
102
  protected
91
103
 
92
- def ensure_slug
93
- ensure_presence_and_uniqueness_of(:slug, name.parameterize)
94
- end
95
-
96
104
  def ensure_mailing_list_name
97
- ensure_presence_and_uniqueness_of(:mailing_list_name, slug)
105
+ ensure_presence_of_unique(:mailing_list_name, slug)
98
106
  end
99
107
  end
100
108
  end
@@ -1,7 +1,5 @@
1
1
  module Droom
2
2
  class GroupInvitation < ActiveRecord::Base
3
- attr_accessible :event_id, :group_id
4
-
5
3
  belongs_to :created_by, :class_name => "User"
6
4
  belongs_to :group
7
5
  belongs_to :event
@@ -9,24 +7,23 @@ module Droom
9
7
  after_save :create_personal_invitations
10
8
  validates_uniqueness_of :group_id, :scope => :event_id
11
9
 
12
- scope :to_event, lambda { |event|
10
+ scope :to_event, -> event {
13
11
  where("droom_group_invitations.event_id = ?", event.id)
14
12
  }
15
13
 
16
- scope :for_group, lambda { |group|
14
+ scope :for_group, -> group {
17
15
  where("droom_group_invitations.group_id = ?", group.id)
18
16
  }
19
17
 
20
-
21
18
  def create_personal_invitations
22
- group.people.each do |person|
23
- create_personal_invitation_for(person)
19
+ group.users.each do |user|
20
+ create_personal_invitation_for(user)
24
21
  end
25
22
  end
26
23
 
27
- def create_personal_invitation_for(person)
28
- event.invitations.find_or_create_by_person_id(person.id) if person.member_of?(group)
24
+ def create_personal_invitation_for(user)
25
+ invitations.where(:user_id => user.id, :event_id => event.id).first_or_create
29
26
  end
30
-
27
+
31
28
  end
32
29
  end
@@ -0,0 +1,29 @@
1
+ module Droom
2
+ class GroupPermission < ActiveRecord::Base
3
+ belongs_to :group
4
+ belongs_to :permission
5
+ has_many :user_permissions, :dependent => :destroy
6
+ after_save :create_user_permissions
7
+
8
+ # This is set up such that a personal permission created by group membership can be deleted
9
+ # while still leaving in place a personal permission that was granted separately.
10
+ #
11
+ def create_user_permissions
12
+ group.users.each do |user|
13
+ create_permission_for(user)
14
+ end
15
+ end
16
+
17
+ def create_permission_for(user)
18
+ user_permissions.where(:user_id => user.id, :permission_id => permission.id).first_or_create
19
+ end
20
+
21
+ def self.by_group_id
22
+ all.each_with_object({}) do |gp, hash|
23
+ hash[gp.group_id] ||= {}
24
+ hash[gp.group_id][gp.permission.id] = gp
25
+ end
26
+ end
27
+
28
+ end
29
+ end
@@ -1,46 +1,44 @@
1
1
  module Droom
2
2
  class Invitation < ActiveRecord::Base
3
- attr_accessible :event_id, :person_id
4
3
 
5
- belongs_to :person
4
+ belongs_to :user
6
5
  belongs_to :event
7
6
  belongs_to :group_invitation
8
7
  belongs_to :created_by, :class_name => "User"
9
8
 
10
9
  after_create :link_folder
11
10
  after_destroy :unlink_folder
12
- # after_destroy :delete_similar
13
11
 
14
- validates_uniqueness_of :person_id, :scope => [:event_id, :group_invitation_id]
12
+ validates_uniqueness_of :user_id, :scope => [:event_id, :group_invitation_id]
15
13
 
16
- scope :to_event, lambda { |event|
14
+ scope :to_event, -> event {
17
15
  where(["event_id = ?", event.id])
18
16
  }
19
17
 
20
- scope :for_person, lambda { |person|
21
- where("droom_invitations.person_id = ?", person.id)
18
+ scope :for_user, -> user {
19
+ where("droom_invitations.user_id = ?", user.id)
22
20
  }
23
21
 
24
- scope :future, lambda {
22
+ scope :future, -> {
25
23
  select('droom_invitations.*')
26
24
  .joins('inner join droom_events as de on droom_invitations.event_id = de.id')
27
25
  .where(['de.start > :now', :now => Time.now])
28
26
  .group('droom_invitations.id')
29
27
  }
30
28
 
31
- scope :refused, where("response < 1")
32
- scope :accepted, where("response > 1")
33
- scope :not_refused, where("response > 0")
34
- scope :not_accepted, where("response < 2")
35
- scope :responded, where("response <> 1")
36
- scope :not_responded, where("response == 1")
29
+ scope :refused, -> { where("response < 1") }
30
+ scope :accepted, -> { where("response > 1") }
31
+ scope :not_refused, -> { where("response > 0") }
32
+ scope :not_accepted, -> { where("response < 2") }
33
+ scope :responded, -> { where("response <> 1") }
34
+ scope :not_responded,-> { where("response == 1") }
37
35
 
38
36
  def link_folder
39
- person.add_personal_folders(event.folder)
37
+ user.add_personal_folders(event.folder)
40
38
  end
41
39
 
42
40
  def unlink_folder
43
- person.remove_personal_folders(event.folder)
41
+ user.remove_personal_folders(event.folder) if user
44
42
  end
45
43
 
46
44
  def status
@@ -61,12 +59,5 @@ module Droom
61
59
  response && response < 1
62
60
  end
63
61
 
64
- protected
65
-
66
- def delete_similar
67
- Droom::Invitation.for_person(person).to_event(event).delete_all
68
- end
69
-
70
62
  end
71
-
72
63
  end
@@ -61,7 +61,6 @@
61
61
 
62
62
  module Droom
63
63
  class MailingListMembership < ActiveRecord::Base
64
- attr_accessible :address, :listname, :digest, :not_metoo, :nomail, :plain, :ack
65
64
  #
66
65
  ## Configuration
67
66
  #
@@ -1,33 +1,29 @@
1
1
  module Droom
2
2
  class Membership < ActiveRecord::Base
3
- attr_accessible :group_id, :person_id
4
-
5
- belongs_to :person
3
+ belongs_to :user
6
4
  belongs_to :group
7
5
  belongs_to :created_by, :class_name => "User"
8
6
 
9
7
  has_one :mailing_list_membership, :dependent => :destroy
10
8
 
11
9
  after_create :link_folder
12
- after_create :make_mailing_list_membership
13
- after_create :update_person_status
10
+ after_create :create_mailing_list_membership
14
11
  after_create :create_invitations
12
+ after_create :create_permissions
13
+
15
14
  after_destroy :unlink_folder
16
- after_destroy :update_person_status
17
15
  after_destroy :destroy_invitations
16
+ after_destroy :destroy_permissions
18
17
  after_destroy :destroy_similar
19
18
 
20
- validates :person, :presence => true
21
- validates :group, :presence => true
19
+ accepts_nested_attributes_for :user
22
20
 
23
- scope :of_group, lambda { |group|
21
+ # validates :user, :presence => true
22
+ # validates :group, :presence => true
23
+
24
+ scope :of_group, -> group {
24
25
  where(["group_id = ?", group.id])
25
26
  }
26
-
27
- scope :privileged, select('droom_memberships.*')
28
- .joins('inner join droom_groups as dg on droom_memberships.group_id = dg.id')
29
- .where('dg.privileged' => true)
30
- .group('droom_memberships.id')
31
27
 
32
28
  def current?
33
29
  expires and expires > Time.now
@@ -43,46 +39,51 @@ module Droom
43
39
  # This is sometimes useful if a configuration change means we're looking at a different mailman table.
44
40
  #
45
41
  def self.repair_mailing_list_memberships
46
- self.all.each { |m| m.send :make_mailing_list_membership }
42
+ self.all.each { |m| m.send :create_mailing_list_membership }
47
43
  end
48
44
 
49
45
  protected
50
46
 
51
47
  def link_folder
52
- person.add_personal_folders(group.folder)
48
+ user.add_personal_folders(group.folder)
53
49
  end
54
50
 
55
51
  def unlink_folder
56
- person.remove_personal_folders(group.folder)
57
- end
58
-
59
- def unlink_folder
60
- person.remove_personal_folders(group.folder)
52
+ user.remove_personal_folders(group.folder) if user
61
53
  end
62
54
 
63
- def make_mailing_list_membership
64
- self.mailing_list_membership = Droom::MailingListMembership.find_or_create_by_address_and_listname(person.email, group.mailing_list_name)
65
- end
66
-
67
- def update_person_status
68
- person.send :update_status
55
+ def create_mailing_list_membership
56
+ self.mailing_list_membership = Droom::MailingListMembership.where(address: user.email, listname: group.mailing_list_name).first_or_create
69
57
  end
70
58
 
71
59
  def create_invitations
72
60
  group.group_invitations.each do |gi|
73
- gi.create_personal_invitation_for(person)
61
+ gi.create_personal_invitation_for(user)
62
+ end
63
+ end
64
+
65
+ def create_permissions
66
+ group.group_permissions.each do |gp|
67
+ gp.create_permission_for(user)
74
68
  end
75
69
  end
76
70
 
77
71
  def destroy_invitations
78
72
  group.group_invitations.each do |gi|
79
- gi.invitations.for_person(person).destroy_all
73
+ gi.invitations.for_user(user).destroy_all
74
+ end
75
+ end
76
+
77
+ def destroy_permissions
78
+ group.group_permissions.each do |gp|
79
+ gp.user_permissions.for_user(user).destroy_all
80
80
  end
81
81
  end
82
82
 
83
- # it's easy to end up with multiple similar membership objects.
83
+ # it's possible to end up with multiple similar membership objects: here we
84
+ # assume that when one is deleted, all should be.
84
85
  def destroy_similar
85
- group.memberships.where(:person_id => person.id).destroy_all
86
+ group.memberships.where(:user_id => user.id).destroy_all
86
87
  end
87
88
 
88
89
  end