el_vfs 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +28 -0
- data/app/assets/images/el_vfs/elfinder/arrows-active.png +0 -0
- data/app/assets/images/el_vfs/elfinder/arrows-normal.png +0 -0
- data/app/assets/images/el_vfs/elfinder/dialogs.png +0 -0
- data/app/assets/images/el_vfs/elfinder/icons-big.png +0 -0
- data/app/assets/images/el_vfs/elfinder/icons-small.png +0 -0
- data/app/assets/images/el_vfs/elfinder/logo.png +0 -0
- data/app/assets/images/el_vfs/elfinder/progress.gif +0 -0
- data/app/assets/images/el_vfs/elfinder/quicklook-bg.png +0 -0
- data/app/assets/images/el_vfs/elfinder/quicklook-icons.png +0 -0
- data/app/assets/images/el_vfs/elfinder/resize.png +0 -0
- data/app/assets/images/el_vfs/elfinder/spinner-mini.gif +0 -0
- data/app/assets/images/el_vfs/elfinder/toolbar.png +0 -0
- data/app/assets/images/el_vfs/ui/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/app/assets/images/el_vfs/ui/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/app/assets/images/el_vfs/ui/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/app/assets/images/el_vfs/ui/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/app/assets/images/el_vfs/ui/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/app/assets/images/el_vfs/ui/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/app/assets/images/el_vfs/ui/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/app/assets/images/el_vfs/ui/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/app/assets/images/el_vfs/ui/ui-icons_222222_256x240.png +0 -0
- data/app/assets/images/el_vfs/ui/ui-icons_2e83ff_256x240.png +0 -0
- data/app/assets/images/el_vfs/ui/ui-icons_454545_256x240.png +0 -0
- data/app/assets/images/el_vfs/ui/ui-icons_888888_256x240.png +0 -0
- data/app/assets/images/el_vfs/ui/ui-icons_cd0a0a_256x240.png +0 -0
- data/app/assets/javascripts/el_vfs/elfinder.js +9601 -0
- data/app/assets/javascripts/el_vfs/i18n/elfinder.LANG.js +281 -0
- data/app/assets/javascripts/el_vfs/i18n/elfinder.ar.js +280 -0
- data/app/assets/javascripts/el_vfs/i18n/elfinder.ru.js +280 -0
- data/app/assets/stylesheets/el_vfs/el_vfs.sass +4 -0
- data/app/assets/stylesheets/el_vfs/elfinder.sass +1645 -0
- data/app/assets/stylesheets/el_vfs/jquery_ui.sass +1482 -0
- data/app/assets/stylesheets/el_vfs/reset.sass +3 -0
- data/app/assets/stylesheets/el_vfs/theme.sass +82 -0
- data/app/controllers/el_vfs/el_finder_controller.rb +17 -0
- data/app/helpers/el_vfs/application_helper.rb +4 -0
- data/app/models/el_vfs/directory.rb +30 -0
- data/app/models/el_vfs/entry.rb +91 -0
- data/app/models/el_vfs/file.rb +35 -0
- data/app/models/el_vfs/root.rb +36 -0
- data/app/views/el_vfs/directories/_form.html.erb +17 -0
- data/app/views/el_vfs/directories/edit.html.erb +6 -0
- data/app/views/el_vfs/directories/index.html.erb +21 -0
- data/app/views/el_vfs/directories/new.html.erb +5 -0
- data/app/views/el_vfs/directories/show.html.erb +5 -0
- data/app/views/el_vfs/files/_form.html.erb +17 -0
- data/app/views/el_vfs/files/edit.html.erb +6 -0
- data/app/views/el_vfs/files/index.html.erb +21 -0
- data/app/views/el_vfs/files/new.html.erb +5 -0
- data/app/views/el_vfs/files/show.html.erb +5 -0
- data/app/views/layouts/el_vfs/application.html.erb +14 -0
- data/config/dragonfly.rb +45 -0
- data/config/routes.rb +6 -0
- data/db/migrate/20111111111111_create_el_vfs_entries.rb +19 -0
- data/lib/el_finder_api/el_vfs/command.rb +66 -0
- data/lib/el_finder_api/el_vfs/command/change_working_directory.rb +36 -0
- data/lib/el_finder_api/el_vfs/command/copy_entries.rb +44 -0
- data/lib/el_finder_api/el_vfs/command/create_directory.rb +21 -0
- data/lib/el_finder_api/el_vfs/command/create_file.rb +24 -0
- data/lib/el_finder_api/el_vfs/command/create_thumbnail.rb +3 -0
- data/lib/el_finder_api/el_vfs/command/destroy_entries.rb +24 -0
- data/lib/el_finder_api/el_vfs/command/duplicate_entries.rb +24 -0
- data/lib/el_finder_api/el_vfs/command/get_ancestors.rb +22 -0
- data/lib/el_finder_api/el_vfs/command/get_descendants.rb +19 -0
- data/lib/el_finder_api/el_vfs/command/list_names.rb +14 -0
- data/lib/el_finder_api/el_vfs/command/pack_entries.rb +3 -0
- data/lib/el_finder_api/el_vfs/command/ping.rb +12 -0
- data/lib/el_finder_api/el_vfs/command/read_file_body.rb +17 -0
- data/lib/el_finder_api/el_vfs/command/rename_entry.rb +25 -0
- data/lib/el_finder_api/el_vfs/command/resize_image.rb +3 -0
- data/lib/el_finder_api/el_vfs/command/send_file.rb +15 -0
- data/lib/el_finder_api/el_vfs/command/unknown.rb +14 -0
- data/lib/el_finder_api/el_vfs/command/unpack_entry.rb +3 -0
- data/lib/el_finder_api/el_vfs/command/update_file_body.rb +28 -0
- data/lib/el_finder_api/el_vfs/command/upload_files.rb +22 -0
- data/lib/el_finder_api/el_vfs/connector.rb +22 -0
- data/lib/el_finder_api/el_vfs/model.rb +38 -0
- data/lib/el_vfs.rb +4 -0
- data/lib/el_vfs/engine.rb +28 -0
- data/lib/el_vfs/version.rb +3 -0
- data/lib/tasks/el_vfs_tasks.rake +4 -0
- metadata +290 -0
data/config/dragonfly.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'dragonfly'
|
2
|
+
|
3
|
+
vfs = Dragonfly[:vfs]
|
4
|
+
vfs.configure_with(:rails)
|
5
|
+
vfs.configure_with(:imagemagick)
|
6
|
+
vfs.define_macro(ActiveRecord::Base, :file_accessor)
|
7
|
+
vfs.content_filename = ->(job, request) { request[:entry_name] }
|
8
|
+
|
9
|
+
if defined?(Settings) && Settings[:s3]
|
10
|
+
require 'fog'
|
11
|
+
vfs.datastore = Dragonfly::DataStorage::S3DataStore.new
|
12
|
+
vfs.datastore.configure do |datastore|
|
13
|
+
Settings[:s3].each do | key, value |
|
14
|
+
datastore.send("#{key}=", value)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Fog::Storage::AWS::Real
|
19
|
+
def initialize_with_openteam(options={})
|
20
|
+
initialize_without_openteam(options.merge(:scheme => :http, :port => 80, :host => 's3.openteam.ru'))
|
21
|
+
end
|
22
|
+
alias_method_chain :initialize, :openteam
|
23
|
+
end
|
24
|
+
|
25
|
+
class Fog::Connection
|
26
|
+
def request_with_openteam(params, &block)
|
27
|
+
request_without_openteam(params.merge(:path => "/#{Settings[:s3][:bucket_name]}/#{params[:path]}"), &block)
|
28
|
+
end
|
29
|
+
alias_method_chain :request, :openteam
|
30
|
+
end
|
31
|
+
else
|
32
|
+
vfs.datastore.configure do |datastore|
|
33
|
+
datastore.root_path = "#{Rails.root}/files/#{Rails.env}"
|
34
|
+
datastore.store_meta = false
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
require 'dragonfly/image_magick/utils'
|
39
|
+
module Dragonfly::ImageMagick::Utils
|
40
|
+
def raw_identify(temp_object, args='')
|
41
|
+
@cache ||= {}
|
42
|
+
@cache["#{temp_object}#{args}"] ||= run "#{identify_command} #{args} \"#{temp_object.path}\" 2>/dev/null"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
data/config/routes.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
class CreateElVfsEntries < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :el_vfs_entries do |t|
|
4
|
+
t.string :type
|
5
|
+
t.string :ancestry
|
6
|
+
t.integer :ancestry_depth
|
7
|
+
t.text :entry_path
|
8
|
+
t.text :entry_path_hash
|
9
|
+
t.string :entry_name
|
10
|
+
t.string :entry_mime_type
|
11
|
+
t.integer :entry_size
|
12
|
+
t.integer :root_number
|
13
|
+
t.timestamps
|
14
|
+
end
|
15
|
+
add_index :el_vfs_entries, :entry_name
|
16
|
+
add_index :el_vfs_entries, :ancestry
|
17
|
+
add_index :el_vfs_entries, :entry_path_hash
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module ElVfs
|
2
|
+
|
3
|
+
class ::IsAFileValidator < ActiveModel::EachValidator
|
4
|
+
def validate_each(record, attribute, value)
|
5
|
+
record.errors[attribute] << "must be an instance of ElVfs::File (was #{value.class})" unless value.is_a?(ElVfs::File)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class ::IsADirectoryValidator < ActiveModel::EachValidator
|
10
|
+
def validate_each(record, attribute, value)
|
11
|
+
record.errors[attribute] << "must be an instance of ElVfs::Directory (was #{value.class})" unless value.is_a?(ElVfs::Directory) || value.is_a?(ElVfs::Root)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class ::IsAnEntryValidator < ActiveModel::EachValidator
|
16
|
+
def validate_each(record, attribute, value)
|
17
|
+
record.errors[attribute] << "must be an instance of ElVfs::Entry (was #{value.class})" unless value.is_a?(ElVfs::Entry)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Command < Model
|
22
|
+
|
23
|
+
attr_accessor :arguments, :error, :result
|
24
|
+
|
25
|
+
class Arguments < Model
|
26
|
+
def entry
|
27
|
+
@entry ||= Entry.find_by_entry_path_hash target
|
28
|
+
end
|
29
|
+
def entries
|
30
|
+
@entries ||= targets.map{|target| Entry.find_by_entry_path_hash target}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class Result < Model
|
35
|
+
attr_accessor :arguments, :execute_command
|
36
|
+
end
|
37
|
+
|
38
|
+
class_attribute :command_name
|
39
|
+
|
40
|
+
class Error < Model
|
41
|
+
attr_accessor :error
|
42
|
+
end
|
43
|
+
|
44
|
+
def initialize(init_params)
|
45
|
+
self.arguments = "#{self.class.name}::Arguments".constantize.new(init_params)
|
46
|
+
end
|
47
|
+
|
48
|
+
def run
|
49
|
+
self.result = "#{self.class.name}::Result".constantize.new(:arguments => arguments, :execute_command => execute_command)
|
50
|
+
end
|
51
|
+
|
52
|
+
def headers
|
53
|
+
@headers ||= {}
|
54
|
+
end
|
55
|
+
|
56
|
+
protected
|
57
|
+
|
58
|
+
def execute_command
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.register_in_connector(command_name=nil)
|
62
|
+
self.command_name = command_name || name.demodulize.underscore
|
63
|
+
Connector.commands[self.command_name] = self
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module ElVfs
|
2
|
+
|
3
|
+
class Command::ChangeWorkingDirectory < Command
|
4
|
+
register_in_connector :open
|
5
|
+
|
6
|
+
class Arguments < Command::Arguments
|
7
|
+
attr_accessor :init, :target, :tree
|
8
|
+
|
9
|
+
validates_presence_of :init, :unless => :target
|
10
|
+
validates :entry, :is_a_directory => true
|
11
|
+
|
12
|
+
def initialize(params)
|
13
|
+
super
|
14
|
+
self.target ||= Entry.root.target if init
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Result < Command::Result
|
19
|
+
def api; 2 end
|
20
|
+
def cwd; arguments.entry end
|
21
|
+
def uplMaxSize; '16m' end
|
22
|
+
|
23
|
+
def files
|
24
|
+
files = arguments.entry.children.all
|
25
|
+
files += Entry.where(['ancestry_depth <= ?', 2]).only_directories if arguments.tree
|
26
|
+
files.uniq
|
27
|
+
end
|
28
|
+
|
29
|
+
def options
|
30
|
+
{path: arguments.entry.el_vfs_path, url: arguments.entry.url, disabled: [], separator: '/', copyOverwrite: 1, archivers: {create: [], extract: []}}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module ElVfs
|
2
|
+
class Command::CopyEntries < ElVfs::Command
|
3
|
+
register_in_connector :paste
|
4
|
+
|
5
|
+
class Arguments < Command::Arguments
|
6
|
+
attr_accessor :targets, :src, :dst, :cut
|
7
|
+
validates_presence_of :src, :dst, :targets
|
8
|
+
|
9
|
+
validates :source, :destination, :is_a_directory => true
|
10
|
+
validates :entries, :is_an_entry => true
|
11
|
+
|
12
|
+
def cut?
|
13
|
+
cut == '1' || cut == 'true' || cut == true
|
14
|
+
end
|
15
|
+
|
16
|
+
def source
|
17
|
+
@source ||= Entry..find_by_entry_path_hash(src)
|
18
|
+
end
|
19
|
+
|
20
|
+
def destination
|
21
|
+
@destination ||= Entry.find_by_entry_path_hash(dst)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class Result < Command::Result
|
26
|
+
def added
|
27
|
+
execute_command
|
28
|
+
end
|
29
|
+
def removed
|
30
|
+
arguments.cut? ? arguments.targets : []
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
def execute_command
|
36
|
+
arguments.entries.map do | entry |
|
37
|
+
entry = entry.dup unless arguments.cut?
|
38
|
+
entry.tap do | entry |
|
39
|
+
entry.update_attributes! :parent => arguments.destination
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ElVfs
|
2
|
+
class Command::CreateDirectory < ElVfs::Command
|
3
|
+
register_in_connector :mkdir
|
4
|
+
class Arguments < Command::Arguments
|
5
|
+
attr_accessor :target, :name
|
6
|
+
validates_presence_of :target, :name
|
7
|
+
validates :entry, :is_a_directory => true
|
8
|
+
end
|
9
|
+
|
10
|
+
class Result < Command::Result
|
11
|
+
def added
|
12
|
+
[ execute_command ]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
def execute_command
|
18
|
+
Directory.create!(:parent => arguments.entry, :entry_name => arguments.name)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module ElVfs
|
2
|
+
class Command::CreateFile < ElVfs::Command
|
3
|
+
register_in_connector :mkfile
|
4
|
+
|
5
|
+
class Arguments < Command::Arguments
|
6
|
+
attr_accessor :target, :name
|
7
|
+
validates_presence_of :target, :name
|
8
|
+
validates :entry, :is_a_directory => true
|
9
|
+
end
|
10
|
+
|
11
|
+
class Result < Command::Result
|
12
|
+
def added
|
13
|
+
[ execute_command ]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def execute_command
|
18
|
+
ElVfs::File.new(:parent => arguments.entry).tap do | file |
|
19
|
+
Dir.mktmpdir{|dir| file.entry = ::File.open("#{dir}/#{arguments.name}", "w") }
|
20
|
+
file.save!
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module ElVfs
|
2
|
+
class Command::DestroyEntries < ElVfs::Command
|
3
|
+
register_in_connector :rm
|
4
|
+
|
5
|
+
class Arguments < Command::Arguments
|
6
|
+
attr_accessor :targets
|
7
|
+
validates_presence_of :targets
|
8
|
+
validates :entries, :is_an_entry => true
|
9
|
+
end
|
10
|
+
|
11
|
+
class Result < Command::Result
|
12
|
+
def removed
|
13
|
+
arguments.targets
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def execute_command
|
20
|
+
arguments.entries.map(&:destroy)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module ElVfs
|
2
|
+
class Command::DuplicateEntries < ElVfs::Command
|
3
|
+
register_in_connector :duplicate
|
4
|
+
|
5
|
+
class Arguments < Command::Arguments
|
6
|
+
attr_accessor :targets
|
7
|
+
validates_presence_of :targets
|
8
|
+
validates :entries, :is_an_entry => true
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
class Result < Command::Result
|
13
|
+
def added
|
14
|
+
execute_command
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
def execute_command
|
21
|
+
arguments.entries.map(&:duplicate)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module ElVfs
|
2
|
+
class Command::GetAncestors < ElVfs::Command
|
3
|
+
register_in_connector :parents
|
4
|
+
|
5
|
+
class Arguments < Command::Arguments
|
6
|
+
attr_accessor :target
|
7
|
+
validates_presence_of :target
|
8
|
+
validates :entry, :is_a_directory => true
|
9
|
+
end
|
10
|
+
|
11
|
+
class Result < Command::Result
|
12
|
+
def tree
|
13
|
+
tree = arguments.entry.ancestors
|
14
|
+
tree += arguments.entry.ancestors.from_depth(1).map(&:directories).flatten
|
15
|
+
tree << arguments.entry
|
16
|
+
tree += Entry.where(['ancestry_depth <= ?', 2]).only_directories
|
17
|
+
tree.uniq
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module ElVfs
|
2
|
+
class Command::GetDescendants < ElVfs::Command
|
3
|
+
register_in_connector :tree
|
4
|
+
|
5
|
+
class Arguments < Command::Arguments
|
6
|
+
attr_accessor :target
|
7
|
+
|
8
|
+
validates_presence_of :target
|
9
|
+
validates :entry, :is_a_directory => true
|
10
|
+
end
|
11
|
+
|
12
|
+
class Result < Command::Result
|
13
|
+
def tree
|
14
|
+
arguments.entry.descendants(:to_depth => 2)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ElVfs
|
2
|
+
class Command::ReadFileBody < ElVfs::Command
|
3
|
+
register_in_connector :get
|
4
|
+
|
5
|
+
class Arguments < Command::Arguments
|
6
|
+
attr_accessor :target
|
7
|
+
validates_presence_of :target
|
8
|
+
validates :entry, :is_a_file => true
|
9
|
+
end
|
10
|
+
|
11
|
+
class Result < Command::Result
|
12
|
+
def content
|
13
|
+
arguments.entry.entry.data
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module ElVfs
|
2
|
+
class Command::RenameEntry < ElVfs::Command
|
3
|
+
register_in_connector :rename
|
4
|
+
|
5
|
+
class Arguments < Command::Arguments
|
6
|
+
attr_accessor :target, :name
|
7
|
+
validates_presence_of :target, :name
|
8
|
+
validates :entry, :is_an_entry => true
|
9
|
+
end
|
10
|
+
|
11
|
+
class Result < Command::Result
|
12
|
+
def added
|
13
|
+
[arguments.entry]
|
14
|
+
end
|
15
|
+
def removed
|
16
|
+
[arguments.target]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
protected
|
21
|
+
def execute_command
|
22
|
+
arguments.entry.update_attributes! :entry_name => arguments.name
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|