Commit 630d23848b60862d3788133d3be2475daacb8fad
Exists in
master
and in
29 other branches
Merge branch 'stable'
Showing
15 changed files
with
120 additions
and
45 deletions
Show diff stats
AUTHORS
| @@ -153,6 +153,7 @@ Leandro Nunes dos Santos <leandronunes@gmail.com> | @@ -153,6 +153,7 @@ Leandro Nunes dos Santos <leandronunes@gmail.com> | ||
| 153 | Leandro Nunes dos Santos <leandro.santos@serpro.gov.br> | 153 | Leandro Nunes dos Santos <leandro.santos@serpro.gov.br> |
| 154 | LinguÁgil 2010 <linguagil.bahia@gmail.com> | 154 | LinguÁgil 2010 <linguagil.bahia@gmail.com> |
| 155 | Lucas Melo <lucas@colivre.coop.br> | 155 | Lucas Melo <lucas@colivre.coop.br> |
| 156 | +Lucas Melo <lucaspradomelo@gmail.com> | ||
| 156 | Luis David Aguilar Carlos <ludwig9003@gmail.com> | 157 | Luis David Aguilar Carlos <ludwig9003@gmail.com> |
| 157 | Martín Olivera <molivera@solar.org.ar> | 158 | Martín Olivera <molivera@solar.org.ar> |
| 158 | Moises Machado <moises@colivre.coop.br> | 159 | Moises Machado <moises@colivre.coop.br> |
app/helpers/application_helper.rb
| @@ -1345,10 +1345,7 @@ module ApplicationHelper | @@ -1345,10 +1345,7 @@ module ApplicationHelper | ||
| 1345 | options[:on_ready] ||= 'null' | 1345 | options[:on_ready] ||= 'null' |
| 1346 | 1346 | ||
| 1347 | result = text_field_tag(name, nil, text_field_options.merge(html_options.merge({:id => element_id}))) | 1347 | result = text_field_tag(name, nil, text_field_options.merge(html_options.merge({:id => element_id}))) |
| 1348 | - result += | ||
| 1349 | - " | ||
| 1350 | - <script type='text/javascript'> | ||
| 1351 | - jQuery('##{element_id}') | 1348 | + result += javascript_tag("jQuery('##{element_id}') |
| 1352 | .tokenInput('#{url_for(search_action)}', { | 1349 | .tokenInput('#{url_for(search_action)}', { |
| 1353 | minChars: #{options[:min_chars].to_json}, | 1350 | minChars: #{options[:min_chars].to_json}, |
| 1354 | prePopulate: #{options[:pre_populate].to_json}, | 1351 | prePopulate: #{options[:pre_populate].to_json}, |
| @@ -1364,16 +1361,15 @@ module ApplicationHelper | @@ -1364,16 +1361,15 @@ module ApplicationHelper | ||
| 1364 | onAdd: #{options[:on_add]}, | 1361 | onAdd: #{options[:on_add]}, |
| 1365 | onDelete: #{options[:on_delete]}, | 1362 | onDelete: #{options[:on_delete]}, |
| 1366 | onReady: #{options[:on_ready]}, | 1363 | onReady: #{options[:on_ready]}, |
| 1367 | - }) | ||
| 1368 | - " | ||
| 1369 | - result += options[:focus] ? ".focus();" : ";" | 1364 | + }); |
| 1365 | + ") | ||
| 1366 | + result += javascript_tag("jQuery('##{element_id}').focus();") if options[:focus] | ||
| 1370 | if options[:avoid_enter] | 1367 | if options[:avoid_enter] |
| 1371 | - result += "jQuery('#token-input-#{element_id}') | 1368 | + result += javascript_tag("jQuery('#token-input-#{element_id}') |
| 1372 | .live('keydown', function(event){ | 1369 | .live('keydown', function(event){ |
| 1373 | if(event.keyCode == '13') return false; | 1370 | if(event.keyCode == '13') return false; |
| 1374 | - });" | 1371 | + });") |
| 1375 | end | 1372 | end |
| 1376 | - result += "</script>" | ||
| 1377 | result | 1373 | result |
| 1378 | end | 1374 | end |
| 1379 | 1375 |
app/models/blog.rb
app/models/blog_archives_block.rb
| @@ -21,18 +21,22 @@ class BlogArchivesBlock < Block | @@ -21,18 +21,22 @@ class BlogArchivesBlock < Block | ||
| 21 | end | 21 | end |
| 22 | 22 | ||
| 23 | def visible_posts(person) | 23 | def visible_posts(person) |
| 24 | - blog.posts.native_translations.select {|post| post.display_to?(person)} | 24 | + #FIXME Performance issues with display_to. Must convert it to a scope. |
| 25 | + # Checkout this page for further information: http://noosfero.org/Development/ActionItem2705 | ||
| 26 | + blog.posts.published.native_translations #.select {|post| post.display_to?(person)} | ||
| 25 | end | 27 | end |
| 26 | 28 | ||
| 27 | def content(args={}) | 29 | def content(args={}) |
| 28 | owner_blog = self.blog | 30 | owner_blog = self.blog |
| 29 | return nil unless owner_blog | 31 | return nil unless owner_blog |
| 30 | results = '' | 32 | results = '' |
| 31 | - visible_posts(args[:person]).group_by {|i| i.published_at.year }.sort_by { |year,count| -year }.each do |year, results_by_year| | ||
| 32 | - results << content_tag('li', content_tag('strong', "#{year} (#{results_by_year.size})")) | 33 | + posts = visible_posts(args[:person]) |
| 34 | + posts.count(:all, :group => 'EXTRACT(YEAR FROM published_at)').sort_by {|year, count| -year.to_i}.each do |year, count| | ||
| 35 | + results << content_tag('li', content_tag('strong', "#{year} (#{count})")) | ||
| 33 | results << "<ul class='#{year}-archive'>" | 36 | results << "<ul class='#{year}-archive'>" |
| 34 | - results_by_year.group_by{|i| [ ('%02d' % i.published_at.month()), gettext(MONTHS[i.published_at.month() - 1])]}.sort.reverse.each do |month, results_by_month| | ||
| 35 | - results << content_tag('li', link_to("#{month[1]} (#{results_by_month.size})", owner_blog.url.merge(:year => year, :month => month[0]))) | 37 | + posts.count(:all, :conditions => ['EXTRACT(YEAR FROM published_at)=?', year], :group => 'EXTRACT(MONTH FROM published_at)').sort_by {|month, count| -month.to_i}.each do |month, count| |
| 38 | + month_name = gettext(MONTHS[month.to_i - 1]) | ||
| 39 | + results << content_tag('li', link_to("#{month_name} (#{count})", owner_blog.url.merge(:year => year, :month => month))) | ||
| 36 | end | 40 | end |
| 37 | results << "</ul>" | 41 | results << "</ul>" |
| 38 | end | 42 | end |
app/views/search/_full_blog.html.erb
| @@ -7,12 +7,12 @@ | @@ -7,12 +7,12 @@ | ||
| 7 | <tr class="search-blog-items"> | 7 | <tr class="search-blog-items"> |
| 8 | <td class="search-field-label"><%= _("Last posts") %></td> | 8 | <td class="search-field-label"><%= _("Last posts") %></td> |
| 9 | 9 | ||
| 10 | - <% r = blog.children.find(:all, :order => :updated_at, :conditions => ['type != ?', 'RssFeed']).last(3) %> | ||
| 11 | - <td class="<%= "search-field-none" if r.empty? %>"> | ||
| 12 | - <% r.each do |a| %> | ||
| 13 | - <%= link_to a.title, a.view_url, :class => 'search-blog-sample-item '+icon_for_article(a) %> | 10 | + <% last_posts = blog.last_posts %> |
| 11 | + <td class="<%= "search-field-none" if last_posts.empty? %>"> | ||
| 12 | + <% last_posts.each do |post| %> | ||
| 13 | + <%= link_to post.title, post.view_url, :class => 'search-blog-sample-item '+icon_for_article(post) %> | ||
| 14 | <% end %> | 14 | <% end %> |
| 15 | - <%= _('None') if r.empty? %> | 15 | + <%= _('None') if last_posts.empty? %> |
| 16 | </td> | 16 | </td> |
| 17 | </tr> | 17 | </tr> |
| 18 | 18 |
debian/changelog
| 1 | +noosfero (0.43.1) unstable; urgency=low | ||
| 2 | + | ||
| 3 | + * Bugfix release | ||
| 4 | + | ||
| 5 | + -- Rodrigo Souto <rodrigo@colivre.coop.br> Wed, 17 Jul 2013 01:20:46 -0300 | ||
| 6 | + | ||
| 1 | noosfero (0.43.0) unstable; urgency=low | 7 | noosfero (0.43.0) unstable; urgency=low |
| 2 | 8 | ||
| 3 | * Solr search converted to a plugin | 9 | * Solr search converted to a plugin |
lib/noosfero.rb
| @@ -3,7 +3,7 @@ require 'fast_gettext' | @@ -3,7 +3,7 @@ require 'fast_gettext' | ||
| 3 | 3 | ||
| 4 | module Noosfero | 4 | module Noosfero |
| 5 | PROJECT = 'noosfero' | 5 | PROJECT = 'noosfero' |
| 6 | - VERSION = '0.43.0' | 6 | + VERSION = '0.43.1' |
| 7 | 7 | ||
| 8 | def self.pattern_for_controllers_in_directory(dir) | 8 | def self.pattern_for_controllers_in_directory(dir) |
| 9 | disjunction = controllers_in_directory(dir).join('|') | 9 | disjunction = controllers_in_directory(dir).join('|') |
plugins/custom_forms/controllers/custom_forms_plugin_myprofile_controller.rb
| @@ -70,7 +70,8 @@ class CustomFormsPluginMyprofileController < MyProfileController | @@ -70,7 +70,8 @@ class CustomFormsPluginMyprofileController < MyProfileController | ||
| 70 | private | 70 | private |
| 71 | 71 | ||
| 72 | def new_fields(params) | 72 | def new_fields(params) |
| 73 | - result = params[:fields].map {|id, hash| hash.has_key?(:real_id) ? nil : hash}.compact | 73 | + keys = params[:fields].keys.sort{|a, b| a.to_i <=> b.to_i} |
| 74 | + result = keys.map { |id| (hash = params[:fields][id]).has_key?(:real_id) ? nil : hash}.compact | ||
| 74 | result.delete_if {|field| field[:name].blank?} | 75 | result.delete_if {|field| field[:name].blank?} |
| 75 | result | 76 | result |
| 76 | end | 77 | end |
plugins/custom_forms/db/migrate/20130702120732_add_position_to_custom_forms_plugin_fields.rb
0 → 100644
| @@ -0,0 +1,13 @@ | @@ -0,0 +1,13 @@ | ||
| 1 | +class AddPositionToCustomFormsPluginFields < ActiveRecord::Migration | ||
| 2 | + def self.up | ||
| 3 | + change_table :custom_forms_plugin_fields do |t| | ||
| 4 | + t.integer :position, :default => 0 | ||
| 5 | + end | ||
| 6 | + end | ||
| 7 | + | ||
| 8 | + def self.down | ||
| 9 | + change_table :custom_forms_plugin_fields do |t| | ||
| 10 | + t.remove :position | ||
| 11 | + end | ||
| 12 | + end | ||
| 13 | +end |
plugins/custom_forms/lib/custom_forms_plugin/field.rb
| @@ -12,5 +12,11 @@ class CustomFormsPlugin::Field < ActiveRecord::Base | @@ -12,5 +12,11 @@ class CustomFormsPlugin::Field < ActiveRecord::Base | ||
| 12 | before_validation do |field| | 12 | before_validation do |field| |
| 13 | field.slug = field.name.to_slug if field.name.present? | 13 | field.slug = field.name.to_slug if field.name.present? |
| 14 | end | 14 | end |
| 15 | + | ||
| 16 | + before_create do |field| | ||
| 17 | + if field.form.fields.exists? | ||
| 18 | + field.position = field.form.fields.order('position').last.position + 1 | ||
| 19 | + end | ||
| 20 | + end | ||
| 15 | end | 21 | end |
| 16 | 22 |
plugins/custom_forms/lib/custom_forms_plugin/form.rb
| 1 | class CustomFormsPlugin::Form < Noosfero::Plugin::ActiveRecord | 1 | class CustomFormsPlugin::Form < Noosfero::Plugin::ActiveRecord |
| 2 | belongs_to :profile | 2 | belongs_to :profile |
| 3 | 3 | ||
| 4 | - has_many :fields, :class_name => 'CustomFormsPlugin::Field', :dependent => :destroy | 4 | + has_many :fields, :class_name => 'CustomFormsPlugin::Field', :dependent => :destroy, :order => 'position' |
| 5 | has_many :submissions, :class_name => 'CustomFormsPlugin::Submission' | 5 | has_many :submissions, :class_name => 'CustomFormsPlugin::Submission' |
| 6 | 6 | ||
| 7 | serialize :access | 7 | serialize :access |
plugins/custom_forms/test/functional/custom_forms_plugin_myprofile_controller_test.rb
| @@ -40,7 +40,7 @@ class CustomFormsPluginMyprofileControllerTest < ActionController::TestCase | @@ -40,7 +40,7 @@ class CustomFormsPluginMyprofileControllerTest < ActionController::TestCase | ||
| 40 | should 'create a form' do | 40 | should 'create a form' do |
| 41 | format = '%Y-%m-%d %H:%M' | 41 | format = '%Y-%m-%d %H:%M' |
| 42 | begining = Time.now.strftime(format) | 42 | begining = Time.now.strftime(format) |
| 43 | - ending = (Time.now + 1.day).strftime('%Y-%m-%d %H:%M') | 43 | + ending = (Time.now + 1.day).strftime(format) |
| 44 | assert_difference CustomFormsPlugin::Form, :count, 1 do | 44 | assert_difference CustomFormsPlugin::Form, :count, 1 do |
| 45 | post :create, :profile => profile.identifier, | 45 | post :create, :profile => profile.identifier, |
| 46 | :form => { | 46 | :form => { |
| @@ -90,12 +90,42 @@ class CustomFormsPluginMyprofileControllerTest < ActionController::TestCase | @@ -90,12 +90,42 @@ class CustomFormsPluginMyprofileControllerTest < ActionController::TestCase | ||
| 90 | assert f2.kind_of?(CustomFormsPlugin::SelectField) | 90 | assert f2.kind_of?(CustomFormsPlugin::SelectField) |
| 91 | end | 91 | end |
| 92 | 92 | ||
| 93 | + should 'create fields in the order they are sent' do | ||
| 94 | + format = '%Y-%m-%d %H:%M' | ||
| 95 | + num_fields = 10 | ||
| 96 | + begining = Time.now.strftime(format) | ||
| 97 | + ending = (Time.now + 1.day).strftime(format) | ||
| 98 | + fields = {} | ||
| 99 | + num_fields.times do |i| | ||
| 100 | + fields[i.to_s] = { | ||
| 101 | + :name => i.to_s, | ||
| 102 | + :default_value => '', | ||
| 103 | + :type => 'text_field' | ||
| 104 | + } | ||
| 105 | + end | ||
| 106 | + assert_difference CustomFormsPlugin::Form, :count, 1 do | ||
| 107 | + post :create, :profile => profile.identifier, | ||
| 108 | + :form => { | ||
| 109 | + :name => 'My Form', | ||
| 110 | + :access => 'logged', | ||
| 111 | + :begining => begining, | ||
| 112 | + :ending => ending, | ||
| 113 | + :description => 'Cool form'}, | ||
| 114 | + :fields => fields | ||
| 115 | + end | ||
| 116 | + form = CustomFormsPlugin::Form.find_by_name('My Form') | ||
| 117 | + assert_equal num_fields, form.fields.count | ||
| 118 | + form.fields.find_each do |f| | ||
| 119 | + assert_equal f.position, f.name.to_i | ||
| 120 | + end | ||
| 121 | + end | ||
| 122 | + | ||
| 93 | should 'edit a form' do | 123 | should 'edit a form' do |
| 94 | form = CustomFormsPlugin::Form.create!(:profile => profile, :name => 'Free Software') | 124 | form = CustomFormsPlugin::Form.create!(:profile => profile, :name => 'Free Software') |
| 95 | field = CustomFormsPlugin::TextField.create!(:form => form, :name => 'License') | 125 | field = CustomFormsPlugin::TextField.create!(:form => form, :name => 'License') |
| 96 | format = '%Y-%m-%d %H:%M' | 126 | format = '%Y-%m-%d %H:%M' |
| 97 | begining = Time.now.strftime(format) | 127 | begining = Time.now.strftime(format) |
| 98 | - ending = (Time.now + 1.day).strftime('%Y-%m-%d %H:%M') | 128 | + ending = (Time.now + 1.day).strftime(format) |
| 99 | 129 | ||
| 100 | post :edit, :profile => profile.identifier, :id => form.id, | 130 | post :edit, :profile => profile.identifier, :id => form.id, |
| 101 | :form => {:name => 'My Form', :access => 'logged', :begining => begining, :ending => ending, :description => 'Cool form'}, | 131 | :form => {:name => 'My Form', :access => 'logged', :begining => begining, :ending => ending, :description => 'Cool form'}, |
plugins/custom_forms/test/unit/custom_forms_plugin/field_test.rb
| @@ -71,5 +71,15 @@ class CustomFormsPlugin::FieldTest < ActiveSupport::TestCase | @@ -71,5 +71,15 @@ class CustomFormsPlugin::FieldTest < ActiveSupport::TestCase | ||
| 71 | end | 71 | end |
| 72 | assert_equal form.fields, [license_field] | 72 | assert_equal form.fields, [license_field] |
| 73 | end | 73 | end |
| 74 | + | ||
| 75 | + should 'give positions by creation order' do | ||
| 76 | + form = CustomFormsPlugin::Form.create!(:name => 'Free Software', :profile => fast_create(Profile)) | ||
| 77 | + field_0 = CustomFormsPlugin::Field.create!(:name => 'License', :form => form) | ||
| 78 | + field_1 = CustomFormsPlugin::Field.create!(:name => 'URL', :form => form) | ||
| 79 | + field_2 = CustomFormsPlugin::Field.create!(:name => 'Wiki', :form => form) | ||
| 80 | + assert_equal 0, field_0.position | ||
| 81 | + assert_equal 1, field_1.position | ||
| 82 | + assert_equal 2, field_2.position | ||
| 83 | + end | ||
| 74 | end | 84 | end |
| 75 | 85 |
public/javascripts/chat.js
| @@ -99,6 +99,7 @@ jQuery(function($) { | @@ -99,6 +99,7 @@ jQuery(function($) { | ||
| 99 | }, | 99 | }, |
| 100 | 100 | ||
| 101 | render_body_message: function(body) { | 101 | render_body_message: function(body) { |
| 102 | + body = body.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\r?\n/g, '<br>'); | ||
| 102 | body = $().emoticon(body); | 103 | body = $().emoticon(body); |
| 103 | body = linkify(body, { | 104 | body = linkify(body, { |
| 104 | callback: function(text, href) { | 105 | callback: function(text, href) { |
test/unit/blog_archives_block_test.rb
| @@ -38,7 +38,7 @@ class BlogArchivesBlockTest < ActiveSupport::TestCase | @@ -38,7 +38,7 @@ class BlogArchivesBlockTest < ActiveSupport::TestCase | ||
| 38 | end | 38 | end |
| 39 | block = BlogArchivesBlock.new | 39 | block = BlogArchivesBlock.new |
| 40 | block.stubs(:owner).returns(profile) | 40 | block.stubs(:owner).returns(profile) |
| 41 | - assert_tag_in_string block.content, :tag => 'a', :content => 'January (10)', :attributes => {:href => /^http:\/\/.*\/flatline\/blog-one\?month=01&year=2008$/ } | 41 | + assert_tag_in_string block.content, :tag => 'a', :content => 'January (10)', :attributes => {:href => /^http:\/\/.*\/flatline\/blog-one\?month=1&year=2008$/ } |
| 42 | end | 42 | end |
| 43 | 43 | ||
| 44 | should 'order list of amount posts' do | 44 | should 'order list of amount posts' do |
| @@ -131,7 +131,7 @@ class BlogArchivesBlockTest < ActiveSupport::TestCase | @@ -131,7 +131,7 @@ class BlogArchivesBlockTest < ActiveSupport::TestCase | ||
| 131 | end | 131 | end |
| 132 | block = BlogArchivesBlock.new | 132 | block = BlogArchivesBlock.new |
| 133 | block.stubs(:owner).returns(profile) | 133 | block.stubs(:owner).returns(profile) |
| 134 | - assert_tag_in_string block.content, :tag => 'a', :content => 'January (2)', :attributes => {:href => /^http:\/\/.*\/flatline\/blog-one\?month=01&year=2008$/ } | 134 | + assert_tag_in_string block.content, :tag => 'a', :content => 'January (2)', :attributes => {:href => /^http:\/\/.*\/flatline\/blog-one\?month=1&year=2008$/ } |
| 135 | end | 135 | end |
| 136 | 136 | ||
| 137 | should 'not try to load a removed blog' do | 137 | should 'not try to load a removed blog' do |
| @@ -157,22 +157,25 @@ class BlogArchivesBlockTest < ActiveSupport::TestCase | @@ -157,22 +157,25 @@ class BlogArchivesBlockTest < ActiveSupport::TestCase | ||
| 157 | end | 157 | end |
| 158 | end | 158 | end |
| 159 | 159 | ||
| 160 | - should 'not count articles if the user can\'t see them' do | ||
| 161 | - person = create_user('testuser').person | ||
| 162 | - blog = fast_create(Blog, :profile_id => profile.id, :path => 'blog_path') | ||
| 163 | - block = fast_create(BlogArchivesBlock) | ||
| 164 | - | ||
| 165 | - feed = mock() | ||
| 166 | - feed.stubs(:url).returns(blog.url) | ||
| 167 | - blog.stubs(:feed).returns(feed) | ||
| 168 | - block.stubs(:blog).returns(blog) | ||
| 169 | - block.stubs(:owner).returns(profile) | ||
| 170 | - | ||
| 171 | - public_post = fast_create(TextileArticle, :profile_id => profile.id, :parent_id => blog.id, :published => true, :published_at => Time.mktime(2012, 'jan')) | ||
| 172 | - private_post = fast_create(TextileArticle, :profile_id => profile.id, :parent_id => blog.id, :published => false, :published_at => Time.mktime(2012, 'jan')) | ||
| 173 | - | ||
| 174 | - assert_match /January \(1\)/, block.content({:person => person}) | ||
| 175 | - assert_match /January \(1\)/, block.content() | ||
| 176 | - assert_match /January \(2\)/, block.content({:person => profile}) | ||
| 177 | - end | 160 | +#FIXME Performance issues with display_to. Must convert it to a scope. |
| 161 | +# Checkout this page for further information: http://noosfero.org/Development/ActionItem2705 | ||
| 162 | +# | ||
| 163 | +# should 'not count articles if the user can\'t see them' do | ||
| 164 | +# person = create_user('testuser').person | ||
| 165 | +# blog = fast_create(Blog, :profile_id => profile.id, :path => 'blog_path') | ||
| 166 | +# block = fast_create(BlogArchivesBlock) | ||
| 167 | +# | ||
| 168 | +# feed = mock() | ||
| 169 | +# feed.stubs(:url).returns(blog.url) | ||
| 170 | +# blog.stubs(:feed).returns(feed) | ||
| 171 | +# block.stubs(:blog).returns(blog) | ||
| 172 | +# block.stubs(:owner).returns(profile) | ||
| 173 | +# | ||
| 174 | +# public_post = fast_create(TextileArticle, :profile_id => profile.id, :parent_id => blog.id, :published => true, :published_at => Time.mktime(2012, 'jan')) | ||
| 175 | +# private_post = fast_create(TextileArticle, :profile_id => profile.id, :parent_id => blog.id, :published => false, :published_at => Time.mktime(2012, 'jan')) | ||
| 176 | +# | ||
| 177 | +# assert_match /January \(1\)/, block.content({:person => person}) | ||
| 178 | +# assert_match /January \(1\)/, block.content() | ||
| 179 | +# assert_match /January \(2\)/, block.content({:person => profile}) | ||
| 180 | +# end | ||
| 178 | end | 181 | end |