social_stream 0.26.2 → 0.27.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.
- 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 |  |