Commit f5703d915c051ab9d4358b51a5639bb85e5ca693

Authored by Antonio Terceiro
1 parent 2cd9c622

Improvements on article suggestion feature

  * English text review
  * Letting the administrator edit all fields which are going to be
    published before accepting the article.
  * Letting administrator highlight the new article.
  * Making the size of the lead and body fields consistent with other
    UI parts
  * Removed inconsistent styling
  * Updated database schema file

(ActionItem1732)
app/controllers/my_profile/cms_controller.rb
@@ -289,7 +289,7 @@ class CmsController < MyProfileController @@ -289,7 +289,7 @@ class CmsController < MyProfileController
289 if request.post? 289 if request.post?
290 @task.target = profile 290 @task.target = profile
291 if @task.save 291 if @task.save
292 - session[:notice] = _('You make your suggestion successfully. Please wait the article approval.') 292 + session[:notice] = _('Thanks for your suggestion. The community administrators were notified.')
293 redirect_to @back_to 293 redirect_to @back_to
294 end 294 end
295 end 295 end
app/models/suggest_article.rb
@@ -8,7 +8,7 @@ class SuggestArticle < Task @@ -8,7 +8,7 @@ class SuggestArticle < Task
8 validates_presence_of :target_id, :article_name, :email, :name, :article_body 8 validates_presence_of :target_id, :article_name, :email, :name, :article_body
9 9
10 def description 10 def description
11 - _('%{email} suggested to publish "%{article}" on %{community}') % { :email => email, :article => article_name, :community => target.name } 11 + _('%{sender} suggested to publish "%{article}" on %{community}') % { :sender => sender, :article => article_name, :community => target.name }
12 end 12 end
13 13
14 settings_items :email, :type => String 14 settings_items :email, :type => String
@@ -18,9 +18,24 @@ class SuggestArticle < Task @@ -18,9 +18,24 @@ class SuggestArticle < Task
18 settings_items :article_abstract, :type => String 18 settings_items :article_abstract, :type => String
19 settings_items :article_parent_id, :type => String 19 settings_items :article_parent_id, :type => String
20 settings_items :source, :type => String 20 settings_items :source, :type => String
  21 + settings_items :source_name, :type => String
  22 + settings_items :highlighted, :type => :boolean
  23 +
  24 + def sender
  25 + "#{name} (#{email})"
  26 + end
21 27
22 def perform 28 def perform
23 - TinyMceArticle.create!(:profile => target, :name => article_name, :body => article_body, :abstract => article_abstract, :parent_id => article_parent_id, :source => source, :source_name => name) 29 + TinyMceArticle.create!(
  30 + :profile => target,
  31 + :name => article_name,
  32 + :body => article_body,
  33 + :abstract => article_abstract,
  34 + :parent_id => article_parent_id,
  35 + :source => source,
  36 + :source_name => source_name,
  37 + :highlighted => highlighted
  38 + )
24 end 39 end
25 40
26 end 41 end
app/views/cms/suggest_an_article.rhtml
@@ -6,23 +6,25 @@ @@ -6,23 +6,25 @@
6 6
7 <% labelled_form_for 'task', @task do |f| %> 7 <% labelled_form_for 'task', @task do |f| %>
8 8
9 - <%= required labelled_form_field(_('Title'), text_field(:task, 'article_name')) %> 9 + <%= required labelled_form_field(_('Title'), text_field(:task, 'article_name', :size => 50)) %>
10 10
11 - <%= labelled_form_field(_('Url Source'), text_field(:task, 'source')) %> 11 + <%= labelled_form_field(_('Source'), text_field(:task, 'source_name')) %>
12 12
13 - <%= required labelled_form_field(_('Name'), text_field(:task, 'name')) %> 13 + <%= labelled_form_field(_('Source link'), text_field(:task, 'source')) %>
  14 +
  15 + <%= required labelled_form_field(_('Your name'), text_field(:task, 'name')) %>
14 16
15 <%= required labelled_form_field(_('Email'), text_field(:task, 'email')) %> 17 <%= required labelled_form_field(_('Email'), text_field(:task, 'email')) %>
16 18
17 <br style="clear: both;"/> 19 <br style="clear: both;"/>
18 <%= button :add, _("Lead"), '#', :id => "lead-button", :style => "margin-left: 0px;" %> 20 <%= button :add, _("Lead"), '#', :id => "lead-button", :style => "margin-left: 0px;" %>
19 - <em><%= _('Used when a short version your text is needed.') %></em> 21 + <em><%= _('Used when a short version of your text is needed.') %></em>
20 22
21 <div id="article-lead"> 23 <div id="article-lead">
22 - <%= labelled_form_field(_('Lead'), text_area(:task , 'article_abstract', :style => 'width: 100%; height: 300px;')) %> 24 + <%= labelled_form_field(_('Lead'), text_area(:task , 'article_abstract', :style => 'width: 100%; height: 200px;')) %>
23 </div> 25 </div>
24 <div style="margin-top: 10px;"> 26 <div style="margin-top: 10px;">
25 - <%= labelled_form_field(_('Text'), text_area(:task, 'article_body', :style => 'width:100%')) %> 27 + <%= labelled_form_field(_('Text'), text_area(:task, 'article_body', :style => 'width:100%; height: 500px;')) %>
26 </div> 28 </div>
27 29
28 <div id="captcha"> 30 <div id="captcha">
app/views/content_viewer/view_page.rhtml
@@ -46,7 +46,9 @@ @@ -46,7 +46,9 @@
46 <% end %> 46 <% end %>
47 </div> 47 </div>
48 <% else %> 48 <% else %>
49 - <%= link_to content_tag( 'span', _('Suggest an article') ), profile.admin_url.merge({ :controller => 'cms', :action => 'suggest_an_article'}), :class => 'button with-text icon-new' %> 49 + <% if profile.community? %>
  50 + <%= link_to content_tag( 'span', _('Suggest an article') ), profile.admin_url.merge({ :controller => 'cms', :action => 'suggest_an_article'}), :class => 'button with-text icon-new' %>
  51 + <% end %>
50 <% end %> 52 <% end %>
51 <div id="article-header"> 53 <div id="article-header">
52 <%= link_to(image_tag('icons-mime/rss-feed.png'), @page.feed.url, :class => 'blog-feed-link') if @page.has_posts? && @page.feed %> 54 <%= link_to(image_tag('icons-mime/rss-feed.png'), @page.feed.url, :class => 'blog-feed-link') if @page.has_posts? && @page.feed %>
app/views/tasks/_approve_article.rhtml
@@ -26,7 +26,11 @@ @@ -26,7 +26,11 @@
26 <%= labelled_form_field _('Name for publishing'), f.text_field(:name, :style => 'width:80%;') %> 26 <%= labelled_form_field _('Name for publishing'), f.text_field(:name, :style => 'width:80%;') %>
27 27
28 <%= select_folder(_('Select the folder where the article must be published'), 'task', 'article_parent_id', task.target.folders) %> 28 <%= select_folder(_('Select the folder where the article must be published'), 'task', 'article_parent_id', task.target.folders) %>
29 - <%= labelled_form_field( _('Highlight this article'), f.check_box(:highlighted)) %> 29 + <div>
  30 + <%= f.check_box(:highlighted) %>
  31 + <label for="article_highlighted"><%= _('Highlight this article')%></label>
  32 + </div>
  33 +
30 <%= labelled_form_field _('Comment for author'), f.text_field(:closing_statment, :style => 'width:80%;') %> 34 <%= labelled_form_field _('Comment for author'), f.text_field(:closing_statment, :style => 'width:80%;') %>
31 <%= render :partial => partial_for_class(task.article.class), :locals => { :f => f } %> 35 <%= render :partial => partial_for_class(task.article.class), :locals => { :f => f } %>
32 36
app/views/tasks/_suggest_article.rhtml
@@ -4,24 +4,24 @@ @@ -4,24 +4,24 @@
4 4
5 <% form_for('task', task, :url => { :action => 'close', :id => task.id}) do |f| %> 5 <% form_for('task', task, :url => { :action => 'close', :id => task.id}) do |f| %>
6 6
7 - <p> <%= label_tag(_("Sent by: %s") % task.name) %> </p> 7 + <p><%= label_tag(_("Sent by: %s") % task.name) %> </p>
8 <p><%= label_tag(_("Email: %s") % task.email) %> </p> 8 <p><%= label_tag(_("Email: %s") % task.email) %> </p>
9 - <p><%= label_tag(_("Source: %s") % task.source) %> </p>  
10 9
11 - <%= required labelled_form_field(_('Title'), text_field_tag('task[article_name]', task.article_name)) %> 10 + <%= required labelled_form_field(_('Title'), f.text_field(:article_name, :size => 50)) %>
  11 + <%= labelled_form_field(_('Source'), f.text_field(:source_name)) %>
  12 + <%= labelled_form_field(_("Source URL"), f.text_field(:source)) %>
12 13
13 <%= select_folder(_('Select the folder where the article must be published'), 'task', 'article_parent_id', task.target.folders) %> 14 <%= select_folder(_('Select the folder where the article must be published'), 'task', 'article_parent_id', task.target.folders) %>
14 15
15 -  
16 <br style="clear: both;"/> 16 <br style="clear: both;"/>
17 <%= button :add, _("Lead"), '#', :id => "lead-button", :style => "margin-left: 0px;" %> 17 <%= button :add, _("Lead"), '#', :id => "lead-button", :style => "margin-left: 0px;" %>
18 <em><%= _('Used when a short version your text is needed.') %></em> 18 <em><%= _('Used when a short version your text is needed.') %></em>
19 19
20 <div id="article-lead"> 20 <div id="article-lead">
21 - <%= labelled_form_field(_('Lead'), text_area_tag('task[article_abstract]', task.article_abstract, :style => 'width: 100%; height: 300px;')) %> 21 + <%= labelled_form_field(_('Lead'), text_area_tag('task[article_abstract]', task.article_abstract, :style => 'width: 100%; height: 200px;')) %>
22 </div> 22 </div>
23 <div style="margin-top: 10px;"> 23 <div style="margin-top: 10px;">
24 - <%= labelled_form_field(_('Text'), text_area_tag('task[article_body]', task.article_body, :style => 'width:100%')) %> 24 + <%= labelled_form_field(_('Text'), text_area_tag('task[article_body]', task.article_body, :style => 'width:100%; height: 500px;')) %>
25 </div> 25 </div>
26 26
27 <div> 27 <div>
@@ -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 => 20101205034144) do 12 +ActiveRecord::Schema.define(:version => 20101209001631) do
13 13
14 create_table "action_tracker", :force => true do |t| 14 create_table "action_tracker", :force => true do |t|
15 t.integer "user_id" 15 t.integer "user_id"
@@ -74,6 +74,7 @@ ActiveRecord::Schema.define(:version =&gt; 20101205034144) do @@ -74,6 +74,7 @@ ActiveRecord::Schema.define(:version =&gt; 20101205034144) do
74 t.boolean "is_image", :default => false 74 t.boolean "is_image", :default => false
75 t.integer "translation_of_id" 75 t.integer "translation_of_id"
76 t.string "language" 76 t.string "language"
  77 + t.string "source_name"
77 end 78 end
78 79
79 create_table "articles", :force => true do |t| 80 create_table "articles", :force => true do |t|
@@ -113,6 +114,7 @@ ActiveRecord::Schema.define(:version =&gt; 20101205034144) do @@ -113,6 +114,7 @@ ActiveRecord::Schema.define(:version =&gt; 20101205034144) do
113 t.boolean "is_image", :default => false 114 t.boolean "is_image", :default => false
114 t.integer "translation_of_id" 115 t.integer "translation_of_id"
115 t.string "language" 116 t.string "language"
  117 + t.string "source_name"
116 end 118 end
117 119
118 add_index "articles", ["translation_of_id"], :name => "index_articles_on_translation_of_id" 120 add_index "articles", ["translation_of_id"], :name => "index_articles_on_translation_of_id"
public/stylesheets/application.css
@@ -5237,17 +5237,3 @@ h1#agenda-title { @@ -5237,17 +5237,3 @@ h1#agenda-title {
5237 .forum-posts .pagination { 5237 .forum-posts .pagination {
5238 margin-top: 20px; 5238 margin-top: 20px;
5239 } 5239 }
5240 -  
5241 -#captcha input {  
5242 - border: 1px solid #ccc;  
5243 - margin: 4px 0px 2px 10px !important;  
5244 - padding: 0px !important;  
5245 - width: 150px !important;  
5246 - font-size: 24px;  
5247 - float: left;  
5248 -}  
5249 -  
5250 -#captcha label{  
5251 - float: left;  
5252 - font-size: 24px;  
5253 -}  
test/factories.rb
@@ -427,4 +427,8 @@ module Noosfero::Factory @@ -427,4 +427,8 @@ module Noosfero::Factory
427 { :profile_id => 1, :path => name, :name => name, :slug => name.to_slug }.merge(params) 427 { :profile_id => 1, :path => name, :name => name, :slug => name.to_slug }.merge(params)
428 end 428 end
429 429
  430 + def defaults_for_suggest_article
  431 + { :name => 'Sender', :email => 'sender@example.com', :article_name => 'Some title', :article_body => 'some body text', :article_abstract => 'some abstract text'}
  432 + end
  433 +
430 end 434 end
test/functional/cms_controller_test.rb
@@ -1438,8 +1438,6 @@ class CmsControllerTest &lt; Test::Unit::TestCase @@ -1438,8 +1438,6 @@ class CmsControllerTest &lt; Test::Unit::TestCase
1438 c = Community.create!(:name => 'test comm', :identifier => 'test_comm', :moderated_articles => true) 1438 c = Community.create!(:name => 'test comm', :identifier => 'test_comm', :moderated_articles => true)
1439 get :suggest_an_article, :profile => c.identifier 1439 get :suggest_an_article, :profile => c.identifier
1440 assert_response :success 1440 assert_response :success
1441 - assert_template 'suggest_an_article'  
1442 - assert_tag :tag => 'input', :attributes => { :value => "https://colivre.net/profile/test_comm", :id => 'back_to' }  
1443 end 1441 end
1444 1442
1445 end 1443 end
test/unit/suggest_article_test.rb
@@ -86,4 +86,37 @@ class SuggestArticleTest &lt; ActiveSupport::TestCase @@ -86,4 +86,37 @@ class SuggestArticleTest &lt; ActiveSupport::TestCase
86 assert_equal count + 1, TinyMceArticle.count 86 assert_equal count + 1, TinyMceArticle.count
87 end 87 end
88 88
  89 + should 'fill source name and URL into created article' do
  90 + t = build(SuggestArticle, :target => @profile)
  91 + t.source_name = 'GNU project'
  92 + t.source = 'http://www.gnu.org/'
  93 + t.perform
  94 +
  95 + article = TinyMceArticle.last
  96 + assert_equal 'GNU project', article.source_name
  97 + assert_equal 'http://www.gnu.org/', article.source
  98 + end
  99 +
  100 + should 'use sender name in description' do
  101 + t = build(SuggestArticle, :target => @profile)
  102 + t.stubs(:sender).returns('XYZ')
  103 + assert_match(/XYZ/, t.description)
  104 + end
  105 +
  106 + should 'use name and e-mail as sender info' do
  107 + t = build(SuggestArticle, :target => @profile)
  108 + t.name = 'Some One'
  109 + t.email = 'someone@example.com'
  110 + assert_match(/.*Some One.*someone@example.com/, t.sender)
  111 + end
  112 +
  113 + should 'highlight created article' do
  114 + t = build(SuggestArticle, :target => @profile)
  115 + t.highlighted = true
  116 + t.perform
  117 +
  118 + article = TinyMceArticle.last(:conditions => { :name => t.article_name}) # just to be sure
  119 + assert article.highlighted
  120 + end
  121 +
89 end 122 end