vkhater-social_stream-base 0.11.2
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.
- data/.gitignore +16 -0
- data/.rspec +1 -0
- data/.yardopts +2 -0
- data/Gemfile +10 -0
- data/LICENSE +20 -0
- data/README.rdoc +68 -0
- data/Rakefile +35 -0
- data/app/assets/images/HTML5.png +0 -0
- data/app/assets/images/HTML5_Semantics.png +0 -0
- data/app/assets/images/HTML5_Styling.png +0 -0
- data/app/assets/images/Jcrop.gif +0 -0
- data/app/assets/images/arrow-end.png +0 -0
- data/app/assets/images/arrow-start.png +0 -0
- data/app/assets/images/arrow.png +0 -0
- data/app/assets/images/big-logo.png +0 -0
- data/app/assets/images/btn/1-facebook.png +0 -0
- data/app/assets/images/btn/_notes/btn_certificates.png.mno +4 -0
- data/app/assets/images/btn/activity.png +0 -0
- data/app/assets/images/btn/arrowBlue.png +0 -0
- data/app/assets/images/btn/arrow_session_change.png +0 -0
- data/app/assets/images/btn/arrows-ffffff.png +0 -0
- data/app/assets/images/btn/bold.png +0 -0
- data/app/assets/images/btn/btn_account.png +0 -0
- data/app/assets/images/btn/btn_activities.png +0 -0
- data/app/assets/images/btn/btn_bookmark.png +0 -0
- data/app/assets/images/btn/btn_browse.png +0 -0
- data/app/assets/images/btn/btn_check.png +0 -0
- data/app/assets/images/btn/btn_close.png +0 -0
- data/app/assets/images/btn/btn_comment.png +0 -0
- data/app/assets/images/btn/btn_comment_add.png +0 -0
- data/app/assets/images/btn/btn_config.png +0 -0
- data/app/assets/images/btn/btn_date.png +0 -0
- data/app/assets/images/btn/btn_delete.png +0 -0
- data/app/assets/images/btn/btn_down.png +0 -0
- data/app/assets/images/btn/btn_edit.png +0 -0
- data/app/assets/images/btn/btn_exit.png +0 -0
- data/app/assets/images/btn/btn_find.png +0 -0
- data/app/assets/images/btn/btn_follow.png +0 -0
- data/app/assets/images/btn/btn_foward.png +0 -0
- data/app/assets/images/btn/btn_friend.png +0 -0
- data/app/assets/images/btn/btn_gallery.png +0 -0
- data/app/assets/images/btn/btn_group.png +0 -0
- data/app/assets/images/btn/btn_help.png +0 -0
- data/app/assets/images/btn/btn_home.png +0 -0
- data/app/assets/images/btn/btn_inbox.png +0 -0
- data/app/assets/images/btn/btn_info.png +0 -0
- data/app/assets/images/btn/btn_invitation.png +0 -0
- data/app/assets/images/btn/btn_like.png +0 -0
- data/app/assets/images/btn/btn_next.png +0 -0
- data/app/assets/images/btn/btn_notification.png +0 -0
- data/app/assets/images/btn/btn_notification_delete.png +0 -0
- data/app/assets/images/btn/btn_notification_read.png +0 -0
- data/app/assets/images/btn/btn_notifications.png +0 -0
- data/app/assets/images/btn/btn_page_link.png +0 -0
- data/app/assets/images/btn/btn_partner.png +0 -0
- data/app/assets/images/btn/btn_photo.png +0 -0
- data/app/assets/images/btn/btn_play.png +0 -0
- data/app/assets/images/btn/btn_printer.png +0 -0
- data/app/assets/images/btn/btn_profile.png +0 -0
- data/app/assets/images/btn/btn_rank.png +0 -0
- data/app/assets/images/btn/btn_read.png +0 -0
- data/app/assets/images/btn/btn_security.png +0 -0
- data/app/assets/images/btn/btn_send.png +0 -0
- data/app/assets/images/btn/btn_spam.png +0 -0
- data/app/assets/images/btn/btn_star.png +0 -0
- data/app/assets/images/btn/btn_tag.png +0 -0
- data/app/assets/images/btn/btn_write.png +0 -0
- data/app/assets/images/btn/close.png +0 -0
- data/app/assets/images/btn/date.png +0 -0
- data/app/assets/images/btn/delete.png +0 -0
- data/app/assets/images/btn/download.png +0 -0
- data/app/assets/images/btn/edit.png +0 -0
- data/app/assets/images/btn/error.png +0 -0
- data/app/assets/images/btn/facebook.png +0 -0
- data/app/assets/images/btn/flag.png +0 -0
- data/app/assets/images/btn/group_left.png +0 -0
- data/app/assets/images/btn/group_right.png +0 -0
- data/app/assets/images/btn/header_notifications.png +0 -0
- data/app/assets/images/btn/index_71.png +0 -0
- data/app/assets/images/btn/info.png +0 -0
- data/app/assets/images/btn/italic.png +0 -0
- data/app/assets/images/btn/like.png +0 -0
- data/app/assets/images/btn/linkedin.png +0 -0
- data/app/assets/images/btn/message_conversation.png +0 -0
- data/app/assets/images/btn/message_inbox.png +0 -0
- data/app/assets/images/btn/message_new.png +0 -0
- data/app/assets/images/btn/message_sentbox.png +0 -0
- data/app/assets/images/btn/message_trash.png +0 -0
- data/app/assets/images/btn/new.png +0 -0
- data/app/assets/images/btn/next_conference.png +0 -0
- data/app/assets/images/btn/next_space.png +0 -0
- data/app/assets/images/btn/nolike.png +0 -0
- data/app/assets/images/btn/notifications.png +0 -0
- data/app/assets/images/btn/pixel.png +0 -0
- data/app/assets/images/btn/point_blue.png +0 -0
- data/app/assets/images/btn/point_gray.png +0 -0
- data/app/assets/images/btn/post.png +0 -0
- data/app/assets/images/btn/search.png +0 -0
- data/app/assets/images/btn/search_icon.png +0 -0
- data/app/assets/images/btn/shadow.png +0 -0
- data/app/assets/images/btn/share.png +0 -0
- data/app/assets/images/btn/subtime.png +0 -0
- data/app/assets/images/btn/success.png +0 -0
- data/app/assets/images/btn/tag_cloud.png +0 -0
- data/app/assets/images/btn/twitter-follow-icon.png +0 -0
- data/app/assets/images/btn/twitter.png +0 -0
- data/app/assets/images/btn/uno.png +0 -0
- data/app/assets/images/btn/viewer.png +0 -0
- data/app/assets/images/btn/warning.png +0 -0
- data/app/assets/images/cancel.png +0 -0
- data/app/assets/images/cleditor/buttons.gif +0 -0
- data/app/assets/images/cleditor/toolbar.gif +0 -0
- data/app/assets/images/frontpage/collaborate.png +0 -0
- data/app/assets/images/frontpage/comments.png +0 -0
- data/app/assets/images/frontpage/green_sq.png +0 -0
- data/app/assets/images/frontpage/meet.png +0 -0
- data/app/assets/images/frontpage/people.png +0 -0
- data/app/assets/images/frontpage/purple_sq.png +0 -0
- data/app/assets/images/frontpage/right_comments.gif +0 -0
- data/app/assets/images/frontpage/right_conference.png +0 -0
- data/app/assets/images/frontpage/right_organizers.gif +0 -0
- data/app/assets/images/frontpage/right_people.gif +0 -0
- data/app/assets/images/frontpage/right_social.gif +0 -0
- data/app/assets/images/frontpage/right_tags.gif +0 -0
- data/app/assets/images/frontpage/right_webcam.gif +0 -0
- data/app/assets/images/frontpage/share.png +0 -0
- data/app/assets/images/frontpage/tags.png +0 -0
- data/app/assets/images/frontpage/yellow_sq.png +0 -0
- data/app/assets/images/header-logo.png +0 -0
- data/app/assets/images/html5-badge-h-css3-semantics.png +0 -0
- data/app/assets/images/icon_checkbox.png +0 -0
- data/app/assets/images/icons/favicon.ico +0 -0
- data/app/assets/images/left.png +0 -0
- data/app/assets/images/lightbox-blank.gif +0 -0
- data/app/assets/images/lightbox-btn-close.gif +0 -0
- data/app/assets/images/lightbox-btn-next.gif +0 -0
- data/app/assets/images/lightbox-btn-prev.gif +0 -0
- data/app/assets/images/lightbox-ico-loading.gif +0 -0
- data/app/assets/images/loader.gif +0 -0
- data/app/assets/images/loading.gif +0 -0
- data/app/assets/images/logo.png +0 -0
- data/app/assets/images/logos/actor/group.png +0 -0
- data/app/assets/images/logos/actor/remote_subject.png +0 -0
- data/app/assets/images/logos/actor/remote_user.png +0 -0
- data/app/assets/images/logos/actor/user.png +0 -0
- data/app/assets/images/logos/contact/group.png +0 -0
- data/app/assets/images/logos/contact/user.png +0 -0
- data/app/assets/images/logos/original/group.png +0 -0
- data/app/assets/images/logos/original/user.png +0 -0
- data/app/assets/images/logos/profile/group.png +0 -0
- data/app/assets/images/logos/profile/user.png +0 -0
- data/app/assets/images/logos/representation/group.png +0 -0
- data/app/assets/images/logos/representation/user.png +0 -0
- data/app/assets/images/mini-loading.gif +0 -0
- data/app/assets/images/right.png +0 -0
- data/app/assets/images/tipsy.gif +0 -0
- data/app/assets/javascripts/activities.js.erb +250 -0
- data/app/assets/javascripts/activities_security_chosen-modified.jquery.js +767 -0
- data/app/assets/javascripts/cheesecake.js +6 -0
- data/app/assets/javascripts/contacts.js +4 -0
- data/app/assets/javascripts/conversations.js +3 -0
- data/app/assets/javascripts/groups.js +5 -0
- data/app/assets/javascripts/invitations.js +8 -0
- data/app/assets/javascripts/jquery.ad-gallery.js +850 -0
- data/app/assets/javascripts/jquery.ad-gallery.pack.js +10 -0
- data/app/assets/javascripts/layouts.js +21 -0
- data/app/assets/javascripts/messages.js +4 -0
- data/app/assets/javascripts/posts.js +1 -0
- data/app/assets/javascripts/preloader.js +6 -0
- data/app/assets/javascripts/profiles.js +9 -0
- data/app/assets/javascripts/relation_customs.js +32 -0
- data/app/assets/javascripts/search.js.erb +3 -0
- data/app/assets/javascripts/settings.js +14 -0
- data/app/assets/javascripts/social_stream-base.js +11 -0
- data/app/assets/javascripts/ties.js +67 -0
- data/app/assets/javascripts/toolbar.js +1 -0
- data/app/assets/javascripts/users.js +2 -0
- data/app/assets/stylesheets/0_devise_sign.css +28 -0
- data/app/assets/stylesheets/_colors.scss +25 -0
- data/app/assets/stylesheets/activities.css.scss +88 -0
- data/app/assets/stylesheets/base.css.scss +257 -0
- data/app/assets/stylesheets/cheesecake.css.scss +55 -0
- data/app/assets/stylesheets/contacts.css.scss +100 -0
- data/app/assets/stylesheets/conversations.css +4 -0
- data/app/assets/stylesheets/footer.css.scss +22 -0
- data/app/assets/stylesheets/frontpage.css.scss +70 -0
- data/app/assets/stylesheets/groups.css +4 -0
- data/app/assets/stylesheets/header.css.scss +203 -0
- data/app/assets/stylesheets/home.css.scss +53 -0
- data/app/assets/stylesheets/images/add-policy.png +0 -0
- data/app/assets/stylesheets/images/fcbkcomplete/close.gif +0 -0
- data/app/assets/stylesheets/images/loading.gif +0 -0
- data/app/assets/stylesheets/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/app/assets/stylesheets/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/app/assets/stylesheets/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/app/assets/stylesheets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/app/assets/stylesheets/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/app/assets/stylesheets/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/app/assets/stylesheets/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/app/assets/stylesheets/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/app/assets/stylesheets/images/ui-icons_222222_256x240.png +0 -0
- data/app/assets/stylesheets/images/ui-icons_2e83ff_256x240.png +0 -0
- data/app/assets/stylesheets/images/ui-icons_454545_256x240.png +0 -0
- data/app/assets/stylesheets/images/ui-icons_888888_256x240.png +0 -0
- data/app/assets/stylesheets/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/app/assets/stylesheets/invitations.css +3 -0
- data/app/assets/stylesheets/location.css.scss +38 -0
- data/app/assets/stylesheets/menu.css.scss +19 -0
- data/app/assets/stylesheets/messages.css.scss +141 -0
- data/app/assets/stylesheets/opa75.png +0 -0
- data/app/assets/stylesheets/profiles.css +4 -0
- data/app/assets/stylesheets/relation_customs.css.scss +233 -0
- data/app/assets/stylesheets/search.css.scss +165 -0
- data/app/assets/stylesheets/settings.css +9 -0
- data/app/assets/stylesheets/social_stream-base.css +5 -0
- data/app/assets/stylesheets/ties.css.scss +12 -0
- data/app/assets/stylesheets/toolbar.css +10 -0
- data/app/assets/stylesheets/users.css +4 -0
- data/app/controllers/activities_controller.rb +19 -0
- data/app/controllers/api_controller.rb +38 -0
- data/app/controllers/authentications_controller.rb +17 -0
- data/app/controllers/cheesecake_controller.rb +9 -0
- data/app/controllers/comments_controller.rb +8 -0
- data/app/controllers/contacts_controller.rb +95 -0
- data/app/controllers/conversations_controller.rb +102 -0
- data/app/controllers/frontpage_controller.rb +23 -0
- data/app/controllers/groups_controller.rb +58 -0
- data/app/controllers/home_controller.rb +3 -0
- data/app/controllers/invitations_controller.rb +36 -0
- data/app/controllers/likes_controller.rb +41 -0
- data/app/controllers/messages_controller.rb +87 -0
- data/app/controllers/notifications_controller.rb +73 -0
- data/app/controllers/omniauth_callbacks_controller.rb +17 -0
- data/app/controllers/permissions_controller.rb +15 -0
- data/app/controllers/posts_controller.rb +3 -0
- data/app/controllers/profiles_controller.rb +9 -0
- data/app/controllers/relation/customs_controller.rb +6 -0
- data/app/controllers/search_controller.rb +79 -0
- data/app/controllers/settings_controller.rb +43 -0
- data/app/controllers/subjects_controller.rb +7 -0
- data/app/controllers/tags_controller.rb +15 -0
- data/app/controllers/ties_controller.rb +11 -0
- data/app/controllers/users_controller.rb +31 -0
- data/app/helpers/activities_helper.rb +37 -0
- data/app/helpers/contacts_helper.rb +24 -0
- data/app/helpers/groups_helper.rb +3 -0
- data/app/helpers/location_helper.rb +46 -0
- data/app/helpers/permissions_helper.rb +16 -0
- data/app/helpers/profiles_helper.rb +37 -0
- data/app/helpers/search_helper.rb +38 -0
- data/app/helpers/settings_helper.rb +9 -0
- data/app/helpers/sidebar_helper.rb +10 -0
- data/app/helpers/subjects_helper.rb +15 -0
- data/app/helpers/toolbar_helper.rb +109 -0
- data/app/helpers/users_helper.rb +4 -0
- data/app/mailers/invitation_mailer.rb +11 -0
- data/app/models/ability.rb +2 -0
- data/app/models/activity.rb +390 -0
- data/app/models/activity_object.rb +64 -0
- data/app/models/activity_object_activity.rb +14 -0
- data/app/models/activity_verb.rb +22 -0
- data/app/models/actor.rb +553 -0
- data/app/models/audience.rb +9 -0
- data/app/models/authentication.rb +3 -0
- data/app/models/comment.rb +10 -0
- data/app/models/contact.rb +209 -0
- data/app/models/group.rb +51 -0
- data/app/models/like.rb +49 -0
- data/app/models/permission.rb +52 -0
- data/app/models/post.rb +12 -0
- data/app/models/profile.rb +58 -0
- data/app/models/relation.rb +169 -0
- data/app/models/relation/custom.rb +112 -0
- data/app/models/relation/public.rb +11 -0
- data/app/models/relation/reject.rb +3 -0
- data/app/models/relation/single.rb +22 -0
- data/app/models/relation_permission.rb +4 -0
- data/app/models/tie.rb +147 -0
- data/app/models/user.rb +148 -0
- data/app/views/activities/_activity.html.erb +5 -0
- data/app/views/activities/_child.html.erb +18 -0
- data/app/views/activities/_comments.html.erb +3 -0
- data/app/views/activities/_filter.html.erb +83 -0
- data/app/views/activities/_index.html.erb +14 -0
- data/app/views/activities/_new.html.erb +56 -0
- data/app/views/activities/_options.html.erb +27 -0
- data/app/views/activities/_root.html.erb +37 -0
- data/app/views/activities/_wall.html.erb +5 -0
- data/app/views/activities/index.html.erb +0 -0
- data/app/views/activities/index.js.erb +3 -0
- data/app/views/activity_objects/_activity_object.html.erb +7 -0
- data/app/views/actors/_actor.html.erb +0 -0
- data/app/views/actors/_actor_cheesecake.html.erb +4 -0
- data/app/views/api/activity_atom_feed.atom.builder +40 -0
- data/app/views/avatars/index.html.erb +15 -0
- data/app/views/avatars/update.js.erb +15 -0
- data/app/views/cheesecake/_index.html.erb +38 -0
- data/app/views/cheesecake/index.html.erb +10 -0
- data/app/views/comments/_comment.html.erb +1 -0
- data/app/views/comments/_new.html.erb +47 -0
- data/app/views/comments/create.js.erb +10 -0
- data/app/views/comments/destroy.js.erb +1 -0
- data/app/views/contacts/_contact.html.erb +20 -0
- data/app/views/contacts/_form.html.erb +38 -0
- data/app/views/contacts/_index.html.erb +40 -0
- data/app/views/contacts/_link.html.erb +9 -0
- data/app/views/contacts/_pendings.html.erb +18 -0
- data/app/views/contacts/_suggestions.html.erb +15 -0
- data/app/views/contacts/_suggestions_and_pendings.html.erb +6 -0
- data/app/views/contacts/destroy.js.erb +6 -0
- data/app/views/contacts/edit.html.erb +6 -0
- data/app/views/contacts/index.html.erb +37 -0
- data/app/views/contacts/index.js.erb +3 -0
- data/app/views/contacts/new.html.erb +5 -0
- data/app/views/contacts/suggestion.html.erb +1 -0
- data/app/views/contacts/suggestion.js.erb +1 -0
- data/app/views/conversations/_conversation.html.erb +38 -0
- data/app/views/conversations/_conversation_full.html.erb +71 -0
- data/app/views/conversations/_conversations.html.erb +5 -0
- data/app/views/conversations/_index.html.erb +11 -0
- data/app/views/conversations/_show.html.erb +13 -0
- data/app/views/conversations/edit.html.erb +10 -0
- data/app/views/conversations/index.html.erb +15 -0
- data/app/views/conversations/index.js.erb +6 -0
- data/app/views/conversations/show.html.erb +33 -0
- data/app/views/conversations/show.js.erb +26 -0
- data/app/views/devise/passwords/edit.html.erb +21 -0
- data/app/views/devise/passwords/new.html.erb +27 -0
- data/app/views/devise/registrations/_delete_account.html.erb +20 -0
- data/app/views/devise/registrations/_edit_user.html.erb +113 -0
- data/app/views/devise/registrations/edit.html.erb +20 -0
- data/app/views/devise/registrations/new.html.erb +44 -0
- data/app/views/devise/sessions/new.html.erb +35 -0
- data/app/views/devise/shared/_links.erb +25 -0
- data/app/views/frontpage/_caracteristics.html.erb +23 -0
- data/app/views/frontpage/_social_networks.html.erb +3 -0
- data/app/views/frontpage/_sponsor.html.erb +12 -0
- data/app/views/frontpage/host_meta.xml.builder +11 -0
- data/app/views/frontpage/index.html.erb +69 -0
- data/app/views/groups/_group.html.erb +4 -0
- data/app/views/groups/_group_focus_search.html.erb +2 -0
- data/app/views/groups/_group_global_search.html.erb +2 -0
- data/app/views/groups/_group_with_details.html.erb +2 -0
- data/app/views/groups/_index.html.erb +19 -0
- data/app/views/groups/_new.html.erb +81 -0
- data/app/views/groups/_show.html.erb +33 -0
- data/app/views/groups/_tag_cloud.html.erb +25 -0
- data/app/views/groups/index.html.erb +57 -0
- data/app/views/groups/index.js.erb +1 -0
- data/app/views/groups/new.html.erb +9 -0
- data/app/views/groups/show.html.erb +1 -0
- data/app/views/groups/show.js.erb +2 -0
- data/app/views/home/_groups.html.erb +24 -0
- data/app/views/home/index.html.erb +19 -0
- data/app/views/home/index.js.erb +5 -0
- data/app/views/invitation_mailer/send_invitation.html.erb +79 -0
- data/app/views/invitation_mailer/send_invitation.text.erb +21 -0
- data/app/views/invitations/_new.html.erb +28 -0
- data/app/views/invitations/new.html.erb +9 -0
- data/app/views/invitations/new.js.erb +4 -0
- data/app/views/layouts/_account.html.erb +18 -0
- data/app/views/layouts/_flash.html.erb +5 -0
- data/app/views/layouts/_footer.html.erb +16 -0
- data/app/views/layouts/_header.erb +5 -0
- data/app/views/layouts/_header_dropdown_menu.html.erb +19 -0
- data/app/views/layouts/_header_dropdown_menu_sessions.html.erb +14 -0
- data/app/views/layouts/_header_signed_in.erb +45 -0
- data/app/views/layouts/_header_signed_out.erb +34 -0
- data/app/views/layouts/_representation.html.erb +28 -0
- data/app/views/layouts/_search.html.erb +62 -0
- data/app/views/layouts/_settings.html.erb +18 -0
- data/app/views/layouts/application.html.erb +60 -0
- data/app/views/layouts/frontpage.html.erb +43 -0
- data/app/views/likes/create.js.erb +2 -0
- data/app/views/likes/destroy.js.erb +1 -0
- data/app/views/location/_location.html.erb +3 -0
- data/app/views/location/_location_body.html.erb +18 -0
- data/app/views/message_mailer/new_message_email.html.erb +35 -0
- data/app/views/message_mailer/new_message_email.text.erb +8 -0
- data/app/views/message_mailer/reply_message_email.html.erb +35 -0
- data/app/views/message_mailer/reply_message_email.text.erb +8 -0
- data/app/views/messages/_form.html.erb +39 -0
- data/app/views/messages/_message.html.erb +31 -0
- data/app/views/messages/_new.html.erb +10 -0
- data/app/views/messages/new.html.erb +37 -0
- data/app/views/messages/new.js.erb +28 -0
- data/app/views/notification_mailer/new_notification_email.html.erb +35 -0
- data/app/views/notification_mailer/new_notification_email.text.erb +9 -0
- data/app/views/notifications/_index.html.erb +21 -0
- data/app/views/notifications/_notification.html.erb +41 -0
- data/app/views/notifications/activities/_follow.html.erb +10 -0
- data/app/views/notifications/activities/_follow.text.erb +8 -0
- data/app/views/notifications/activities/_like.html.erb +30 -0
- data/app/views/notifications/activities/_like.text.erb +23 -0
- data/app/views/notifications/activities/_make-friend.html.erb +10 -0
- data/app/views/notifications/activities/_make-friend.text.erb +7 -0
- data/app/views/notifications/activities/_post.html.erb +22 -0
- data/app/views/notifications/activities/_post.text.erb +17 -0
- data/app/views/notifications/activities/_update.html.erb +18 -0
- data/app/views/notifications/activities/_update.text.erb +15 -0
- data/app/views/notifications/index.html.erb +13 -0
- data/app/views/notifications/index.js.erb +6 -0
- data/app/views/objects/_destroy.js.erb +2 -0
- data/app/views/objects/_new_activity.html.erb +8 -0
- data/app/views/objects/_show.html.erb +3 -0
- data/app/views/permissions/_index.html.erb +35 -0
- data/app/views/permissions/index.js.erb +15 -0
- data/app/views/posts/_new_activity.html.erb +1 -0
- data/app/views/posts/_new_activity_fields.erb +7 -0
- data/app/views/posts/_post.html.erb +3 -0
- data/app/views/posts/_post_focus_search.html.erb +37 -0
- data/app/views/posts/_post_global_search.html.erb +18 -0
- data/app/views/posts/_post_with_details.html.erb +3 -0
- data/app/views/posts/create.js.erb +7 -0
- data/app/views/posts/destroy.js.erb +1 -0
- data/app/views/posts/show.html.erb +10 -0
- data/app/views/profiles/_contact.html.erb +81 -0
- data/app/views/profiles/_experience.html.erb +22 -0
- data/app/views/profiles/_personal.html.erb +74 -0
- data/app/views/profiles/_profile.html.erb +40 -0
- data/app/views/profiles/_tags.html.erb +22 -0
- data/app/views/profiles/edit.html.erb +205 -0
- data/app/views/profiles/show.html.erb +22 -0
- data/app/views/profiles/update.js.erb +20 -0
- data/app/views/relation/customs/_form.html.erb +29 -0
- data/app/views/relation/customs/_list.html.erb +63 -0
- data/app/views/relation/customs/_update_rules.js.erb +5 -0
- data/app/views/relation/customs/create.js.erb +21 -0
- data/app/views/relation/customs/index.html.erb +43 -0
- data/app/views/relation/customs/update.js.erb +11 -0
- data/app/views/search/_extended_search.html.erb +19 -0
- data/app/views/search/_form.html.erb +54 -0
- data/app/views/search/_header_search.html.erb +16 -0
- data/app/views/search/_index.html.erb +12 -0
- data/app/views/search/index.html.erb +9 -0
- data/app/views/search/index.js.erb +22 -0
- data/app/views/settings/_api_key.html.erb +26 -0
- data/app/views/settings/_destroy.html.erb +17 -0
- data/app/views/settings/_index.html.erb +8 -0
- data/app/views/settings/_notifications.html.erb +34 -0
- data/app/views/settings/index.html.erb +16 -0
- data/app/views/settings/index.js.erb +7 -0
- data/app/views/subjects/_contacts.html.erb +18 -0
- data/app/views/subjects/_show.js.erb +5 -0
- data/app/views/subjects/_subject.html.erb +8 -0
- data/app/views/subjects/_subject_with_details.html.erb +17 -0
- data/app/views/ties/index.html.erb +8 -0
- data/app/views/toolbar/_home.html.erb +15 -0
- data/app/views/toolbar/_logo.html.erb +23 -0
- data/app/views/toolbar/_messages.html.erb +11 -0
- data/app/views/toolbar/_profile.html.erb +24 -0
- data/app/views/toolbar/_subject.html.erb +10 -0
- data/app/views/users/_groups.html.erb +22 -0
- data/app/views/users/_index.html.erb +19 -0
- data/app/views/users/_show.html.erb +34 -0
- data/app/views/users/_user.html.erb +2 -0
- data/app/views/users/_user_focus_search.html.erb +2 -0
- data/app/views/users/_user_global_search.html.erb +2 -0
- data/app/views/users/_user_with_details.html.erb +2 -0
- data/app/views/users/index.html.erb +41 -0
- data/app/views/users/index.js.erb +1 -0
- data/app/views/users/info.html.erb +0 -0
- data/app/views/users/show.html.erb +1 -0
- data/app/views/users/show.js.erb +2 -0
- data/app/views/users/show.xml.builder +15 -0
- data/config/locales/en.yml +472 -0
- data/config/locales/es.yml +470 -0
- data/config/routes.rb +102 -0
- data/db/migrate/20110610112023_create_social_stream.rb +319 -0
- data/db/migrate/20110705103202_empty_ties_count.rb +17 -0
- data/db/migrate/20110712090343_remove_spheres.rb +30 -0
- data/db/migrate/20110712142140_remove_permission_function.rb +26 -0
- data/db/migrate/20110912074426_add_reject_relation.rb +29 -0
- data/db/migrate/20111124100618_object_actors.rb +52 -0
- data/db/migrate/20111221103509_add_language_field.rb +13 -0
- data/lib/acts_as_taggable_on/acts_as_taggable_on/dirty.rb +37 -0
- data/lib/acts_as_taggable_on/social_stream.rb +58 -0
- data/lib/generators/social_stream/base/install_generator.rb +66 -0
- data/lib/generators/social_stream/base/templates/initializer.rb +32 -0
- data/lib/generators/social_stream/base/templates/navigation.rb +4 -0
- data/lib/generators/social_stream/base/templates/relations.yml +39 -0
- data/lib/generators/social_stream/base/templates/sphinx.yml +9 -0
- data/lib/paperclip/social_stream.rb +6 -0
- data/lib/social_stream-base.rb +104 -0
- data/lib/social_stream/ability.rb +7 -0
- data/lib/social_stream/ability/base.rb +101 -0
- data/lib/social_stream/base/dependencies.rb +47 -0
- data/lib/social_stream/base/engine.rb +69 -0
- data/lib/social_stream/base/version.rb +5 -0
- data/lib/social_stream/controllers/cancan_devise_integration.rb +33 -0
- data/lib/social_stream/controllers/helpers.rb +135 -0
- data/lib/social_stream/controllers/objects.rb +39 -0
- data/lib/social_stream/d3.rb +53 -0
- data/lib/social_stream/migrations/base.rb +58 -0
- data/lib/social_stream/migrations/components.rb +19 -0
- data/lib/social_stream/models/object.rb +133 -0
- data/lib/social_stream/models/subject.rb +118 -0
- data/lib/social_stream/models/supertype.rb +37 -0
- data/lib/social_stream/populate.rb +26 -0
- data/lib/social_stream/test_helpers.rb +11 -0
- data/lib/social_stream/test_helpers/controllers.rb +122 -0
- data/lib/social_stream/toolbar_config/base.rb +94 -0
- data/lib/social_stream/views/list.rb +17 -0
- data/lib/social_stream/views/settings/base.rb +43 -0
- data/lib/social_stream/views/sidebar/base.rb +27 -0
- data/lib/tasks/db/populate.rake +241 -0
- data/lib/tasks/workers.rake +163 -0
- data/social_stream-base.gemspec +83 -0
- data/spec/controllers/comments_controller_spec.rb +66 -0
- data/spec/controllers/contacts_controller_spec.rb +111 -0
- data/spec/controllers/frontpage_controller_spec.rb +16 -0
- data/spec/controllers/groups_controller_spec.rb +178 -0
- data/spec/controllers/home_controller_spec.rb +56 -0
- data/spec/controllers/invitations_controller_spec.rb +34 -0
- data/spec/controllers/likes_controller_spec.rb +48 -0
- data/spec/controllers/notifications_controller_spec.rb +46 -0
- data/spec/controllers/permissions_controller_spec.rb +45 -0
- data/spec/controllers/posts_controller_spec.rb +233 -0
- data/spec/controllers/profiles_controller_spec.rb +102 -0
- data/spec/controllers/relation_customs_controller_spec.rb +139 -0
- data/spec/controllers/representations_spec.rb +74 -0
- data/spec/controllers/settings_controller_spec.rb +41 -0
- data/spec/controllers/subjects_controller.rb +14 -0
- data/spec/controllers/users_controller_spec.rb +98 -0
- data/spec/dummy/.gitignore +5 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +8 -0
- data/spec/dummy/app/assets/stylesheets/application.css +8 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +44 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +40 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +30 -0
- data/spec/dummy/config/environments/production.rb +54 -0
- data/spec/dummy/config/environments/test.rb +40 -0
- data/spec/dummy/config/environments/test_pg.rb +35 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/devise.rb +220 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy/config/initializers/mailboxer.rb +8 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/social_stream.rb +32 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/navigation.rb +4 -0
- data/spec/dummy/config/relations.yml +39 -0
- data/spec/dummy/config/routes.rb +60 -0
- data/spec/dummy/db/schema.rb +5 -0
- data/spec/dummy/db/seeds.rb +8 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/factories/activity.rb +52 -0
- data/spec/factories/comment.rb +6 -0
- data/spec/factories/contact.rb +16 -0
- data/spec/factories/group.rb +5 -0
- data/spec/factories/post.rb +11 -0
- data/spec/factories/relation_custom.rb +4 -0
- data/spec/factories/tie.rb +43 -0
- data/spec/factories/user.rb +6 -0
- data/spec/integration/navigation_spec.rb +33 -0
- data/spec/models/activity_authorization_spec.rb +350 -0
- data/spec/models/activity_spec.rb +131 -0
- data/spec/models/actor_spec.rb +80 -0
- data/spec/models/contact_spec.rb +53 -0
- data/spec/models/group_spec.rb +28 -0
- data/spec/models/like_spec.rb +68 -0
- data/spec/models/post_spec.rb +63 -0
- data/spec/models/profile_spec.rb +39 -0
- data/spec/models/relation_spec.rb +78 -0
- data/spec/models/tie_spec.rb +169 -0
- data/spec/models/user_spec.rb +109 -0
- data/spec/social_stream_spec.rb +7 -0
- data/spec/spec_helper.rb +26 -0
- data/spec/support/cancan.rb +1 -0
- data/spec/support/db.rb +7 -0
- data/spec/support/devise.rb +4 -0
- data/spec/support/mock.rb +4 -0
- data/vendor/assets/javascripts/ajax.paginate.js +46 -0
- data/vendor/assets/javascripts/d3.geom.js +825 -0
- data/vendor/assets/javascripts/d3.js +4013 -0
- data/vendor/assets/javascripts/d3.layout.js +1865 -0
- data/vendor/assets/javascripts/hoverIntent.js +84 -0
- data/vendor/assets/javascripts/jqcloud-0.1.3.js +87 -0
- data/vendor/assets/javascripts/jquery.ae.image.resize.js +69 -0
- data/vendor/assets/javascripts/jquery.ba-url.js +1091 -0
- data/vendor/assets/javascripts/jquery.cleditor.min.js +31 -0
- data/vendor/assets/javascripts/jquery.fcbkcomplete.js +553 -0
- data/vendor/assets/javascripts/jquery.lightbox-with-resize-plugin.js +533 -0
- data/vendor/assets/javascripts/jquery.livequery.js +250 -0
- data/vendor/assets/javascripts/jquery.screw.js +186 -0
- data/vendor/assets/javascripts/jquery.scrollTo.min.js +11 -0
- data/vendor/assets/javascripts/jquery.tipsy.js +263 -0
- data/vendor/assets/javascripts/jquery.validate.js +1166 -0
- data/vendor/assets/javascripts/jquery.validate.old.js +1132 -0
- data/vendor/assets/javascripts/jquery.watermarkinput.js +81 -0
- data/vendor/assets/javascripts/menu.js +25 -0
- data/vendor/assets/javascripts/superfish.js +121 -0
- data/vendor/assets/stylesheets/carousel.css +23 -0
- data/vendor/assets/stylesheets/chosen-sprite.png +0 -0
- data/vendor/assets/stylesheets/chosen.css +317 -0
- data/vendor/assets/stylesheets/fcbkComplete.css +44 -0
- data/vendor/assets/stylesheets/jqcloud.css +15 -0
- data/vendor/assets/stylesheets/jquery-ui.css +620 -0
- data/vendor/assets/stylesheets/jquery.cleditor.css +24 -0
- data/vendor/assets/stylesheets/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/vendor/assets/stylesheets/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/vendor/assets/stylesheets/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/vendor/assets/stylesheets/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/vendor/assets/stylesheets/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/vendor/assets/stylesheets/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/vendor/assets/stylesheets/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/vendor/assets/stylesheets/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/vendor/assets/stylesheets/smoothness/jquery-ui-1.7.3.custom.css +405 -0
- data/vendor/assets/stylesheets/smoothness/jquery-ui-1.8.4.custom.css +572 -0
- data/vendor/assets/stylesheets/tipsy.css +25 -0
- metadata +997 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
class ActivityObjectActivity < ActiveRecord::Base
|
|
2
|
+
belongs_to :activity, :dependent => :destroy
|
|
3
|
+
belongs_to :activity_object
|
|
4
|
+
|
|
5
|
+
before_create :default_object_type
|
|
6
|
+
|
|
7
|
+
private
|
|
8
|
+
|
|
9
|
+
# Default objects are direct objects. http://activitystrea.ms/head/atom-activity.html#activity.object
|
|
10
|
+
# Other type of objects are targets. http://activitystrea.ms/head/atom-activity.html#activity.target
|
|
11
|
+
def default_object_type
|
|
12
|
+
self.object_type ||= "object"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class ActivityVerb < ActiveRecord::Base
|
|
2
|
+
# Activity Strems verbs
|
|
3
|
+
Available = %w(follow like make-friend post update)
|
|
4
|
+
|
|
5
|
+
validates_uniqueness_of :name
|
|
6
|
+
|
|
7
|
+
has_many :activities
|
|
8
|
+
|
|
9
|
+
scope :verb_name, lambda{ |n|
|
|
10
|
+
where(:name => n)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
class << self
|
|
14
|
+
def [] name
|
|
15
|
+
if Available.include?(name)
|
|
16
|
+
find_or_create_by_name name
|
|
17
|
+
else
|
|
18
|
+
raise "ActivityVerb not available: #{ name }"
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
data/app/models/actor.rb
ADDED
|
@@ -0,0 +1,553 @@
|
|
|
1
|
+
# An {Actor} represents a social entity. This includes individuals, but also groups, departments,
|
|
2
|
+
# organizations even nations or states.
|
|
3
|
+
#
|
|
4
|
+
# Actors are the nodes of a social network. Two actors are linked by {Tie Ties}. The
|
|
5
|
+
# type of a {Tie} is a {Relation}. Each actor can define and customize their relations own
|
|
6
|
+
# {Relation Relations}.
|
|
7
|
+
#
|
|
8
|
+
# Every {Actor} has an Avatar, a {Profile} with personal o group information, contact data, etc.
|
|
9
|
+
#
|
|
10
|
+
# = Actor subtypes
|
|
11
|
+
# An actor subtype is called a {SocialStream::Models::Subject Subject}.
|
|
12
|
+
# {SocialStream} provides two actor subtypes, {User} and {Group}, but the
|
|
13
|
+
# application developer can define as many actor subtypes as required.
|
|
14
|
+
# Actor subtypes are added to +config/initializers/social_stream.rb+
|
|
15
|
+
#
|
|
16
|
+
#
|
|
17
|
+
class Actor < ActiveRecord::Base
|
|
18
|
+
@subtypes_name = :subject
|
|
19
|
+
include SocialStream::Models::Supertype
|
|
20
|
+
include SocialStream::Models::Object
|
|
21
|
+
|
|
22
|
+
validates_presence_of :name, :subject_type
|
|
23
|
+
|
|
24
|
+
acts_as_messageable
|
|
25
|
+
|
|
26
|
+
acts_as_url :name, :url_attribute => :slug
|
|
27
|
+
|
|
28
|
+
has_one :profile, :dependent => :destroy
|
|
29
|
+
|
|
30
|
+
has_many :avatars,
|
|
31
|
+
:validate => true,
|
|
32
|
+
:autosave => true
|
|
33
|
+
has_one :avatar,
|
|
34
|
+
:conditions => { :active => true }
|
|
35
|
+
|
|
36
|
+
has_many :sent_contacts,
|
|
37
|
+
:class_name => 'Contact',
|
|
38
|
+
:foreign_key => 'sender_id',
|
|
39
|
+
:dependent => :destroy
|
|
40
|
+
|
|
41
|
+
has_many :received_contacts,
|
|
42
|
+
:class_name => 'Contact',
|
|
43
|
+
:foreign_key => 'receiver_id',
|
|
44
|
+
:dependent => :destroy
|
|
45
|
+
|
|
46
|
+
has_many :sent_ties,
|
|
47
|
+
:through => :sent_contacts,
|
|
48
|
+
:source => :ties
|
|
49
|
+
|
|
50
|
+
has_many :received_ties,
|
|
51
|
+
:through => :received_contacts,
|
|
52
|
+
:source => :ties
|
|
53
|
+
|
|
54
|
+
has_many :senders,
|
|
55
|
+
:through => :received_contacts,
|
|
56
|
+
:uniq => true
|
|
57
|
+
|
|
58
|
+
has_many :receivers,
|
|
59
|
+
:through => :sent_contacts,
|
|
60
|
+
:uniq => true
|
|
61
|
+
|
|
62
|
+
has_many :relations,
|
|
63
|
+
:dependent => :destroy
|
|
64
|
+
|
|
65
|
+
has_many :authored_objects,
|
|
66
|
+
:class_name => "ActivityObject",
|
|
67
|
+
:foreign_key => :author_id,
|
|
68
|
+
:dependent => :destroy
|
|
69
|
+
|
|
70
|
+
has_many :owned_objects,
|
|
71
|
+
:class_name => "ActivityObject",
|
|
72
|
+
:foreign_key => :owner_id,
|
|
73
|
+
:dependent => :destroy
|
|
74
|
+
|
|
75
|
+
scope :alphabetic, order('actors.name')
|
|
76
|
+
|
|
77
|
+
scope :letter, lambda { |param|
|
|
78
|
+
if param.present?
|
|
79
|
+
where('actors.name LIKE ?', "#{ param }%")
|
|
80
|
+
end
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
scope :name_search, lambda { |param|
|
|
84
|
+
if param.present?
|
|
85
|
+
where('actors.name LIKE ?', "%#{ param }%")
|
|
86
|
+
end
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
scope :tagged_with, lambda { |param|
|
|
90
|
+
if param.present?
|
|
91
|
+
joins(:activity_object).merge(ActivityObject.tagged_with(param))
|
|
92
|
+
end
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
scope :distinct_initials, select('DISTINCT SUBSTR(actors.name,1,1) as initial').order("initial ASC")
|
|
96
|
+
|
|
97
|
+
scope :contacted_to, lambda { |a|
|
|
98
|
+
joins(:sent_contacts).merge(Contact.active.received_by(a))
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
scope :contacted_from, lambda { |a|
|
|
102
|
+
joins(:received_contacts).merge(Contact.active.sent_by(a))
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
scope :followed_by, lambda { |a|
|
|
106
|
+
select("DISTINCT actors.*").
|
|
107
|
+
joins(:received_ties => { :relation => :permissions }).
|
|
108
|
+
merge(Contact.sent_by(a)).
|
|
109
|
+
merge(Permission.follow)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
after_create :create_initial_relations
|
|
113
|
+
|
|
114
|
+
after_create :save_or_create_profile
|
|
115
|
+
|
|
116
|
+
class << self
|
|
117
|
+
# Get actor's id from an object, if possible
|
|
118
|
+
def normalize_id(a)
|
|
119
|
+
case a
|
|
120
|
+
when Integer
|
|
121
|
+
a
|
|
122
|
+
when Array
|
|
123
|
+
a.map{ |e| normalize_id(e) }
|
|
124
|
+
else
|
|
125
|
+
Actor.normalize(a).id
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
# Get actor from object, if possible
|
|
129
|
+
def normalize(a)
|
|
130
|
+
case a
|
|
131
|
+
when Actor
|
|
132
|
+
a
|
|
133
|
+
when Integer
|
|
134
|
+
Actor.find a
|
|
135
|
+
when Array
|
|
136
|
+
a.map{ |e| Actor.normalize(e) }
|
|
137
|
+
else
|
|
138
|
+
begin
|
|
139
|
+
a.actor
|
|
140
|
+
rescue
|
|
141
|
+
raise "Unable to normalize actor #{ a.inspect }"
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def find_by_webfinger!(link)
|
|
147
|
+
link =~ /(acct:)?(.*)@/
|
|
148
|
+
|
|
149
|
+
find_by_slug! $2
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
#Returning the email address of the model if an email should be sent for this object (Message or Notification).
|
|
154
|
+
#If the actor is a Group and has no email address, an array with the email of the highest rank members will be
|
|
155
|
+
#returned isntead.
|
|
156
|
+
#
|
|
157
|
+
#If no mail has to be sent, return nil.
|
|
158
|
+
def mailboxer_email(object)
|
|
159
|
+
#If actor has disabled the emails, return nil.
|
|
160
|
+
return nil if !notify_by_email
|
|
161
|
+
#If actor has enabled the emails and has email
|
|
162
|
+
return "#{name} <#{email}>" if email.present?
|
|
163
|
+
#If actor is a Group, has enabled emails but no mail we return the highest_rank ones.
|
|
164
|
+
if (group = self.subject).is_a? Group
|
|
165
|
+
relation = group.relation_customs.sort.first
|
|
166
|
+
receivers = group.contact_actors(:direction => :sent, :relations => relation)
|
|
167
|
+
emails = Array.new
|
|
168
|
+
receivers.each do |receiver|
|
|
169
|
+
next unless Actor.normalize(receiver).subject_type.eql?("User")
|
|
170
|
+
|
|
171
|
+
receiver_emails = receiver.mailboxer_email(object)
|
|
172
|
+
case receiver_emails
|
|
173
|
+
when String
|
|
174
|
+
emails << receiver_emails
|
|
175
|
+
when Array
|
|
176
|
+
receiver_emails.each do |receiver_email|
|
|
177
|
+
emails << receiver_email
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
return emails
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# The subject instance for this actor
|
|
186
|
+
def subject
|
|
187
|
+
subtype_instance
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
# All the {Relation relations} defined by this {Actor}
|
|
191
|
+
def relation_customs
|
|
192
|
+
relations.where(:type => 'Relation::Custom')
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
# A given relation defined and managed by this actor
|
|
196
|
+
def relation_custom(name)
|
|
197
|
+
relation_customs.find_by_name(name)
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# The {Relation::Public} for this {Actor}
|
|
201
|
+
def relation_public
|
|
202
|
+
Relation::Public.of(self)
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# The {Relation::Reject} for this {Actor}
|
|
206
|
+
def relation_reject
|
|
207
|
+
Relation::Reject.of(self)
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
# All the {Actor Actors} this one has ties with:
|
|
211
|
+
#
|
|
212
|
+
# actor.contact_actors #=> array of actors that sent and receive ties from actor
|
|
213
|
+
#
|
|
214
|
+
#
|
|
215
|
+
#
|
|
216
|
+
# There are several options available to refine the query:
|
|
217
|
+
# type:: Filter by the class of the contacts ({User}, {Group}, etc.)
|
|
218
|
+
# actor.contact_actors(:type => :user) #=> array of user actors. Exclude groups, etc.
|
|
219
|
+
#
|
|
220
|
+
# direction:: +:sent+ leaves only the actors this one has ties to. +:received+ gets
|
|
221
|
+
# the actors sending ties to this actor, whether this actor added them or not
|
|
222
|
+
# actor.contact_actors(:direction => :sent) #=> all the receivers of ties from actor
|
|
223
|
+
# relations:: Restrict to ties made up with +relations+. In the case of both directions,
|
|
224
|
+
# only relations belonging to {Actor} are considered.
|
|
225
|
+
# It defaults to actor's {Relation::Custom custom relations}
|
|
226
|
+
# actor.contact_actors(:relations => [2]) #=> actors tied with relation #2
|
|
227
|
+
# include_self:: False by default, do not include this actor even they have ties with themselves.
|
|
228
|
+
# load_subjects:: True by default, make the queries for {http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#label-Eager+loading+of+associations eager loading} of {SocialStream::Models::Subject Subject}
|
|
229
|
+
#
|
|
230
|
+
def contact_actors(options = {})
|
|
231
|
+
subject_types = Array(options[:type] || self.class.subtypes)
|
|
232
|
+
subject_classes = subject_types.map{ |s| s.to_s.classify }
|
|
233
|
+
|
|
234
|
+
as = Actor.select('actors.*').
|
|
235
|
+
# PostgreSQL requires that all the columns must be included in the GROUP BY
|
|
236
|
+
group((Actor.columns.map(&:name).map{ |c| "actors.#{ c }" } + [ "contacts.created_at" ]).join(", ")).
|
|
237
|
+
where('actors.subject_type' => subject_classes)
|
|
238
|
+
|
|
239
|
+
if options[:load_subjects].nil? || options[:load_subjects]
|
|
240
|
+
as = as.includes(subject_types)
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
# A blank :direction means reciprocate contacts, there must be ties in both directions
|
|
244
|
+
#
|
|
245
|
+
# This is achieved by getting the id of all the contacts that are sending ties
|
|
246
|
+
# Then, we filter the sent contacts query to only those contacts
|
|
247
|
+
if options[:direction].blank?
|
|
248
|
+
rcv_opts = options.dup
|
|
249
|
+
rcv_opts[:direction] = :received
|
|
250
|
+
rcv_opts[:load_subjects] = false
|
|
251
|
+
|
|
252
|
+
# Get the id of actors that are sending to this one
|
|
253
|
+
sender_ids = contact_actors(rcv_opts).map(&:id)
|
|
254
|
+
|
|
255
|
+
# Filter the sent query with these ids
|
|
256
|
+
as = as.where(:id => sender_ids)
|
|
257
|
+
|
|
258
|
+
options[:direction] = :sent
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
case options[:direction]
|
|
262
|
+
when :sent
|
|
263
|
+
as = as.joins(:received_ties => :relation).merge(Contact.sent_by(self))
|
|
264
|
+
when :received
|
|
265
|
+
as = as.joins(:sent_ties => :relation).merge(Contact.received_by(self))
|
|
266
|
+
else
|
|
267
|
+
raise "How do you get here?!"
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
if options[:include_self].blank?
|
|
271
|
+
as = as.where("actors.id != ?", self.id)
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
if options[:relations].present?
|
|
275
|
+
as = as.merge(Tie.related_by(options[:relations]))
|
|
276
|
+
else
|
|
277
|
+
as = as.merge(Relation.where(:type => ['Relation::Custom', 'Relation::Public']))
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
as
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
# All the {SocialStream::Models::Subject subjects} that send or receive at least one {Tie} to this {Actor}
|
|
284
|
+
#
|
|
285
|
+
# When passing a block, it will be evaluated for building the actors query, allowing to add
|
|
286
|
+
# options before the mapping to subjects
|
|
287
|
+
#
|
|
288
|
+
# See #contact_actors for options
|
|
289
|
+
def contact_subjects(options = {})
|
|
290
|
+
as = contact_actors(options)
|
|
291
|
+
|
|
292
|
+
if block_given?
|
|
293
|
+
as = yield(as)
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
as.map(&:subject)
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
# Return a contact to subject.
|
|
300
|
+
def contact_to(subject)
|
|
301
|
+
sent_contacts.received_by(subject).first
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
# Return a contact to subject. Create it if it does not exist
|
|
305
|
+
def contact_to!(subject)
|
|
306
|
+
contact_to(subject) ||
|
|
307
|
+
sent_contacts.create!(:receiver => Actor.normalize(subject))
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
# The {Contact} of this {Actor} to self (totally close!)
|
|
311
|
+
def ego_contact
|
|
312
|
+
contact_to!(self)
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
def sent_active_contact_ids
|
|
316
|
+
@sent_active_contact_ids ||=
|
|
317
|
+
load_sent_active_contact_ids
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
# By now, it returns a suggested {Contact} to another {Actor} without any current {Tie}
|
|
321
|
+
#
|
|
322
|
+
# @return [Contact]
|
|
323
|
+
def suggestions(size = 1)
|
|
324
|
+
candidates = Actor.where(Actor.arel_table[:id].not_in(sent_active_contact_ids + [id]))
|
|
325
|
+
|
|
326
|
+
size.times.map {
|
|
327
|
+
candidates.delete_at rand(candidates.size)
|
|
328
|
+
}.compact.map { |a|
|
|
329
|
+
contact_to! a
|
|
330
|
+
}
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
# Set of ties sent by this actor received by subject
|
|
334
|
+
def ties_to(subject)
|
|
335
|
+
sent_ties.merge(Contact.received_by(subject))
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
# Is there any {Tie} sent by this actor and received by subject
|
|
339
|
+
def ties_to?(subject)
|
|
340
|
+
ties_to(subject).present?
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
# The {Tie ties} sent by this actor, plus the second grade ties
|
|
344
|
+
def egocentric_ties
|
|
345
|
+
@egocentric_ties ||=
|
|
346
|
+
load_egocentric_ties
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
# Can this actor be represented by subject. Does she has permissions for it?
|
|
351
|
+
def represented_by?(subject)
|
|
352
|
+
return false if subject.blank?
|
|
353
|
+
|
|
354
|
+
self.class.normalize(subject) == self ||
|
|
355
|
+
sent_ties.
|
|
356
|
+
merge(Contact.received_by(subject)).
|
|
357
|
+
joins(:relation => :permissions).
|
|
358
|
+
merge(Permission.represent).
|
|
359
|
+
any?
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
# An {Activity} can be shared with multiple {audicences Audience}, which corresponds to a {Relation}.
|
|
363
|
+
#
|
|
364
|
+
# This method returns all the {relations Relation} that this actor can use to broadcast an Activity
|
|
365
|
+
#
|
|
366
|
+
#
|
|
367
|
+
def activity_relations(subject, options = {})
|
|
368
|
+
if Actor.normalize(subject) == self
|
|
369
|
+
return relation_customs + Array.wrap(relation_public)
|
|
370
|
+
else
|
|
371
|
+
Array.new
|
|
372
|
+
end
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
# Are there any activity_relations present?
|
|
376
|
+
def activity_relations?(*args)
|
|
377
|
+
activity_relations(*args).any?
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
# Is this {Actor} allowed to create a comment on activity?
|
|
381
|
+
#
|
|
382
|
+
# We are allowing comments from everyone signed in by now
|
|
383
|
+
def can_comment?(activity)
|
|
384
|
+
return true
|
|
385
|
+
|
|
386
|
+
comment_relations(activity).any?
|
|
387
|
+
end
|
|
388
|
+
|
|
389
|
+
# Are there any relations that allow this actor to create a comment on activity?
|
|
390
|
+
def comment_relations(activity)
|
|
391
|
+
activity.relations.select{ |r| r.is_a?(Relation::Public) } |
|
|
392
|
+
Relation.allow(self, 'create', 'activity', :in => activity.relations)
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
def pending_contacts_count
|
|
396
|
+
received_contacts.not_reflexive.pending.count
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
def pending_contacts?
|
|
400
|
+
pending_contacts_count > 0
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
# Build a new {Contact} from each that has not inverse
|
|
404
|
+
def pending_contacts
|
|
405
|
+
received_contacts.pending.includes(:inverse).all.map do |c|
|
|
406
|
+
c.inverse ||
|
|
407
|
+
c.receiver.contact_to!(c.sender)
|
|
408
|
+
end
|
|
409
|
+
end
|
|
410
|
+
|
|
411
|
+
# Count the contacts in common between this {Actor} and subject
|
|
412
|
+
def common_contacts_count(subject)
|
|
413
|
+
(sent_active_contact_ids & subject.sent_active_contact_ids).size
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
# The set of {Activity activities} in the wall of this {Actor}.
|
|
417
|
+
#
|
|
418
|
+
# There are two types of walls:
|
|
419
|
+
# home:: includes all the {Activity activities} from this {Actor} and their followed {Actor actors}
|
|
420
|
+
# See {Permission permissions} for more information on the following support
|
|
421
|
+
# profile:: The set of activities in the wall profile of this {Actor}, it includes only the
|
|
422
|
+
# activities from the ties of this actor that can be read by the subject
|
|
423
|
+
#
|
|
424
|
+
# Options:
|
|
425
|
+
# :for:: the subject that is accessing the wall
|
|
426
|
+
# :relation:: show only activities that are attached at this relation level. For example,
|
|
427
|
+
# the wall for members of the group.
|
|
428
|
+
#
|
|
429
|
+
def wall(type, options = {})
|
|
430
|
+
args = {}
|
|
431
|
+
|
|
432
|
+
args[:type] = type
|
|
433
|
+
args[:owner] = self
|
|
434
|
+
# Preserve this options
|
|
435
|
+
[ :for, :object_type ].each do |opt|
|
|
436
|
+
args[opt] = options[opt]
|
|
437
|
+
end
|
|
438
|
+
|
|
439
|
+
if type == :home
|
|
440
|
+
args[:followed] = Actor.followed_by(self).map(&:id)
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
# TODO: this is not scalling for sure. We must use a fact table in the future
|
|
444
|
+
args[:relation_ids] =
|
|
445
|
+
case type
|
|
446
|
+
when :home
|
|
447
|
+
# The relations from followings that can be read
|
|
448
|
+
Relation.allow(self, 'read', 'activity').map(&:id)
|
|
449
|
+
when :profile
|
|
450
|
+
# FIXME: options[:relation]
|
|
451
|
+
#
|
|
452
|
+
# The relations that can be read by options[:for]
|
|
453
|
+
options[:for].present? ?
|
|
454
|
+
Relation.allow(options[:for], 'read', 'activity').map(&:id) :
|
|
455
|
+
[]
|
|
456
|
+
else
|
|
457
|
+
raise "Unknown type of wall: #{ type }"
|
|
458
|
+
end
|
|
459
|
+
|
|
460
|
+
Activity.wall args
|
|
461
|
+
end
|
|
462
|
+
|
|
463
|
+
def logo
|
|
464
|
+
avatar!.logo
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
def avatar!
|
|
468
|
+
avatar || avatars.build
|
|
469
|
+
end
|
|
470
|
+
|
|
471
|
+
# The 'like' qualifications emmited to this actor
|
|
472
|
+
def likes
|
|
473
|
+
Activity.joins(:activity_verb).where('activity_verbs.name' => "like").
|
|
474
|
+
joins(:activity_objects).where('activity_objects.id' => activity_object_id)
|
|
475
|
+
end
|
|
476
|
+
|
|
477
|
+
def liked_by(subject) #:nodoc:
|
|
478
|
+
likes.joins(:contact).merge(Contact.sent_by(subject))
|
|
479
|
+
end
|
|
480
|
+
|
|
481
|
+
# Does subject like this {Actor}?
|
|
482
|
+
def liked_by?(subject)
|
|
483
|
+
liked_by(subject).present?
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
# Build a new activity where subject like this
|
|
487
|
+
def new_like(subject)
|
|
488
|
+
a = Activity.new :verb => "like",
|
|
489
|
+
:contact => subject.contact_to!(self),
|
|
490
|
+
:relation_ids => Array(subject.relation_public.id)
|
|
491
|
+
|
|
492
|
+
a.activity_objects << activity_object
|
|
493
|
+
|
|
494
|
+
a
|
|
495
|
+
end
|
|
496
|
+
|
|
497
|
+
# Use slug as parameter
|
|
498
|
+
def to_param
|
|
499
|
+
slug
|
|
500
|
+
end
|
|
501
|
+
|
|
502
|
+
# JSON compatible with SocialCheesecake
|
|
503
|
+
def cheesecake_json
|
|
504
|
+
{
|
|
505
|
+
:sectors =>
|
|
506
|
+
relation_customs.includes(:ties => :contact).map { |r|
|
|
507
|
+
r.to_cheesecake_hash
|
|
508
|
+
}
|
|
509
|
+
}.to_json
|
|
510
|
+
end
|
|
511
|
+
|
|
512
|
+
private
|
|
513
|
+
|
|
514
|
+
# After create callback
|
|
515
|
+
def create_initial_relations
|
|
516
|
+
Relation::Custom.defaults_for(self)
|
|
517
|
+
Relation::Public.default_for(self)
|
|
518
|
+
Relation::Reject.default_for(self)
|
|
519
|
+
end
|
|
520
|
+
|
|
521
|
+
# After create callback
|
|
522
|
+
#
|
|
523
|
+
# Save the profile if it is present. Otherwise create it
|
|
524
|
+
def save_or_create_profile
|
|
525
|
+
if profile.present?
|
|
526
|
+
profile.actor_id = id
|
|
527
|
+
profile.save!
|
|
528
|
+
else
|
|
529
|
+
create_profile
|
|
530
|
+
end
|
|
531
|
+
end
|
|
532
|
+
|
|
533
|
+
# Calculate {#egocentric_ties}
|
|
534
|
+
def load_egocentric_ties
|
|
535
|
+
ties = sent_ties.includes(:contact).to_a
|
|
536
|
+
|
|
537
|
+
contact_ids = ties.map{ |t| t.contact.receiver_id }
|
|
538
|
+
|
|
539
|
+
second_grade_ties =
|
|
540
|
+
contact_ids.
|
|
541
|
+
map{ |i| Tie.sent_by(i) }.
|
|
542
|
+
flatten
|
|
543
|
+
|
|
544
|
+
ties + second_grade_ties
|
|
545
|
+
end
|
|
546
|
+
|
|
547
|
+
# Calculate {#sent_active_contact_ids}
|
|
548
|
+
def load_sent_active_contact_ids
|
|
549
|
+
sent_contacts.active.map(&:receiver_id)
|
|
550
|
+
end
|
|
551
|
+
end
|
|
552
|
+
|
|
553
|
+
ActiveSupport.run_load_hooks(:actor, Actor)
|