diff --git a/app/models/concerns/followable.rb b/app/models/concerns/followable.rb new file mode 100644 index 0000000..cd2dc06 --- /dev/null +++ b/app/models/concerns/followable.rb @@ -0,0 +1,18 @@ +module Followable + extend ActiveSupport::Concern + + def followers + person_followers = Person.joins(:owned_circles).merge(circles).uniq + external_person_followers = ExternalPerson.joins(:owned_circles).merge(circles).uniq + + person_followers + external_person_followers + end + + def followed_by?(person) + (person == self) || (person.in? self.followers) + end + + def in_circle?(circle) + circle.in? self.circles + end +end diff --git a/app/models/concerns/follower.rb b/app/models/concerns/follower.rb index 9ff397b..f05735f 100644 --- a/app/models/concerns/follower.rb +++ b/app/models/concerns/follower.rb @@ -4,14 +4,14 @@ module Follower def follow(profile, circles) circles = [circles] unless circles.is_a?(Array) circles.each do |new_circle| - next if new_circle.owner != self || new_circle.profile_type != profile.class.name + next if new_circle.owner != self || !profile.kind_of?(new_circle.profile_type.constantize) ProfileFollower.create(profile: profile, circle: new_circle) end end def follows?(profile) return false if profile.nil? - p profile.followed_by?(self) + profile.followed_by?(self) end def unfollow(profile) @@ -19,7 +19,10 @@ module Follower end def followed_profiles - Profile.followed_by self + external_people = ExternalPerson.joins(:circles).where("circles.owner_id = ?", self.id) + profiles = Profile.joins(:circles).where("circles.owner_id = ?", self.id) + + external_people.uniq + profiles.uniq end def update_profile_circles(profile, new_circles) @@ -37,4 +40,8 @@ module Follower ProfileFollower.with_profile(profile).with_circle(circle).destroy_all end + def in_circle?(circle) + circle.in? self.circles + end + end diff --git a/app/models/external_person.rb b/app/models/external_person.rb index 519689b..a3b8eaa 100644 --- a/app/models/external_person.rb +++ b/app/models/external_person.rb @@ -4,9 +4,10 @@ class ExternalPerson < ActiveRecord::Base include Human include ProfileEntity include Follower + include Followable - has_many :profile_followers - has_many :circles, :through => :profile_followers, :as => :profile + has_many :profile_followers, :as => :profile + has_many :circles, :through => :profile_followers has_many :owned_circles, as: :owner, :class_name => "Circle" validates_uniqueness_of :identifier, scope: :source @@ -204,7 +205,7 @@ class ExternalPerson < ActiveRecord::Base each_friend: nil, is_last_admin?: false, is_last_admin_leaving?: false, leave: nil, last_notification: nil, notification_time: 0, notifier: nil, remove_suggestion: nil, allow_invitation_from?: false, in_social_circle?: false, - allow_followers: false, in_circles: Circle.none, followers: [], in_circle?: false + allow_followers: false } derivated_methods = generate_derivated_methods(methods_and_responses) @@ -258,7 +259,7 @@ class ExternalPerson < ActiveRecord::Base more_popular_label: _('no members'), profile_custom_image: nil, is_on_homepage?: false, activities: ProfileActivity.none, may_display_field_to?: true, may_display_location_to?: true, public_fields: - {}, followed_by?: false, display_private_info_to?: true, can_view_field?: + {}, display_private_info_to?: true, can_view_field?: true, remove_from_suggestion_list: nil, layout_template: 'default', is_admin?: false, add_friend: false, is_a_friend?: false, already_request_friendship?: false, tracked_actions: ActionTracker::Record.none @@ -275,6 +276,7 @@ class ExternalPerson < ActiveRecord::Base if profile_instance_methods.keys.include? method return profile_instance_methods[method] end + super end def respond_to_missing?(method_name, include_private = false) @@ -283,6 +285,10 @@ class ExternalPerson < ActiveRecord::Base super end + def kind_of?(klass) + (klass == Person) ? true : super + end + private def generate_derivated_methods(methods) diff --git a/app/models/person.rb b/app/models/person.rb index 4dff60b..f61e693 100644 --- a/app/models/person.rb +++ b/app/models/person.rb @@ -570,10 +570,6 @@ class Person < Profile } end - def followed_profiles - Profile.followed_by self - end - def in_social_circle?(person) self.is_a_friend?(person) || super end diff --git a/app/models/profile.rb b/app/models/profile.rb index e085fa3..6fd9bbf 100644 --- a/app/models/profile.rb +++ b/app/models/profile.rb @@ -4,6 +4,7 @@ class Profile < ApplicationRecord include ProfileEntity + include Followable attr_accessible :public_profile, :nickname, :custom_footer, :custom_header, :address, :zip_code, :contact_phone, :image_builder, :description, :closed, :template_id, :lat, :lng, :is_template, :fields_privacy, :preferred_domain_id, :category_ids, :country, :city, :state, :national_region_code, :email, :contact_email, :redirect_l10n, :notification_time, :custom_url_redirection, :email_suggestions, :allow_members_to_invite, :invite_friends_only, :secret, :profile_admin_mail_notification, :redirection_after_login, :allow_followers @@ -219,13 +220,6 @@ class Profile < ApplicationRecord scope :more_active, -> { order 'activities_count DESC' } scope :more_recent, -> { order "created_at DESC" } - scope :followed_by, -> person{ - distinct.select('profiles.*'). - joins('left join profiles_circles ON profiles_circles.profile_id = profiles.id'). - joins('left join circles ON circles.id = profiles_circles.circle_id'). - where('circles.owner_id = ?', person.id) - } - settings_items :allow_followers, :type => :boolean, :default => true alias_method :allow_followers?, :allow_followers @@ -241,15 +235,8 @@ class Profile < ApplicationRecord has_many :email_templates, :foreign_key => :owner_id - has_many :profile_followers - has_many :circles, :through => :profile_followers, :as => :profile - - def followers - person_followers = Person.joins(:owned_circles).merge(circles).uniq - external_person_followers = ExternalPerson.joins(:owned_circles).merge(circles).uniq - - person_followers + external_person_followers - end + has_many :profile_followers, :as => :profile + has_many :circles, :through => :profile_followers # has_many :followers, -> { uniq }, :through => :profile_followers, :source => :person @@ -1010,10 +997,6 @@ private :generate_url, :url_options self.active_fields end - def followed_by?(person) - (person == self) || (person.in? self.followers) - end - def in_social_circle?(person) (person == self) || (person.is_member_of?(self)) end @@ -1057,7 +1040,4 @@ private :generate_url, :url_options person.kind_of?(Profile) && person.has_permission?('destroy_profile', self) end - def in_circle?(circle) - circle.in? self.circles - end end diff --git a/test/unit/follower_test.rb b/test/unit/follower_test.rb index d49fff1..c0ae8ec 100644 --- a/test/unit/follower_test.rb +++ b/test/unit/follower_test.rb @@ -150,14 +150,10 @@ class FollowerTest < ActiveSupport::TestCase assert_equivalent [@circle1, @circle2], @person2.circles end - should 'external person be followable' do - person = fast_create(Person, :environment_id => Environment.default.id) - circle = Circle.create(owner: @external_person, profile_type: "Person", name: "FRIENDSSS") - pf = ProfileFollower.create(profile: @external_person, circle: circle) - assert person.follows? @external_person - - # assert_difference 'ProfileFollower.all.count' do - # person.follow(@external_person, circle) - # end + should 'follow External Person' do + assert_difference 'ProfileFollower.count' do + @person1.follow(@external_person, @circle1) + end + assert @person1.follows? @external_person end end -- libgit2 0.21.2