page_file tag can auto-resize images
Oleg
committed Oct 05, 2011
commit 240b4ff8e12966079f01ccdd996d9dcd173e9279
Showing 15
changed files with
108 additions
and 44 deletions
app/models/cms/block.rb
+2
-2
| @@ | @@ -21,7 +21,7 @@ class Cms::Block < ActiveRecord::Base |
| # -- Instance Methods ----------------------------------------------------- | |
| # Tag object that is using this block | |
| def tag | |
| - | page.tags(true).detect{|t| t.is_cms_block? && t.label == label} |
| + | @tag ||= page.tags(true).detect{|t| t.is_cms_block? && t.label == label} |
| end | |
| protected | |
| @@ | @@ -37,7 +37,7 @@ protected |
| temp_files.each do |file| | |
| self.files.collect{|f| f.mark_for_destruction } if single_file | |
| - | self.files.build(:site => self.page.site, :file => file) |
| + | self.files.build(:site => self.page.site, :dimensions => self.tag.try(:dimensions), :file => file) |
| end | |
| self.content = nil unless self.content.is_a?(String) | |
app/models/cms/file.rb
+8
-1
| @@ | @@ -8,8 +8,15 @@ class Cms::File < ActiveRecord::Base |
| cms_is_categorized | |
| + | attr_accessor :dimensions |
| + | |
| # -- AR Extensions -------------------------------------------------------- | |
| - | has_attached_file :file, ComfortableMexicanSofa.config.upload_file_options |
| + | has_attached_file :file, ComfortableMexicanSofa.config.upload_file_options.merge( |
| + | # dimensions accessor needs to be set before file assignment for this to work |
| + | :styles => lambda { |f| |
| + | f.instance.dimensions.blank?? { } : { :original => f.instance.dimensions } |
| + | } |
| + | ) |
| # -- Relationships -------------------------------------------------------- | |
| belongs_to :site | |
config/initializers/paperclip.rb
+1
-1
| @@ | @@ -1,5 +1,5 @@ |
| Paperclip.options[:command_path] = case Rails.env | |
| - | when 'development' then "/usr/local/bin" |
| + | when 'development', 'test' then '/usr/local/bin' |
| end | |
| if Rails.env.test? | |
comfortable_mexican_sofa/tags/page_file.rb b/lib/comfortable_mexican_sofa/tags/page_file.rb
+6
-1
| @@ | @@ -12,7 +12,12 @@ class ComfortableMexicanSofa::Tag::PageFile |
| # Type of the tag controls how file is rendered | |
| def type | |
| - | %w(partial url image link).member?(params[0]) ? params[0] : 'url' |
| + | s = params[0].to_s.gsub(/\[.*?\]/, '') |
| + | %w(partial url image link).member?(s) ? s : 'url' |
| + | end |
| + | |
| + | def dimensions |
| + | params[0].to_s.match(/\[(.*?)\]/)[1] rescue nil |
| end | |
| def content | |
comfortable_mexican_sofa/tags/page_files.rb b/lib/comfortable_mexican_sofa/tags/page_files.rb
+7
-1
| @@ | @@ -6,8 +6,14 @@ class ComfortableMexicanSofa::Tag::PageFiles |
| /\{\{\s*cms:page_files:(#{label}):?(.*?)\s*\}\}/ | |
| end | |
| + | # Type of the tag controls how file is rendered |
| def type | |
| - | %w(partial url image link).member?(params[0]) ? params[0] : 'url' |
| + | s = params[0].to_s.gsub(/\[.*?\]/, '') |
| + | %w(partial url image link).member?(s) ? s : 'url' |
| + | end |
| + | |
| + | def dimensions |
| + | params[0].to_s.match(/\[(.*?)\]/)[1] rescue nil |
| end | |
| def content | |
test/fixtures/files/document.pdf
+0
-0
test/fixtures/files/image.gif
+0
-0
test/fixtures/files/image.jpg
+0
-0
test/fixtures/files/invalid_file.gif
+0
-9
| @@ | @@ -1,9 +0,0 @@ |
| - | STDOUT.sync = true |
| - | |
| - | c = 0 |
| - | loop do |
| - | # print "\r%s" % %w[ / - \\ | ][(c +=1) % 4] |
| - | # print "\r%s" % ['o.o', 'o.O', 'O.O', 'O.o'][(c +=1) % 4] |
| - | |
| - | select(nil, nil, nil, 0.2) |
| - | end |
| \ No newline at end of file | |
test/fixtures/files/valid_image.jpg
+0
-0
test/functional/cms_admin/files_controller_test.rb
+11
-9
| @@ | @@ -61,7 +61,7 @@ class CmsAdmin::FilesControllerTest < ActionController::TestCase |
| post :create, :site_id => cms_sites(:default), :file => { | |
| :label => 'Test File', | |
| :description => 'Test Description', | |
| - | :file => [fixture_file_upload('files/valid_image.jpg')] |
| + | :file => [fixture_file_upload('files/image.jpg')] |
| } | |
| assert_response :redirect | |
| file = Cms::File.last | |
| @@ | @@ -90,16 +90,16 @@ class CmsAdmin::FilesControllerTest < ActionController::TestCase |
| :label => 'Test File', | |
| :description => 'Test Description', | |
| :file => [ | |
| - | fixture_file_upload('files/valid_image.jpg'), |
| - | fixture_file_upload('files/invalid_file.gif') |
| + | fixture_file_upload('files/image.jpg'), |
| + | fixture_file_upload('files/image.gif') |
| ] | |
| } | |
| assert_response :redirect | |
| file_a, file_b = Cms::File.all | |
| assert_equal cms_sites(:default), file_a.site | |
| - | assert_equal 'valid_image.jpg', file_a.file_file_name |
| - | assert_equal 'invalid_file.gif', file_b.file_file_name |
| + | assert_equal 'image.jpg', file_a.file_file_name |
| + | assert_equal 'image.gif', file_b.file_file_name |
| assert_equal 'Test File 1', file_a.label | |
| assert_equal 'Test File 2', file_b.label | |
| assert_equal 'Test Description', file_a.description | |
| @@ | @@ -111,15 +111,17 @@ class CmsAdmin::FilesControllerTest < ActionController::TestCase |
| end | |
| def test_create_as_xhr | |
| - | request.env['HTTP_X_FILE_NAME'] = 'test.pdf' |
| - | request.env['CONTENT_TYPE'] = 'application/pdf' |
| + | request.env['HTTP_X_FILE_NAME'] = 'image.jpg' |
| + | request.env['CONTENT_TYPE'] = 'image/jpeg' |
| + | request.env['RAW_POST_DATA'] = File.open(File.expand_path('../../fixtures/files/image.jpg', File.dirname(__FILE__))).read |
| assert_difference 'Cms::File.count' do | |
| xhr :post, :create, :site_id => cms_sites(:default) | |
| assert_response :success | |
| file = Cms::File.last | |
| - | assert_equal 'test.pdf', file.file_file_name |
| + | assert_equal 'image.jpg', file.file_file_name |
| + | assert_equal 'image/jpeg', file.file_content_type |
| end | |
| end | |
| @@ | @@ -168,7 +170,7 @@ class CmsAdmin::FilesControllerTest < ActionController::TestCase |
| def test_reorder | |
| file_one = cms_files(:default) | |
| file_two = cms_sites(:default).files.create( | |
| - | :file => fixture_file_upload('files/valid_image.jpg') |
| + | :file => fixture_file_upload('files/image.jpg') |
| ) | |
| assert_equal 0, file_one.position | |
| assert_equal 1, file_two.position | |
test/unit/models/block_test.rb
+8
-8
| @@ | @@ -72,7 +72,7 @@ class CmsBlockTest < ActiveSupport::TestCase |
| :parent_id => cms_pages(:default).id, | |
| :blocks_attributes => [ | |
| { :label => 'file', | |
| - | :content => [fixture_file_upload('files/valid_image.jpg'), fixture_file_upload('files/invalid_file.gif')] } |
| + | :content => [fixture_file_upload('files/image.jpg'), fixture_file_upload('files/document.pdf')] } |
| ] | |
| ) | |
| assert_equal 1, page.blocks.count | |
| @@ | @@ -80,7 +80,7 @@ class CmsBlockTest < ActiveSupport::TestCase |
| assert_equal 'file', block.label | |
| assert_equal nil, block.content | |
| assert_equal 1, block.files.count | |
| - | assert_equal 'valid_image.jpg', block.files.first.file_file_name |
| + | assert_equal 'image.jpg', block.files.first.file_file_name |
| page.reload | |
| assert_equal block.files.first.file.url, page.content | |
| @@ | @@ -90,13 +90,13 @@ class CmsBlockTest < ActiveSupport::TestCase |
| page.update_attributes!( | |
| :blocks_attributes => [ | |
| { :label => 'file', | |
| - | :content => fixture_file_upload('files/invalid_file.gif') } |
| + | :content => fixture_file_upload('files/document.pdf') } |
| ] | |
| ) | |
| page.reload | |
| block = page.blocks.first | |
| assert_equal 1, block.files.count | |
| - | assert_equal 'invalid_file.gif', block.files.first.file_file_name |
| + | assert_equal 'document.pdf', block.files.first.file_file_name |
| assert_equal block.files.first.file.url, page.content | |
| end | |
| end | |
| @@ | @@ -116,7 +116,7 @@ class CmsBlockTest < ActiveSupport::TestCase |
| :parent_id => cms_pages(:default).id, | |
| :blocks_attributes => [ | |
| { :label => 'files', | |
| - | :content => [fixture_file_upload('files/valid_image.jpg'), fixture_file_upload('files/invalid_file.gif')] } |
| + | :content => [fixture_file_upload('files/image.jpg'), fixture_file_upload('files/image.gif')] } |
| ] | |
| ) | |
| assert_equal 1, page.blocks.count | |
| @@ | @@ -124,7 +124,7 @@ class CmsBlockTest < ActiveSupport::TestCase |
| assert_equal 'files', block.label | |
| assert_equal nil, block.content | |
| assert_equal 2, block.files.count | |
| - | assert_equal ['valid_image.jpg', 'invalid_file.gif'], block.files.collect(&:file_file_name) |
| + | assert_equal ['image.jpg', 'image.gif'], block.files.collect(&:file_file_name) |
| end | |
| end | |
| @@ | @@ -133,13 +133,13 @@ class CmsBlockTest < ActiveSupport::TestCase |
| page.update_attributes!( | |
| :blocks_attributes => [ | |
| { :label => 'files', | |
| - | :content => [fixture_file_upload('files/valid_image.jpg'), fixture_file_upload('files/invalid_file.gif')] } |
| + | :content => [fixture_file_upload('files/document.pdf'), fixture_file_upload('files/image.gif')] } |
| ] | |
| ) | |
| page.reload | |
| block = page.blocks.first | |
| assert_equal 4, block.files.count | |
| - | assert_equal ['valid_image.jpg', 'invalid_file.gif', 'valid_image.jpg', 'invalid_file.gif'], |
| + | assert_equal ['image.jpg', 'image.gif', 'document.pdf', 'image.gif'], |
| block.files.collect(&:file_file_name) | |
| end | |
| end | |
test/unit/models/file_test.rb
+19
-2
| @@ | @@ -19,9 +19,26 @@ class CmsFileTest < ActiveSupport::TestCase |
| def test_create | |
| assert_difference 'Cms::File.count' do | |
| file = cms_sites(:default).files.create( | |
| - | :file => fixture_file_upload('files/valid_image.jpg') |
| + | :file => fixture_file_upload('files/image.jpg', 'image/jpeg') |
| ) | |
| - | assert_equal 'Valid Image', file.label |
| + | assert_equal 'Image', file.label |
| + | assert_equal 'image.jpg', file.file_file_name |
| + | assert_equal 'image/jpeg', file.file_content_type |
| + | assert_equal 6400, file.file_file_size |
| + | assert_equal 1, file.position |
| + | end |
| + | end |
| + | |
| + | def test_create_with_dimensions |
| + | assert_difference 'Cms::File.count' do |
| + | file = cms_sites(:default).files.create!( |
| + | :dimensions => '10x10#', |
| + | :file => fixture_file_upload('files/image.jpg', 'image/jpeg') |
| + | ) |
| + | assert_equal 'Image', file.label |
| + | assert_equal 'image.jpg', file.file_file_name |
| + | assert_equal 'image/jpeg', file.file_content_type |
| + | assert_equal 3624, file.file_file_size |
| assert_equal 1, file.position | |
| end | |
| end | |
test/unit/tags/page_file_test.rb
+33
-6
| @@ | @@ -7,6 +7,7 @@ class PageFileTagTest < ActiveSupport::TestCase |
| cms_pages(:default), '{{ cms:page_file:label }}' | |
| ) | |
| assert 'url', tag.type | |
| + | assert_equal nil, tag.dimensions |
| assert tag = ComfortableMexicanSofa::Tag::PageFile.initialize_tag( | |
| cms_pages(:default), '{{ cms:page_file:label:partial }}' | |
| @@ | @@ -14,6 +15,14 @@ class PageFileTagTest < ActiveSupport::TestCase |
| assert 'partial', tag.type | |
| end | |
| + | def test_initialize_tag_with_dimentions |
| + | assert tag = ComfortableMexicanSofa::Tag::PageFile.initialize_tag( |
| + | cms_pages(:default), '{{ cms:page_file:label:image[100x100#] }}' |
| + | ) |
| + | assert_equal 'image', tag.type |
| + | assert_equal '100x100#', tag.dimensions |
| + | end |
| + | |
| def test_initialize_tag_failure | |
| [ | |
| '{{cms:page_file}}', | |
| @@ | @@ -39,28 +48,28 @@ class PageFileTagTest < ActiveSupport::TestCase |
| page.update_attributes!( | |
| :blocks_attributes => [ | |
| { :label => 'file', | |
| - | :content => fixture_file_upload('files/valid_image.jpg') } |
| + | :content => fixture_file_upload('files/image.jpg') } |
| ] | |
| ) | |
| file = tag.block.files.first | |
| assert_equal file, tag.content | |
| - | assert_equal "/system/files/#{file.id}/original/valid_image.jpg", tag.render |
| + | assert_equal "/system/files/#{file.id}/original/image.jpg", tag.render |
| assert tag = ComfortableMexicanSofa::Tag::PageFile.initialize_tag(page, '{{ cms:page_file:file:link }}') | |
| - | assert_equal "<a href='/system/files/#{file.id}/original/valid_image.jpg' target='_blank'>file</a>", |
| + | assert_equal "<a href='/system/files/#{file.id}/original/image.jpg' target='_blank'>file</a>", |
| tag.render | |
| assert tag = ComfortableMexicanSofa::Tag::PageFile.initialize_tag(page, '{{ cms:page_file:file:link:link label }}') | |
| - | assert_equal "<a href='/system/files/#{file.id}/original/valid_image.jpg' target='_blank'>link label</a>", |
| + | assert_equal "<a href='/system/files/#{file.id}/original/image.jpg' target='_blank'>link label</a>", |
| tag.render | |
| assert tag = ComfortableMexicanSofa::Tag::PageFile.initialize_tag(page, '{{ cms:page_file:file:image }}') | |
| - | assert_equal "<img src='/system/files/#{file.id}/original/valid_image.jpg' alt='file' />", |
| + | assert_equal "<img src='/system/files/#{file.id}/original/image.jpg' alt='file' />", |
| tag.render | |
| assert tag = ComfortableMexicanSofa::Tag::PageFile.initialize_tag(page, '{{ cms:page_file:file:image:image alt }}') | |
| - | assert_equal "<img src='/system/files/#{file.id}/original/valid_image.jpg' alt='image alt' />", |
| + | assert_equal "<img src='/system/files/#{file.id}/original/image.jpg' alt='image alt' />", |
| tag.render | |
| assert tag = ComfortableMexicanSofa::Tag::PageFile.initialize_tag(page, '{{ cms:page_file:file:partial }}') | |
| @@ | @@ -76,4 +85,22 @@ class PageFileTagTest < ActiveSupport::TestCase |
| tag.render | |
| end | |
| + | def test_content_and_render_with_dimentions |
| + | layout = cms_layouts(:default) |
| + | layout.update_attribute(:content, '{{ cms:page_file:file:image[10x10#] }}') |
| + | page = cms_pages(:default) |
| + | |
| + | assert_difference 'Cms::File.count' do |
| + | page.update_attributes!( |
| + | :blocks_attributes => [ |
| + | { :label => 'file', |
| + | :content => fixture_file_upload('files/image.jpg') } |
| + | ] |
| + | ) |
| + | file = Cms::File.last |
| + | assert_equal 'image.jpg', file.file_file_name |
| + | assert_equal 3624, file.file_file_size |
| + | end |
| + | end |
| + | |
| end | |
| \ No newline at end of file | |
test/unit/tags/page_files_test.rb
+13
-4
| @@ | @@ -7,6 +7,7 @@ class PageFilesTagTest < ActiveSupport::TestCase |
| cms_pages(:default), '{{ cms:page_files:label }}' | |
| ) | |
| assert 'url', tag.type | |
| + | assert_equal nil, tag.dimensions |
| assert tag = ComfortableMexicanSofa::Tag::PageFiles.initialize_tag( | |
| cms_pages(:default), '{{ cms:page_files:label:partial }}' | |
| @@ | @@ -14,6 +15,14 @@ class PageFilesTagTest < ActiveSupport::TestCase |
| assert 'partial', tag.type | |
| end | |
| + | def test_initialize_tag_with_dimentions |
| + | assert tag = ComfortableMexicanSofa::Tag::PageFiles.initialize_tag( |
| + | cms_pages(:default), '{{ cms:page_files:label:image[100x100#] }}' |
| + | ) |
| + | assert_equal 'image', tag.type |
| + | assert_equal '100x100#', tag.dimensions |
| + | end |
| + | |
| def test_initialize_tag_failure | |
| [ | |
| '{{cms:page_files}}', | |
| @@ | @@ -39,21 +48,21 @@ class PageFilesTagTest < ActiveSupport::TestCase |
| page.update_attributes!( | |
| :blocks_attributes => [ | |
| { :label => 'files', | |
| - | :content => [fixture_file_upload('files/valid_image.jpg'), fixture_file_upload('files/invalid_file.gif')] } |
| + | :content => [fixture_file_upload('files/image.jpg'), fixture_file_upload('files/image.gif')] } |
| ] | |
| ) | |
| files = tag.block.files | |
| file_a, file_b = files | |
| assert_equal files, tag.content | |
| - | assert_equal "/system/files/#{file_a.id}/original/valid_image.jpg, /system/files/#{file_b.id}/original/invalid_file.gif", tag.render |
| + | assert_equal "/system/files/#{file_a.id}/original/image.jpg, /system/files/#{file_b.id}/original/image.gif", tag.render |
| assert tag = ComfortableMexicanSofa::Tag::PageFiles.initialize_tag(page, '{{ cms:page_files:files:link }}') | |
| - | assert_equal "<a href='/system/files/#{file_a.id}/original/valid_image.jpg' target='_blank'>Valid Image</a> <a href='/system/files/#{file_b.id}/original/invalid_file.gif' target='_blank'>Invalid File</a>", |
| + | assert_equal "<a href='/system/files/#{file_a.id}/original/image.jpg' target='_blank'>Image</a> <a href='/system/files/#{file_b.id}/original/image.gif' target='_blank'>Image</a>", |
| tag.render | |
| assert tag = ComfortableMexicanSofa::Tag::PageFiles.initialize_tag(page, '{{ cms:page_files:files:image }}') | |
| - | assert_equal "<img src='/system/files/#{file_a.id}/original/valid_image.jpg' alt='Valid Image' /> <img src='/system/files/#{file_b.id}/original/invalid_file.gif' alt='Invalid File' />", |
| + | assert_equal "<img src='/system/files/#{file_a.id}/original/image.jpg' alt='Image' /> <img src='/system/files/#{file_b.id}/original/image.gif' alt='Image' />", |
| tag.render | |
| assert tag = ComfortableMexicanSofa::Tag::PageFiles.initialize_tag(page, '{{ cms:page_files:files:partial }}') | |