Commit fcbf43047acf55d2c16319f6e1019f2a054a7d64

Authored by Rodrigo Souto
Committed by Antonio Terceiro
1 parent 496e8b0c

Fixing performance issues on media-listing

  * Also adding a named_scope for images

(ActionItem1698)
app/controllers/my_profile/cms_controller.rb
@@ -285,20 +285,20 @@ class CmsController < MyProfileController @@ -285,20 +285,20 @@ class CmsController < MyProfileController
285 def media_listing 285 def media_listing
286 if params[:image_folder_id] 286 if params[:image_folder_id]
287 folder = profile.articles.find(params[:image_folder_id]) if !params[:image_folder_id].blank? 287 folder = profile.articles.find(params[:image_folder_id]) if !params[:image_folder_id].blank?
288 - @images = (folder ? folder.children : UploadedFile.find(:all, :order => 'created_at desc', :conditions => ["profile_id = ? AND parent_id is NULL", profile ])).select { |c| c.image? } 288 + @images = (folder ? folder.children : profile.top_level_articles).images
289 elsif params[:document_folder_id] 289 elsif params[:document_folder_id]
290 folder = profile.articles.find(params[:document_folder_id]) if !params[:document_folder_id].blank? 290 folder = profile.articles.find(params[:document_folder_id]) if !params[:document_folder_id].blank?
291 - @documents = (folder ? folder.children : UploadedFile.find(:all, :order => 'created_at desc', :conditions => ["profile_id = ? AND parent_id is NULL", profile ])).select { |c| c.kind_of?(UploadedFile) && !c.image? } 291 + @documents = (folder ? folder.children : profile.top_level_articles)
292 else 292 else
293 - @documents = UploadedFile.find(:all, :order => 'created_at desc', :conditions => ["profile_id = ? AND parent_id is NULL", profile ])  
294 - @images = @documents.select(&:image?) 293 + @documents = profile.articles
  294 + @images = @documents.images
295 @documents -= @images 295 @documents -= @images
296 end 296 end
297 297
298 - @images = @images.paginate(:per_page => per_page, :page => params[:ipage]) if @images  
299 - @documents = @documents.paginate(:per_page => per_page, :page => params[:dpage]) if @documents 298 + @images = @images.paginate(:per_page => per_page, :page => params[:ipage], :order => "updated_at desc") if @images
  299 + @documents = @documents.paginate(:per_page => per_page, :page => params[:dpage], :order => "updated_at desc", :conditions => {:is_image => false}) if @documents
300 300
301 - @folders = Folder.find(:all, :conditions => { :profile_id => profile }) 301 + @folders = profile.folders
302 @image_folders = @folders.select {|f| f.children.any? {|c| c.image?} } 302 @image_folders = @folders.select {|f| f.children.any? {|c| c.image?} }
303 @document_folders = @folders.select {|f| f.children.any? {|c| !c.image? && c.kind_of?(UploadedFile) } } 303 @document_folders = @folders.select {|f| f.children.any? {|c| !c.image? && c.kind_of?(UploadedFile) } }
304 304
app/models/article.rb
@@ -238,6 +238,7 @@ class Article < ActiveRecord::Base @@ -238,6 +238,7 @@ class Article < ActiveRecord::Base
238 238
239 named_scope :published, :conditions => { :published => true } 239 named_scope :published, :conditions => { :published => true }
240 named_scope :folders, :conditions => { :type => ['Folder', 'Blog'] } 240 named_scope :folders, :conditions => { :type => ['Folder', 'Blog'] }
  241 + named_scope :images, :conditions => { :is_image => true }
241 242
242 def display_unpublished_article_to?(user) 243 def display_unpublished_article_to?(user)
243 self.author == user || allow_view_private_content?(user) || user == self.profile || 244 self.author == user || allow_view_private_content?(user) || user == self.profile ||
app/models/uploaded_file.rb
@@ -16,6 +16,10 @@ class UploadedFile < Article @@ -16,6 +16,10 @@ class UploadedFile < Article
16 16
17 validates_size_of :title, :maximum => 60, :if => (lambda { |file| !file.title.blank? }) 17 validates_size_of :title, :maximum => 60, :if => (lambda { |file| !file.title.blank? })
18 18
  19 + before_create do |uploaded_file|
  20 + uploaded_file.is_image = true if uploaded_file.image?
  21 + end
  22 +
19 def thumbnail_path 23 def thumbnail_path
20 self.image? ? self.full_filename(:thumb).gsub(File.join(RAILS_ROOT, 'public'), '') : nil 24 self.image? ? self.full_filename(:thumb).gsub(File.join(RAILS_ROOT, 'public'), '') : nil
21 end 25 end
db/migrate/20100921121528_add_is_image_to_articles.rb 0 → 100644
@@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
  1 +class AddIsImageToArticles < ActiveRecord::Migration
  2 + def self.up
  3 + add_column :articles, :is_image, :boolean, :default => false
  4 + add_column :article_versions, :is_image, :boolean, :default => false
  5 +
  6 + execute ActiveRecord::Base.sanitize_sql(["update articles set is_image = ? where articles.content_type like 'image/%'", true])
  7 + end
  8 +
  9 + def self.down
  10 + remove_column :articles, :is_image
  11 + remove_column :article_versions, :is_image
  12 + end
  13 +end
test/functional/cms_controller_test.rb
@@ -1164,6 +1164,7 @@ class CmsControllerTest &lt; Test::Unit::TestCase @@ -1164,6 +1164,7 @@ class CmsControllerTest &lt; Test::Unit::TestCase
1164 1164
1165 should 'display pagination links of documents' do 1165 should 'display pagination links of documents' do
1166 @controller.stubs(:per_page).returns(1) 1166 @controller.stubs(:per_page).returns(1)
  1167 + profile.articles.destroy_all
1167 file = UploadedFile.create!(:profile => profile, :uploaded_data => fixture_file_upload('/files/feed.xml', 'text/xml')) 1168 file = UploadedFile.create!(:profile => profile, :uploaded_data => fixture_file_upload('/files/feed.xml', 'text/xml'))
1168 file2 = UploadedFile.create!(:profile => profile, :uploaded_data => fixture_file_upload('/files/test.txt', 'text/plain')) 1169 file2 = UploadedFile.create!(:profile => profile, :uploaded_data => fixture_file_upload('/files/test.txt', 'text/plain'))
1169 file2.created_at = 1.day.ago 1170 file2.created_at = 1.day.ago
test/unit/uploaded_file_test.rb
@@ -56,6 +56,7 @@ class UploadedFileTest &lt; Test::Unit::TestCase @@ -56,6 +56,7 @@ class UploadedFileTest &lt; Test::Unit::TestCase
56 file = UploadedFile.new(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png')) 56 file = UploadedFile.new(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'))
57 file.profile = profile 57 file.profile = profile
58 assert file.save 58 assert file.save
  59 + assert file.is_image
59 end 60 end
60 61
61 should 'has attachment_fu validation options' do 62 should 'has attachment_fu validation options' do