module Lipsiadmin module DataBase # This is the table that handle the attachments. # You can define some global info like: # # attachment_styles :thumb, "128x128" # # In this way all models that use has_one_attachment or # has_many_attachments handle a default style called *thumb* # # Remember that any model that use has_one_attachment or # has_many_attachments can override/add styles/validations etc... # class AttachmentTable < ActiveRecord::Base def self.inherited(subclass)#:nodoc: super subclass.write_inheritable_attribute(:attachment_definitions, {}) if subclass.attachment_definitions.nil? subclass.attachment_definitions[subclass.name] = {:validations => {}}.merge(Lipsiadmin::Attachment.options) subclass.send(:include, Lipsiadmin::DataBase::UtilityScopes) subclass.extend(ClassMethods) end set_table_name "attachments" belongs_to :attacher, :polymorphic => true after_save :save_attached_files before_destroy :destroy_attached_files define_callbacks :before_post_process, :after_post_process define_callbacks :"before_attached_post_process", :"after_attached_post_process" #validates_presence_of :filename # Returns the url of the attachment, optionally you can pass the style like url(:thumb) def url(style=nil) file.url(style) end # Returns a Lipsiadmin::Attachment::Attach instance def file @_file ||= Lipsiadmin::Attachment::Attach.new(:attached, self, attachment_definitions) end # Assign a Lipsiadmin::Attachment::Attach instance to the current file def file=(tempfile) file.assign(tempfile) end # Returns true if the file exist def file? file.exist? end def attachment_definitions=(options)#:nodoc: attachment_definitions.merge!(options.symbolize_keys) end # This is the custom instance attachment_definition def attachment_definitions#:nodoc: @instance_attachment_definitions ||= self.class.attachment_definitions[self.class.name].clone return @instance_attachment_definitions end validates_each(:file) do |record, attr, value| attachment = record.file attachment.send(:flush_errors) unless attachment.valid? end # Perform file.save def save_attached_files logger.info("[Attachment] Saving attachments.") file.save end # Perform file.destroy def destroy_attached_files logger.info("[Attachment] Deleting attachments.") file.queue_existing_for_delete file.flush_deletes end end module ClassMethods#:nodoc: def attachment_url(url) attachment_url_for(self.name, url) end def attachment_default_url(url) attachment_default_url_for(self.name, url) end def attachment_path(path) attachment_path_for(self.name, path) end def attachment_styles(name, styles) attachment_styles_for(self.name, name, styles) end def attachment_default_style(default_style) attachment_default_style_for(self.name, default_style) end def attachment_whiny(whiny_thumbnails) attachment_whiny_for(self.name, whiny_thumbnails) end def attachment_storage(storage) attachment_storage_for(self.name, storage) end def attachment_convert_options(name, convert_options) attachment_convert_options_for(self.name, name, convert_options) end def attachment_background(background) attachment_background_for(self.name, background) end def attachment_processors(processors) attachment_processors_for(self.name, processors) end def validates_attachment_size(options = {}) validates_attachment_size_for(self.name, options) end def validates_attachment_thumbnails(options = {}) validates_attachment_thumbnails_for(self.name, options) end def validates_attachment_presence(options = {}) validates_attachment_presence_for(self.name, options) end def validates_attachment_content_type(options = {}) validates_attachment_content_type_for(self.name, options) end end end end