Commit f2fd0dc184403962a3e73253d321e9d914d1deec

Authored by Antonio Terceiro
2 parents 06e61860 10af872d

Merge branch 'stable'

app/controllers/my_profile/profile_members_controller.rb
@@ -8,7 +8,7 @@ class ProfileMembersController < MyProfileController @@ -8,7 +8,7 @@ class ProfileMembersController < MyProfileController
8 end 8 end
9 9
10 def update_roles 10 def update_roles
11 - @roles = params[:roles] ? environment.roles.find(params[:roles]) : [] 11 + @roles = params[:roles] ? environment.roles.find(params[:roles].select{|r|!r.to_i.zero?}) : []
12 @roles = @roles.select{|r| r.has_kind?('Profile') } 12 @roles = @roles.select{|r| r.has_kind?('Profile') }
13 @person = profile.members.find { |m| m.id == params[:person].to_i } 13 @person = profile.members.find { |m| m.id == params[:person].to_i }
14 if @person && @person.define_roles(@roles, profile) 14 if @person && @person.define_roles(@roles, profile)
app/helpers/catalog_helper.rb
@@ -23,7 +23,7 @@ private @@ -23,7 +23,7 @@ private
23 23
24 def product_category_name(profile, product_category) 24 def product_category_name(profile, product_category)
25 if profile.enabled? 25 if profile.enabled?
26 - link_to_category(product_category) 26 + link_to_product_category(product_category)
27 else 27 else
28 product_category ? product_category.full_name(' → ') : _('Uncategorized product') 28 product_category ? product_category.full_name(' → ') : _('Uncategorized product')
29 end 29 end
app/helpers/display_helper.rb
@@ -14,6 +14,14 @@ module DisplayHelper @@ -14,6 +14,14 @@ module DisplayHelper
14 link_to name, Noosfero.url_options.merge({:controller => 'search', :action => 'category_index', :category_path => category.path.split('/'),:host => category.environment.default_hostname }) 14 link_to name, Noosfero.url_options.merge({:controller => 'search', :action => 'category_index', :category_path => category.path.split('/'),:host => category.environment.default_hostname })
15 end 15 end
16 16
  17 + def link_to_product_category(category)
  18 + if category
  19 + link_to(category.name, :controller => 'search', :action => 'assets', :asset => 'products', :product_category => category.id, :host => category.environment.default_hostname)
  20 + else
  21 + _('Uncategorized product')
  22 + end
  23 + end
  24 +
17 def txt2html(txt) 25 def txt2html(txt)
18 txt. 26 txt.
19 gsub( /\n\s*\n/, ' <p/> ' ). 27 gsub( /\n\s*\n/, ' <p/> ' ).
app/models/add_member.rb
@@ -12,7 +12,7 @@ class AddMember &lt; Task @@ -12,7 +12,7 @@ class AddMember &lt; Task
12 12
13 def perform 13 def perform
14 self.roles ||= [Profile::Roles.member(organization.environment.id).id] 14 self.roles ||= [Profile::Roles.member(organization.environment.id).id]
15 - target.affiliate(requestor, self.roles.map{|i| Role.find(i)}) 15 + target.affiliate(requestor, self.roles.select{|r| !r.to_i.zero? }.map{|i| Role.find(i)})
16 end 16 end
17 17
18 def description 18 def description
app/models/approve_article.rb
@@ -52,7 +52,7 @@ class ApproveArticle &lt; Task @@ -52,7 +52,7 @@ class ApproveArticle &lt; Task
52 end 52 end
53 53
54 def article_parent= value 54 def article_parent= value
55 - article_parent_id = value.id 55 + self.article_parent_id = value.id
56 end 56 end
57 57
58 def highlighted= value 58 def highlighted= value
app/models/article.rb
@@ -54,7 +54,7 @@ class Article &lt; ActiveRecord::Base @@ -54,7 +54,7 @@ class Article &lt; ActiveRecord::Base
54 def category_ids=(ids) 54 def category_ids=(ids)
55 ArticleCategorization.remove_all_for(self) 55 ArticleCategorization.remove_all_for(self)
56 ids.uniq.each do |item| 56 ids.uniq.each do |item|
57 - add_category(Category.find(item)) 57 + add_category(Category.find(item)) unless item.to_i.zero?
58 end 58 end
59 end 59 end
60 60
app/models/profile.rb
@@ -176,7 +176,7 @@ class Profile &lt; ActiveRecord::Base @@ -176,7 +176,7 @@ class Profile &lt; ActiveRecord::Base
176 def category_ids=(ids) 176 def category_ids=(ids)
177 ProfileCategorization.remove_all_for(self) 177 ProfileCategorization.remove_all_for(self)
178 ids.uniq.each do |item| 178 ids.uniq.each do |item|
179 - add_category(Category.find(item)) 179 + add_category(Category.find(item)) unless item.to_i.zero?
180 end 180 end
181 end 181 end
182 182
@@ -638,4 +638,9 @@ class Profile &lt; ActiveRecord::Base @@ -638,4 +638,9 @@ class Profile &lt; ActiveRecord::Base
638 ProfileSweeper.new().after_update(profile) 638 ProfileSweeper.new().after_update(profile)
639 end 639 end
640 640
  641 + # FIXME: horrible workaround to circular dependancy in environment.rb
  642 + after_create do |profile|
  643 + ProfileSweeper.new().after_create(profile)
  644 + end
  645 +
641 end 646 end
app/models/published_article.rb
@@ -18,7 +18,7 @@ class PublishedArticle &lt; Article @@ -18,7 +18,7 @@ class PublishedArticle &lt; Article
18 18
19 before_validation_on_create :update_name 19 before_validation_on_create :update_name
20 def update_name 20 def update_name
21 - self.name ||= self.reference_article.name 21 + self.name = self.reference_article.name if self.name.blank?
22 end 22 end
23 23
24 def author 24 def author
app/sweepers/profile_sweeper.rb
@@ -7,6 +7,10 @@ class ProfileSweeper # &lt; ActiveRecord::Observer @@ -7,6 +7,10 @@ class ProfileSweeper # &lt; ActiveRecord::Observer
7 expire_caches(profile) 7 expire_caches(profile)
8 end 8 end
9 9
  10 + def after_create(profile)
  11 + expire_statistics_block_cache(profile)
  12 + end
  13 +
10 protected 14 protected
11 15
12 def expire_caches(profile) 16 def expire_caches(profile)
@@ -19,4 +23,9 @@ protected @@ -19,4 +23,9 @@ protected
19 expire_timeout_fragment(block.cache_keys) 23 expire_timeout_fragment(block.cache_keys)
20 end 24 end
21 end 25 end
  26 +
  27 + def expire_statistics_block_cache(profile)
  28 + blocks = profile.environment.blocks.select { |b| b.kind_of?(EnvironmentStatisticsBlock) }
  29 + blocks.map(&:cache_keys).each{|ck|expire_timeout_fragment(ck)}
  30 + end
22 end 31 end
app/views/catalog/show.rhtml
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 <% end %> 15 <% end %>
16 16
17 <p class="product_category"> 17 <p class="product_category">
18 -<%= _('Category: %s ') % link_to_category(@product.product_category) %> 18 +<%= _('Category: %s ') % link_to_product_category(@product.product_category) %>
19 </p> 19 </p>
20 20
21 <% button_bar do %> 21 <% button_bar do %>
app/views/manage_products/index.rhtml
@@ -45,7 +45,7 @@ @@ -45,7 +45,7 @@
45 <% @consumptions.each do |consumption| %> 45 <% @consumptions.each do |consumption| %>
46 <tr> 46 <tr>
47 <td> 47 <td>
48 - <strong><%= link_to_category(consumption.product_category) %></strong> 48 + <strong><%= link_to_product_category(consumption.product_category) %></strong>
49 <br/> 49 <br/>
50 <em><%= consumption.aditional_specifications %></em> 50 <em><%= consumption.aditional_specifications %></em>
51 </td> 51 </td>
app/views/manage_products/show.rhtml
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 <p> <%= image_tag @product.image.public_filename if @product.image %> </p> 3 <p> <%= image_tag @product.image.public_filename if @product.image %> </p>
4 <p> <strong><%= _('Price:') %></strong> <%= @product.price %> </p> 4 <p> <strong><%= _('Price:') %></strong> <%= @product.price %> </p>
5 <p> <strong><%= _('Description:') %></strong> <%= txt2html @product.description if @product.description %> </p> 5 <p> <strong><%= _('Description:') %></strong> <%= txt2html @product.description if @product.description %> </p>
6 -<p> <strong><%= _('Category:') %></strong> <%= link_to_category(@product.product_category) %> </p> 6 +<p> <strong><%= _('Category:') %></strong> <%= link_to_product_category(@product.product_category) %> </p>
7 7
8 <%= button :back, _('back'), :action => 'index' %> 8 <%= button :back, _('back'), :action => 'index' %>
9 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 9 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
app/views/search/_product.rhtml
@@ -16,6 +16,6 @@ product_item_pos += 1 @@ -16,6 +16,6 @@ product_item_pos += 1
16 <% if product.enterprise %> 16 <% if product.enterprise %>
17 <li> <%= _('Suplier: %s') % link_to_homepage(product.enterprise.name, product.enterprise.identifier) %> </li> 17 <li> <%= _('Suplier: %s') % link_to_homepage(product.enterprise.name, product.enterprise.identifier) %> </li>
18 <% end %> 18 <% end %>
19 - <li> <%= _('Category:') + ' ' + (product.product_category ? link_to(product.product_category.name, :controller => 'search', :action => 'assets', :asset => 'products', :product_category => product.product_category.id) : _('Uncategorized product')) %> </li> 19 + <li> <%=_('Category:') + ' ' + link_to_product_category(product.product_category) %> </li>
20 </ul> 20 </ul>
21 </li> 21 </li>
lib/noosfero.rb
1 module Noosfero 1 module Noosfero
2 PROJECT = 'noosfero' 2 PROJECT = 'noosfero'
3 - VERSION = '0.19.1' 3 + VERSION = '0.19.2'
4 SVN_ROOT = 'https://svn.colivre.coop.br/svn/noosfero' 4 SVN_ROOT = 'https://svn.colivre.coop.br/svn/noosfero'
5 5
6 def self.pattern_for_controllers_in_directory(dir) 6 def self.pattern_for_controllers_in_directory(dir)
test/functional/catalog_controller_test.rb
@@ -12,6 +12,7 @@ class CatalogControllerTest &lt; Test::Unit::TestCase @@ -12,6 +12,7 @@ class CatalogControllerTest &lt; Test::Unit::TestCase
12 12
13 @enterprise = Enterprise.create!(:name => 'My enterprise', :identifier => 'testent') 13 @enterprise = Enterprise.create!(:name => 'My enterprise', :identifier => 'testent')
14 end 14 end
  15 + attr_accessor :enterprise
15 16
16 def test_local_files_reference 17 def test_local_files_reference
17 ent = Enterprise.create!(:identifier => 'test_enterprise1', :name => 'Test enteprise1') 18 ent = Enterprise.create!(:identifier => 'test_enterprise1', :name => 'Test enteprise1')
@@ -113,4 +114,20 @@ class CatalogControllerTest &lt; Test::Unit::TestCase @@ -113,4 +114,20 @@ class CatalogControllerTest &lt; Test::Unit::TestCase
113 end 114 end
114 end 115 end
115 116
  117 + should 'link to assets products wiht product category in the link to product category on index' do
  118 + pc = ProductCategory.create!(:name => 'some product', :environment => enterprise.environment)
  119 + prod = enterprise.products.create!(:name => 'Product test', :price => 50.00, :product_category => pc)
  120 +
  121 + get :index, :profile => enterprise.identifier
  122 + assert_tag :tag => 'a', :attributes => {:href => /assets\/products\?product_category=#{pc.id}/}
  123 + end
  124 +
  125 + should 'link to assets products wiht product category in the link to product category on show' do
  126 + pc = ProductCategory.create!(:name => 'some product', :environment => enterprise.environment)
  127 + prod = enterprise.products.create!(:name => 'Product test', :price => 50.00, :product_category => pc)
  128 +
  129 + get :show, :id => prod.id, :profile => enterprise.identifier
  130 + assert_tag :tag => 'a', :attributes => {:href => /assets\/products\?product_category=#{pc.id}/}
  131 + end
  132 +
116 end 133 end
test/functional/manage_products_controller_test.rb
@@ -274,5 +274,23 @@ class ManageProductsControllerTest &lt; Test::Unit::TestCase @@ -274,5 +274,23 @@ class ManageProductsControllerTest &lt; Test::Unit::TestCase
274 274
275 assert_equivalent [pc1, pc2], assigns(:categories) 275 assert_equivalent [pc1, pc2], assigns(:categories)
276 end 276 end
  277 +
  278 + should 'links to products asset for consumption link' do
  279 + pc = ProductCategory.create!(:name => 'test_category', :environment =>@enterprise.environment)
  280 + @enterprise.consumptions.create!(:product_category => pc)
  281 +
  282 + get :index, :profile => @enterprise.identifier
  283 +
  284 + assert_tag :tag => 'a', :attributes => {:href => /assets\/products\?product_category=#{pc.id}/}
  285 + end
  286 +
  287 + should 'links to products asset for product category link when showing' do
  288 + pc = ProductCategory.create!(:name => 'test_category', :environment =>@enterprise.environment)
  289 + p = @enterprise.products.create!(:name => 'test product', :product_category => pc)
  290 +
  291 + get :show, :profile => @enterprise.identifier, :id => p.id
  292 +
  293 + assert_tag :tag => 'a', :attributes => {:href => /assets\/products\?product_category=#{pc.id}/}
  294 + end
277 295
278 end 296 end
test/functional/profile_members_controller_test.rb
@@ -253,4 +253,16 @@ class ProfileMembersControllerTest &lt; Test::Unit::TestCase @@ -253,4 +253,16 @@ class ProfileMembersControllerTest &lt; Test::Unit::TestCase
253 assert_includes assigns(:users_found), daniela 253 assert_includes assigns(:users_found), daniela
254 end 254 end
255 255
  256 + should 'ignore roles with id zero' do
  257 + ent = Enterprise.create!(:name => 'Test Ent', :identifier => 'test_ent')
  258 + p = create_user_with_permission('test_user', 'manage_memberships', ent)
  259 + login_as :test_user
  260 + r = ent.environment.roles.create!(:name => 'test_role', :permissions => ['some_perm'])
  261 + get :update_roles, :profile => ent.identifier, :person => p.id, :roles => ["0", r.id, nil]
  262 +
  263 + p_roles = p.find_roles(ent).map(&:role).uniq
  264 +
  265 + assert p_roles, [r]
  266 + end
  267 +
256 end 268 end
test/functional/tasks_controller_test.rb
@@ -203,4 +203,24 @@ class TasksControllerTest &lt; Test::Unit::TestCase @@ -203,4 +203,24 @@ class TasksControllerTest &lt; Test::Unit::TestCase
203 assert_not_nil PublishedArticle.find(:first) 203 assert_not_nil PublishedArticle.find(:first)
204 end 204 end
205 205
  206 + should 'handle blank names for published articles' do
  207 + c = Community.create!(:name => 'test comm')
  208 + @controller.stubs(:profile).returns(c)
  209 + c.affiliate(profile, Profile::Roles.all_roles(c.environment))
  210 + person = create_user('test_user').person
  211 + p_blog = Blog.create!(:profile => person)
  212 + c_blog1 = Blog.create!(:profile => c)
  213 + c_blog2 = Blog.new(:profile => c); c_blog2.name = 'blog2'; c_blog2.save!
  214 +
  215 + article = person.articles.create!(:name => 'test article', :parent => p_blog)
  216 + a = ApproveArticle.create!(:article => article, :target => c, :requestor => person)
  217 + assert_includes c.tasks, a
  218 +
  219 + assert_difference PublishedArticle, :count do
  220 + post :close, {"commit"=>"Ok!", "id"=> a.id.to_s, "task"=>{"name"=>"", "closing_statment"=>"", "highlighted"=>"0", "article_parent_id"=>c_blog2.id.to_s}, "decision"=>"finish"}
  221 + end
  222 + assert p_article = PublishedArticle.find_by_reference_article_id(article.id)
  223 + assert_includes c_blog2.children(true), p_article
  224 + end
  225 +
206 end 226 end
test/unit/add_member_test.rb
@@ -95,4 +95,17 @@ class AddMemberTest &lt; ActiveSupport::TestCase @@ -95,4 +95,17 @@ class AddMemberTest &lt; ActiveSupport::TestCase
95 end 95 end
96 end 96 end
97 97
  98 + should 'ignore roles with id zero' do
  99 + p = create_user('testuser1').person
  100 + c = Community.create!(:name => 'community_test')
  101 +
  102 + role = Profile::Roles.member(c.environment.id)
  103 + TaskMailer.stubs(:deliver_target_notification)
  104 + task = AddMember.create!(:roles => ["0", role.id, nil], :person => p, :organization => c)
  105 + task.finish
  106 +
  107 + current_roles = p.find_roles(c).map(&:role)
  108 + assert_includes current_roles, role
  109 + end
  110 +
98 end 111 end
test/unit/approve_article_test.rb
@@ -63,4 +63,22 @@ class ApproveArticleTest &lt; ActiveSupport::TestCase @@ -63,4 +63,22 @@ class ApproveArticleTest &lt; ActiveSupport::TestCase
63 assert_match /text was removed/, a.description 63 assert_match /text was removed/, a.description
64 end 64 end
65 65
  66 + should 'preserve article_parent' do
  67 + profile = create_user('test_user').person
  68 + article = profile.articles.create!(:name => 'test article')
  69 + a = ApproveArticle.new(:article_parent => article)
  70 +
  71 + assert_equal article, a.article_parent
  72 + end
  73 +
  74 + should 'handle blank names' do
  75 + profile = create_user('test_user').person
  76 + article = profile.articles.create!(:name => 'test article')
  77 + community = Community.create!(:name => 'test comm')
  78 + a = ApproveArticle.create!(:name => '', :article => article, :target => community, :requestor => profile)
  79 +
  80 + assert_difference PublishedArticle, :count do
  81 + a.finish
  82 + end
  83 + end
66 end 84 end
test/unit/article_test.rb
@@ -741,4 +741,12 @@ class ArticleTest &lt; Test::Unit::TestCase @@ -741,4 +741,12 @@ class ArticleTest &lt; Test::Unit::TestCase
741 assert_not_includes as, a1 741 assert_not_includes as, a1
742 end 742 end
743 743
  744 + should 'ignore category with zero as id' do
  745 + a = profile.articles.create!(:name => 'a test article')
  746 + c = Category.create!(:name => 'test category', :environment => profile.environment)
  747 + a.category_ids = ['0', c.id, nil]
  748 + assert a.save
  749 + assert_equal [c], a.categories
  750 + end
  751 +
744 end 752 end
test/unit/category_test.rb
@@ -288,9 +288,9 @@ class CategoryTest &lt; Test::Unit::TestCase @@ -288,9 +288,9 @@ class CategoryTest &lt; Test::Unit::TestCase
288 c = @env.categories.build(:name => 'my category'); c.save! 288 c = @env.categories.build(:name => 'my category'); c.save!
289 person = create_user('testuser').person 289 person = create_user('testuser').person
290 290
291 - a1 = person.articles.build(:name => 'art1', :category_ids => [c]); a1.save!  
292 - a2 = person.articles.build(:name => 'art2', :category_ids => [c]); a2.save!  
293 - a3 = person.articles.build(:name => 'art3', :category_ids => [c]); a3.save! 291 + a1 = person.articles.build(:name => 'art1', :category_ids => [c.id]); a1.save!
  292 + a2 = person.articles.build(:name => 'art2', :category_ids => [c.id]); a2.save!
  293 + a3 = person.articles.build(:name => 'art3', :category_ids => [c.id]); a3.save!
294 294
295 c1 = a1.comments.build(:title => 'test', :body => 'asdsa', :author => person); c1.save! 295 c1 = a1.comments.build(:title => 'test', :body => 'asdsa', :author => person); c1.save!
296 c2 = a2.comments.build(:title => 'test', :body => 'asdsa', :author => person); c2.save! 296 c2 = a2.comments.build(:title => 'test', :body => 'asdsa', :author => person); c2.save!
test/unit/profile_test.rb
@@ -1385,6 +1385,14 @@ class ProfileTest &lt; Test::Unit::TestCase @@ -1385,6 +1385,14 @@ class ProfileTest &lt; Test::Unit::TestCase
1385 assert_equal({ :profile => 'testprofile', :controller => 'profile', :action => 'join'}, profile.join_url) 1385 assert_equal({ :profile => 'testprofile', :controller => 'profile', :action => 'join'}, profile.join_url)
1386 end 1386 end
1387 1387
  1388 + should 'ignore categgory with id zero' do
  1389 + profile = Profile.create!(:name => "Test Profile", :identifier => 'testprofile', :environment_id => create_environment('mycolivre.net').id)
  1390 + c = Category.create!(:name => 'test cat', :environment => profile.environment)
  1391 + profile.category_ids = ['0', c.id, nil]
  1392 +
  1393 + assert_equal [c], profile.categories
  1394 + end
  1395 +
1388 private 1396 private
1389 1397
1390 def assert_invalid_identifier(id) 1398 def assert_invalid_identifier(id)