module FileFolder::ClassMethods

Attributes

file_field[RW]
file_folder_repository[RW]
file_formats[RW]
filefield_flag[RW]

Public Instance Methods

file_folder_enabled?() click to toggle source

Getter to check if model is enabled with file_folder

# File lib/file_folder.rb, line 15
def file_folder_enabled?
  @filefield_flag.nil? ? false : @filefield_flag
end
file_folder_field(file_field, options = {}) click to toggle source

Generates file field from file_field arguments and provides methods like if file_field is “assignment” then it provides methods on top of it as

# File lib/file_folder.rb, line 21
def file_folder_field(file_field, options = {})
  if options.is_a?(Hash)
    @file_formats ||= {}
    @file_formats[file_field] = options[:formats].is_a?(Array) ? options[:formats].collect { |x| x.starts_with?(".") ? x : ".#{x}" } : [".txt", ".docx", ".jpeg", ".pdf"]
  else
    raise "InvalidArguments"
  end
  @file_field ||=[]
  @file_field << file_field
  send(:after_save, "#{file_field}_store!")
  send(:after_destroy, "#{file_field}_destroy!")

  define_method "#{file_field}" do
    @ff_file_buffer.nil? ? (send("#{file_field}_persisted?") ? File.read(send("#{file_field}_path")) : nil) : @ff_file_buffer
  end

  define_method "#{file_field}?" do
    send("#{file_field}").nil? ? false : true
  end

  define_method "#{file_field}=" do |file_upload|
    if file_upload.class == ActionDispatch::Http::UploadedFile
      return false unless self.class.file_formats[file_field].include?(File.extname(file_upload.original_filename).downcase)
      @ff_file_buffer = File.read(file_upload.path)
      @ff_file_ofn = File.basename(file_upload.original_filename).gsub(/[^a-zA-Z0-9\-\._]+/, '_')
    elsif file_upload.class == File
      return false unless self.class.file_formats[file_field].include?(File.extname(file_upload.path).downcase)
      @ff_file_buffer = file_upload.read
      @ff_file_ofn = File.basename(file_upload.path).gsub(/[^a-zA-Z0-9\-\._]+/, '_')
    elsif file_upload.class == String
      #return false unless self.class.file_formats.include?(File.extname(file_upload).downcase)
      @ff_file_buffer = file_upload
      #@ff_file_ofn = File.basename(file_upload.path) #As there is nothing like original_file_name for a string :)
    end
  end

  define_method "#{file_field}_path" do
    FileUtils.mkdir_p File.join(self.class.file_folder_repository, [id.to_s, self.class.name.underscore].join('_'))
  end

  define_method "#{file_field}_path_to_write" do
    #directoy_path = FileUtils.mkdir_p File.join(self.class.file_folder_repository, self.id.to_s, file_field.to_s)
    File.join(send("#{file_field}_path"), @ff_file_ofn)
  end

  define_method "#{file_field}_persisted?" do
    (@ff_file_buffer.nil? and File.file?(send("#{file_field}_path")))
  end

  define_method "#{file_field}_store!" do
    return unless self.class.file_folder_enabled?
    unless @ff_file_buffer.nil?
      _path_to_write = send("#{file_field}_path_to_write")
      File.delete(_path_to_write) if File.exist?(_path_to_write) #Clearing any existing existence
      File.open(_path_to_write, "wb+") { |f| f.puts(@ff_file_buffer) }
      @ff_file_buffer = nil
      @ff_file_ofn = nil
      #send("#{file_field}_url=", _path_to_write)
      self.try(:save_update)
    end
  end

  define_method "#{file_field}_destroy!" do
    return unless self.class.file_folder_enabled?
    @ff_file_buffer = nil
    # File.delete(send("#{file_field}_path")) if File.exist?(send("#{file_field}_path"))
  end

  @filefield_flag = true
end