Commit f7c784e9e6bec5b1a4a4f3490aa578fa448824f5
Committed by
Joenio Costa
1 parent
45521292
Exists in
master
and in
23 other branches
Adding option to choose how posts will be displayed
A blog can display the full content of posts or only the first paragraph (ActionItem1515)
Showing
11 changed files
with
122 additions
and
14 deletions
Show diff stats
app/helpers/blog_helper.rb
| ... | ... | @@ -14,7 +14,7 @@ module BlogHelper |
| 14 | 14 | _('Edit blog') |
| 15 | 15 | end |
| 16 | 16 | |
| 17 | - def list_posts(user, articles) | |
| 17 | + def list_posts(user, articles, format = 'full') | |
| 18 | 18 | pagination = will_paginate(articles, { |
| 19 | 19 | :param_name => 'npage', |
| 20 | 20 | :prev_label => _('« Newer posts'), |
| ... | ... | @@ -32,7 +32,7 @@ module BlogHelper |
| 32 | 32 | css_add << position + '-inner' |
| 33 | 33 | content << content_tag('div', |
| 34 | 34 | content_tag('div', |
| 35 | - display_post(art) + '<br style="clear:both"/>', | |
| 35 | + display_post(art, format) + '<br style="clear:both"/>', | |
| 36 | 36 | :class => 'blog-post ' + css_add.join(' '), |
| 37 | 37 | :id => "post-#{art.id}"), :class => position |
| 38 | 38 | ) |
| ... | ... | @@ -41,10 +41,29 @@ module BlogHelper |
| 41 | 41 | content.join("\n<hr class='sep-posts'/>\n") + (pagination or '') |
| 42 | 42 | end |
| 43 | 43 | |
| 44 | - def display_post(article) | |
| 44 | + def display_post(article, format = 'full') | |
| 45 | + no_comments = (format == 'full') ? false : true | |
| 46 | + html = send("display_#{format}_format", article) | |
| 47 | + | |
| 48 | + article_title(article, :no_comments => no_comments) + html | |
| 49 | + end | |
| 50 | + | |
| 51 | + def display_short_format(article) | |
| 52 | + html = content_tag('div', | |
| 53 | + article.first_paragraph + | |
| 54 | + content_tag('div', | |
| 55 | + link_to_comments(article) + | |
| 56 | + link_to( _('Read more'), article.url), | |
| 57 | + :class => 'read-more'), | |
| 58 | + :class => 'short-post' | |
| 59 | + ) | |
| 60 | + html | |
| 61 | + end | |
| 62 | + | |
| 63 | + def display_full_format(article) | |
| 45 | 64 | html = article_to_html(article) |
| 46 | 65 | html = content_tag('p', html) if ! html.include?('</p>') |
| 47 | - article_title(article) + html | |
| 66 | + html | |
| 48 | 67 | end |
| 49 | 68 | |
| 50 | 69 | end | ... | ... |
app/helpers/content_viewer_helper.rb
| ... | ... | @@ -19,12 +19,13 @@ module ContentViewerHelper |
| 19 | 19 | unless args[:no_link] |
| 20 | 20 | title = content_tag('h1', link_to(article.name, article.url), :class => 'title') |
| 21 | 21 | end |
| 22 | - title << content_tag('span', _("%s, by %s - %s") % [show_date(article.published_at), link_to(article.author.name, article.author.url), link_to_comments(article)], :class => 'created-at') | |
| 22 | + comments = args[:no_comments] ? '' : (("- %s") % link_to_comments(article)) | |
| 23 | + title << content_tag('span', _("%s, by %s %s") % [show_date(article.published_at), link_to(article.author.name, article.author.url), comments], :class => 'created-at') | |
| 23 | 24 | end |
| 24 | 25 | title |
| 25 | 26 | end |
| 26 | 27 | |
| 27 | - def link_to_comments(article) | |
| 28 | + def link_to_comments(article, args = {}) | |
| 28 | 29 | link_to( number_of_comments(article), article.url.merge(:anchor => 'comments_list') ) |
| 29 | 30 | end |
| 30 | 31 | ... | ... |
app/models/article.rb
app/models/blog.rb
| ... | ... | @@ -99,4 +99,8 @@ class Blog < Folder |
| 99 | 99 | end |
| 100 | 100 | end |
| 101 | 101 | |
| 102 | + settings_items :visualization_format, :type => :string, :default => 'full' | |
| 103 | + validates_inclusion_of :visualization_format, :in => [ 'full', 'short' ], :if => :visualization_format | |
| 104 | + | |
| 105 | + | |
| 102 | 106 | end | ... | ... |
app/views/cms/_blog.rhtml
| ... | ... | @@ -52,6 +52,8 @@ |
| 52 | 52 | |
| 53 | 53 | <%= labelled_form_field(_('Description:'), text_area(:article, :body, :cols => 64, :rows => 10)) %> |
| 54 | 54 | |
| 55 | +<%= labelled_form_field(_('How to display posts:'), f.select(:visualization_format, [ [ _('Full post'), 'full'], [ _('First paragraph'), 'short'] ])) %> | |
| 56 | + | |
| 55 | 57 | <%= labelled_form_field(_('Posts per page:'), f.select(:posts_per_page, [5, 10, 20, 50, 100])) %> |
| 56 | 58 | |
| 57 | 59 | <% f.fields_for 'feed', @article.feed do |feed| %> | ... | ... |
app/views/content_viewer/blog_page.rhtml
| ... | ... | @@ -10,5 +10,5 @@ |
| 10 | 10 | </div> |
| 11 | 11 | <hr class="pre-posts"/> |
| 12 | 12 | <div class="blog-posts"> |
| 13 | - <%= (children.compact.empty? ? content_tag('em', _('(no posts)')) : list_posts(user, children)) %> | |
| 13 | + <%= (children.compact.empty? ? content_tag('em', _('(no posts)')) : list_posts(user, children, article.visualization_format)) %> | |
| 14 | 14 | </div> | ... | ... |
public/stylesheets/application.css
| ... | ... | @@ -1171,6 +1171,14 @@ a.comment-picture { |
| 1171 | 1171 | max-width: 100%; |
| 1172 | 1172 | } |
| 1173 | 1173 | |
| 1174 | +#content .blog-post .read-more { | |
| 1175 | + text-align: right; | |
| 1176 | + clear: both; | |
| 1177 | +} | |
| 1178 | +#content .blog-post .read-more a { | |
| 1179 | + margin: 0 10px; | |
| 1180 | +} | |
| 1181 | + | |
| 1174 | 1182 | /* NOT PUBLISHED BLOG POSTS */ |
| 1175 | 1183 | |
| 1176 | 1184 | .blog-post.not-published { | ... | ... |
test/functional/cms_controller_test.rb
| ... | ... | @@ -736,6 +736,12 @@ class CmsControllerTest < Test::Unit::TestCase |
| 736 | 736 | assert_tag :tag => 'select', :attributes => { :name => 'article[posts_per_page]' }, :child => { :tag => 'option', :attributes => {:value => n, :selected => 'selected'} } |
| 737 | 737 | end |
| 738 | 738 | |
| 739 | + should 'display options for blog visualization with default value on edit blog' do | |
| 740 | + format = Blog.new.visualization_format | |
| 741 | + get :new, :profile => profile.identifier, :type => 'Blog' | |
| 742 | + assert_tag :tag => 'select', :attributes => { :name => 'article[visualization_format]' }, :child => { :tag => 'option', :attributes => {:value => 'full', :selected => 'selected'} } | |
| 743 | + end | |
| 744 | + | |
| 739 | 745 | should 'not offer to create special article types' do |
| 740 | 746 | get :new, :profile => profile.identifier |
| 741 | 747 | assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/#{profile.identifier}/cms/new?type=Blog"} | ... | ... |
test/functional/content_viewer_controller_test.rb
| ... | ... | @@ -857,4 +857,17 @@ class ContentViewerControllerTest < Test::Unit::TestCase |
| 857 | 857 | assert_tag :tag => 'div', :attributes => { :class => 'post_comment_box opened' } |
| 858 | 858 | end |
| 859 | 859 | |
| 860 | + should 'show only first paragraph of blog posts if visualization_format is short' do | |
| 861 | + login_as(profile.identifier) | |
| 862 | + | |
| 863 | + blog = Blog.create!(:name => 'A blog test', :profile => profile, :visualization_format => 'short') | |
| 864 | + | |
| 865 | + blog.posts << TinyMceArticle.create!(:name => 'first post', :parent => blog, :profile => profile, :body => '<p>Content to be displayed.</p> Anything') | |
| 866 | + | |
| 867 | + get :view_page, :profile => profile.identifier, :page => blog.explode_path | |
| 868 | + | |
| 869 | + assert_tag :tag => 'div', :attributes => { :class => 'short-post'}, :content => /Content to be displayed./ | |
| 870 | + assert_no_tag :tag => 'div', :attributes => { :class => 'short-post'}, :content => /Anything/ | |
| 871 | + end | |
| 872 | + | |
| 860 | 873 | end | ... | ... |
test/unit/blog_helper_test.rb
| ... | ... | @@ -23,7 +23,7 @@ class BlogHelperTest < Test::Unit::TestCase |
| 23 | 23 | should 'list published posts with class blog-post' do |
| 24 | 24 | blog.children << published_post = TextileArticle.create!(:name => 'Post', :profile => profile, :parent => blog, :published => true) |
| 25 | 25 | |
| 26 | - expects(:display_post).with(anything).returns('POST') | |
| 26 | + expects(:display_post).with(anything, anything).returns('POST') | |
| 27 | 27 | expects(:content_tag).with('div', "POST<br style=\"clear:both\"/>", :class => 'blog-post position-1 first last odd-post-inner', :id => "post-#{published_post.id}").returns('POST') |
| 28 | 28 | expects(:content_tag).with('div', 'POST', {:class => 'odd-post'}).returns('RESULT') |
| 29 | 29 | |
| ... | ... | @@ -33,7 +33,7 @@ class BlogHelperTest < Test::Unit::TestCase |
| 33 | 33 | should 'list unpublished posts to owner with a different class' do |
| 34 | 34 | blog.children << unpublished_post = TextileArticle.create!(:name => 'Post', :profile => profile, :parent => blog, :published => false) |
| 35 | 35 | |
| 36 | - expects(:display_post).with(anything).returns('POST') | |
| 36 | + expects(:display_post).with(anything, anything).returns('POST') | |
| 37 | 37 | expects(:content_tag).with('div', "POST<br style=\"clear:both\"/>", :class => 'blog-post position-1 first last not-published odd-post-inner', :id => "post-#{unpublished_post.id}").returns('POST') |
| 38 | 38 | expects(:content_tag).with('div', 'POST', {:class => 'odd-post'}).returns('RESULT') |
| 39 | 39 | assert_equal 'RESULT', list_posts(profile, blog.posts) |
| ... | ... | @@ -44,7 +44,7 @@ class BlogHelperTest < Test::Unit::TestCase |
| 44 | 44 | |
| 45 | 45 | blog.children << published_post = TextileArticle.create!(:name => 'Second post', :profile => profile, :parent => blog, :published => true) |
| 46 | 46 | |
| 47 | - expects(:display_post).with(anything).returns('POST') | |
| 47 | + expects(:display_post).with(anything, anything).returns('POST') | |
| 48 | 48 | expects(:content_tag).with('div', "POST<br style=\"clear:both\"/>", has_entries(:id => "post-#{unpublished_post.id}")).never |
| 49 | 49 | expects(:content_tag).with('div', "POST<br style=\"clear:both\"/>", has_entries(:id => "post-#{published_post.id}")).returns('POST') |
| 50 | 50 | expects(:content_tag).with('div', 'POST', {:class => 'odd-post'}).returns('RESULT') |
| ... | ... | @@ -56,7 +56,7 @@ class BlogHelperTest < Test::Unit::TestCase |
| 56 | 56 | |
| 57 | 57 | blog.children << newer_post = TextileArticle.create!(:name => 'Second post', :profile => profile, :parent => blog, :published => true) |
| 58 | 58 | |
| 59 | - expects(:display_post).with(anything).returns('POST').times(2) | |
| 59 | + expects(:display_post).with(anything, anything).returns('POST').times(2) | |
| 60 | 60 | |
| 61 | 61 | expects(:content_tag).with('div', "POST<br style=\"clear:both\"/>", :class => 'blog-post position-1 first odd-post-inner', :id => "post-#{newer_post.id}").returns('POST 1') |
| 62 | 62 | expects(:content_tag).with('div', "POST 1", :class => 'odd-post').returns('ODD-POST') |
| ... | ... | @@ -70,7 +70,7 @@ class BlogHelperTest < Test::Unit::TestCase |
| 70 | 70 | |
| 71 | 71 | should 'display post' do |
| 72 | 72 | blog.children << article = TextileArticle.create!(:name => 'Second post', :profile => profile, :parent => blog, :published => true) |
| 73 | - expects(:article_title).with(article).returns('TITLE') | |
| 73 | + expects(:article_title).with(article, anything).returns('TITLE') | |
| 74 | 74 | expects(:content_tag).with('p', article.to_html).returns(' TO_HTML') |
| 75 | 75 | self.stubs(:params).returns({:npage => nil}) |
| 76 | 76 | |
| ... | ... | @@ -79,13 +79,39 @@ class BlogHelperTest < Test::Unit::TestCase |
| 79 | 79 | |
| 80 | 80 | should 'display empty post if body is nil' do |
| 81 | 81 | blog.children << article = fast_create(Article, :profile_id => profile.id, :parent_id => blog.id, :body => nil) |
| 82 | - expects(:article_title).with(article).returns('TITLE') | |
| 82 | + expects(:article_title).with(article, anything).returns('TITLE') | |
| 83 | 83 | expects(:content_tag).with('p', '').returns('') |
| 84 | 84 | self.stubs(:params).returns({:npage => nil}) |
| 85 | 85 | |
| 86 | 86 | assert_equal 'TITLE', display_post(article) |
| 87 | 87 | end |
| 88 | 88 | |
| 89 | + should 'display full post by default' do | |
| 90 | + blog.children << article = fast_create(Article, :profile_id => profile.id, :parent_id => blog.id, :body => nil) | |
| 91 | + expects(:article_title).with(article, anything).returns('') | |
| 92 | + expects(:display_full_format).with(article).returns('FULL POST') | |
| 93 | + | |
| 94 | + assert_equal 'FULL POST', display_post(article) | |
| 95 | + end | |
| 96 | + | |
| 97 | + should 'no_comments is false if blog displays full post' do | |
| 98 | + blog.children << article = fast_create(Article, :profile_id => profile.id, :parent_id => blog.id, :body => nil) | |
| 99 | + expects(:article_title).with(article, :no_comments => false).returns('') | |
| 100 | + expects(:display_full_format).with(article).returns('FULL POST') | |
| 101 | + | |
| 102 | + assert_equal 'FULL POST', display_post(article, 'full') | |
| 103 | + end | |
| 104 | + | |
| 105 | + should 'no_comments is true if blog displays short post' do | |
| 106 | + blog.update_attribute(:visualization_format, 'short') | |
| 107 | + blog.children << article = fast_create(Article, :profile_id => profile.id, :parent_id => blog.id, :body => nil) | |
| 108 | + expects(:article_title).with(article, :no_comments => true).returns('') | |
| 109 | + expects(:display_short_format).with(article).returns('SHORT POST') | |
| 110 | + | |
| 111 | + assert_equal 'SHORT POST', display_post(article, 'short') | |
| 112 | + end | |
| 113 | + | |
| 114 | + | |
| 89 | 115 | should 'display link to file if post is an uploaded_file' do |
| 90 | 116 | file = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/test.txt', 'text/plain'), :profile => profile, :published => true, :parent => blog) |
| 91 | 117 | ... | ... |
test/unit/blog_test.rb
| ... | ... | @@ -149,4 +149,33 @@ class BlogTest < ActiveSupport::TestCase |
| 149 | 149 | assert_not_equal 'changed-name', blog.slug |
| 150 | 150 | end |
| 151 | 151 | |
| 152 | + should 'display full posts by default' do | |
| 153 | + blog = Blog.new | |
| 154 | + assert_equal 'full', blog.visualization_format | |
| 155 | + end | |
| 156 | + | |
| 157 | + should 'update visualization_format setting' do | |
| 158 | + p = create_user('testuser').person | |
| 159 | + p.articles << Blog.new(:profile => p, :name => 'Blog test') | |
| 160 | + blog = p.blog | |
| 161 | + blog.visualization_format = 'short' | |
| 162 | + assert blog.save! | |
| 163 | + assert_equal 'short', p.blog.visualization_format | |
| 164 | + end | |
| 165 | + | |
| 166 | + should 'allow only full and short as visualization_format' do | |
| 167 | + blog = Blog.new(:name => 'blog') | |
| 168 | + blog.visualization_format = 'wrong_format' | |
| 169 | + blog.valid? | |
| 170 | + assert blog.errors.invalid?(:visualization_format) | |
| 171 | + | |
| 172 | + blog.visualization_format = 'short' | |
| 173 | + blog.valid? | |
| 174 | + assert !blog.errors.invalid?(:visualization_format) | |
| 175 | + | |
| 176 | + blog.visualization_format = 'full' | |
| 177 | + blog.valid? | |
| 178 | + assert !blog.errors.invalid?(:visualization_format) | |
| 179 | + end | |
| 180 | + | |
| 152 | 181 | end | ... | ... |