Commit 331e4e98e82b754672fd671fb3e79732b29eaa9e
1 parent
37096d03
Exists in
master
and in
29 other branches
Makes FilePresenter to work with all noosfero tests
Showing
17 changed files
with
145 additions
and
44 deletions
Show diff stats
app/controllers/application_controller.rb
1 | class ApplicationController < ActionController::Base | 1 | class ApplicationController < ActionController::Base |
2 | 2 | ||
3 | - # Preload FilePresenters to allow `FilePresenter.for()` to work | ||
4 | - FilePresenter::Generic | ||
5 | - FilePresenter::Image | ||
6 | - | ||
7 | before_filter :setup_multitenancy | 3 | before_filter :setup_multitenancy |
8 | before_filter :detect_stuff_by_domain | 4 | before_filter :detect_stuff_by_domain |
9 | before_filter :init_noosfero_plugins | 5 | before_filter :init_noosfero_plugins |
app/helpers/cms_helper.rb
@@ -33,7 +33,7 @@ module CmsHelper | @@ -33,7 +33,7 @@ module CmsHelper | ||
33 | link_to article_name, {:action => 'view', :id => article.id}, :class => icon_for_article(article) | 33 | link_to article_name, {:action => 'view', :id => article.id}, :class => icon_for_article(article) |
34 | else | 34 | else |
35 | if article.image? | 35 | if article.image? |
36 | - image_tag(icon_for_article(article)) + link_to(article_name, article.url) | 36 | + image_tag(icon_for_article(article)) + link_to(article_name, article.url) |
37 | else | 37 | else |
38 | link_to article_name, article.url, :class => icon_for_article(article) | 38 | link_to article_name, article.url, :class => icon_for_article(article) |
39 | end | 39 | end |
app/helpers/folder_helper.rb
@@ -41,7 +41,10 @@ module FolderHelper | @@ -41,7 +41,10 @@ module FolderHelper | ||
41 | end | 41 | end |
42 | 42 | ||
43 | def icon_for_article(article) | 43 | def icon_for_article(article) |
44 | - icon = article.icon_name || article.class.icon_name(article) | 44 | + article = FilePresenter.for article |
45 | + icon = article.respond_to?(:icon_name) ? | ||
46 | + article.icon_name : | ||
47 | + article.class.icon_name(article) | ||
45 | if (icon =~ /\//) | 48 | if (icon =~ /\//) |
46 | icon | 49 | icon |
47 | else | 50 | else |
app/models/uploaded_file.rb
@@ -60,13 +60,19 @@ class UploadedFile < Article | @@ -60,13 +60,19 @@ class UploadedFile < Article | ||
60 | 60 | ||
61 | postgresql_attachment_fu | 61 | postgresql_attachment_fu |
62 | 62 | ||
63 | + # Use this method only to get the generic icon for this kind of content. | ||
64 | + # If you want the specific icon for a file type or the iconified version | ||
65 | + # of an image, use FilePresenter.for(uploaded_file).icon_name | ||
63 | def self.icon_name(article = nil) | 66 | def self.icon_name(article = nil) |
64 | - warn = ('='*80) + "\n" + | ||
65 | - 'The method `UploadedFile.icon_name(obj)` is deprecated. ' + | ||
66 | - 'You must to encapsulate UploadedFile with `FilePresenter.for()`.' + | ||
67 | - "\n" + ('='*80) | ||
68 | - Rails.logger.warn warn if Rails.logger | ||
69 | - puts warn | 67 | + unless article.nil? |
68 | + warn = ('='*80) + "\n" + | ||
69 | + 'The method `UploadedFile.icon_name(obj)` is deprecated. ' + | ||
70 | + 'You must to encapsulate UploadedFile with `FilePresenter.for()`.' + | ||
71 | + "\n" + ('='*80) | ||
72 | + raise NoMethodError, warn if ENV['RAILS_ENV'] == 'test' | ||
73 | + Rails.logger.warn warn if Rails.logger | ||
74 | + puts warn if ENV['RAILS_ENV'] == 'development' | ||
75 | + end | ||
70 | 'upload-file' | 76 | 'upload-file' |
71 | end | 77 | end |
72 | 78 | ||
@@ -94,11 +100,12 @@ class UploadedFile < Article | @@ -94,11 +100,12 @@ class UploadedFile < Article | ||
94 | 100 | ||
95 | def to_html(options = {}) | 101 | def to_html(options = {}) |
96 | warn = ('='*80) + "\n" + | 102 | warn = ('='*80) + "\n" + |
97 | - 'The method `UploadedFile::to_html()` is deprecated. ' + | 103 | + 'The method `UploadedFile#to_html()` is deprecated. ' + |
98 | 'You must to encapsulate UploadedFile with `FilePresenter.for()`.' + | 104 | 'You must to encapsulate UploadedFile with `FilePresenter.for()`.' + |
99 | "\n" + ('='*80) | 105 | "\n" + ('='*80) |
106 | + raise NoMethodError, warn if ENV['RAILS_ENV'] == 'test' | ||
100 | Rails.logger.warn warn if Rails.logger | 107 | Rails.logger.warn warn if Rails.logger |
101 | - puts warn | 108 | + puts warn if ENV['RAILS_ENV'] == 'development' |
102 | article = self | 109 | article = self |
103 | if image? | 110 | if image? |
104 | lambda do | 111 | lambda do |
app/views/cms/view.rhtml
@@ -40,13 +40,15 @@ | @@ -40,13 +40,15 @@ | ||
40 | </tr> | 40 | </tr> |
41 | <% end %> | 41 | <% end %> |
42 | 42 | ||
43 | - <% @articles.each do |article| %> | 43 | + <% @articles.each do |article| article = FilePresenter.for article %> |
44 | <tr> | 44 | <tr> |
45 | <td> | 45 | <td> |
46 | <%= link_to_article(article) %> | 46 | <%= link_to_article(article) %> |
47 | </td> | 47 | </td> |
48 | <td> | 48 | <td> |
49 | - <%= article.class.short_description %> | 49 | + <%= article.respond_to?(:short_description) ? |
50 | + article.short_description : | ||
51 | + article.class.short_description %> | ||
50 | </td> | 52 | </td> |
51 | <td class="article-controls"> | 53 | <td class="article-controls"> |
52 | <%= expirable_button article, :edit, _('Edit'), {:action => 'edit', :id => article.id} if !remove_content_button(:edit) %> | 54 | <%= expirable_button article, :edit, _('Edit'), {:action => 'edit', :id => article.id} if !remove_content_button(:edit) %> |
app/views/file_presenter/_image.html.erb
@@ -31,7 +31,6 @@ | @@ -31,7 +31,6 @@ | ||
31 | <img src="<%=image.public_filename(:display)%>" class="<%=image.css_class_name%>"> | 31 | <img src="<%=image.public_filename(:display)%>" class="<%=image.css_class_name%>"> |
32 | 32 | ||
33 | <div class="uploaded-file-description <%= 'empty' if image.abstract.blank? %>"> | 33 | <div class="uploaded-file-description <%= 'empty' if image.abstract.blank? %>"> |
34 | - <%= image.class %> | ||
35 | <%= image.abstract %> | 34 | <%= image.abstract %> |
36 | </div> | 35 | </div> |
37 | 36 |
lib/file_presenter.rb
@@ -22,6 +22,15 @@ class FilePresenter | @@ -22,6 +22,15 @@ class FilePresenter | ||
22 | @file | 22 | @file |
23 | end | 23 | end |
24 | 24 | ||
25 | + def id | ||
26 | + @file.id | ||
27 | + end | ||
28 | + | ||
29 | + def reload | ||
30 | + @file.reload | ||
31 | + self | ||
32 | + end | ||
33 | + | ||
25 | # This method must be overridden in subclasses. | 34 | # This method must be overridden in subclasses. |
26 | # | 35 | # |
27 | # If the class accepts the file, return a number that represents the | 36 | # If the class accepts the file, return a number that represents the |
@@ -33,6 +42,10 @@ class FilePresenter | @@ -33,6 +42,10 @@ class FilePresenter | ||
33 | nil | 42 | nil |
34 | end | 43 | end |
35 | 44 | ||
45 | + def short_description | ||
46 | + _("File (%s)") % content_type | ||
47 | + end | ||
48 | + | ||
36 | # Define the css classes to style the page fragment with the file related | 49 | # Define the css classes to style the page fragment with the file related |
37 | # content. If you want other classes to identify this area to your | 50 | # content. If you want other classes to identify this area to your |
38 | # customized presenter, so do this: | 51 | # customized presenter, so do this: |
@@ -88,3 +101,7 @@ class FilePresenter | @@ -88,3 +101,7 @@ class FilePresenter | ||
88 | end | 101 | end |
89 | 102 | ||
90 | end | 103 | end |
104 | + | ||
105 | +# Preload FilePresenters to allow `FilePresenter.for()` to work | ||
106 | +FilePresenter::Generic | ||
107 | +FilePresenter::Image |
lib/file_presenter/image.rb
@@ -8,6 +8,10 @@ class FilePresenter::Image < FilePresenter | @@ -8,6 +8,10 @@ class FilePresenter::Image < FilePresenter | ||
8 | end | 8 | end |
9 | 9 | ||
10 | def icon_name | 10 | def icon_name |
11 | - article.public_filename :icon | 11 | + public_filename :icon |
12 | + end | ||
13 | + | ||
14 | + def short_description | ||
15 | + _('Image (%s)') % content_type.split('/')[1].upcase | ||
12 | end | 16 | end |
13 | end | 17 | end |
plugins/html5_video/lib/file_presenter/video.rb
@@ -7,4 +7,8 @@ class FilePresenter::Video < FilePresenter | @@ -7,4 +7,8 @@ class FilePresenter::Video < FilePresenter | ||
7 | return nil if f.content_type.nil? | 7 | return nil if f.content_type.nil? |
8 | ( f.content_type[0..4] == 'video' ) ? 10 : nil | 8 | ( f.content_type[0..4] == 'video' ) ? 10 : nil |
9 | end | 9 | end |
10 | + | ||
11 | + def short_description | ||
12 | + _('Video (%s)') % content_type.split('/')[1].upcase | ||
13 | + end | ||
10 | end | 14 | end |
plugins/html5_video/test/functional/content_viewer_controler_test.rb
0 → 100644
@@ -0,0 +1,30 @@ | @@ -0,0 +1,30 @@ | ||
1 | +require File.dirname(__FILE__) + '/../../../../test/test_helper' | ||
2 | +require 'content_viewer_controller' | ||
3 | + | ||
4 | +class ContentViewerController | ||
5 | + # Re-raise errors caught by the controller. | ||
6 | + def rescue_action(e) raise e end | ||
7 | + append_view_path File.join(File.dirname(__FILE__) + '/../../views') | ||
8 | +end | ||
9 | + | ||
10 | +class ContentViewerControllerTest < ActionController::TestCase | ||
11 | + | ||
12 | + all_fixtures | ||
13 | + | ||
14 | + def setup | ||
15 | + @controller = ContentViewerController.new | ||
16 | + @request = ActionController::TestRequest.new | ||
17 | + @response = ActionController::TestResponse.new | ||
18 | + | ||
19 | + @profile = create_user('testinguser').person | ||
20 | + @environment = @profile.environment | ||
21 | + end | ||
22 | + attr_reader :profile, :environment | ||
23 | + | ||
24 | + should 'add html5 video tag to the page of file type video' do | ||
25 | + file = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/test.txt', 'video/ogg'), :profile => profile) | ||
26 | + get :view_page, file.url.merge(:view=>:true) | ||
27 | + assert_select '#article video' | ||
28 | + end | ||
29 | + | ||
30 | +end |
plugins/html5_video/views/file_presenter/_video.html.erb
1 | <video class="video-js vjs-default-skin" controls poster="video.jpg" preload="auto" data-setup="{}"> | 1 | <video class="video-js vjs-default-skin" controls poster="video.jpg" preload="auto" data-setup="{}"> |
2 | - <source type="video/ogg" src="<%= video.public_filename %>"> | 2 | + <source type="video/ogg" src="<%= video.public_filename %>"/> |
3 | </video> | 3 | </video> |
4 | 4 | ||
5 | <div class="uploaded-file-description <%= 'empty' if video.abstract.blank? %>"> | 5 | <div class="uploaded-file-description <%= 'empty' if video.abstract.blank? %>"> |
test/functional/cms_controller_test.rb
@@ -931,8 +931,8 @@ class CmsControllerTest < ActionController::TestCase | @@ -931,8 +931,8 @@ class CmsControllerTest < ActionController::TestCase | ||
931 | :article => {:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')} | 931 | :article => {:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')} |
932 | 932 | ||
933 | process_delayed_job_queue | 933 | process_delayed_job_queue |
934 | - file = profile.articles.find_by_name('rails.png') | ||
935 | - assert File.exists?(file.class.icon_name(file)) | 934 | + file = FilePresenter.for profile.articles.find_by_name('rails.png') |
935 | + assert File.exists?(file.icon_name) | ||
936 | file.destroy | 936 | file.destroy |
937 | end | 937 | end |
938 | 938 | ||
@@ -942,8 +942,8 @@ class CmsControllerTest < ActionController::TestCase | @@ -942,8 +942,8 @@ class CmsControllerTest < ActionController::TestCase | ||
942 | :article => {:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')} | 942 | :article => {:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')} |
943 | 943 | ||
944 | process_delayed_job_queue | 944 | process_delayed_job_queue |
945 | - file = profile.articles.find_by_name('rails.png') | ||
946 | - assert File.exists?(file.class.icon_name(file)) | 945 | + file = FilePresenter.for profile.articles.find_by_name('rails.png') |
946 | + assert File.exists?(file.icon_name) | ||
947 | file.destroy | 947 | file.destroy |
948 | end | 948 | end |
949 | 949 |
test/functional/content_viewer_controller_test.rb
@@ -1502,4 +1502,12 @@ end | @@ -1502,4 +1502,12 @@ end | ||
1502 | assert_response 404 | 1502 | assert_response 404 |
1503 | end | 1503 | end |
1504 | 1504 | ||
1505 | + should 'display link to download of non-recognized file types on its page' do | ||
1506 | + file = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/test.txt', 'bin/unknown'), :profile => profile) | ||
1507 | + get :view_page, file.url.merge(:view=>:true) | ||
1508 | + assert_tag :tag => 'a', | ||
1509 | + :content => file.filename, | ||
1510 | + :attributes => { :href => file.public_filename } | ||
1511 | + end | ||
1512 | + | ||
1505 | end | 1513 | end |
test/unit/cms_helper_test.rb
@@ -41,6 +41,7 @@ class CmsHelperTest < ActiveSupport::TestCase | @@ -41,6 +41,7 @@ class CmsHelperTest < ActiveSupport::TestCase | ||
41 | should 'display image and link if article is an image' do | 41 | should 'display image and link if article is an image' do |
42 | profile = fast_create(Profile) | 42 | profile = fast_create(Profile) |
43 | file = UploadedFile.create!(:profile => profile, :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')) | 43 | file = UploadedFile.create!(:profile => profile, :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')) |
44 | + file = FilePresenter.for file | ||
44 | icon = icon_for_article(file) | 45 | icon = icon_for_article(file) |
45 | expects(:image_tag).with(icon).returns('icon') | 46 | expects(:image_tag).with(icon).returns('icon') |
46 | 47 |
@@ -0,0 +1,43 @@ | @@ -0,0 +1,43 @@ | ||
1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
2 | + | ||
3 | +class FilePresenterTest < ActiveSupport::TestCase | ||
4 | + | ||
5 | + should 'notify about deprecated method UploadedFile.icon_name' do | ||
6 | + profile = fast_create(Profile) | ||
7 | + file = UploadedFile.create!( | ||
8 | + :profile => profile, | ||
9 | + :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png') | ||
10 | + ) | ||
11 | + assert_raise NoMethodError do | ||
12 | + UploadedFile.icon_name file | ||
13 | + end | ||
14 | + ENV.stubs('[]').with('RAILS_ENV').returns('other') | ||
15 | + Rails.logger.expects(:warn) # must warn on any other RAILS_ENV | ||
16 | + stubs(:puts) | ||
17 | + UploadedFile.icon_name file | ||
18 | + end | ||
19 | + | ||
20 | + should 'notify about deprecated method UploadedFile#to_html' do | ||
21 | + profile = fast_create(Profile) | ||
22 | + file = UploadedFile.create!( | ||
23 | + :profile => profile, | ||
24 | + :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png') | ||
25 | + ) | ||
26 | + assert_raise NoMethodError do | ||
27 | + file.to_html | ||
28 | + end | ||
29 | + ENV.stubs('[]').with('RAILS_ENV').returns('other') | ||
30 | + Rails.logger.expects(:warn) # must warn on any other RAILS_ENV | ||
31 | + stubs(:puts) | ||
32 | + file.to_html | ||
33 | + end | ||
34 | + | ||
35 | + should 'return a thumbnail as icon for images ' do | ||
36 | + f = UploadedFile.new | ||
37 | + f.stubs(:image?).returns(true) | ||
38 | + p = FilePresenter.for f | ||
39 | + p.expects(:public_filename).with(:icon).returns('/path/to/file.xyz') | ||
40 | + assert_equal '/path/to/file.xyz', p.icon_name | ||
41 | + end | ||
42 | + | ||
43 | +end |
test/unit/folder_helper_test.rb
@@ -26,6 +26,7 @@ class FolderHelperTest < ActiveSupport::TestCase | @@ -26,6 +26,7 @@ class FolderHelperTest < ActiveSupport::TestCase | ||
26 | should 'display icon for images' do | 26 | should 'display icon for images' do |
27 | profile = fast_create(Profile) | 27 | profile = fast_create(Profile) |
28 | file = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'), :profile => profile) | 28 | file = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'), :profile => profile) |
29 | + file = FilePresenter.for file | ||
29 | process_delayed_job_queue | 30 | process_delayed_job_queue |
30 | 31 | ||
31 | assert_match /rails_icon\.png/, icon_for_article(file.reload) | 32 | assert_match /rails_icon\.png/, icon_for_article(file.reload) |
test/unit/uploaded_file_test.rb
@@ -7,14 +7,10 @@ class UploadedFileTest < ActiveSupport::TestCase | @@ -7,14 +7,10 @@ class UploadedFileTest < ActiveSupport::TestCase | ||
7 | end | 7 | end |
8 | attr_reader :profile | 8 | attr_reader :profile |
9 | 9 | ||
10 | - should 'return a thumbnail as icon for images ' do | ||
11 | - f = UploadedFile.new | ||
12 | - f.expects(:image?).returns(true) | ||
13 | - f.expects(:public_filename).with(:icon).returns('/path/to/file.xyz') | ||
14 | - assert_equal '/path/to/file.xyz', UploadedFile.icon_name(f) | ||
15 | - end | ||
16 | - | ||
17 | should 'return a default icon for uploaded files' do | 10 | should 'return a default icon for uploaded files' do |
11 | + ENV.stubs('[]').with('RAILS_ENV').returns('other') | ||
12 | + Rails.logger.expects(:warn) # warn about deprecatede usage of UploadedFile.icon_name | ||
13 | + stubs(:puts) | ||
18 | assert_equal 'upload-file', UploadedFile.icon_name | 14 | assert_equal 'upload-file', UploadedFile.icon_name |
19 | end | 15 | end |
20 | 16 | ||
@@ -113,8 +109,11 @@ class UploadedFileTest < ActiveSupport::TestCase | @@ -113,8 +109,11 @@ class UploadedFileTest < ActiveSupport::TestCase | ||
113 | p = create_user('test_user').person | 109 | p = create_user('test_user').person |
114 | file = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/test.txt', 'text/plain'), :profile => p) | 110 | file = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/test.txt', 'text/plain'), :profile => p) |
115 | 111 | ||
112 | + ENV.stubs('[]').with('RAILS_ENV').returns('other') | ||
113 | + Rails.logger.expects(:warn) # warn about deprecatede usage of UploadedFile#to_html | ||
114 | + stubs(:puts) | ||
116 | stubs(:content_tag).returns('link') | 115 | stubs(:content_tag).returns('link') |
117 | - expects(:link_to).with(file.name, file.url, :class => file.css_class_name) | 116 | + expects(:link_to).with(file.name, file.url) |
118 | 117 | ||
119 | instance_eval(&file.to_html) | 118 | instance_eval(&file.to_html) |
120 | end | 119 | end |
@@ -206,13 +205,6 @@ class UploadedFileTest < ActiveSupport::TestCase | @@ -206,13 +205,6 @@ class UploadedFileTest < ActiveSupport::TestCase | ||
206 | file.destroy | 205 | file.destroy |
207 | end | 206 | end |
208 | 207 | ||
209 | - should 'return the default thumbnail image as icon for images ' do | ||
210 | - f = UploadedFile.new | ||
211 | - f.expects(:image?).returns(true) | ||
212 | - f.expects(:public_filename).with(:icon).returns('/path/to/file.xyz') | ||
213 | - assert_equal '/path/to/file.xyz', UploadedFile.icon_name(f) | ||
214 | - end | ||
215 | - | ||
216 | should 'store width and height after processing' do | 208 | should 'store width and height after processing' do |
217 | file = UploadedFile.create!(:profile => @profile, :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')) | 209 | file = UploadedFile.create!(:profile => @profile, :uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')) |
218 | file.create_thumbnails | 210 | file.create_thumbnails |
@@ -287,12 +279,6 @@ class UploadedFileTest < ActiveSupport::TestCase | @@ -287,12 +279,6 @@ class UploadedFileTest < ActiveSupport::TestCase | ||
287 | assert_equal '', f.lead | 279 | assert_equal '', f.lead |
288 | end | 280 | end |
289 | 281 | ||
290 | - should 'survive when try to get icon_name from a file with mime_type nil' do | ||
291 | - f = UploadedFile.new | ||
292 | - f.expects(:mime_type).returns(nil) | ||
293 | - assert_equal 'upload-file', UploadedFile.icon_name(f) | ||
294 | - end | ||
295 | - | ||
296 | should 'upload to a folder with same name as the schema if database is postgresql' do | 282 | should 'upload to a folder with same name as the schema if database is postgresql' do |
297 | uses_postgresql 'image_schema_one' | 283 | uses_postgresql 'image_schema_one' |
298 | file1 = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'), :profile => @profile) | 284 | file1 = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'), :profile => @profile) |