Commit 86bb3bc1c4f75ebe9e32f96ee0e651a4d003258f
1 parent
d3836bc2
Exists in
master
and in
29 other branches
Finish the new implementation of hotspot behaviour
Undo some things, fix some tests, etc
Showing
9 changed files
with
29 additions
and
70 deletions
Show diff stats
app/models/person.rb
| ... | ... | @@ -22,8 +22,6 @@ class Person < Profile |
| 22 | 22 | super |
| 23 | 23 | end |
| 24 | 24 | |
| 25 | - acts_as_having_hotspots | |
| 26 | - | |
| 27 | 25 | named_scope :members_of, lambda { |resources| |
| 28 | 26 | resources = [resources] if !resources.kind_of?(Array) |
| 29 | 27 | conditions = resources.map {|resource| "role_assignments.resource_type = '#{resource.class.base_class.name}' AND role_assignments.resource_id = #{resource.id || -1}"}.join(' OR ') |
| ... | ... | @@ -32,7 +30,7 @@ class Person < Profile |
| 32 | 30 | |
| 33 | 31 | def has_permission_with_plugins?(permission, profile) |
| 34 | 32 | permissions = [has_permission_without_plugins?(permission, profile)] |
| 35 | - permissions += enabled_plugins.map do |plugin| | |
| 33 | + permissions += plugins.map do |plugin| | |
| 36 | 34 | plugin.has_permission?(self, permission, profile) |
| 37 | 35 | end |
| 38 | 36 | permissions.include?(true) | ... | ... |
app/models/profile.rb
| ... | ... | @@ -60,7 +60,8 @@ class Profile < ActiveRecord::Base |
| 60 | 60 | } |
| 61 | 61 | |
| 62 | 62 | acts_as_accessible |
| 63 | - acts_as_having_hotspots | |
| 63 | + | |
| 64 | + include Noosfero::Plugin::HotSpot | |
| 64 | 65 | |
| 65 | 66 | named_scope :memberships_of, lambda { |person| { :select => 'DISTINCT profiles.*', :joins => :role_assignments, :conditions => ['role_assignments.accessor_type = ? AND role_assignments.accessor_id = ?', person.class.base_class.name, person.id ] } } |
| 66 | 67 | #FIXME: these will work only if the subclass is already loaded |
| ... | ... | @@ -69,7 +70,7 @@ class Profile < ActiveRecord::Base |
| 69 | 70 | named_scope :templates, :conditions => {:is_template => true} |
| 70 | 71 | |
| 71 | 72 | def members |
| 72 | - scopes = dispatch_scopes(:organization_members, self) | |
| 73 | + scopes = plugins.dispatch_scopes(:organization_members, self) | |
| 73 | 74 | scopes << Person.members_of(self) |
| 74 | 75 | scopes.size == 1 ? scopes.first : Person.or_scope(scopes) |
| 75 | 76 | end | ... | ... |
config/initializers/plugins.rb
lib/noosfero/plugin/acts_as_having_hotspots.rb
| ... | ... | @@ -1,44 +0,0 @@ |
| 1 | -module ActsAsHavingHotspots | |
| 2 | - module ClassMethods | |
| 3 | - # Adding this feature to a class demands that it defines an instance method | |
| 4 | - # 'environment' that returns the environment associated with the instance. | |
| 5 | - def acts_as_having_hotspots | |
| 6 | - send :include, InstanceMethods | |
| 7 | - end | |
| 8 | - | |
| 9 | - module InstanceMethods | |
| 10 | - # Dispatches +event+ to each enabled plugin and collect the results. | |
| 11 | - # | |
| 12 | - # Returns an Array containing the objects returned by the event method in | |
| 13 | - # each plugin. This array is compacted (i.e. nils are removed) and flattened | |
| 14 | - # (i.e. elements of arrays are added to the resulting array). For example, if | |
| 15 | - # the enabled plugins return 1, 0, nil, and [1,2,3], then this method will | |
| 16 | - # return [1,0,1,2,3] | |
| 17 | - # | |
| 18 | - def dispatch(event, *args) | |
| 19 | - enabled_plugins.map { |plugin| plugin.send(event, *args) }.compact.flatten | |
| 20 | - end | |
| 21 | - | |
| 22 | - # Dispatch without flatten since scopes are executed if you run flatten on them | |
| 23 | - def dispatch_scopes(event, *args) | |
| 24 | - enabled_plugins.map { |plugin| plugin.send(event, *args) }.compact | |
| 25 | - end | |
| 26 | - | |
| 27 | - def enabled_plugins | |
| 28 | - Thread.current[:enabled_plugins] ||= (Noosfero::Plugin.all & environment.enabled_plugins).map do |plugin_name| | |
| 29 | - plugin = plugin_name.constantize.new | |
| 30 | - plugin.context = context | |
| 31 | - plugin | |
| 32 | - end | |
| 33 | - end | |
| 34 | - | |
| 35 | - if !method_defined?(:context) | |
| 36 | - define_method(:context) do | |
| 37 | - Noosfero::Plugin::Context.new | |
| 38 | - end | |
| 39 | - end | |
| 40 | - end | |
| 41 | - end | |
| 42 | -end | |
| 43 | - | |
| 44 | -ActiveRecord::Base.send(:extend, ActsAsHavingHotspots::ClassMethods) |
lib/noosfero/plugin/manager.rb
| ... | ... | @@ -8,7 +8,6 @@ class Noosfero::Plugin::Manager |
| 8 | 8 | @constantize = context |
| 9 | 9 | end |
| 10 | 10 | |
| 11 | - delegate :environment, :to => :context | |
| 12 | 11 | delegate :each, :to => :enabled_plugins |
| 13 | 12 | include Enumerable |
| 14 | 13 | |
| ... | ... | @@ -21,9 +20,15 @@ class Noosfero::Plugin::Manager |
| 21 | 20 | # return [1,0,1,2,3] |
| 22 | 21 | # |
| 23 | 22 | def dispatch(event, *args) |
| 24 | - map { |plugin| plugin.send(event, *args) }.compact.flatten | |
| 23 | + dispatch_without_flatten(event, *args).flatten | |
| 25 | 24 | end |
| 26 | 25 | |
| 26 | + def dispatch_without_flatten(event, *args) | |
| 27 | + map { |plugin| plugin.send(event, *args) }.compact | |
| 28 | + end | |
| 29 | + | |
| 30 | + alias :dispatch_scopes :dispatch_without_flatten | |
| 31 | + | |
| 27 | 32 | def enabled_plugins |
| 28 | 33 | @enabled_plugins ||= (Noosfero::Plugin.all & environment.enabled_plugins).map do |plugin| |
| 29 | 34 | p = plugin.constantize.new | ... | ... |
test/functional/content_viewer_controller_test.rb
| ... | ... | @@ -1410,8 +1410,8 @@ end |
| 1410 | 1410 | |
| 1411 | 1411 | should 'not display comments marked as spam' do |
| 1412 | 1412 | article = fast_create(Article, :profile_id => profile.id) |
| 1413 | - ham = fast_create(Comment, :source_id => article.id) | |
| 1414 | - spam = fast_create(Comment, :source_id => article.id, :spam => true) | |
| 1413 | + ham = fast_create(Comment, :source_id => article.id, :source_type => 'Article') | |
| 1414 | + spam = fast_create(Comment, :source_id => article.id, :source_type => 'Article', :spam => true) | |
| 1415 | 1415 | |
| 1416 | 1416 | get 'view_page', :profile => profile.identifier, :page => article.path.split('/') |
| 1417 | 1417 | assert_equal 1, assigns(:comments_count) |
| ... | ... | @@ -1420,7 +1420,7 @@ end |
| 1420 | 1420 | should 'be able to mark comments as spam' do |
| 1421 | 1421 | login_as profile.identifier |
| 1422 | 1422 | article = fast_create(Article, :profile_id => profile.id) |
| 1423 | - spam = fast_create(Comment, :name => 'foo', :email => 'foo@example.com', :source_id => article.id) | |
| 1423 | + spam = fast_create(Comment, :name => 'foo', :email => 'foo@example.com', :source_id => article.id, :source_type => 'Article') | |
| 1424 | 1424 | |
| 1425 | 1425 | post 'view_page', :profile => profile.identifier, :page => article.path.split('/'), :mark_comment_as_spam => spam.id |
| 1426 | 1426 | ... | ... |
test/unit/content_viewer_helper_test.rb
| ... | ... | @@ -61,9 +61,9 @@ class ContentViewerHelperTest < ActiveSupport::TestCase |
| 61 | 61 | end |
| 62 | 62 | |
| 63 | 63 | should 'count total of comments from post' do |
| 64 | - article = TextileArticle.new(:name => 'first post for test', :body => 'first post for test', :profile => profile) | |
| 64 | + article = fast_create(TextileArticle) | |
| 65 | 65 | article.stubs(:url).returns({}) |
| 66 | - article.stubs(:comments).returns([Comment.new(:author => profile, :title => 'test', :body => 'test')]) | |
| 66 | + article.comments.create!(:author => profile, :title => 'test', :body => 'test') | |
| 67 | 67 | result = link_to_comments(article) |
| 68 | 68 | assert_match /One comment/, result |
| 69 | 69 | end | ... | ... |
test/unit/plugin_manager_test.rb
| ... | ... | @@ -12,6 +12,7 @@ class PluginManagerTest < ActiveSupport::TestCase |
| 12 | 12 | @manager = Noosfero::Plugin::Manager.new(@environment, @controller) |
| 13 | 13 | end |
| 14 | 14 | attr_reader :environment |
| 15 | + attr_reader :manager | |
| 15 | 16 | |
| 16 | 17 | should 'return the intersection between environment\'s enabled plugins and system available plugins' do |
| 17 | 18 | class Plugin1 < Noosfero::Plugin; end; |
| ... | ... | @@ -20,7 +21,6 @@ class PluginManagerTest < ActiveSupport::TestCase |
| 20 | 21 | class Plugin4 < Noosfero::Plugin; end; |
| 21 | 22 | environment.stubs(:enabled_plugins).returns([Plugin1.to_s, Plugin2.to_s, Plugin4.to_s]) |
| 22 | 23 | Noosfero::Plugin.stubs(:all).returns([Plugin1.to_s, Plugin3.to_s, Plugin4.to_s]) |
| 23 | - manager = Noosfero::Plugin::Manager.new(@controller) | |
| 24 | 24 | plugins = manager.enabled_plugins.map { |instance| instance.class.to_s } |
| 25 | 25 | assert_equal [Plugin1.to_s, Plugin4.to_s], plugins |
| 26 | 26 | end |
| ... | ... | @@ -49,7 +49,6 @@ class PluginManagerTest < ActiveSupport::TestCase |
| 49 | 49 | |
| 50 | 50 | p1 = Plugin1.new |
| 51 | 51 | p2 = Plugin2.new |
| 52 | - manager = Noosfero::Plugin::Manager.new(@controller) | |
| 53 | 52 | |
| 54 | 53 | assert_equal [p1.random_event, p2.random_event], manager.dispatch(:random_event) |
| 55 | 54 | end | ... | ... |
test/unit/profile_test.rb
| ... | ... | @@ -1834,16 +1834,6 @@ class ProfileTest < ActiveSupport::TestCase |
| 1834 | 1834 | end |
| 1835 | 1835 | |
| 1836 | 1836 | should 'merge members of plugins to original members' do |
| 1837 | - original_community = fast_create(Community) | |
| 1838 | - community1 = fast_create(Community, :identifier => 'community1') | |
| 1839 | - community2 = fast_create(Community, :identifier => 'community2') | |
| 1840 | - original_member = fast_create(Person) | |
| 1841 | - plugin1_member = fast_create(Person) | |
| 1842 | - plugin2_member = fast_create(Person) | |
| 1843 | - original_community.add_member(original_member) | |
| 1844 | - community1.add_member(plugin1_member) | |
| 1845 | - community2.add_member(plugin2_member) | |
| 1846 | - | |
| 1847 | 1837 | class Plugin1 < Noosfero::Plugin |
| 1848 | 1838 | def organization_members(profile) |
| 1849 | 1839 | Person.members_of(Community.find_by_identifier('community1')) |
| ... | ... | @@ -1855,8 +1845,18 @@ class ProfileTest < ActiveSupport::TestCase |
| 1855 | 1845 | Person.members_of(Community.find_by_identifier('community2')) |
| 1856 | 1846 | end |
| 1857 | 1847 | end |
| 1848 | + Environment.default.enable_plugin(Plugin1) | |
| 1849 | + Environment.default.enable_plugin(Plugin2) | |
| 1858 | 1850 | |
| 1859 | - original_community.stubs(:enabled_plugins).returns([Plugin1.new, Plugin2.new]) | |
| 1851 | + original_community = fast_create(Community) | |
| 1852 | + community1 = fast_create(Community, :identifier => 'community1') | |
| 1853 | + community2 = fast_create(Community, :identifier => 'community2') | |
| 1854 | + original_member = fast_create(Person) | |
| 1855 | + plugin1_member = fast_create(Person) | |
| 1856 | + plugin2_member = fast_create(Person) | |
| 1857 | + original_community.add_member(original_member) | |
| 1858 | + community1.add_member(plugin1_member) | |
| 1859 | + community2.add_member(plugin2_member) | |
| 1860 | 1860 | |
| 1861 | 1861 | assert_includes original_community.members, original_member |
| 1862 | 1862 | assert_includes original_community.members, plugin1_member | ... | ... |