Commit c46c6656e2335e2464cbcd7230ca6a64e4596e0e
Exists in
master
and in
29 other branches
Merge commit 'refs/merge-requests/154' of git://gitorious.org/noosfero/noosfero …
…into merge-requests/154 (ActionItem2336)
Showing
12 changed files
with
71 additions
and
18 deletions
Show diff stats
app/helpers/sweeper_helper.rb
| @@ -20,7 +20,7 @@ module SweeperHelper | @@ -20,7 +20,7 @@ module SweeperHelper | ||
| 20 | 20 | ||
| 21 | # friends blocks | 21 | # friends blocks |
| 22 | blocks = profile.blocks.select{|b| b.kind_of?(FriendsBlock)} | 22 | blocks = profile.blocks.select{|b| b.kind_of?(FriendsBlock)} |
| 23 | - blocks.map(&:cache_key).each{|ck|expire_timeout_fragment(ck)} | 23 | + BlockSweeper.expire_blocks(blocks) |
| 24 | end | 24 | end |
| 25 | 25 | ||
| 26 | def expire_communities(profile) | 26 | def expire_communities(profile) |
| @@ -32,13 +32,13 @@ module SweeperHelper | @@ -32,13 +32,13 @@ module SweeperHelper | ||
| 32 | 32 | ||
| 33 | # communities block | 33 | # communities block |
| 34 | blocks = profile.blocks.select{|b| b.kind_of?(CommunitiesBlock)} | 34 | blocks = profile.blocks.select{|b| b.kind_of?(CommunitiesBlock)} |
| 35 | - blocks.map(&:cache_key).each{|ck|expire_timeout_fragment(ck)} | 35 | + BlockSweeper.expire_blocks(blocks) |
| 36 | end | 36 | end |
| 37 | 37 | ||
| 38 | def expire_enterprises(profile) | 38 | def expire_enterprises(profile) |
| 39 | # enterprises and favorite enterprises blocks | 39 | # enterprises and favorite enterprises blocks |
| 40 | blocks = profile.blocks.select {|b| [EnterprisesBlock, FavoriteEnterprisesBlock].any?{|klass| b.kind_of?(klass)} } | 40 | blocks = profile.blocks.select {|b| [EnterprisesBlock, FavoriteEnterprisesBlock].any?{|klass| b.kind_of?(klass)} } |
| 41 | - blocks.map(&:cache_key).each{|ck|expire_timeout_fragment(ck)} | 41 | + BlockSweeper.expire_blocks(blocks) |
| 42 | end | 42 | end |
| 43 | 43 | ||
| 44 | def expire_profile_index(profile) | 44 | def expire_profile_index(profile) |
app/models/article.rb
| @@ -496,8 +496,8 @@ class Article < ActiveRecord::Base | @@ -496,8 +496,8 @@ class Article < ActiveRecord::Base | ||
| 496 | end | 496 | end |
| 497 | 497 | ||
| 498 | alias :active_record_cache_key :cache_key | 498 | alias :active_record_cache_key :cache_key |
| 499 | - def cache_key(params = {}, the_profile = nil) | ||
| 500 | - active_record_cache_key + | 499 | + def cache_key(params = {}, the_profile = nil, language = 'en') |
| 500 | + active_record_cache_key+'-'+language + | ||
| 501 | (allow_post_content?(the_profile) ? "-owner" : '') + | 501 | (allow_post_content?(the_profile) ? "-owner" : '') + |
| 502 | (params[:npage] ? "-npage-#{params[:npage]}" : '') + | 502 | (params[:npage] ? "-npage-#{params[:npage]}" : '') + |
| 503 | (params[:year] ? "-year-#{params[:year]}" : '') + | 503 | (params[:year] ? "-year-#{params[:year]}" : '') + |
app/models/block.rb
| @@ -127,6 +127,11 @@ class Block < ActiveRecord::Base | @@ -127,6 +127,11 @@ class Block < ActiveRecord::Base | ||
| 127 | true | 127 | true |
| 128 | end | 128 | end |
| 129 | 129 | ||
| 130 | + alias :active_record_cache_key :cache_key | ||
| 131 | + def cache_key(language='en') | ||
| 132 | + active_record_cache_key+'-'+language | ||
| 133 | + end | ||
| 134 | + | ||
| 130 | def timeout | 135 | def timeout |
| 131 | 4.hours | 136 | 4.hours |
| 132 | end | 137 | end |
app/sweepers/article_sweeper.rb
| @@ -13,15 +13,11 @@ class ArticleSweeper < ActiveRecord::Observer | @@ -13,15 +13,11 @@ class ArticleSweeper < ActiveRecord::Observer | ||
| 13 | protected | 13 | protected |
| 14 | 14 | ||
| 15 | def expire_caches(article) | 15 | def expire_caches(article) |
| 16 | - article.hierarchy.each do |a| | ||
| 17 | - if a != article | ||
| 18 | - a.update_attribute(:updated_at, Time.now) | ||
| 19 | - end | ||
| 20 | - end | 16 | + article.hierarchy.each { |a| a.touch if a != article } |
| 21 | blocks = article.profile.blocks | 17 | blocks = article.profile.blocks |
| 22 | blocks += article.profile.environment.blocks if article.profile.environment | 18 | blocks += article.profile.environment.blocks if article.profile.environment |
| 23 | blocks = blocks.select{|b|[RecentDocumentsBlock, BlogArchivesBlock].any?{|c| b.kind_of?(c)}} | 19 | blocks = blocks.select{|b|[RecentDocumentsBlock, BlogArchivesBlock].any?{|c| b.kind_of?(c)}} |
| 24 | - blocks.map(&:cache_key).each{|ck|expire_timeout_fragment(ck)} | 20 | + BlockSweeper.expire_blocks(blocks) |
| 25 | env = article.profile.environment | 21 | env = article.profile.environment |
| 26 | if env && (env.portal_community == article.profile) | 22 | if env && (env.portal_community == article.profile) |
| 27 | expire_fragment(env.portal_news_cache_key) | 23 | expire_fragment(env.portal_news_cache_key) |
app/sweepers/block_sweeper.rb
| 1 | class BlockSweeper < ActiveRecord::Observer | 1 | class BlockSweeper < ActiveRecord::Observer |
| 2 | 2 | ||
| 3 | - include SweeperHelper | ||
| 4 | observe :block | 3 | observe :block |
| 5 | 4 | ||
| 5 | + class << self | ||
| 6 | + include SweeperHelper | ||
| 7 | + | ||
| 8 | + def cache_key_regex(block) | ||
| 9 | + regex = '-[a-z]*$' | ||
| 10 | + clean_ck = block.cache_key.gsub(/#{regex}/,'') | ||
| 11 | + %r{#{clean_ck+regex}} | ||
| 12 | + end | ||
| 13 | + | ||
| 14 | + # Expire block's all languages cache | ||
| 15 | + def expire_block(block) | ||
| 16 | + expire_timeout_fragment(cache_key_regex(block)) | ||
| 17 | + end | ||
| 18 | + | ||
| 19 | + def expire_blocks(blocks) | ||
| 20 | + blocks.each { |block| expire_block(block) } | ||
| 21 | + end | ||
| 22 | + end | ||
| 23 | + | ||
| 6 | def after_save(block) | 24 | def after_save(block) |
| 7 | - expire_fragment(block.cache_key) | 25 | + self.class.expire_block(block) |
| 8 | end | 26 | end |
| 9 | 27 | ||
| 10 | end | 28 | end |
app/sweepers/friendship_sweeper.rb
| @@ -35,7 +35,7 @@ protected | @@ -35,7 +35,7 @@ protected | ||
| 35 | end | 35 | end |
| 36 | 36 | ||
| 37 | blocks = profile.blocks.select{|b| b.kind_of?(FriendsBlock)} | 37 | blocks = profile.blocks.select{|b| b.kind_of?(FriendsBlock)} |
| 38 | - blocks.map(&:cache_key).each{|ck|expire_timeout_fragment(ck)} | 38 | + BlockSweeper.expire_blocks(blocks) |
| 39 | end | 39 | end |
| 40 | 40 | ||
| 41 | end | 41 | end |
app/sweepers/profile_sweeper.rb
| @@ -31,7 +31,7 @@ protected | @@ -31,7 +31,7 @@ protected | ||
| 31 | 31 | ||
| 32 | def expire_statistics_block_cache(profile) | 32 | def expire_statistics_block_cache(profile) |
| 33 | blocks = profile.environment.blocks.select { |b| b.kind_of?(EnvironmentStatisticsBlock) } | 33 | blocks = profile.environment.blocks.select { |b| b.kind_of?(EnvironmentStatisticsBlock) } |
| 34 | - blocks.map(&:cache_key).each{|ck|expire_timeout_fragment(ck)} | 34 | + BlockSweeper.expire_blocks(blocks) |
| 35 | end | 35 | end |
| 36 | 36 | ||
| 37 | def expire_blogs(profile) | 37 | def expire_blogs(profile) |
app/sweepers/role_assignment_sweeper.rb
| @@ -25,7 +25,7 @@ protected | @@ -25,7 +25,7 @@ protected | ||
| 25 | 25 | ||
| 26 | profile.blocks_to_expire_cache.each { |block| | 26 | profile.blocks_to_expire_cache.each { |block| |
| 27 | blocks = profile.blocks.select{|b| b.kind_of?(block)} | 27 | blocks = profile.blocks.select{|b| b.kind_of?(block)} |
| 28 | - blocks.map(&:cache_key).each{|ck|expire_timeout_fragment(ck)} | 28 | + BlockSweeper.expire_blocks(blocks) |
| 29 | } | 29 | } |
| 30 | end | 30 | end |
| 31 | 31 |
app/views/content_viewer/view_page.rhtml
| @@ -52,7 +52,7 @@ | @@ -52,7 +52,7 @@ | ||
| 52 | </div> | 52 | </div> |
| 53 | <% end %> | 53 | <% end %> |
| 54 | 54 | ||
| 55 | -<% cache(@page.cache_key(params, user)) do %> | 55 | +<% cache(@page.cache_key(params, user, language)) do %> |
| 56 | <div class="<%="article-body article-body-" + @page.css_class_name %>"> | 56 | <div class="<%="article-body article-body-" + @page.css_class_name %>"> |
| 57 | <% options = @page.image? ? {:gallery_view => true} : {} %> | 57 | <% options = @page.image? ? {:gallery_view => true} : {} %> |
| 58 | <%= article_to_html(@page, options) %> | 58 | <%= article_to_html(@page, options) %> |
app/views/shared/block.rhtml
| 1 | <% if block.cacheable? && use_cache %> | 1 | <% if block.cacheable? && use_cache %> |
| 2 | - <% cache_timeout(block.cache_key, block.timeout) do %> | 2 | + <% cache_timeout(block.cache_key(language), block.timeout) do %> |
| 3 | <%= display_block_content(block, user, main_content) %> | 3 | <%= display_block_content(block, user, main_content) %> |
| 4 | <% end %> | 4 | <% end %> |
| 5 | <% else %> | 5 | <% else %> |
| @@ -0,0 +1,30 @@ | @@ -0,0 +1,30 @@ | ||
| 1 | +Feature: caching | ||
| 2 | + As a user | ||
| 3 | + I want to see the contents according with my language | ||
| 4 | + Even with the contents being cached | ||
| 5 | + | ||
| 6 | + Background: | ||
| 7 | + Given the cache is turned on | ||
| 8 | + And the following user | ||
| 9 | + | login | name | | ||
| 10 | + | mario | Mario | | ||
| 11 | + And I am logged in as "mario" | ||
| 12 | + | ||
| 13 | + Scenario: blog view page | ||
| 14 | + Given the following blogs | ||
| 15 | + | owner | name | display_posts_in_current_language | visualization_format | | ||
| 16 | + | mario | Sample Blog | false | short | | ||
| 17 | + And the following articles | ||
| 18 | + | owner | name | parent | | ||
| 19 | + | mario | Post1 | Sample Blog | | ||
| 20 | + | mario | Post2 | Sample Blog | | ||
| 21 | + When I go to article "Sample Blog" | ||
| 22 | + Then I should see "No comments yet" | ||
| 23 | + When I follow "Português" | ||
| 24 | + Then I should see "Sem comentários ainda" | ||
| 25 | + | ||
| 26 | + Scenario: blocks | ||
| 27 | + Given I am on Mario's homepage | ||
| 28 | + Then I should see "Recent content" | ||
| 29 | + When I follow "Português" | ||
| 30 | + Then I should see "Conteúdo recente" |
features/step_definitions/noosfero_steps.rb
| @@ -572,3 +572,7 @@ When /^I edit my profile$/ do | @@ -572,3 +572,7 @@ When /^I edit my profile$/ do | ||
| 572 | visit "/myprofile/#{@current_user}" | 572 | visit "/myprofile/#{@current_user}" |
| 573 | click_link "Edit Profile" | 573 | click_link "Edit Profile" |
| 574 | end | 574 | end |
| 575 | + | ||
| 576 | +Given /^the cache is turned (on|off)$/ do |state| | ||
| 577 | + ActionController::Base.perform_caching = (state == 'on') | ||
| 578 | +end |