infopark_fiona7 1.1.0.0.10 → 1.2.0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/fiona7_ui.js +96 -50
- data/app/assets/javascripts/scrivito_patches/models/blob.js +21 -0
- data/app/assets/javascripts/scrivito_patches/models/obj.js +1 -1
- data/app/controllers/fiona7/release_controller.rb +6 -2
- data/app/controllers/fiona7/sessions_controller.rb +3 -0
- data/app/controllers/fiona7/workflow_controller.rb +46 -0
- data/app/helpers/fiona7_login_helper.rb +16 -0
- data/app/helpers/fiona7_override_helper.rb +1 -1
- data/config/delayed_routes.rb +1 -0
- data/config/precedence_routes.rb +92 -0
- data/infopark_fiona7.gemspec +2 -2
- data/lib/fiona7/blob_id_generator.rb +13 -0
- data/lib/fiona7/builder/indirect_blob_builder.rb +71 -0
- data/lib/fiona7/builder/lazy_blob_copier.rb +207 -0
- data/lib/fiona7/builder/obj_builder.rb +29 -50
- data/lib/fiona7/builder/obj_class_builder.rb +20 -0
- data/lib/fiona7/controllers/rest_api/blob_controller.rb +19 -0
- data/lib/fiona7/controllers/rest_api/obj_controller.rb +8 -4
- data/lib/fiona7/controllers/rest_api/workspace_controller.rb +2 -1
- data/lib/fiona7/engine.rb +56 -2
- data/lib/fiona7/json/obj_decorator.rb +4 -1
- data/lib/fiona7/link_converter/fiona_to_scrivito.rb +3 -1
- data/lib/fiona7/link_converter/scrivito_to_fiona.rb +12 -1
- data/lib/fiona7/mode_switch/cms_routes/scrivito_sdk.rb +1 -71
- data/lib/fiona7/mode_switch/cms_routes/scrivito_sdk_slave.rb +1 -71
- data/lib/fiona7/recursive_object_finder.rb +32 -8
- data/lib/fiona7/routers/rest_api.rb +6 -7
- data/lib/fiona7/scrivito_patches/attribute_content.rb +1 -1
- data/lib/fiona7/scrivito_patches/attribute_serializer.rb +22 -1
- data/lib/fiona7/scrivito_patches/basic_obj.rb +27 -5
- data/lib/fiona7/scrivito_patches/cms_backend.rb +3 -22
- data/lib/fiona7/scrivito_patches/cms_rest_api.rb +2 -1
- data/lib/fiona7/scrivito_patches/cms_routing.rb +2 -2
- data/lib/fiona7/scrivito_patches/model_library.rb +3 -3
- data/lib/fiona7/scrivito_patches/page_config.rb +21 -1
- data/lib/fiona7/scrivito_patches/preset_routes.rb +15 -2
- data/lib/fiona7/scrivito_patches/routing_extensions.rb +33 -20
- data/lib/fiona7/scrivito_patches/workspace.rb +3 -1
- data/lib/fiona7/super_object_finder.rb +63 -0
- data/lib/fiona7/type_register.rb +35 -9
- data/lib/fiona7/verity_search_engine.rb +1 -1
- data/lib/fiona7/version.rb +1 -1
- metadata +13 -7
- data/config/routes.rb +0 -13
data/infopark_fiona7.gemspec
CHANGED
@@ -17,11 +17,11 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.files = Dir["{app,config,db,lib}/**/*", "Rakefile", "README.md", "infopark_fiona7.gemspec"]
|
18
18
|
|
19
19
|
s.add_dependency "rails", "~> 4.2.2"
|
20
|
-
s.add_dependency "scrivito", "= 1.
|
20
|
+
s.add_dependency "scrivito", "= 1.2.0"
|
21
21
|
s.add_dependency "scrivito_sdk"
|
22
22
|
s.add_dependency "scrivito_editors"
|
23
23
|
s.add_dependency "infopark_fiona_connector", "= 7.0.1.beta2"
|
24
|
-
s.add_dependency "infopark_reactor", ">= 1.
|
24
|
+
s.add_dependency "infopark_reactor", ">= 1.22.3"
|
25
25
|
s.add_dependency "mini_magick"
|
26
26
|
#s.add_development_dependency "ruby-prof"
|
27
27
|
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Fiona7
|
2
|
+
module Builder
|
3
|
+
class IndirectBlobBuilder
|
4
|
+
def initialize(obj, filename, file=nil)
|
5
|
+
@obj = obj
|
6
|
+
@filename = filename
|
7
|
+
@file = file
|
8
|
+
end
|
9
|
+
|
10
|
+
def call
|
11
|
+
# only publication type can contain children (code = "5")
|
12
|
+
if @obj.obj_type_code != "5" || @obj.id == 2001
|
13
|
+
parent_path = "/_uploads/#{@obj.id}"
|
14
|
+
else
|
15
|
+
parent_path = "#{@obj.path}/_uploads"
|
16
|
+
end
|
17
|
+
|
18
|
+
parent = ensure_parent_exists(parent_path)
|
19
|
+
ext = ::File.extname(@filename).to_s[1..-1]
|
20
|
+
name = ::File.basename(@filename, '.' + ext.to_s)
|
21
|
+
obj_class = if ['jpg', 'jpeg', 'gif', 'png', 'tif', 'tiff'].include?(ext)
|
22
|
+
'X_Image'
|
23
|
+
else
|
24
|
+
'X_Generic'
|
25
|
+
end
|
26
|
+
|
27
|
+
if @file
|
28
|
+
upload = WriteObj.upload(@file, ext, {name: name, parent: parent, obj_class: obj_class}).tap(&:release!)
|
29
|
+
else
|
30
|
+
upload = WriteObj.create({name: name, parent: parent, obj_class: obj_class}).tap(&:release!)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
# TODO: extract this code
|
36
|
+
def ensure_parent_exists(path)
|
37
|
+
remaining = path.split("/")
|
38
|
+
current = []
|
39
|
+
paths = []
|
40
|
+
original = path
|
41
|
+
|
42
|
+
while !remaining.empty?
|
43
|
+
current.push(remaining.shift)
|
44
|
+
|
45
|
+
path = current.join('/').presence || '/'
|
46
|
+
paths.push(path)
|
47
|
+
end
|
48
|
+
|
49
|
+
# TODO: add an optimization for exiting parents
|
50
|
+
|
51
|
+
paths.each do |path|
|
52
|
+
if !WriteObj.exists?(path: path)
|
53
|
+
name, parent_path = name_and_parent_path_from_path(path)
|
54
|
+
WriteObj.create!(name: name, parent_obj_id: WriteObj.find_by_path(parent_path).id, obj_class: 'X_Container')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
WriteObj.find_by_path(original) || (raise "Tried to make sure that the parent under '#{original}' exist, but it does not :(")
|
59
|
+
end
|
60
|
+
|
61
|
+
def name_and_parent_path_from_path(path)
|
62
|
+
components = path.split('/')
|
63
|
+
name = components.pop.presence
|
64
|
+
parent_path= components.join('/').presence || '/'
|
65
|
+
|
66
|
+
return name, parent_path
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
@@ -0,0 +1,207 @@
|
|
1
|
+
require 'fiona7/super_object_finder'
|
2
|
+
require 'fiona7/blob_id_generator'
|
3
|
+
require 'fiona7/builder/indirect_blob_builder'
|
4
|
+
|
5
|
+
module Fiona7
|
6
|
+
module Builder
|
7
|
+
# This class implements a lazy blob copy/rename operation.
|
8
|
+
#
|
9
|
+
# Blob copy is trivial: an existing blob is taken
|
10
|
+
# and copied to the destination object.
|
11
|
+
#
|
12
|
+
# Blob rename occurs, when an apparent copy is executed,
|
13
|
+
# that is the blob that is copied is already associated
|
14
|
+
# with this object (and only with this object)
|
15
|
+
#
|
16
|
+
# The lazy part of this class is the fact that you
|
17
|
+
# need to call .save! on the passed destination obj
|
18
|
+
# to actually persist the changes in the obj
|
19
|
+
#
|
20
|
+
# NOTE: there is an exception to the above:
|
21
|
+
# renaming a blob in standalone mode executes immediately
|
22
|
+
class LazyBlobCopier
|
23
|
+
def initialize(attrs={})
|
24
|
+
@destination_obj = attrs[:destination_obj]
|
25
|
+
@attribute = attrs[:attr_name] || 'blob'
|
26
|
+
@source_blob_id = attrs[:source_blob_id]
|
27
|
+
@filename = attrs[:filename]
|
28
|
+
@content_type = attrs[:content_type]
|
29
|
+
|
30
|
+
@basename, @ext = *split_filename(@filename)
|
31
|
+
end
|
32
|
+
|
33
|
+
def call
|
34
|
+
validate_input!
|
35
|
+
|
36
|
+
@blob_obj = Fiona7::WriteObj.find(@source_blob_id.to_i)
|
37
|
+
@source_obj = find_unique_source_obj
|
38
|
+
|
39
|
+
if @destination_obj == @source_obj
|
40
|
+
rename
|
41
|
+
else
|
42
|
+
copy
|
43
|
+
end
|
44
|
+
|
45
|
+
return {id: @destination_blob_id}
|
46
|
+
end
|
47
|
+
|
48
|
+
protected
|
49
|
+
|
50
|
+
def rename
|
51
|
+
return unless @basename.present? && @ext.present?
|
52
|
+
|
53
|
+
if Fiona7.mode == :legacy
|
54
|
+
direct_rename
|
55
|
+
else
|
56
|
+
indirect_rename
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def copy
|
61
|
+
if Fiona7.mode == :legacy
|
62
|
+
direct_copy
|
63
|
+
else
|
64
|
+
indirect_copy
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def direct_rename
|
69
|
+
@destination_obj.set(:name, @basename)
|
70
|
+
# CM stores the file extension as :contentType and not the mimetype
|
71
|
+
@destination_obj.set(:content_type, @ext)
|
72
|
+
|
73
|
+
@destination_blob_id = Fiona7::BlobIdGenerator.new(@destination_obj.id).call
|
74
|
+
end
|
75
|
+
|
76
|
+
def indirect_rename
|
77
|
+
# This is kind of silly, but as far as I can tell there is no way
|
78
|
+
# around it: whenever you rename a blob, you will also rename
|
79
|
+
# it in the published workspace.
|
80
|
+
# Basically the same design flaw as in the "classical" CM
|
81
|
+
#
|
82
|
+
# NOTE: this applies the change directly, whether a "save"
|
83
|
+
# happens afterwards on not, so it breaks the "lazy" part
|
84
|
+
# of the contract
|
85
|
+
@blob_obj.set(:name, @basename)
|
86
|
+
@blob_obj.set(:content_type, @ext)
|
87
|
+
@blob_obj.save!
|
88
|
+
# Just for good measure, since contentType is a content attribute
|
89
|
+
@blob_obj.release
|
90
|
+
# And now for the "lazy" part, we have to update the linklist with
|
91
|
+
# new "fake" blob id to fool SDK into thinking we actually copied
|
92
|
+
# the blob
|
93
|
+
@destination_blob_id = Fiona7::BlobIdGenerator.new(@blob_obj.id, @blob_obj.last_changed).call
|
94
|
+
@destination_obj.set(@attribute, {
|
95
|
+
title: @destination_blob_id,
|
96
|
+
destination_object: @blob_obj
|
97
|
+
})
|
98
|
+
end
|
99
|
+
|
100
|
+
def direct_copy
|
101
|
+
@destination_blob_id = Fiona7::BlobIdGenerator.new(@destination_obj.id).call
|
102
|
+
|
103
|
+
content = @blob_obj.edited? ? 'edited' : 'released'
|
104
|
+
|
105
|
+
begin
|
106
|
+
blob_ticket_id = @blob_obj.send(:crul_obj).blob_ticket_id(content)
|
107
|
+
target = @destination_obj.send(:crul_obj)
|
108
|
+
|
109
|
+
target.set(:blob, {blob_ticket_id => {encoding: 'stream'}})
|
110
|
+
rescue Reactor::Cm::BlobTooSmallError
|
111
|
+
# Reading blob_ticket_id failed,
|
112
|
+
# an alternative strategy is required:
|
113
|
+
# reading into memory
|
114
|
+
@destination_obj.set(:blob, @blob_obj.body)
|
115
|
+
end
|
116
|
+
|
117
|
+
if @basename.present? && @ext.present?
|
118
|
+
direct_rename
|
119
|
+
end
|
120
|
+
|
121
|
+
# NOTE: calling @destination_obj.save! will trigger target.save!
|
122
|
+
end
|
123
|
+
|
124
|
+
def indirect_copy
|
125
|
+
destination_blob = construct_destination_blob
|
126
|
+
|
127
|
+
# NOTE: this should under normal circumstances
|
128
|
+
# never return 'edited'. But this is on the safe side
|
129
|
+
content = @blob_obj.edited? ? 'edited' : 'released'
|
130
|
+
|
131
|
+
begin
|
132
|
+
blob_ticket_id = @blob_obj.send(:crul_obj).blob_ticket_id(content)
|
133
|
+
target = destination_blob.send(:crul_obj)
|
134
|
+
|
135
|
+
target.set(:blob, {blob_ticket_id => {encoding: 'stream'}})
|
136
|
+
rescue Reactor::Cm::BlobTooSmallError
|
137
|
+
# Reading blob_ticket_id failed,
|
138
|
+
# an alternative strategy is required:
|
139
|
+
# reading into memory
|
140
|
+
destination_blob.set(:blob, @blob_obj.body)
|
141
|
+
end
|
142
|
+
|
143
|
+
# NOTE: this will also call target.save!
|
144
|
+
destination_blob.save!
|
145
|
+
destination_blob.release
|
146
|
+
|
147
|
+
@destination_blob_id = Fiona7::BlobIdGenerator.new(destination_blob.id, destination_blob.last_changed).call
|
148
|
+
|
149
|
+
@destination_obj.set(@attribute, {
|
150
|
+
title: @destination_blob_id, destination_object: destination_blob
|
151
|
+
})
|
152
|
+
end
|
153
|
+
|
154
|
+
def split_filename(filename)
|
155
|
+
return unless filename
|
156
|
+
|
157
|
+
ext = ::File.extname(filename)[1..-1]
|
158
|
+
base = ::File.basename(filename, ::File.extname(filename))
|
159
|
+
|
160
|
+
return base, ext
|
161
|
+
end
|
162
|
+
|
163
|
+
def validate_input!
|
164
|
+
if Fiona7.mode == :legacy && @attribute != 'blob'
|
165
|
+
raise Scrivito::ClientError.new("Blob attributes other than :blob are unsupported in :legacy mode")
|
166
|
+
end
|
167
|
+
if !extension_and_content_type_match?
|
168
|
+
Rails.logger.error("BLOB COPY ERROR: content_type passed to the blob copy operation ignored, because it does not match the file extension")
|
169
|
+
end
|
170
|
+
if !@destination_obj.kind_of?(Fiona7::WriteObj)
|
171
|
+
raise ArgumentError, "Wrong input for LazyBlobCopier"
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def extension_and_content_type_match?
|
176
|
+
return true if @content_type.blank?
|
177
|
+
return false if @ext.blank?
|
178
|
+
|
179
|
+
return MIME::Types.type_for(@ext).any? {|m| m.content_type == @content_type }
|
180
|
+
#rescue
|
181
|
+
return false
|
182
|
+
end
|
183
|
+
|
184
|
+
def find_unique_source_obj
|
185
|
+
if Fiona7.mode == :legacy
|
186
|
+
return @blob_obj
|
187
|
+
end
|
188
|
+
|
189
|
+
linking = Fiona7::SuperObjectFinder.new.find(@blob_obj)
|
190
|
+
|
191
|
+
if linking.count == 1
|
192
|
+
return linking.first
|
193
|
+
else
|
194
|
+
return nil
|
195
|
+
end
|
196
|
+
rescue ActiveRecord::RecordNotFound
|
197
|
+
return nil
|
198
|
+
end
|
199
|
+
|
200
|
+
def construct_destination_blob
|
201
|
+
filename = @filename || (@source_obj.name + "." + @source_obj.file_extension)
|
202
|
+
Fiona7::Builder::IndirectBlobBuilder.new(@destination_obj, filename).call
|
203
|
+
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
@@ -13,6 +13,9 @@ require 'fiona7/obj_class_name_demangler'
|
|
13
13
|
require 'fiona7/builder/batch_widget_writer'
|
14
14
|
require 'fiona7/link_converter/scrivito_to_fiona'
|
15
15
|
require 'fiona7/widget_resolver'
|
16
|
+
require 'fiona7/builder/lazy_blob_copier'
|
17
|
+
require 'fiona7/builder/indirect_blob_builder'
|
18
|
+
require 'fiona7/blob_id_generator'
|
16
19
|
|
17
20
|
|
18
21
|
module Fiona7
|
@@ -25,7 +28,6 @@ module Fiona7
|
|
25
28
|
@values.delete(:_modification)
|
26
29
|
# revert command sends this info. which is silly.
|
27
30
|
@values.delete(:_last_changed)
|
28
|
-
#puts "CREATING/UPDATING: #{@values.inspect}"
|
29
31
|
end
|
30
32
|
|
31
33
|
def build
|
@@ -218,6 +220,8 @@ module Fiona7
|
|
218
220
|
#if value.nil? && value != @obj[attribute_name]
|
219
221
|
@obj.set(attribute_name.to_s, value)
|
220
222
|
#end
|
223
|
+
when :number
|
224
|
+
@obj.set(attribute_name.to_s, value.to_s)
|
221
225
|
when :stringlist
|
222
226
|
if Fiona7.mode == :legacy && attribute_name.to_s == "channels"
|
223
227
|
@obj.set(:channels, value || [])
|
@@ -247,9 +251,25 @@ module Fiona7
|
|
247
251
|
elsif value.nil?
|
248
252
|
@obj.set(attribute_name.to_s, [])
|
249
253
|
elsif value.kind_of?(Hash)
|
250
|
-
|
251
|
-
|
252
|
-
|
254
|
+
source_blob_id = value["id"] || value["id_to_copy"]
|
255
|
+
filename = value["filename"]
|
256
|
+
content_type = value["content_type"]
|
257
|
+
|
258
|
+
# There is a little bit of magic behind this.
|
259
|
+
# This will pass some data directly to the crul_obj
|
260
|
+
# bypassing @obj.set(), but calling @obj.save
|
261
|
+
# afterwards still persists the data correctly
|
262
|
+
#
|
263
|
+
# This works the same way as Reactor::Tools::Uploader
|
264
|
+
Fiona7::Builder::LazyBlobCopier.new({
|
265
|
+
destination_obj: @obj,
|
266
|
+
attr_name: attribute_name.to_s,
|
267
|
+
source_blob_id: source_blob_id,
|
268
|
+
filename: filename,
|
269
|
+
content_type: content_type
|
270
|
+
}).call
|
271
|
+
|
272
|
+
# NOTE: no @obj.set() required here
|
253
273
|
else
|
254
274
|
raise Scrivito::ClientError.new("Invalid input for binary field", 422)
|
255
275
|
end
|
@@ -291,7 +311,7 @@ module Fiona7
|
|
291
311
|
end
|
292
312
|
|
293
313
|
def rewrite_full_text
|
294
|
-
full_text = ::YAML.load(@obj.attr_values["X_full_text"])
|
314
|
+
full_text = ::YAML.load(@obj.attr_values["X_full_text"]) rescue {}
|
295
315
|
full_text = {} unless full_text.kind_of?(Hash)
|
296
316
|
full_text["_widget_pool"] ||= {}
|
297
317
|
full_text["_widget_pool"].deep_merge!(@widget_pool)
|
@@ -302,55 +322,14 @@ module Fiona7
|
|
302
322
|
end
|
303
323
|
|
304
324
|
def upload_file(file)
|
305
|
-
|
306
|
-
|
307
|
-
if @obj.obj_type_code != "5" || @obj.id == 2001
|
308
|
-
parent_path = "/_uploads/#{@obj.id}"
|
309
|
-
else
|
310
|
-
parent_path = "#{@obj.path}/_uploads"
|
311
|
-
end
|
312
|
-
|
313
|
-
parent = ensure_parent_exists(parent_path)
|
314
|
-
ext = ::File.extname(file.path).to_s[1..-1]
|
315
|
-
name = ::File.basename(file.path, '.' + ext.to_s)
|
316
|
-
obj_class = if ['jpg', 'jpeg', 'gif', 'png', 'tif', 'tiff'].include?(ext)
|
317
|
-
'X_Image'
|
318
|
-
else
|
319
|
-
'X_Generic'
|
320
|
-
end
|
321
|
-
|
322
|
-
raise Scrivito::ScrivitoError.new("File extension of uploaded file cannot be identified", 422) if ext.nil?
|
323
|
-
|
324
|
-
upload = WriteObj.upload(file, ext, {name: name, parent: parent, obj_class: obj_class}).tap(&:release!)
|
325
|
-
encoded_id = '%032d' % upload.id
|
325
|
+
upload = Fiona7::Builder::IndirectBlobBuilder.new(@obj, ::File.basename(file.path), file).call
|
326
|
+
encoded_id = Fiona7::BlobIdGenerator.new(upload.id, upload.last_changed).call
|
326
327
|
{title: encoded_id, destination_object: upload}
|
327
328
|
end
|
328
329
|
|
329
330
|
def upload_uploaded_file(file)
|
330
|
-
|
331
|
-
|
332
|
-
# also handle / this way
|
333
|
-
if @obj.obj_type_code != "5" || @obj.id == 2001
|
334
|
-
parent_path = "/_uploads/#{@obj.id}"
|
335
|
-
else
|
336
|
-
parent_path = "#{@obj.path}/_uploads"
|
337
|
-
end
|
338
|
-
|
339
|
-
parent = ensure_parent_exists(parent_path)
|
340
|
-
# here the first difference
|
341
|
-
ext = ::File.extname(file.original_filename).to_s[1..-1]
|
342
|
-
name = ::File.basename(file.original_filename, '.' + ext.to_s)
|
343
|
-
obj_class = if ['jpg', 'jpeg', 'gif', 'png', 'tif', 'tiff'].include?(ext)
|
344
|
-
'X_Image'
|
345
|
-
else
|
346
|
-
'X_Generic'
|
347
|
-
end
|
348
|
-
|
349
|
-
raise Scrivito::ScrivitoError.new("File extension of uploaded file cannot be identified", 422) if ext.nil?
|
350
|
-
|
351
|
-
# here the second difference
|
352
|
-
upload = WriteObj.upload(file.open, ext, {name: name, parent: parent, obj_class: obj_class}).tap(&:release!)
|
353
|
-
encoded_id = '%032d' % upload.id
|
331
|
+
upload = Fiona7::Builder::IndirectBlobBuilder.new(@obj, file.original_filename, file.open).call
|
332
|
+
encoded_id = Fiona7::BlobIdGenerator.new(upload.id, upload.last_changed).call
|
354
333
|
{title: encoded_id, destination_object: upload}
|
355
334
|
end
|
356
335
|
|
@@ -48,6 +48,26 @@ module Fiona7
|
|
48
48
|
else
|
49
49
|
Assert.constraint(false, "Type #{attribute[:type]} requested for #{attribute[:real_name]}, but is #{cms_attribute.attribute_type}")
|
50
50
|
end
|
51
|
+
elsif cms_attribute.attribute_type == "multienum" && attribute[:type] == :stringlist
|
52
|
+
# This is a bit of hack. This allows a multienum to exist
|
53
|
+
# But be treated in the application like a stringlist
|
54
|
+
#
|
55
|
+
# The intention here is to allow dynamically restricting or allowing
|
56
|
+
# values in the application, while having a fixed superset of allowed
|
57
|
+
# values in the CMS
|
58
|
+
#
|
59
|
+
# Nothing to do.
|
60
|
+
Rails.logger.warn("TYPE SYNCHRONIZATION: Type #{attribute[:type]} requested for #{attribute[:real_name]}, but is #{cms_attribute.attribute_type}, this may cause errors.")
|
61
|
+
elsif cms_attribute.attribute_type == "enum" && attribute[:type] == :string
|
62
|
+
# This is a bit of hack. This allows an enum to exist
|
63
|
+
# But be treated in the application like a string
|
64
|
+
#
|
65
|
+
# The intention here is to allow dynamically restricting or allowing
|
66
|
+
# values in the application, while having a fixed superset of allowed
|
67
|
+
# values in the CMS
|
68
|
+
#
|
69
|
+
# Nothing to do.
|
70
|
+
Rails.logger.warn("TYPE SYNCHRONIZATION: Type #{attribute[:type]} requested for #{attribute[:real_name]}, but is #{cms_attribute.attribute_type}, this may cause errors.")
|
51
71
|
elsif attribute[:type] == :enum || attribute[:type] == :multienum
|
52
72
|
if cms_attribute.attribute_type == "multienum" || cms_attribute.attribute_type == "enum"
|
53
73
|
if attribute[:values]
|