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 }}')