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,169 @@
|
|
|
1
|
+
# A relation defines a type of {Tie} between two {Actor Actors}. From social literature,
|
|
2
|
+
# {Relation Relations} can be affective (friendship, liking, respect), formal or biological
|
|
3
|
+
# (authority, kinship), transfer of material resources (transactions, lending and borrowing),
|
|
4
|
+
# messages or conversations, physical connection and affiliation to same organizations.
|
|
5
|
+
#
|
|
6
|
+
# = Relation types defined in {SocialStream Social Stream}
|
|
7
|
+
#
|
|
8
|
+
# All the above cases could be supported in {SocialStream Social Stream}.
|
|
9
|
+
# Nevertheless, the following {Relation Relations} are defined. All of them inherit from the
|
|
10
|
+
# {Relation} class:
|
|
11
|
+
#
|
|
12
|
+
# {Relation::Custom}:: user-defined {Relation}. Every {SocialStream::Models::Subject Subject}
|
|
13
|
+
# is able to define their own {Relation::Custom Custom relation},
|
|
14
|
+
# giving them a custom name
|
|
15
|
+
# (for instance: friend, colleague, partner, buddy) and {Permission Permissions}.
|
|
16
|
+
# {Relation::Public}:: default {Relation} for ocassional {Tie Ties}.
|
|
17
|
+
# {Relation::Reject}:: the {SocialStream::Models::Subject Subject} does not want to add the other
|
|
18
|
+
# as a contact. A new {Tie} is created using this {Relation}
|
|
19
|
+
#
|
|
20
|
+
# You can define new {Relation Relations} in your application. Just create a new class and
|
|
21
|
+
# inherit from {Relation}. This class already supports
|
|
22
|
+
# {http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Single+table+inheritance Single Table Inheritance (STI)}.
|
|
23
|
+
#
|
|
24
|
+
# = Relations and link building
|
|
25
|
+
#
|
|
26
|
+
# When a {SocialStream::Models::Subject Subject} creates a new link to other
|
|
27
|
+
# {SocialStream::Models::Subject Subject}, she must specify one or serveral {Relation Relations}
|
|
28
|
+
# for that link. (friend, colleague, {Relation::Public} or {Relation::Reject}.
|
|
29
|
+
# A new {Tie} will be created for each {Relation}
|
|
30
|
+
#
|
|
31
|
+
# = Permissions
|
|
32
|
+
#
|
|
33
|
+
# {SocialStream::Models::Subject Subjects} assign {Permission permissions} to {Relation Relations}.
|
|
34
|
+
# This way, when establishing {Tie ties}, they are granting permissions to their contacts.
|
|
35
|
+
#
|
|
36
|
+
# See the documentation of {Permission} for more details on permission definition.
|
|
37
|
+
#
|
|
38
|
+
# = {Activity Activities} and {Relation Relations}
|
|
39
|
+
#
|
|
40
|
+
# Each {Activity} can be attached to one or more {Relation relations}.
|
|
41
|
+
# It sets the {Audience} that has access to it, and the {Permission Permissions} that rule that access.
|
|
42
|
+
#
|
|
43
|
+
class Relation < ActiveRecord::Base
|
|
44
|
+
Positive = %w{ custom public }
|
|
45
|
+
Negative = %w{ reject }
|
|
46
|
+
|
|
47
|
+
belongs_to :actor
|
|
48
|
+
|
|
49
|
+
has_many :relation_permissions, :dependent => :destroy
|
|
50
|
+
has_many :permissions, :through => :relation_permissions
|
|
51
|
+
|
|
52
|
+
has_many :ties, :dependent => :destroy
|
|
53
|
+
has_many :contacts, :through => :ties
|
|
54
|
+
|
|
55
|
+
has_many :audiences, :dependent => :destroy
|
|
56
|
+
has_many :activities, :through => :audiences
|
|
57
|
+
|
|
58
|
+
validates_presence_of :actor_id
|
|
59
|
+
|
|
60
|
+
scope :actor, lambda { |a|
|
|
61
|
+
where(:actor_id => Actor.normalize_id(a))
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
scope :mode, lambda { |st, rt|
|
|
65
|
+
where(:sender_type => st, :receiver_type => rt)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
before_create :initialize_sender_type
|
|
69
|
+
|
|
70
|
+
class << self
|
|
71
|
+
# Get relation from object, if possible
|
|
72
|
+
#
|
|
73
|
+
# Options::
|
|
74
|
+
# sender:: The sender of the tie
|
|
75
|
+
def normalize(r, options = {})
|
|
76
|
+
case r
|
|
77
|
+
when Relation
|
|
78
|
+
r
|
|
79
|
+
when String
|
|
80
|
+
if options[:sender]
|
|
81
|
+
options[:sender].relation_custom(r)
|
|
82
|
+
else
|
|
83
|
+
raise "Must provide a sender when looking up relations from name: #{ options[:sender] }"
|
|
84
|
+
end
|
|
85
|
+
when Integer
|
|
86
|
+
Relation.find r
|
|
87
|
+
when Array
|
|
88
|
+
r.map{ |e| Relation.normalize(e, options) }
|
|
89
|
+
else
|
|
90
|
+
raise "Unable to normalize relation #{ r.class }: #{ r.inspect }"
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def normalize_id(r, options = {})
|
|
95
|
+
case r
|
|
96
|
+
when Integer
|
|
97
|
+
r
|
|
98
|
+
when Array
|
|
99
|
+
r.map{ |e| Relation.normalize_id(e, options) }
|
|
100
|
+
else
|
|
101
|
+
normalize(r, options).id
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Positive relation names: [ 'Relation::Custom', 'Relation::Public' ]
|
|
106
|
+
def positive_names
|
|
107
|
+
Positive.map{ |r| "Relation::#{ r.classify }" }
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Negative relations: [ 'Relation::Reject' ]
|
|
111
|
+
def negative_names
|
|
112
|
+
Negative.map{ |r| "Relation::#{ r.classify }" }
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# All the relations that allow subject to perform action
|
|
116
|
+
#
|
|
117
|
+
# Options:
|
|
118
|
+
# in:: Limit possible relations to a set
|
|
119
|
+
# public_relations:: include also {Relation::Public} whose activities can always be read
|
|
120
|
+
def allow(subject, action, object, options = {})
|
|
121
|
+
q =
|
|
122
|
+
select("DISTINCT relations.*").
|
|
123
|
+
joins(:contacts).
|
|
124
|
+
joins(:permissions)
|
|
125
|
+
|
|
126
|
+
conds =
|
|
127
|
+
Permission.arel_table[:action].eq(action).and(Permission.arel_table[:object].eq(object))
|
|
128
|
+
|
|
129
|
+
# Relation::Public permissions cannot be customized yet
|
|
130
|
+
if action == 'read' && object == 'activity' && (options[:public].nil? || options[:public])
|
|
131
|
+
conds = conds.or(Relation.arel_table[:type].eq('Relation::Public'))
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Add in condition
|
|
135
|
+
if ! options[:in].nil?
|
|
136
|
+
conds = conds.and(Relation.arel_table[:id].in(Relation.normalize_id(Array(options[:in]))))
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# subject conditions
|
|
140
|
+
conds = conds.and(Contact.arel_table[:receiver_id].eq(Actor.normalize_id(subject)))
|
|
141
|
+
|
|
142
|
+
q.where(conds)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def allow?(*args)
|
|
146
|
+
allow(*args).to_a.any?
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Relation class scoped in the same mode that this relation
|
|
151
|
+
def mode
|
|
152
|
+
Relation.mode(sender_type, receiver_type)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Is this {Relation} a Positive one?
|
|
156
|
+
def positive?
|
|
157
|
+
self.class.positive_names.include?(self.class.to_s)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
private
|
|
161
|
+
|
|
162
|
+
# Before create callback
|
|
163
|
+
def initialize_sender_type
|
|
164
|
+
return if actor.blank?
|
|
165
|
+
|
|
166
|
+
self.sender_type = actor.subject_type
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# When a new {SocialStream::Models::Subject subject} is created, a initial set
|
|
2
|
+
# of relations is created for him. Afterwards, the {SocialStream::Models::Subject subject}
|
|
3
|
+
# can customize them and adapt them to his own preferences.
|
|
4
|
+
#
|
|
5
|
+
# Default relations are defined at config/relations.yml
|
|
6
|
+
#
|
|
7
|
+
class Relation::Custom < Relation
|
|
8
|
+
# Default relations are defined in this configuration file
|
|
9
|
+
CONFIG = File.join(::Rails.root, 'config', 'relations.yml')
|
|
10
|
+
|
|
11
|
+
# This is weird. We must call #inspect before has_ancestry for Relation::Custom
|
|
12
|
+
# to recognize STI
|
|
13
|
+
inspect
|
|
14
|
+
has_ancestry
|
|
15
|
+
|
|
16
|
+
belongs_to :actor
|
|
17
|
+
|
|
18
|
+
validates_presence_of :name, :actor_id
|
|
19
|
+
validates_uniqueness_of :name, :scope => :actor_id
|
|
20
|
+
|
|
21
|
+
class << self
|
|
22
|
+
# Relations configuration
|
|
23
|
+
def config
|
|
24
|
+
@config ||= YAML.load_file(CONFIG)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def defaults_for(actor)
|
|
28
|
+
cfg_rels = config[actor.subject_type.underscore]
|
|
29
|
+
|
|
30
|
+
if cfg_rels.nil?
|
|
31
|
+
raise "Undefined relations for subject type #{ actor.subject_type }. Please, add an entry to #{ CONFIG }"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
rels = {}
|
|
35
|
+
|
|
36
|
+
cfg_rels.each_pair do |name, cfg_rel|
|
|
37
|
+
rels[name] =
|
|
38
|
+
create! :actor => actor,
|
|
39
|
+
:name => cfg_rel['name'],
|
|
40
|
+
:receiver_type => cfg_rel['receiver_type']
|
|
41
|
+
|
|
42
|
+
if (ps = cfg_rel['permissions']).present?
|
|
43
|
+
ps.each do |p|
|
|
44
|
+
p.push(nil) if p.size == 1
|
|
45
|
+
|
|
46
|
+
rels[name].permissions <<
|
|
47
|
+
Permission.find_or_create_by_action_and_object(*p)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Parent, relations must be set after creation
|
|
53
|
+
# FIXME: Can fix with ruby 1.9 and ordered hashes
|
|
54
|
+
cfg_rels.each_pair do |name, cfg_rel|
|
|
55
|
+
rels[name].update_attribute(:parent, rels[cfg_rel['parent']])
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
rels.values
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# A relation in the top of a strength hierarchy
|
|
62
|
+
def strongest
|
|
63
|
+
roots
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Compare two relations
|
|
68
|
+
def <=> rel
|
|
69
|
+
return -1 if rel.is_a?(Public)
|
|
70
|
+
|
|
71
|
+
if ancestor_ids.include?(rel.id)
|
|
72
|
+
1
|
|
73
|
+
elsif rel.ancestor_ids.include?(id)
|
|
74
|
+
-1
|
|
75
|
+
else
|
|
76
|
+
0
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Other relations below in the same hierarchy that this relation
|
|
81
|
+
def weaker
|
|
82
|
+
descendants
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Relations below or at the same level of this relation
|
|
86
|
+
def weaker_or_equal
|
|
87
|
+
subtree
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Other relations above in the same hierarchy that this relation
|
|
91
|
+
def stronger
|
|
92
|
+
ancestors
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Relations above or at the same level of this relation
|
|
96
|
+
def stronger_or_equal
|
|
97
|
+
path
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# JSON compatible with SocialCheesecake
|
|
101
|
+
def to_cheesecake_hash(options = {})
|
|
102
|
+
{ :name => name }.tap do |hash|
|
|
103
|
+
if options[:subsector]
|
|
104
|
+
hash[:actors] = ties.map{ |t| [t.contact.receiver_id] }.uniq
|
|
105
|
+
else
|
|
106
|
+
hash[:subsectors] = ( weaker.present? ?
|
|
107
|
+
weaker.map{ |w| w.to_cheesecake_hash(:subsector => true) } :
|
|
108
|
+
Array.wrap(to_cheesecake_hash(:subsector => true)) )
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
class Relation::Public < Relation::Single
|
|
2
|
+
# A {Relation::Public public relation} is always the weakest
|
|
3
|
+
def <=>(relation)
|
|
4
|
+
1
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
# Are we supporting custom permissions for {Relation::Public}? Not by the moment.
|
|
8
|
+
def allow?(user, action, object)
|
|
9
|
+
action == 'read' && object == 'activity'
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Common methods for single relations, like {Relation::Public} and {Relation::Reject}
|
|
2
|
+
#
|
|
3
|
+
# Unlike {Relation::Custom}, {SocialStream::Models::Subject subjects} have only one of
|
|
4
|
+
# these {Relation relations}.
|
|
5
|
+
#
|
|
6
|
+
class Relation::Single < Relation
|
|
7
|
+
class << self
|
|
8
|
+
def default_for(actor)
|
|
9
|
+
create! :actor => actor
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# The {Relation::Public} belonging to actor
|
|
13
|
+
def of(actor)
|
|
14
|
+
actor(actor).first
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# The name of public relation
|
|
19
|
+
def name
|
|
20
|
+
I18n.t("relation_#{ self.class.name.split("::").last.underscore }.name")
|
|
21
|
+
end
|
|
22
|
+
end
|
data/app/models/tie.rb
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# A {Tie} is a link between two {Actor Actors},
|
|
2
|
+
# and therefore, two {SocialStream::Models::Subject Subjects}.
|
|
3
|
+
#
|
|
4
|
+
# It is made up with a {Contact} and a {Relation}. The {Contact} defines the sender
|
|
5
|
+
# or {Actor} that declares the link, and the receiver or {Actor} that is pointed by
|
|
6
|
+
# the declaration. The {Relation} defines the type of link (friend, colleague,
|
|
7
|
+
# {Relation::Reject}, etc)
|
|
8
|
+
|
|
9
|
+
# = Authorization
|
|
10
|
+
# When an {Actor} establishes a {Tie} with other, she is granting a set of
|
|
11
|
+
# {Permission Permissions} to them (posting to her wall, reading her posts, etc..)
|
|
12
|
+
# The set of {Permission Permissions} granted are associated with the {Relation} of
|
|
13
|
+
# the {Tie}.
|
|
14
|
+
#
|
|
15
|
+
# = Scopes
|
|
16
|
+
# There are several scopes defined:
|
|
17
|
+
#
|
|
18
|
+
# sent_by(actor):: ties whose sender is actor
|
|
19
|
+
# received_by(actor):: ties whose receiver is actor
|
|
20
|
+
# sent_or_received_by(actor):: the union of the former
|
|
21
|
+
# related_by(relation):: ties with this relation. Accepts relation, relation_name,
|
|
22
|
+
# integer, array
|
|
23
|
+
#
|
|
24
|
+
class Tie < ActiveRecord::Base
|
|
25
|
+
|
|
26
|
+
belongs_to :contact, :counter_cache => true
|
|
27
|
+
|
|
28
|
+
has_one :sender, :through => :contact
|
|
29
|
+
has_one :receiver, :through => :contact
|
|
30
|
+
|
|
31
|
+
belongs_to :relation
|
|
32
|
+
|
|
33
|
+
scope :recent, order("ties.created_at DESC")
|
|
34
|
+
|
|
35
|
+
scope :sent_by, lambda { |a|
|
|
36
|
+
joins(:contact).merge(Contact.sent_by(a))
|
|
37
|
+
}
|
|
38
|
+
scope :received_by, lambda { |a|
|
|
39
|
+
joins(:contact).merge(Contact.received_by(a))
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
scope :sent_or_received_by, lambda { |a|
|
|
43
|
+
joins(:contact).merge(Contact.sent_or_received_by(a))
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
scope :related_by, lambda { |r|
|
|
47
|
+
if r.present?
|
|
48
|
+
where(:relation_id => Relation.normalize_id(r))
|
|
49
|
+
end
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
scope :with_permissions, lambda { |action, object|
|
|
53
|
+
joins(:relation => :permissions).
|
|
54
|
+
where('permissions.action' => action).
|
|
55
|
+
where('permissions.object' => object)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
validates_presence_of :contact_id, :relation_id
|
|
59
|
+
|
|
60
|
+
validate :relation_belongs_to_sender
|
|
61
|
+
|
|
62
|
+
after_create :create_activity
|
|
63
|
+
after_create :increment_follower_count
|
|
64
|
+
after_destroy :decrement_follower_count
|
|
65
|
+
|
|
66
|
+
def relation_name
|
|
67
|
+
relation.try(:name)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def sender_subject
|
|
71
|
+
sender.subject
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def receiver_subject
|
|
75
|
+
receiver.subject
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# The {Tie} is positive if its {Relation} is
|
|
79
|
+
def positive?
|
|
80
|
+
relation.positive?
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Does this {Tie} have positive {Tie ties} in the other way?
|
|
84
|
+
def positive_replied?
|
|
85
|
+
contact.positive_replied?
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# This {Tie} is {#positive? positive} and {#positive_replied? positive replied}
|
|
89
|
+
def bidirectional?
|
|
90
|
+
positive? && positive_replied?
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
private
|
|
94
|
+
|
|
95
|
+
# before_create callback
|
|
96
|
+
#
|
|
97
|
+
# Create contact activity if this is the first tie
|
|
98
|
+
def create_activity
|
|
99
|
+
return if contact.reload.ties_count != 1 || relation.is_a?(Relation::Reject)
|
|
100
|
+
|
|
101
|
+
Activity.create! :contact => contact,
|
|
102
|
+
:relation_ids => contact.relation_ids,
|
|
103
|
+
:activity_verb => ActivityVerb[contact.verb]
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# after_create callback
|
|
107
|
+
#
|
|
108
|
+
# Increment the {Actor}'s follower_count
|
|
109
|
+
def increment_follower_count
|
|
110
|
+
return if contact.reflexive? ||
|
|
111
|
+
!relation.permissions.include?(Permission.follow.first)
|
|
112
|
+
|
|
113
|
+
# Because we allow several ties from the same sender to the same receiver,
|
|
114
|
+
# we check the receiver does not already have a follower tie from this sender
|
|
115
|
+
return if Tie.sent_by(sender).
|
|
116
|
+
received_by(receiver).
|
|
117
|
+
with_permissions('follow', nil).
|
|
118
|
+
where("ties.id != ?", id).
|
|
119
|
+
present?
|
|
120
|
+
|
|
121
|
+
receiver.increment!(:follower_count)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# after_destroy callback
|
|
125
|
+
#
|
|
126
|
+
# Decrement the {Actor}'s follower_count
|
|
127
|
+
def decrement_follower_count
|
|
128
|
+
return if contact.reflexive? ||
|
|
129
|
+
!relation.permissions.include?(Permission.follow.first)
|
|
130
|
+
|
|
131
|
+
# Because we allow several ties from the same sender to the same receiver,
|
|
132
|
+
# we check the receiver does not still have a follower tie from this sender
|
|
133
|
+
return if Tie.sent_by(sender).
|
|
134
|
+
received_by(receiver).
|
|
135
|
+
with_permissions('follow', nil).
|
|
136
|
+
present?
|
|
137
|
+
|
|
138
|
+
receiver.decrement!(:follower_count)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def relation_belongs_to_sender
|
|
142
|
+
errors.add(:relation, "must belong to sender") unless
|
|
143
|
+
contact.sender_id == relation.actor_id
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
ActiveSupport.run_load_hooks(:tie, Tie)
|