Commit d5ddc762b730aa8b2034043200de2925752ec3d5

Authored by Daniela Feitosa
Committed by Antonio Terceiro
1 parent b7642d12

Added libs to create thumbnails in background

* added delayed_attachment_fu lib to process thumbnails in background
* added create_thumbnails_job lib to create thumbnails

(ActionItem1661)
config/initializers/delayed_attachment_fu.rb 0 → 100644
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +require 'delayed_attachment_fu'
lib/create_thumbnails_job.rb 0 → 100644
@@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
  1 +class CreateThumbnailsJob < Struct.new(:class_name, :file_id)
  2 + def perform
  3 + file = class_name.constantize.find(file_id)
  4 + file.create_thumbnails
  5 + end
  6 +end
lib/delayed_attachment_fu.rb 0 → 100644
@@ -0,0 +1,53 @@ @@ -0,0 +1,53 @@
  1 +module DelayedAttachmentFu
  2 +
  3 + module ClassMethods
  4 + def delay_attachment_fu_thumbnails
  5 + include DelayedAttachmentFu::InstanceMethods
  6 + after_create do |file|
  7 + if file.image?
  8 + Delayed::Job.enqueue CreateThumbnailsJob.new(file.class.name, file.id)
  9 + end
  10 + end
  11 + end
  12 + end
  13 +
  14 + module InstanceMethods
  15 + # skip processing with RMagick
  16 + def process_attachment
  17 + end
  18 +
  19 + def after_process_attachment
  20 + save_to_storage
  21 + @temp_paths.clear
  22 + @saved_attachment = nil
  23 + callback :after_attachment_saved
  24 + end
  25 +
  26 + def create_thumbnails
  27 + if thumbnailable?
  28 + self.class.with_image(full_filename) do |img|
  29 + self.width = img.columns
  30 + self.height = img.rows
  31 + self.save!
  32 + end
  33 + self.class.attachment_options[:thumbnails].each do |suffix, size|
  34 + self.create_or_update_thumbnail(self.full_filename, suffix, size)
  35 + end
  36 + self.update_attributes!(:thumbnails_processed => true)
  37 + end
  38 + end
  39 +
  40 + def public_filename(size=nil)
  41 + if self.thumbnails_processed
  42 + super(size)
  43 + else
  44 + size ||= 'thumb'
  45 + '/images/icons-app/image-loading-%s.png' % size
  46 + end
  47 + end
  48 +
  49 +
  50 + end
  51 +end
  52 +
  53 +ActiveRecord::Base.send(:extend, DelayedAttachmentFu::ClassMethods)
test/unit/create_thumbnails_job_test.rb 0 → 100644
@@ -0,0 +1,27 @@ @@ -0,0 +1,27 @@
  1 +require File.dirname(__FILE__) + '/../test_helper'
  2 +
  3 +class CreateThumbnailsJobTest < ActiveSupport::TestCase
  4 +
  5 + should 'create thumbnails to uploaded files' do
  6 + person = create_user('test_user').person
  7 + file = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'), :profile => person)
  8 +
  9 + assert_equal [], file.thumbnails
  10 + job = CreateThumbnailsJob.new(file.class.name, file.id)
  11 + job.perform
  12 + file.reload
  13 + assert_not_equal [], file.thumbnails
  14 + end
  15 +
  16 + should 'set thumbnails_processed to true after finished' do
  17 + person = create_user('test_user').person
  18 + file = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'), :profile => person)
  19 +
  20 + job = CreateThumbnailsJob.new(file.class.name, file.id)
  21 + job.perform
  22 +
  23 + file.reload
  24 + assert file.thumbnails_processed
  25 + end
  26 +
  27 +end