Commit 92ed8d0cc8819ae43561d35445d118a68912d517
Committed by
 Daniela Feitosa
1 parent
49e084f8
Exists in
master
and in
22 other branches
Fixing validation error when try to approve published events
- Event.body should be string as all other article types - Removed Event.description - Moving existing data in description field to body (ActionItem1865)
Showing
6 changed files
with
72 additions
and
42 deletions
 
Show diff stats
app/models/event.rb
| 1 | 1 | class Event < Article | 
| 2 | 2 | |
| 3 | - acts_as_having_settings :field => :body | |
| 4 | - | |
| 5 | - settings_items :description, :type => :string | |
| 6 | - settings_items :link, :type => :string | |
| 7 | 3 | settings_items :address, :type => :string | 
| 8 | 4 | |
| 5 | + def link=(value) | |
| 6 | + self.setting[:link] = maybe_add_http(value) | |
| 7 | + end | |
| 8 | + | |
| 9 | + def link | |
| 10 | + maybe_add_http(self.setting[:link]) | |
| 11 | + end | |
| 12 | + | |
| 9 | 13 | xss_terminate :only => [ :link ], :on => 'validation' | 
| 10 | - xss_terminate :only => [ :description, :link, :address ], :with => 'white_list', :on => 'validation' | |
| 14 | + xss_terminate :only => [ :body, :link, :address ], :with => 'white_list', :on => 'validation' | |
| 11 | 15 | |
| 12 | 16 | def initialize(*args) | 
| 13 | 17 | super(*args) | 
| ... | ... | @@ -27,7 +31,7 @@ class Event < Article | 
| 27 | 31 | } | 
| 28 | 32 | |
| 29 | 33 | include WhiteListFilter | 
| 30 | - filter_iframes :description, :link, :address, :whitelist => lambda { profile && profile.environment && profile.environment.trusted_sites_for_iframe } | |
| 34 | + filter_iframes :body, :link, :address, :whitelist => lambda { profile && profile.environment && profile.environment.trusted_sites_for_iframe } | |
| 31 | 35 | |
| 32 | 36 | def self.description | 
| 33 | 37 | _('A calendar event') | 
| ... | ... | @@ -96,26 +100,18 @@ class Event < Article | 
| 96 | 100 | } | 
| 97 | 101 | } | 
| 98 | 102 | |
| 99 | - if self.description | |
| 103 | + if self.body | |
| 100 | 104 | html.div('_____XXXX_DESCRIPTION_GOES_HERE_XXXX_____', :class => 'event-description') | 
| 101 | 105 | end | 
| 102 | 106 | } | 
| 103 | 107 | |
| 104 | - if self.description | |
| 105 | - result.sub!('_____XXXX_DESCRIPTION_GOES_HERE_XXXX_____', self.description) | |
| 108 | + if self.body | |
| 109 | + result.sub!('_____XXXX_DESCRIPTION_GOES_HERE_XXXX_____', self.body) | |
| 106 | 110 | end | 
| 107 | 111 | |
| 108 | 112 | result | 
| 109 | 113 | end | 
| 110 | 114 | |
| 111 | - def link=(value) | |
| 112 | - self.body[:link] = maybe_add_http(value) | |
| 113 | - end | |
| 114 | - | |
| 115 | - def link | |
| 116 | - maybe_add_http(self.body[:link]) | |
| 117 | - end | |
| 118 | - | |
| 119 | 115 | def event? | 
| 120 | 116 | true | 
| 121 | 117 | end | ... | ... | 
app/views/cms/_event.rhtml
| ... | ... | @@ -15,5 +15,5 @@ | 
| 15 | 15 | |
| 16 | 16 | <%= labelled_form_field(_('Address:'), text_field(:article, :address)) %> | 
| 17 | 17 | |
| 18 | -<%= labelled_form_field(_('Information about the event:'), text_area(:article, :description, :cols => 64)) %> | |
| 18 | +<%= labelled_form_field(_('Information about the event:'), text_area(:article, :body, :cols => 64)) %> | |
| 19 | 19 | ... | ... | 
db/migrate/20110215153624_move_data_serialized_hash_to_setting_field_for_articles.rb
0 → 100644
| ... | ... | @@ -0,0 +1,26 @@ | 
| 1 | +class MoveDataSerializedHashToSettingFieldForArticles < ActiveRecord::Migration | |
| 2 | + def self.up | |
| 3 | + select_all("SELECT id FROM tasks WHERE type = 'ApproveArticle' AND status = 1").each do |data| | |
| 4 | + article = Task.find(data['id']).article | |
| 5 | + next unless article.kind_of?(Event) | |
| 6 | + body = '' | |
| 7 | + begin | |
| 8 | + body = YAML.load(article.body) | |
| 9 | + rescue | |
| 10 | + # do nothing | |
| 11 | + next | |
| 12 | + end | |
| 13 | + if body.kind_of?(Hash) | |
| 14 | + settings = article.setting.merge(body) | |
| 15 | + body = ActiveRecord::Base.sanitize_sql_for_assignment(:body => settings[:description]) | |
| 16 | + update("UPDATE articles set %s WHERE id = %d" % [body, article.id]) | |
| 17 | + setting = ActiveRecord::Base.sanitize_sql_for_assignment(:setting => settings.to_yaml) | |
| 18 | + update("UPDATE articles set %s WHERE id = %d" % [setting, article.id]) | |
| 19 | + end | |
| 20 | + end | |
| 21 | + end | |
| 22 | + | |
| 23 | + def self.down | |
| 24 | + say "Nothing to undo" | |
| 25 | + end | |
| 26 | +end | ... | ... | 
db/schema.rb
| ... | ... | @@ -9,7 +9,7 @@ | 
| 9 | 9 | # | 
| 10 | 10 | # It's strongly recommended to check this file into your version control system. | 
| 11 | 11 | |
| 12 | -ActiveRecord::Schema.define(:version => 20110203160153) do | |
| 12 | +ActiveRecord::Schema.define(:version => 20110215153624) do | |
| 13 | 13 | |
| 14 | 14 | create_table "action_tracker", :force => true do |t| | 
| 15 | 15 | t.integer "user_id" | ... | ... | 
test/unit/approve_article_test.rb
| ... | ... | @@ -362,4 +362,12 @@ class ApproveArticleTest < ActiveSupport::TestCase | 
| 362 | 362 | assert_match(/#{task.requestor.name} wants to publish the article: #{article.name}/, email.subject) | 
| 363 | 363 | end | 
| 364 | 364 | |
| 365 | + should 'approve an event' do | |
| 366 | + event = fast_create(Event, :profile_id => profile.id, :name => 'Event test', :slug => 'event-test', :abstract => 'Lead of article', :body => 'This is my event') | |
| 367 | + task = ApproveArticle.create!(:name => 'Event test', :article => event, :target => community, :requestor => profile) | |
| 368 | + assert_difference event.class, :count do | |
| 369 | + task.finish | |
| 370 | + end | |
| 371 | + end | |
| 372 | + | |
| 365 | 373 | end | ... | ... | 
test/unit/event_test.rb
| ... | ... | @@ -14,9 +14,9 @@ class EventTest < ActiveSupport::TestCase | 
| 14 | 14 | assert_kind_of String, Event.short_description | 
| 15 | 15 | end | 
| 16 | 16 | |
| 17 | - should 'have a description' do | |
| 18 | - e = Event.new(:description => 'some useful description') | |
| 19 | - assert_equal 'some useful description', e.description | |
| 17 | + should 'have a body' do | |
| 18 | + e = Event.new(:body => 'some useful description') | |
| 19 | + assert_equal 'some useful description', e.body | |
| 20 | 20 | end | 
| 21 | 21 | |
| 22 | 22 | should 'have a link' do | 
| ... | ... | @@ -62,9 +62,9 @@ class EventTest < ActiveSupport::TestCase | 
| 62 | 62 | assert_includes Event.find_by_contents('surprisingly'), e | 
| 63 | 63 | end | 
| 64 | 64 | |
| 65 | - should 'be indexed by description' do | |
| 65 | + should 'be indexed by body' do | |
| 66 | 66 | profile = create_user('testuser').person | 
| 67 | - e = Event.create!(:name => 'bli', :start_date => Date.new(2008, 06, 06), :profile => profile, :description => 'my surprisingly long description about my freaking nice event') | |
| 67 | + e = Event.create!(:name => 'bli', :start_date => Date.new(2008, 06, 06), :profile => profile, :body => 'my surprisingly long description about my freaking nice event') | |
| 68 | 68 | assert_includes Event.find_by_contents('surprisingly'), e | 
| 69 | 69 | end | 
| 70 | 70 | |
| ... | ... | @@ -123,7 +123,7 @@ class EventTest < ActiveSupport::TestCase | 
| 123 | 123 | end | 
| 124 | 124 | |
| 125 | 125 | should 'provide nice display format' do | 
| 126 | - e = Event.new(:start_date => Date.new(2008,1,1), :end_date => Date.new(2008,1,1), :link => 'http://www.myevent.org', :description => 'my somewhat short description') | |
| 126 | + e = Event.new(:start_date => Date.new(2008,1,1), :end_date => Date.new(2008,1,1), :link => 'http://www.myevent.org', :body => 'my somewhat short description') | |
| 127 | 127 | |
| 128 | 128 | assert_tag_in_string e.to_html, :content => Regexp.new("January 1, 2008") | 
| 129 | 129 | assert_tag_in_string e.to_html, :content => 'my somewhat short description' | 
| ... | ... | @@ -131,9 +131,9 @@ class EventTest < ActiveSupport::TestCase | 
| 131 | 131 | |
| 132 | 132 | end | 
| 133 | 133 | |
| 134 | - should 'not crash when description is blank' do | |
| 134 | + should 'not crash when body is blank' do | |
| 135 | 135 | e = Event.new | 
| 136 | - assert_nil e.description | |
| 136 | + assert_nil e.body | |
| 137 | 137 | assert_no_match(/_____XXXX_DESCRIPTION_GOES_HERE_XXXX_____/, e.to_html) | 
| 138 | 138 | end | 
| 139 | 139 | |
| ... | ... | @@ -144,30 +144,30 @@ class EventTest < ActiveSupport::TestCase | 
| 144 | 144 | |
| 145 | 145 | should 'add http:// when reading link' do | 
| 146 | 146 | a = Event.new | 
| 147 | - a.body[:link] = 'www.gnu.org' | |
| 147 | + a.setting[:link] = 'www.gnu.org' | |
| 148 | 148 | assert_equal 'http://www.gnu.org', a.link | 
| 149 | 149 | end | 
| 150 | 150 | |
| 151 | 151 | should 'not add http:// to empty link' do | 
| 152 | 152 | a = Event.new | 
| 153 | - a.body[:link] = '' | |
| 153 | + a.setting[:link] = '' | |
| 154 | 154 | assert_equal '', a.link | 
| 155 | - a.body[:link] = nil | |
| 155 | + a.setting[:link] = nil | |
| 156 | 156 | assert_equal '', a.link | 
| 157 | 157 | end | 
| 158 | 158 | |
| 159 | - should 'not escape HTML in description' do | |
| 160 | - a = Event.new(:description => '<p>a paragraph of text</p>', :link => 'www.gnu.org') | |
| 159 | + should 'not escape HTML in body' do | |
| 160 | + a = Event.new(:body => '<p>a paragraph of text</p>', :link => 'www.gnu.org') | |
| 161 | 161 | |
| 162 | 162 | assert_match '<p>a paragraph of text</p>', a.to_html | 
| 163 | 163 | end | 
| 164 | 164 | |
| 165 | - should 'filter HTML in description' do | |
| 165 | + should 'filter HTML in body' do | |
| 166 | 166 | profile = create_user('testuser').person | 
| 167 | - e = Event.create!(:profile => profile, :name => 'test', :description => '<p>a paragraph (valid)</p><script type="text/javascript">/* this is invalid */</script>"', :link => 'www.colivre.coop.br', :start_date => Date.today) | |
| 167 | + e = Event.create!(:profile => profile, :name => 'test', :body => '<p>a paragraph (valid)</p><script type="text/javascript">/* this is invalid */</script>"', :link => 'www.colivre.coop.br', :start_date => Date.today) | |
| 168 | 168 | |
| 169 | - assert_tag_in_string e.description, :tag => 'p', :content => 'a paragraph (valid)' | |
| 170 | - assert_no_tag_in_string e.description, :tag => 'script' | |
| 169 | + assert_tag_in_string e.body, :tag => 'p', :content => 'a paragraph (valid)' | |
| 170 | + assert_no_tag_in_string e.body, :tag => 'script' | |
| 171 | 171 | end | 
| 172 | 172 | |
| 173 | 173 | should 'nil to link' do | 
| ... | ... | @@ -238,31 +238,31 @@ class EventTest < ActiveSupport::TestCase | 
| 238 | 238 | |
| 239 | 239 | should 'filter fields with white_list filter' do | 
| 240 | 240 | event = Event.new | 
| 241 | - event.description = "<h1> Description </h1>" | |
| 241 | + event.body = "<h1> Description </h1>" | |
| 242 | 242 | event.address = "<strong> Address <strong>" | 
| 243 | 243 | event.valid? | 
| 244 | 244 | |
| 245 | - assert_equal "<h1> Description </h1>", event.description | |
| 245 | + assert_equal "<h1> Description </h1>", event.body | |
| 246 | 246 | assert_equal "<strong> Address <strong>", event.address | 
| 247 | 247 | end | 
| 248 | 248 | |
| 249 | 249 | should 'escape malformed html tags' do | 
| 250 | 250 | event = Event.new | 
| 251 | - event.description = "<h1<< Description >>/h1>" | |
| 251 | + event.body = "<h1<< Description >>/h1>" | |
| 252 | 252 | event.address = "<strong>><< Address <strong>" | 
| 253 | 253 | event.valid? | 
| 254 | 254 | |
| 255 | - assert_no_match /[<>]/, event.description | |
| 255 | + assert_no_match /[<>]/, event.body | |
| 256 | 256 | assert_no_match /[<>]/, event.address | 
| 257 | 257 | end | 
| 258 | 258 | |
| 259 | 259 | should 'not sanitize html comments' do | 
| 260 | 260 | event = Event.new | 
| 261 | - event.description = '<p><!-- <asdf> << aasdfa >>> --> <h1> Wellformed html code </h1>' | |
| 261 | + event.body = '<p><!-- <asdf> << aasdfa >>> --> <h1> Wellformed html code </h1>' | |
| 262 | 262 | event.address = '<p><!-- <asdf> << aasdfa >>> --> <h1> Wellformed html code </h1>' | 
| 263 | 263 | event.valid? | 
| 264 | 264 | |
| 265 | - assert_match /<!-- .* --> <h1> Wellformed html code <\/h1>/, event.description | |
| 265 | + assert_match /<!-- .* --> <h1> Wellformed html code <\/h1>/, event.body | |
| 266 | 266 | assert_match /<!-- .* --> <h1> Wellformed html code <\/h1>/, event.address | 
| 267 | 267 | end | 
| 268 | 268 | ... | ... |