social_stream 0.26.2 → 0.27.0
Sign up to get free protection for your applications and to get access to all the features.
- data/base/app/assets/images/btn/public.png +0 -0
- data/base/app/assets/images/btn/restricted.png +0 -0
- data/base/app/assets/javascripts/social_stream.timeline.js +2 -0
- data/base/app/assets/javascripts/social_stream.wall.js.erb +10 -1
- data/base/app/assets/stylesheets/activities.css.scss.erb +13 -2
- data/base/app/assets/stylesheets/base.css.scss +1 -1
- data/base/app/controllers/audience_controller.rb +16 -0
- data/base/app/models/activity.rb +111 -39
- data/base/app/models/activity_object.rb +1 -9
- data/base/app/models/actor.rb +42 -53
- data/base/app/models/contact.rb +0 -21
- data/base/app/models/tie.rb +1 -1
- data/base/app/views/activities/_new.html.erb +2 -2
- data/base/app/views/activities/_options.html.erb +7 -1
- data/base/app/views/audience/_list.html.erb +8 -0
- data/base/app/views/audience/index.js.erb +1 -0
- data/base/config/locales/en.yml +1 -0
- data/base/config/locales/es.yml +1 -0
- data/base/config/routes.rb +2 -0
- data/base/db/migrate/20120526171311_remove_activity_channels.rb +35 -0
- data/base/lib/social_stream-base.rb +0 -1
- data/base/lib/social_stream/ability/base.rb +3 -1
- data/base/lib/social_stream/base/engine.rb +0 -1
- data/base/lib/social_stream/base/version.rb +1 -1
- data/base/lib/tasks/db/populate.rake +6 -4
- data/base/spec/controllers/audience_controller_spec.rb +40 -0
- data/base/spec/controllers/comments_controller_spec.rb +3 -3
- data/base/spec/factories/activity.rb +12 -6
- data/base/spec/models/tie_spec.rb +7 -4
- data/documents/lib/social_stream/documents/version.rb +1 -1
- data/documents/social_stream-documents.gemspec +1 -1
- data/events/app/assets/stylesheets/events.css.scss +3 -8
- data/events/app/views/events/_event.html.erb +5 -2
- data/events/config/locales/en.yml +1 -0
- data/events/config/locales/es.yml +1 -0
- data/events/lib/social_stream/events/version.rb +1 -1
- data/events/social_stream-events.gemspec +1 -1
- data/lib/social_stream/version.rb +1 -1
- data/linkser/lib/social_stream/linkser/version.rb +1 -1
- data/linkser/social_stream-linkser.gemspec +1 -1
- data/presence/lib/social_stream/presence/version.rb +1 -1
- data/presence/social_stream-presence.gemspec +1 -1
- data/social_stream.gemspec +5 -5
- metadata +19 -15
- data/base/app/assets/images/btn/btn_security.png +0 -0
- data/base/app/models/channel.rb +0 -64
- data/base/lib/social_stream/models/channeled.rb +0 -56
Binary file
|
Binary file
|
@@ -38,6 +38,12 @@ SocialStream.Wall = (function(SS, $, undefined){
|
|
38
38
|
});
|
39
39
|
}
|
40
40
|
|
41
|
+
var changeSecurityImage = function(type) {
|
42
|
+
$('#security_chzn .chzn-choices').
|
43
|
+
css('background-image', 'url(<%= asset_path('btn/') %>' + type + '.png)');
|
44
|
+
}
|
45
|
+
|
46
|
+
|
41
47
|
var initSecuritySelect = function(){
|
42
48
|
var default_security_width = '100px';
|
43
49
|
|
@@ -63,6 +69,9 @@ SocialStream.Wall = (function(SS, $, undefined){
|
|
63
69
|
chosen.results_update_field();
|
64
70
|
}
|
65
71
|
}
|
72
|
+
changeSecurityImage('public');
|
73
|
+
} else {
|
74
|
+
changeSecurityImage('restricted');
|
66
75
|
}
|
67
76
|
});
|
68
77
|
|
@@ -145,6 +154,6 @@ SocialStream.Wall = (function(SS, $, undefined){
|
|
145
154
|
addInitCallback: addInitCallback,
|
146
155
|
init: init,
|
147
156
|
activateAntiRebounds: activateAntiRebounds,
|
148
|
-
unblockForms: unblockForms
|
157
|
+
unblockForms: unblockForms
|
149
158
|
};
|
150
159
|
}) (SocialStream, jQuery)
|
@@ -27,7 +27,7 @@
|
|
27
27
|
|
28
28
|
#security_chzn .chzn-choices {
|
29
29
|
padding-left: 20px;
|
30
|
-
background: url('btn/
|
30
|
+
background: url('btn/restricted.png') no-repeat 10px center;
|
31
31
|
}
|
32
32
|
/******************* WALL - ACTIVITY ***************/
|
33
33
|
.super_activity{width: 95%;}
|
@@ -55,7 +55,6 @@
|
|
55
55
|
|
56
56
|
.security, .post_time_ago, .verb_comment, .verb_like, .verb_comment, .verb_delete{ display: inline-block;}
|
57
57
|
|
58
|
-
|
59
58
|
/************* ACTIVITY - FOOTER *********/
|
60
59
|
.space_comments { padding-top: 1px; padding-bottom: 1px;}
|
61
60
|
.space_activities { text-align:center; padding: 0px 0px 0px 1px; width:100%;}
|
@@ -88,3 +87,15 @@
|
|
88
87
|
.input_new_comments_container{min-height: 30px; position: relative; }
|
89
88
|
|
90
89
|
.activity_likes{ margin-bottom: 2px; }
|
90
|
+
|
91
|
+
.timeline-130 {
|
92
|
+
width: 130px;
|
93
|
+
margin: 10px;
|
94
|
+
float: left;
|
95
|
+
}
|
96
|
+
|
97
|
+
.audience_logo {
|
98
|
+
padding: 2px;
|
99
|
+
display: inline-block;
|
100
|
+
}
|
101
|
+
|
@@ -137,7 +137,7 @@ div.chzn-container ul.chzn-choices li.search-field input{ cursor:pointer;}
|
|
137
137
|
|
138
138
|
/*************MENU ICON SECTION**********/
|
139
139
|
.menu_header{ border-bottom: thin solid $separation-color; width:14.5em; padding-left:3px; padding-right:3px;}
|
140
|
-
.menu_icon{ vertical-align: middle; padding-bottom: 3px; padding-right:
|
140
|
+
.menu_icon{ vertical-align: middle; padding-bottom: 3px; padding-right: 2px; padding-left: 2px;
|
141
141
|
display: inline-block;}
|
142
142
|
|
143
143
|
/*************SPACES SECTION *************/
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class AudienceController < ApplicationController
|
2
|
+
before_filter :read_activity
|
3
|
+
|
4
|
+
respond_to :js
|
5
|
+
|
6
|
+
def index
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def read_activity
|
12
|
+
@activity = Activity.find params[:activity_id]
|
13
|
+
|
14
|
+
authorize! :read, @activity
|
15
|
+
end
|
16
|
+
end
|
data/base/app/models/activity.rb
CHANGED
@@ -1,21 +1,32 @@
|
|
1
1
|
# Activities follow the {Activity Streams}[http://activitystrea.ms/] standard.
|
2
2
|
#
|
3
|
-
#
|
4
|
-
# Every activity is attached to a {Channel}, which defines the sender and the receiver of the {Activity}
|
3
|
+
# Every {Activity} has an {#author}, {#user_author} and {#owner}
|
5
4
|
#
|
6
|
-
#
|
7
|
-
#
|
5
|
+
# author:: Is the {SocialStream::Models::Subject subject} that originated
|
6
|
+
# the activity. The entity that posted something, liked, etc..
|
8
7
|
#
|
9
|
-
#
|
10
|
-
#
|
8
|
+
# user_author:: The {User} logged in when the {Activity} was created.
|
9
|
+
# If the {User} has not changed the session to represent
|
10
|
+
# other entity (a {Group} for example), the user_author
|
11
|
+
# will be the same as the author.
|
11
12
|
#
|
12
|
-
#
|
13
|
+
# owner:: The {SocialStream::Models::Subject subject} whose wall was posted
|
14
|
+
# or comment was liked, etc..
|
15
|
+
#
|
16
|
+
# == {Audience Audiences} and visibility
|
17
|
+
# Each activity is attached to one or more {Relation relations}, which define
|
18
|
+
# the {SocialStream::Models::Subject subject} that can reach the activity
|
19
|
+
#
|
20
|
+
# In the case of a {Relation::Public public relation} everyone will be
|
21
|
+
# able to see the activity.
|
22
|
+
#
|
23
|
+
# In the case of {Relation::Custom custom relations}, only the subjects
|
24
|
+
# that have a {Tie} with that relation (in other words, the contacts that
|
25
|
+
# have been added as friends with that relation} will be able to reach the {Activity}
|
13
26
|
#
|
14
|
-
include NotificationsHelper
|
15
|
-
|
16
27
|
class Activity < ActiveRecord::Base
|
17
|
-
#
|
18
|
-
|
28
|
+
# FIXME: this does not follow the Rails way
|
29
|
+
include NotificationsHelper
|
19
30
|
|
20
31
|
# This has to be declared before 'has_ancestry' to work around rails issue #670
|
21
32
|
# See: https://github.com/rails/rails/issues/670
|
@@ -27,6 +38,13 @@ class Activity < ActiveRecord::Base
|
|
27
38
|
|
28
39
|
belongs_to :activity_verb
|
29
40
|
|
41
|
+
belongs_to :author,
|
42
|
+
:class_name => "Actor"
|
43
|
+
belongs_to :owner,
|
44
|
+
:class_name => "Actor"
|
45
|
+
belongs_to :user_author,
|
46
|
+
:class_name => "Actor"
|
47
|
+
|
30
48
|
has_many :audiences, :dependent => :destroy
|
31
49
|
has_many :relations, :through => :audiences
|
32
50
|
|
@@ -35,10 +53,26 @@ class Activity < ActiveRecord::Base
|
|
35
53
|
has_many :activity_objects,
|
36
54
|
:through => :activity_object_activities
|
37
55
|
|
56
|
+
scope :authored_by, lambda { |subject|
|
57
|
+
where(:author_id => Actor.normalize_id(subject))
|
58
|
+
}
|
59
|
+
scope :owned_by, lambda { |subject|
|
60
|
+
where(:owner_id => Actor.normalize_id(subject))
|
61
|
+
}
|
62
|
+
scope :authored_or_owned_by, lambda { |subjects|
|
63
|
+
ids = Actor.normalize_id(subjects)
|
64
|
+
|
65
|
+
where(arel_table[:author_id].in(ids).or(arel_table[:owner_id].in(ids)))
|
66
|
+
}
|
67
|
+
|
68
|
+
scope :shared_with, lambda { |subject|
|
69
|
+
joins(:audiences).
|
70
|
+
merge(Audience.where(:relation_id => Relation.ids_shared_with(subject)))
|
71
|
+
}
|
72
|
+
|
38
73
|
scope :wall, lambda { |args|
|
39
74
|
q =
|
40
75
|
select("DISTINCT activities.*").
|
41
|
-
joins(:channel).
|
42
76
|
joins(:audiences).
|
43
77
|
joins(:relations).
|
44
78
|
roots
|
@@ -48,14 +82,13 @@ class Activity < ActiveRecord::Base
|
|
48
82
|
where('activity_objects.object_type' => args[:object_type])
|
49
83
|
end
|
50
84
|
|
51
|
-
channels = Channel.arel_table
|
52
85
|
audiences = Audience.arel_table
|
53
86
|
relations = Relation.arel_table
|
54
87
|
|
55
88
|
owner_conditions =
|
56
|
-
|
57
|
-
or(
|
58
|
-
or(
|
89
|
+
arel_table[:author_id].eq(Actor.normalize_id(args[:owner])).
|
90
|
+
or(arel_table[:user_author_id].eq(Actor.normalize_id(args[:owner]))).
|
91
|
+
or(arel_table[:owner_id].eq(Actor.normalize_id(args[:owner])))
|
59
92
|
|
60
93
|
audience_conditions =
|
61
94
|
audiences[:relation_id].in(args[:relation_ids]).
|
@@ -65,16 +98,16 @@ class Activity < ActiveRecord::Base
|
|
65
98
|
case args[:type]
|
66
99
|
when :home
|
67
100
|
followed_conditions =
|
68
|
-
|
69
|
-
or(
|
101
|
+
arel_table[:author_id].in(args[:followed]).
|
102
|
+
or(arel_table[:owner_id].in(args[:followed]))
|
70
103
|
|
71
104
|
owner_conditions.
|
72
105
|
or(followed_conditions.and(audience_conditions))
|
73
106
|
when :profile
|
74
107
|
if args[:for].present?
|
75
108
|
visitor_conditions =
|
76
|
-
|
77
|
-
or(
|
109
|
+
arel_table[:author_id].eq(Actor.normalize_id(args[:for])).
|
110
|
+
or(arel_table[:owner_id].eq(Actor.normalize_id(args[:for])))
|
78
111
|
|
79
112
|
owner_conditions.
|
80
113
|
and(visitor_conditions.or(audience_conditions))
|
@@ -93,7 +126,7 @@ class Activity < ActiveRecord::Base
|
|
93
126
|
after_create :increment_like_count
|
94
127
|
after_destroy :decrement_like_count, :delete_notifications
|
95
128
|
|
96
|
-
validates_presence_of :relations
|
129
|
+
validates_presence_of :author_id, :user_author_id, :owner_id, :relations
|
97
130
|
|
98
131
|
#For now, it should be the last one
|
99
132
|
#FIXME
|
@@ -109,12 +142,37 @@ class Activity < ActiveRecord::Base
|
|
109
142
|
self.activity_verb = ActivityVerb[name]
|
110
143
|
end
|
111
144
|
|
145
|
+
# The {SocialStream::Models::Subject subject} author
|
146
|
+
def author_subject
|
147
|
+
author.subject
|
148
|
+
end
|
149
|
+
|
150
|
+
# The {SocialStream::Models::Subject subject} owner
|
151
|
+
def owner_subject
|
152
|
+
owner.subject
|
153
|
+
end
|
154
|
+
|
155
|
+
# The {SocialStream::Models::Subject subject} user actor
|
156
|
+
def user_author_subject
|
157
|
+
user_author.subject
|
158
|
+
end
|
159
|
+
|
160
|
+
# Does this {Activity} have the same sender and receiver?
|
161
|
+
def reflexive?
|
162
|
+
author_id == owner_id
|
163
|
+
end
|
164
|
+
|
165
|
+
# Is the author represented in this {Activity}?
|
166
|
+
def represented_author?
|
167
|
+
author_id != user_author_id
|
168
|
+
end
|
169
|
+
|
112
170
|
# The {Actor} author of this activity
|
113
171
|
#
|
114
172
|
# This method provides the {Actor}. Use {#sender_subject} for the {SocialStream::Models::Subject Subject}
|
115
173
|
# ({User}, {Group}, etc..)
|
116
174
|
def sender
|
117
|
-
|
175
|
+
author
|
118
176
|
end
|
119
177
|
|
120
178
|
# The {SocialStream::Models::Subject Subject} author of this activity
|
@@ -122,7 +180,7 @@ class Activity < ActiveRecord::Base
|
|
122
180
|
# This method provides the {SocialStream::Models::Subject Subject} ({User}, {Group}, etc...).
|
123
181
|
# Use {#sender} for the {Actor}.
|
124
182
|
def sender_subject
|
125
|
-
|
183
|
+
author_subject
|
126
184
|
end
|
127
185
|
|
128
186
|
# The wall where the activity is shown belongs to receiver
|
@@ -130,7 +188,7 @@ class Activity < ActiveRecord::Base
|
|
130
188
|
# This method provides the {Actor}. Use {#receiver_subject} for the {SocialStream::Models::Subject Subject}
|
131
189
|
# ({User}, {Group}, etc..)
|
132
190
|
def receiver
|
133
|
-
|
191
|
+
owner
|
134
192
|
end
|
135
193
|
|
136
194
|
# The wall where the activity is shown belongs to the receiver
|
@@ -138,7 +196,7 @@ class Activity < ActiveRecord::Base
|
|
138
196
|
# This method provides the {SocialStream::Models::Subject Subject} ({User}, {Group}, etc...).
|
139
197
|
# Use {#receiver} for the {Actor}.
|
140
198
|
def receiver_subject
|
141
|
-
|
199
|
+
owner_subject
|
142
200
|
end
|
143
201
|
|
144
202
|
# The comments about this activity
|
@@ -152,7 +210,7 @@ class Activity < ActiveRecord::Base
|
|
152
210
|
end
|
153
211
|
|
154
212
|
def liked_by(user) #:nodoc:
|
155
|
-
likes.
|
213
|
+
likes.authored_by(user)
|
156
214
|
end
|
157
215
|
|
158
216
|
# Does user like this activity?
|
@@ -162,12 +220,11 @@ class Activity < ActiveRecord::Base
|
|
162
220
|
|
163
221
|
# Build a new children activity where subject like this
|
164
222
|
def new_like(subject, user)
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
:
|
170
|
-
:relation_ids => self.relation_ids
|
223
|
+
a = children.new :verb => "like",
|
224
|
+
:author_id => Actor.normalize_id(subject),
|
225
|
+
:user_author_id => Actor.normalize_id(user),
|
226
|
+
:owner_id => owner_id,
|
227
|
+
:relation_ids => self.relation_ids
|
171
228
|
|
172
229
|
if direct_activity_object.present?
|
173
230
|
a.activity_objects << direct_activity_object
|
@@ -218,7 +275,7 @@ class Activity < ActiveRecord::Base
|
|
218
275
|
participants.each do |p|
|
219
276
|
p.notify(notification_subject, "Youre not supposed to see this", self) unless p == sender
|
220
277
|
end
|
221
|
-
elsif ['like','follow','make-friend','post','update'].include? verb and !
|
278
|
+
elsif ['like','follow','make-friend','post','update'].include? verb and !reflexive?
|
222
279
|
receiver.notify(notification_subject, "Youre not supposed to see this", self)
|
223
280
|
end
|
224
281
|
true
|
@@ -241,15 +298,15 @@ class Activity < ActiveRecord::Base
|
|
241
298
|
|
242
299
|
# Is subject allowed to perform action on this {Activity}?
|
243
300
|
def allow?(subject, action)
|
244
|
-
return false if
|
301
|
+
return false if author.blank?
|
245
302
|
|
246
303
|
case action
|
247
304
|
when 'create'
|
248
|
-
return false if subject.blank? ||
|
305
|
+
return false if subject.blank? || author_id != Actor.normalize_id(subject)
|
249
306
|
|
250
307
|
rels = Relation.normalize(relation_ids)
|
251
308
|
|
252
|
-
own_rels = rels.select{ |r| r.actor_id ==
|
309
|
+
own_rels = rels.select{ |r| r.actor_id == author_id }
|
253
310
|
# Consider Relation::Single as own_relations
|
254
311
|
own_rels += rels.select{ |r| r.is_a?(Relation::Single) }
|
255
312
|
|
@@ -268,12 +325,12 @@ class Activity < ActiveRecord::Base
|
|
268
325
|
|
269
326
|
return false if subject.blank?
|
270
327
|
|
271
|
-
return true if [
|
328
|
+
return true if [author_id, owner_id].include?(Actor.normalize_id(subject))
|
272
329
|
when 'update'
|
273
|
-
return true if [
|
330
|
+
return true if [author_id, owner_id].include?(Actor.normalize_id(subject))
|
274
331
|
when 'destroy'
|
275
332
|
# We only allow destroying to sender and receiver by now
|
276
|
-
return [
|
333
|
+
return [author_id, owner_id].include?(Actor.normalize_id(subject))
|
277
334
|
end
|
278
335
|
|
279
336
|
Relation.
|
@@ -298,6 +355,21 @@ class Activity < ActiveRecord::Base
|
|
298
355
|
allow?(subject, 'update')
|
299
356
|
end
|
300
357
|
|
358
|
+
# Is this activity public?
|
359
|
+
def public?
|
360
|
+
relation_ids.include? Relation::Public.instance.id
|
361
|
+
end
|
362
|
+
|
363
|
+
# The {Actor Actors} this activity is shared with
|
364
|
+
def audience
|
365
|
+
raise "Cannot get the audience of a public activity!" if public?
|
366
|
+
|
367
|
+
[ author, user_author, owner ].uniq |
|
368
|
+
Actor.
|
369
|
+
joins(:received_ties).
|
370
|
+
merge(Tie.where(:relation_id => relation_ids))
|
371
|
+
end
|
372
|
+
|
301
373
|
# The {Relation} with which activity is shared
|
302
374
|
def audience_in_words(subject, options = {})
|
303
375
|
options[:details] ||= :full
|
@@ -217,15 +217,7 @@ class ActivityObject < ActiveRecord::Base
|
|
217
217
|
|
218
218
|
@valid_relations = true
|
219
219
|
|
220
|
-
self.relation_ids =
|
221
|
-
if SocialStream.relation_model == :custom
|
222
|
-
owner.
|
223
|
-
relations.
|
224
|
-
allowing('read', 'activity').
|
225
|
-
map(&:id)
|
226
|
-
else
|
227
|
-
Array.wrap Relation::Public.instance.id
|
228
|
-
end
|
220
|
+
self.relation_ids = owner.activity_relation_ids
|
229
221
|
end
|
230
222
|
|
231
223
|
# validate method
|
data/base/app/models/actor.rb
CHANGED
@@ -73,16 +73,6 @@ class Actor < ActiveRecord::Base
|
|
73
73
|
has_many :relations,
|
74
74
|
:dependent => :destroy
|
75
75
|
|
76
|
-
has_many :authored_channels,
|
77
|
-
:class_name => "Channel",
|
78
|
-
:foreign_key => :author_id,
|
79
|
-
:dependent => :destroy
|
80
|
-
|
81
|
-
has_many :owned_channels,
|
82
|
-
:class_name => "Channel",
|
83
|
-
:foreign_key => :owner_id,
|
84
|
-
:dependent => :destroy
|
85
|
-
|
86
76
|
has_many :sent_actions,
|
87
77
|
:class_name => "ActivityAction",
|
88
78
|
:dependent => :destroy
|
@@ -328,11 +318,6 @@ class Actor < ActiveRecord::Base
|
|
328
318
|
ties_to(subject).with_permissions(action, object).any?
|
329
319
|
end
|
330
320
|
|
331
|
-
# The {Channel} of this {Actor} to self (totally close!)
|
332
|
-
def self_channel
|
333
|
-
Channel.find_or_create_by_author_id_and_user_author_id_and_owner_id id, id, id
|
334
|
-
end
|
335
|
-
|
336
321
|
# Return the {ActivityAction} model to an {ActivityObject}
|
337
322
|
def action_to(activity_object)
|
338
323
|
sent_actions.received_by(activity_object).first
|
@@ -391,12 +376,26 @@ class Actor < ActiveRecord::Base
|
|
391
376
|
any?
|
392
377
|
end
|
393
378
|
|
394
|
-
#
|
395
|
-
#
|
396
|
-
|
379
|
+
# The default {Relation Relations} for sharing an {Activity} owned
|
380
|
+
# by this {Actor}
|
381
|
+
def activity_relations
|
382
|
+
SocialStream.relation_model == :custom ?
|
383
|
+
relations.
|
384
|
+
allowing('read', 'activity') :
|
385
|
+
[ Relation::Public.instance ]
|
386
|
+
end
|
387
|
+
|
388
|
+
# The ids of the default {Relation Relations} for sharing an {Activity}
|
389
|
+
# owned by this {Actor}
|
390
|
+
def activity_relation_ids
|
391
|
+
activity_relations.map(&:id)
|
392
|
+
end
|
393
|
+
|
394
|
+
# This method returns all the {relations Relation} that subject can choose to broadcast an Activity in this {Actor}'s wall
|
397
395
|
#
|
396
|
+
# See {Activity} on how they can be shared with multiple {audicences Audience}, which corresponds to a {Relation}.
|
398
397
|
#
|
399
|
-
def
|
398
|
+
def activity_relations_for(subject, options = {})
|
400
399
|
if Actor.normalize(subject) == self
|
401
400
|
return relation_customs + Array.wrap(Relation::Public.instance)
|
402
401
|
else
|
@@ -404,9 +403,9 @@ class Actor < ActiveRecord::Base
|
|
404
403
|
end
|
405
404
|
end
|
406
405
|
|
407
|
-
# Are
|
408
|
-
def
|
409
|
-
activity_relations(
|
406
|
+
# Are {#activity_relations} available for subject?
|
407
|
+
def activity_relations_for?(subject, options = {})
|
408
|
+
activity_relations(subject, options).any?
|
410
409
|
end
|
411
410
|
|
412
411
|
# Is this {Actor} allowed to create a comment on activity?
|
@@ -459,37 +458,30 @@ class Actor < ActiveRecord::Base
|
|
459
458
|
# the wall for members of the group.
|
460
459
|
#
|
461
460
|
def wall(type, options = {})
|
462
|
-
|
463
|
-
|
464
|
-
args[:type] = type
|
465
|
-
args[:owner] = self
|
466
|
-
# Preserve this options
|
467
|
-
[ :for, :object_type ].each do |opt|
|
468
|
-
args[opt] = options[opt]
|
469
|
-
end
|
461
|
+
options[:for] = self if type == :home
|
470
462
|
|
471
|
-
|
472
|
-
|
473
|
-
|
463
|
+
wall =
|
464
|
+
Activity.
|
465
|
+
select("DISTINCT activities.*").
|
466
|
+
roots.
|
467
|
+
includes(:author, :user_author, :owner, :activity_objects, :activity_verb, :relations)
|
474
468
|
|
475
|
-
|
476
|
-
args[:relation_ids] =
|
469
|
+
actor_ids =
|
477
470
|
case type
|
478
471
|
when :home
|
479
|
-
|
480
|
-
Relation.allow(self, 'read', 'activity').map(&:id)
|
472
|
+
following_actor_and_self_ids
|
481
473
|
when :profile
|
482
|
-
|
483
|
-
#
|
484
|
-
# The relations that can be read by options[:for]
|
485
|
-
options[:for].present? ?
|
486
|
-
Relation.allow(options[:for], 'read', 'activity').map(&:id) :
|
487
|
-
[]
|
474
|
+
id
|
488
475
|
else
|
489
476
|
raise "Unknown type of wall: #{ type }"
|
490
477
|
end
|
491
478
|
|
492
|
-
|
479
|
+
wall = wall.authored_or_owned_by(actor_ids)
|
480
|
+
|
481
|
+
# Authentication
|
482
|
+
wall = wall.shared_with(options[:for])
|
483
|
+
|
484
|
+
wall = wall.order("created_at desc")
|
493
485
|
end
|
494
486
|
|
495
487
|
def logo
|
@@ -507,7 +499,7 @@ class Actor < ActiveRecord::Base
|
|
507
499
|
end
|
508
500
|
|
509
501
|
def liked_by(subject) #:nodoc:
|
510
|
-
likes.
|
502
|
+
likes.authored_by(subject)
|
511
503
|
end
|
512
504
|
|
513
505
|
# Does subject like this {Actor}?
|
@@ -517,14 +509,11 @@ class Actor < ActiveRecord::Base
|
|
517
509
|
|
518
510
|
# Build a new activity where subject like this
|
519
511
|
def new_like(subject, user)
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
a = Activity.new :verb => "like",
|
526
|
-
:channel => channel,
|
527
|
-
:relation_ids => Array(Relation::Public.instance.id)
|
512
|
+
a = Activity.new :verb => "like",
|
513
|
+
:author_id => Actor.normalize_id(subject),
|
514
|
+
:user_author_id => Actor.normalize_id(user),
|
515
|
+
:owner_id => id,
|
516
|
+
:relation_ids => Array(Relation::Public.instance.id)
|
528
517
|
|
529
518
|
a.activity_objects << activity_object
|
530
519
|
|