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 | ... | ... |