infopark_fiona7 0.30.0.2 → 0.70.0.1
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.js +1 -282
- data/app/assets/javascripts/fiona7_ui.js +335 -0
- data/app/assets/stylesheets/fiona7.css.scss +4 -36
- data/app/assets/stylesheets/fiona7_ui.css.scss +39 -0
- data/app/controllers/fiona7/blobs_controller.rb +13 -23
- data/app/controllers/fiona7/release_controller.rb +1 -0
- data/app/controllers/fiona7/sessions_controller.rb +3 -5
- data/app/helpers/fiona7_override_helper.rb +6 -2
- data/app/models/fiona7/edited_obj.rb +6 -1
- data/app/models/fiona7/released_obj.rb +11 -3
- data/app/models/fiona7/write_obj.rb +18 -3
- data/app/models/fiona7_login_page.rb +3 -0
- data/app/views/scrivito/ui/index.html.erb +16 -0
- data/config/routes.rb +2 -0
- data/infopark_fiona7.gemspec +6 -4
- data/lib/fiona7/builder/batch_widget_writer.rb +7 -3
- data/lib/fiona7/builder/obj_builder.rb +130 -42
- data/lib/fiona7/builder/obj_class_builder.rb +3 -59
- data/lib/fiona7/builder/obj_class_updater.rb +7 -44
- data/lib/fiona7/builder/obj_updater.rb +25 -7
- data/lib/fiona7/builder/widget_builder.rb +24 -0
- data/lib/fiona7/builder/widget_building.rb +2 -7
- data/lib/fiona7/builder/widget_updater.rb +21 -0
- data/lib/fiona7/controllers/content_service/obj_controller.rb +16 -25
- data/lib/fiona7/controllers/rest_api/blob_controller.rb +41 -2
- data/lib/fiona7/controllers/rest_api/obj_controller.rb +19 -7
- data/lib/fiona7/controllers/rest_api/workspace_controller.rb +1 -1
- data/lib/fiona7/engine.rb +58 -7
- data/lib/fiona7/fiona_connector_patches/basic_obj.rb +46 -0
- data/lib/fiona7/initializer.rb +15 -11
- data/lib/fiona7/json/obj_decorator.rb +53 -31
- data/lib/fiona7/json/reverse_obj_decorator.rb +36 -0
- data/lib/fiona7/json/widget_decorator.rb +3 -1
- data/lib/fiona7/link_converter/fiona_to_scrivito.rb +45 -13
- data/lib/fiona7/link_converter/scrivito_to_fiona.rb +1 -1
- data/lib/fiona7/middleware/server_detection_middleware.rb +27 -0
- data/lib/fiona7/middleware/table_switching_middleware.rb +33 -0
- data/lib/fiona7/mode_switch/cms_routes/scrivito_sdk.rb +5 -11
- data/lib/fiona7/mode_switch/composite.rb +2 -4
- data/lib/fiona7/naive_search_engine.rb +66 -16
- data/lib/fiona7/routers/rest_api.rb +50 -45
- data/lib/fiona7/routing_monkey_patch.rb +5 -3
- data/lib/fiona7/scrivito_patches/attribute_content.rb +9 -10
- data/lib/fiona7/scrivito_patches/attribute_serializer.rb +15 -0
- data/lib/fiona7/scrivito_patches/basic_obj.rb +25 -19
- data/lib/fiona7/scrivito_patches/basic_widget.rb +4 -0
- data/lib/fiona7/scrivito_patches/binary.rb +452 -33
- data/lib/fiona7/scrivito_patches/client_config.rb +0 -19
- data/lib/fiona7/scrivito_patches/cms_backend.rb +48 -0
- data/lib/fiona7/scrivito_patches/cms_field_tag.rb +19 -0
- data/lib/fiona7/scrivito_patches/cms_rest_api.rb +20 -3
- data/lib/fiona7/scrivito_patches/cms_routing.rb +20 -34
- data/lib/fiona7/scrivito_patches/controller_actions.rb +0 -8
- data/lib/fiona7/scrivito_patches/migrator.rb +4 -0
- data/lib/fiona7/scrivito_patches/objs_controller.rb +18 -0
- data/lib/fiona7/scrivito_patches/type_computer.rb +12 -12
- data/lib/fiona7/scrivito_patches/webservice_controller.rb +21 -0
- data/lib/fiona7/scrivito_patches/workspace.rb +8 -5
- data/lib/fiona7/shadow_classes.rb +74 -0
- data/lib/fiona7/table_switcher.rb +39 -0
- data/lib/fiona7/type_loader.rb +63 -0
- data/lib/fiona7/type_register.rb +170 -89
- data/lib/fiona7/type_synchronizer.rb +68 -0
- data/lib/fiona7/version.rb +1 -1
- data/lib/fiona7/version_helper.rb +35 -54
- data/lib/fiona7/widget_resolver.rb +1 -1
- data/lib/tasks/fiona7_tasks.rake +0 -8
- metadata +57 -18
- data/lib/fiona7/controllers/rest_api/obj_class_controller.rb +0 -39
- data/lib/fiona7/json/obj_class_decorator.rb +0 -45
- data/lib/fiona7/mode_switch/constants.rb +0 -86
- data/lib/fiona7/type_register_mixin.rb +0 -9
@@ -1,18 +1,8 @@
|
|
1
1
|
/*
|
2
|
-
*= require scrivito
|
3
|
-
*=
|
4
|
-
*/
|
5
|
-
|
6
|
-
body > div.scrivito_topbar > div > div.scrivito_button_bar.scrivito_app.scrivito_no_hover {
|
7
|
-
width: 170px !important;
|
8
|
-
}
|
9
|
-
body > div.scrivito_topbar > div > div.scrivito_button_bar.scrivito_app.scrivito_no_hover .scrivito_logo {
|
10
|
-
background-image: asset-url('fiona7-logo.png') !important;
|
11
|
-
height: 43px !important;
|
12
|
-
width: 163px !important;
|
13
|
-
top: 0px;
|
14
|
-
left: 0px;
|
15
|
-
}
|
2
|
+
*= require scrivito
|
3
|
+
*= require_self
|
4
|
+
*/
|
5
|
+
|
16
6
|
/* colors */
|
17
7
|
body.scrivito_widget_dragging_active[data-scrivito-display-mode="editing"] *[data-scrivito-widget-obj-class],
|
18
8
|
body.scrivito_widget_dragging_active[data-scrivito-display-mode="editing"] *[data-scrivito-widget-obj-class] *[data-scrivito-field-type="widget"],
|
@@ -59,25 +49,3 @@ body.scrivito_widget_dragging_active[data-scrivito-display-mode="editing"] *[dat
|
|
59
49
|
.scrivito_editing_marker {
|
60
50
|
padding: 0 !important;
|
61
51
|
}
|
62
|
-
.scrivito_input_new_ws_name, #scrivito_delete_workspace, #scrivito_rename_workspace, #scrivito_create_workspace, #scrivito_rebase_workspace, #scrivito_workspace_settings {
|
63
|
-
display: none !important;
|
64
|
-
}
|
65
|
-
|
66
|
-
.scrivito_editing_widget_visualization .scrivito_icon {
|
67
|
-
line-height: 118px !important;
|
68
|
-
}
|
69
|
-
|
70
|
-
/* for removing edit toggle */
|
71
|
-
.scrivito_viewmodes_wrapper {
|
72
|
-
text-align: center !important;
|
73
|
-
}
|
74
|
-
.scrivito_viewmodes {
|
75
|
-
width: auto !important;
|
76
|
-
display: inline-block !important;
|
77
|
-
}
|
78
|
-
.scrivito_viewmodes.scrivito_viewmode_diff_active .scrivito_viewmode_pill,
|
79
|
-
.scrivito_viewmodes.scrivito_viewmode_deleted_active .scrivito_viewmode_pill,
|
80
|
-
.scrivito_viewmodes.scrivito_viewmode_added_active .scrivito_viewmode_pill {
|
81
|
-
left: auto !important;
|
82
|
-
right: 0px !important;
|
83
|
-
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
body > div.scrivito_topbar > div > div.scrivito_button_bar.scrivito_app.scrivito_no_hover {
|
2
|
+
width: 170px !important;
|
3
|
+
}
|
4
|
+
body > div.scrivito_topbar > div > div.scrivito_button_bar.scrivito_app.scrivito_no_hover .scrivito_logo {
|
5
|
+
background-image: asset-url('fiona7-logo.png') !important;
|
6
|
+
height: 43px !important;
|
7
|
+
width: 163px !important;
|
8
|
+
top: 0px;
|
9
|
+
left: 0px;
|
10
|
+
}
|
11
|
+
|
12
|
+
.scrivito_menu_box #scrivito_sdk_workspace_settings, .scrivito_menu_box #scrivito_sdk_rename_workspace, .scrivito_menu_box #scrivito_sdk_rebase_workspace, .scrivito_menu_box #scrivito_sdk_delete_workspace, .scrivito_menu_box #scrivito_sdk_create_workspace {
|
13
|
+
display: none;
|
14
|
+
}
|
15
|
+
|
16
|
+
/*
|
17
|
+
.scrivito_input_new_ws_name, #scrivito_delete_workspace, #scrivito_rename_workspace, #scrivito_create_workspace, #scrivito_rebase_workspace, #scrivito_workspace_settings {
|
18
|
+
display: none !important;
|
19
|
+
}
|
20
|
+
|
21
|
+
.scrivito_editing_widget_visualization .scrivito_icon {
|
22
|
+
line-height: 118px !important;
|
23
|
+
}
|
24
|
+
|
25
|
+
// for removing edit toggle
|
26
|
+
.scrivito_viewmodes_wrapper {
|
27
|
+
text-align: center !important;
|
28
|
+
}
|
29
|
+
.scrivito_viewmodes {
|
30
|
+
width: auto !important;
|
31
|
+
display: inline-block !important;
|
32
|
+
}
|
33
|
+
.scrivito_viewmodes.scrivito_viewmode_diff_active .scrivito_viewmode_pill,
|
34
|
+
.scrivito_viewmodes.scrivito_viewmode_deleted_active .scrivito_viewmode_pill,
|
35
|
+
.scrivito_viewmodes.scrivito_viewmode_added_active .scrivito_viewmode_pill {
|
36
|
+
left: auto !important;
|
37
|
+
right: 0px !important;
|
38
|
+
}
|
39
|
+
*/
|
@@ -1,34 +1,24 @@
|
|
1
1
|
module Fiona7
|
2
2
|
class BlobsController < ActionController::Base
|
3
|
-
# required for ensure_object_is_permitted
|
4
|
-
cattr_accessor :current_user_proc
|
5
|
-
self.current_user_proc = proc { nil }
|
6
3
|
|
7
|
-
include
|
8
|
-
before_filter :load_object
|
9
|
-
before_filter :ensure_object_is_active
|
10
|
-
before_filter :ensure_object_is_permitted
|
11
|
-
before_filter :set_google_expire_header
|
4
|
+
include Fiona7::BinaryHandling::DeliveryMixin
|
12
5
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
head :bad_request
|
18
|
-
end
|
6
|
+
protected
|
7
|
+
|
8
|
+
def binary_id_from_params
|
9
|
+
params[:id]
|
19
10
|
end
|
20
11
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
return false
|
12
|
+
def transformation_from_params
|
13
|
+
if params[:t]
|
14
|
+
BinaryHandling::ParamEncoder.new.decode(
|
15
|
+
params[:t]
|
16
|
+
)
|
17
|
+
end
|
28
18
|
end
|
29
19
|
|
30
|
-
def
|
31
|
-
|
20
|
+
def set_header(name, value)
|
21
|
+
response.headers[name] = value
|
32
22
|
end
|
33
23
|
end
|
34
24
|
end
|
@@ -39,11 +39,9 @@ module Fiona7
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def valid_credentials?(login, password)
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
ensure
|
46
|
-
rsession.user_name = current_login unless rsession.user_name == current_login
|
42
|
+
Reactor::Sudo.su(Fiona7.root) do
|
43
|
+
Reactor::Cm::User.new(login).has_password?(password)
|
44
|
+
end
|
47
45
|
end
|
48
46
|
end
|
49
47
|
end
|
@@ -16,7 +16,7 @@ module Fiona7OverrideHelper
|
|
16
16
|
|
17
17
|
def scrivito_body_tags
|
18
18
|
obj = @obj.kind_of?(RailsConnector::BasicObj) ? @obj.scrivito_obj : @obj
|
19
|
-
Scrivito::LayoutTags.new(self).
|
19
|
+
Scrivito::LayoutTags.new(self).page_config(obj)
|
20
20
|
end
|
21
21
|
|
22
22
|
def fiona7_head_tags
|
@@ -37,9 +37,13 @@ module Fiona7OverrideHelper
|
|
37
37
|
def fiona7_tag_list(tag_name, obj, field_name, options = {}, &block)
|
38
38
|
raise "This method can only be used in legacy mode" unless Fiona7.mode == :legacy
|
39
39
|
|
40
|
+
fiona_obj = obj.kind_of?(RailsConnector::BasicObj) ? obj : obj.fiona_obj
|
40
41
|
obj = obj.kind_of?(RailsConnector::BasicObj) ? obj.scrivito_obj : obj
|
42
|
+
children_map = Hash[fiona_obj.children.map {|c| [c.id.to_s, c] }]
|
43
|
+
|
41
44
|
scrivito_tag_list(tag_name, obj, field_name, options) do |list, scrivito_child|
|
42
|
-
|
45
|
+
fiona_child = children_map[scrivito_child.id]
|
46
|
+
block.call(list, fiona_child)
|
43
47
|
end
|
44
48
|
end
|
45
49
|
|
@@ -7,7 +7,12 @@ module Fiona7
|
|
7
7
|
has_many :children, :class_name => self.name, :foreign_key => 'parent_obj_id'
|
8
8
|
belongs_to :parent, :class_name => self.name, :foreign_key => 'parent_obj_id'
|
9
9
|
|
10
|
-
|
10
|
+
if Fiona7.mode == :standalone
|
11
|
+
default_scope { where('suppress_export = 0 AND obj_class NOT IN (?)', ['X_Generic', 'X_Image', 'X_Container']) }
|
12
|
+
else
|
13
|
+
# suppress_export can be misused in legacy mode
|
14
|
+
default_scope { where('obj_class NOT IN (?)', ['X_Generic', 'X_Image', 'X_Container']) }
|
15
|
+
end
|
11
16
|
|
12
17
|
# disable STI
|
13
18
|
self.inheritance_column = :_type_disabled
|
@@ -7,9 +7,17 @@ module Fiona7
|
|
7
7
|
has_many :children, :class_name => self.name, :foreign_key => 'parent_obj_id'
|
8
8
|
belongs_to :parent, :class_name => self.name, :foreign_key => 'parent_obj_id'
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
if Fiona7.mode == :standalone
|
11
|
+
default_scope do
|
12
|
+
now = Time.now.utc.to_iso
|
13
|
+
where("is_released = 1 AND suppress_export = 0").where('obj_class NOT IN (?)', ['X_Generic', 'X_Image', 'X_Container']).where("(valid_from IS NULL or valid_from <= :now) and (valid_until IS NULL or valid_until >= :now)", :now => now)
|
14
|
+
end
|
15
|
+
else
|
16
|
+
# suppress_export can be misused in legacy mode
|
17
|
+
default_scope do
|
18
|
+
now = Time.now.utc.to_iso
|
19
|
+
where("is_released = 1").where('obj_class NOT IN (?)', ['X_Generic', 'X_Image', 'X_Container']).where("(valid_from IS NULL or valid_from <= :now) and (valid_until IS NULL or valid_until >= :now)", :now => now)
|
20
|
+
end
|
13
21
|
end
|
14
22
|
|
15
23
|
# disable STI
|
@@ -14,9 +14,19 @@ module Fiona7
|
|
14
14
|
'Fiona7::InternalReleasedObj'
|
15
15
|
]
|
16
16
|
|
17
|
-
|
18
|
-
#
|
17
|
+
# in legacy mode the app decides the default
|
18
|
+
# and per request table-switching does the rest
|
19
|
+
if Fiona7.mode == :standalone
|
20
|
+
self.configure_for_content(:edited)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Workaround for constant reloading breaking
|
24
|
+
# otherwise dangling references
|
25
|
+
# Obj.reflections["children"].klass != Obj
|
26
|
+
has_many :children, :class_name => 'RailsConnector::AbstractObj', :foreign_key => 'parent_obj_id'
|
27
|
+
belongs_to :parent, :class_name => 'RailsConnector::AbstractObj', :foreign_key => 'parent_obj_id'
|
19
28
|
|
29
|
+
# disable STI
|
20
30
|
if Fiona7.mode == :standalone
|
21
31
|
# In standalone mode Obj belongs to scrivito
|
22
32
|
# hence no inheritance
|
@@ -25,6 +35,10 @@ module Fiona7
|
|
25
35
|
def self.descends_from_active_record?
|
26
36
|
true
|
27
37
|
end
|
38
|
+
|
39
|
+
def self.subclass_from_attributes(attrs)
|
40
|
+
nil
|
41
|
+
end
|
28
42
|
else
|
29
43
|
# If this method returns true no STI handling occurs
|
30
44
|
def self.descends_from_active_record?
|
@@ -44,9 +58,10 @@ module Fiona7
|
|
44
58
|
end
|
45
59
|
|
46
60
|
# TODO: use this to simulate deleted objects
|
61
|
+
# but not in legacy mode !!
|
47
62
|
#default_scope { where('suppress_export != 0') }
|
48
63
|
|
49
|
-
self.logger = Logger.new(nil)
|
64
|
+
#self.logger = Logger.new(nil)
|
50
65
|
|
51
66
|
include RailsConnector::Meta
|
52
67
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Fiona7</title>
|
5
|
+
<%= stylesheet_link_tag 'scrivito_ui' %>
|
6
|
+
<%= stylesheet_link_tag 'fiona7_ui' %>
|
7
|
+
<%= javascript_include_tag 'scrivito_ui' %>
|
8
|
+
<%= javascript_include_tag 'scrivito_ui_extensions' %>
|
9
|
+
<%= javascript_include_tag 'fiona7_ui' %>
|
10
|
+
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
11
|
+
</head>
|
12
|
+
<body id="scrivito_ui">
|
13
|
+
<iframe name="scrivito_application" src="<%= @application_src %>"></iframe>
|
14
|
+
<%= content_tag(:div, '', 'data-scrivito-private-ui-config' => @ui_config) %>
|
15
|
+
</body>
|
16
|
+
</html>
|
data/config/routes.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
Rails.application.routes.draw do
|
2
2
|
get '/_b/:id(/:name)' => 'fiona7/blobs#show', as: :fiona7_blob
|
3
3
|
|
4
|
+
match '/_b/:id(/:name)' => 'fiona7/blobs#query', as: :fiona7_blob_meta, via: [:head]
|
5
|
+
|
4
6
|
post '/_f7/login', to: 'fiona7/sessions#create', as: :fiona7_login
|
5
7
|
|
6
8
|
delete '/_f/logout', to: 'fiona7/sessions#destroy', as: :fiona7_logout
|
data/infopark_fiona7.gemspec
CHANGED
@@ -16,10 +16,12 @@ Gem::Specification.new do |s|
|
|
16
16
|
|
17
17
|
s.files = Dir["{app,config,db,lib}/**/*", "Rakefile", "README.md", "infopark_fiona7.gemspec"]
|
18
18
|
|
19
|
-
s.add_dependency "rails", "~> 4.
|
20
|
-
s.add_dependency "scrivito", "
|
19
|
+
s.add_dependency "rails", "~> 4.2.2"
|
20
|
+
s.add_dependency "scrivito", "= 0.70.0.rc1"
|
21
21
|
s.add_dependency "scrivito_sdk"
|
22
22
|
s.add_dependency "scrivito_editors"
|
23
|
-
s.add_dependency "infopark_fiona_connector", "
|
24
|
-
s.add_dependency "infopark_reactor", "1.
|
23
|
+
s.add_dependency "infopark_fiona_connector", "= 7.0.1.beta2"
|
24
|
+
s.add_dependency "infopark_reactor", "= 1.15.0.beta1"
|
25
|
+
s.add_dependency "mini_magick"
|
26
|
+
s.add_development_dependency "ruby-prof"
|
25
27
|
end
|
@@ -43,9 +43,13 @@ module Fiona7
|
|
43
43
|
|
44
44
|
def dependencies
|
45
45
|
Set.new.tap do |dependencies|
|
46
|
-
values.each do |
|
47
|
-
if
|
48
|
-
|
46
|
+
values.each do |attribute_name, (type, val)|
|
47
|
+
if type == "widgetlist"
|
48
|
+
if val.kind_of?(Array)
|
49
|
+
dependencies.merge(val)
|
50
|
+
elsif val.kind_of?(Hash)
|
51
|
+
dependencies.merge((val["list"]||[]).map {|w| w["widget"] })
|
52
|
+
end
|
49
53
|
end
|
50
54
|
end
|
51
55
|
end
|
@@ -5,7 +5,7 @@ module Fiona7
|
|
5
5
|
end
|
6
6
|
end
|
7
7
|
|
8
|
-
require 'fiona7/
|
8
|
+
require 'fiona7/type_register'
|
9
9
|
require 'fiona7/recursive_link_resolver'
|
10
10
|
#require 'fiona7/write_obj'
|
11
11
|
#require 'fiona7/released_obj'
|
@@ -17,19 +17,21 @@ require 'fiona7/widget_resolver'
|
|
17
17
|
module Fiona7
|
18
18
|
module Builder
|
19
19
|
class ObjBuilder
|
20
|
-
include TypeRegisterMixin
|
21
20
|
|
22
21
|
def initialize(values)
|
23
22
|
@values = values.symbolize_keys
|
23
|
+
# garbage
|
24
|
+
@values.delete(:_modification)
|
25
|
+
# revert command sends this info. which is silly.
|
26
|
+
@values.delete(:_last_changed)
|
27
|
+
puts "CREATING/UPDATING: #{@values.inspect}"
|
24
28
|
end
|
25
29
|
|
26
30
|
def build
|
27
31
|
assert_valid
|
28
32
|
prepare_object
|
29
33
|
|
30
|
-
create_object
|
31
34
|
write_widget_pool
|
32
|
-
namespace_attributes
|
33
35
|
store_attributes
|
34
36
|
|
35
37
|
@obj
|
@@ -40,37 +42,37 @@ module Fiona7
|
|
40
42
|
end
|
41
43
|
|
42
44
|
protected
|
45
|
+
def update?
|
46
|
+
false
|
47
|
+
end
|
48
|
+
|
43
49
|
def assert_valid
|
44
50
|
validate || (raise Scrivito::ClientError.new(@error_msg || "Invalid input", 422))
|
45
51
|
end
|
46
52
|
|
47
53
|
def prepare_object
|
48
|
-
@path = @values.delete(:_path)
|
54
|
+
@path = @values.delete(:_path) || generate_orphaned_path
|
49
55
|
@obj_class = @values.delete(:_obj_class)
|
56
|
+
@real_obj_class = TypeRegister::NameAliaser.new(virtual: @obj_class).real_obj_class
|
50
57
|
@widget_pool = @values.delete(:_widget_pool)
|
51
58
|
@permalink = @values.delete(:_permalink)
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
end
|
59
|
+
|
60
|
+
@path = "/#{@path}" unless @path.start_with?('/')
|
61
|
+
@name, parent_path = name_and_parent_path_from_path(@path)
|
56
62
|
@parent = ensure_parent_exists(parent_path) if parent_path
|
57
|
-
end
|
58
63
|
|
59
|
-
|
60
|
-
# nop
|
61
|
-
end
|
64
|
+
ensure_obj_class_exists
|
62
65
|
|
63
|
-
def create_object
|
64
66
|
# bottom one is faster, but can only work when there are no widgets and no uploads
|
65
|
-
if (@widget_pool && !@widget_pool.empty?) || (@values.any? {|_, v| v.kind_of?(File) || v.kind_of?(ActionDispatch::Http::UploadedFile) } )
|
66
|
-
@obj = WriteObj.create!(name: @name, parent_obj_id: @parent.id, obj_class: @
|
67
|
+
if (@widget_pool && !@widget_pool.empty?) || (@values.any? {|_, (_, v)| v.kind_of?(File) || v.kind_of?(ActionDispatch::Http::UploadedFile) } )
|
68
|
+
@obj = WriteObj.create!(name: @name, parent_obj_id: @parent.id, obj_class: @real_obj_class)
|
67
69
|
else
|
68
|
-
@obj = WriteObj.
|
70
|
+
@obj = WriteObj.create!(name: @name, parent_obj_id: @parent.id, obj_class: @real_obj_class)
|
69
71
|
end
|
70
72
|
end
|
71
73
|
|
72
74
|
def write_widget_pool
|
73
|
-
resolver = WidgetResolver.new(@obj[
|
75
|
+
resolver = WidgetResolver.new(@obj.attr_values["X_widget_pool"]||[], WriteObj)
|
74
76
|
|
75
77
|
@id_map = resolver.id_map
|
76
78
|
@widget_path_map = resolver.path_map
|
@@ -83,25 +85,45 @@ module Fiona7
|
|
83
85
|
if @widgets.pool_changed?
|
84
86
|
# after widget writing this either has new widgets
|
85
87
|
# or some widgets have been removed
|
86
|
-
|
87
|
-
|
88
|
+
|
89
|
+
@new_widget_pool = @widget_pool.map do |widget_id, definition|
|
90
|
+
# widget deleted
|
91
|
+
next if definition.nil?
|
92
|
+
{title: widget_id, destination_object: @widget_path_map[widget_id]}
|
93
|
+
end.compact
|
94
|
+
|
95
|
+
# newly added widgets
|
96
|
+
@widget_path_map.each do |widget_id, path|
|
97
|
+
next if !@widget_pool[widget_id].nil?
|
98
|
+
@new_widget_pool << {title: widget_id, destination_object: path}
|
88
99
|
end
|
100
|
+
|
89
101
|
end
|
90
102
|
end
|
91
103
|
end
|
92
104
|
|
93
105
|
def store_attributes
|
94
|
-
if @obj.obj_class != @
|
95
|
-
@obj.obj_class = @
|
106
|
+
if @obj.obj_class != @real_obj_class
|
107
|
+
@obj.obj_class = @real_obj_class
|
96
108
|
@obj.save!
|
97
109
|
@obj.reload
|
98
110
|
end
|
99
|
-
# TODO: reload into singleton class
|
100
111
|
@obj.send(:reload_attributes)
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
112
|
+
type_definition = Fiona7::TypeRegister.instance.write(@obj_class)
|
113
|
+
if type_definition.nil?
|
114
|
+
raise "Definition not found for #{@obj_class}"
|
115
|
+
end
|
116
|
+
@values.each do |attribute_name, possible_pair|
|
117
|
+
(claimed_type, value) = *possible_pair
|
118
|
+
attribute = type_definition.find_attribute(attribute_name)
|
119
|
+
if attribute.nil?
|
120
|
+
debugger
|
121
|
+
raise "Attribute #{attribute_name} not found in #{@obj_class}"
|
122
|
+
end
|
123
|
+
|
124
|
+
virtual_name = attribute.name.to_sym
|
125
|
+
attribute_name = real_name = attribute.real_name.to_sym
|
126
|
+
virtual_type = attribute.type.to_sym
|
105
127
|
|
106
128
|
case virtual_type
|
107
129
|
when :linklist
|
@@ -162,38 +184,64 @@ module Fiona7
|
|
162
184
|
if ids.empty?
|
163
185
|
@obj.set(attribute_name.to_s, [])
|
164
186
|
else
|
165
|
-
objects_map = Hash[WriteObj.where(obj_id: ids).map {|o| [o.id, o]}]
|
187
|
+
objects_map = Hash[WriteObj.where(obj_id: ids).map {|o| [o.id.to_s, o]}]
|
166
188
|
objects = ids.map {|id| objects_map[id] }.compact
|
167
189
|
@obj.set(attribute_name, objects)
|
168
190
|
end
|
169
|
-
when :
|
191
|
+
when :widgetlist
|
170
192
|
links = []
|
171
|
-
value
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
193
|
+
if value.kind_of?(Array)
|
194
|
+
(value || []).each do |widget_id|
|
195
|
+
if (path=@widget_path_map[widget_id]||@widget_path_map[widget_id.to_s])
|
196
|
+
links << {destination_object: path, title: widget_id}
|
197
|
+
else
|
198
|
+
raise Scrivito::ScrivitoError, "Inconsistent widget pool state detected, unable to store widgets (unable to find #{widget_id} in #{@widget_path_map.inspect})"
|
199
|
+
end
|
200
|
+
end
|
201
|
+
elsif value.kind_of?(Hash)
|
202
|
+
# stupid shits could not use one consistent format
|
203
|
+
(value || {})["list"].each do |crap|
|
204
|
+
widget_id = crap["widget"]
|
205
|
+
if (path=@widget_path_map[widget_id]||@widget_path_map[widget_id.to_s])
|
206
|
+
links << {destination_object: path, title: widget_id}
|
207
|
+
else
|
208
|
+
raise Scrivito::ScrivitoError, "Inconsistent widget pool state detected, unable to store widgets (unable to find #{widget_id} in #{@widget_path_map.inspect})"
|
209
|
+
end
|
179
210
|
end
|
180
211
|
end
|
181
212
|
@obj.set(attribute_name.to_s, links)
|
182
213
|
when :text, :string, :enum, :multienum, :date
|
214
|
+
#if value.nil? && value != @obj[attribute_name]
|
183
215
|
@obj.set(attribute_name.to_s, value)
|
216
|
+
#end
|
217
|
+
when :stringlist
|
218
|
+
@obj.set(attribute_name.to_s, value.to_json)
|
184
219
|
when :html
|
185
220
|
converted_links = LinkConverter::ScrivitoToFiona.new(WriteObj, value.to_s).convert
|
186
221
|
@obj.set(attribute_name.to_s, converted_links)
|
187
222
|
when :binary
|
188
223
|
if value.kind_of?(String)
|
189
224
|
# NOTE: this code path has not been tested yet.
|
190
|
-
target = {title: value, destination_object:
|
225
|
+
target = {title: value, destination_object: InternalReleasedObj.find(value.to_i)}
|
191
226
|
@obj.set(attribute_name.to_s, target)
|
192
227
|
elsif value.kind_of?(File)
|
193
|
-
|
228
|
+
if !Fiona7.mode == :legacy || attribute_name.to_s != "blob"
|
229
|
+
@obj.set(attribute_name.to_s, upload_file(value))
|
230
|
+
else
|
231
|
+
special_upload_handling(attribute_name, value)
|
232
|
+
end
|
194
233
|
elsif value.kind_of?(ActionDispatch::Http::UploadedFile)
|
195
|
-
|
234
|
+
if !Fiona7.mode == :legacy || attribute_name.to_s != "blob"
|
235
|
+
@obj.set(attribute_name.to_s, upload_file(value))
|
236
|
+
else
|
237
|
+
special_upload_uploaded_handling(attribute_name, value)
|
238
|
+
end
|
196
239
|
elsif value.nil?
|
240
|
+
@obj.set(attribute_name.to_s, [])
|
241
|
+
elsif value.kind_of?(Hash)
|
242
|
+
#TODO: legacy mode!
|
243
|
+
target = {title: value["id"], destination_object: InternalReleasedObj.find(value["id"].to_i)}
|
244
|
+
@obj.set(attribute_name.to_s, target)
|
197
245
|
else
|
198
246
|
raise Scrivito::ClientError.new("Invalid input for binary field", 422)
|
199
247
|
end
|
@@ -203,11 +251,37 @@ module Fiona7
|
|
203
251
|
end
|
204
252
|
@obj.set(:X_widget_pool, @new_widget_pool) if @new_widget_pool
|
205
253
|
@obj.set(:permalink, @permalink) if @permalink
|
254
|
+
|
206
255
|
@obj.save!
|
207
256
|
|
208
|
-
|
257
|
+
#if !@values.empty? || !@new_widget_pool.nil?
|
258
|
+
@obj.edit! unless @obj.really_edited?
|
259
|
+
#end
|
260
|
+
end
|
261
|
+
|
262
|
+
def special_upload_handling(attribute_name, file)
|
263
|
+
if !@obj.binary?
|
264
|
+
# standard handling!
|
265
|
+
@obj.set(attribute_name.to_s, upload_file(file))
|
266
|
+
else
|
267
|
+
ext = ::File.extname(file.path).to_s[1..-1]
|
268
|
+
@obj.upload(file, ext)
|
269
|
+
end
|
209
270
|
end
|
210
271
|
|
272
|
+
def special_upload_uploaded_handling(attribute_name, file)
|
273
|
+
if !@obj.binary?
|
274
|
+
# standard handling!
|
275
|
+
@obj.set(attribute_name.to_s, upload_uploaded_file(file))
|
276
|
+
else
|
277
|
+
ext = ::File.extname(file.original_filename).to_s[1..-1]
|
278
|
+
@obj.upload(file.open, ext)
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
|
283
|
+
|
284
|
+
|
211
285
|
def upload_file(file)
|
212
286
|
# only publication type can contain children (code = "5")
|
213
287
|
# also handle / this way
|
@@ -290,7 +364,21 @@ module Fiona7
|
|
290
364
|
end
|
291
365
|
end
|
292
366
|
|
293
|
-
WriteObj.find_by_path(original)
|
367
|
+
WriteObj.find_by_path(original) || (raise "Tried to make sure that the parent under '#{original}' exist, but it does not :(")
|
368
|
+
end
|
369
|
+
|
370
|
+
def generate_orphaned_path
|
371
|
+
return nil if update?
|
372
|
+
"_orphaned/#{SecureRandom.hex(16)}"
|
373
|
+
end
|
374
|
+
|
375
|
+
def ensure_obj_class_exists
|
376
|
+
values = @values.with_indifferent_access
|
377
|
+
obj_class = @obj_class
|
378
|
+
|
379
|
+
Fiona7::TypeRegister.instance.ad_hoc_synchronize(
|
380
|
+
Fiona7::TypeRegister::AdHocTypeDefinition.new(values, obj_class).type_definition
|
381
|
+
)
|
294
382
|
end
|
295
383
|
end
|
296
384
|
end
|