Commit 7e5e9579d73bcb7e1cedc84d60887e2d55271352
Committed by
Antonio Terceiro
1 parent
534ae2b7
Exists in
master
and in
29 other branches
ActionItem908: selected witch articles can display hits
added the hit counter Added the hits column and the option to display it on the page
Showing
17 changed files
with
124 additions
and
4 deletions
Show diff stats
app/controllers/public/content_viewer_controller.rb
@@ -49,6 +49,9 @@ class ContentViewerController < ApplicationController | @@ -49,6 +49,9 @@ class ContentViewerController < ApplicationController | ||
49 | render :action => 'access_denied', :status => 403, :layout => false | 49 | render :action => 'access_denied', :status => 403, :layout => false |
50 | end | 50 | end |
51 | 51 | ||
52 | + # At this point the page will be showed | ||
53 | + @page.hit | ||
54 | + | ||
52 | if @page.mime_type != 'text/html' | 55 | if @page.mime_type != 'text/html' |
53 | headers['Content-Type'] = @page.mime_type | 56 | headers['Content-Type'] = @page.mime_type |
54 | data = @page.data | 57 | data = @page.data |
app/helpers/article_helper.rb
@@ -18,8 +18,13 @@ module ArticleHelper | @@ -18,8 +18,13 @@ module ArticleHelper | ||
18 | 'div', | 18 | 'div', |
19 | check_box(:article, :notify_comments) + | 19 | check_box(:article, :notify_comments) + |
20 | content_tag('label', _('I want to receive a notification of each comment written by e-mail'), :for => 'article_notify_comments') + | 20 | content_tag('label', _('I want to receive a notification of each comment written by e-mail'), :for => 'article_notify_comments') + |
21 | - observe_field(:article_accept_comments, :function => "$('article_notify_comments').disabled = ! $('article_accept_comments').checked") | ||
22 | - ) | 21 | + observe_field(:article_accept_comments, :function => "$('article_notify_comments').disabled = ! $('article_accept_comments').checked") |
22 | + ) + (article.can_display_hits? ? | ||
23 | + content_tag( | ||
24 | + 'div', | ||
25 | + check_box(:article, :display_hits) + | ||
26 | + content_tag('label', _('I want this article to display the number of hits it received'), :for => 'article_display_hits') | ||
27 | + ) : '') | ||
23 | ) | 28 | ) |
24 | end | 29 | end |
25 | 30 |
app/models/article.rb
@@ -16,6 +16,10 @@ class Article < ActiveRecord::Base | @@ -16,6 +16,10 @@ class Article < ActiveRecord::Base | ||
16 | has_many :article_categorizations, :conditions => [ 'articles_categories.virtual = ?', false ] | 16 | has_many :article_categorizations, :conditions => [ 'articles_categories.virtual = ?', false ] |
17 | has_many :categories, :through => :article_categorizations | 17 | has_many :categories, :through => :article_categorizations |
18 | 18 | ||
19 | + acts_as_having_settings :field => :setting | ||
20 | + | ||
21 | + settings_items :display_hits, :type => :boolean, :default => true | ||
22 | + | ||
19 | def self.human_attribute_name(attrib) | 23 | def self.human_attribute_name(attrib) |
20 | case attrib.to_sym | 24 | case attrib.to_sym |
21 | when :name | 25 | when :name |
@@ -209,13 +213,26 @@ class Article < ActiveRecord::Base | @@ -209,13 +213,26 @@ class Article < ActiveRecord::Base | ||
209 | end | 213 | end |
210 | 214 | ||
211 | def article_attr_blacklist | 215 | def article_attr_blacklist |
212 | - ['id', 'profile_id', 'parent_id', 'slug', 'path', 'updated_at', 'created_at', 'last_changed_by_id', 'version', 'lock_version', 'type', 'children_count', 'comments_count'] | 216 | + ['id', 'profile_id', 'parent_id', 'slug', 'path', 'updated_at', 'created_at', 'last_changed_by_id', 'version', 'lock_version', 'type', 'children_count', 'comments_count', 'hits'] |
213 | end | 217 | end |
214 | 218 | ||
215 | def self.find_by_old_path(old_path) | 219 | def self.find_by_old_path(old_path) |
216 | find(:first, :include => :versions, :conditions => ['article_versions.path = ?', old_path], :order => 'article_versions.id desc') | 220 | find(:first, :include => :versions, :conditions => ['article_versions.path = ?', old_path], :order => 'article_versions.id desc') |
217 | end | 221 | end |
218 | 222 | ||
223 | + def hit | ||
224 | + self.hits += 1 | ||
225 | + save! | ||
226 | + end | ||
227 | + | ||
228 | + def can_display_hits? | ||
229 | + true | ||
230 | + end | ||
231 | + | ||
232 | + def display_hits? | ||
233 | + can_display_hits? && display_hits | ||
234 | + end | ||
235 | + | ||
219 | private | 236 | private |
220 | 237 | ||
221 | def sanitize_tag_list | 238 | def sanitize_tag_list |
app/models/enterprise_homepage.rb
@@ -26,4 +26,8 @@ class EnterpriseHomepage < Article | @@ -26,4 +26,8 @@ class EnterpriseHomepage < Article | ||
26 | (self.profile.environment.enabled?('disable_products_for_enterprises') ? '' : display_products_list(self.profile, products)) | 26 | (self.profile.environment.enabled?('disable_products_for_enterprises') ? '' : display_products_list(self.profile, products)) |
27 | end | 27 | end |
28 | 28 | ||
29 | + def can_display_hits? | ||
30 | + false | ||
31 | + end | ||
32 | + | ||
29 | end | 33 | end |
app/models/folder.rb
app/models/rss_feed.rb
app/models/uploaded_file.rb
app/views/content_viewer/view_page.rhtml
@@ -61,6 +61,12 @@ | @@ -61,6 +61,12 @@ | ||
61 | </div> | 61 | </div> |
62 | <% end %> | 62 | <% end %> |
63 | 63 | ||
64 | +<% if @page.display_hits? %> | ||
65 | + <div id="article-hits"> | ||
66 | + <%= n_('Viewed one time', 'Viewed %{num} times', @page.hits) % { :num => @page.hits } %> | ||
67 | + </div> | ||
68 | +<% end %> | ||
69 | + | ||
64 | <% if @page.parent && !@page.parent.path.blank? %> | 70 | <% if @page.parent && !@page.parent.path.blank? %> |
65 | <div id="article-parent"> | 71 | <div id="article-parent"> |
66 | <%= link_to_document(@page.parent, _('Up')) %> | 72 | <%= link_to_document(@page.parent, _('Up')) %> |
@@ -0,0 +1,11 @@ | @@ -0,0 +1,11 @@ | ||
1 | +class AddHitsToArticles < ActiveRecord::Migration | ||
2 | + def self.up | ||
3 | + add_column :articles, :hits, :integer, :default => 0 | ||
4 | + add_column :article_versions, :hits, :integer, :default => 0 | ||
5 | + end | ||
6 | + | ||
7 | + def self.down | ||
8 | + remove_column :articles, :hits | ||
9 | + remove_column :article_versions, :hits | ||
10 | + end | ||
11 | +end |
db/schema.rb
@@ -9,7 +9,7 @@ | @@ -9,7 +9,7 @@ | ||
9 | # | 9 | # |
10 | # It's strongly recommended to check this file into your version control system. | 10 | # It's strongly recommended to check this file into your version control system. |
11 | 11 | ||
12 | -ActiveRecord::Schema.define(:version => 57) do | 12 | +ActiveRecord::Schema.define(:version => 58) do |
13 | 13 | ||
14 | create_table "article_versions", :force => true do |t| | 14 | create_table "article_versions", :force => true do |t| |
15 | t.integer "article_id" | 15 | t.integer "article_id" |
@@ -41,6 +41,7 @@ ActiveRecord::Schema.define(:version => 57) do | @@ -41,6 +41,7 @@ ActiveRecord::Schema.define(:version => 57) do | ||
41 | t.integer "reference_article_id" | 41 | t.integer "reference_article_id" |
42 | t.text "setting" | 42 | t.text "setting" |
43 | t.boolean "notify_comments", :default => false | 43 | t.boolean "notify_comments", :default => false |
44 | + t.integer "hits", :default => 0 | ||
44 | end | 45 | end |
45 | 46 | ||
46 | create_table "articles", :force => true do |t| | 47 | create_table "articles", :force => true do |t| |
@@ -73,6 +74,7 @@ ActiveRecord::Schema.define(:version => 57) do | @@ -73,6 +74,7 @@ ActiveRecord::Schema.define(:version => 57) do | ||
73 | t.integer "reference_article_id" | 74 | t.integer "reference_article_id" |
74 | t.text "setting" | 75 | t.text "setting" |
75 | t.boolean "notify_comments", :default => false | 76 | t.boolean "notify_comments", :default => false |
77 | + t.integer "hits", :default => 0 | ||
76 | end | 78 | end |
77 | 79 | ||
78 | create_table "articles_categories", :id => false, :force => true do |t| | 80 | create_table "articles_categories", :id => false, :force => true do |t| |
public/stylesheets/article.css
test/functional/content_viewer_controller_test.rb
@@ -644,4 +644,11 @@ class ContentViewerControllerTest < Test::Unit::TestCase | @@ -644,4 +644,11 @@ class ContentViewerControllerTest < Test::Unit::TestCase | ||
644 | assert_tag :tag => 'div', :attributes => { :id => "post-#{t.id}" }, :descendant => { :tag => 'a', :content => 'No comments yet', :attributes => { :href => /#{profile.identifier}\/blog\/first-post\?form=opened#comment_form/ } } | 644 | assert_tag :tag => 'div', :attributes => { :id => "post-#{t.id}" }, :descendant => { :tag => 'a', :content => 'No comments yet', :attributes => { :href => /#{profile.identifier}\/blog\/first-post\?form=opened#comment_form/ } } |
645 | end | 645 | end |
646 | 646 | ||
647 | + should 'hit the article when viewed' do | ||
648 | + a = profile.articles.create!(:name => 'test article') | ||
649 | + get :view_page, :profile => profile.identifier, :page => [a.path] | ||
650 | + a.reload | ||
651 | + assert_equal 1, a.hits | ||
652 | + end | ||
653 | + | ||
647 | end | 654 | end |
test/unit/article_test.rb
@@ -589,4 +589,30 @@ class ArticleTest < Test::Unit::TestCase | @@ -589,4 +589,30 @@ class ArticleTest < Test::Unit::TestCase | ||
589 | assert !a.notify_comments? | 589 | assert !a.notify_comments? |
590 | end | 590 | end |
591 | 591 | ||
592 | + should 'hold hits count' do | ||
593 | + a = Article.create!(:name => 'Test article', :profile => profile) | ||
594 | + a.hits = 10 | ||
595 | + a.save! | ||
596 | + a.reload | ||
597 | + assert_equal 10, a.hits | ||
598 | + end | ||
599 | + | ||
600 | + should 'increment hit counter when hitted' do | ||
601 | + a = Article.create!(:name => 'Test article', :profile => profile, :hits => 10) | ||
602 | + a.hit | ||
603 | + a.reload | ||
604 | + assert_equal 11, a.hits | ||
605 | + end | ||
606 | + | ||
607 | + should 'have display_hits setting with default true' do | ||
608 | + a = Article.create!(:name => 'Test article', :profile => profile) | ||
609 | + assert_respond_to a, :display_hits | ||
610 | + assert_equal true, a.display_hits | ||
611 | + end | ||
612 | + | ||
613 | + should 'can display hits' do | ||
614 | + a = Article.create!(:name => 'Test article', :profile => profile) | ||
615 | + assert_respond_to a, :can_display_hits? | ||
616 | + assert_equal true, a.can_display_hits? | ||
617 | + end | ||
592 | end | 618 | end |
test/unit/enterprise_homepage_test.rb
@@ -53,4 +53,10 @@ class EnterpriseHomepageTest < Test::Unit::TestCase | @@ -53,4 +53,10 @@ class EnterpriseHomepageTest < Test::Unit::TestCase | ||
53 | result = a.to_html | 53 | result = a.to_html |
54 | assert_match /catalog\/test_enterprise\/#{prod.id}/, result | 54 | assert_match /catalog\/test_enterprise\/#{prod.id}/, result |
55 | end | 55 | end |
56 | + | ||
57 | + should 'can display hits' do | ||
58 | + a = EnterpriseHomepage.new(:name => 'Test article') | ||
59 | + assert_equal false, a.can_display_hits? | ||
60 | + end | ||
61 | + | ||
56 | end | 62 | end |
test/unit/folder_test.rb
@@ -46,4 +46,9 @@ class FolderTest < ActiveSupport::TestCase | @@ -46,4 +46,9 @@ class FolderTest < ActiveSupport::TestCase | ||
46 | assert Folder.new.folder?, 'folder must identity itself as folder' | 46 | assert Folder.new.folder?, 'folder must identity itself as folder' |
47 | end | 47 | end |
48 | 48 | ||
49 | + should 'can display hits' do | ||
50 | + a = Folder.create!(:name => 'Test article', :profile => profile) | ||
51 | + assert_equal false, a.can_display_hits? | ||
52 | + end | ||
53 | + | ||
49 | end | 54 | end |
test/unit/rss_feed_test.rb
@@ -220,4 +220,10 @@ class RssFeedTest < Test::Unit::TestCase | @@ -220,4 +220,10 @@ class RssFeedTest < Test::Unit::TestCase | ||
220 | assert !feed.advertise? | 220 | assert !feed.advertise? |
221 | end | 221 | end |
222 | 222 | ||
223 | + should 'can display hits' do | ||
224 | + p = create_user('testuser').person | ||
225 | + a = RssFeed.create!(:name => 'Test article', :profile => p) | ||
226 | + assert_equal false, a.can_display_hits? | ||
227 | + end | ||
228 | + | ||
223 | end | 229 | end |
test/unit/uploaded_file_test.rb
@@ -68,4 +68,9 @@ class UploadedFileTest < Test::Unit::TestCase | @@ -68,4 +68,9 @@ class UploadedFileTest < Test::Unit::TestCase | ||
68 | assert_includes file.attachment_validation_options, :size | 68 | assert_includes file.attachment_validation_options, :size |
69 | end | 69 | end |
70 | 70 | ||
71 | + should 'can display hits' do | ||
72 | + file = UploadedFile.new(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')) | ||
73 | + assert_equal false, file.can_display_hits? | ||
74 | + end | ||
75 | + | ||
71 | end | 76 | end |