social_stream 0.9.1 → 0.9.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.
Files changed (912) hide show
  1. data/.travis.yml +4 -0
  2. data/Gemfile +2 -4
  3. data/README.rdoc +2 -2
  4. data/Rakefile +3 -1
  5. data/base/.gitignore +16 -0
  6. data/base/.rspec +1 -0
  7. data/base/.yardopts +2 -0
  8. data/base/Gemfile +9 -0
  9. data/base/LICENSE +20 -0
  10. data/base/README.rdoc +68 -0
  11. data/base/Rakefile +35 -0
  12. data/base/app/assets/images/HTML5.png +0 -0
  13. data/base/app/assets/images/HTML5_Semantics.png +0 -0
  14. data/base/app/assets/images/HTML5_Styling.png +0 -0
  15. data/base/app/assets/images/Jcrop.gif +0 -0
  16. data/base/app/assets/images/big-logo.png +0 -0
  17. data/base/app/assets/images/boxy/boxy-ne.png +0 -0
  18. data/base/app/assets/images/boxy/boxy-nw.png +0 -0
  19. data/base/app/assets/images/boxy/boxy-se.png +0 -0
  20. data/base/app/assets/images/boxy/boxy-sw.png +0 -0
  21. data/base/app/assets/images/btn/1-facebook.png +0 -0
  22. data/base/app/assets/images/btn/_notes/btn_certificates.png.mno +4 -0
  23. data/base/app/assets/images/btn/activity.png +0 -0
  24. data/base/app/assets/images/btn/arrowBlue.png +0 -0
  25. data/base/app/assets/images/btn/arrows-ffffff.png +0 -0
  26. data/base/app/assets/images/btn/bold.png +0 -0
  27. data/base/app/assets/images/btn/btn_account.png +0 -0
  28. data/base/app/assets/images/btn/btn_activities.png +0 -0
  29. data/base/app/assets/images/btn/btn_bookmark.png +0 -0
  30. data/base/app/assets/images/btn/btn_browse.png +0 -0
  31. data/base/app/assets/images/btn/btn_check.png +0 -0
  32. data/base/app/assets/images/btn/btn_close.png +0 -0
  33. data/base/app/assets/images/btn/btn_comment.png +0 -0
  34. data/base/app/assets/images/btn/btn_comment_add.png +0 -0
  35. data/base/app/assets/images/btn/btn_config.png +0 -0
  36. data/base/app/assets/images/btn/btn_date.png +0 -0
  37. data/base/app/assets/images/btn/btn_delete.png +0 -0
  38. data/base/app/assets/images/btn/btn_down.png +0 -0
  39. data/base/app/assets/images/btn/btn_edit.png +0 -0
  40. data/base/app/assets/images/btn/btn_exit.png +0 -0
  41. data/base/app/assets/images/btn/btn_find.png +0 -0
  42. data/base/app/assets/images/btn/btn_follow.png +0 -0
  43. data/base/app/assets/images/btn/btn_foward.png +0 -0
  44. data/base/app/assets/images/btn/btn_friend.png +0 -0
  45. data/base/app/assets/images/btn/btn_gallery.png +0 -0
  46. data/base/app/assets/images/btn/btn_group.png +0 -0
  47. data/base/app/assets/images/btn/btn_help.png +0 -0
  48. data/base/app/assets/images/btn/btn_home.png +0 -0
  49. data/base/app/assets/images/btn/btn_inbox.png +0 -0
  50. data/base/app/assets/images/btn/btn_info.png +0 -0
  51. data/base/app/assets/images/btn/btn_invitation.png +0 -0
  52. data/base/app/assets/images/btn/btn_like.png +0 -0
  53. data/base/app/assets/images/btn/btn_next.png +0 -0
  54. data/base/app/assets/images/btn/btn_notification.png +0 -0
  55. data/base/app/assets/images/btn/btn_notification_delete.png +0 -0
  56. data/base/app/assets/images/btn/btn_notification_read.png +0 -0
  57. data/base/app/assets/images/btn/btn_notifications.png +0 -0
  58. data/base/app/assets/images/btn/btn_page_link.png +0 -0
  59. data/base/app/assets/images/btn/btn_partner.png +0 -0
  60. data/base/app/assets/images/btn/btn_photo.png +0 -0
  61. data/base/app/assets/images/btn/btn_printer.png +0 -0
  62. data/base/app/assets/images/btn/btn_profile.png +0 -0
  63. data/base/app/assets/images/btn/btn_rank.png +0 -0
  64. data/base/app/assets/images/btn/btn_read.png +0 -0
  65. data/base/app/assets/images/btn/btn_security.png +0 -0
  66. data/base/app/assets/images/btn/btn_send.png +0 -0
  67. data/base/app/assets/images/btn/btn_spam.png +0 -0
  68. data/base/app/assets/images/btn/btn_star.png +0 -0
  69. data/base/app/assets/images/btn/btn_tag.png +0 -0
  70. data/base/app/assets/images/btn/btn_write.png +0 -0
  71. data/base/app/assets/images/btn/close.png +0 -0
  72. data/base/app/assets/images/btn/date.png +0 -0
  73. data/base/app/assets/images/btn/delete.png +0 -0
  74. data/base/app/assets/images/btn/edit.png +0 -0
  75. data/base/app/assets/images/btn/error.png +0 -0
  76. data/base/app/assets/images/btn/facebook.png +0 -0
  77. data/base/app/assets/images/btn/flag.png +0 -0
  78. data/base/app/assets/images/btn/group_left.png +0 -0
  79. data/base/app/assets/images/btn/group_right.png +0 -0
  80. data/base/app/assets/images/btn/index_71.png +0 -0
  81. data/base/app/assets/images/btn/info.png +0 -0
  82. data/base/app/assets/images/btn/italic.png +0 -0
  83. data/base/app/assets/images/btn/like.png +0 -0
  84. data/base/app/assets/images/btn/linkedin.png +0 -0
  85. data/base/app/assets/images/btn/message_conversation.png +0 -0
  86. data/base/app/assets/images/btn/message_inbox.png +0 -0
  87. data/base/app/assets/images/btn/message_new.png +0 -0
  88. data/base/app/assets/images/btn/message_sentbox.png +0 -0
  89. data/base/app/assets/images/btn/message_trash.png +0 -0
  90. data/base/app/assets/images/btn/new.png +0 -0
  91. data/base/app/assets/images/btn/next_conference.png +0 -0
  92. data/base/app/assets/images/btn/next_space.png +0 -0
  93. data/base/app/assets/images/btn/nolike.png +0 -0
  94. data/base/app/assets/images/btn/notifications.png +0 -0
  95. data/base/app/assets/images/btn/pixel.png +0 -0
  96. data/base/app/assets/images/btn/point_blue.png +0 -0
  97. data/base/app/assets/images/btn/point_gray.png +0 -0
  98. data/base/app/assets/images/btn/post.png +0 -0
  99. data/base/app/assets/images/btn/search.png +0 -0
  100. data/base/app/assets/images/btn/search_icon.png +0 -0
  101. data/base/app/assets/images/btn/shadow.png +0 -0
  102. data/base/app/assets/images/btn/share.png +0 -0
  103. data/base/app/assets/images/btn/subtime.png +0 -0
  104. data/base/app/assets/images/btn/success.png +0 -0
  105. data/base/app/assets/images/btn/tag_cloud.png +0 -0
  106. data/base/app/assets/images/btn/twitter-follow-icon.png +0 -0
  107. data/base/app/assets/images/btn/twitter.png +0 -0
  108. data/base/app/assets/images/btn/uno.png +0 -0
  109. data/base/app/assets/images/btn/viewer.png +0 -0
  110. data/base/app/assets/images/btn/warning.png +0 -0
  111. data/base/app/assets/images/cancel.png +0 -0
  112. data/base/app/assets/images/cleditor/buttons.gif +0 -0
  113. data/base/app/assets/images/cleditor/toolbar.gif +0 -0
  114. data/base/app/assets/images/frontpage/collaborate.png +0 -0
  115. data/base/app/assets/images/frontpage/comments.png +0 -0
  116. data/base/app/assets/images/frontpage/green_sq.png +0 -0
  117. data/base/app/assets/images/frontpage/join.gif +0 -0
  118. data/base/app/assets/images/frontpage/meet.png +0 -0
  119. data/base/app/assets/images/frontpage/people.png +0 -0
  120. data/base/app/assets/images/frontpage/purple_sq.png +0 -0
  121. data/base/app/assets/images/frontpage/right_comments.gif +0 -0
  122. data/base/app/assets/images/frontpage/right_organizers.gif +0 -0
  123. data/base/app/assets/images/frontpage/right_people.gif +0 -0
  124. data/base/app/assets/images/frontpage/right_social.gif +0 -0
  125. data/base/app/assets/images/frontpage/right_tags.gif +0 -0
  126. data/base/app/assets/images/frontpage/right_webcam.gif +0 -0
  127. data/base/app/assets/images/frontpage/share.png +0 -0
  128. data/base/app/assets/images/frontpage/tags.png +0 -0
  129. data/base/app/assets/images/frontpage/yellow_sq.png +0 -0
  130. data/base/app/assets/images/header-logo.png +0 -0
  131. data/base/app/assets/images/html5-badge-h-css3-semantics.png +0 -0
  132. data/base/app/assets/images/icon_checkbox.png +0 -0
  133. data/base/app/assets/images/icons/favicon.ico +0 -0
  134. data/base/app/assets/images/left.png +0 -0
  135. data/base/app/assets/images/loader.gif +0 -0
  136. data/base/app/assets/images/loading.gif +0 -0
  137. data/base/app/assets/images/logo.png +0 -0
  138. data/base/app/assets/images/logos/actor/group.png +0 -0
  139. data/base/app/assets/images/logos/actor/remote_subject.png +0 -0
  140. data/base/app/assets/images/logos/actor/remote_user.png +0 -0
  141. data/base/app/assets/images/logos/actor/user.png +0 -0
  142. data/base/app/assets/images/logos/contact/group.png +0 -0
  143. data/base/app/assets/images/logos/contact/user.png +0 -0
  144. data/base/app/assets/images/logos/original/group.png +0 -0
  145. data/base/app/assets/images/logos/original/user.png +0 -0
  146. data/base/app/assets/images/logos/profile/group.png +0 -0
  147. data/base/app/assets/images/logos/profile/user.png +0 -0
  148. data/base/app/assets/images/logos/representation/group.png +0 -0
  149. data/base/app/assets/images/logos/representation/user.png +0 -0
  150. data/base/app/assets/images/mini-loading.gif +0 -0
  151. data/base/app/assets/images/right.png +0 -0
  152. data/base/app/assets/images/title_background.png +0 -0
  153. data/base/app/assets/javascripts/activities.js.erb +175 -0
  154. data/base/app/assets/javascripts/contacts.js +10 -0
  155. data/base/app/assets/javascripts/conversations.js +3 -0
  156. data/base/app/assets/javascripts/groups.js +5 -0
  157. data/base/app/assets/javascripts/invitations.js +1 -0
  158. data/base/app/assets/javascripts/layouts.js +22 -0
  159. data/base/app/assets/javascripts/messages.js +3 -0
  160. data/base/app/assets/javascripts/posts.js +1 -0
  161. data/base/app/assets/javascripts/preloader.js +6 -0
  162. data/base/app/assets/javascripts/profiles.js +6 -0
  163. data/base/app/assets/javascripts/relation_customs.js +85 -0
  164. data/base/app/assets/javascripts/search.js.erb +7 -0
  165. data/base/app/assets/javascripts/settings.js +35 -0
  166. data/base/app/assets/javascripts/social_stream-base.js +6 -0
  167. data/base/app/assets/javascripts/ties.js +67 -0
  168. data/base/app/assets/javascripts/toolbar.js +1 -0
  169. data/base/app/assets/javascripts/users.js +2 -0
  170. data/base/app/assets/stylesheets/0_devise_sign.css +28 -0
  171. data/base/app/assets/stylesheets/activities.css +78 -0
  172. data/base/app/assets/stylesheets/base.css +225 -0
  173. data/base/app/assets/stylesheets/contacts.css +92 -0
  174. data/base/app/assets/stylesheets/conversations.css +4 -0
  175. data/base/app/assets/stylesheets/footer.css +26 -0
  176. data/base/app/assets/stylesheets/frontpage.css +68 -0
  177. data/base/app/assets/stylesheets/groups.css +4 -0
  178. data/base/app/assets/stylesheets/header.css +215 -0
  179. data/base/app/assets/stylesheets/home.css +51 -0
  180. data/base/app/assets/stylesheets/images/add-policy.png +0 -0
  181. data/base/app/assets/stylesheets/images/fcbkcomplete/close.gif +0 -0
  182. data/base/app/assets/stylesheets/images/loading.gif +0 -0
  183. data/base/app/assets/stylesheets/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  184. data/base/app/assets/stylesheets/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  185. data/base/app/assets/stylesheets/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  186. data/base/app/assets/stylesheets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  187. data/base/app/assets/stylesheets/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  188. data/base/app/assets/stylesheets/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  189. data/base/app/assets/stylesheets/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  190. data/base/app/assets/stylesheets/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  191. data/base/app/assets/stylesheets/images/ui-icons_222222_256x240.png +0 -0
  192. data/base/app/assets/stylesheets/images/ui-icons_2e83ff_256x240.png +0 -0
  193. data/base/app/assets/stylesheets/images/ui-icons_454545_256x240.png +0 -0
  194. data/base/app/assets/stylesheets/images/ui-icons_888888_256x240.png +0 -0
  195. data/base/app/assets/stylesheets/images/ui-icons_cd0a0a_256x240.png +0 -0
  196. data/base/app/assets/stylesheets/invitations.css +3 -0
  197. data/base/app/assets/stylesheets/menu.css +26 -0
  198. data/base/app/assets/stylesheets/messages.css +135 -0
  199. data/base/app/assets/stylesheets/profiles.css +4 -0
  200. data/base/app/assets/stylesheets/relation_customs.css +245 -0
  201. data/base/app/assets/stylesheets/search.css +166 -0
  202. data/base/app/assets/stylesheets/settings.css +9 -0
  203. data/base/app/assets/stylesheets/social_stream-base.css +3 -0
  204. data/base/app/assets/stylesheets/ties.css +10 -0
  205. data/base/app/assets/stylesheets/toolbar.css +3 -0
  206. data/base/app/assets/stylesheets/users.css +4 -0
  207. data/base/app/controllers/activities_controller.rb +19 -0
  208. data/base/app/controllers/api_controller.rb +38 -0
  209. data/base/app/controllers/authentications_controller.rb +17 -0
  210. data/base/app/controllers/comments_controller.rb +18 -0
  211. data/base/app/controllers/contacts_controller.rb +69 -0
  212. data/base/app/controllers/conversations_controller.rb +102 -0
  213. data/base/app/controllers/frontpage_controller.rb +23 -0
  214. data/base/app/controllers/groups_controller.rb +54 -0
  215. data/base/app/controllers/home_controller.rb +3 -0
  216. data/base/app/controllers/invitations_controller.rb +34 -0
  217. data/base/app/controllers/likes_controller.rb +41 -0
  218. data/base/app/controllers/messages_controller.rb +87 -0
  219. data/base/app/controllers/notifications_controller.rb +73 -0
  220. data/base/app/controllers/omniauth_callbacks_controller.rb +17 -0
  221. data/base/app/controllers/permissions_controller.rb +15 -0
  222. data/base/app/controllers/posts_controller.rb +11 -0
  223. data/base/app/controllers/profiles_controller.rb +9 -0
  224. data/base/app/controllers/relation/customs_controller.rb +6 -0
  225. data/base/app/controllers/search_controller.rb +81 -0
  226. data/base/app/controllers/settings_controller.rb +43 -0
  227. data/base/app/controllers/subjects_controller.rb +7 -0
  228. data/base/app/controllers/tags_controller.rb +15 -0
  229. data/base/app/controllers/ties_controller.rb +11 -0
  230. data/base/app/controllers/users_controller.rb +36 -0
  231. data/base/app/helpers/activities_helper.rb +36 -0
  232. data/base/app/helpers/contacts_helper.rb +26 -0
  233. data/base/app/helpers/groups_helper.rb +3 -0
  234. data/base/app/helpers/location_helper.rb +48 -0
  235. data/base/app/helpers/notifications_helper.rb +3 -0
  236. data/base/app/helpers/permissions_helper.rb +16 -0
  237. data/base/app/helpers/profiles_helper.rb +37 -0
  238. data/base/app/helpers/search_helper.rb +18 -0
  239. data/base/app/helpers/subjects_helper.rb +15 -0
  240. data/base/app/helpers/toolbar_helper.rb +102 -0
  241. data/base/app/helpers/users_helper.rb +4 -0
  242. data/base/app/mailers/invitation_mailer.rb +11 -0
  243. data/base/app/mailers/notification_mailer.rb +34 -0
  244. data/base/app/models/ability.rb +2 -0
  245. data/base/app/models/activity.rb +321 -0
  246. data/base/app/models/activity_object.rb +31 -0
  247. data/base/app/models/activity_object_activity.rb +14 -0
  248. data/base/app/models/activity_verb.rb +22 -0
  249. data/base/app/models/actor.rb +491 -0
  250. data/base/app/models/audience.rb +9 -0
  251. data/base/app/models/authentication.rb +3 -0
  252. data/base/app/models/comment.rb +10 -0
  253. data/base/app/models/contact.rb +185 -0
  254. data/base/app/models/group.rb +47 -0
  255. data/base/app/models/like.rb +49 -0
  256. data/base/app/models/permission.rb +52 -0
  257. data/base/app/models/post.rb +12 -0
  258. data/base/app/models/profile.rb +58 -0
  259. data/base/app/models/relation.rb +134 -0
  260. data/base/app/models/relation/custom.rb +99 -0
  261. data/base/app/models/relation/public.rb +11 -0
  262. data/base/app/models/relation/reject.rb +3 -0
  263. data/base/app/models/relation/single.rb +22 -0
  264. data/base/app/models/relation_permission.rb +4 -0
  265. data/base/app/models/tie.rb +137 -0
  266. data/base/app/models/user.rb +141 -0
  267. data/base/app/views/activities/_activity.html.erb +5 -0
  268. data/base/app/views/activities/_child.html.erb +18 -0
  269. data/base/app/views/activities/_comments.html.erb +3 -0
  270. data/base/app/views/activities/_index.html.erb +14 -0
  271. data/base/app/views/activities/_new.html.erb +32 -0
  272. data/base/app/views/activities/_options.html.erb +15 -0
  273. data/base/app/views/activities/_root.html.erb +37 -0
  274. data/base/app/views/activities/_wall.html.erb +5 -0
  275. data/base/app/views/activities/_walls.html.erb +34 -0
  276. data/base/app/views/activities/index.js.erb +1 -0
  277. data/base/app/views/activity_objects/_activity_object.html.erb +7 -0
  278. data/base/app/views/actors/_actor.html.erb +0 -0
  279. data/base/app/views/api/activity_atom_feed.atom.builder +40 -0
  280. data/base/app/views/avatars/index.html.erb +29 -0
  281. data/base/app/views/avatars/update.js.erb +15 -0
  282. data/base/app/views/comments/_comment.html.erb +1 -0
  283. data/base/app/views/comments/_new.html.erb +29 -0
  284. data/base/app/views/comments/create.js.erb +5 -0
  285. data/base/app/views/comments/destroy.js.erb +1 -0
  286. data/base/app/views/contacts/_contact.html.erb +20 -0
  287. data/base/app/views/contacts/_form.html.erb +31 -0
  288. data/base/app/views/contacts/_index.html.erb +40 -0
  289. data/base/app/views/contacts/_pendings.html.erb +18 -0
  290. data/base/app/views/contacts/_suggestions.html.erb +15 -0
  291. data/base/app/views/contacts/_suggestions_and_pendings.html.erb +6 -0
  292. data/base/app/views/contacts/destroy.js.erb +6 -0
  293. data/base/app/views/contacts/edit.html.erb +6 -0
  294. data/base/app/views/contacts/index.html.erb +39 -0
  295. data/base/app/views/contacts/index.js.erb +3 -0
  296. data/base/app/views/contacts/new.html.erb +5 -0
  297. data/base/app/views/contacts/suggestion.html.erb +1 -0
  298. data/base/app/views/contacts/suggestion.js.erb +1 -0
  299. data/base/app/views/conversations/_conversation.html.erb +38 -0
  300. data/base/app/views/conversations/_conversation_full.html.erb +53 -0
  301. data/base/app/views/conversations/_conversations.html.erb +5 -0
  302. data/base/app/views/conversations/_index.html.erb +11 -0
  303. data/base/app/views/conversations/_show.html.erb +13 -0
  304. data/base/app/views/conversations/edit.html.erb +10 -0
  305. data/base/app/views/conversations/index.html.erb +19 -0
  306. data/base/app/views/conversations/index.js.erb +6 -0
  307. data/base/app/views/conversations/show.html.erb +35 -0
  308. data/base/app/views/conversations/show.js.erb +26 -0
  309. data/base/app/views/devise/passwords/edit.html.erb +21 -0
  310. data/base/app/views/devise/passwords/new.html.erb +27 -0
  311. data/base/app/views/devise/registrations/edit.html.erb +98 -0
  312. data/base/app/views/devise/registrations/new.html.erb +44 -0
  313. data/base/app/views/devise/sessions/new.html.erb +35 -0
  314. data/base/app/views/frontpage/_header.html.erb +25 -0
  315. data/base/app/views/frontpage/_sponsor.html.erb +12 -0
  316. data/base/app/views/frontpage/host_meta.xml.builder +11 -0
  317. data/base/app/views/frontpage/index.html.erb +94 -0
  318. data/base/app/views/groups/_group.html.erb +4 -0
  319. data/base/app/views/groups/_group_with_details.html.erb +2 -0
  320. data/base/app/views/groups/_index.html.erb +19 -0
  321. data/base/app/views/groups/_new.html.erb +68 -0
  322. data/base/app/views/groups/_new_activity.html.erb +1 -0
  323. data/base/app/views/groups/_new_activity_fields.html.erb +7 -0
  324. data/base/app/views/groups/_sidebar_index.html.erb +27 -0
  325. data/base/app/views/groups/_sidebar_show.html.erb +3 -0
  326. data/base/app/views/groups/index.html.erb +58 -0
  327. data/base/app/views/groups/index.js.erb +1 -0
  328. data/base/app/views/groups/new.html.erb +11 -0
  329. data/base/app/views/groups/show.html.erb +30 -0
  330. data/base/app/views/groups/show.js.erb +2 -0
  331. data/base/app/views/home/_groups.html.erb +24 -0
  332. data/base/app/views/home/_sidebar.html.erb +2 -0
  333. data/base/app/views/home/index.html.erb +22 -0
  334. data/base/app/views/home/index.js.erb +2 -0
  335. data/base/app/views/invitation_mailer/send_invitation.html.erb +79 -0
  336. data/base/app/views/invitation_mailer/send_invitation.text.erb +20 -0
  337. data/base/app/views/invitations/_new.html.erb +33 -0
  338. data/base/app/views/invitations/new.html.erb +11 -0
  339. data/base/app/views/invitations/new.js.erb +4 -0
  340. data/base/app/views/layouts/_account.html.erb +18 -0
  341. data/base/app/views/layouts/_flash.html.erb +5 -0
  342. data/base/app/views/layouts/_footer.html.erb +16 -0
  343. data/base/app/views/layouts/_header.erb +41 -0
  344. data/base/app/views/layouts/_representation.html.erb +31 -0
  345. data/base/app/views/layouts/_search.html.erb +58 -0
  346. data/base/app/views/layouts/_settings.html.erb +18 -0
  347. data/base/app/views/layouts/application.html.erb +58 -0
  348. data/base/app/views/layouts/frontpage.html.erb +43 -0
  349. data/base/app/views/likes/create.js.erb +2 -0
  350. data/base/app/views/likes/destroy.js.erb +1 -0
  351. data/base/app/views/location/_location.html.erb +3 -0
  352. data/base/app/views/message_mailer/new_message_email.html.erb +35 -0
  353. data/base/app/views/message_mailer/new_message_email.text.erb +8 -0
  354. data/base/app/views/message_mailer/reply_message_email.html.erb +35 -0
  355. data/base/app/views/message_mailer/reply_message_email.text.erb +8 -0
  356. data/base/app/views/messages/_form.html.erb +39 -0
  357. data/base/app/views/messages/_message.html.erb +31 -0
  358. data/base/app/views/messages/_new.html.erb +10 -0
  359. data/base/app/views/messages/new.html.erb +38 -0
  360. data/base/app/views/messages/new.js.erb +28 -0
  361. data/base/app/views/notification_mailer/new_notification_email.html.erb +39 -0
  362. data/base/app/views/notification_mailer/new_notification_email.text.erb +6 -0
  363. data/base/app/views/notifications/_index.html.erb +21 -0
  364. data/base/app/views/notifications/_notification.html.erb +43 -0
  365. data/base/app/views/notifications/activities/_follow_body.html.erb +2 -0
  366. data/base/app/views/notifications/activities/_follow_subject.html.erb +2 -0
  367. data/base/app/views/notifications/activities/_like_body.html.erb +5 -0
  368. data/base/app/views/notifications/activities/_like_subject.html.erb +5 -0
  369. data/base/app/views/notifications/activities/_make-friend_body.html.erb +2 -0
  370. data/base/app/views/notifications/activities/_make-friend_subject.html.erb +2 -0
  371. data/base/app/views/notifications/activities/_post_body.html.erb +6 -0
  372. data/base/app/views/notifications/activities/_post_subject.html.erb +1 -0
  373. data/base/app/views/notifications/activities/_update_body.html.erb +1 -0
  374. data/base/app/views/notifications/activities/_update_subject.html.erb +1 -0
  375. data/base/app/views/notifications/index.html.erb +15 -0
  376. data/base/app/views/notifications/index.js.erb +6 -0
  377. data/base/app/views/objects/_destroy.js.erb +2 -0
  378. data/base/app/views/objects/_new_activity.html.erb +8 -0
  379. data/base/app/views/objects/_show.html.erb +3 -0
  380. data/base/app/views/permissions/_index.html.erb +35 -0
  381. data/base/app/views/permissions/index.js.erb +10 -0
  382. data/base/app/views/posts/_new_activity.html.erb +1 -0
  383. data/base/app/views/posts/_new_activity_fields.erb +1 -0
  384. data/base/app/views/posts/_post.html.erb +3 -0
  385. data/base/app/views/posts/create.js.erb +5 -0
  386. data/base/app/views/posts/destroy.js.erb +1 -0
  387. data/base/app/views/posts/show.html.erb +10 -0
  388. data/base/app/views/profiles/_contact.html.erb +81 -0
  389. data/base/app/views/profiles/_experience.html.erb +22 -0
  390. data/base/app/views/profiles/_personal.html.erb +74 -0
  391. data/base/app/views/profiles/_profile.html.erb +36 -0
  392. data/base/app/views/profiles/_tags.html.erb +22 -0
  393. data/base/app/views/profiles/edit.html.erb +195 -0
  394. data/base/app/views/profiles/show.html.erb +25 -0
  395. data/base/app/views/profiles/update.js.erb +20 -0
  396. data/base/app/views/relation/customs/_form.html.erb +29 -0
  397. data/base/app/views/relation/customs/_list.html.erb +56 -0
  398. data/base/app/views/relation/customs/_update_rules.js.erb +5 -0
  399. data/base/app/views/relation/customs/create.js.erb +19 -0
  400. data/base/app/views/relation/customs/index.html.erb +48 -0
  401. data/base/app/views/relation/customs/update.js.erb +11 -0
  402. data/base/app/views/search/_focus_search.html.erb +22 -0
  403. data/base/app/views/search/_form.html.erb +44 -0
  404. data/base/app/views/search/_global_search.html.erb +19 -0
  405. data/base/app/views/search/_header_search.html.erb +22 -0
  406. data/base/app/views/search/_index.html.erb +15 -0
  407. data/base/app/views/search/index.html.erb +16 -0
  408. data/base/app/views/search/index.js.erb +25 -0
  409. data/base/app/views/settings/_api_key.html.erb +26 -0
  410. data/base/app/views/settings/_index.html.erb +11 -0
  411. data/base/app/views/settings/_notifications.html.erb +34 -0
  412. data/base/app/views/settings/index.html.erb +15 -0
  413. data/base/app/views/settings/index.js.erb +7 -0
  414. data/base/app/views/subjects/_contacts.html.erb +18 -0
  415. data/base/app/views/subjects/_show.js.erb +2 -0
  416. data/base/app/views/subjects/_subject.html.erb +8 -0
  417. data/base/app/views/subjects/_subject_with_details.html.erb +17 -0
  418. data/base/app/views/ties/index.html.erb +8 -0
  419. data/base/app/views/toolbar/_home.html.erb +11 -0
  420. data/base/app/views/toolbar/_logo.html.erb +16 -0
  421. data/base/app/views/toolbar/_profile.html.erb +17 -0
  422. data/base/app/views/users/_groups.html.erb +22 -0
  423. data/base/app/views/users/_index.html.erb +19 -0
  424. data/base/app/views/users/_sidebar_index.html.erb +1 -0
  425. data/base/app/views/users/_user.html.erb +2 -0
  426. data/base/app/views/users/_user_with_details.html.erb +2 -0
  427. data/base/app/views/users/index.html.erb +43 -0
  428. data/base/app/views/users/index.js.erb +1 -0
  429. data/base/app/views/users/info.html.erb +0 -0
  430. data/base/app/views/users/show.html.erb +34 -0
  431. data/base/app/views/users/show.js.erb +2 -0
  432. data/base/app/views/users/show.xml.builder +28 -0
  433. data/base/config/locales/en.yml +387 -0
  434. data/base/config/routes.rb +76 -0
  435. data/base/db/migrate/20110610112023_create_social_stream.rb +319 -0
  436. data/base/db/migrate/20110705103202_empty_ties_count.rb +17 -0
  437. data/base/db/migrate/20110712090343_remove_spheres.rb +30 -0
  438. data/base/db/migrate/20110712142140_remove_permission_function.rb +26 -0
  439. data/base/db/migrate/20110912074426_add_reject_relation.rb +29 -0
  440. data/base/lib/acts_as_taggable_on/acts_as_taggable_on/dirty.rb +37 -0
  441. data/base/lib/acts_as_taggable_on/social_stream.rb +58 -0
  442. data/base/lib/generators/social_stream/base/install_generator.rb +66 -0
  443. data/base/lib/generators/social_stream/base/templates/initializer.rb +23 -0
  444. data/base/lib/generators/social_stream/base/templates/navigation.rb +4 -0
  445. data/base/lib/generators/social_stream/base/templates/relations.yml +52 -0
  446. data/base/lib/generators/social_stream/base/templates/sphinx.yml +9 -0
  447. data/base/lib/mailboxer/notification_decoder.rb +76 -0
  448. data/base/lib/paperclip/social_stream.rb +6 -0
  449. data/base/lib/social_stream-base.rb +119 -0
  450. data/base/lib/social_stream/ability.rb +99 -0
  451. data/base/lib/social_stream/base.rb +46 -0
  452. data/base/lib/social_stream/base/version.rb +5 -0
  453. data/base/lib/social_stream/controllers/helpers.rb +118 -0
  454. data/base/lib/social_stream/d3.rb +53 -0
  455. data/base/lib/social_stream/migrations/base.rb +55 -0
  456. data/base/lib/social_stream/migrations/components.rb +19 -0
  457. data/base/lib/social_stream/migrations/finder.rb +20 -0
  458. data/base/lib/social_stream/models/object.rb +121 -0
  459. data/base/lib/social_stream/models/subject.rb +122 -0
  460. data/base/lib/social_stream/models/supertype.rb +37 -0
  461. data/base/lib/social_stream/populate.rb +26 -0
  462. data/base/lib/social_stream/test_helpers.rb +11 -0
  463. data/base/lib/social_stream/test_helpers/controllers.rb +120 -0
  464. data/base/lib/social_stream/toolbar_config.rb +99 -0
  465. data/base/lib/tasks/db/populate.rake +214 -0
  466. data/base/lib/tasks/resque.rake +3 -0
  467. data/base/social_stream-base.gemspec +76 -0
  468. data/base/spec/controllers/comments_controller_spec.rb +63 -0
  469. data/base/spec/controllers/contacts_controller_spec.rb +104 -0
  470. data/base/spec/controllers/frontpage_controller_spec.rb +16 -0
  471. data/base/spec/controllers/groups_controller_spec.rb +164 -0
  472. data/base/spec/controllers/home_controller_spec.rb +41 -0
  473. data/base/spec/controllers/likes_controller_spec.rb +48 -0
  474. data/base/spec/controllers/notifications_controller_spec.rb +46 -0
  475. data/base/spec/controllers/permissions_controller_spec.rb +45 -0
  476. data/base/spec/controllers/posts_controller_spec.rb +167 -0
  477. data/base/spec/controllers/profiles_controller_spec.rb +102 -0
  478. data/base/spec/controllers/relation_customs_controller_spec.rb +139 -0
  479. data/base/spec/controllers/representations_spec.rb +74 -0
  480. data/base/spec/controllers/settings_controller_spec.rb +41 -0
  481. data/base/spec/controllers/subjects_controller.rb +14 -0
  482. data/base/spec/controllers/users_controller_spec.rb +98 -0
  483. data/base/spec/dummy/.gitignore +5 -0
  484. data/base/spec/dummy/Rakefile +7 -0
  485. data/base/spec/dummy/app/assets/javascripts/application.js +8 -0
  486. data/base/spec/dummy/app/assets/stylesheets/application.css +8 -0
  487. data/base/spec/dummy/app/controllers/application_controller.rb +3 -0
  488. data/base/spec/dummy/app/helpers/application_helper.rb +2 -0
  489. data/base/spec/dummy/config.ru +4 -0
  490. data/base/spec/dummy/config/application.rb +44 -0
  491. data/base/spec/dummy/config/boot.rb +10 -0
  492. data/base/spec/dummy/config/database.yml +40 -0
  493. data/base/spec/dummy/config/environment.rb +5 -0
  494. data/base/spec/dummy/config/environments/development.rb +30 -0
  495. data/base/spec/dummy/config/environments/production.rb +54 -0
  496. data/base/spec/dummy/config/environments/test.rb +40 -0
  497. data/base/spec/dummy/config/environments/test_pg.rb +35 -0
  498. data/base/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  499. data/base/spec/dummy/config/initializers/devise.rb +220 -0
  500. data/base/spec/dummy/config/initializers/inflections.rb +10 -0
  501. data/base/spec/dummy/config/initializers/mailboxer.rb +8 -0
  502. data/base/spec/dummy/config/initializers/mime_types.rb +5 -0
  503. data/base/spec/dummy/config/initializers/secret_token.rb +7 -0
  504. data/base/spec/dummy/config/initializers/session_store.rb +8 -0
  505. data/base/spec/dummy/config/initializers/social_stream.rb +23 -0
  506. data/base/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
  507. data/base/spec/dummy/config/locales/en.yml +5 -0
  508. data/base/spec/dummy/config/navigation.rb +4 -0
  509. data/base/spec/dummy/config/relations.yml +52 -0
  510. data/base/spec/dummy/config/routes.rb +60 -0
  511. data/base/spec/dummy/db/schema.rb +5 -0
  512. data/base/spec/dummy/db/seeds.rb +8 -0
  513. data/base/spec/dummy/public/404.html +26 -0
  514. data/base/spec/dummy/public/422.html +26 -0
  515. data/base/spec/dummy/public/500.html +26 -0
  516. data/base/spec/dummy/public/favicon.ico +0 -0
  517. data/base/spec/dummy/script/rails +6 -0
  518. data/base/spec/factories/activity.rb +26 -0
  519. data/base/spec/factories/comment.rb +5 -0
  520. data/base/spec/factories/contact.rb +16 -0
  521. data/base/spec/factories/group.rb +4 -0
  522. data/base/spec/factories/post.rb +10 -0
  523. data/base/spec/factories/relation_custom.rb +4 -0
  524. data/base/spec/factories/tie.rb +43 -0
  525. data/base/spec/factories/user.rb +6 -0
  526. data/base/spec/integration/navigation_spec.rb +33 -0
  527. data/base/spec/models/activity_authorization_spec.rb +349 -0
  528. data/base/spec/models/activity_spec.rb +131 -0
  529. data/base/spec/models/actor_spec.rb +51 -0
  530. data/base/spec/models/contact_spec.rb +37 -0
  531. data/base/spec/models/group_spec.rb +25 -0
  532. data/base/spec/models/like_spec.rb +68 -0
  533. data/base/spec/models/post_spec.rb +59 -0
  534. data/base/spec/models/profile_spec.rb +39 -0
  535. data/base/spec/models/relation_spec.rb +78 -0
  536. data/base/spec/models/tie_spec.rb +82 -0
  537. data/base/spec/models/user_spec.rb +93 -0
  538. data/base/spec/social_stream_spec.rb +7 -0
  539. data/base/spec/spec_helper.rb +26 -0
  540. data/{spec → base/spec}/support/cancan.rb +0 -0
  541. data/base/spec/support/db.rb +7 -0
  542. data/{spec → base/spec}/support/devise.rb +0 -0
  543. data/base/spec/support/mock.rb +4 -0
  544. data/base/vendor/assets/javascripts/ajax.paginate.js +46 -0
  545. data/base/vendor/assets/javascripts/chosen.jquery.js +755 -0
  546. data/base/vendor/assets/javascripts/d3.geom.js +825 -0
  547. data/base/vendor/assets/javascripts/d3.js +4013 -0
  548. data/base/vendor/assets/javascripts/d3.layout.js +1865 -0
  549. data/base/vendor/assets/javascripts/hoverIntent.js +84 -0
  550. data/base/vendor/assets/javascripts/jqcloud-0.1.3.js +87 -0
  551. data/base/vendor/assets/javascripts/jquery.ba-url.js +1091 -0
  552. data/base/vendor/assets/javascripts/jquery.cleditor.min.js +31 -0
  553. data/base/vendor/assets/javascripts/jquery.fcbkcomplete.js +553 -0
  554. data/base/vendor/assets/javascripts/jquery.livequery.js +250 -0
  555. data/base/vendor/assets/javascripts/jquery.scrollTo.min.js +11 -0
  556. data/base/vendor/assets/javascripts/jquery.validate.js +1166 -0
  557. data/base/vendor/assets/javascripts/jquery.validate.old.js +1132 -0
  558. data/base/vendor/assets/javascripts/jquery.watermarkinput.js +81 -0
  559. data/base/vendor/assets/javascripts/menu.js +25 -0
  560. data/base/vendor/assets/javascripts/superfish.js +121 -0
  561. data/base/vendor/assets/javascripts/ui.checkbox.js +309 -0
  562. data/base/vendor/assets/stylesheets/carousel.css +23 -0
  563. data/base/vendor/assets/stylesheets/chosen-sprite.png +0 -0
  564. data/base/vendor/assets/stylesheets/chosen.css +317 -0
  565. data/base/vendor/assets/stylesheets/fcbkComplete.css +44 -0
  566. data/base/vendor/assets/stylesheets/jqcloud.css +15 -0
  567. data/base/vendor/assets/stylesheets/jquery-ui.css +620 -0
  568. data/base/vendor/assets/stylesheets/jquery.cleditor.css +24 -0
  569. data/base/vendor/assets/stylesheets/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  570. data/base/vendor/assets/stylesheets/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  571. data/base/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  572. data/base/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  573. data/base/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  574. data/base/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  575. data/base/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  576. data/base/vendor/assets/stylesheets/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  577. data/base/vendor/assets/stylesheets/smoothness/images/ui-icons_222222_256x240.png +0 -0
  578. data/base/vendor/assets/stylesheets/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  579. data/base/vendor/assets/stylesheets/smoothness/images/ui-icons_454545_256x240.png +0 -0
  580. data/base/vendor/assets/stylesheets/smoothness/images/ui-icons_888888_256x240.png +0 -0
  581. data/base/vendor/assets/stylesheets/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  582. data/base/vendor/assets/stylesheets/smoothness/jquery-ui-1.7.3.custom.css +405 -0
  583. data/base/vendor/assets/stylesheets/smoothness/jquery-ui-1.8.4.custom.css +572 -0
  584. data/documents/.gitignore +15 -0
  585. data/documents/.rspec +1 -0
  586. data/documents/Gemfile +5 -0
  587. data/documents/MIT-LICENSE +20 -0
  588. data/documents/README.rdoc +6 -0
  589. data/documents/Rakefile +36 -0
  590. data/documents/app/assets/flash/Jplayer.swf +0 -0
  591. data/documents/app/assets/images/16/audio.png +0 -0
  592. data/documents/app/assets/images/16/btn_documents.png +0 -0
  593. data/documents/app/assets/images/16/default.png +0 -0
  594. data/documents/app/assets/images/16/doc.png +0 -0
  595. data/documents/app/assets/images/16/mpeg.png +0 -0
  596. data/documents/app/assets/images/16/pdf.png +0 -0
  597. data/documents/app/assets/images/16/photo.png +0 -0
  598. data/documents/app/assets/images/16/plain.png +0 -0
  599. data/documents/app/assets/images/16/ppt.png +0 -0
  600. data/documents/app/assets/images/16/rar.png +0 -0
  601. data/documents/app/assets/images/16/video.png +0 -0
  602. data/documents/app/assets/images/16/xls.png +0 -0
  603. data/documents/app/assets/images/16/zip.png +0 -0
  604. data/documents/app/assets/images/48/audio.png +0 -0
  605. data/documents/app/assets/images/48/default.png +0 -0
  606. data/documents/app/assets/images/48/excel.png +0 -0
  607. data/documents/app/assets/images/48/mpeg.png +0 -0
  608. data/documents/app/assets/images/48/pdf.png +0 -0
  609. data/documents/app/assets/images/48/ppt.png +0 -0
  610. data/documents/app/assets/images/48/rar.png +0 -0
  611. data/documents/app/assets/images/48/resource.png +0 -0
  612. data/documents/app/assets/images/48/video.png +0 -0
  613. data/documents/app/assets/images/48/word.png +0 -0
  614. data/documents/app/assets/images/48/zip.png +0 -0
  615. data/documents/app/assets/images/btn/btn_audio.png +0 -0
  616. data/documents/app/assets/images/btn/btn_document.png +0 -0
  617. data/documents/app/assets/images/btn/btn_excel.png +0 -0
  618. data/documents/app/assets/images/btn/btn_pdf.png +0 -0
  619. data/documents/app/assets/images/btn/btn_picture.png +0 -0
  620. data/documents/app/assets/images/btn/btn_resource.png +0 -0
  621. data/documents/app/assets/images/btn/btn_video.png +0 -0
  622. data/documents/app/assets/images/btn/btn_word.png +0 -0
  623. data/documents/app/assets/images/btn/document.png +0 -0
  624. data/documents/app/assets/javascripts/documents.js.erb +67 -0
  625. data/documents/app/assets/javascripts/social_stream-documents.js +2 -0
  626. data/documents/app/assets/stylesheets/documents.css +190 -0
  627. data/documents/app/assets/stylesheets/social_stream-documents.css +4 -0
  628. data/documents/app/controllers/audios_controller.rb +16 -0
  629. data/documents/app/controllers/common_documents_controller.rb +42 -0
  630. data/documents/app/controllers/documents_controller.rb +31 -0
  631. data/documents/app/controllers/pictures_controller.rb +3 -0
  632. data/documents/app/controllers/videos_controller.rb +17 -0
  633. data/documents/app/helpers/documents_helper.rb +22 -0
  634. data/documents/app/models/audio.rb +20 -0
  635. data/documents/app/models/document.rb +60 -0
  636. data/documents/app/models/picture.rb +21 -0
  637. data/documents/app/models/video.rb +23 -0
  638. data/documents/app/views/audios/_audio.html.erb +62 -0
  639. data/documents/app/views/audios/_mediapreviews.html.erb +0 -0
  640. data/documents/app/views/audios/_new.html.erb +1 -0
  641. data/documents/app/views/audios/destroy.js.erb +1 -0
  642. data/documents/app/views/audios/index.html.erb +1 -0
  643. data/documents/app/views/audios/index.js.erb +1 -0
  644. data/documents/app/views/audios/show.html.erb +2 -0
  645. data/documents/app/views/common-documents/_index.html.erb +45 -0
  646. data/documents/app/views/documents/_document.html.erb +19 -0
  647. data/documents/app/views/documents/_header.html.erb +5 -0
  648. data/documents/app/views/documents/_new_activity.html.erb +1 -0
  649. data/documents/app/views/documents/_new_activity_fields.html.erb +1 -0
  650. data/documents/app/views/documents/destroy.js.erb +1 -0
  651. data/documents/app/views/documents/index.html.erb +1 -0
  652. data/documents/app/views/documents/index.js.erb +1 -0
  653. data/documents/app/views/documents/show.html.erb +2 -0
  654. data/documents/app/views/pictures/_mediapreviews.html.erb +8 -0
  655. data/documents/app/views/pictures/_new.html.erb +1 -0
  656. data/documents/app/views/pictures/_picture.html.erb +27 -0
  657. data/documents/app/views/pictures/destroy.js.erb +1 -0
  658. data/documents/app/views/pictures/index.html.erb +1 -0
  659. data/documents/app/views/pictures/index.js.erb +1 -0
  660. data/documents/app/views/pictures/show.html.erb +2 -0
  661. data/documents/app/views/toolbar/_uploads_menu.html.erb +21 -0
  662. data/documents/app/views/videos/_new.html.erb +1 -0
  663. data/documents/app/views/videos/_video.html.erb +70 -0
  664. data/documents/app/views/videos/destroy.js.erb +1 -0
  665. data/documents/app/views/videos/index.html.erb +1 -0
  666. data/documents/app/views/videos/show.html.erb +2 -0
  667. data/documents/app/worker/audioencoder.rb +7 -0
  668. data/documents/app/worker/videoencoder.rb +7 -0
  669. data/documents/config/locales/en.yml +43 -0
  670. data/documents/config/routes.rb +22 -0
  671. data/documents/db/migrate/20110615143707_create_social_stream_documents.rb +24 -0
  672. data/documents/lib/generators/social_stream/documents/install_generator.rb +24 -0
  673. data/documents/lib/social_stream-documents.rb +15 -0
  674. data/documents/lib/social_stream/documents/engine.rb +39 -0
  675. data/documents/lib/social_stream/migrations/documents.rb +9 -0
  676. data/documents/social_stream-documents.gemspec +24 -0
  677. data/documents/spec/controllers/documents_controller_spec.rb +80 -0
  678. data/documents/spec/controllers/pictures_controller_spec.rb +80 -0
  679. data/documents/spec/dummy/.gitignore +1 -0
  680. data/documents/spec/dummy/Rakefile +7 -0
  681. data/documents/spec/dummy/app/controllers/application_controller.rb +3 -0
  682. data/documents/spec/dummy/app/helpers/application_helper.rb +2 -0
  683. data/documents/spec/dummy/app/views/layouts/application.html.erb +14 -0
  684. data/documents/spec/dummy/config.ru +4 -0
  685. data/documents/spec/dummy/config/application.rb +45 -0
  686. data/documents/spec/dummy/config/boot.rb +10 -0
  687. data/documents/spec/dummy/config/database.yml +22 -0
  688. data/documents/spec/dummy/config/environment.rb +5 -0
  689. data/documents/spec/dummy/config/environments/development.rb +26 -0
  690. data/documents/spec/dummy/config/environments/production.rb +49 -0
  691. data/documents/spec/dummy/config/environments/test.rb +35 -0
  692. data/documents/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  693. data/documents/spec/dummy/config/initializers/devise.rb +176 -0
  694. data/documents/spec/dummy/config/initializers/inflections.rb +10 -0
  695. data/documents/spec/dummy/config/initializers/mime_types.rb +5 -0
  696. data/documents/spec/dummy/config/initializers/secret_token.rb +7 -0
  697. data/documents/spec/dummy/config/initializers/session_store.rb +8 -0
  698. data/documents/spec/dummy/config/locales/en.yml +5 -0
  699. data/documents/spec/dummy/config/navigation.rb +0 -0
  700. data/documents/spec/dummy/config/relations.yml +39 -0
  701. data/documents/spec/dummy/config/routes.rb +60 -0
  702. data/documents/spec/dummy/db/.gitkeep +0 -0
  703. data/documents/spec/dummy/public/404.html +26 -0
  704. data/documents/spec/dummy/public/422.html +26 -0
  705. data/documents/spec/dummy/public/500.html +26 -0
  706. data/documents/spec/dummy/public/favicon.ico +0 -0
  707. data/documents/spec/dummy/public/javascripts/application.js +2 -0
  708. data/documents/spec/dummy/public/javascripts/controls.js +965 -0
  709. data/documents/spec/dummy/public/javascripts/dragdrop.js +974 -0
  710. data/documents/spec/dummy/public/javascripts/effects.js +1123 -0
  711. data/documents/spec/dummy/public/javascripts/prototype.js +6001 -0
  712. data/documents/spec/dummy/public/javascripts/rails.js +191 -0
  713. data/documents/spec/dummy/public/stylesheets/.gitkeep +0 -0
  714. data/documents/spec/dummy/script/rails +6 -0
  715. data/documents/spec/factories/document.rb +19 -0
  716. data/documents/spec/factories/files/privado.png +0 -0
  717. data/documents/spec/factories/files/rails.png +0 -0
  718. data/documents/spec/factories/files/small.pdf +157 -0
  719. data/documents/spec/factories/picture.rb +20 -0
  720. data/documents/spec/integration/navigation_spec.rb +9 -0
  721. data/documents/spec/models/video_spec.rb +9 -0
  722. data/documents/spec/socialstream_documents_spec.rb +7 -0
  723. data/documents/spec/spec_helper.rb +41 -0
  724. data/documents/spec/support/cancan.rb +1 -0
  725. data/documents/spec/support/db.rb +8 -0
  726. data/documents/spec/support/devise.rb +4 -0
  727. data/documents/spec/support/mock.rb +4 -0
  728. data/documents/vendor/assets/javascripts/jquery.jplayer.js +78 -0
  729. data/documents/vendor/assets/stylesheets/jplayer.blue.monday.css +448 -0
  730. data/documents/vendor/assets/stylesheets/jplayer.blue.monday.jpg +0 -0
  731. data/documents/vendor/assets/stylesheets/jplayer.blue.monday.video.play.hover.png +0 -0
  732. data/documents/vendor/assets/stylesheets/jplayer.blue.monday.video.play.png +0 -0
  733. data/documents/vendor/assets/stylesheets/pbar-ani.gif +0 -0
  734. data/events/.gitignore +10 -0
  735. data/events/GPL Affero license +663 -0
  736. data/events/Gemfile +5 -0
  737. data/events/README.rdoc +6 -0
  738. data/events/Rakefile +36 -0
  739. data/events/app/assets/images/btn/btn_certificate.png +0 -0
  740. data/events/app/assets/images/btn/btn_certificates.png +0 -0
  741. data/events/app/assets/images/btn/btn_edit.png +0 -0
  742. data/events/app/assets/images/btn/btn_embebed.png +0 -0
  743. data/events/app/assets/images/btn/btn_event.png +0 -0
  744. data/events/app/assets/images/btn/btn_outline.png +0 -0
  745. data/events/app/assets/images/btn/event.png +0 -0
  746. data/events/app/assets/images/btn/flyer.png +0 -0
  747. data/events/app/assets/images/btn/keynote.png +0 -0
  748. data/events/app/assets/images/btn/live.png +0 -0
  749. data/events/app/assets/images/btn/time.png +0 -0
  750. data/events/app/assets/images/btn/trash.png +0 -0
  751. data/events/app/assets/images/icons/IconsByGlyphish.txt +1 -0
  752. data/events/app/assets/images/icons/down.png +0 -0
  753. data/events/app/assets/images/icons/search.png +0 -0
  754. data/events/app/assets/images/icons/up.png +0 -0
  755. data/events/app/assets/images/logos/actor/event.png +0 -0
  756. data/events/app/assets/images/logos/contact/event.png +0 -0
  757. data/events/app/assets/images/logos/original/event.png +0 -0
  758. data/events/app/assets/images/logos/profile/event.png +0 -0
  759. data/events/app/assets/images/logos/representation/event.png +0 -0
  760. data/events/app/assets/images/tab_bottom.png +0 -0
  761. data/events/app/assets/javascripts/schedule.js +123 -0
  762. data/events/app/assets/javascripts/settings.js +20 -0
  763. data/events/app/assets/javascripts/social_stream-events.js +5 -0
  764. data/events/app/assets/stylesheets/activities.css +4 -0
  765. data/events/app/assets/stylesheets/fullcalendar.css +621 -0
  766. data/events/app/assets/stylesheets/fullcalendar.print.css +61 -0
  767. data/events/app/assets/stylesheets/settings.css +4 -0
  768. data/events/app/assets/stylesheets/social_stream-events.css +273 -0
  769. data/events/app/assets/stylesheets/tie.css +4 -0
  770. data/events/app/assets/stylesheets/users.css +4 -0
  771. data/events/app/controllers/activities_controller.rb +42 -0
  772. data/events/app/controllers/agendas_controller.rb +54 -0
  773. data/events/app/controllers/calendar_events_controller.rb +157 -0
  774. data/events/app/controllers/events_controller.rb +85 -0
  775. data/events/app/controllers/sessions_controller.rb +133 -0
  776. data/events/app/controllers/settings_controller.rb +70 -0
  777. data/events/app/helpers/event_helper.rb +12 -0
  778. data/events/app/models/agenda.rb +55 -0
  779. data/events/app/models/event.rb +131 -0
  780. data/events/app/models/session.rb +22 -0
  781. data/events/app/views/activities/_activity.html.erb +5 -0
  782. data/events/app/views/activities/_child.html.erb +18 -0
  783. data/events/app/views/activities/_comments.html.erb +3 -0
  784. data/events/app/views/activities/_index.html.erb +94 -0
  785. data/events/app/views/activities/_options.html.erb +15 -0
  786. data/events/app/views/activities/_root.html.erb +37 -0
  787. data/events/app/views/activities/_wall.html.erb +5 -0
  788. data/events/app/views/activities/_walls.html.erb +34 -0
  789. data/events/app/views/activities/documents.js.erb +1 -0
  790. data/events/app/views/activities/index.js.erb +1 -0
  791. data/events/app/views/agendas/_agenda.html.erb +1 -0
  792. data/events/app/views/agendas/_edit.html.erb +136 -0
  793. data/events/app/views/agendas/_schedule.html.erb +19 -0
  794. data/events/app/views/agendas/_show.html.erb +81 -0
  795. data/events/app/views/agendas/_show_day.html.erb +6 -0
  796. data/events/app/views/agendas/edit.html.erb +24 -0
  797. data/events/app/views/agendas/event.html.erb +1 -0
  798. data/events/app/views/agendas/index.html.erb +0 -0
  799. data/events/app/views/agendas/show.html.erb +25 -0
  800. data/events/app/views/calendar_events/_calendar.html.erb +0 -0
  801. data/events/app/views/calendar_events/_edit_form.html.erb +58 -0
  802. data/events/app/views/calendar_events/_form.html.erb +65 -0
  803. data/events/app/views/calendar_events/available.html.erb +81 -0
  804. data/events/app/views/calendar_events/create.js.erb +18 -0
  805. data/events/app/views/calendar_events/edit.js.erb +1 -0
  806. data/events/app/views/calendar_events/index.html.erb +162 -0
  807. data/events/app/views/calendar_events/move.js.erb +0 -0
  808. data/events/app/views/calendar_events/new.js.erb +9 -0
  809. data/events/app/views/calendar_events/resize.js.erb +0 -0
  810. data/events/app/views/calendar_events/schedule.html.erb +143 -0
  811. data/events/app/views/documents/_mediawall.html.erb +111 -0
  812. data/events/app/views/events/_event.html.erb +10 -0
  813. data/events/app/views/events/_event_with_details.html.erb +2 -0
  814. data/events/app/views/events/_form.html.erb +12 -0
  815. data/events/app/views/events/_jquery.html.erb +125 -0
  816. data/events/app/views/events/_manage.html.erb +35 -0
  817. data/events/app/views/events/_new_activity.html.erb +2 -0
  818. data/events/app/views/events/_new_activity_fields.html.erb +5 -0
  819. data/events/app/views/events/_sessions_edit.html.erb +46 -0
  820. data/events/app/views/events/_sidebar_cloud.html.erb +27 -0
  821. data/events/app/views/events/_sidebar_index.html.erb +1 -0
  822. data/events/app/views/events/_sidebar_show.html.erb +5 -0
  823. data/events/app/views/events/agendas.html +1 -0
  824. data/events/app/views/events/edit.html.erb +12 -0
  825. data/events/app/views/events/index.html.erb +30 -0
  826. data/events/app/views/events/manage.html.erb +69 -0
  827. data/events/app/views/events/manage.js.erb +1 -0
  828. data/events/app/views/events/show.html.erb +34 -0
  829. data/events/app/views/kaminari/_first_page.html.erb +11 -0
  830. data/events/app/views/kaminari/_gap.html.erb +8 -0
  831. data/events/app/views/kaminari/_last_page.html.erb +11 -0
  832. data/events/app/views/kaminari/_next_page.html.erb +11 -0
  833. data/events/app/views/kaminari/_page.html.erb +12 -0
  834. data/events/app/views/kaminari/_paginator.html.erb +23 -0
  835. data/events/app/views/kaminari/_prev_page.html.erb +11 -0
  836. data/events/app/views/profiles/_outline.html.erb +81 -0
  837. data/events/app/views/profiles/_profile.html.erb +40 -0
  838. data/events/app/views/sessions/_form.html.erb +41 -0
  839. data/events/app/views/sessions/_new.html.erb +63 -0
  840. data/events/app/views/sessions/_session.html.erb +1 -0
  841. data/events/app/views/sessions/_show.html.erb +27 -0
  842. data/events/app/views/sessions/create.html.erb +3 -0
  843. data/events/app/views/sessions/create.js.erb +1 -0
  844. data/events/app/views/sessions/destroy.js.erb +2 -0
  845. data/events/app/views/sessions/edit.html.erb +27 -0
  846. data/events/app/views/sessions/index.html.erb +1 -0
  847. data/events/app/views/sessions/index.js.erb +1 -0
  848. data/events/app/views/sessions/new.html.erb +27 -0
  849. data/events/app/views/settings/_contacto.html.erb +24 -0
  850. data/events/app/views/settings/_header.html.erb +8 -0
  851. data/events/app/views/settings/_index.html.erb +16 -0
  852. data/events/app/views/settings/_manage.html.erb +25 -0
  853. data/events/app/views/settings/_settings.html.erb +49 -0
  854. data/events/app/views/settings/delete_relation.js.erb +3 -0
  855. data/events/app/views/settings/index.html.erb +38 -0
  856. data/events/app/views/settings/manage.html.erb +31 -0
  857. data/events/app/views/settings/show.html.erb +15 -0
  858. data/events/app/views/settings/update_relation.js.erb +1 -0
  859. data/events/app/views/toolbar/_home.html.erb +11 -0
  860. data/events/app/views/toolbar/_logo.html.erb +23 -0
  861. data/events/app/views/toolbar/_organizer.html.erb +25 -0
  862. data/events/app/views/toolbar/_profile.html.erb +21 -0
  863. data/events/app/views/toolbar/_sponsor.html.erb +18 -0
  864. data/events/app/views/toolbar/_suscribed.html.erb +17 -0
  865. data/events/app/views/users/index.html.erb +46 -0
  866. data/events/config/locales/en.yml +97 -0
  867. data/events/config/routes.rb +46 -0
  868. data/events/db/migrate/20110910161707_create_social_stream_events.rb +54 -0
  869. data/events/lib/generators/social_stream/events/install_generator.rb +24 -0
  870. data/events/lib/social_stream-events.rb +15 -0
  871. data/events/lib/social_stream/events/engine.rb +8 -0
  872. data/events/lib/social_stream/migrations/events.rb +8 -0
  873. data/events/social_stream-events.gemspec +22 -0
  874. data/events/vendor/assets/javascripts/fullcalendar.js +5208 -0
  875. data/events/vendor/assets/javascripts/gcal.js +112 -0
  876. data/lib/social_stream/version.rb +1 -1
  877. data/spec/dummy/documents/documents/000/000/001/original.pdf +157 -0
  878. data/spec/dummy/documents/documents/000/000/002/original.pdf +157 -0
  879. data/spec/dummy/documents/documents/000/000/003/original.pdf +157 -0
  880. data/spec/dummy/documents/documents/000/000/004/original.pdf +157 -0
  881. data/spec/dummy/documents/documents/000/000/005/original.pdf +157 -0
  882. data/spec/dummy/documents/documents/000/000/006/original.pdf +157 -0
  883. data/spec/dummy/documents/documents/000/000/007/original.pdf +157 -0
  884. data/spec/dummy/documents/documents/000/000/008/original.pdf +157 -0
  885. data/spec/dummy/documents/pictures/000/000/009/original.png +0 -0
  886. data/spec/dummy/documents/pictures/000/000/009/thumb.png +0 -0
  887. data/spec/dummy/documents/pictures/000/000/009/thumb0.png +0 -0
  888. data/spec/dummy/documents/pictures/000/000/010/original.png +0 -0
  889. data/spec/dummy/documents/pictures/000/000/010/thumb.png +0 -0
  890. data/spec/dummy/documents/pictures/000/000/010/thumb0.png +0 -0
  891. data/spec/dummy/documents/pictures/000/000/011/original.png +0 -0
  892. data/spec/dummy/documents/pictures/000/000/011/thumb.png +0 -0
  893. data/spec/dummy/documents/pictures/000/000/011/thumb0.png +0 -0
  894. data/spec/dummy/documents/pictures/000/000/012/original.png +0 -0
  895. data/spec/dummy/documents/pictures/000/000/012/thumb.png +0 -0
  896. data/spec/dummy/documents/pictures/000/000/012/thumb0.png +0 -0
  897. data/spec/dummy/documents/pictures/000/000/013/original.png +0 -0
  898. data/spec/dummy/documents/pictures/000/000/013/thumb.png +0 -0
  899. data/spec/dummy/documents/pictures/000/000/013/thumb0.png +0 -0
  900. data/spec/dummy/documents/pictures/000/000/014/original.png +0 -0
  901. data/spec/dummy/documents/pictures/000/000/014/thumb.png +0 -0
  902. data/spec/dummy/documents/pictures/000/000/014/thumb0.png +0 -0
  903. data/spec/dummy/documents/pictures/000/000/015/original.png +0 -0
  904. data/spec/dummy/documents/pictures/000/000/015/thumb.png +0 -0
  905. data/spec/dummy/documents/pictures/000/000/015/thumb0.png +0 -0
  906. data/spec/dummy/documents/pictures/000/000/016/original.png +0 -0
  907. data/spec/dummy/documents/pictures/000/000/016/thumb.png +0 -0
  908. data/spec/dummy/documents/pictures/000/000/016/thumb0.png +0 -0
  909. data/spec/spec_helper.rb +1 -9
  910. data/spec/support/components.rb +7 -0
  911. data/spec/support/db.rb +2 -0
  912. metadata +909 -6
@@ -0,0 +1,11 @@
1
+ class InvitationMailer < ActionMailer::Base
2
+
3
+ default :from => Mailboxer.default_from
4
+
5
+ def send_invitation(receiver, sender, message)
6
+ @sender= sender
7
+ @message= message
8
+ mail(:to => receiver, :subject => "SocialStream Invitation")
9
+ end
10
+
11
+ end
@@ -0,0 +1,34 @@
1
+ #OVERRING WARNING
2
+ #We must override the NotificationMailer from Mailboxer to change the new_notification_email method
3
+ #refer to it for more info
4
+ #NOTE: There is just few lines different from original Mailboxer NotificationMailer. Please maintain it
5
+ #updated for correct behaviour
6
+ class NotificationMailer < ActionMailer::Base
7
+ default :from => Mailboxer.default_from
8
+ #Sends and email for indicating a new notification to a receiver.
9
+ #It calls new_notification_email.
10
+ def send_email(notification,receiver)
11
+ new_notification_email(notification,receiver)
12
+ end
13
+
14
+ include ActionView::Helpers::SanitizeHelper
15
+ #DIFFERENT FROM ORIGINAL----------------------
16
+ include Mailboxer::NotificationDecoder
17
+ #END OF DIFFERENCE----------------------------
18
+
19
+ #Sends an email for indicating a new message for the receiver
20
+ def new_notification_email(notification,receiver)
21
+ @notification = notification
22
+ @receiver = receiver
23
+ #DIFFERENT FROM ORIGINAL----------------------
24
+ subject = notification.subject.to_s
25
+ subject = decode_basic_notification(subject,notification.notified_object)
26
+ subject = subject.gsub(/\n/,'')
27
+ #END OF DIFFERENCE----------------------------
28
+ subject = strip_tags(subject) unless subject.html_safe?
29
+ mail(:to => receiver.send(Mailboxer.email_method,notification), :subject => t('mailboxer.notification_mailer.subject', :subject => subject)) do |format|
30
+ format.text {render __method__}
31
+ format.html {render __method__}
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,2 @@
1
+ class Ability < SocialStream::Ability
2
+ end
@@ -0,0 +1,321 @@
1
+ # Activities follow the {Activity Streams}[http://activitystrea.ms/] standard.
2
+ #
3
+ # == Activities, Contacts and Audiences
4
+ # Every activity is attached to a {Contact}, which defines the sender and the receiver of the {Activity}
5
+ #
6
+ # Besides, the activity is attached to one or more relations, which define the audicence of the activity,
7
+ # the {actors Actor} that can reach it and their {permissions Permission}
8
+ #
9
+ # == Wall
10
+ # The Activity.wall(args) scope provides all the activities appearing in a wall
11
+ #
12
+ # There are two types of wall, :home and :profile. Check {Actor#wall} for more information
13
+ #
14
+ class Activity < ActiveRecord::Base
15
+ has_ancestry
16
+
17
+ paginates_per 10
18
+
19
+ belongs_to :activity_verb
20
+
21
+ belongs_to :contact
22
+ has_one :sender, :through => :contact
23
+ has_one :receiver, :through => :contact
24
+
25
+ has_many :audiences, :dependent => :destroy
26
+ has_many :relations, :through => :audiences
27
+
28
+ has_many :activity_object_activities,
29
+ :dependent => :destroy
30
+ has_many :activity_objects,
31
+ :through => :activity_object_activities
32
+
33
+ scope :wall, lambda { |args|
34
+ q =
35
+ select("DISTINCT activities.*").
36
+ joins(:contact).
37
+ joins(:audiences).
38
+ joins(:relations).
39
+ roots
40
+
41
+ if args[:object_type].present?
42
+ q = q.joins(:activity_objects).
43
+ where('activity_objects.object_type' => args[:object_type])
44
+ end
45
+
46
+ contacts = Contact.arel_table
47
+ audiences = Audience.arel_table
48
+ relations = Relation.arel_table
49
+
50
+ owner_conditions =
51
+ contacts[:sender_id].eq(Actor.normalize_id(args[:owner])).
52
+ or(contacts[:receiver_id].eq(Actor.normalize_id(args[:owner])))
53
+
54
+ audience_conditions =
55
+ audiences[:relation_id].eq(args[:relations]).
56
+ or(relations[:type].eq('Relation::Public'))
57
+
58
+ conds =
59
+ case args[:type]
60
+ when :home
61
+ followed_conditions =
62
+ contacts[:sender_id].in(args[:followed]).
63
+ or(contacts[:receiver_id].in(args[:followed]))
64
+
65
+ owner_conditions.
66
+ or(followed_conditions.and(audience_conditions))
67
+ when :profile
68
+ if args[:for].present?
69
+ visitor_conditions =
70
+ contacts[:sender_id].eq(Actor.normalize_id(args[:for])).
71
+ or(contacts[:receiver_id].eq(Actor.normalize_id(args[:for])))
72
+
73
+ owner_conditions.
74
+ and(visitor_conditions.or(audience_conditions))
75
+ else
76
+ owner_conditions.
77
+ and(audience_conditions)
78
+ end
79
+ else
80
+ raise "Unknown wall type: #{ args[:type] }"
81
+ end
82
+
83
+ q.where(conds).
84
+ order("created_at desc")
85
+ }
86
+
87
+ before_validation :fill_relations
88
+
89
+ after_create :increment_like_count
90
+ after_destroy :decrement_like_count, :delete_notifications
91
+
92
+ validates_presence_of :relations
93
+
94
+ #For now, it should be the last one
95
+ #FIXME
96
+ after_create :send_notifications
97
+
98
+ # The name of the verb of this activity
99
+ def verb
100
+ activity_verb.name
101
+ end
102
+
103
+ # Set the name of the verb of this activity
104
+ def verb=(name)
105
+ self.activity_verb = ActivityVerb[name]
106
+ end
107
+
108
+ # The {Actor} author of this activity
109
+ #
110
+ # This method provides the {Actor}. Use {#sender_subject} for the {SocialStream::Models::Subject Subject}
111
+ # ({User}, {Group}, etc..)
112
+ def sender
113
+ contact.sender
114
+ end
115
+
116
+ # The {SocialStream::Models::Subject Subject} author of this activity
117
+ #
118
+ # This method provides the {SocialStream::Models::Subject Subject} ({User}, {Group}, etc...).
119
+ # Use {#sender} for the {Actor}.
120
+ def sender_subject
121
+ contact.sender_subject
122
+ end
123
+
124
+ # The wall where the activity is shown belongs to receiver
125
+ #
126
+ # This method provides the {Actor}. Use {#receiver_subject} for the {SocialStream::Models::Subject Subject}
127
+ # ({User}, {Group}, etc..)
128
+ def receiver
129
+ contact.receiver
130
+ end
131
+
132
+ # The wall where the activity is shown belongs to the receiver
133
+ #
134
+ # This method provides the {SocialStream::Models::Subject Subject} ({User}, {Group}, etc...).
135
+ # Use {#receiver} for the {Actor}.
136
+ def receiver_subject
137
+ contact.receiver_subject
138
+ end
139
+
140
+ # The comments about this activity
141
+ def comments
142
+ children.includes(:activity_objects).where('activity_objects.object_type' => "Comment")
143
+ end
144
+
145
+ # The 'like' qualifications emmited to this activities
146
+ def likes
147
+ children.joins(:activity_verb).where('activity_verbs.name' => "like")
148
+ end
149
+
150
+ def liked_by(user) #:nodoc:
151
+ likes.joins(:contact).merge(Contact.sent_by(user))
152
+ end
153
+
154
+ # Does user like this activity?
155
+ def liked_by?(user)
156
+ liked_by(user).present?
157
+ end
158
+
159
+ # Build a new children activity where subject like this
160
+ def new_like(subject)
161
+ a = children.new :verb => "like",
162
+ :contact => subject.contact_to!(receiver),
163
+ :relation_ids => self.relation_ids
164
+
165
+ if direct_activity_object.present?
166
+ a.activity_objects << direct_activity_object
167
+ end
168
+
169
+ a
170
+ end
171
+
172
+ # The first activity object of this activity
173
+ def direct_activity_object
174
+ activity_objects.first
175
+ end
176
+
177
+ # The first object of this activity
178
+ def direct_object
179
+ direct_activity_object.try(:object)
180
+ end
181
+
182
+ # The title for this activity in the stream
183
+ def title view
184
+ case verb
185
+ when "follow", "make-friend", "like"
186
+ I18n.t "activity.verb.#{ verb }.#{ receiver.subject_type }.title",
187
+ :subject => view.link_name(sender_subject),
188
+ :contact => view.link_name(receiver_subject)
189
+ when "post"
190
+ if sender == receiver
191
+ view.link_name sender_subject
192
+ else
193
+ I18n.t "activity.verb.post.title.other_wall",
194
+ :sender => view.link_name(sender_subject),
195
+ :receiver => view.link_name(receiver_subject)
196
+ end
197
+ end.html_safe
198
+ end
199
+
200
+ def notificable?
201
+ is_root? or ['post','update'].include?(root.verb)
202
+ end
203
+
204
+ def notify
205
+ return true if !notificable?
206
+ #Avaible verbs: follow, like, make-friend, post, update
207
+ actionview = ActivitiesController.new.view_context
208
+
209
+ if ['like','follow','make-friend','post','update'].include? verb and !contact.reflexive?
210
+ notification_subject = actionview.render :partial => 'notifications/activities/' + verb + "_subject", :locals => {:activity => self}
211
+ notification_body = actionview.render :partial => 'notifications/activities/' + verb + "_body", :locals => {:activity => self}
212
+ receiver.notify(notification_subject, notification_body, self)
213
+ end
214
+ true
215
+ end
216
+
217
+ # Is subject allowed to perform action on this {Activity}?
218
+ def allow?(subject, action)
219
+ return false if contact.blank?
220
+
221
+ case action
222
+ when 'create'
223
+ return false if contact.sender_id != Actor.normalize_id(subject)
224
+
225
+ rels = Relation.normalize(relation_ids)
226
+
227
+ own_rels = rels.select{ |r| r.actor_id == contact.sender_id }
228
+ foreign_rels = rels - own_rels
229
+
230
+ # Only posting to own relations or allowed to post to foreign relations
231
+ return foreign_rels.blank? && own_rels.present? ||
232
+ foreign_rels.present? && Relation.allow(subject,
233
+ action,
234
+ 'activity',
235
+ :in => foreign_rels).
236
+ all.size == foreign_rels.size
237
+
238
+ when 'read'
239
+ return true if relations.select{ |r| r.is_a?(Relation::Public) }.any?
240
+
241
+ return false if subject.blank?
242
+
243
+ return true if [contact.sender_id, contact.receiver_id].include?(Actor.normalize_id(subject))
244
+ when 'update'
245
+ return true if contact.sender_id == Actor.normalize_id(subject)
246
+ when 'destroy'
247
+ # We only allow destroying to sender and receiver by now
248
+ return [contact.sender_id, contact.receiver_id].include?(Actor.normalize_id(subject))
249
+ end
250
+
251
+ Relation.
252
+ allow?(subject, action, 'activity', :in => self.relation_ids, :public => false)
253
+ end
254
+
255
+ # Can subject delete the object of this activity?
256
+ def delete_object_by?(subject)
257
+ subject.present? &&
258
+ direct_object.present? &&
259
+ ! direct_object.is_a?(Actor) &&
260
+ ! direct_object.class.ancestors.include?(SocialStream::Models::Subject) &&
261
+ allow?(subject, 'destroy')
262
+ end
263
+
264
+ # The {Relation} with which activity is shared
265
+ def audience_in_words(subject)
266
+ visible_relations =
267
+ relations.select{ |r| r.actor_id == Actor.normalize_id(subject) || r.is_a?(Relation::Public) }
268
+
269
+ visible_relations.present? ?
270
+ I18n.t('activity.audience.visible', :audience => visible_relations.map(&:name).join(", ")) :
271
+ I18n.t('activity.audience.hidden', :audience => relations.map(&:actor).map(&:name).join(", "))
272
+ end
273
+
274
+ private
275
+
276
+ # Before validation callback
277
+ #
278
+ # Fill the relations when posting to other subject's wall
279
+ def fill_relations
280
+ return if relation_ids.present?
281
+
282
+ self.relation_ids =
283
+ if contact.reflexive?
284
+ Array(receiver.relation_public.id)
285
+ else
286
+ receiver.relation_customs.allow(contact.sender, 'create', 'activity').map(&:id)
287
+ end
288
+ end
289
+
290
+ #Send notifications to actors based on proximity, interest and permissions
291
+ def send_notifications
292
+ notify
293
+ end
294
+
295
+ # after_create callback
296
+ #
297
+ # Increment like counter in objects with a like activity
298
+ def increment_like_count
299
+ return if verb != "like" || direct_activity_object.blank?
300
+
301
+ direct_activity_object.increment!(:like_count)
302
+ end
303
+
304
+ # after_destroy callback
305
+ #
306
+ # Decrement like counter in objects when like activity is destroyed
307
+ def decrement_like_count
308
+ return if verb != "like" || direct_activity_object.blank?
309
+
310
+ direct_activity_object.decrement!(:like_count)
311
+ end
312
+
313
+ # after_destroy callback
314
+ #
315
+ # Destroy any Notification linked with the activity
316
+ def delete_notifications
317
+ Notification.with_object(self).each do |notification|
318
+ notification.destroy
319
+ end
320
+ end
321
+ end
@@ -0,0 +1,31 @@
1
+ # The {ActivityObject} is any object that receives actions. Examples are
2
+ # creating post, liking a comment, contacting a user.
3
+ #
4
+ # = ActivityObject subtypes
5
+ # All post, comment and user are {SocialStream::Models::Object objects}.
6
+ # Social Stream privides 3 {ActivityObject} subtypes, {Post}, {Comment} and
7
+ # {Actor}. The application developer can define as many {ActivityObject} subtypes
8
+ # as required.
9
+ # Objects are added to +config/initializers/social_stream.rb+
10
+ #
11
+ class ActivityObject < ActiveRecord::Base
12
+ @subtypes_name = :object
13
+ include SocialStream::Models::Supertype
14
+
15
+ acts_as_taggable
16
+
17
+ has_many :activity_object_activities, :dependent => :destroy
18
+ has_many :activities, :through => :activity_object_activities
19
+
20
+ # The object of this activity object
21
+ def object
22
+ subtype_instance.is_a?(Actor) ?
23
+ subtype_instance.subject :
24
+ subtype_instance
25
+ end
26
+
27
+ # The activity in which this activity_object was created
28
+ def post_activity
29
+ activities.includes(:activity_verb).where('activity_verbs.name' => 'post').first
30
+ end
31
+ end
@@ -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
@@ -0,0 +1,491 @@
1
+ # An {Actor} is 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 a {Tie}. The
5
+ # type of a {tie} is a {Relation}. Each actor can define and customize their relations.
6
+ #
7
+ # = Actor subtypes
8
+ # An actor subtype is called a {SocialStream::Models::Subject Subject}.
9
+ # {SocialStream} provides 2 actor subtypes, {User} and {Group}, but the
10
+ # application developer can define as many actor subtypes as required.
11
+ # Actors subtypes are added to +config/initializers/social_stream.rb+
12
+ #
13
+ class Actor < ActiveRecord::Base
14
+ @subtypes_name = :subject
15
+ include SocialStream::Models::Supertype
16
+ include SocialStream::Models::Object
17
+
18
+ delegate :tag_list, :tag_list=, :tagged_with, :tag_counts, :to => :activity_object
19
+
20
+ validates_presence_of :name, :subject_type
21
+
22
+ acts_as_messageable
23
+
24
+ acts_as_url :name, :url_attribute => :slug
25
+
26
+ has_one :profile, :dependent => :destroy
27
+
28
+ has_many :avatars,
29
+ :validate => true,
30
+ :autosave => true
31
+ has_one :avatar,
32
+ :conditions => { :active => true }
33
+
34
+ has_many :sent_contacts,
35
+ :class_name => 'Contact',
36
+ :foreign_key => 'sender_id',
37
+ :dependent => :destroy
38
+
39
+ has_many :received_contacts,
40
+ :class_name => 'Contact',
41
+ :foreign_key => 'receiver_id',
42
+ :dependent => :destroy
43
+
44
+ has_many :sent_ties,
45
+ :through => :sent_contacts,
46
+ :source => :ties
47
+
48
+ has_many :received_ties,
49
+ :through => :received_contacts,
50
+ :source => :ties
51
+
52
+ has_many :senders,
53
+ :through => :received_contacts,
54
+ :uniq => true
55
+
56
+ has_many :receivers,
57
+ :through => :sent_contacts,
58
+ :uniq => true
59
+
60
+ has_many :relations,
61
+ :dependent => :destroy
62
+
63
+ scope :alphabetic, order('actors.name')
64
+
65
+ scope :letter, lambda { |param|
66
+ if param.present?
67
+ where('actors.name LIKE ?', "#{ param }%")
68
+ end
69
+ }
70
+
71
+ scope :name_search, lambda { |param|
72
+ if param.present?
73
+ where('actors.name LIKE ?', "%#{ param }%")
74
+ end
75
+ }
76
+
77
+ scope :tagged_with, lambda { |param|
78
+ if param.present?
79
+ joins(:activity_object).merge(ActivityObject.tagged_with(param))
80
+ end
81
+ }
82
+
83
+ scope :distinct_initials, select('DISTINCT SUBSTR(actors.name,1,1) as initial').order("initial ASC")
84
+
85
+ scope :contacted_to, lambda { |a|
86
+ joins(:sent_contacts).merge(Contact.active.received_by(a))
87
+ }
88
+
89
+ scope :contacted_from, lambda { |a|
90
+ joins(:received_contacts).merge(Contact.active.sent_by(a))
91
+ }
92
+
93
+ scope :followed_by, lambda { |a|
94
+ select("DISTINCT actors.*").
95
+ joins(:received_ties => { :relation => :permissions }).
96
+ merge(Contact.sent_by(a)).
97
+ merge(Permission.follow)
98
+ }
99
+
100
+ after_create :create_initial_relations
101
+
102
+ after_create :save_or_create_profile
103
+
104
+ class << self
105
+ # Get actor's id from an object, if possible
106
+ def normalize_id(a)
107
+ case a
108
+ when Integer
109
+ a
110
+ when Array
111
+ a.map{ |e| normalize_id(e) }
112
+ else
113
+ Actor.normalize(a).id
114
+ end
115
+ end
116
+ # Get actor from object, if possible
117
+ def normalize(a)
118
+ case a
119
+ when Actor
120
+ a
121
+ when Integer
122
+ Actor.find a
123
+ when Array
124
+ a.map{ |e| Actor.normalize(e) }
125
+ else
126
+ begin
127
+ a.actor
128
+ rescue
129
+ raise "Unable to normalize actor #{ a.inspect }"
130
+ end
131
+ end
132
+ end
133
+
134
+ def find_by_webfinger!(link)
135
+ link =~ /(acct:)?(.*)@/
136
+
137
+ find_by_slug! $2
138
+ end
139
+ end
140
+
141
+ #Returning the email address of the model if an email should be sent for this object (Message or Notification).
142
+ #If the actor is a Group and has no email address, an array with the email of the highest rank members will be
143
+ #returned isntead.
144
+ #
145
+ #If no mail has to be sent, return nil.
146
+ def mailboxer_email(object)
147
+ #If actor has disabled the emails, return nil.
148
+ return nil if !notify_by_email
149
+ #If actor has enabled the emails and has email
150
+ return "#{name} <#{email}>" if email.present?
151
+ #If actor is a Group, has enabled emails but no mail we return the highest_rank ones.
152
+ if (group = self.subject).is_a? Group
153
+ relation = group.relation_customs.sort.first
154
+ receivers = group.contact_actors(:direction => :sent, :relations => relation)
155
+ emails = Array.new
156
+ receivers.each do |receiver|
157
+ receiver_emails = receiver.mailboxer_email(object)
158
+ case receiver_emails
159
+ when String
160
+ emails << receiver_emails
161
+ when Array
162
+ receveir_emails.each do |receveir_email|
163
+ emails << receiver_email
164
+ end
165
+ end
166
+ end
167
+ return emails
168
+ end
169
+ end
170
+
171
+ # The subject instance for this actor
172
+ def subject
173
+ subtype_instance
174
+ end
175
+
176
+ # All the {Relation relations} defined by this {Actor}
177
+ def relation_customs
178
+ relations.where(:type => 'Relation::Custom')
179
+ end
180
+
181
+ # A given relation defined and managed by this actor
182
+ def relation_custom(name)
183
+ relation_customs.find_by_name(name)
184
+ end
185
+
186
+ # The {Relation::Public} for this {Actor}
187
+ def relation_public
188
+ Relation::Public.of(self)
189
+ end
190
+
191
+ # The {Relation::Reject} for this {Actor}
192
+ def relation_reject
193
+ Relation::Reject.of(self)
194
+ end
195
+
196
+ # All the {Actor actors} this one has relation with
197
+ #
198
+ # Options:
199
+ # * type: Filter by the class of the contacts.
200
+ # * direction: sent or received
201
+ # * relations: Restrict the relations of considered ties. Defaults to {Relation::Custom relations of custom type}
202
+ # * include_self: False by default, don't include this actor as subject even they have ties with themselves.
203
+ #
204
+ def contact_actors(options = {})
205
+ subject_types = Array(options[:type] || self.class.subtypes)
206
+ subject_classes = subject_types.map{ |s| s.to_s.classify }
207
+
208
+ as = Actor.select("DISTINCT actors.*").
209
+ where('actors.subject_type' => subject_classes).
210
+ includes(subject_types)
211
+
212
+
213
+ case options[:direction]
214
+ when :sent
215
+ as = as.joins(:received_ties => :relation).merge(Contact.sent_by(self))
216
+ when :received
217
+ as = as.joins(:sent_ties => :relation).merge(Contact.received_by(self))
218
+ else
219
+ raise "contact actors in both directions are not supported yet"
220
+ end
221
+
222
+ if options[:include_self].blank?
223
+ as = as.where("actors.id != ?", self.id)
224
+ end
225
+
226
+ if options[:relations].present?
227
+ as = as.merge(Tie.related_by(options[:relations]))
228
+ else
229
+ as = as.merge(Relation.where(:type => ['Relation::Custom', 'Relation::Public']))
230
+ end
231
+
232
+ as
233
+ end
234
+
235
+ # All the {SocialStream::Models::Subject subjects} that send or receive at least one {Tie} to this {Actor}
236
+ #
237
+ # When passing a block, it will be evaluated for building the actors query, allowing to add
238
+ # options before the mapping to subjects
239
+ #
240
+ # See #contact_actors for options
241
+ def contact_subjects(options = {})
242
+ as = contact_actors(options)
243
+
244
+ if block_given?
245
+ as = yield(as)
246
+ end
247
+
248
+ as.map(&:subject)
249
+ end
250
+
251
+ # Return a contact to subject.
252
+ def contact_to(subject)
253
+ sent_contacts.received_by(subject).first
254
+ end
255
+
256
+ # Return a contact to subject. Create it if it does not exist
257
+ def contact_to!(subject)
258
+ contact_to(subject) ||
259
+ sent_contacts.create!(:receiver => Actor.normalize(subject))
260
+ end
261
+
262
+ # The {Contact} of this {Actor} to self (totally close!)
263
+ def ego_contact
264
+ contact_to!(self)
265
+ end
266
+
267
+ def sent_active_contact_ids
268
+ @sent_active_contact_ids ||=
269
+ load_sent_active_contact_ids
270
+ end
271
+
272
+ # By now, it returns a suggested {Contact} to another {Actor} without any current {Tie}
273
+ #
274
+ # @return [Contact]
275
+ def suggestions(size = 1)
276
+ candidates = Actor.where(Actor.arel_table[:id].not_in(sent_active_contact_ids + [id]))
277
+
278
+ size.times.map {
279
+ candidates.delete_at rand(candidates.size)
280
+ }.compact.map { |a|
281
+ contact_to! a
282
+ }
283
+ end
284
+
285
+ # Set of ties sent by this actor received by subject
286
+ def ties_to(subject)
287
+ sent_ties.merge(Contact.received_by(subject))
288
+ end
289
+
290
+ # Is there any {Tie} sent by this actor and received by subject
291
+ def ties_to?(subject)
292
+ ties_to(subject).present?
293
+ end
294
+
295
+ # The {Tie ties} sent by this actor, plus the second grade ties
296
+ def egocentric_ties
297
+ @egocentric_ties ||=
298
+ load_egocentric_ties
299
+ end
300
+
301
+
302
+ # Can this actor be represented by subject. Does she has permissions for it?
303
+ def represented_by?(subject)
304
+ return false if subject.blank?
305
+
306
+ self.class.normalize(subject) == self ||
307
+ sent_ties.
308
+ merge(Contact.received_by(subject)).
309
+ joins(:relation => :permissions).
310
+ merge(Permission.represent).
311
+ any?
312
+ end
313
+
314
+ # An {Activity} can be shared with multiple {audicences Audience}, which corresponds to a {Relation}.
315
+ #
316
+ # This method returns all the {relations Relation} that this actor can use to broadcast an Activity
317
+ #
318
+ #
319
+ def activity_relations(subject, options = {})
320
+ return relation_customs if Actor.normalize(subject) == self
321
+
322
+ Array.new
323
+ end
324
+
325
+ # Are there any activity_relations present?
326
+ def activity_relations?(*args)
327
+ activity_relations(*args).any?
328
+ end
329
+
330
+ # Is this {Actor} allowed to create a comment on activity?
331
+ #
332
+ # We are allowing comments from everyone signed in by now
333
+ def can_comment?(activity)
334
+ return true
335
+
336
+ comment_relations(activity).any?
337
+ end
338
+
339
+ # Are there any relations that allow this actor to create a comment on activity?
340
+ def comment_relations(activity)
341
+ activity.relations.select{ |r| r.is_a?(Relation::Public) } |
342
+ Relation.allow(self, 'create', 'activity', :in => activity.relations)
343
+ end
344
+
345
+ def pending_contacts_count
346
+ received_contacts.not_reflexive.pending.count
347
+ end
348
+
349
+ def pending_contacts?
350
+ pending_contacts_count > 0
351
+ end
352
+
353
+ # Build a new {Contact} from each that has not inverse
354
+ def pending_contacts
355
+ received_contacts.pending.includes(:inverse).all.map do |c|
356
+ c.inverse ||
357
+ c.receiver.contact_to!(c.sender)
358
+ end
359
+ end
360
+
361
+ # Count the contacts in common between this {Actor} and subject
362
+ def common_contacts_count(subject)
363
+ (sent_active_contact_ids & subject.sent_active_contact_ids).size
364
+ end
365
+
366
+ # The set of {Activity activities} in the wall of this {Actor}.
367
+ #
368
+ # There are two types of walls:
369
+ # home:: includes all the {Activity activities} from this {Actor} and their followed {Actor actors}
370
+ # See {Permission permissions} for more information on the following support
371
+ # profile:: The set of activities in the wall profile of this {Actor}, it includes only the
372
+ # activities from the ties of this actor that can be read by the subject
373
+ #
374
+ # Options:
375
+ # :for:: the subject that is accessing the wall
376
+ # :relation:: show only activities that are attached at this relation level. For example,
377
+ # the wall for members of the group.
378
+ #
379
+ def wall(type, options = {})
380
+ args = {}
381
+
382
+ args[:type] = type
383
+ args[:owner] = self
384
+ # Preserve this options
385
+ [ :for, :object_type ].each do |opt|
386
+ args[opt] = options[opt]
387
+ end
388
+
389
+ if type == :home
390
+ args[:followed] = Actor.followed_by(self).map(&:id)
391
+ end
392
+
393
+ # TODO: this is not scalling for sure. We must use a fact table in the future
394
+ args[:relation_ids] =
395
+ case type
396
+ when :home
397
+ # The relations from followings that can be read
398
+ Relation.allow(self, 'read', 'activity').map(&:id)
399
+ when :profile
400
+ # FIXME: options[:relation]
401
+ #
402
+ # The relations that can be read by options[:for]
403
+ options[:for].present? ?
404
+ Relation.allow(options[:for], 'read', 'activity').map(&:id) :
405
+ []
406
+ else
407
+ raise "Unknown type of wall: #{ type }"
408
+ end
409
+
410
+ Activity.wall args
411
+ end
412
+
413
+ def logo
414
+ avatar!.logo
415
+ end
416
+
417
+ def avatar!
418
+ avatar || avatars.build
419
+ end
420
+
421
+ # The 'like' qualifications emmited to this actor
422
+ def likes
423
+ Activity.joins(:activity_verb).where('activity_verbs.name' => "like").
424
+ joins(:activity_objects).where('activity_objects.id' => activity_object_id)
425
+ end
426
+
427
+ def liked_by(subject) #:nodoc:
428
+ likes.joins(:contact).merge(Contact.sent_by(subject))
429
+ end
430
+
431
+ # Does subject like this {Actor}?
432
+ def liked_by?(subject)
433
+ liked_by(subject).present?
434
+ end
435
+
436
+ # Build a new activity where subject like this
437
+ def new_like(subject)
438
+ a = Activity.new :verb => "like",
439
+ :contact => subject.contact_to!(self),
440
+ :relation_ids => Array(subject.relation_public.id)
441
+
442
+ a.activity_objects << activity_object
443
+
444
+ a
445
+ end
446
+
447
+ # Use slug as parameter
448
+ def to_param
449
+ slug
450
+ end
451
+
452
+ private
453
+
454
+ # After create callback
455
+ def create_initial_relations
456
+ Relation::Custom.defaults_for(self)
457
+ Relation::Public.default_for(self)
458
+ Relation::Reject.default_for(self)
459
+ end
460
+
461
+ # After create callback
462
+ #
463
+ # Save the profile if it is present. Otherwise create it
464
+ def save_or_create_profile
465
+ if profile.present?
466
+ profile.actor_id = id
467
+ profile.save!
468
+ else
469
+ create_profile
470
+ end
471
+ end
472
+
473
+ # Calculate {#egocentric_ties}
474
+ def load_egocentric_ties
475
+ ties = sent_ties.includes(:contact).to_a
476
+
477
+ contact_ids = ties.map{ |t| t.contact.receiver_id }
478
+
479
+ second_grade_ties =
480
+ contact_ids.
481
+ map{ |i| Tie.sent_by(i) }.
482
+ flatten
483
+
484
+ ties + second_grade_ties
485
+ end
486
+
487
+ # Calculate {#sent_active_contact_ids}
488
+ def load_sent_active_contact_ids
489
+ sent_contacts.active.map(&:receiver_id)
490
+ end
491
+ end