droom 0.4.3 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/app/assets/images/droom/admin_menu.png +0 -0
- data/app/assets/images/droom/applications_menu.png +0 -0
- data/app/assets/images/droom/arrows_small.png +0 -0
- data/app/assets/images/droom/config_menu.png +0 -0
- data/app/assets/images/droom/dropdown.png +0 -0
- data/app/assets/images/droom/menu/asterisk.png +0 -0
- data/app/assets/images/droom/{smalladd.png → menu/smalladd.png} +0 -0
- data/app/assets/images/droom/{small_asterisk.png → menu/smallasterisk.png} +0 -0
- data/app/assets/images/droom/{smalldelete.png → menu/smalldelete.png} +0 -0
- data/app/assets/images/droom/{smalldownload.png → menu/smalldownload.png} +0 -0
- data/app/assets/images/droom/{smalledit.png → menu/smalledit.png} +0 -0
- data/app/assets/images/droom/message.png +0 -0
- data/app/assets/images/droom/missing/scrap.jpg +0 -0
- data/app/assets/images/droom/missing/scrap.png +0 -0
- data/app/assets/images/droom/missing/thumb.png +0 -0
- data/app/assets/images/droom/missing/user.png +0 -0
- data/app/assets/images/droom/object_icons.png +0 -0
- data/app/assets/images/droom/panel/add.png +0 -0
- data/app/assets/images/droom/panel/edit.png +0 -0
- data/app/assets/images/droom/panel/manage.png +0 -0
- data/app/assets/images/droom/pointer_upwards.png +0 -0
- data/app/assets/images/droom/search_menu.png +0 -0
- data/app/assets/images/droom/setter.png +0 -0
- data/app/assets/images/droom/small_icons.png +0 -0
- data/app/assets/images/droom/stream/closer.png +0 -0
- data/app/assets/images/droom/stream/next.png +0 -0
- data/app/assets/images/droom/stream/prev.png +0 -0
- data/app/assets/images/droom/stream/previous.png +0 -0
- data/app/assets/images/droom/subscribe.png +0 -0
- data/app/assets/javascripts/droom.js.coffee +23 -13
- data/app/assets/javascripts/droom/actions.js.coffee +104 -10
- data/app/assets/javascripts/droom/ajax.js.coffee +36 -24
- data/app/assets/javascripts/droom/extensions.js.coffee +13 -0
- data/app/assets/javascripts/droom/lib/jquery.datepicker.js +1026 -0
- data/app/assets/javascripts/droom/lib/jquery.deserialize.js +142 -0
- data/app/assets/javascripts/droom/lib/jquery_ujs.js +416 -0
- data/app/assets/javascripts/droom/lib/swipe.js +568 -0
- data/app/assets/javascripts/droom/lib/underscore.js +1276 -0
- data/app/assets/javascripts/droom/popups.js.coffee +98 -37
- data/app/assets/javascripts/droom/stream.js.coffee +119 -77
- data/app/assets/javascripts/droom/utilities.js.coffee +25 -3
- data/app/assets/javascripts/droom/widgets.js.coffee +318 -253
- data/app/assets/stylesheets/droom.css.sass +482 -955
- data/app/assets/stylesheets/droom/_mixins.css.sass +12 -42
- data/app/assets/stylesheets/droom/_popups.css.sass +28 -11
- data/app/assets/stylesheets/droom/_stream.css.sass +375 -0
- data/app/assets/stylesheets/droom/_toolbar.css.sass +0 -6
- data/app/assets/stylesheets/droom/_variables.css.sass +4 -2
- data/app/controllers/droom/agenda_categories_controller.rb +6 -14
- data/app/controllers/droom/api/api_controller.rb +56 -0
- data/app/controllers/droom/api/events_controller.rb +74 -0
- data/app/controllers/droom/api/users_controller.rb +92 -0
- data/app/controllers/droom/api/venues_controller.rb +71 -0
- data/app/controllers/droom/calendars_controller.rb +4 -10
- data/app/controllers/droom/{user_confirmations_controller.rb → confirmations_controller.rb} +8 -7
- data/app/controllers/droom/dashboard_controller.rb +2 -19
- data/app/controllers/droom/documents_controller.rb +12 -60
- data/app/controllers/droom/dropbox_tokens_controller.rb +3 -4
- data/app/controllers/droom/engine_controller.rb +39 -11
- data/app/controllers/droom/events_controller.rb +62 -84
- data/app/controllers/droom/folders_controller.rb +30 -40
- data/app/controllers/droom/group_invitations_controller.rb +6 -23
- data/app/controllers/droom/group_permissions_controller.rb +26 -0
- data/app/controllers/droom/groups_controller.rb +10 -14
- data/app/controllers/droom/invitations_controller.rb +7 -25
- data/app/controllers/droom/memberships_controller.rb +13 -18
- data/app/controllers/droom/organisations_controller.rb +6 -25
- data/app/controllers/droom/permissions_controller.rb +50 -0
- data/app/controllers/droom/preferences_controller.rb +9 -10
- data/app/controllers/droom/scraps_controller.rb +23 -26
- data/app/controllers/droom/services_controller.rb +50 -0
- data/app/controllers/droom/suggestions_controller.rb +6 -4
- data/app/controllers/droom/users/confirmations_controller.rb +24 -0
- data/app/controllers/droom/users/passwords_controller.rb +39 -0
- data/app/controllers/droom/users/sessions_controller.rb +7 -0
- data/app/controllers/droom/users_controller.rb +60 -38
- data/app/controllers/droom/venues_controller.rb +8 -15
- data/app/controllers/droom/youtube_controller.rb +1 -1
- data/app/helpers/droom/droom_helper.rb +22 -17
- data/app/models/droom/ability.rb +81 -0
- data/app/models/droom/agenda_category.rb +0 -1
- data/app/models/droom/calendar.rb +12 -7
- data/app/models/droom/category.rb +4 -10
- data/app/models/droom/concerns/slugged.rb +21 -0
- data/app/models/droom/document.rb +15 -17
- data/app/models/droom/dropbox_document.rb +3 -6
- data/app/models/droom/dropbox_token.rb +2 -3
- data/app/models/droom/event.rb +117 -163
- data/app/models/droom/event_type.rb +25 -0
- data/app/models/droom/folder.rb +36 -48
- data/app/models/droom/group.rb +35 -27
- data/app/models/droom/group_invitation.rb +7 -10
- data/app/models/droom/group_permission.rb +29 -0
- data/app/models/droom/invitation.rb +14 -23
- data/app/models/droom/mailing_list_membership.rb +0 -1
- data/app/models/droom/membership.rb +32 -31
- data/app/models/droom/organisation.rb +6 -3
- data/app/models/droom/permission.rb +19 -0
- data/app/models/droom/personal_folder.rb +9 -21
- data/app/models/droom/preference.rb +1 -2
- data/app/models/droom/scrap.rb +31 -26
- data/app/models/droom/service.rb +31 -0
- data/app/models/droom/tag.rb +10 -9
- data/app/models/droom/tagging.rb +1 -1
- data/app/models/droom/user.rb +453 -130
- data/app/models/droom/user_permission.rb +8 -0
- data/app/models/droom/venue.rb +21 -32
- data/app/serializers/droom/user_serializer.rb +45 -0
- data/app/serializers/droom/venue_serializer.rb +5 -0
- data/app/views/droom/dashboard/_documents.html.haml +1 -1
- data/app/views/droom/dashboard/_folders.html.haml +1 -1
- data/app/views/droom/dashboard/_future_events.html.haml +10 -8
- data/app/views/droom/dashboard/_groups.html.haml +1 -1
- data/app/views/droom/dashboard/_past_events.haml +19 -12
- data/app/views/droom/dashboard/_stream.html.haml +2 -2
- data/app/views/droom/{users/_extra_columns.html.haml → dashboard/_welcome.html.haml} +0 -0
- data/app/views/droom/dashboard/index.html.haml +3 -0
- data/app/views/droom/documents/_document.html.haml +0 -2
- data/app/views/droom/documents/_documents.html.haml +1 -1
- data/app/views/droom/documents/_documents_list.html.haml +1 -1
- data/app/views/droom/documents/_documents_table.html.haml +1 -1
- data/app/views/droom/documents/_form.html.haml +8 -5
- data/app/views/droom/documents/_listing.html.haml +4 -2
- data/app/views/droom/documents/index.html.haml +13 -7
- data/app/views/droom/documents/new.html.haml +1 -4
- data/app/views/droom/events/_action_menu.html.haml +2 -2
- data/app/views/droom/events/_attachments.html.haml +8 -0
- data/app/views/droom/events/_calendar.html.haml +4 -8
- data/app/views/droom/events/_event.html.haml +44 -63
- data/app/views/droom/events/_event_line.html.haml +1 -1
- data/app/views/droom/events/_events.html.haml +18 -2
- data/app/views/droom/events/_form.html.haml +26 -19
- data/app/views/droom/events/_invitations.html.haml +7 -3
- data/app/views/droom/events/_scrap_events.html.haml +8 -0
- data/app/views/droom/events/_suggested.html.haml +4 -1
- data/app/views/droom/events/calendar.html.haml +8 -0
- data/app/views/droom/events/index.html.haml +24 -26
- data/app/views/droom/events/show.html.haml +6 -6
- data/app/views/droom/folders/_contents.html.haml +34 -4
- data/app/views/droom/folders/_folder.html.haml +7 -2
- data/app/views/droom/folders/_form.html.haml +11 -8
- data/app/views/droom/folders/index.html.haml +19 -22
- data/app/views/droom/group_invitations/_attending_groups.html.haml +1 -1
- data/app/views/droom/group_permissions/_toggle.html.haml +18 -0
- data/app/views/droom/groups/_action_menu.haml +0 -2
- data/app/views/droom/groups/_created.html.haml +0 -1
- data/app/views/droom/groups/_form.html.haml +3 -0
- data/app/views/droom/groups/_group.html.haml +10 -8
- data/app/views/droom/groups/_groups.html.haml +1 -1
- data/app/views/droom/groups/_search_result.html.haml +1 -1
- data/app/views/droom/groups/_suggested.html.haml +1 -1
- data/app/views/droom/groups/index.html.haml +15 -16
- data/app/views/droom/invitations/_form.html.haml +1 -1
- data/app/views/droom/invitations/_invitation.html.haml +1 -1
- data/app/views/droom/invitations/_invitations.html.haml +4 -4
- data/app/views/droom/memberships/_button.html.haml +5 -5
- data/app/views/droom/memberships/_form.html.haml +26 -7
- data/app/views/droom/memberships/_member.html.haml +1 -1
- data/app/views/droom/memberships/{_membership_toggle.html.haml → _toggle.html.haml} +4 -4
- data/app/views/droom/memberships/index.html.haml +9 -0
- data/app/views/droom/organisations/_action_menu.html.haml +1 -1
- data/app/views/droom/organisations/_organisation.html.haml +2 -2
- data/app/views/droom/organisations/_suggested.html.haml +1 -1
- data/app/views/droom/organisations/index.html.haml +11 -11
- data/app/views/droom/panels/_admin.html.haml +2 -2
- data/app/views/droom/panels/_configuration.html.haml +28 -0
- data/app/views/droom/panels/_devices.html.haml +2 -4
- data/app/views/droom/panels/_search.html.haml +9 -0
- data/app/views/droom/permissions/_action_menu.html.haml +10 -0
- data/app/views/droom/permissions/_created.html.haml +3 -0
- data/app/views/droom/permissions/_form.html.haml +17 -0
- data/app/views/droom/permissions/edit.html.haml +7 -0
- data/app/views/droom/permissions/new.html.haml +8 -0
- data/app/views/droom/permissions/show.html.haml +4 -0
- data/app/views/droom/preferences/_checkbox.html.haml +4 -2
- data/app/views/droom/scraps/_caption.html.haml +0 -2
- data/app/views/droom/scraps/_credit.html.haml +1 -1
- data/app/views/droom/scraps/_form.html.haml +68 -69
- data/app/views/droom/scraps/_preload.html.haml +4 -0
- data/app/views/droom/scraps/_stream.html.haml +11 -3
- data/app/views/droom/scraps/_thumb.html.haml +33 -1
- data/app/views/droom/scraps/edit.html.haml +6 -1
- data/app/views/droom/scraps/full/_document.html.haml +4 -3
- data/app/views/droom/scraps/full/_event.html.haml +17 -16
- data/app/views/droom/scraps/full/_image.html.haml +1 -2
- data/app/views/droom/scraps/full/_link.html.haml +4 -3
- data/app/views/droom/scraps/full/_quote.html.haml +4 -7
- data/app/views/droom/scraps/full/_text.html.haml +3 -2
- data/app/views/droom/scraps/full/_video.html.haml +2 -2
- data/app/views/droom/scraps/new.html.haml +6 -1
- data/app/views/droom/scraps/show.html.haml +4 -3
- data/app/views/droom/services/_action_menu.html.haml +12 -0
- data/app/views/droom/services/_created.html.haml +3 -0
- data/app/views/droom/services/_form.html.haml +18 -0
- data/app/views/droom/services/_services.html.haml +44 -0
- data/app/views/droom/services/edit.html.haml +7 -0
- data/app/views/droom/services/index.html.haml +5 -0
- data/app/views/droom/{people → services}/new.html.haml +4 -3
- data/app/views/droom/services/show.html.haml +4 -0
- data/app/views/droom/shared/_controls.html.haml +2 -2
- data/app/views/droom/shared/_navigation.html.haml +2 -2
- data/app/views/droom/shared/_toolbar.html.haml +1 -1
- data/app/views/droom/suggestions/index.html.haml +1 -0
- data/app/views/droom/users/_action_menu.html.haml +21 -0
- data/app/views/droom/users/_suggested.html.haml +14 -0
- data/app/views/droom/users/_user.html.haml +2 -2
- data/app/views/droom/users/_users.html.haml +7 -0
- data/app/views/droom/users/_users_table.html.haml +21 -22
- data/app/views/droom/users/admin.html.haml +10 -0
- data/app/views/droom/users/confirmations/_after_confirmation.html.haml +2 -0
- data/app/views/droom/users/confirmations/_password_required.html.haml +30 -0
- data/app/views/droom/users/confirmations/failure.en.html.haml +22 -0
- data/app/views/droom/users/confirmations/show.html.haml +13 -0
- data/app/views/droom/users/edit.html.haml +2 -10
- data/app/views/droom/users/edit/_details.html.haml +13 -0
- data/app/views/droom/users/edit/_memberships.html.haml +13 -0
- data/app/views/droom/users/edit/_password_fields.html.haml +16 -0
- data/app/views/droom/users/edit/_preferences.html.haml +37 -0
- data/app/views/droom/users/edit/_profile.html.haml +26 -0
- data/app/views/droom/users/edit/_user_fields.html.haml +66 -0
- data/app/views/droom/users/index.html.haml +6 -32
- data/app/views/droom/users/new.html.haml +3 -0
- data/app/views/droom/users/passwords/completed.html.haml +13 -0
- data/app/views/{devise → droom/users}/passwords/edit.html.haml +10 -4
- data/app/views/{devise → droom/users}/passwords/new.html.haml +4 -3
- data/app/views/droom/users/passwords/show.html.haml +6 -0
- data/app/views/droom/users/show.html.haml +2 -0
- data/app/views/droom/users/show/_listed.html.haml +46 -0
- data/app/views/droom/users/show/_profile.html.haml +33 -0
- data/app/views/droom/users/show/_tabled.html.haml +28 -0
- data/config/initializers/chronic.rb +2 -0
- data/config/initializers/devise.rb +35 -2
- data/config/initializers/paperclip.rb +11 -6
- data/config/locales/devise.en.yml +1 -1
- data/config/locales/en.yml +198 -103
- data/config/routes.rb +37 -45
- data/db/migrate/20130207123614_stream.rb +5 -1
- data/db/migrate/20130225095328_create_droom_calendars.rb +0 -1
- data/db/migrate/20130627065459_permissions.rb +34 -0
- data/db/migrate/20130627071938_users_take_over.rb +38 -0
- data/db/migrate/20130627073759_user_properties.rb +34 -0
- data/db/migrate/20130627080021_no_more_people.rb +11 -0
- data/db/migrate/20130701122935_directory_groups.rb +8 -0
- data/db/migrate/20130701123152_remove_old_access_control.rb +16 -0
- data/db/migrate/20130729102857_more_scrap_data.rb +12 -0
- data/db/migrate/20130904080340_international_names.rb +17 -0
- data/db/migrate/20130904080341_honours.rb +5 -0
- data/db/migrate/20131124082222_simple_addresses.rb +25 -0
- data/db/migrate/20131201093351_event_time_zone.rb +5 -0
- data/db/migrate/20131217060311_session_revocable.rb +5 -0
- data/db/migrate/20131219180311_event_types.rb +15 -0
- data/lib/devise/strategies/cookie_authenticatable.rb +46 -0
- data/lib/droom.rb +48 -33
- data/lib/droom/auth_cookie.rb +82 -0
- data/lib/droom/cropper.rb +24 -0
- data/lib/droom/engine.rb +20 -2
- data/lib/droom/folders.rb +6 -6
- data/lib/droom/lazy_hash.rb +11 -1
- data/lib/droom/monkeys.rb +6 -6
- data/lib/droom/taggability.rb +1 -1
- data/lib/droom/validators.rb +1 -1
- data/lib/droom/version.rb +1 -1
- data/lib/generators/droom/install/templates/droom_initializer.rb +10 -2
- data/lib/paperclip/geometry_transformation.rb +80 -0
- data/lib/paperclip/validators/attachment_height_validator.rb +89 -0
- data/lib/paperclip/validators/attachment_width_validator.rb +89 -0
- data/lib/paperclip_processors/offset_thumbnail.rb +85 -0
- data/spec/dummy/config/application.rb +0 -7
- data/spec/dummy/config/environments/development.rb +1 -10
- data/spec/dummy/config/environments/production.rb +1 -0
- data/spec/dummy/config/environments/test.rb +2 -7
- data/spec/dummy/db/migrate/20130130120631_folder_ancestry_to_parents.droom.rb +1 -1
- data/spec/dummy/db/migrate/20130724124758_dropbox_tokens.droom.rb +10 -0
- data/spec/dummy/db/migrate/20130724124759_preference_uuids.droom.rb +6 -0
- data/spec/dummy/db/migrate/20130724124760_stream.droom.rb +14 -0
- data/spec/dummy/db/migrate/20130724124761_access_token_secret.droom.rb +6 -0
- data/spec/dummy/db/migrate/20130724124762_person_image.droom.rb +10 -0
- data/spec/dummy/db/migrate/20130724124763_devise_confirmable.droom.rb +14 -0
- data/spec/dummy/db/migrate/20130724124764_create_droom_calendars.droom.rb +20 -0
- data/spec/dummy/db/migrate/20130724124765_give_scraps_document.droom.rb +6 -0
- data/spec/dummy/db/migrate/20130724124766_privateness.droom.rb +10 -0
- data/spec/dummy/db/migrate/20130724124767_store_metadata.droom.rb +6 -0
- data/spec/dummy/db/migrate/20130724124768_folders_nicely.droom.rb +7 -0
- data/spec/dummy/db/migrate/20130724124769_niceties.droom.rb +8 -0
- data/spec/dummy/db/migrate/20130724124770_create_droom_dropbox_documents.droom.rb +12 -0
- data/spec/dummy/db/migrate/20130724124771_dropbox_documents_changed.droom.rb +6 -0
- data/spec/dummy/db/migrate/20130724124772_user_titles.droom.rb +6 -0
- data/spec/dummy/db/migrate/20130724124773_permissions.droom.rb +35 -0
- data/spec/dummy/db/migrate/20130724124774_users_take_over.droom.rb +39 -0
- data/spec/dummy/db/migrate/20130724124775_user_properties.droom.rb +35 -0
- data/spec/dummy/db/migrate/20130724124776_no_more_people.droom.rb +12 -0
- data/spec/dummy/db/migrate/20130724124777_directory_groups.droom.rb +9 -0
- data/spec/dummy/db/migrate/20130724124778_remove_old_access_control.droom.rb +17 -0
- data/spec/dummy/db/schema.rb +217 -140
- data/spec/factories/documents.rb +0 -5
- data/spec/factories/events.rb +0 -9
- data/spec/factories/user.rb +4 -2
- data/spec/lib/droom/folders_spec.rb +8 -8
- data/spec/models/droom/document_spec.rb +6 -43
- data/spec/models/droom/event_spec.rb +0 -34
- data/spec/models/droom/mailing_list_membership_spec.rb +4 -4
- data/spec/models/droom/membership_spec.rb +2 -2
- data/spec/spec_helper.rb +1 -10
- metadata +322 -282
- data/app/assets/images/droom/Untitled-1.png +0 -0
- data/app/assets/images/droom/asterisk.png +0 -0
- data/app/assets/images/droom/smallmanage.png +0 -0
- data/app/assets/javascripts/droom/lib/kalendae.js +0 -1692
- data/app/assets/stylesheets/lib/_kalendae.css.sass +0 -139
- data/app/controllers/droom/pages_controller.rb +0 -61
- data/app/controllers/droom/people_controller.rb +0 -111
- data/app/models/droom/document_attachment.rb +0 -37
- data/app/models/droom/page.rb +0 -26
- data/app/models/droom/person.rb +0 -309
- data/app/models/droom/recurrence_rule.rb +0 -82
- data/app/models/droom/user_action_observer.rb +0 -12
- data/app/views/devise/confirmations/failure.en.html.haml +0 -20
- data/app/views/devise/confirmations/show.html.haml +0 -19
- data/app/views/droom/confirmations/show.html.haml +0 -40
- data/app/views/droom/documents/_document_line.html.haml +0 -2
- data/app/views/droom/events/_created.html.haml +0 -2
- data/app/views/droom/folders/_attachments.html.haml +0 -3
- data/app/views/droom/pages/_contents.html.haml +0 -10
- data/app/views/droom/pages/_form.html.haml +0 -36
- data/app/views/droom/pages/_full_page.html.haml +0 -17
- data/app/views/droom/pages/_page.html.haml +0 -5
- data/app/views/droom/pages/_pages.html.haml +0 -2
- data/app/views/droom/pages/admin.html.haml +0 -24
- data/app/views/droom/pages/edit.html.haml +0 -1
- data/app/views/droom/pages/index.html.haml +0 -10
- data/app/views/droom/pages/new.html.haml +0 -4
- data/app/views/droom/pages/show.html.haml +0 -5
- data/app/views/droom/panels/_account.html.haml +0 -16
- data/app/views/droom/panels/_readers.html.haml +0 -18
- data/app/views/droom/panels/_suggestions.html.haml +0 -15
- data/app/views/droom/people/_action_menu.html.haml +0 -22
- data/app/views/droom/people/_created.html.haml +0 -6
- data/app/views/droom/people/_form.html.haml +0 -66
- data/app/views/droom/people/_listing.html.haml +0 -19
- data/app/views/droom/people/_memberships.html.haml +0 -24
- data/app/views/droom/people/_people.html.haml +0 -5
- data/app/views/droom/people/_person.html.haml +0 -32
- data/app/views/droom/people/_search_result.html.haml +0 -14
- data/app/views/droom/people/_suggested.html.haml +0 -14
- data/app/views/droom/people/edit.html.haml +0 -9
- data/app/views/droom/people/index.html.haml +0 -8
- data/app/views/droom/people/show.html.haml +0 -31
- data/app/views/droom/scraps/_heading.html.haml +0 -16
- data/app/views/droom/scraps/thumbs/_document.html.haml +0 -9
- data/app/views/droom/scraps/thumbs/_event.html.haml +0 -17
- data/app/views/droom/scraps/thumbs/_image.html.haml +0 -6
- data/app/views/droom/scraps/thumbs/_link.html.haml +0 -10
- data/app/views/droom/scraps/thumbs/_quote.html.haml +0 -8
- data/app/views/droom/scraps/thumbs/_text.html.haml +0 -8
- data/app/views/droom/scraps/thumbs/_video.html.haml +0 -6
- data/app/views/droom/users/_extra_columns_header.html.haml +0 -0
- data/app/views/droom/users/_extra_columns_note.html.haml +0 -0
- data/app/views/droom/users/_form.html.haml +0 -14
- data/app/views/droom/users/_password_fields.html.haml +0 -15
- data/app/views/droom/users/_user_or_person.html.haml +0 -72
- data/app/views/kaminari/_paginator.html.haml +0 -16
- data/lib/droom/dav_resource.rb +0 -36
- data/lib/droom/model_helpers.rb +0 -25
- data/lib/droom/routing.rb +0 -13
- data/spec/datasets/calendar_events_dataset.rb +0 -44
- data/spec/datasets/calendar_pages_dataset.rb +0 -8
- data/spec/datasets/calendar_sites_dataset.rb +0 -6
- data/spec/datasets/calendars_dataset.rb +0 -34
- data/spec/datasets/documents_dataset.rb +0 -28
- data/spec/datasets/recurrence_dataset.rb +0 -7
- data/spec/dummy/config/sunspot.yml +0 -17
- data/spec/dummy/log/dav.log +0 -1
- data/spec/dummy/log/development.log +0 -2
- data/spec/dummy/log/test.log +0 -1
- data/spec/dummy/solr/conf/admin-extra.html +0 -31
- data/spec/dummy/solr/conf/elevate.xml +0 -36
- data/spec/dummy/solr/conf/mapping-ISOLatin1Accent.txt +0 -246
- data/spec/dummy/solr/conf/protwords.txt +0 -21
- data/spec/dummy/solr/conf/schema.xml +0 -238
- data/spec/dummy/solr/conf/scripts.conf +0 -24
- data/spec/dummy/solr/conf/solrconfig.xml +0 -934
- data/spec/dummy/solr/conf/spellings.txt +0 -2
- data/spec/dummy/solr/conf/stopwords.txt +0 -58
- data/spec/dummy/solr/conf/synonyms.txt +0 -31
- data/spec/dummy/solr/data/development/index/segments.gen +0 -0
- data/spec/dummy/solr/data/development/index/segments_1 +0 -0
- data/spec/dummy/solr/data/development/spellchecker/segments.gen +0 -0
- data/spec/dummy/solr/data/development/spellchecker/segments_1 +0 -0
- data/spec/dummy/solr/data/test/index/segments.gen +0 -0
- data/spec/dummy/solr/data/test/index/segments_3nu +0 -0
- data/spec/dummy/solr/data/test/spellchecker/segments.gen +0 -0
- data/spec/dummy/solr/data/test/spellchecker/segments_1 +0 -0
- data/spec/factories/recurrence_rules.rb +0 -25
- data/spec/models/droom/person_spec.rb +0 -72
- data/spec/models/droom/recurrence_rule_spec.rb +0 -81
@@ -1,18 +1,23 @@
|
|
1
1
|
module Droom
|
2
2
|
class Calendar < ActiveRecord::Base
|
3
|
-
|
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
|
15
|
-
|
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
|
-
|
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 :
|
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 :
|
20
|
-
|
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.
|
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,
|
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,
|
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,
|
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(:
|
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
|
-
|
4
|
-
|
5
|
-
belongs_to :person
|
3
|
+
belongs_to :user
|
6
4
|
belongs_to :document
|
7
5
|
|
8
|
-
validates_uniqueness_of :
|
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
|
-
|
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,
|
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
|
data/app/models/droom/event.rb
CHANGED
@@ -1,18 +1,21 @@
|
|
1
1
|
require 'open-uri'
|
2
2
|
require 'uuidtools'
|
3
|
-
require '
|
4
|
-
require '
|
3
|
+
require 'icalendar'
|
4
|
+
require 'date_validator'
|
5
|
+
require 'tod'
|
5
6
|
|
6
7
|
module Droom
|
7
8
|
class Event < ActiveRecord::Base
|
8
|
-
|
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
|
-
|
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 :
|
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
|
-
|
45
|
-
|
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
|
-
|
56
|
-
scope :
|
57
|
-
scope :
|
58
|
-
scope :
|
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,
|
75
|
-
where(['start > ?', datetime])
|
76
|
-
}
|
56
|
+
scope :after, -> datetime { where(['start > ?', datetime]) }
|
77
57
|
|
78
|
-
scope :before,
|
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,
|
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,
|
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,
|
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,
|
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,
|
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,
|
105
|
-
limit(limit)
|
106
|
-
}
|
72
|
+
scope :limited_to, -> limit { limit(limit) }
|
107
73
|
|
108
|
-
scope :at_venue,
|
109
|
-
|
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 :
|
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,
|
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.
|
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,
|
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(
|
185
|
-
self.
|
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 `
|
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.
|
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.
|
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
|
246
|
-
|
214
|
+
def month
|
215
|
+
start.strftime("%m")
|
247
216
|
end
|
248
217
|
|
249
|
-
def
|
250
|
-
|
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
|
257
|
-
|
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.
|
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.
|
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?(
|
287
|
-
|
252
|
+
def attended_by?(user)
|
253
|
+
user && user.invited_to?(self)
|
288
254
|
end
|
289
255
|
|
290
|
-
def visible_to?(
|
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?(
|
262
|
+
def detail_visible_to?(user)
|
297
263
|
return true if self.public?
|
298
|
-
return false unless
|
299
|
-
return true if
|
300
|
-
return true if
|
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
|
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
|
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
|
348
|
-
|
349
|
-
|
350
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
402
|
-
|
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
|
-
|
379
|
+
Time.zone.parse(value)
|
426
380
|
else
|
427
381
|
value
|
428
382
|
end
|