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.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/fiona7.js +1 -282
  3. data/app/assets/javascripts/fiona7_ui.js +335 -0
  4. data/app/assets/stylesheets/fiona7.css.scss +4 -36
  5. data/app/assets/stylesheets/fiona7_ui.css.scss +39 -0
  6. data/app/controllers/fiona7/blobs_controller.rb +13 -23
  7. data/app/controllers/fiona7/release_controller.rb +1 -0
  8. data/app/controllers/fiona7/sessions_controller.rb +3 -5
  9. data/app/helpers/fiona7_override_helper.rb +6 -2
  10. data/app/models/fiona7/edited_obj.rb +6 -1
  11. data/app/models/fiona7/released_obj.rb +11 -3
  12. data/app/models/fiona7/write_obj.rb +18 -3
  13. data/app/models/fiona7_login_page.rb +3 -0
  14. data/app/views/scrivito/ui/index.html.erb +16 -0
  15. data/config/routes.rb +2 -0
  16. data/infopark_fiona7.gemspec +6 -4
  17. data/lib/fiona7/builder/batch_widget_writer.rb +7 -3
  18. data/lib/fiona7/builder/obj_builder.rb +130 -42
  19. data/lib/fiona7/builder/obj_class_builder.rb +3 -59
  20. data/lib/fiona7/builder/obj_class_updater.rb +7 -44
  21. data/lib/fiona7/builder/obj_updater.rb +25 -7
  22. data/lib/fiona7/builder/widget_builder.rb +24 -0
  23. data/lib/fiona7/builder/widget_building.rb +2 -7
  24. data/lib/fiona7/builder/widget_updater.rb +21 -0
  25. data/lib/fiona7/controllers/content_service/obj_controller.rb +16 -25
  26. data/lib/fiona7/controllers/rest_api/blob_controller.rb +41 -2
  27. data/lib/fiona7/controllers/rest_api/obj_controller.rb +19 -7
  28. data/lib/fiona7/controllers/rest_api/workspace_controller.rb +1 -1
  29. data/lib/fiona7/engine.rb +58 -7
  30. data/lib/fiona7/fiona_connector_patches/basic_obj.rb +46 -0
  31. data/lib/fiona7/initializer.rb +15 -11
  32. data/lib/fiona7/json/obj_decorator.rb +53 -31
  33. data/lib/fiona7/json/reverse_obj_decorator.rb +36 -0
  34. data/lib/fiona7/json/widget_decorator.rb +3 -1
  35. data/lib/fiona7/link_converter/fiona_to_scrivito.rb +45 -13
  36. data/lib/fiona7/link_converter/scrivito_to_fiona.rb +1 -1
  37. data/lib/fiona7/middleware/server_detection_middleware.rb +27 -0
  38. data/lib/fiona7/middleware/table_switching_middleware.rb +33 -0
  39. data/lib/fiona7/mode_switch/cms_routes/scrivito_sdk.rb +5 -11
  40. data/lib/fiona7/mode_switch/composite.rb +2 -4
  41. data/lib/fiona7/naive_search_engine.rb +66 -16
  42. data/lib/fiona7/routers/rest_api.rb +50 -45
  43. data/lib/fiona7/routing_monkey_patch.rb +5 -3
  44. data/lib/fiona7/scrivito_patches/attribute_content.rb +9 -10
  45. data/lib/fiona7/scrivito_patches/attribute_serializer.rb +15 -0
  46. data/lib/fiona7/scrivito_patches/basic_obj.rb +25 -19
  47. data/lib/fiona7/scrivito_patches/basic_widget.rb +4 -0
  48. data/lib/fiona7/scrivito_patches/binary.rb +452 -33
  49. data/lib/fiona7/scrivito_patches/client_config.rb +0 -19
  50. data/lib/fiona7/scrivito_patches/cms_backend.rb +48 -0
  51. data/lib/fiona7/scrivito_patches/cms_field_tag.rb +19 -0
  52. data/lib/fiona7/scrivito_patches/cms_rest_api.rb +20 -3
  53. data/lib/fiona7/scrivito_patches/cms_routing.rb +20 -34
  54. data/lib/fiona7/scrivito_patches/controller_actions.rb +0 -8
  55. data/lib/fiona7/scrivito_patches/migrator.rb +4 -0
  56. data/lib/fiona7/scrivito_patches/objs_controller.rb +18 -0
  57. data/lib/fiona7/scrivito_patches/type_computer.rb +12 -12
  58. data/lib/fiona7/scrivito_patches/webservice_controller.rb +21 -0
  59. data/lib/fiona7/scrivito_patches/workspace.rb +8 -5
  60. data/lib/fiona7/shadow_classes.rb +74 -0
  61. data/lib/fiona7/table_switcher.rb +39 -0
  62. data/lib/fiona7/type_loader.rb +63 -0
  63. data/lib/fiona7/type_register.rb +170 -89
  64. data/lib/fiona7/type_synchronizer.rb +68 -0
  65. data/lib/fiona7/version.rb +1 -1
  66. data/lib/fiona7/version_helper.rb +35 -54
  67. data/lib/fiona7/widget_resolver.rb +1 -1
  68. data/lib/tasks/fiona7_tasks.rake +0 -8
  69. metadata +57 -18
  70. data/lib/fiona7/controllers/rest_api/obj_class_controller.rb +0 -39
  71. data/lib/fiona7/json/obj_class_decorator.rb +0 -45
  72. data/lib/fiona7/mode_switch/constants.rb +0 -86
  73. data/lib/fiona7/type_register_mixin.rb +0 -9
@@ -34,7 +34,7 @@ module Fiona7
34
34
 
35
35
  def create(values)
36
36
  id = (values[:workspace][:id] || values[:workspace]["id"])
37
- id = id.to_sym
37
+ id = (id || :no_id_provided).to_sym
38
38
  Assert.constraint(
39
39
  id == :rtc,
40
40
  "Only rtc workspace can be created"
data/lib/fiona7/engine.rb CHANGED
@@ -15,29 +15,56 @@ require "infopark_reactor"
15
15
 
16
16
  require "fiona7/mode_switch"
17
17
  require "fiona7/scrivito_patches/attribute_content"
18
+ require "fiona7/scrivito_patches/attribute_serializer"
18
19
  require "fiona7/scrivito_patches/basic_obj"
19
20
  require "fiona7/scrivito_patches/basic_widget"
20
21
  require "fiona7/scrivito_patches/binary"
21
- require "fiona7/scrivito_patches/client_config"
22
+ require "fiona7/scrivito_patches/cms_backend"
23
+ require "fiona7/scrivito_patches/cms_field_tag"
22
24
  require "fiona7/scrivito_patches/controller_actions"
23
- require "fiona7/scrivito_patches/cms_dispatch_controller"
25
+ # different load order !!
26
+ #require "fiona7/scrivito_patches/cms_dispatch_controller"
24
27
  require "fiona7/scrivito_patches/cms_rest_api"
25
28
  require "fiona7/scrivito_patches/cms_routing"
26
29
  require "fiona7/scrivito_patches/link_parser"
27
- require "fiona7/scrivito_patches/obj_class"
28
30
  require "fiona7/scrivito_patches/migrator"
29
31
  require "fiona7/scrivito_patches/type_computer"
30
32
  require "fiona7/scrivito_patches/workspace"
31
33
 
34
+ require "fiona7/middleware/table_switching_middleware"
35
+ require "fiona7/middleware/server_detection_middleware"
36
+
37
+ module Scrivito
38
+ class LogSubscriber < ActiveSupport::LogSubscriber
39
+ def backend_request(event)
40
+ self.class.runtime += event.duration
41
+ return unless logger.debug?
42
+
43
+ duration = '(%.1fms)' % [event.duration]
44
+
45
+ param = event.payload[:params]
46
+ param_text = " #{param}" if param
47
+
48
+ verb_text = event.payload[:verb].upcase
49
+ path_text = event.payload[:path]
50
+
51
+ debug " Fiona7 #{verb_text} #{path_text}#{param_text} #{duration}"
52
+ end
53
+ end
54
+ end
55
+
32
56
 
33
57
  require "fiona7/routers/content_service"
34
58
  require "fiona7/routers/rest_api"
35
59
 
36
60
  require 'fiona7/scrivito_user'
37
61
 
62
+ require 'fiona7/type_synchronizer'
63
+
38
64
  module Fiona7
39
65
  mattr_accessor :mode
40
66
  mattr_accessor :login
67
+ mattr_accessor :root
41
68
 
42
69
  class Config < Struct.new("Config", :mode, :instance, :host, :port, :username, :secret, :root_mode)
43
70
  end
@@ -54,6 +81,8 @@ module Fiona7
54
81
  secret: config.secret
55
82
  }
56
83
 
84
+ Fiona7.root = config.username
85
+
57
86
  Fiona7.mode = config.mode
58
87
  if Fiona7.login = !config.root_mode
59
88
  Scrivito.configure do |config|
@@ -84,6 +113,13 @@ module Fiona7
84
113
 
85
114
  class Engine < ::Rails::Engine
86
115
 
116
+ config.to_prepare do
117
+ # TODO: do some smart optimizations
118
+ require "fiona7/initializer"
119
+ initializer = Fiona7::Initializer.new
120
+ initializer.initialize_system
121
+ end
122
+
87
123
  initializer "fiona7.mode_switch" do |app|
88
124
  mode = nil
89
125
 
@@ -95,6 +131,10 @@ module Fiona7
95
131
  raise "Invalid mode: #{Fiona7.mode}. Valid modes are :legacy and :standalone. Please refer to the documentation for more information"
96
132
  end
97
133
 
134
+ # delayed init, patching sooner breaks AR
135
+ # later and it breaks Obj
136
+ require "fiona7/fiona_connector_patches/basic_obj"
137
+
98
138
  ModeSwitch::Composite.new(app).public_send(mode)
99
139
  end
100
140
 
@@ -115,24 +155,35 @@ module Fiona7
115
155
  end
116
156
 
117
157
  initializer "fiona7.authorize_reactor" do |app|
158
+
118
159
  ActionController::Base.__send__(:define_method, :rsession_auth) do
119
160
  if !Fiona7.login
120
- rsession.user_name = 'root' unless rsession.user_name == 'root'
161
+ rsession.user_name = Fiona7.root unless rsession.user_name == Fiona7.root
121
162
  end
122
163
  end
123
164
  end
124
165
 
125
166
  initializer "fiona7.patch_assets" do |app|
126
- app.config.assets.precompile += %w(fiona7.css fiona7.js fiona7-login.css)
167
+ app.config.assets.precompile += %w(fiona7_ui.css fiona7_ui.js fiona7.css fiona7.js fiona7-login.css)
127
168
  end
128
169
 
129
170
  initializer "fiona7.runtime_patches" do |app|
130
- # delayed init, patching sooner breaks AR
131
- require "fiona7/fiona_connector_patches/basic_obj"
171
+ require "fiona7/scrivito_patches/cms_dispatch_controller"
172
+ require "fiona7/scrivito_patches/webservice_controller"
173
+ require "fiona7/scrivito_patches/objs_controller"
132
174
  end
133
175
 
176
+ initializer "fiona7.preload_cms_type_defs" do |app|
177
+ type_register = Fiona7::TypeRegister.instance
178
+ RailsConnector::Meta::EagerLoader.instance.obj_classes.each do |_, obj_class|
179
+ type_register.read_mangled(obj_class.name)
180
+ end
181
+
182
+ end
134
183
  # This ensures that reactor is loaded in the app
135
184
  config.after_initialize { Fiona7::WriteObj }
136
185
 
186
+ config.app_middleware.use "Fiona7::Middleware::TableSwitchingMiddleware"
187
+ config.app_middleware.use "Fiona7::Middleware::ServerDetectionMiddleware"
137
188
  end
138
189
  end
@@ -1,9 +1,55 @@
1
1
  require 'rails_connector/basic_obj'
2
+ require 'fiona7/shadow_classes'
2
3
 
3
4
  module RailsConnector
4
5
  class BasicObj
5
6
  def scrivito_obj
6
7
  Scrivito::Obj.find(self.id)
7
8
  end
9
+
10
+ # never use cached permissions
11
+ def permissions
12
+ arel_permissions
13
+ end
14
+
15
+ def self.in_place(type='Obj',&block)
16
+ klass = ShadowClasses.fetch(self.name,type)
17
+ klass.class_eval(&block)
18
+ klass
19
+ end
20
+
21
+ def self.widget_class
22
+ self.shadow_class
23
+ end
24
+
25
+ def self.model_class
26
+ self.shadow_class
27
+ end
28
+
29
+ def self.shadow_class
30
+ ShadowClasses.const_get(self.name, false)
31
+ end
32
+
33
+
34
+ class << self
35
+
36
+ def inherited(subclass,*args)
37
+ super
38
+ if subclass.name == 'Obj' && !::Scrivito.const_defined?('Obj', false)
39
+ ::Scrivito.const_set('Obj', Class.new(::Scrivito::BasicObj))
40
+ end
41
+ end
42
+ end
43
+
44
+ end
45
+ end
46
+
47
+ module Reactor
48
+ module Persistence
49
+ module ClassMethods
50
+ def sanitize_name(old_name)
51
+ old_name
52
+ end
53
+ end
8
54
  end
9
55
  end
@@ -10,6 +10,15 @@ module Fiona7
10
10
  'X_widget_pool' => 'linklist'
11
11
  }
12
12
 
13
+ def initialize_system
14
+ should_run = self.sanity_check
15
+ return unless should_run
16
+
17
+ self.classes_and_attributes
18
+ self.set_valid_sub_obj_classes
19
+ self.create_login_page
20
+ end
21
+
13
22
  def sanity_check
14
23
  any_class_present = false
15
24
  classes_present = CLASSES_MAP.all? do |name, type|
@@ -17,7 +26,8 @@ module Fiona7
17
26
  any_class_present ||= obj_class && obj_class.obj_type == type
18
27
  end
19
28
 
20
- classes_present && raise("Initialization has already been performed, there is not need to perform it again.")
29
+ return false if classes_present
30
+
21
31
  any_class_present && raise("Misconfiguration of obj classes detected")
22
32
 
23
33
  any_attribute_present = false
@@ -27,6 +37,8 @@ module Fiona7
27
37
  end
28
38
 
29
39
  any_class_present && raise("Misconfiguration of attributes detected")
40
+
41
+ return true
30
42
  end
31
43
 
32
44
  def classes_and_attributes
@@ -54,17 +66,9 @@ module Fiona7
54
66
  end
55
67
 
56
68
  def create_login_page
69
+ # TODO: write new creation procedure
57
70
  Scrivito::Workspace.current = Scrivito::Workspace.find('rtc')
58
- Scrivito::ObjClass.create(
59
- name: 'Fiona7LoginPage',
60
- title: 'Login Page',
61
- attributes: [
62
- {name: "title", type: "string"},
63
- {name: "body", type: "html"}
64
- ]
65
- )
66
- Scrivito::Obj.create(_obj_class: 'Fiona7LoginPage', _path: '/_global/login_page', title: 'Log in')
67
- Scrivito::ObjClass.find('Fiona7LoginPage').update(is_active: false)
71
+ Scrivito::BasicObj.create(_obj_class: 'Fiona7LoginPage', _path: '/_global/login_page', title: 'Log in')
68
72
  end
69
73
 
70
74
  protected
@@ -6,7 +6,6 @@ module Fiona7
6
6
  end
7
7
 
8
8
  require 'fiona7/assert'
9
- require 'fiona7/type_register_mixin'
10
9
  require 'fiona7/link_converter/fiona_to_scrivito'
11
10
  require 'fiona7/json/widget_decorator'
12
11
  require 'fiona7/widget_resolver'
@@ -14,8 +13,6 @@ require 'fiona7/widget_resolver'
14
13
  module Fiona7
15
14
  module JSON
16
15
  class ObjDecorator
17
- include TypeRegisterMixin
18
-
19
16
  def initialize(klass, obj)
20
17
  @klass = klass
21
18
  @obj = obj
@@ -34,43 +31,59 @@ module Fiona7
34
31
  protected
35
32
  def standard_attrs
36
33
  attrs = {
37
- _id: [@obj.id],
38
- _path: [@obj.path],
39
- _obj_class: [@obj.obj_class],
34
+ _id: [@obj.id.to_s],
35
+ _obj_class: [@obj.obj_class.gsub("__", "::")],
40
36
  _last_changed: [@obj.last_changed.try(:to_iso)],
41
37
  _widget_pool: [{}]
42
38
  }
39
+ if !@obj.edited? && !@obj.released?
40
+ attrs[:_modification] = "new"
41
+ elsif @obj.edited? && !@obj.released?
42
+ attrs[:_modification] = "new"
43
+ elsif @obj.edited? && @obj.released?
44
+ attrs[:_modification] = "edited"
45
+ end
46
+
47
+ attrs[:_path] = [@obj.path] unless @obj.path =~ /^\/_orphaned/
43
48
  attrs[:_permalink] = [@obj.permalink] if @obj.permalink.present?
44
49
  attrs
45
50
  end
46
51
 
47
52
  def add_custom_attributes(attrs, *args)
48
- type_register.annotated_attributes(@obj.obj_class).each do |attribute|
49
- virtual_attribute_name = attribute.virtual_name
53
+ type_definition = Fiona7::TypeRegister.instance.read_mangled(@obj.obj_class)
54
+ type_definition.attrs.each do |attribute|
55
+ virtual_attribute_name = attribute.name
50
56
  real_attribute_name = attribute.real_name
51
- virtual_attribute_type = attribute.virtual_type
57
+ virtual_attribute_type = attribute.type.to_sym
52
58
 
53
59
  val = case virtual_attribute_type
54
60
  when :link
55
- deserialize_link(@obj[real_attribute_name].try(:first))
61
+ deserialize_link(@obj.attr_values[real_attribute_name].try(:first))
56
62
  when :linklist
57
- (@obj[real_attribute_name] || []).map {|link| deserialize_link(link) }
63
+ (@obj.attr_values[real_attribute_name] || []).map {|link| deserialize_link(link) }
58
64
  when :multienum
59
65
  @obj[real_attribute_name] || []
60
66
  when :reference
61
- deserialize_reference(@obj[real_attribute_name].try(:first))
67
+ deserialize_reference(@obj.attr_values[real_attribute_name].try(:first))
62
68
  when :referencelist
63
- (@obj[real_attribute_name] || []).map {|link| deserialize_reference(link) }.compact
69
+ (@obj.attr_values[real_attribute_name] || []).map {|link| deserialize_reference(link) }.compact
64
70
  when :date
65
71
  @obj[real_attribute_name].try(:to_iso)
66
- when :widget
67
- deserialize_widget_field(@obj[real_attribute_name] || [])
72
+ when :widgetlist
73
+ deserialize_widget_field(@obj.attr_values[real_attribute_name] || [])
68
74
  when :html
69
75
  deserialize_html(@obj[real_attribute_name])
70
76
  when :binary
71
- deserialize_binary(@obj[real_attribute_name].try(:first))
77
+ if !Fiona7.mode == :legacy || !@obj.binary?
78
+ deserialize_binary(@obj.attr_values[real_attribute_name].try(:first))
79
+ else
80
+ {id: "%032d" % @obj.id.to_s}
81
+ end
72
82
  when :enum, :multienum, :text, :string
73
83
  @obj[real_attribute_name]
84
+ when :stringlist
85
+ # TODO: get rid of this rescue nil
86
+ ::JSON.parse(@obj[real_attribute_name]) rescue nil
74
87
  else
75
88
  Assert.success(
76
89
  false,
@@ -84,35 +97,44 @@ module Fiona7
84
97
 
85
98
  def deserialize_link(link)
86
99
  if link
87
- {
100
+ deserialized = {
88
101
  # remove possible external prefix for protcol-less urls
89
- url: link.url.try(:gsub, /\Aexternal:/, ''),
90
- title: link.title,
91
- target: link.target,
102
+ url: link["url"].try(:gsub, /\Aexternal:/, ''),
103
+ title: link["title"],
104
+ target: link["target"],
92
105
  # content service uses destination
93
- destination: link.destination_object_id,
106
+ destination: link["destination"].to_s,
94
107
  # rest api uses obj_id
95
- obj_id: link.destination_object_id,
96
- query: link.query,
97
- fragment: link.fragment
108
+ obj_id: link["destination"].to_s,
109
+ query: link["search"],
110
+ fragment: link["fragment"]
98
111
  }
112
+
113
+ # TODO: refactor this code
114
+ if deserialized[:url].present?
115
+ deserialized.delete(:destination)
116
+ deserialized.delete(:obj_id)
117
+ end
118
+
119
+ deserialized
99
120
  end
100
121
  end
101
122
 
102
123
  def deserialize_reference(link)
103
- if link && link.internal?
104
- link.destination_object_id
124
+ if link && link["type"] == "internal"
125
+ link["destination"].to_s
105
126
  end
106
127
  end
107
128
 
108
129
  def deserialize_widget_field(linklist)
109
130
  if !linklist.empty?
131
+ widget_ids = []
110
132
  widgets = linklist.map do |link|
111
- widget_id = link.title
112
- {widget: widget_id}
133
+ widget_id = link["title"]
134
+ widget_ids << widget_id
113
135
  end
114
136
 
115
- {list: widgets}
137
+ widget_ids
116
138
  end
117
139
  end
118
140
 
@@ -122,7 +144,7 @@ module Fiona7
122
144
 
123
145
  def deserialize_binary(link)
124
146
  if link
125
- binary_id = link.title
147
+ binary_id = link["title"]
126
148
  if binary_id.length == 32 && binary_id =~ /0{16,}0*[0-9]+/
127
149
  {id: binary_id}
128
150
  end
@@ -130,7 +152,7 @@ module Fiona7
130
152
  end
131
153
 
132
154
  def replace_widget_pool(attrs, *args)
133
- if (widget_links = @obj[:X_widget_pool])
155
+ if (widget_links = @obj.attr_values["X_widget_pool"])
134
156
 
135
157
  resolver = WidgetResolver.new(widget_links, @klass)
136
158
 
@@ -0,0 +1,36 @@
1
+ module Fiona7
2
+ module JSON
3
+ class ReverseObjDecorator < ObjDecorator
4
+ def as_json(*args)
5
+ with_types = super()
6
+ reverse_types = {}
7
+
8
+ with_types.each do |attr, (value, type)|
9
+ if type.nil?
10
+ reverse_types[attr] = value
11
+ else
12
+ reverse_types[attr] = [type, value]
13
+ end
14
+ end
15
+
16
+ if reverse_types[:_widget_pool] && !reverse_types[:_widget_pool].empty?
17
+ widgets_reverse_types = reverse_types[:_widget_pool].map do |id, values|
18
+ reversed_values = {}
19
+ values.each do |attr, (value, type)|
20
+ if type.nil?
21
+ reversed_values[attr] = value
22
+ else
23
+ reversed_values[attr] = [type, value]
24
+ end
25
+ end
26
+ [id, reversed_values]
27
+ end
28
+
29
+ reverse_types[:_widget_pool] = Hash[widgets_reverse_types]
30
+ end
31
+
32
+ reverse_types.as_json(*args)
33
+ end
34
+ end
35
+ end
36
+ end