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.
- 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
|