Commit f5703d915c051ab9d4358b51a5639bb85e5ca693
1 parent
2cd9c622
Exists in
master
and in
28 other branches
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)
Showing
11 changed files
with
80 additions
and
34 deletions
Show diff stats
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> |
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 => 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 => 20101205034144) do | @@ -74,6 +74,7 @@ ActiveRecord::Schema.define(:version => 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 => 20101205034144) do | @@ -113,6 +114,7 @@ ActiveRecord::Schema.define(:version => 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 < Test::Unit::TestCase | @@ -1438,8 +1438,6 @@ class CmsControllerTest < 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 < ActiveSupport::TestCase | @@ -86,4 +86,37 @@ class SuggestArticleTest < 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 |