alchemy-custom-model 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +147 -0
- data/Rakefile +32 -0
- data/app/assets/config/alchemy_custom_model_manifest.js +3 -0
- data/app/assets/images/alchemy-custom-model/no_image.png +0 -0
- data/app/assets/javascripts/alchemy-custom-model/change_language.js +11 -0
- data/app/assets/javascripts/alchemy-custom-model/common_init.js +16 -0
- data/app/assets/javascripts/alchemy-custom-model/custom_admin_element_editor.js.coffee +25 -0
- data/app/assets/javascripts/alchemy-custom-model/custom_tiny_mce.js.coffee.erb +95 -0
- data/app/assets/javascripts/alchemy-custom-model/el_finder.js.coffee.erb +241 -0
- data/app/assets/javascripts/alchemy-custom-model/elfinder_ui_manifest.js +4 -0
- data/app/assets/javascripts/alchemy-custom-model/manifest.js +23 -0
- data/app/assets/javascripts/alchemy-custom-model/nested_attributes_sortable.js.coffee +25 -0
- data/app/assets/javascripts/alchemy-custom-model/select2filter.js +51 -0
- data/app/assets/javascripts/alchemy-custom-model/subobjects.js +98 -0
- data/app/assets/javascripts/alchemy-custom-model/total_page_elfinder.js.coffee +15 -0
- data/app/assets/stylesheets/alchemy-custom-model/custom_elfinder.css.scss +130 -0
- data/app/assets/stylesheets/alchemy-custom-model/custom_style.css.scss +228 -0
- data/app/assets/stylesheets/alchemy-custom-model/custom_tiny_mce.scss +6 -0
- data/app/assets/stylesheets/alchemy-custom-model/manifest.css +16 -0
- data/app/controllers/alchemy/custom/model/admin/base_controller.rb +189 -0
- data/app/controllers/alchemy/custom/model/admin/files_controller.rb +106 -0
- data/app/controllers/alchemy/pages_controller_decorator.rb +1 -0
- data/app/helpers/alchemy/custom/model/admin/base_helper.rb +379 -0
- data/app/helpers/alchemy/custom/model/base_helper.rb +18 -0
- data/app/helpers/alchemy/custom/model/custom_model_helper.rb +112 -0
- data/app/helpers/alchemy/pages_helper_decorator.rb +95 -0
- data/app/models/admin_override_to_param.rb +9 -0
- data/app/models/application_record.rb +9 -0
- data/app/views/alchemy/custom/model/admin/base/_buttons_tool.html.erb +16 -0
- data/app/views/alchemy/custom/model/admin/base/_gallery_item.html.erb +4 -0
- data/app/views/alchemy/custom/model/admin/base/_language_tree_select.html.erb +9 -0
- data/app/views/alchemy/custom/model/admin/base/_search_box.html.erb +19 -0
- data/app/views/alchemy/custom/model/admin/base/_seo.html.erb +8 -0
- data/app/views/alchemy/custom/model/admin/base/_table.html.erb +33 -0
- data/app/views/alchemy/custom/model/admin/base/_title.html.erb +3 -0
- data/app/views/alchemy/custom/model/admin/base/edit.html.erb +18 -0
- data/app/views/alchemy/custom/model/admin/base/index.html.erb +39 -0
- data/app/views/alchemy/custom/model/admin/base/new.html.erb +19 -0
- data/app/views/alchemy/custom/model/admin/files/error_notice.json.jbuilder +1 -0
- data/app/views/alchemy/custom/model/admin/files/ui.html.erb +13 -0
- data/config/initializers/elfinder_abilities.rb +1 -0
- data/config/locales/en.yml +11 -0
- data/config/locales/it.yml +21 -0
- data/config/routes.rb +8 -0
- data/lib/alchemy-custom-model.rb +29 -0
- data/lib/alchemy/custom/model/el_finder.rb +17 -0
- data/lib/alchemy/custom/model/el_finder/ability.rb +16 -0
- data/lib/alchemy/custom/model/el_finder/connector.rb +435 -0
- data/lib/alchemy/custom/model/el_finder/image.rb +35 -0
- data/lib/alchemy/custom/model/el_finder/path_name.rb +220 -0
- data/lib/alchemy/custom/model/el_finder/paths.rb +21 -0
- data/lib/alchemy/custom/model/el_finder/paths/active_record_reference.rb +50 -0
- data/lib/alchemy/custom/model/el_finder/paths/base.rb +298 -0
- data/lib/alchemy/custom/model/el_finder/paths/component_file.rb +59 -0
- data/lib/alchemy/custom/model/el_finder/paths/component_files.rb +34 -0
- data/lib/alchemy/custom/model/el_finder/paths/file.rb +23 -0
- data/lib/alchemy/custom/model/el_finder/paths/files.rb +25 -0
- data/lib/alchemy/custom/model/el_finder/paths/image.rb +42 -0
- data/lib/alchemy/custom/model/el_finder/paths/images.rb +31 -0
- data/lib/alchemy/custom/model/el_finder/paths/root.rb +24 -0
- data/lib/alchemy/custom/model/el_finder/volumes.rb +18 -0
- data/lib/alchemy/custom/model/el_finder/volumes/alchemy_file.rb +197 -0
- data/lib/alchemy/custom/model/el_finder/volumes/alchemy_files.rb +51 -0
- data/lib/alchemy/custom/model/el_finder/volumes/alchemy_images.rb +69 -0
- data/lib/alchemy/custom/model/el_finder/volumes/base.rb +149 -0
- data/lib/alchemy/custom/model/el_finder/volumes/component_attribute.rb +130 -0
- data/lib/alchemy/custom/model/engine.rb +40 -0
- data/lib/alchemy/custom/model/global_id_setter.rb +35 -0
- data/lib/alchemy/custom/model/model_decoration.rb +82 -0
- data/lib/alchemy/custom/model/pages_controller_dec.rb +132 -0
- data/lib/alchemy/custom/model/translation_scope.rb +18 -0
- data/lib/alchemy/custom/model/version.rb +7 -0
- data/lib/alchemy/touching_decorator.rb +12 -0
- data/lib/tasks/alchemy_custom_model_tasks.rake +41 -0
- data/vendor/elfinder/css/elfinder.full.css +5117 -0
- data/vendor/elfinder/css/elfinder.min.css +9 -0
- data/vendor/elfinder/css/theme.css +349 -0
- data/vendor/elfinder/js/elfinder.full.js +34270 -0
- data/vendor/elfinder/js/elfinder.min.js +25 -0
- metadata +194 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Alchemy.register_ability(Alchemy::Custom::Model::ElFinder::Ability)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
en:
|
|
2
|
+
alchemy_custom_model:
|
|
3
|
+
you_are_editing_site_language: "You are editing the <strong>%{language}</strong> language of the site <strong>%{site}</strong>"
|
|
4
|
+
title_action: "%{action} %{model}"
|
|
5
|
+
actions:
|
|
6
|
+
new: New
|
|
7
|
+
edit: Edit
|
|
8
|
+
show: View
|
|
9
|
+
update: Edit
|
|
10
|
+
index: View all
|
|
11
|
+
create: New
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
it:
|
|
2
|
+
alchemy_custom_model:
|
|
3
|
+
you_are_editing_site_language: "Stai modificando la lingua <strong>%{language}</strong> del sito <strong>%{site}</strong>"
|
|
4
|
+
title_action: "%{action} %{model}"
|
|
5
|
+
actions:
|
|
6
|
+
new: Nuovo
|
|
7
|
+
edit: Modifica
|
|
8
|
+
show: Visualizza
|
|
9
|
+
update: Modifica
|
|
10
|
+
index: Visualizza tutti
|
|
11
|
+
create: Nuovo
|
|
12
|
+
|
|
13
|
+
elfinder:
|
|
14
|
+
alchemy_images:
|
|
15
|
+
volume: "Immagini"
|
|
16
|
+
|
|
17
|
+
sub_objects:
|
|
18
|
+
title_add: Aggiungi
|
|
19
|
+
minimize_all: Minimizza
|
|
20
|
+
maxzimize_all: Massimizza
|
|
21
|
+
|
data/config/routes.rb
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require "alchemy_cms"
|
|
2
|
+
require "jquery/ui/rails"
|
|
3
|
+
require "el_finder"
|
|
4
|
+
require "friendly_id"
|
|
5
|
+
require "alchemy/custom/model/engine"
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
module Alchemy
|
|
9
|
+
module Custom
|
|
10
|
+
module Model
|
|
11
|
+
extend ActiveSupport::Autoload
|
|
12
|
+
|
|
13
|
+
autoload :GlobalIdSetter
|
|
14
|
+
autoload :ModelDecoration
|
|
15
|
+
autoload :TranslationScope
|
|
16
|
+
autoload :PagesControllerDec
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
mattr_accessor :base_admin_controller_class
|
|
20
|
+
|
|
21
|
+
@@base_admin_controller_class = 'Alchemy::Admin::BaseController'
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def self.admin_controller_class
|
|
25
|
+
@@base_admin_controller_class.constantize
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Alchemy::Custom::Model
|
|
2
|
+
module ElFinder
|
|
3
|
+
class Ability
|
|
4
|
+
include CanCan::Ability
|
|
5
|
+
|
|
6
|
+
def initialize(user)
|
|
7
|
+
if user.present? && user.is_admin?
|
|
8
|
+
can :usage, Alchemy::Custom::Model::ElFinder
|
|
9
|
+
can :ui_usage, Alchemy::Custom::Model::ElFinder
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
|
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
module Alchemy::Custom::Model::ElFinder
|
|
2
|
+
class Connector
|
|
3
|
+
|
|
4
|
+
VERSION = 2.1
|
|
5
|
+
|
|
6
|
+
# Valid commands to run.
|
|
7
|
+
# @see #run
|
|
8
|
+
VALID_COMMANDS = %w[open tree file paste upload search rm ls dim resize duplicate] #%w[archive duplicate edit extract mkdir mkfile open parents paste ping read rename resize rm tmb upload]
|
|
9
|
+
|
|
10
|
+
# Default options for instances.
|
|
11
|
+
# @see #initialize
|
|
12
|
+
DEFAULT_OPTIONS = {
|
|
13
|
+
:mime_handler => ::ElFinder::MimeType,
|
|
14
|
+
# :image_handler => ElFinder::Image,
|
|
15
|
+
:original_filename_method => lambda {|file| file.original_filename.respond_to?(:force_encoding) ? file.original_filename.force_encoding('utf-8') : file.original_filename},
|
|
16
|
+
:disabled_commands => [],
|
|
17
|
+
:allow_dot_files => true,
|
|
18
|
+
:upload_max_size => '50M',
|
|
19
|
+
# :upload_file_mode => 0644,
|
|
20
|
+
# :archivers => {},
|
|
21
|
+
# :extractors => {},
|
|
22
|
+
:home => 'Home',
|
|
23
|
+
:default_perms => {:read => true, :write => true, :rm => true, :hidden => false},
|
|
24
|
+
:perms => [],
|
|
25
|
+
:thumbs => false,
|
|
26
|
+
:thumbs_directory => '.thumbs',
|
|
27
|
+
:thumbs_size => 48,
|
|
28
|
+
:thumbs_at_once => 5,
|
|
29
|
+
# :tree_sub_folders => true, # list sub/sub folders in the tree
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
# Initializes new instance.
|
|
33
|
+
# @param [Hash] options Instance options. :url and :root options are required.
|
|
34
|
+
# @option options [String] :url Entry point of ElFinder router.
|
|
35
|
+
# @option options [String] :root Root directory of ElFinder directory structure.
|
|
36
|
+
# @see DEFAULT_OPTIONS
|
|
37
|
+
def initialize(options)
|
|
38
|
+
@options = DEFAULT_OPTIONS.merge(options)
|
|
39
|
+
|
|
40
|
+
@options[:disabled_commands] += ['mkdir', 'rename']
|
|
41
|
+
|
|
42
|
+
raise(ArgumentError, "Missing required :volumes option") unless @options.key?(:volumes)
|
|
43
|
+
# raise(ArgumentError, "Missing required :url option") unless @options.key?(:url)
|
|
44
|
+
# raise(ArgumentError, "Missing required :root option") unless @options.key?(:root)
|
|
45
|
+
raise(ArgumentError, "Mime Handler is invalid") unless mime_handler.respond_to?(:for)
|
|
46
|
+
# raise(ArgumentError, "Image Handler is invalid") unless image_handler.nil? || ([:size, :resize, :thumbnail].all? {|m| image_handler.respond_to?(m)})
|
|
47
|
+
|
|
48
|
+
@volumes = options[:volumes]
|
|
49
|
+
@root = PathName.new(options[:root])
|
|
50
|
+
|
|
51
|
+
@headers = {}
|
|
52
|
+
@response = {}
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# of initialize
|
|
56
|
+
|
|
57
|
+
# Runs request-response cycle.
|
|
58
|
+
# @param [Hash] params Request parameters. :cmd option is required.
|
|
59
|
+
# @option params [String] :cmd Command to be performed.
|
|
60
|
+
# @see VALID_COMMANDS
|
|
61
|
+
def run(params)
|
|
62
|
+
@params = params.dup
|
|
63
|
+
@headers = {}
|
|
64
|
+
@response = {}
|
|
65
|
+
@response[:errorData] = {}
|
|
66
|
+
@file = nil
|
|
67
|
+
|
|
68
|
+
if VALID_COMMANDS.include?(@params[:cmd])
|
|
69
|
+
|
|
70
|
+
if @options[:thumbs]
|
|
71
|
+
@thumb_directory = @root + @options[:thumbs_directory]
|
|
72
|
+
@thumb_directory.mkdir unless @thumb_directory.exist?
|
|
73
|
+
raise(RuntimeError, "Unable to create thumbs directory") unless @thumb_directory.directory?
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
@current = @params[:current] ? from_hash(@params[:current]) : nil
|
|
77
|
+
@volume, @target = (@params[:target] and !@params[:target].empty?) ? from_hash(@params[:target]) : [nil, nil]
|
|
78
|
+
if params[:targets]
|
|
79
|
+
@targets = @params[:targets].map {|t| from_hash(t)}
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
send("_#{@params[:cmd]}")
|
|
83
|
+
else
|
|
84
|
+
invalid_request
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
@response.delete(:errorData) if @response[:errorData].empty?
|
|
88
|
+
|
|
89
|
+
return @headers, @response, @file
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# of run
|
|
93
|
+
|
|
94
|
+
#
|
|
95
|
+
def to_hash(pathname)
|
|
96
|
+
# note that '=' are removed
|
|
97
|
+
Base64.urlsafe_encode64(pathname.path.to_s).chomp.tr("=\n", "")
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# of to_hash
|
|
101
|
+
|
|
102
|
+
#
|
|
103
|
+
def from_hash(hash)
|
|
104
|
+
volume = @volumes.find {|v| v.contains?(hash)}
|
|
105
|
+
if volume
|
|
106
|
+
[volume, volume.decode(hash)]
|
|
107
|
+
else
|
|
108
|
+
@response[:error] = 'errFileNotFound'
|
|
109
|
+
nil
|
|
110
|
+
end
|
|
111
|
+
# restore missing '='
|
|
112
|
+
# len = hash.length % 4
|
|
113
|
+
# hash += '==' if len == 1 or len == 2
|
|
114
|
+
# hash += '=' if len == 3
|
|
115
|
+
|
|
116
|
+
# decoded_hash = Base64.urlsafe_decode64(hash)
|
|
117
|
+
# decoded_hash = decoded_hash.respond_to?(:force_encoding) ? decoded_hash.force_encoding('utf-8') : decoded_hash
|
|
118
|
+
# pathname = @root + decoded_hash
|
|
119
|
+
# rescue ArgumentError => e
|
|
120
|
+
# if e.message != 'invalid base64'
|
|
121
|
+
# raise
|
|
122
|
+
# end
|
|
123
|
+
# nil
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# of from_hash
|
|
127
|
+
|
|
128
|
+
# @!attribute [w] options
|
|
129
|
+
# Options setter.
|
|
130
|
+
# @param value [Hash] Options to be merged with instance ones.
|
|
131
|
+
# @return [Hash] Updated options.
|
|
132
|
+
def options=(value = {})
|
|
133
|
+
value.each_pair do |k, v|
|
|
134
|
+
@options[k.to_sym] = v
|
|
135
|
+
end
|
|
136
|
+
@options
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# of options=
|
|
140
|
+
|
|
141
|
+
################################################################################
|
|
142
|
+
|
|
143
|
+
protected
|
|
144
|
+
|
|
145
|
+
def _file
|
|
146
|
+
if @volume && @target
|
|
147
|
+
path = @volume.pathname(@target)
|
|
148
|
+
@file = {path: path}
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def _search
|
|
153
|
+
type = @params.delete(:type) {"full_search"}
|
|
154
|
+
q = @params.delete(:q)
|
|
155
|
+
if @params[:mimes]
|
|
156
|
+
type = 'mimes'
|
|
157
|
+
q = @params[:mimes]
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
@response[:files] = @volume.search(type: type, q: q)
|
|
161
|
+
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
##
|
|
165
|
+
# Funzione lanciata praticamente all'upload dei file, dato che non abbiamo problemi di duplicati
|
|
166
|
+
# dato che sono tutti in database, inviamo sempre un vuoto
|
|
167
|
+
# nel caso dobbiamo implementare invece questo: https://github.com/Studio-42/elFinder/wiki/Client-Server-API-2.1#ls
|
|
168
|
+
def _ls
|
|
169
|
+
@response[:list] = []
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
#
|
|
173
|
+
def _open(volume = nil, target = nil, payload: {})
|
|
174
|
+
if @params[:init]
|
|
175
|
+
_open_init
|
|
176
|
+
return
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
volume ||= @volume
|
|
180
|
+
target ||= @target
|
|
181
|
+
|
|
182
|
+
if volume.nil?
|
|
183
|
+
_open(@volumes[0], nil, payload: payload)
|
|
184
|
+
return
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
if target.nil?
|
|
188
|
+
_open(volume, '.', payload: payload)
|
|
189
|
+
return
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
# if perms_for(target)[:read] == false
|
|
193
|
+
# @response[:error] = 'Access Denied'
|
|
194
|
+
# return
|
|
195
|
+
# end
|
|
196
|
+
|
|
197
|
+
if target.file?
|
|
198
|
+
command_not_implemented
|
|
199
|
+
elsif target.directory?
|
|
200
|
+
@response[:cwd] = volume.cwd(target)
|
|
201
|
+
@response[:files] = volume.files(target)
|
|
202
|
+
@response.merge!(payload)
|
|
203
|
+
|
|
204
|
+
# @response[:cdc] = target.children.
|
|
205
|
+
# reject{ |child| perms_for(child)[:hidden]}.
|
|
206
|
+
# sort_by{|e| e.basename.to_s.downcase}.map{|e| cdc_for(e)}.compact
|
|
207
|
+
|
|
208
|
+
# if @params[:tree]
|
|
209
|
+
# @response[:tree] = {
|
|
210
|
+
# :name => @options[:home],
|
|
211
|
+
# :hash => to_hash(@root),
|
|
212
|
+
# :dirs => tree_for(@root),
|
|
213
|
+
# }.merge(perms_for(@root))
|
|
214
|
+
# end
|
|
215
|
+
@response[:options] = {}
|
|
216
|
+
if @params[:init]
|
|
217
|
+
@response = init_request(@response, volume: volume)
|
|
218
|
+
else
|
|
219
|
+
#se non siamo in init, allora inseriamo l'elenco dei comandi che il volume aperto non supporta
|
|
220
|
+
@response[:options][:disabled] = init_request(@response.dup, volume: volume)[:options][:disabled]
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
else
|
|
224
|
+
@response[:error] = "Directory does not exist"
|
|
225
|
+
_open(@root) if File.directory?(@root)
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# of open
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def _dim
|
|
234
|
+
if @target.is_a? ElFinder::Paths::Image
|
|
235
|
+
@response[:dim] = @target.dim
|
|
236
|
+
else
|
|
237
|
+
@response[:error] = "Operazione non supportata"
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
def _tree(volume = nil, target = nil)
|
|
243
|
+
volume ||= @volume
|
|
244
|
+
target ||= @target
|
|
245
|
+
|
|
246
|
+
@response[:api] = VERSION
|
|
247
|
+
@response[:tree] = volume.tree(target)
|
|
248
|
+
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
def init_request(payload, volume:)
|
|
252
|
+
payload[:api] = VERSION
|
|
253
|
+
# payload[:disabled] = @options[:disabled_commands]
|
|
254
|
+
payload[:options] = {
|
|
255
|
+
:dotFiles => @options[:allow_dot_files],
|
|
256
|
+
:uplMaxSize => @options[:upload_max_size],
|
|
257
|
+
:uploadMaxConn => -1, #configurazione per cui non deve spezzare in chucks i files
|
|
258
|
+
:archives => [], #@options[:archivers].keys,
|
|
259
|
+
:extract => [], #@options[:extractors].keys,
|
|
260
|
+
:url => @options[:url],
|
|
261
|
+
disabled: @options[:disabled_commands] + volume.disabled_commands
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
payload
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
def _open_init
|
|
268
|
+
@response[:cwd] = @volumes[0].cwd
|
|
269
|
+
|
|
270
|
+
files = []
|
|
271
|
+
@volumes.each {|v| files.concat(v.files)}
|
|
272
|
+
@response[:files] = files
|
|
273
|
+
@response = init_request(@response, volume: @volumes[0])
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
# of open_init
|
|
277
|
+
|
|
278
|
+
def _paste
|
|
279
|
+
|
|
280
|
+
moved_files = []
|
|
281
|
+
@targets.to_a.each do |src_v, src_f|
|
|
282
|
+
|
|
283
|
+
#scopro il volume di destinazione
|
|
284
|
+
dst_v, dst_f = from_hash(@params[:dst])
|
|
285
|
+
|
|
286
|
+
if dst_v.is_a?(Volumes::ComponentAttribute)
|
|
287
|
+
moved_files << dst_v.copy(src_f)
|
|
288
|
+
else
|
|
289
|
+
@response[:error] ||= 'Copia non consentita'
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
end
|
|
293
|
+
@params[:tree] = true
|
|
294
|
+
|
|
295
|
+
# dest_vlm = @targets.first[0]
|
|
296
|
+
dest_vlm = from_hash(@params[:dst])[0]
|
|
297
|
+
|
|
298
|
+
dest_target = dest_vlm.decode(dest_vlm.encode('.'))
|
|
299
|
+
|
|
300
|
+
_open(dest_vlm, dest_target, payload: {moved_files: moved_files.collect {|v| dest_vlm.path_info(v)}})
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
# of paste
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
def _rm
|
|
307
|
+
@response[:removed] = @targets.to_a.collect do |src_v, src_f|
|
|
308
|
+
src_v.rm(src_f)
|
|
309
|
+
src_v.encode(src_f.path.to_s)
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
#
|
|
314
|
+
def _resize
|
|
315
|
+
if @target.is_image?
|
|
316
|
+
|
|
317
|
+
file = @target.file
|
|
318
|
+
case @params[:mode]
|
|
319
|
+
when 'resize'
|
|
320
|
+
file = file.thumb("#{@params[:width]}x#{@params[:height]}!")
|
|
321
|
+
when 'crop'
|
|
322
|
+
file = file.thumb("#{@params[:width]}x#{@params[:height]}+#{@params[:x]}+#{@params[:y]}")
|
|
323
|
+
when 'rotate'
|
|
324
|
+
|
|
325
|
+
command = []
|
|
326
|
+
command << "-background #{@params[:bg]}" unless @params[:bg].blank?
|
|
327
|
+
command << "-rotate #{@params[:degree]}"
|
|
328
|
+
|
|
329
|
+
file = file.convert(command.join(' '))
|
|
330
|
+
else
|
|
331
|
+
@response[:error] = "Mode:#{@params[:mode]} not implemented"
|
|
332
|
+
return
|
|
333
|
+
end
|
|
334
|
+
file = file.convert("-quality #{@params[:quality]}") if @params[:quality].to_i < 100
|
|
335
|
+
@target.file = file
|
|
336
|
+
@target.save
|
|
337
|
+
|
|
338
|
+
@response[:changed] = [to_hash(@target)]
|
|
339
|
+
_open(@volume, @volume.root_path)
|
|
340
|
+
else
|
|
341
|
+
@response[:error] = "Unable to resize file. It does not exist"
|
|
342
|
+
end
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
# of resize
|
|
346
|
+
|
|
347
|
+
def _duplicate
|
|
348
|
+
|
|
349
|
+
@targets.each do |v, f|
|
|
350
|
+
unless f.is_image?
|
|
351
|
+
@response[:error] = "#{f.name} non è un'immagine"
|
|
352
|
+
return
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
@targets.each do |v, f|
|
|
357
|
+
unless v.duplicable?(f)
|
|
358
|
+
@response[:error] = "#{f.name} non può essere duplicato"
|
|
359
|
+
return
|
|
360
|
+
end
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
added = @targets.collect do |v, t|
|
|
364
|
+
v.path_info(v.duplicate(t))
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
@response[:added] = added
|
|
368
|
+
# _open(@targets.first[0], @targets.first[0].root_path)
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
# of duplicate
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
#
|
|
375
|
+
def _upload
|
|
376
|
+
if @volume && @target
|
|
377
|
+
response = @volume.upload(@target, @params[:upload])
|
|
378
|
+
@response.merge!(response)
|
|
379
|
+
# _open(@volume, @target)
|
|
380
|
+
else
|
|
381
|
+
@response[:error] = "errUploadCommon"
|
|
382
|
+
end
|
|
383
|
+
# if perms_for(@current)[:write] == false
|
|
384
|
+
# @response[:error] = 'Access Denied'
|
|
385
|
+
# return
|
|
386
|
+
# end
|
|
387
|
+
# select = []
|
|
388
|
+
# @params[:upload].to_a.each do |file|
|
|
389
|
+
# if file.respond_to?(:tempfile)
|
|
390
|
+
# the_file = file.tempfile
|
|
391
|
+
# else
|
|
392
|
+
# the_file = file
|
|
393
|
+
# end
|
|
394
|
+
# if upload_max_size_in_bytes > 0 && File.size(the_file.path) > upload_max_size_in_bytes
|
|
395
|
+
# @response[:error] ||= "Some files were not uploaded"
|
|
396
|
+
# @response[:errorData][@options[:original_filename_method].call(file)] = 'File exceeds the maximum allowed filesize'
|
|
397
|
+
# else
|
|
398
|
+
# dst = @current + @options[:original_filename_method].call(file)
|
|
399
|
+
# the_file.close
|
|
400
|
+
# src = the_file.path
|
|
401
|
+
# FileUtils.mv(src, dst.fullpath)
|
|
402
|
+
# FileUtils.chmod @options[:upload_file_mode], dst
|
|
403
|
+
# select << to_hash(dst)
|
|
404
|
+
# end
|
|
405
|
+
# end
|
|
406
|
+
# @response[:select] = select unless select.empty?
|
|
407
|
+
# _open(@current)
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
# of upload
|
|
411
|
+
|
|
412
|
+
private
|
|
413
|
+
|
|
414
|
+
def mime_handler
|
|
415
|
+
@options[:mime_handler]
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
#
|
|
419
|
+
# def image_handler
|
|
420
|
+
# @options[:image_handler]
|
|
421
|
+
# end
|
|
422
|
+
|
|
423
|
+
#
|
|
424
|
+
def invalid_request
|
|
425
|
+
@response[:error] = "Invalid command '#{@params[:cmd]}'"
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
# of invalid_request
|
|
429
|
+
|
|
430
|
+
#
|
|
431
|
+
def command_not_implemented
|
|
432
|
+
@response[:error] = "Command '#{@params[:cmd]}' not yet implemented"
|
|
433
|
+
end # of command_not_implemented
|
|
434
|
+
end
|
|
435
|
+
end
|