social_stream 0.12.14 → 0.13.0

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 (179) hide show
  1. data/base/app/controllers/groups_controller.rb +3 -2
  2. data/base/app/controllers/posts_controller.rb +2 -10
  3. data/base/app/helpers/activities_helper.rb +2 -1
  4. data/base/app/models/activity_object.rb +28 -0
  5. data/base/app/models/actor.rb +10 -0
  6. data/base/app/models/group.rb +7 -3
  7. data/base/app/models/user.rb +7 -2
  8. data/base/app/views/activities/_new.html.erb +0 -1
  9. data/base/app/views/activity_objects/_activity_object.html.erb +3 -3
  10. data/base/app/views/comments/_new.html.erb +2 -3
  11. data/base/app/views/groups/_new.html.erb +0 -3
  12. data/base/app/views/notifications/activities/_like.text.erb +1 -1
  13. data/base/app/views/objects/_new_activity.html.erb +2 -2
  14. data/base/app/views/objects/_show.html.erb +1 -1
  15. data/base/db/migrate/20111124100618_object_actors.rb +50 -0
  16. data/base/lib/social_stream-base.rb +2 -1
  17. data/base/lib/social_stream/ability/base.rb +1 -1
  18. data/base/lib/social_stream/base/version.rb +1 -1
  19. data/base/lib/social_stream/controllers/objects.rb +33 -0
  20. data/base/lib/social_stream/models/object.rb +33 -28
  21. data/base/lib/social_stream/test_helpers/controllers.rb +3 -1
  22. data/base/lib/tasks/db/populate.rake +9 -2
  23. data/base/spec/controllers/comments_controller_spec.rb +9 -6
  24. data/base/spec/controllers/groups_controller_spec.rb +7 -5
  25. data/base/spec/controllers/posts_controller_spec.rb +45 -9
  26. data/base/spec/controllers/users_controller_spec.rb +3 -1
  27. data/base/spec/factories/activity.rb +3 -2
  28. data/base/spec/factories/comment.rb +3 -2
  29. data/base/spec/factories/group.rb +2 -1
  30. data/base/spec/factories/post.rb +5 -4
  31. data/base/spec/models/activity_authorization_spec.rb +5 -4
  32. data/base/spec/models/group_spec.rb +5 -2
  33. data/base/spec/models/post_spec.rb +6 -2
  34. data/documents/app/assets/stylesheets/show.css.scss +4 -0
  35. data/documents/app/controllers/documents_controller.rb +2 -10
  36. data/documents/app/views/audios/_audio_processed.html.erb +1 -1
  37. data/documents/app/views/audios/_audio_processing.html.erb +1 -1
  38. data/documents/app/views/common_documents/_document_info.html.erb +5 -0
  39. data/documents/app/views/documents/_document.html.erb +1 -1
  40. data/documents/app/views/pictures/_picture.html.erb +4 -4
  41. data/documents/app/views/videos/_video_processed.html.erb +1 -1
  42. data/documents/app/views/videos/_video_processing.html.erb +1 -1
  43. data/documents/lib/social_stream/documents/version.rb +1 -1
  44. data/documents/social_stream-documents.gemspec +1 -1
  45. data/documents/spec/factories/document.rb +7 -6
  46. data/documents/spec/factories/picture.rb +7 -6
  47. data/documents/spec/spec_helper.rb +6 -1
  48. data/events/db/migrate/20111102145626_add_more_fields_to_events.rb +0 -4
  49. data/events/db/migrate/20111104182420_add_details_to_events.rb +0 -26
  50. data/events/lib/social_stream/events/version.rb +1 -1
  51. data/events/social_stream-events.gemspec +1 -1
  52. data/lib/social_stream/version.rb +1 -1
  53. data/linkser/.gitignore +14 -0
  54. data/linkser/.rspec +1 -0
  55. data/linkser/Gemfile +5 -0
  56. data/linkser/MIT-LICENSE +20 -0
  57. data/linkser/README.rdoc +6 -0
  58. data/linkser/Rakefile +26 -0
  59. data/{documents/app/views/audios/_mediapreviews.html.erb → linkser/app/assets/javascripts/linkser.js.erb} +0 -0
  60. data/linkser/app/assets/javascripts/social_stream-linkser.js +1 -0
  61. data/linkser/app/assets/stylesheets/linkser.css.scss +1 -0
  62. data/linkser/app/assets/stylesheets/social_stream-linkser.css +3 -0
  63. data/linkser/config/locales/en.yml +3 -0
  64. data/linkser/config/locales/es.yml +3 -0
  65. data/linkser/config/routes.rb +3 -0
  66. data/linkser/lib/generators/social_stream/linkser/install_generator.rb +24 -0
  67. data/linkser/lib/social_stream-linkser.rb +9 -0
  68. data/linkser/lib/social_stream/linkser/engine.rb +7 -0
  69. data/linkser/lib/social_stream/linkser/version.rb +5 -0
  70. data/linkser/lib/social_stream/migrations/linkser.rb +9 -0
  71. data/linkser/social_stream-linkser.gemspec +26 -0
  72. data/linkser/spec/dummy/Rakefile +7 -0
  73. data/linkser/spec/dummy/app/controllers/application_controller.rb +3 -0
  74. data/linkser/spec/dummy/app/helpers/application_helper.rb +2 -0
  75. data/linkser/spec/dummy/app/views/layouts/application.html.erb +14 -0
  76. data/linkser/spec/dummy/config.ru +4 -0
  77. data/linkser/spec/dummy/config/application.rb +45 -0
  78. data/linkser/spec/dummy/config/boot.rb +10 -0
  79. data/linkser/spec/dummy/config/database.yml +22 -0
  80. data/linkser/spec/dummy/config/environment.rb +5 -0
  81. data/linkser/spec/dummy/config/environments/development.rb +25 -0
  82. data/linkser/spec/dummy/config/environments/production.rb +49 -0
  83. data/linkser/spec/dummy/config/environments/test.rb +37 -0
  84. data/linkser/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  85. data/linkser/spec/dummy/config/initializers/devise.rb +176 -0
  86. data/linkser/spec/dummy/config/initializers/inflections.rb +10 -0
  87. data/linkser/spec/dummy/config/initializers/mime_types.rb +5 -0
  88. data/linkser/spec/dummy/config/initializers/secret_token.rb +7 -0
  89. data/linkser/spec/dummy/config/initializers/session_store.rb +8 -0
  90. data/linkser/spec/dummy/config/locales/en.yml +5 -0
  91. data/linkser/spec/dummy/config/navigation.rb +0 -0
  92. data/linkser/spec/dummy/config/relations.yml +39 -0
  93. data/linkser/spec/dummy/config/routes.rb +60 -0
  94. data/linkser/spec/dummy/db/.gitkeep +0 -0
  95. data/linkser/spec/dummy/documents/documents/000/000/001/original.pdf +157 -0
  96. data/linkser/spec/dummy/documents/documents/000/000/002/original.pdf +157 -0
  97. data/linkser/spec/dummy/documents/documents/000/000/003/original.pdf +157 -0
  98. data/linkser/spec/dummy/documents/documents/000/000/004/original.pdf +157 -0
  99. data/linkser/spec/dummy/documents/documents/000/000/005/original.pdf +157 -0
  100. data/linkser/spec/dummy/documents/documents/000/000/006/original.pdf +157 -0
  101. data/linkser/spec/dummy/documents/documents/000/000/007/original.pdf +157 -0
  102. data/linkser/spec/dummy/documents/documents/000/000/008/original.pdf +157 -0
  103. data/linkser/spec/dummy/documents/documents/000/000/009/original.pdf +157 -0
  104. data/linkser/spec/dummy/documents/documents/000/000/010/original.pdf +157 -0
  105. data/linkser/spec/dummy/documents/pictures/000/000/011/original.png +0 -0
  106. data/linkser/spec/dummy/documents/pictures/000/000/011/thumb.png +0 -0
  107. data/linkser/spec/dummy/documents/pictures/000/000/011/thumb0.png +0 -0
  108. data/linkser/spec/dummy/documents/pictures/000/000/012/original.png +0 -0
  109. data/linkser/spec/dummy/documents/pictures/000/000/012/thumb.png +0 -0
  110. data/linkser/spec/dummy/documents/pictures/000/000/012/thumb0.png +0 -0
  111. data/linkser/spec/dummy/documents/pictures/000/000/013/original.png +0 -0
  112. data/linkser/spec/dummy/documents/pictures/000/000/013/thumb.png +0 -0
  113. data/linkser/spec/dummy/documents/pictures/000/000/013/thumb0.png +0 -0
  114. data/linkser/spec/dummy/documents/pictures/000/000/014/original.png +0 -0
  115. data/linkser/spec/dummy/documents/pictures/000/000/014/thumb.png +0 -0
  116. data/linkser/spec/dummy/documents/pictures/000/000/014/thumb0.png +0 -0
  117. data/linkser/spec/dummy/documents/pictures/000/000/015/original.png +0 -0
  118. data/linkser/spec/dummy/documents/pictures/000/000/015/thumb.png +0 -0
  119. data/linkser/spec/dummy/documents/pictures/000/000/015/thumb0.png +0 -0
  120. data/linkser/spec/dummy/documents/pictures/000/000/016/original.png +0 -0
  121. data/linkser/spec/dummy/documents/pictures/000/000/016/thumb.png +0 -0
  122. data/linkser/spec/dummy/documents/pictures/000/000/016/thumb0.png +0 -0
  123. data/linkser/spec/dummy/documents/pictures/000/000/017/original.png +0 -0
  124. data/linkser/spec/dummy/documents/pictures/000/000/017/thumb.png +0 -0
  125. data/linkser/spec/dummy/documents/pictures/000/000/017/thumb0.png +0 -0
  126. data/linkser/spec/dummy/documents/pictures/000/000/018/original.png +0 -0
  127. data/linkser/spec/dummy/documents/pictures/000/000/018/thumb.png +0 -0
  128. data/linkser/spec/dummy/documents/pictures/000/000/018/thumb0.png +0 -0
  129. data/linkser/spec/dummy/documents/pictures/000/000/019/original.png +0 -0
  130. data/linkser/spec/dummy/documents/pictures/000/000/019/thumb.png +0 -0
  131. data/linkser/spec/dummy/documents/pictures/000/000/019/thumb0.png +0 -0
  132. data/linkser/spec/dummy/documents/pictures/000/000/020/original.png +0 -0
  133. data/linkser/spec/dummy/documents/pictures/000/000/020/thumb.png +0 -0
  134. data/linkser/spec/dummy/documents/pictures/000/000/020/thumb0.png +0 -0
  135. data/linkser/spec/dummy/public/404.html +26 -0
  136. data/linkser/spec/dummy/public/422.html +26 -0
  137. data/linkser/spec/dummy/public/500.html +26 -0
  138. data/linkser/spec/dummy/public/favicon.ico +0 -0
  139. data/linkser/spec/dummy/public/javascripts/application.js +2 -0
  140. data/linkser/spec/dummy/public/javascripts/controls.js +965 -0
  141. data/linkser/spec/dummy/public/javascripts/dragdrop.js +974 -0
  142. data/linkser/spec/dummy/public/javascripts/effects.js +1123 -0
  143. data/linkser/spec/dummy/public/javascripts/prototype.js +6001 -0
  144. data/linkser/spec/dummy/public/javascripts/rails.js +191 -0
  145. data/linkser/spec/dummy/public/stylesheets/.gitkeep +0 -0
  146. data/linkser/spec/dummy/script/rails +6 -0
  147. data/linkser/spec/integration/navigation_spec.rb +9 -0
  148. data/linkser/spec/socialstream_linkser_spec.rb +7 -0
  149. data/linkser/spec/spec_helper.rb +48 -0
  150. data/linkser/spec/support/cancan.rb +1 -0
  151. data/linkser/spec/support/db.rb +8 -0
  152. data/linkser/spec/support/devise.rb +4 -0
  153. data/linkser/spec/support/mock.rb +4 -0
  154. data/linkser/vendor/assets/javascripts/jquery.jplayer.js +78 -0
  155. data/linkser/vendor/assets/stylesheets/jplayer.blue.monday.css +448 -0
  156. data/linkser/vendor/assets/stylesheets/jplayer.blue.monday.jpg +0 -0
  157. data/linkser/vendor/assets/stylesheets/jplayer.blue.monday.video.play.hover.png +0 -0
  158. data/linkser/vendor/assets/stylesheets/jplayer.blue.monday.video.play.png +0 -0
  159. data/linkser/vendor/assets/stylesheets/jquery.lightbox.css +101 -0
  160. data/linkser/vendor/assets/stylesheets/pbar-ani.gif +0 -0
  161. data/presence/app/assets/images/status/offline.png +0 -0
  162. data/presence/app/assets/javascripts/chat_interface_manager.js.erb +65 -16
  163. data/presence/app/assets/javascripts/xmpp_client_management.js.erb +13 -3
  164. data/presence/app/controllers/xmpp_controller.rb +2 -5
  165. data/presence/app/views/chat/_contacts.html.erb +10 -9
  166. data/presence/app/views/chat/_settings.html.erb +4 -4
  167. data/presence/app/views/xmpp/active_users.html.erb +10 -10
  168. data/presence/config/locales/en.yml +6 -1
  169. data/presence/config/locales/es.yml +7 -1
  170. data/presence/config/routes.rb +1 -4
  171. data/presence/lib/social_stream/presence/version.rb +1 -1
  172. data/social_stream.gemspec +3 -3
  173. metadata +127 -23
  174. data/documents/app/views/audios/index.js.erb +0 -1
  175. data/documents/app/views/documents/index.js.erb +0 -1
  176. data/documents/app/views/pictures/_mediapreviews.html.erb +0 -8
  177. data/documents/app/views/pictures/index.js.erb +0 -1
  178. data/presence/app/views/xmpp/index.html +0 -18
  179. data/presence/app/views/xmpp/test.html.erb +0 -11
@@ -51,7 +51,8 @@ class GroupsController < InheritedResources::Base
51
51
  private
52
52
 
53
53
  def set_founder
54
- params[:group] ||= {}
55
- params[:group][:_contact_id] ||= current_subject.ego_contact.id
54
+ params[:group] ||= {}
55
+ params[:group][:author_id] ||= current_subject.try(:actor_id)
56
+ params[:group][:user_author_id] ||= current_user.try(:actor_id)
56
57
  end
57
58
  end
@@ -1,11 +1,3 @@
1
- class PostsController < InheritedResources::Base
2
- load_and_authorize_resource
3
-
4
- respond_to :html, :xml, :js
5
-
6
- def destroy
7
- @post_activity = resource.post_activity
8
-
9
- destroy!
10
- end
1
+ class PostsController < ApplicationController
2
+ include SocialStream::Controllers::Objects
11
3
  end
@@ -31,6 +31,7 @@ module ActivitiesHelper
31
31
  def new_post(receiver)
32
32
  return Post.new unless user_signed_in?
33
33
 
34
- Post.new :_contact_id => current_subject.contact_to!(receiver).id
34
+ Post.new :author_id => Actor.normalize_id(current_subject),
35
+ :owner_id => Actor.normalize_id(receiver)
35
36
  end
36
37
  end
@@ -14,9 +14,22 @@ class ActivityObject < ActiveRecord::Base
14
14
 
15
15
  acts_as_taggable
16
16
 
17
+ # Author can be any type of Actor: User, Group, etc.
18
+ belongs_to :author,
19
+ :class_name => "Actor"
20
+ # Owner is the wall's subject this object is posted to
21
+ belongs_to :owner,
22
+ :class_name => "Actor"
23
+
24
+ # UserAuthor is the real user behind the Author
25
+ belongs_to :user_author,
26
+ :class_name => "Actor"
27
+
17
28
  has_many :activity_object_activities, :dependent => :destroy
18
29
  has_many :activities, :through => :activity_object_activities
19
30
 
31
+ validates_presence_of :object_type
32
+
20
33
  # The object of this activity object
21
34
  def object
22
35
  subtype_instance.is_a?(Actor) ?
@@ -24,6 +37,21 @@ class ActivityObject < ActiveRecord::Base
24
37
  subtype_instance
25
38
  end
26
39
 
40
+ # The {SocialStream::Models::Subject subject} author
41
+ def author_subject
42
+ author.subject
43
+ end
44
+
45
+ # The {SocialStream::Models::Subject subject} owner
46
+ def owner_subject
47
+ owner.subject
48
+ end
49
+
50
+ # The {SocialStream::Models::Subject subject} user actor
51
+ def user_author_subject
52
+ user_author.subject
53
+ end
54
+
27
55
  # The activity in which this activity_object was created
28
56
  def post_activity
29
57
  activities.includes(:activity_verb).where('activity_verbs.name' => 'post').first
@@ -58,6 +58,16 @@ class Actor < ActiveRecord::Base
58
58
  has_many :relations,
59
59
  :dependent => :destroy
60
60
 
61
+ has_many :authored_objects,
62
+ :class_name => "ActivityObject",
63
+ :foreign_key => :author_id,
64
+ :dependent => :destroy
65
+
66
+ has_many :owned_objects,
67
+ :class_name => "ActivityObject",
68
+ :foreign_key => :owner_id,
69
+ :dependent => :destroy
70
+
61
71
  scope :alphabetic, order('actors.name')
62
72
 
63
73
  scope :letter, lambda { |param|
@@ -33,13 +33,17 @@ class Group < ActiveRecord::Base
33
33
 
34
34
  # Creates the ties from the founder to the group
35
35
  def create_ties_from_founder
36
- _contact.sender.sent_contacts.create! :receiver_id => actor_id,
37
- :relation_ids => _relation_ids
36
+ author.sent_contacts.create! :receiver_id => actor_id,
37
+ :relation_ids => _relation_ids
38
+
39
+ if represented_author?
40
+ # TODO: create tie with future representation relation
41
+ end
38
42
  end
39
43
 
40
44
  # Creates the ties from the group to the participants
41
45
  def create_ties_to_participants
42
- ([ _contact.sender_id, _contact.receiver_id ] | Array.wrap(@_participants)).uniq.each do |a|
46
+ ([ author_id, user_author_id ].uniq | Array.wrap(@_participants)).uniq.each do |a|
43
47
  sent_contacts.create! :receiver_id => a,
44
48
  :relation_ids => Array(relation_customs.sort.first.id)
45
49
  end
@@ -3,12 +3,17 @@ require 'devise/orm/active_record'
3
3
  class User < ActiveRecord::Base
4
4
  include SocialStream::Models::Subject
5
5
 
6
- has_many :authentications, :dependent => :destroy
7
6
  devise *SocialStream.devise_modules
8
7
 
8
+ has_many :authentications, :dependent => :destroy
9
+
10
+ has_many :user_authored_objects,
11
+ :class_name => "ActivityObject",
12
+ :foreign_key => :user_author_id
13
+
9
14
  # Setup accessible (or protected) attributes for your model
10
15
  attr_accessible :name, :email, :password, :password_confirmation, :remember_me, :profile_attributes
11
-
16
+
12
17
  validates_presence_of :email
13
18
 
14
19
  validates_format_of :email, :with => Devise.email_regexp, :allow_blank => true
@@ -1,4 +1,3 @@
1
-
2
1
  <% if can? :create, new_post(receiver) %>
3
2
  <div id="activities_header" class="content_size">
4
3
  <% SocialStream.activity_forms.each do |element| %>
@@ -1,7 +1,7 @@
1
- <% unless activity_object.object.is_a? Actor or activity_object.object.respond_to? :actor %>
2
- <%= render activity_object.object %>
3
- <% else %>
1
+ <% if activity_object.object.is_a?(Actor) || activity_object.object.class.ancestors.include?(SocialStream::Models::Subject) %>
4
2
  <div class="block">
5
3
  <%= model_with_details activity_object.object %>
6
4
  </div>
5
+ <% else %>
6
+ <%= render activity_object.object %>
7
7
  <% end %>
@@ -9,9 +9,8 @@
9
9
  <%= current_subject.name %>
10
10
  </div>
11
11
  <%= form_for Comment.new(:text => t('comment.input'),
12
- :_contact_id =>
13
- current_subject.contact_to!(activity.receiver).id,
14
- :_activity_parent_id => activity.id
12
+ :owner_id => Actor.normalize_id(activity.receiver),
13
+ :_activity_parent_id => activity.id
15
14
  ),
16
15
  :html => { :class => "new_comment", :id => "new_comment"+dom_id(activity) },
17
16
  :remote => true do |f| %>
@@ -19,9 +19,6 @@
19
19
  <div class="space_center"></div>
20
20
 
21
21
  <%= form_for @group do |f| %>
22
- <% f.object._contact_id ||= current_subject.ego_contact.id %>
23
- <%= f.hidden_field :_contact_id %>
24
-
25
22
  <% if @group.errors.any? %>
26
23
  <div id="notice">
27
24
  <h2><%= pluralize(@group.errors.count, "error") %> prohibited this group from being saved:</h2>
@@ -20,4 +20,4 @@
20
20
  <% end %>
21
21
 
22
22
  <%= raw t('notification.look',
23
- :sender => truncate_name(activity.sender.name)) %>: <%=polymorphic_url(activity.sender.subject)%>
23
+ :sender => truncate_name(activity.sender.name)) %>: <%=polymorphic_url(activity.sender.subject)%>
@@ -1,8 +1,8 @@
1
- <% object._contact_id = current_subject.contact_to!(receiver).id %>
1
+ <% object.owner_id = Actor.normalize_id(receiver) %>
2
2
  <% remote = true if remote.nil? %>
3
3
 
4
4
  <%= form_for object, :remote => remote do |f| %>
5
- <%= f.hidden_field :_contact_id %>
5
+ <%= f.hidden_field :owner_id %>
6
6
 
7
7
  <%= render :partial => object.class.to_s.tableize+'/new_activity_fields' , :locals => {:f => f} %>
8
8
  <% end %>
@@ -1,3 +1,3 @@
1
- <% toolbar :profile => object._owner %>
1
+ <% toolbar :profile => object.owner_subject %>
2
2
 
3
3
  <%= render object.post_activity %>
@@ -0,0 +1,50 @@
1
+ class ObjectActors < ActiveRecord::Migration
2
+ def up
3
+ change_table :activity_objects do |t|
4
+ t.integer :author_id
5
+ t.integer :owner_id
6
+ t.integer :user_author_id
7
+ end
8
+
9
+ add_index "activity_objects", "author_id"
10
+ add_index "activity_objects", "owner_id"
11
+ add_index "activity_objects", "user_author_id"
12
+
13
+ add_foreign_key "activity_objects", "actors", :name => "index_activity_objects_on_author_id", :column => :author_id
14
+ add_foreign_key "activity_objects", "actors", :name => "index_activity_objects_on_owner_id", :column => :owner_id
15
+ add_foreign_key "activity_objects", "actors", :name => "index_activity_objects_on_user_author_id", :column => :user_author_id
16
+
17
+ ActivityObject.record_timestamps = false
18
+
19
+ ActivityObject.all.each do |a|
20
+ if a.object_type == "Actor"
21
+ next if a.object.is_a? User
22
+
23
+ author = user_author = a.object.sent_ties.order(:created_at).first.receiver
24
+
25
+ until user_author.subject_type == "User"
26
+ user_author = user_author.sent_ties.order(:created_at).first.receiver
27
+ end
28
+
29
+ a.author = author
30
+ a.user_author = user_author
31
+ else
32
+ a.author = a.post_activity.sender
33
+ a.owner = a.post_activity.receiver
34
+ a.user_author = (a.author.is_a?(User) ? a.author : a.author.sent_ties.order(:created_at).first.receiver)
35
+ end
36
+
37
+ a.save!
38
+ end
39
+ end
40
+
41
+ def down
42
+ remove_foreign_key "activity_objects", :name => "index_activity_objects_on_author_id"
43
+ remove_foreign_key "activity_objects", :name => "index_activity_objects_on_owner_id"
44
+ remove_foreign_key "activity_objects", :name => "index_activity_objects_on_user_author_id"
45
+
46
+ remove_column :activity_objects, :author_id
47
+ remove_column :activity_objects, :owner_id
48
+ remove_column :activity_objects, :user_author_id
49
+ end
50
+ end
@@ -51,8 +51,9 @@ module SocialStream
51
51
  autoload :TestHelpers, 'social_stream/test_helpers'
52
52
 
53
53
  module Controllers
54
- autoload :Helpers, 'social_stream/controllers/helpers'
55
54
  autoload :CancanDeviseIntegration, 'social_stream/controllers/cancan_devise_integration'
55
+ autoload :Helpers, 'social_stream/controllers/helpers'
56
+ autoload :Objects, 'social_stream/controllers/objects'
56
57
  end
57
58
 
58
59
  module Models
@@ -75,7 +75,7 @@ module SocialStream
75
75
 
76
76
  can :create, Group do |g|
77
77
  subject.present? &&
78
- g._contact.sender_id == Actor.normalize_id(subject)
78
+ g.author_id == Actor.normalize_id(subject)
79
79
  end
80
80
 
81
81
  can :update, Group do |g|
@@ -1,5 +1,5 @@
1
1
  module SocialStream
2
2
  module Base
3
- VERSION = "0.9.36".freeze
3
+ VERSION = "0.10.0".freeze
4
4
  end
5
5
  end
@@ -0,0 +1,33 @@
1
+ module SocialStream
2
+ module Controllers
3
+ module Objects
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ inherit_resources
8
+
9
+ before_filter :set_author_ids, :only => [ :new, :create, :update ]
10
+
11
+ load_and_authorize_resource :except => :index
12
+
13
+ respond_to :html, :js
14
+ end
15
+
16
+ module InstanceMethods
17
+
18
+ def destroy
19
+ @post_activity = resource.post_activity
20
+
21
+ destroy!
22
+ end
23
+
24
+ protected
25
+
26
+ def set_author_ids
27
+ resource_params.first[:author_id] = current_subject.try(:actor_id)
28
+ resource_params.first[:user_author_id] = current_user.try(:actor_id)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -7,23 +7,20 @@ module SocialStream
7
7
  extend ActiveSupport::Concern
8
8
 
9
9
  included do
10
- attr_accessor :_contact_id
11
10
  attr_writer :_relation_ids
12
11
  attr_accessor :_activity_parent_id
13
12
 
14
- belongs_to :activity_object, :dependent => :destroy, :autosave => true
15
- has_many :activity_object_activities, :through => :activity_object
13
+ belongs_to :activity_object,
14
+ :validate => true,
15
+ :autosave => true,
16
+ :dependent => :destroy
16
17
 
17
- delegate :post_activity,
18
- :like_count,
19
- :tag_list, :tag_list=,
20
- :tagged_with, :tag_counts,
21
- :to => :activity_object!
18
+ has_many :activity_object_activities, :through => :activity_object
22
19
 
23
- before_create :create_activity_object_with_type
20
+ # before_create :create_activity_object_with_type
24
21
 
25
22
  unless self == Actor
26
- validates_presence_of :_contact_id, :on => :create
23
+ validates_presence_of :author_id, :owner_id, :user_author_id
27
24
 
28
25
  after_create :create_post_activity
29
26
  after_update :create_update_activity
@@ -35,6 +32,27 @@ module SocialStream
35
32
  activity_object || build_activity_object(:object_type => self.class.to_s)
36
33
  end
37
34
 
35
+ # Delegate missing methods to {ActivityObject}, if they exist there
36
+ def method_missing(method, *args, &block)
37
+ super
38
+ rescue NameError => object_error
39
+ # These methods must be raised to avoid loops (the :activity_object association calls here again)
40
+ exceptions = [ :_activity_object_id ]
41
+ raise object_error if exceptions.include?(method)
42
+
43
+ activity_object!.__send__ method, *args, &block
44
+ end
45
+
46
+ # {ActivityObject} handles some methods
47
+ def respond_to? *args
48
+ super || activity_object!.respond_to?(*args)
49
+ end
50
+
51
+ # Was the author represented with this {SocialStream::Models::Object object} was created?
52
+ def represented_author?
53
+ author_id == user_author_id
54
+ end
55
+
38
56
  # All the activities with this object
39
57
  def activities
40
58
  Activity.
@@ -42,13 +60,6 @@ module SocialStream
42
60
  where("#{ self.class.quoted_table_name }.id" => self.id)
43
61
  end
44
62
 
45
- # The activity in which this object was posted
46
- #
47
- # FIXME: Currently it only supports direct objects
48
- def post_activity
49
- (activities.includes(:activity_verb) & ActivityVerb.verb_name('post')).first
50
- end
51
-
52
63
  # Build the post activity when this object is not saved
53
64
  def build_post_activity
54
65
  Activity.new :contact_id => _contact_id,
@@ -65,7 +76,11 @@ module SocialStream
65
76
  end
66
77
 
67
78
  def _contact
68
- @_contact ||= Contact.find(_contact_id)
79
+ @_contact ||= author && owner && author.contact_to!(owner)
80
+ end
81
+
82
+ def _contact_id
83
+ _contact.try(:id)
69
84
  end
70
85
 
71
86
  def _relation_ids
@@ -90,16 +105,6 @@ module SocialStream
90
105
  @_activity_parent ||= Activity.find(_activity_parent_id)
91
106
  end
92
107
 
93
- # The {SocialStream::Models::Subject subject} that posted this object
94
- def _author
95
- post_activity.contact.sender_subject
96
- end
97
-
98
- # The owner of the wall where {#_author} posted this object
99
- def _owner
100
- post_activity.contact.receiver_subject
101
- end
102
-
103
108
  private
104
109
 
105
110
  def create_post_activity
@@ -33,7 +33,9 @@ module SocialStream
33
33
  end
34
34
 
35
35
  def model_assigned_to contact, relation_ids
36
- model_attributes[:_contact_id] = contact.id
36
+ model_attributes[:author_id] = contact.sender.id
37
+ model_attributes[:owner_id] = contact.receiver.id
38
+ model_attributes[:user_author_id] = contact.sender.id
37
39
  model_attributes[:_relation_ids] = Array(relation_ids).map(&:id)
38
40
  end
39
41
 
@@ -91,7 +91,8 @@ namespace :db do
91
91
 
92
92
  Group.create! :name => Forgery::Name.company_name,
93
93
  :email => Forgery::Internet.email_address,
94
- :_contact_id => founder.ego_contact.id
94
+ :author_id => founder.id,
95
+ :user_author_id => founder.id
95
96
  end
96
97
 
97
98
  set_tags(Group)
@@ -128,11 +129,17 @@ namespace :db do
128
129
  SocialStream::Populate.power_law(Tie.all) do |t|
129
130
  updated = Time.at(rand(Time.now.to_i))
130
131
 
132
+ author = t.sender
133
+ owner = t.receiver
134
+ user_author = ( t.sender.subject_type == "User" ? t.sender : t.sender.user_author )
135
+
131
136
  p = Post.create :text =>
132
137
  "This post should be for #{ t.relation.name } of #{ t.sender.name }.\n#{ Forgery::LoremIpsum.paragraph(:random => true) }",
133
138
  :created_at => Time.at(rand(updated.to_i)),
134
139
  :updated_at => updated,
135
- :_contact_id => t.contact_id,
140
+ :author_id => author.id,
141
+ :owner_id => owner.id,
142
+ :user_author_id => user_author.id,
136
143
  :_relation_ids => Array(t.relation_id)
137
144
 
138
145
  p.post_activity.update_attributes(:created_at => p.created_at,