social_stream 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/.gitignore +2 -0
  2. data/Gemfile.lock +1 -1
  3. data/README.rdoc +4 -4
  4. data/app/controllers/private_messages_controller.rb +3 -0
  5. data/app/controllers/users_controller.rb +26 -0
  6. data/app/models/permission.rb +19 -0
  7. data/app/models/private_message.rb +6 -0
  8. data/app/models/profile.rb +3 -0
  9. data/app/models/tie.rb +28 -2
  10. data/app/models/user.rb +29 -13
  11. data/app/views/home/_options.html.erb +4 -1
  12. data/app/views/home/_right.html.erb +1 -1
  13. data/app/views/layouts/application.html.erb +7 -4
  14. data/app/views/private_messages/_form.html.erb +24 -0
  15. data/app/views/private_messages/_index.html.erb +24 -0
  16. data/app/views/private_messages/_location.html.erb +3 -0
  17. data/app/views/private_messages/_messages.html.erb +2 -0
  18. data/app/views/private_messages/_private_message.html.erb +17 -0
  19. data/app/views/private_messages/edit.html.erb +6 -0
  20. data/app/views/private_messages/index.html.erb +1 -0
  21. data/app/views/private_messages/index.js.erb +1 -0
  22. data/app/views/private_messages/new.html.erb +14 -0
  23. data/app/views/private_messages/show.html.erb +21 -0
  24. data/app/views/users/_contacts.html.erb +2 -0
  25. data/app/views/users/_profile.html.erb +44 -57
  26. data/app/views/users/edit.html.erb +164 -0
  27. data/config/locales/en.yml +5 -4
  28. data/config/routes.rb +1 -0
  29. data/lib/generators/social_stream/install_generator.rb +4 -0
  30. data/lib/generators/social_stream/templates/migration.rb +21 -3
  31. data/lib/generators/social_stream/templates/public/javascripts/jquery-ui.min.js +401 -0
  32. data/lib/generators/social_stream/templates/public/stylesheets/edit_user.css +80 -0
  33. data/lib/generators/social_stream/templates/public/stylesheets/message.css +46 -0
  34. data/lib/social_stream/populate.rb +26 -0
  35. data/lib/social_stream/version.rb +1 -1
  36. data/lib/tasks/db/populate.rake +2 -2
  37. data/spec/controllers/.groups_controller_spec.rb.swp +0 -0
  38. data/spec/controllers/.users_controller_spec.rb.swp +0 -0
  39. data/spec/controllers/frontpage_controller_spec.rb +11 -0
  40. data/spec/controllers/groups_controller_spec.rb +51 -0
  41. data/spec/controllers/home_controller_spec.rb +24 -0
  42. data/spec/controllers/users_controller_spec.rb +48 -0
  43. data/spec/factories/post.rb +1 -0
  44. data/spec/factories/user.rb +2 -0
  45. data/spec/spec_helper.rb +1 -1
  46. data/spec/support/devise.rb +4 -0
  47. metadata +29 -7
  48. data/spec/dummy/app/models/post.rb +0 -2
  49. data/spec/dummy/app/models/user.rb +0 -2
  50. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
data/.gitignore CHANGED
@@ -1 +1,3 @@
1
+ .bundle
1
2
  pkg/*gem
3
+ **.tmp_*
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- social_stream (0.1.7)
4
+ social_stream (0.2.2)
5
5
  atd-ancestry (= 1.3.0)
6
6
  cancan (~> 1.4.0)
7
7
  devise (~> 1.1.3)
data/README.rdoc CHANGED
@@ -1,6 +1,6 @@
1
- = Social Stream: building social network applications
2
- Social Stream is an engine for Ruby on Rails. It provides your application with
3
- a core of social networking features and activity streams.
1
+ = Social Stream: core for building social network websites
2
+ Social Stream is an engine for Ruby on Rails. It provides a robust and flexible core
3
+ with social networking features and activity streams for building websites.
4
4
 
5
5
  == Social networking
6
6
  Social networks are a new paradigm on web application design. Social networking platforms stand
@@ -68,7 +68,7 @@ initializer.
68
68
 
69
69
  = Documentation
70
70
 
71
- {Social Stream documentation is available at rdoc.info}[http://rdoc.info/github/ging/social_stream/frames]}
71
+ {Social Stream documentation is available at rdoc.info}[http://rubydoc.info/gems/social_stream/frames]
72
72
 
73
73
  = Discussion
74
74
 
@@ -0,0 +1,3 @@
1
+ class PrivateMessagesController < InheritedResources::Base
2
+ respond_to :html, :xml, :js
3
+ end
@@ -6,6 +6,32 @@ class UsersController < ApplicationController
6
6
  respond_to do |format|
7
7
  format.html # show.html.erb
8
8
  format.xml { render :xml => @user }
9
+ end
10
+ end
11
+
12
+ def edit
13
+ @user = User.find_by_permalink!(params[:id])
14
+
15
+ respond_to do |format|
16
+ format.html # edit.html.erb
17
+ format.xml { render :xml => @user }
9
18
  end
10
19
  end
20
+
21
+ def update
22
+
23
+ @user = User.find_by_permalink!(params[:id])
24
+
25
+ respond_to do |format|
26
+ if @user.update_attributes(params[:user])
27
+ #format.html { redirect_to(@user, :notice => 'User was successfully updated.') }
28
+ format.html { render :action => "edit", :notice => 'User was successfully updated.' }
29
+ format.xml { head :ok }
30
+ else
31
+ format.html { render :action => "edit" }
32
+ format.xml { render :xml => @user.errors, :status => :unprocessable_entity }
33
+ end
34
+ end
35
+ end
36
+
11
37
  end
@@ -1,7 +1,26 @@
1
+ # SocialStream provides a sophisticated and powerful system of permissions based on the relations
2
+ # and ties of the social network.
3
+ #
4
+ # Permissions are composed by action, objective and parameterized. Action and objective are classical
5
+ # in content management systems, e.g. "create" "activity", "update" "tie", "read" "post"
6
+ #
7
+ # parameterized is a novel feature. It supports applying the permission to certain set of ties.
8
+ # This set of ties changes with the formation of ties in your website.
9
+ #
10
+ # Permissions is assigned to relations, and through relations, to ties.
11
+ # When a sender establishes a tie with a receiver, she grants to the receiver the permissions assigned
12
+ # to relation of the tie she has just established. For example, when Alice establishes a "friend" tie
13
+ # to Bob, she is granting him the permissions associated with "friend" relation.
14
+ #
15
+ # One of this permissions can be "read" "activity" "inverse_group_set". This way, Bob will have access
16
+ # to read the activities attached to ties inside the "inverse_group_set", which are the ties from all
17
+ # the "friends" of Alice to Alice herself.
18
+ #
1
19
  class Permission < ActiveRecord::Base
2
20
  has_many :relation_permissions, :dependent => :destroy
3
21
  has_many :relations, :through => :relation_permissions
4
22
 
23
+ # The SQL and ARel conditions for permission queries
5
24
  ParameterConditions = {
6
25
  :table => {
7
26
  'tie' =>
@@ -0,0 +1,6 @@
1
+ class PrivateMessage < ActiveRecord::Base
2
+ belongs_to :sender,
3
+ :class_name => 'Actor'
4
+ belongs_to :receiver,
5
+ :class_name => 'Actor'
6
+ end
@@ -0,0 +1,3 @@
1
+ class Profile < ActiveRecord::Base
2
+ belongs_to :user
3
+ end
data/app/models/tie.rb CHANGED
@@ -121,8 +121,34 @@ class Tie < ActiveRecord::Base
121
121
  Tie.inverse(self).first
122
122
  end
123
123
 
124
- # Access Control
125
-
124
+ # = Access Control
125
+ #
126
+ # Access control enforcement in ties come from the permissions assigned to other ties through relations.
127
+ # The access_set is the set of ties that grant some permission on a particular tie.
128
+ #
129
+ # Enforcing access control on activities and ties are a matter of finding its access set.
130
+ # There are two approaches for this, checking the permissions on particular tie or finding all the ties
131
+ # granted some permission.
132
+ #
133
+ # == Particular tie
134
+ # ------------------ ------------------
135
+ # | particular tie |--------| access_set |
136
+ # | t | | ties |
137
+ # ------------------ ------------------
138
+ #
139
+ # Because t is given, the scopes are applied to the ties table
140
+ # We get the set of ties that allow permission on t
141
+ #
142
+ # == Finding ties
143
+ # ------------------ join ------------------
144
+ # | finding ties |--------| access_set |
145
+ # | ties | | ties_as |
146
+ # ------------------ ------------------
147
+ #
148
+ # Because we want to find ties, an additional join table (ties_as) is needed for applying access set conditions
149
+ # We get the set of ties that are allowed to certain condition
150
+ #
151
+
126
152
  scope :with_permissions, lambda { |action, object|
127
153
  joins(:relation => :permissions).
128
154
  where('permissions.action' => action).
data/app/models/user.rb CHANGED
@@ -2,24 +2,38 @@ require 'devise/orm/active_record'
2
2
 
3
3
  class User < ActiveRecord::Base
4
4
  devise *SocialStream.devise_modules
5
-
5
+ has_one :profile
6
+ accepts_nested_attributes_for :profile
7
+
6
8
  # Setup accessible (or protected) attributes for your model
7
- attr_accessible :name, :email, :password, :password_confirmation, :remember_me
8
-
9
+ attr_accessible :name, :email, :password, :password_confirmation, :remember_me, :profile_attributes, :birthday
10
+
9
11
  validates_presence_of :email
12
+
10
13
  validates_format_of :email, :with => Devise.email_regexp, :allow_blank => true
11
14
  # TODO: uniqueness of email, which is in actor
12
-
15
+
13
16
  with_options :if => :password_required? do |v|
14
17
  v.validates_presence_of :password
15
18
  v.validates_confirmation_of :password
16
19
  v.validates_length_of :password, :within => Devise.password_length, :allow_blank => true
17
20
  end
18
-
21
+
19
22
  def recent_groups
20
23
  receiver_subjects(:group, :relations => 'follower') & Tie.recent
21
24
  end
22
25
 
26
+
27
+
28
+ def age
29
+ return nil if self.birthday.blank?
30
+ now = Time.now.utc.to_date
31
+ now.year - self.birthday.year - (self.birthday.to_date.change(:year => now.year) > now ? 1 : 0)
32
+ end
33
+
34
+ after_create :create_profile
35
+
36
+
23
37
  def friends
24
38
  receiver_subjects(:user, :relations => 'friend')
25
39
  end
@@ -30,7 +44,7 @@ class User < ActiveRecord::Base
30
44
  def password_required?
31
45
  !persisted? || !password.nil? || !password_confirmation.nil?
32
46
  end
33
-
47
+
34
48
  class << self
35
49
  %w( email permalink name ).each do |a|
36
50
  eval <<-EOS
@@ -42,7 +56,7 @@ class User < ActiveRecord::Base
42
56
  end # end
43
57
  EOS
44
58
  end
45
-
59
+
46
60
  # Overwrite devise default find method to support login with email,
47
61
  # presence ID and login
48
62
  def find_for_authentication(conditions)
@@ -56,7 +70,7 @@ class User < ActiveRecord::Base
56
70
  super
57
71
  end
58
72
  end
59
-
73
+
60
74
  def find_or_initialize_with_error_by(attribute, value, error=:invalid)
61
75
  if attribute == :email
62
76
  find_or_initialize_with_error_by_email(value, error)
@@ -64,26 +78,28 @@ class User < ActiveRecord::Base
64
78
  super
65
79
  end
66
80
  end
67
-
81
+
68
82
  # Overwrite devise default method to support finding with actor.email
69
83
  def find_or_initialize_with_error_by_email(value, error)
70
84
  if value.present?
71
85
  record = find_by_email(value)
72
86
  end
73
-
87
+
74
88
  unless record
75
89
  record = new
76
-
90
+
77
91
  if value.present?
78
92
  record.email = value
79
93
  else
80
94
  error = :blank
81
95
  end
82
-
96
+
83
97
  record.errors.add(:email, error)
84
98
  end
85
-
99
+
86
100
  record
87
101
  end
88
102
  end
103
+
104
+
89
105
  end
@@ -1,5 +1,8 @@
1
1
  <ul class="menu noaccordion">
2
2
  <li>
3
- <%= link_to( image_tag("btn/btn_inbox.png", :class => "menu_icon")+t('inbox.one'), current_user) %>
3
+ <%= link_to( image_tag("btn/btn_inbox.png", :class => "menu_icon")+t('inbox.one'), private_messages_path, :remote => true) %>
4
+ </li>
5
+ <li>
6
+ <%= link_to( image_tag("btn/btn_group.png", :class => "menu_icon")+t('group.new'), "#", :remote => true) %>
4
7
  </li>
5
8
  </ul>
@@ -7,7 +7,7 @@
7
7
  <div class="menu_header"><b><%=t('menu.options')%></b>
8
8
  </div>
9
9
  <div id="menu_lateral">
10
- <%= render :partial => "options" %>
10
+ <%= render :partial => "home/options" %>
11
11
  </div>
12
12
  <div class="space_center">
13
13
  </div>
@@ -18,11 +18,14 @@
18
18
  <%= stylesheet_link_tag "carousel", :media => "screen, projection" %>
19
19
  <%= stylesheet_link_tag "smoothness/jquery-ui-1.8.4.custom", :media => "screen, projection" %>
20
20
  <%= stylesheet_link_tag "ui.dropdownchecklist", :media => "screen, projection" %>
21
+ <!-- datepicker css -->
22
+ <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
23
+ <%= stylesheet_link_tag "edit_user", :media => "screen, projection" %>
21
24
 
22
25
 
23
26
  <%= javascript_include_tag :defaults %>
24
27
 
25
- <%= javascript_include_tag 'jquery', 'jquery-ui-1.8.4.custom.min', 'jquery.livequery',
28
+ <%= javascript_include_tag 'jquery', 'jquery-ui.min', 'jquery.livequery',
26
29
  'jquery.boxy', 'menu','ui.dropdownchecklist' %>
27
30
 
28
31
 
@@ -47,11 +50,11 @@
47
50
  </div>
48
51
  <div id="middle">
49
52
  <div id="middleContent">
50
- <div class="space_center">
53
+ <div class="space_profile">
51
54
  </div>
52
- <div class="space_center">
55
+ <div class="space_profile">
53
56
  </div>
54
- <div class="space_center">
57
+ <div class="space_profile">
55
58
  </div>
56
59
  <%= yield :middle %>
57
60
  </div>
@@ -0,0 +1,24 @@
1
+ <%= form_for(@private_message) do |f| %>
2
+ <% if @private_message.errors.any? %>
3
+ <div id="error_explanation">
4
+ <h2><%= pluralize(@private_message.errors.count, "error") %> prohibited this private_message from being saved:</h2>
5
+
6
+ <ul>
7
+ <% @private_message.errors.full_messages.each do |msg| %>
8
+ <li><%= msg %></li>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ <% end %>
13
+
14
+ <%= f.hidden_field :sender_id %>
15
+ <%= f.hidden_field :receiver_id %>
16
+
17
+ <div class="field">
18
+ <%= f.label :text %><br />
19
+ <%= f.text_area :text %>
20
+ </div>
21
+ <div class="actions">
22
+ <%= f.submit %>
23
+ </div>
24
+ <% end %>
@@ -0,0 +1,24 @@
1
+ <% content_for :middle do %>
2
+ <%= render :partial => 'home/middle' %>
3
+ <% end %>
4
+
5
+ <% content_for :right do %>
6
+ <%= render :partial => "home/right" %>
7
+ <% end %>
8
+
9
+ <%= render :partial => 'location' %>
10
+
11
+ <br class="clearfloat" />
12
+ <div class="space_center">
13
+ </div>
14
+
15
+ <div id="new_message" ><%= link_to 'New Message', new_private_message_path %></div>
16
+ <div class="space_center">
17
+ </div>
18
+ <div class="space_center">
19
+ </div>
20
+
21
+
22
+ <div id="messages">
23
+ <%= render :partial => 'messages' %>
24
+ </div>
@@ -0,0 +1,3 @@
1
+ <div id="map_location" class="content_size">
2
+ <%= t('location.message', :location => "#{ image_tag('btn/btn_inbox.png' , :class => 'btn_config') } #{ t('inbox.one') }: <span class=\"name_group\">#{ sanitize current_user.name }</span>").html_safe %>
3
+ </div>
@@ -0,0 +1,2 @@
1
+ <%= content_for :head, stylesheet_link_tag("message", :media => "screen, projection") %>
2
+ <%= render @private_messages %>
@@ -0,0 +1,17 @@
1
+ <%= div_for (private_message) do %>
2
+ <div class="actor_logo">
3
+ <%= link_to image_tag(private_message.text,
4
+ :alt => private_message.text),
5
+ private_message %>
6
+ </div>
7
+ <div class="activity_content_message">
8
+ <div class="actor_name_message">
9
+ <%= link_to(private_message.text, private_message) %>
10
+ </div>
11
+ <div class="option_msg">
12
+ <div class="edit_message"><%= link_to ( image_tag('btn/btn_edit.png', :class=>"btn_config"), edit_private_message_path(private_message)) %></div>
13
+ <div class="detele_message"><%= link_to ( image_tag('btn/btn_delete.png', :class=>"btn_config"), private_message, :confirm => 'Are you sure?', :method => :delete) %></div>
14
+ </div>
15
+ </div>
16
+
17
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <h1>Editing private_message</h1>
2
+
3
+ <%= render 'form' %>
4
+
5
+ <%= link_to 'Show', @private_message %> |
6
+ <%= link_to 'Back', private_messages_path %>
@@ -0,0 +1 @@
1
+ <%= render :partial => 'index' %>
@@ -0,0 +1 @@
1
+ $("#content").html("<%=escape_javascript(render :partial => 'index') %>");
@@ -0,0 +1,14 @@
1
+ <% content_for :middle do %>
2
+ <%= render :partial => 'home/middle' %>
3
+ <% end %>
4
+
5
+ <% content_for :right do %>
6
+ <%= render :partial => "home/right" %>
7
+ <% end %>
8
+
9
+
10
+ <h1>New private_message</h1>
11
+
12
+ <%= render 'form' %>
13
+
14
+ <%= link_to 'Back', private_messages_path %>
@@ -0,0 +1,21 @@
1
+
2
+ <p id="notice"><%= notice %></p>
3
+
4
+ <p>
5
+ <b>Sender:</b>
6
+ <%= @private_message.sender %>
7
+ </p>
8
+
9
+ <p>
10
+ <b>Receiver:</b>
11
+ <%= @private_message.receiver %>
12
+ </p>
13
+
14
+ <p>
15
+ <b>Text:</b>
16
+ <%= @private_message.text %>
17
+ </p>
18
+
19
+
20
+ <%= link_to 'Edit', edit_private_message_path(@private_message) %> |
21
+ <%= link_to 'Back', private_messages_path %>
@@ -1,3 +1,4 @@
1
+
1
2
  <div class="contacts_header">
2
3
  <%=image_tag("btn/btn_friend.png", :class => "contacts_icon")%>
3
4
  <div class="contacts_text_header">
@@ -15,3 +16,4 @@
15
16
  <%=link_to((image_tag("btn/btn_next.png", :alt => "next")) , users_path) %>
16
17
  </div>
17
18
 
19
+