card-mod-carrierwave 0.11.0 → 0.11.5
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 +4 -4
- data/lib/carrier_wave/file_card_uploader.rb +44 -92
- data/lib/carrier_wave/file_card_uploader/path.rb +54 -0
- data/lib/carrier_wave/image_card_uploader.rb +1 -1
- data/set/abstract/attachment.rb +36 -13
- data/set/abstract/attachment/cloud.rb +5 -1
- data/set/abstract/attachment/coded.rb +7 -2
- data/set/abstract/attachment/local.rb +4 -1
- data/set/abstract/attachment/paths.rb +1 -0
- data/set/abstract/attachment/storage_type.rb +33 -32
- data/set/abstract/attachment/upload_cache.rb +4 -0
- data/set/self/favicon.rb +1 -0
- data/set/type/file.rb +27 -10
- data/set/type/file/core.haml +2 -0
- data/set/type/image.rb +7 -4
- data/set/type/image/html_views.rb +13 -3
- metadata +21 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3189d4e4979c66b05d69e7b09a602098410d5df3faa5cdd19a96b7b026a69bb
|
4
|
+
data.tar.gz: 774a0049c1c77d4373d5769a965734b797e916606f8ebd959ed97c39315f5646
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2091526b0eb3da1d50ec833d7d990848a4bd6968b4595a235debccd6b5d802dcb5b32bf20a2abe6b2d0ba2679ad1d8564c755ea2d06f435563cdb08bf76e46e1
|
7
|
+
data.tar.gz: d10af461b8cc1ef9d0eaf8147274ab8e40f9a0106f87e8f153ccd2b4884ff73667fc53c6dfab8391f541dd3e80a552b06fc1d3eb03fd42d3174fdbd150653632
|
@@ -1,40 +1,4 @@
|
|
1
1
|
module CarrierWave
|
2
|
-
class << self
|
3
|
-
def tmp_path
|
4
|
-
@tmp_path ||= Card.paths["tmp"].existent.first
|
5
|
-
end
|
6
|
-
end
|
7
|
-
|
8
|
-
class SanitizedFile
|
9
|
-
def content_type
|
10
|
-
# the original content_type method doesn't seem to be very reliable
|
11
|
-
# It uses mime_magic_content_type - which returns invalid/invalid for css files
|
12
|
-
# that start with a comment - as the second option. (we switch the order and
|
13
|
-
# use it as the third option)
|
14
|
-
@content_type ||=
|
15
|
-
existing_content_type ||
|
16
|
-
mini_mime_content_type ||
|
17
|
-
mime_magic_content_type
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
module Uploader
|
22
|
-
# Implements a different name pattern for versions than CarrierWave's
|
23
|
-
# default: we expect the version name at the end of the filename separated
|
24
|
-
# by a dash
|
25
|
-
module Versions
|
26
|
-
private
|
27
|
-
|
28
|
-
# put version at the end of the filename
|
29
|
-
def full_filename for_file
|
30
|
-
name = super(for_file)
|
31
|
-
parts = name.split "."
|
32
|
-
basename = [parts.shift, version_name].compact.join("-")
|
33
|
-
"#{basename}.#{parts.join('.')}"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
2
|
# Takes care of the file upload for cards with attached files.
|
39
3
|
# Most of the upload behaviour depends on the card itself.
|
40
4
|
# (e.g. card type and storage option chosen for the card). So in contrary
|
@@ -161,15 +125,17 @@ module CarrierWave
|
|
161
125
|
#
|
162
126
|
class FileCardUploader < Uploader::Base
|
163
127
|
attr_accessor :mod
|
128
|
+
|
164
129
|
include Card::Env::Location
|
130
|
+
include Path
|
165
131
|
|
166
|
-
STORAGE_TYPES = [
|
167
|
-
CONFIG_OPTIONS = [
|
168
|
-
|
169
|
-
CONFIG_CREDENTIAL_OPTIONS = [
|
170
|
-
|
171
|
-
|
172
|
-
|
132
|
+
STORAGE_TYPES = %i[cloud web coded local].freeze
|
133
|
+
CONFIG_OPTIONS = %i[provider attributes directory public credentials
|
134
|
+
authenticated_url_expiration use_ssl_for_aws].freeze
|
135
|
+
CONFIG_CREDENTIAL_OPTIONS = %i[
|
136
|
+
provider
|
137
|
+
aws_access_key_id aws_secret_access_key region host endpoint
|
138
|
+
google_access_key_id google_secret_access_key
|
173
139
|
].freeze
|
174
140
|
delegate :store_dir, :retrieve_dir, :file_dir, :mod, :bucket, to: :model
|
175
141
|
|
@@ -205,6 +171,7 @@ module CarrierWave
|
|
205
171
|
model.with_storage_options opts do
|
206
172
|
return model.content if model.web?
|
207
173
|
return "" unless file.present?
|
174
|
+
|
208
175
|
"%s/%s" % [file_dir, url_filename]
|
209
176
|
end
|
210
177
|
end
|
@@ -230,57 +197,12 @@ module CarrierWave
|
|
230
197
|
end
|
231
198
|
end
|
232
199
|
|
233
|
-
def local_url opts={}
|
234
|
-
"%s/%s/%s" % [local_url_base(opts), file_dir, full_filename(url_filename(opts))]
|
235
|
-
end
|
236
|
-
|
237
|
-
def local_url_base opts={}
|
238
|
-
web_path = Card.config.files_web_path
|
239
|
-
opts.delete(:absolute) ? card_url(web_path) : card_path(web_path)
|
240
|
-
end
|
241
|
-
|
242
|
-
def public_path
|
243
|
-
File.join Cardio.paths["public"].existent.first, url
|
244
|
-
end
|
245
|
-
|
246
|
-
def cache_dir
|
247
|
-
@model.files_base_dir + "/cache"
|
248
|
-
end
|
249
|
-
|
250
|
-
# Carrierwave calls store_path without argument when it stores the file
|
251
|
-
# and with the identifier from the db when it retrieves the file.
|
252
|
-
# In our case the first part of our identifier is not part of the path
|
253
|
-
# but we can construct the filename from db data. So we don't need the
|
254
|
-
# identifier.
|
255
|
-
def store_path for_file=nil
|
256
|
-
if for_file
|
257
|
-
retrieve_path
|
258
|
-
else
|
259
|
-
File.join([store_dir, full_filename(filename)].compact)
|
260
|
-
end
|
261
|
-
end
|
262
|
-
|
263
|
-
def retrieve_path
|
264
|
-
File.join([retrieve_dir, full_filename(filename)].compact)
|
265
|
-
end
|
266
|
-
|
267
|
-
def tmp_path
|
268
|
-
Dir.mkdir model.tmp_upload_dir unless Dir.exist? model.tmp_upload_dir
|
269
|
-
File.join model.tmp_upload_dir, filename
|
270
|
-
end
|
271
|
-
|
272
200
|
def create_versions? new_file
|
273
201
|
model.create_versions? new_file
|
274
202
|
end
|
275
203
|
|
276
|
-
# paperclip compatibility used in type/file.rb#core (base format)
|
277
|
-
def path version=nil
|
278
|
-
version ? versions[version].path : super()
|
279
|
-
end
|
280
|
-
|
281
204
|
def original_filename
|
282
|
-
@original_filename ||= model.selected_action
|
283
|
-
model.selected_action.comment
|
205
|
+
@original_filename ||= model.selected_action&.comment
|
284
206
|
end
|
285
207
|
|
286
208
|
def action_id
|
@@ -288,7 +210,7 @@ module CarrierWave
|
|
288
210
|
end
|
289
211
|
|
290
212
|
# delegate carrierwave's fog config methods to bucket configuration
|
291
|
-
|
213
|
+
CONFIG_OPTIONS.each do |name|
|
292
214
|
define_method("fog_#{name}") { bucket_config name }
|
293
215
|
end
|
294
216
|
|
@@ -311,9 +233,39 @@ module CarrierWave
|
|
311
233
|
def storage
|
312
234
|
case @model.storage_type
|
313
235
|
when :cloud
|
314
|
-
|
236
|
+
Storage::Fog.new self
|
315
237
|
else
|
316
|
-
|
238
|
+
Storage::File.new self
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
class SanitizedFile
|
244
|
+
def content_type
|
245
|
+
# the original content_type method doesn't seem to be very reliable
|
246
|
+
# It uses mime_magic_content_type - which returns invalid/invalid for css files
|
247
|
+
# that start with a comment - as the second option. (we switch the order and
|
248
|
+
# use it as the third option)
|
249
|
+
@content_type ||=
|
250
|
+
existing_content_type ||
|
251
|
+
mini_mime_content_type ||
|
252
|
+
mime_magic_content_type
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
module Uploader
|
257
|
+
# Implements a different name pattern for versions than CarrierWave's
|
258
|
+
# default: we expect the version name at the end of the filename separated
|
259
|
+
# by a dash
|
260
|
+
module Versions
|
261
|
+
private
|
262
|
+
|
263
|
+
# put version at the end of the filename
|
264
|
+
def full_filename for_file
|
265
|
+
name = super(for_file)
|
266
|
+
parts = name.split "."
|
267
|
+
basename = [parts.shift, version_name].compact.join("-")
|
268
|
+
"#{basename}.#{parts.join('.')}"
|
317
269
|
end
|
318
270
|
end
|
319
271
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module CarrierWave
|
2
|
+
def self.tmp_path
|
3
|
+
@tmp_path ||= Card.paths["tmp"].existent.first
|
4
|
+
end
|
5
|
+
|
6
|
+
class FileCardUploader
|
7
|
+
# path-related methods for uploader
|
8
|
+
module Path
|
9
|
+
def local_url opts={}
|
10
|
+
"%s/%s/%s" % [local_url_base(opts), file_dir, full_filename(url_filename(opts))]
|
11
|
+
end
|
12
|
+
|
13
|
+
def local_url_base opts={}
|
14
|
+
web_path = Card.config.files_web_path
|
15
|
+
opts.delete(:absolute) ? card_url(web_path) : card_path(web_path)
|
16
|
+
end
|
17
|
+
|
18
|
+
def public_path
|
19
|
+
File.join Cardio.paths["public"].existent.first, url
|
20
|
+
end
|
21
|
+
|
22
|
+
def cache_dir
|
23
|
+
"#{@model.files_base_dir}/cache"
|
24
|
+
end
|
25
|
+
|
26
|
+
# Carrierwave calls store_path without argument when it stores the file
|
27
|
+
# and with the identifier from the db when it retrieves the file.
|
28
|
+
# In our case the first part of our identifier is not part of the path
|
29
|
+
# but we can construct the filename from db data. So we don't need the
|
30
|
+
# identifier.
|
31
|
+
def store_path for_file=nil
|
32
|
+
if for_file
|
33
|
+
retrieve_path
|
34
|
+
else
|
35
|
+
File.join([store_dir, full_filename(filename)].compact)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def retrieve_path
|
40
|
+
File.join([retrieve_dir, full_filename(filename)].compact)
|
41
|
+
end
|
42
|
+
|
43
|
+
def tmp_path
|
44
|
+
Dir.mkdir model.tmp_upload_dir unless Dir.exist? model.tmp_upload_dir
|
45
|
+
File.join model.tmp_upload_dir, filename
|
46
|
+
end
|
47
|
+
|
48
|
+
# paperclip compatibility used in type/file.rb#core (base format)
|
49
|
+
def path version=nil
|
50
|
+
version ? versions[version].path : super()
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -10,7 +10,7 @@ module CarrierWave
|
|
10
10
|
include CarrierWave::MiniMagick
|
11
11
|
|
12
12
|
def path version=nil
|
13
|
-
|
13
|
+
version && version != :original ? versions[version].path : super()
|
14
14
|
end
|
15
15
|
|
16
16
|
version :icon, if: :create_versions?, from_version: :small do
|
data/set/abstract/attachment.rb
CHANGED
@@ -17,11 +17,13 @@ end
|
|
17
17
|
|
18
18
|
event :save_original_filename, :prepare_to_store, on: :save, when: :file_ready_to_save? do
|
19
19
|
return unless @current_action
|
20
|
+
|
20
21
|
@current_action.update! comment: original_filename
|
21
22
|
end
|
22
23
|
|
23
24
|
event :validate_file_exist, :validate, on: :create do
|
24
25
|
return if empty_ok?
|
26
|
+
|
25
27
|
if will_be_stored_as == :web
|
26
28
|
errors.add "url is missing" if content.blank?
|
27
29
|
elsif !attachment.file.present?
|
@@ -40,12 +42,14 @@ def file_ready_to_save?
|
|
40
42
|
attachment_is_changing?
|
41
43
|
end
|
42
44
|
|
43
|
-
|
45
|
+
# needed for flexmail attachments. hacky.
|
46
|
+
def item_names _args={}
|
44
47
|
[name]
|
45
48
|
end
|
46
49
|
|
47
50
|
def original_filename
|
48
51
|
return content.split("/").last if web?
|
52
|
+
|
49
53
|
attachment.original_filename
|
50
54
|
end
|
51
55
|
|
@@ -75,7 +79,7 @@ end
|
|
75
79
|
|
76
80
|
def assign_set_specific_attributes
|
77
81
|
# reset content if we really have something to upload
|
78
|
-
self.content = nil if set_specific[attachment_name
|
82
|
+
self.content = nil if set_specific[attachment_name].present?
|
79
83
|
super
|
80
84
|
end
|
81
85
|
|
@@ -90,23 +94,42 @@ end
|
|
90
94
|
|
91
95
|
def revision action, before_action=false
|
92
96
|
return unless (result = super)
|
97
|
+
|
93
98
|
result[:empty_ok] = true
|
94
99
|
result
|
95
100
|
end
|
96
101
|
|
97
102
|
def attachment_format ext
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
if exts.find { |mt| mt.extensions.member? ext }
|
103
|
-
ext
|
104
|
-
else
|
105
|
-
exts[0].extensions[0]
|
106
|
-
end
|
107
|
-
end
|
103
|
+
rescuing_extension_issues do
|
104
|
+
return unless ext.present? && original_extension
|
105
|
+
|
106
|
+
confirm_original_extension(ext) || detect_extension(ext)
|
108
107
|
end
|
109
|
-
|
108
|
+
end
|
109
|
+
|
110
|
+
def rescuing_extension_issues
|
111
|
+
yield
|
112
|
+
rescue StandardError => e
|
110
113
|
Rails.logger.info "attachment_format issue: #{e.message}"
|
111
114
|
nil
|
112
115
|
end
|
116
|
+
|
117
|
+
def detect_extension ext
|
118
|
+
return unless (mime_types = MIME::Types[attachment.content_type])
|
119
|
+
|
120
|
+
recognized_extension?(mime_types, ext) ? ext : mime_types[0].extensions[0]
|
121
|
+
end
|
122
|
+
|
123
|
+
def recognized_extension? mime_types, ext
|
124
|
+
mime_types.find { |mt| mt.extensions.member? ext }
|
125
|
+
end
|
126
|
+
|
127
|
+
def confirm_original_extension ext
|
128
|
+
return unless ["file", original_extension].member? ext
|
129
|
+
|
130
|
+
original_extension
|
131
|
+
end
|
132
|
+
|
133
|
+
def original_extension
|
134
|
+
@original_extension ||= attachment&.extension&.sub(/^\./, "")
|
135
|
+
end
|
@@ -11,7 +11,7 @@ event :validate_storage_type_update, :validate, on: :update, when: :cloud? do
|
|
11
11
|
# `update storage_type: :local, file: [file handle]` is ok
|
12
12
|
return unless storage_type_changed? && !attachment_is_changing?
|
13
13
|
|
14
|
-
errors.add :storage_type,
|
14
|
+
errors.add :storage_type, t(:carrierwave_moving_files_is_not_supported)
|
15
15
|
end
|
16
16
|
|
17
17
|
def bucket
|
@@ -20,6 +20,7 @@ end
|
|
20
20
|
|
21
21
|
def new_card_bucket
|
22
22
|
return unless new_card?
|
23
|
+
|
23
24
|
# If the file is assigned before the bucket option we have to
|
24
25
|
# check if there is a bucket options in set_specific.
|
25
26
|
# That happens for exmaple when the file appears before the bucket in the
|
@@ -34,6 +35,7 @@ end
|
|
34
35
|
|
35
36
|
def load_bucket_config
|
36
37
|
return {} unless bucket
|
38
|
+
|
37
39
|
bucket_config = Cardio.config.file_buckets&.dig(bucket.to_sym) || {}
|
38
40
|
bucket_config.symbolize_keys!
|
39
41
|
bucket_config[:credentials]&.symbolize_keys!
|
@@ -96,6 +98,7 @@ def each_credential_from_env
|
|
96
98
|
regexp = credential_from_env_regexp
|
97
99
|
ENV.each_key do |env_key|
|
98
100
|
next unless (m = regexp.match env_key)
|
101
|
+
|
99
102
|
yield m[:option].downcase.to_sym
|
100
103
|
end
|
101
104
|
end
|
@@ -112,6 +115,7 @@ end
|
|
112
115
|
|
113
116
|
def bucket_from_content
|
114
117
|
return unless content
|
118
|
+
|
115
119
|
content.match(/^\((?<bucket>[^)]+)\)/) { |m| m[:bucket] }
|
116
120
|
end
|
117
121
|
|
@@ -1,12 +1,17 @@
|
|
1
1
|
event :lose_coded_status_on_update, :initialize, on: :update, when: :coded? do
|
2
2
|
# unless explicit
|
3
3
|
return if @new_mod
|
4
|
+
|
4
5
|
@new_storage_type ||= storage_type_from_config
|
5
6
|
end
|
6
7
|
|
7
8
|
event :validate_coded_storage_type, :validate, on: :save, when: :will_become_coded? do
|
8
|
-
|
9
|
-
|
9
|
+
storage_type_error :mod_argument_needed_to_save unless mod || @new_mod
|
10
|
+
storage_type_error :codename_needed_for_storage if codename.blank?
|
11
|
+
end
|
12
|
+
|
13
|
+
def storage_type_error error_name
|
14
|
+
errors.add :storage_type, t("carrierwave_#{error_name}")
|
10
15
|
end
|
11
16
|
|
12
17
|
def will_become_coded?
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
event :update_public_link_on_create, :integrate, on: :create, when: :local? do
|
3
2
|
update_public_link
|
4
3
|
end
|
@@ -9,6 +8,7 @@ end
|
|
9
8
|
|
10
9
|
event :update_public_link, after: :update_read_rule, when: :local? do
|
11
10
|
return if content.blank?
|
11
|
+
|
12
12
|
if who_can(:read).include? Card::AnyoneID
|
13
13
|
create_public_links
|
14
14
|
else
|
@@ -21,6 +21,7 @@ private
|
|
21
21
|
def create_public_links
|
22
22
|
path = attachment.public_path
|
23
23
|
return if File.exist? path
|
24
|
+
|
24
25
|
FileUtils.mkdir_p File.dirname(path)
|
25
26
|
File.symlink attachment.path, path unless File.symlink? path
|
26
27
|
create_versions_public_links
|
@@ -29,6 +30,7 @@ end
|
|
29
30
|
def create_versions_public_links
|
30
31
|
attachment.versions.each_value do |version|
|
31
32
|
next if File.symlink? version.public_path
|
33
|
+
|
32
34
|
File.symlink version.path, version.public_path
|
33
35
|
end
|
34
36
|
end
|
@@ -36,5 +38,6 @@ end
|
|
36
38
|
def remove_public_links
|
37
39
|
symlink_dir = File.dirname attachment.public_path
|
38
40
|
return unless Dir.exist? symlink_dir
|
41
|
+
|
39
42
|
FileUtils.rm_rf symlink_dir
|
40
43
|
end
|
@@ -14,12 +14,9 @@ event :storage_type_change, :store, on: :update, when: :storage_type_changed? do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
event :validate_storage_type, :validate, on: :save do
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
new_storage_type: @new_storage_type
|
21
|
-
)
|
22
|
-
end
|
17
|
+
return if known_storage_type? will_be_stored_as
|
18
|
+
|
19
|
+
errors.add :storage_type, unknown_storage_type(@new_storage_type)
|
23
20
|
end
|
24
21
|
|
25
22
|
def will_be_stored_as
|
@@ -64,8 +61,8 @@ def mod
|
|
64
61
|
end
|
65
62
|
|
66
63
|
def mod_from_content
|
67
|
-
if content
|
68
|
-
|
64
|
+
if (m = content.match %r{^:[^/]+/([^.]+)})
|
65
|
+
m[1] # current mod_file format
|
69
66
|
else
|
70
67
|
mod_from_deprecated_content
|
71
68
|
end
|
@@ -73,8 +70,9 @@ end
|
|
73
70
|
|
74
71
|
# old format is still used in card_changes
|
75
72
|
def mod_from_deprecated_content
|
76
|
-
return if content
|
73
|
+
return if content.match?(/^~/)
|
77
74
|
return unless (lines = content.split("\n")) && lines.size == 4
|
75
|
+
|
78
76
|
lines.last
|
79
77
|
end
|
80
78
|
|
@@ -93,15 +91,15 @@ def valid_storage_type_list
|
|
93
91
|
end
|
94
92
|
|
95
93
|
def invalid_storage_type! type
|
96
|
-
raise Card::Error,
|
94
|
+
raise Card::Error, t(:carrierwave_error_invalid_storage_type, type: type)
|
97
95
|
end
|
98
96
|
|
99
97
|
def storage_type_from_content
|
100
98
|
case content
|
101
|
-
when /^\(/
|
102
|
-
when %r{/^https
|
103
|
-
when /^~/
|
104
|
-
when
|
99
|
+
when /^\(/ then :cloud
|
100
|
+
when %r{/^https?:/} then :web
|
101
|
+
when /^~/ then :local
|
102
|
+
when /^:/ then :coded
|
105
103
|
else
|
106
104
|
if deprecated_mod_file?
|
107
105
|
:coded
|
@@ -123,7 +121,7 @@ end
|
|
123
121
|
|
124
122
|
def storage_type= value
|
125
123
|
known_storage_type? value
|
126
|
-
if @action == :update
|
124
|
+
if @action == :update # && storage_type != value
|
127
125
|
# we cant update the storage type directly here
|
128
126
|
# if we do then the uploader doesn't find the file we want to update
|
129
127
|
@new_storage_type = value
|
@@ -133,19 +131,22 @@ def storage_type= value
|
|
133
131
|
end
|
134
132
|
|
135
133
|
def with_storage_options opts={}
|
136
|
-
old_values =
|
134
|
+
old_values = stash_and_set_storage_options opts
|
137
135
|
validate_temporary_storage_type_change opts[:storage_type]
|
138
|
-
|
139
|
-
next unless opts[opt_name]
|
140
|
-
old_values[opt_name] = instance_variable_get "@#{opt_name}"
|
141
|
-
instance_variable_set "@#{opt_name}", opts[opt_name]
|
142
|
-
@temp_storage_type = true
|
143
|
-
end
|
136
|
+
@temp_storage_type = true
|
144
137
|
yield
|
145
138
|
ensure
|
146
139
|
@temp_storage_type = false
|
147
|
-
old_values.each
|
148
|
-
|
140
|
+
old_values.each { |key, val| instance_variable_set "@#{key}", val }
|
141
|
+
end
|
142
|
+
|
143
|
+
def stash_and_set_storage_options opts
|
144
|
+
%i[storage_type mod bucket].each_with_object({}) do |opt_name, old_values|
|
145
|
+
next unless opts[opt_name]
|
146
|
+
|
147
|
+
old_values[opt_name] = instance_variable_get "@#{opt_name}"
|
148
|
+
instance_variable_set "@#{opt_name}", opts[opt_name]
|
149
|
+
old_values
|
149
150
|
end
|
150
151
|
end
|
151
152
|
|
@@ -153,14 +154,10 @@ def temporary_storage_type_change?
|
|
153
154
|
@temp_storage_type
|
154
155
|
end
|
155
156
|
|
156
|
-
def validate_temporary_storage_type_change
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
raise Error, tr(:unknown_storage_type, new_storage_type: new_storage_type)
|
161
|
-
end
|
162
|
-
|
163
|
-
if new_storage_type == :coded && codename.blank?
|
157
|
+
def validate_temporary_storage_type_change type=nil
|
158
|
+
return unless type ||= @new_storage_type
|
159
|
+
raise Error, unknown_storage_type(type) unless known_storage_type? type
|
160
|
+
if type == :coded && codename.blank?
|
164
161
|
raise Error, "codename needed for storage type :coded"
|
165
162
|
end
|
166
163
|
end
|
@@ -168,3 +165,7 @@ end
|
|
168
165
|
def known_storage_type? type=storage_type
|
169
166
|
type.in? CarrierWave::FileCardUploader::STORAGE_TYPES
|
170
167
|
end
|
168
|
+
|
169
|
+
def unknown_storage_type type
|
170
|
+
t :carrierwave_unknown_storage_type, new_storage_type: type
|
171
|
+
end
|
@@ -27,6 +27,7 @@ end
|
|
27
27
|
event :assign_attachment_on_create, :initialize,
|
28
28
|
after: :assign_action, on: :create, when: :save_preliminary_upload? do
|
29
29
|
return unless (action = Card::Action.fetch(@action_id_of_cached_upload))
|
30
|
+
|
30
31
|
upload_cache_card.selected_action_id = action.id
|
31
32
|
upload_cache_card.select_file_revision
|
32
33
|
assign_attachment upload_cache_card.attachment.file, action.comment
|
@@ -35,6 +36,7 @@ end
|
|
35
36
|
event :assign_attachment_on_update, :initialize,
|
36
37
|
after: :assign_action, on: :update, when: :save_preliminary_upload? do
|
37
38
|
return unless (action = Card::Action.fetch(@action_id_of_cached_upload))
|
39
|
+
|
38
40
|
uploaded_file = with_selected_action_id(action.id) { attachment.file }
|
39
41
|
assign_attachment uploaded_file, action.comment
|
40
42
|
end
|
@@ -48,6 +50,7 @@ end
|
|
48
50
|
event :delete_cached_upload_file_on_create, :integrate,
|
49
51
|
on: :create, when: :save_preliminary_upload? do
|
50
52
|
return unless (action = Card::Action.fetch(@action_id_of_cached_upload))
|
53
|
+
|
51
54
|
upload_cache_card.delete_files_for_action action
|
52
55
|
action.delete
|
53
56
|
end
|
@@ -61,6 +64,7 @@ end
|
|
61
64
|
event :delete_cached_upload_file_on_update, :integrate,
|
62
65
|
on: :update, when: :save_preliminary_upload? do
|
63
66
|
return unless (action = Card::Action.fetch(@action_id_of_cached_upload))
|
67
|
+
|
64
68
|
delete_files_for_action action
|
65
69
|
action.delete
|
66
70
|
end
|
data/set/self/favicon.rb
CHANGED
data/set/type/file.rb
CHANGED
@@ -9,8 +9,9 @@ module SelectedAction
|
|
9
9
|
|
10
10
|
def last_content_action_id
|
11
11
|
return super if temporary_storage_type_change?
|
12
|
+
|
12
13
|
# find action id from content (saves lookups)
|
13
|
-
db_content.to_s.split(%r{[
|
14
|
+
db_content.to_s.split(%r{[/.]})[-2]
|
14
15
|
end
|
15
16
|
end
|
16
17
|
include SelectedAction
|
@@ -19,6 +20,7 @@ format do
|
|
19
20
|
view :source do
|
20
21
|
file = card.attachment
|
21
22
|
return "" unless file.valid?
|
23
|
+
|
22
24
|
contextualize_path file.url
|
23
25
|
end
|
24
26
|
|
@@ -33,17 +35,26 @@ format do
|
|
33
35
|
end
|
34
36
|
|
35
37
|
def handle_source
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
38
|
+
rescuing_file_source_error do
|
39
|
+
source = _render_source
|
40
|
+
return "" if source.blank?
|
41
|
+
|
42
|
+
block_given? ? yield(source) : source
|
43
|
+
end
|
42
44
|
end
|
43
45
|
|
44
46
|
def selected_version
|
45
47
|
card.attachment
|
46
48
|
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def rescuing_file_source_error
|
53
|
+
yield
|
54
|
+
rescue StandardError => e
|
55
|
+
Rails.logger.info "Error with file source: #{e.message}"
|
56
|
+
t :carrierwave_file_error
|
57
|
+
end
|
47
58
|
end
|
48
59
|
|
49
60
|
format :file do
|
@@ -53,6 +64,7 @@ format :file do
|
|
53
64
|
attachment_format = card.attachment_format(params[:format])
|
54
65
|
return _render_not_found unless attachment_format
|
55
66
|
return card.format(:html).render_core if card.remote_storage?
|
67
|
+
|
56
68
|
set_response_headers
|
57
69
|
args_for_send_file
|
58
70
|
end
|
@@ -60,13 +72,14 @@ format :file do
|
|
60
72
|
def args_for_send_file
|
61
73
|
file = selected_version
|
62
74
|
[file.path, { type: file.content_type,
|
63
|
-
filename:
|
75
|
+
filename: "#{card.name.safe_key}#{file.extension}",
|
64
76
|
x_sendfile: true,
|
65
77
|
disposition: (params[:format] == "file" ? "attachment" : "inline") }]
|
66
78
|
end
|
67
79
|
|
68
80
|
def set_response_headers
|
69
81
|
return unless params[:explicit_file] && (response = controller&.response)
|
82
|
+
|
70
83
|
response.headers["Expires"] = 1.year.from_now.httpdate
|
71
84
|
# currently using default "private", because proxy servers could block
|
72
85
|
# needed permission checks
|
@@ -74,10 +87,14 @@ format :file do
|
|
74
87
|
end
|
75
88
|
end
|
76
89
|
|
90
|
+
format :json do
|
91
|
+
view(:content) { render_core }
|
92
|
+
end
|
93
|
+
|
77
94
|
format :html do
|
78
95
|
view :core do
|
79
96
|
handle_source do |source|
|
80
|
-
|
97
|
+
haml :core, source: source
|
81
98
|
end
|
82
99
|
end
|
83
100
|
|
@@ -111,6 +128,6 @@ format :html do
|
|
111
128
|
end
|
112
129
|
|
113
130
|
def preview_editor_delete_text
|
114
|
-
|
131
|
+
t :carrierwave_delete
|
115
132
|
end
|
116
133
|
end
|
data/set/type/image.rb
CHANGED
@@ -23,8 +23,10 @@ format do
|
|
23
23
|
|
24
24
|
view :source do
|
25
25
|
return card.content if card.web?
|
26
|
+
|
26
27
|
image = selected_version
|
27
28
|
return "" unless image.valid?
|
29
|
+
|
28
30
|
contextualize_path image.url
|
29
31
|
end
|
30
32
|
|
@@ -37,10 +39,6 @@ format do
|
|
37
39
|
end
|
38
40
|
end
|
39
41
|
|
40
|
-
def handle_source
|
41
|
-
super
|
42
|
-
end
|
43
|
-
|
44
42
|
def closed_size
|
45
43
|
:icon
|
46
44
|
end
|
@@ -70,11 +68,16 @@ format do
|
|
70
68
|
end
|
71
69
|
end
|
72
70
|
|
71
|
+
format :json do
|
72
|
+
include File::JsonFormat
|
73
|
+
end
|
74
|
+
|
73
75
|
format :email_html do
|
74
76
|
view :inline, cache: :never do
|
75
77
|
handle_source do |source|
|
76
78
|
return source unless (mail = inherit :active_mail) &&
|
77
79
|
::File.exist?(path = selected_version.path)
|
80
|
+
|
78
81
|
url = attach_image mail, path
|
79
82
|
image_tag url
|
80
83
|
end
|
@@ -4,6 +4,7 @@ format :html do
|
|
4
4
|
# core HTML image view.
|
5
5
|
view :core do
|
6
6
|
return card.attachment.read if card.svg?
|
7
|
+
|
7
8
|
with_valid_source do |source|
|
8
9
|
image_tag source, alt: card.name
|
9
10
|
end
|
@@ -34,6 +35,7 @@ format :html do
|
|
34
35
|
|
35
36
|
def preview
|
36
37
|
return if card.new_card? && !card.preliminary_upload?
|
38
|
+
|
37
39
|
wrap_with :div, class: "attachment-preview",
|
38
40
|
id: "#{card.attachment.filename}-preview" do
|
39
41
|
_render_core size: :medium
|
@@ -55,12 +57,20 @@ format :html do
|
|
55
57
|
|
56
58
|
def old_image action, hide_diff
|
57
59
|
return if hide_diff || !action
|
58
|
-
|
59
|
-
|
60
|
-
|
60
|
+
|
61
|
+
old_image_change action do |old_action_id|
|
62
|
+
card.with_selected_action_id old_action_id do
|
63
|
+
Card::Content::Diff.render_deleted_chunk _render_core
|
64
|
+
end
|
61
65
|
end
|
62
66
|
end
|
63
67
|
|
68
|
+
def old_image_change action
|
69
|
+
return unless (change = card.last_change_on(:db_content, before: action))
|
70
|
+
|
71
|
+
yield change.card_action_id
|
72
|
+
end
|
73
|
+
|
64
74
|
def new_image action
|
65
75
|
card.with_selected_action_id action.id do
|
66
76
|
Card::Content::Diff.render_added_chunk _render_core
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: card-mod-carrierwave
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
4
|
+
version: 0.11.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ethan McCutchen
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2021-05-10 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: card
|
@@ -18,28 +18,28 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - '='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 1.101.
|
21
|
+
version: 1.101.5
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - '='
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: 1.101.
|
28
|
+
version: 1.101.5
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: carrierwave
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- -
|
33
|
+
- - "~>"
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: 2.
|
35
|
+
version: 2.2.1
|
36
36
|
type: :runtime
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- -
|
40
|
+
- - "~>"
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: 2.
|
42
|
+
version: 2.2.1
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: mini_magick
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
@@ -60,28 +60,28 @@ dependencies:
|
|
60
60
|
requirements:
|
61
61
|
- - '='
|
62
62
|
- !ruby/object:Gem::Version
|
63
|
-
version: 0.11.
|
63
|
+
version: 0.11.5
|
64
64
|
type: :runtime
|
65
65
|
prerelease: false
|
66
66
|
version_requirements: !ruby/object:Gem::Requirement
|
67
67
|
requirements:
|
68
68
|
- - '='
|
69
69
|
- !ruby/object:Gem::Version
|
70
|
-
version: 0.11.
|
70
|
+
version: 0.11.5
|
71
71
|
- !ruby/object:Gem::Dependency
|
72
72
|
name: card-mod-permissions
|
73
73
|
requirement: !ruby/object:Gem::Requirement
|
74
74
|
requirements:
|
75
75
|
- - '='
|
76
76
|
- !ruby/object:Gem::Version
|
77
|
-
version: 0.11.
|
77
|
+
version: 0.11.5
|
78
78
|
type: :runtime
|
79
79
|
prerelease: false
|
80
80
|
version_requirements: !ruby/object:Gem::Requirement
|
81
81
|
requirements:
|
82
82
|
- - '='
|
83
83
|
- !ruby/object:Gem::Version
|
84
|
-
version: 0.11.
|
84
|
+
version: 0.11.5
|
85
85
|
description: ''
|
86
86
|
email:
|
87
87
|
- info@decko.org
|
@@ -92,6 +92,7 @@ files:
|
|
92
92
|
- config/core_initializers/carrierwave.rb
|
93
93
|
- lib/carrier_wave/card_mount.rb
|
94
94
|
- lib/carrier_wave/file_card_uploader.rb
|
95
|
+
- lib/carrier_wave/file_card_uploader/path.rb
|
95
96
|
- lib/carrier_wave/image_card_uploader.rb
|
96
97
|
- set/abstract/attachment.rb
|
97
98
|
- set/abstract/attachment/cloud.rb
|
@@ -107,14 +108,20 @@ files:
|
|
107
108
|
- set/self/new_file.rb
|
108
109
|
- set/self/new_image.rb
|
109
110
|
- set/type/file.rb
|
111
|
+
- set/type/file/core.haml
|
110
112
|
- set/type/file/file_chooser.haml
|
111
113
|
- set/type/file/preview_editor.haml
|
112
114
|
- set/type/image.rb
|
113
115
|
- set/type/image/html_views.rb
|
114
|
-
homepage:
|
116
|
+
homepage: https://decko.org
|
115
117
|
licenses:
|
116
118
|
- GPL-3.0
|
117
119
|
metadata:
|
120
|
+
source_code_uri: https://github.com/decko-commons/decko
|
121
|
+
homepage_uri: https://decko.org
|
122
|
+
bug_tracker_uri: https://github.com/decko-commons/decko/issues
|
123
|
+
wiki_uri: https://decko.org
|
124
|
+
documentation_url: http://docs.decko.org/
|
118
125
|
card-mod: carrierwave
|
119
126
|
post_install_message:
|
120
127
|
rdoc_options: []
|
@@ -131,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
131
138
|
- !ruby/object:Gem::Version
|
132
139
|
version: '0'
|
133
140
|
requirements: []
|
134
|
-
rubygems_version: 3.
|
141
|
+
rubygems_version: 3.1.4
|
135
142
|
signing_key:
|
136
143
|
specification_version: 4
|
137
144
|
summary: File and Image handling
|