social_stream 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -2,3 +2,4 @@
2
2
  pkg/*gem
3
3
  **.tmp_*
4
4
  Gemfile.lock
5
+ .idea
@@ -114,9 +114,14 @@ class Activity < ActiveRecord::Base
114
114
  # Assign to ties of followers
115
115
  def assign_to_ties
116
116
  original = tie_activities.create!(:tie => _tie)
117
- _tie.activity_receivers.each do |t|
118
- tie_activities.create!(:tie => t,
119
- :original => false)
117
+
118
+ # All the ties following the activities attached to this tie, allowed to read
119
+ # this activity
120
+ Tie.following([_tie.sender_id, _tie.receiver_id]).each do |t|
121
+ if _tie.allows?(t.sender_id, 'read', 'activity')
122
+ tie_activities.create!(:tie => t,
123
+ :original => false)
124
+ end
120
125
  end
121
126
  end
122
127
  end
@@ -19,7 +19,9 @@ class Permission < ActiveRecord::Base
19
19
  has_many :relation_permissions, :dependent => :destroy
20
20
  has_many :relations, :through => :relation_permissions
21
21
 
22
- scope :represent, where(:action => 'represent')
22
+ %w(represent follow).each do |p|
23
+ scope p, where(:action => p) # scope :represent, where(:action => 'represent')
24
+ end
23
25
 
24
26
  # The SQL and ARel conditions for permission queries
25
27
  ParameterConditions = {
data/app/models/tie.rb CHANGED
@@ -68,6 +68,11 @@ class Tie < ActiveRecord::Base
68
68
  where("ties.sender_id = ties_2.receiver_id AND ties.receiver_id = ties_2.sender_id")
69
69
  }
70
70
 
71
+ scope :following, lambda { |a|
72
+ where(:receiver_id => Actor.normalize_id(a)).
73
+ joins(:relation => :permissions) & Permission.follow
74
+ }
75
+
71
76
  validates_presence_of :sender_id, :receiver_id, :relation_id
72
77
 
73
78
  before_validation :find_relation
@@ -118,11 +123,6 @@ class Tie < ActiveRecord::Base
118
123
  relation_set(:relations => r).first
119
124
  end
120
125
 
121
- def activity_receivers
122
- # TODO
123
- Array.new
124
- end
125
-
126
126
  # = Access Control
127
127
  #
128
128
  # Access control enforcement in ties come from the permissions assigned to other ties through relations.
@@ -184,15 +184,21 @@ class Tie < ActiveRecord::Base
184
184
  where("ties_as.receiver_id" => Actor.normalize_id(actor))
185
185
  }
186
186
 
187
+ # The set of ties that permit this tie allow to allow action on object
187
188
  def access_set(action, object)
188
189
  self.class.access_set(self, action, object)
189
190
  end
190
191
 
192
+ # The set of ties allowing user to perform action on object
191
193
  def allowing(user, action, object)
192
194
  access_set(action, object).received_by(user)
193
195
  end
194
196
 
197
+ # Does this tie allows user to perform action on object?
195
198
  def allows?(user, action, object)
199
+ # FIXME: Patch to support public activities
200
+ return true if relation.name == 'public' && action == 'read' && object == 'activity'
201
+
196
202
  allowing(user, action, object).any?
197
203
  end
198
204
 
@@ -12,8 +12,9 @@
12
12
  </div>
13
13
 
14
14
  <div id="wall">
15
- <% if activities.any? %>
15
+ <% activities = activities.paginate(:page => params[:page]) %>
16
+ <%- # should be activities.paginate(:page => params[:page], :count => { :select => 'activity.id', :distinct => true }) but it is not working in Rails 3.0.3 -%>
16
17
  <%= render activities %>
17
- <% end %>
18
+ <%= will_paginate activities %>
18
19
  </div>
19
20
  </div>
@@ -16,7 +16,7 @@
16
16
  <%= f.text_field :text, :id => "input_activities", :size => 85 %>
17
17
  <div id="activities_share_btn">
18
18
  <div id="securities">
19
- <%= f.select :_activity_tie_id, receiver.sent_ties_allowing(current_subject, 'create', 'activity').map{ |t| [ t.relation_name, t.id ] }, {}, :id => 'security' %>
19
+ <%= f.select :_activity_tie_id, receiver.sent_ties_allowing(current_subject, 'create', 'activity').sort{ |t, u| t.relation <=> u.relation }.map{ |t| [ t.relation_name, t.id ] }, {}, :id => 'security' %>
20
20
  </div>
21
21
  <%= image_submit_tag "btn/btn_share.png" %>
22
22
  </div>
@@ -1,6 +1,8 @@
1
+ <% groups = Group.alphabetic.paginate(:page => params[:page]) %>
2
+
1
3
  <% cont=0; %>
2
4
 
3
- <% Group.alphabetic.all.each do |group| %>
5
+ <% groups.each do |group| %>
4
6
 
5
7
  <% if (cont%2) == 0
6
8
  cont+=1; %>
@@ -31,3 +33,4 @@
31
33
  </div>
32
34
  <% end %>
33
35
 
36
+ <%= will_paginate(groups) %>
@@ -69,19 +69,6 @@
69
69
  <%= render :partial => "groups/index"%>
70
70
  <div class="space_center">
71
71
  </div>
72
- <div class="letters" class="content_size">
73
- <a href="#">First</a>
74
- <a href="#"><<</a>
75
- <a href="#">1</a>
76
- <a href="#">2</a>
77
- <a href="#">3</a>
78
- 4 <a href="#">5</a>
79
- <a href="#">6</a>
80
- ... <a href="#">>></a>
81
- <a href="#">Last</a>
82
- </div>
83
- <div class="space_center">
84
- </div>
85
72
  </div>
86
73
 
87
74
  <div id="most_popular" class="tabconference_browse">
@@ -17,5 +17,5 @@
17
17
  </div>
18
18
 
19
19
  <%= render :partial => "activities/activities",
20
- :locals => { :activities => @group.profile_wall(current_subject).paginate,
20
+ :locals => { :activities => @group.profile_wall(current_subject),
21
21
  :owner => @group } %>
@@ -19,5 +19,5 @@
19
19
  <% end %>
20
20
 
21
21
  <%= render :partial => "activities/activities",
22
- :locals => { :activities => current_subject.home_wall.paginate,
22
+ :locals => { :activities => current_subject.home_wall,
23
23
  :owner => current_subject } %>
@@ -1,37 +1,42 @@
1
1
  <div id="headerFront">
2
2
  <div class="banner_top">
3
3
  <div id="header_left">
4
- <a href="index.htm"></a>
5
- <div id="logo_txt">
6
- <%= link_to(t('socialstream') , root_path)%> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7
- </div>
8
- <% if user_signed_in? %>
9
- <%=image_tag("btn/btn_home.png",:class=>"btn_config") %>
10
- <div class="txt_config">
11
- <%= link_to t('home'), home_path %>
12
- </div>
13
- <%=image_tag("btn/btn_profile.png",:class=>"btn_config") %>
14
- <div class="txt_config">
15
- <%= link_to(t('profile.one'), current_subject)%>
16
- </div>
17
- <%=image_tag("btn/btn_browse.png",:class=>"btn_config") %>
18
- <div class="txt_config2">
19
- <%=link_to(t('browse'),users_path) %> &nbsp;
20
- </div>
4
+ <a href="index.htm"></a>
5
+ <div id="logo_txt">
6
+ <%= link_to(t('socialstream') , root_path)%> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
21
7
  </div>
22
- <div id="header_right">
23
- <%=image_tag("btn/btn_config.png",:class=>"btn_config") %>
24
- <div class="txt_config">
25
- <%= link_to t('account.one'), '#' %>
26
- </div>
8
+ <% if user_signed_in? %>
9
+ <%=image_tag("btn/btn_home.png",:class=>"btn_config") %>
10
+ <div class="txt_config">
11
+ <%= link_to t('home'), home_path %>
12
+ </div>
13
+ <%=image_tag("btn/btn_profile.png",:class=>"btn_config") %>
14
+ <div class="txt_config">
15
+ <%= link_to(t('profile.one'), current_subject)%>
16
+ </div>
17
+ <%=image_tag("btn/btn_browse.png",:class=>"btn_config") %>
18
+ <div class="txt_config2">
19
+ <%=link_to(t('browse'),users_path) %> &nbsp;
20
+ </div>
21
+ <% end %>
22
+ </div>
27
23
 
28
- <%= render :partial => 'layouts/representation' %>
24
+ <div id="header_right">
25
+ <% if user_signed_in? %>
29
26
 
30
- <%=image_tag("btn/btn_exit.png",:class=>"btn_config") %>
31
- <div class="txt_config2">
32
- <%= link_to t('sign_out'), destroy_user_session_path %>
33
- </div>
34
- <% end %>
27
+ <%=image_tag("btn/btn_config.png",:class=>"btn_config") %>
28
+ <div class="txt_config">
29
+ <%= link_to t('account.one'), '#' %>
30
+ </div>
31
+
32
+ <div id="representation">
33
+ <%= render :partial => 'layouts/representation' %>
34
+ </div>
35
+ <%=image_tag("btn/btn_exit.png",:class=>"btn_config") %>
36
+ <div class="txt_config2">
37
+ <%= link_to t('sign_out'), destroy_user_session_path %>
38
+ </div>
39
+ <% end %>
35
40
  </div>
36
41
  </div>
37
42
  <br class="clearfloat" />
@@ -8,7 +8,7 @@
8
8
  if ($('#carousel_ul').length) { // element found
9
9
  $("#carousel_ul").prepend("<%= escape_javascript(render @tie.receiver_subject) %>");
10
10
  }else{ // no element found
11
- $("#my_groups").html("<%= escape_javascript(render 'users/groups' )%>");
11
+ $("#my_groups").html("<%= escape_javascript(render(:partial => 'users/groups', :locals => { :user => current_subject } ))%>");
12
12
  }
13
13
  $("#group_count").html("<%=current_subject.recent_groups.count%>");
14
14
  link_tie.replaceWith("<%= escape_javascript(link_follow_state) %>");
@@ -20,7 +20,7 @@
20
20
  } else {
21
21
  old_tie.hide();
22
22
  }
23
-
24
- $(".boxy-inner .close").click();
25
23
  <% end %>
24
+
25
+ $(".boxy-inner .close").click();
26
26
  <% end %>
@@ -1,6 +1,8 @@
1
+ <% users = User.alphabetic.paginate(:page => params[:page]) %>
2
+
1
3
  <% cont=0; %>
2
4
 
3
- <% User.alphabetic.all.each do |user| %>
5
+ <% users.each do |user| %>
4
6
 
5
7
  <% if (cont%2) == 0
6
8
  cont+=1; %>
@@ -28,3 +30,4 @@
28
30
  </div>
29
31
  <% end %>
30
32
 
33
+ <%= will_paginate(users) %>
@@ -63,19 +63,6 @@
63
63
 
64
64
  <div class="space_center">
65
65
  </div>
66
- <div class="letters" class="content_size">
67
- <a href="#">First</a>
68
- <a href="#"><<</a>
69
- <a href="#">1</a>
70
- <a href="#">2</a>
71
- <a href="#">3</a>
72
- 4 <a href="#">5</a>
73
- <a href="#">6</a>
74
- ... <a href="#">>></a>
75
- <a href="#">Last</a>
76
- </div>
77
- <div class="space_center">
78
- </div>
79
66
  </div>
80
67
 
81
68
 
@@ -16,5 +16,5 @@
16
16
  :locals => { :user => @user } %>
17
17
 
18
18
  <%= render :partial => "activities/activities",
19
- :locals => { :activities => @user.profile_wall(current_subject).paginate,
19
+ :locals => { :activities => @user.profile_wall(current_subject),
20
20
  :owner => @user } %>
@@ -53,7 +53,12 @@
53
53
  float: right;
54
54
  right: 0px;
55
55
  padding-right: 10px;
56
+ display: inline-block;
56
57
  }
58
+ #representation {
59
+ display: inline;
60
+ }
61
+
57
62
 
58
63
  .btn_config {
59
64
  vertical-align: top;
@@ -107,5 +112,5 @@
107
112
  }
108
113
 
109
114
  #new_representation {
110
- display: inline;
115
+ display: inline-block;
111
116
  }
@@ -6,6 +6,7 @@ user:
6
6
  friend:
7
7
  name: friend
8
8
  permissions:
9
+ - [ follow ]
9
10
  - [ create, activity, weak_set ]
10
11
  - [ read, activity, star_set ]
11
12
  - [ update, activity, weak_set ]
@@ -10,9 +10,7 @@ module SocialStream
10
10
  end
11
11
 
12
12
  can :read, Activity do |a|
13
- # This condition would not be neccesary if every actor had a public tie with others
14
- a.tie.relation.name == 'public' ||
15
- a.tie.allows?(user, 'read', 'activity')
13
+ a.tie.allows?(user, 'read', 'activity')
16
14
  end
17
15
 
18
16
  can :update, Activity do |a|
@@ -11,14 +11,17 @@ module SocialStream
11
11
  module InstanceMethods
12
12
  # Current subject represented by the user. Defaults to the own user
13
13
  def current_subject
14
- current_subject_from_session ||
15
- current_user
14
+ @current_subject ||=
15
+ current_subject_from_session ||
16
+ current_user
16
17
  end
17
18
 
18
19
  # Set represented subject
19
20
  def current_subject= instance
20
21
  session[:subject_type] = instance.class.to_s
21
22
  session[:subject_id] = instance.id
23
+
24
+ @current_subject = instance
22
25
  end
23
26
 
24
27
  private
@@ -1,3 +1,3 @@
1
1
  module SocialStream
2
- VERSION = "0.3.1".freeze
2
+ VERSION = "0.3.2".freeze
3
3
  end
@@ -5,7 +5,8 @@ Gem::Specification.new do |s|
5
5
  s.version = SocialStream::VERSION.dup
6
6
  s.summary = "Social networking features and activity streams for Ruby on Rails."
7
7
  s.description = "Ruby on Rails engine supporting social networking features and activity streams."
8
- s.authors = ["Grupo Internet de Nueva Generación, Universidad Politécnica de Madrid"]
8
+ s.authors = [ "GING - DIT - UPM",
9
+ "CISE - ESPOL" ]
9
10
  s.homepage = "http://social-stream.dit.upm.es/"
10
11
  s.files = `git ls-files`.split("\n")
11
12
  s.add_runtime_dependency('atd-ancestry', '1.3.0')
@@ -17,7 +18,7 @@ Gem::Specification.new do |s|
17
18
  s.add_runtime_dependency('paperclip', '~> 2.3.4')
18
19
  s.add_runtime_dependency('jquery-rails', '~> 0.2.5')
19
20
  s.add_runtime_dependency('cancan', '~> 1.4.0')
20
- s.add_runtime_dependency('will_paginate', '~> 2.3.15')
21
+ s.add_runtime_dependency('will_paginate', '~> 3.0.pre2')
21
22
  s.add_development_dependency('rails', '~> 3.0.3')
22
23
  s.add_development_dependency('capybara', '~> 0.3.9')
23
24
  s.add_development_dependency('sqlite3-ruby')
@@ -6,6 +6,7 @@ user:
6
6
  friend:
7
7
  name: friend
8
8
  permissions:
9
+ - [ follow ]
9
10
  - [ create, activity, weak_set ]
10
11
  - [ read, activity, star_set ]
11
12
  - [ update, activity, weak_set ]
@@ -1 +1,2 @@
1
1
  *.sqlite3
2
+ *.sqlite3-journal
@@ -0,0 +1,52 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe TieActivity do
4
+ describe "for followers" do
5
+ before do
6
+ @tie = Factory(:friend)
7
+
8
+ @tie_to_sender_friend = Factory(:friend, :receiver => @tie.sender)
9
+ @tie_to_receiver_friend = Factory(:friend, :receiver => @tie.receiver)
10
+ end
11
+
12
+ describe "of a public activity" do
13
+ before do
14
+ @a = Factory(:activity, :_tie => @tie.related(@tie.sender.relations.sort.last))
15
+ end
16
+
17
+ it "should be created" do
18
+ assert @tie_to_sender_friend.activities.include?(@a)
19
+ assert @tie_to_receiver_friend.activities.include?(@a)
20
+ end
21
+ end
22
+
23
+ describe "of a friend activity" do
24
+ before do
25
+ @a = Factory(:activity, :_tie => @tie)
26
+ end
27
+
28
+ it "should not be created" do
29
+ assert !@tie_to_sender_friend.activities.include?(@a)
30
+ assert !@tie_to_receiver_friend.activities.include?(@a)
31
+ end
32
+ end
33
+
34
+ describe "one of them being friend" do
35
+ before do
36
+ Factory(:friend, :sender => @tie.sender, :receiver => @tie_to_receiver_friend.sender)
37
+ end
38
+
39
+ describe "with a friend activity" do
40
+ before do
41
+ @a = Factory(:activity, :_tie => @tie)
42
+ end
43
+
44
+ it "should be created for the friend" do
45
+ assert !@tie_to_sender_friend.activities.include?(@a)
46
+ assert @tie_to_receiver_friend.activities.include?(@a)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+
@@ -17,18 +17,22 @@ describe Tie do
17
17
  tie.should be_valid
18
18
  end
19
19
 
20
- it "should create pending" do
21
- tie = Factory(:friend)
22
-
23
- assert tie.receiver.pending_ties.present?
24
- assert tie.receiver.pending_ties.first.relation_set.blank?
25
- end
26
20
 
27
21
  describe "friend" do
28
22
  before do
29
23
  @tie = Factory(:friend)
30
24
  end
31
25
 
26
+ it "should create pending" do
27
+
28
+ assert @tie.receiver.pending_ties.present?
29
+ assert @tie.receiver.pending_ties.first.relation_set.blank?
30
+ end
31
+
32
+ it "should be following" do
33
+ assert Tie.following(@tie.receiver_id).include?(@tie)
34
+ end
35
+
32
36
  describe ", receiver" do
33
37
  before do
34
38
  @s = @tie.receiver
metadata CHANGED
@@ -1,21 +1,22 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: social_stream
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 1
10
- version: 0.3.1
9
+ - 2
10
+ version: 0.3.2
11
11
  platform: ruby
12
12
  authors:
13
- - "Grupo Internet de Nueva Generaci\xC3\xB3n, Universidad Polit\xC3\xA9cnica de Madrid"
13
+ - GING - DIT - UPM
14
+ - CISE - ESPOL
14
15
  autorequire:
15
16
  bindir: bin
16
17
  cert_chain: []
17
18
 
18
- date: 2011-01-19 00:00:00 +01:00
19
+ date: 2011-01-25 00:00:00 +01:00
19
20
  default_executable:
20
21
  dependencies:
21
22
  - !ruby/object:Gem::Dependency
@@ -170,12 +171,12 @@ dependencies:
170
171
  requirements:
171
172
  - - ~>
172
173
  - !ruby/object:Gem::Version
173
- hash: 29
174
+ hash: 270495401
174
175
  segments:
175
- - 2
176
176
  - 3
177
- - 15
178
- version: 2.3.15
177
+ - 0
178
+ - pre2
179
+ version: 3.0.pre2
179
180
  type: :runtime
180
181
  version_requirements: *id010
181
182
  - !ruby/object:Gem::Dependency
@@ -501,6 +502,7 @@ files:
501
502
  - lib/generators/social_stream/templates/public/images/btn/time.png
502
503
  - lib/generators/social_stream/templates/public/images/btn/uno.png
503
504
  - lib/generators/social_stream/templates/public/images/btn/viewer.png
505
+ - lib/generators/social_stream/templates/public/images/favicon.ico
504
506
  - lib/generators/social_stream/templates/public/images/frontpage/collaborate.gif
505
507
  - lib/generators/social_stream/templates/public/images/frontpage/collaborate.png
506
508
  - lib/generators/social_stream/templates/public/images/frontpage/comments.png
@@ -656,6 +658,7 @@ files:
656
658
  - spec/models/actor_spec.rb
657
659
  - spec/models/post_spec.rb
658
660
  - spec/models/representation_spec.rb
661
+ - spec/models/tie_activity_spec.rb
659
662
  - spec/models/tie_spec.rb
660
663
  - spec/models/user_spec.rb
661
664
  - spec/social_stream_spec.rb