Changeset 398

Show
Ignore:
Timestamp:
04/23/07 01:13:24 (1 year ago)
Author:
danshep
Message:

mental: Page saves denied through locking should render submitted changes, not db values.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/mental/radiant/app/controllers/admin/page_controller.rb

    r371 r398  
    9393     
    9494    def save 
    95       original_names = @page.parts.map { |part| part.name } 
    96       new_names = (params[:part] || {}).values.map { |part| part[:name]
    97       names_to_remove = (original_names - new_names) 
     95      parts = @page.parts 
     96      parts_to_update = {
     97      (params[:part]||{}).each {|k,v| parts_to_update[v[:name]] = v } 
    9898       
    99       parts_to_update = [] 
    100       (params[:part] || {}).values.each do |v| 
    101         if part = @page.parts.find_by_name(v[:name]) 
    102           part.attributes = part.attributes.merge(v) 
    103           parts_to_update << part 
     99      parts_to_remove = [] 
     100      @page.parts.each do |part| 
     101        if(attrs = parts_to_update.delete(part.name)) 
     102          part.attributes = part.attributes.merge(attrs) 
    104103        else 
    105           @page.parts.build(v) 
     104          parts_to_remove << part 
    106105        end 
    107106      end 
     107      parts_to_update.values.each do |attrs| 
     108        @page.parts.build(attrs) 
     109      end 
    108110      if result = @page.save 
    109         names_to_remove.each { |name| @page.parts.find_by_name(name).destroy } 
    110         parts_to_update.each { |part| part.save } 
     111        new_parts = @page.parts - parts_to_remove 
     112        new_parts.each {|x| x.save} 
     113        @page.parts = new_parts 
    111114      end 
    112115      result 
  • branches/mental/radiant/test/functional/admin/page_controller_test.rb

    r371 r398  
    189189    assert_match /has been modified/, flash[:error] 
    190190  end 
     191   
     192  def test_edit__post_with_parts_and_optimistic_locking 
     193    @page = create_test_page 
     194    @page.parts.create(part_params(:name => 'test-part-1', :content => 'original-1')) 
     195    post :edit, :id => @page.id, :page => page_params(:status_id => '1', :lock_version => '12'), :part => {'1' => part_params(:name => 'test-part-1', :content => 'changed-1')} 
     196    assert_response :success # not redirected 
     197    assert_match /has been modified/, flash[:error] 
     198    #changed value must not be saved 
     199    assert_equal 'original-1', @page.parts.find_by_name('test-part-1').content 
     200    #but must be rendered to page 
     201    assert_tag :tag => 'textarea', :content => 'changed-1'  
     202  end   
    191203   
    192204  def test_remove