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,8 +22,6 @@ class Person < Profile | ||
22 | super | 22 | super |
23 | end | 23 | end |
24 | 24 | ||
25 | - acts_as_having_hotspots | ||
26 | - | ||
27 | named_scope :members_of, lambda { |resources| | 25 | named_scope :members_of, lambda { |resources| |
28 | resources = [resources] if !resources.kind_of?(Array) | 26 | resources = [resources] if !resources.kind_of?(Array) |
29 | conditions = resources.map {|resource| "role_assignments.resource_type = '#{resource.class.base_class.name}' AND role_assignments.resource_id = #{resource.id || -1}"}.join(' OR ') | 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,7 +30,7 @@ class Person < Profile | ||
32 | 30 | ||
33 | def has_permission_with_plugins?(permission, profile) | 31 | def has_permission_with_plugins?(permission, profile) |
34 | permissions = [has_permission_without_plugins?(permission, profile)] | 32 | permissions = [has_permission_without_plugins?(permission, profile)] |
35 | - permissions += enabled_plugins.map do |plugin| | 33 | + permissions += plugins.map do |plugin| |
36 | plugin.has_permission?(self, permission, profile) | 34 | plugin.has_permission?(self, permission, profile) |
37 | end | 35 | end |
38 | permissions.include?(true) | 36 | permissions.include?(true) |
app/models/profile.rb
@@ -60,7 +60,8 @@ class Profile < ActiveRecord::Base | @@ -60,7 +60,8 @@ class Profile < ActiveRecord::Base | ||
60 | } | 60 | } |
61 | 61 | ||
62 | acts_as_accessible | 62 | acts_as_accessible |
63 | - acts_as_having_hotspots | 63 | + |
64 | + include Noosfero::Plugin::HotSpot | ||
64 | 65 | ||
65 | 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 | 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 | #FIXME: these will work only if the subclass is already loaded | 67 | #FIXME: these will work only if the subclass is already loaded |
@@ -69,7 +70,7 @@ class Profile < ActiveRecord::Base | @@ -69,7 +70,7 @@ class Profile < ActiveRecord::Base | ||
69 | named_scope :templates, :conditions => {:is_template => true} | 70 | named_scope :templates, :conditions => {:is_template => true} |
70 | 71 | ||
71 | def members | 72 | def members |
72 | - scopes = dispatch_scopes(:organization_members, self) | 73 | + scopes = plugins.dispatch_scopes(:organization_members, self) |
73 | scopes << Person.members_of(self) | 74 | scopes << Person.members_of(self) |
74 | scopes.size == 1 ? scopes.first : Person.or_scope(scopes) | 75 | scopes.size == 1 ? scopes.first : Person.or_scope(scopes) |
75 | end | 76 | end |
config/initializers/plugins.rb
1 | require 'noosfero/plugin' | 1 | require 'noosfero/plugin' |
2 | -require 'noosfero/plugin/acts_as_having_hotspots' | 2 | +require 'noosfero/plugin/hot_spot' |
3 | require 'noosfero/plugin/manager' | 3 | require 'noosfero/plugin/manager' |
4 | require 'noosfero/plugin/active_record' | 4 | require 'noosfero/plugin/active_record' |
5 | require 'noosfero/plugin/mailer_base' | 5 | require 'noosfero/plugin/mailer_base' |
lib/noosfero/plugin/acts_as_having_hotspots.rb
@@ -1,44 +0,0 @@ | @@ -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,7 +8,6 @@ class Noosfero::Plugin::Manager | ||
8 | @constantize = context | 8 | @constantize = context |
9 | end | 9 | end |
10 | 10 | ||
11 | - delegate :environment, :to => :context | ||
12 | delegate :each, :to => :enabled_plugins | 11 | delegate :each, :to => :enabled_plugins |
13 | include Enumerable | 12 | include Enumerable |
14 | 13 | ||
@@ -21,9 +20,15 @@ class Noosfero::Plugin::Manager | @@ -21,9 +20,15 @@ class Noosfero::Plugin::Manager | ||
21 | # return [1,0,1,2,3] | 20 | # return [1,0,1,2,3] |
22 | # | 21 | # |
23 | def dispatch(event, *args) | 22 | def dispatch(event, *args) |
24 | - map { |plugin| plugin.send(event, *args) }.compact.flatten | 23 | + dispatch_without_flatten(event, *args).flatten |
25 | end | 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 | def enabled_plugins | 32 | def enabled_plugins |
28 | @enabled_plugins ||= (Noosfero::Plugin.all & environment.enabled_plugins).map do |plugin| | 33 | @enabled_plugins ||= (Noosfero::Plugin.all & environment.enabled_plugins).map do |plugin| |
29 | p = plugin.constantize.new | 34 | p = plugin.constantize.new |
test/functional/content_viewer_controller_test.rb
@@ -1410,8 +1410,8 @@ end | @@ -1410,8 +1410,8 @@ end | ||
1410 | 1410 | ||
1411 | should 'not display comments marked as spam' do | 1411 | should 'not display comments marked as spam' do |
1412 | article = fast_create(Article, :profile_id => profile.id) | 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 | get 'view_page', :profile => profile.identifier, :page => article.path.split('/') | 1416 | get 'view_page', :profile => profile.identifier, :page => article.path.split('/') |
1417 | assert_equal 1, assigns(:comments_count) | 1417 | assert_equal 1, assigns(:comments_count) |
@@ -1420,7 +1420,7 @@ end | @@ -1420,7 +1420,7 @@ end | ||
1420 | should 'be able to mark comments as spam' do | 1420 | should 'be able to mark comments as spam' do |
1421 | login_as profile.identifier | 1421 | login_as profile.identifier |
1422 | article = fast_create(Article, :profile_id => profile.id) | 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 | post 'view_page', :profile => profile.identifier, :page => article.path.split('/'), :mark_comment_as_spam => spam.id | 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,9 +61,9 @@ class ContentViewerHelperTest < ActiveSupport::TestCase | ||
61 | end | 61 | end |
62 | 62 | ||
63 | should 'count total of comments from post' do | 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 | article.stubs(:url).returns({}) | 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 | result = link_to_comments(article) | 67 | result = link_to_comments(article) |
68 | assert_match /One comment/, result | 68 | assert_match /One comment/, result |
69 | end | 69 | end |
test/unit/plugin_manager_test.rb
@@ -12,6 +12,7 @@ class PluginManagerTest < ActiveSupport::TestCase | @@ -12,6 +12,7 @@ class PluginManagerTest < ActiveSupport::TestCase | ||
12 | @manager = Noosfero::Plugin::Manager.new(@environment, @controller) | 12 | @manager = Noosfero::Plugin::Manager.new(@environment, @controller) |
13 | end | 13 | end |
14 | attr_reader :environment | 14 | attr_reader :environment |
15 | + attr_reader :manager | ||
15 | 16 | ||
16 | should 'return the intersection between environment\'s enabled plugins and system available plugins' do | 17 | should 'return the intersection between environment\'s enabled plugins and system available plugins' do |
17 | class Plugin1 < Noosfero::Plugin; end; | 18 | class Plugin1 < Noosfero::Plugin; end; |
@@ -20,7 +21,6 @@ class PluginManagerTest < ActiveSupport::TestCase | @@ -20,7 +21,6 @@ class PluginManagerTest < ActiveSupport::TestCase | ||
20 | class Plugin4 < Noosfero::Plugin; end; | 21 | class Plugin4 < Noosfero::Plugin; end; |
21 | environment.stubs(:enabled_plugins).returns([Plugin1.to_s, Plugin2.to_s, Plugin4.to_s]) | 22 | environment.stubs(:enabled_plugins).returns([Plugin1.to_s, Plugin2.to_s, Plugin4.to_s]) |
22 | Noosfero::Plugin.stubs(:all).returns([Plugin1.to_s, Plugin3.to_s, Plugin4.to_s]) | 23 | Noosfero::Plugin.stubs(:all).returns([Plugin1.to_s, Plugin3.to_s, Plugin4.to_s]) |
23 | - manager = Noosfero::Plugin::Manager.new(@controller) | ||
24 | plugins = manager.enabled_plugins.map { |instance| instance.class.to_s } | 24 | plugins = manager.enabled_plugins.map { |instance| instance.class.to_s } |
25 | assert_equal [Plugin1.to_s, Plugin4.to_s], plugins | 25 | assert_equal [Plugin1.to_s, Plugin4.to_s], plugins |
26 | end | 26 | end |
@@ -49,7 +49,6 @@ class PluginManagerTest < ActiveSupport::TestCase | @@ -49,7 +49,6 @@ class PluginManagerTest < ActiveSupport::TestCase | ||
49 | 49 | ||
50 | p1 = Plugin1.new | 50 | p1 = Plugin1.new |
51 | p2 = Plugin2.new | 51 | p2 = Plugin2.new |
52 | - manager = Noosfero::Plugin::Manager.new(@controller) | ||
53 | 52 | ||
54 | assert_equal [p1.random_event, p2.random_event], manager.dispatch(:random_event) | 53 | assert_equal [p1.random_event, p2.random_event], manager.dispatch(:random_event) |
55 | end | 54 | end |
test/unit/profile_test.rb
@@ -1834,16 +1834,6 @@ class ProfileTest < ActiveSupport::TestCase | @@ -1834,16 +1834,6 @@ class ProfileTest < ActiveSupport::TestCase | ||
1834 | end | 1834 | end |
1835 | 1835 | ||
1836 | should 'merge members of plugins to original members' do | 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 | class Plugin1 < Noosfero::Plugin | 1837 | class Plugin1 < Noosfero::Plugin |
1848 | def organization_members(profile) | 1838 | def organization_members(profile) |
1849 | Person.members_of(Community.find_by_identifier('community1')) | 1839 | Person.members_of(Community.find_by_identifier('community1')) |
@@ -1855,8 +1845,18 @@ class ProfileTest < ActiveSupport::TestCase | @@ -1855,8 +1845,18 @@ class ProfileTest < ActiveSupport::TestCase | ||
1855 | Person.members_of(Community.find_by_identifier('community2')) | 1845 | Person.members_of(Community.find_by_identifier('community2')) |
1856 | end | 1846 | end |
1857 | end | 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 | assert_includes original_community.members, original_member | 1861 | assert_includes original_community.members, original_member |
1862 | assert_includes original_community.members, plugin1_member | 1862 | assert_includes original_community.members, plugin1_member |