infopark_fiona7 0.71.1.12 → 1.1.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 +67 -0
- data/app/assets/stylesheets/fiona7_ui.css.scss +29 -0
- data/app/controllers/fiona7/release_controller.rb +37 -75
- data/app/controllers/scrivito/cms_dispatch_controller.rb +2 -12
- data/app/controllers/scrivito/objs_controller.rb +41 -13
- data/app/controllers/scrivito/webservice_controller.rb +4 -3
- data/app/views/fiona7/release/preview.html.erb +73 -0
- data/config/routes.rb +3 -1
- data/infopark_fiona7.gemspec +1 -1
- data/lib/fiona7/assert.rb +4 -0
- data/lib/fiona7/attribute_name_mangler.rb +19 -0
- data/lib/fiona7/attribute_names_from_cms.rb +17 -0
- data/lib/fiona7/attribute_names_from_queries.rb +17 -0
- data/lib/fiona7/builder/obj_builder.rb +3 -2
- data/lib/fiona7/builder/obj_updater.rb +2 -2
- data/lib/fiona7/builder/widget_builder.rb +1 -1
- data/lib/fiona7/builder/widget_updater.rb +2 -2
- data/lib/fiona7/complex_object.rb +24 -0
- data/lib/fiona7/controllers/rest_api/obj_controller.rb +96 -24
- data/lib/fiona7/controllers/rest_api/workspace_controller.rb +23 -2
- data/lib/fiona7/engine.rb +11 -23
- data/lib/fiona7/facet_builder.rb +136 -0
- data/lib/fiona7/json/reverse_obj_decorator.rb +2 -0
- data/lib/fiona7/mode_switch/cms_routes/scrivito_sdk.rb +68 -10
- data/lib/fiona7/mode_switch/cms_routes/scrivito_sdk_slave.rb +66 -14
- data/lib/fiona7/mode_switch/views.rb +2 -2
- data/lib/fiona7/naive_search_engine.rb +40 -5
- data/lib/fiona7/obj_class_name_demangler.rb +11 -0
- data/lib/fiona7/obj_class_name_mangler.rb +11 -0
- data/lib/fiona7/obj_classes_from_cms.rb +14 -0
- data/lib/fiona7/obj_classes_from_queries.rb +11 -0
- data/lib/fiona7/recursive_object_finder.rb +149 -0
- data/lib/fiona7/routers/rest_api.rb +14 -1
- data/lib/fiona7/routing_monkey_patch.rb +5 -2
- data/lib/fiona7/scrivito_patches/attribute_serializer.rb +1 -1
- data/lib/fiona7/scrivito_patches/basic_obj.rb +4 -9
- data/lib/fiona7/scrivito_patches/basic_widget.rb +0 -9
- data/lib/fiona7/scrivito_patches/cms_backend.rb +11 -16
- data/lib/fiona7/scrivito_patches/cms_rest_api.rb +1 -1
- data/lib/fiona7/scrivito_patches/cms_routing.rb +50 -33
- data/lib/fiona7/scrivito_patches/link_parser.rb +6 -13
- data/lib/fiona7/scrivito_patches/log_subscriber.rb +18 -0
- data/lib/fiona7/scrivito_patches/preset_routes.rb +47 -0
- data/lib/fiona7/scrivito_patches/routing_extensions.rb +48 -0
- data/lib/fiona7/search_engine.rb +4 -0
- data/lib/fiona7/type_loader.rb +5 -4
- data/lib/fiona7/type_register.rb +13 -27
- data/lib/fiona7/type_synchronizer.rb +8 -6
- data/lib/fiona7/verity_search_engine.rb +77 -30
- data/lib/fiona7/version.rb +1 -1
- metadata +18 -13
- data/app/models/rails_connector/abstract_obj.rb +0 -24
- data/lib/fiona7/controllers/content_service/obj_controller.rb +0 -121
- data/lib/fiona7/controllers/content_service/workspace_controller.rb +0 -19
- data/lib/fiona7/recursive_link_resolver.rb +0 -93
- data/lib/fiona7/routers/content_service.rb +0 -19
- data/lib/fiona7/scrivito_patches/client_config.rb +0 -0
- data/lib/fiona7/scrivito_patches/controller_actions.rb +0 -6
- data/lib/fiona7/scrivito_patches/obj_class.rb +0 -16
- data/lib/fiona7/scrivito_patches/obj_data_from_rest.rb +0 -30
@@ -0,0 +1,136 @@
|
|
1
|
+
require "fiona7/verity_search_engine"
|
2
|
+
|
3
|
+
module Fiona7
|
4
|
+
class FacetBuilder
|
5
|
+
def initialize(facet_params, query, klass)
|
6
|
+
@query = query
|
7
|
+
@klass = klass
|
8
|
+
|
9
|
+
@attribute = facet_params[:attribute]
|
10
|
+
|
11
|
+
@limit = [facet_params[:limit] || 20, 100].min # default = 20, limit <= 100
|
12
|
+
@fake_limit = 100
|
13
|
+
@include_objs = facet_params[:include_objs] || false
|
14
|
+
|
15
|
+
@known_values = Set.new
|
16
|
+
@facets = []
|
17
|
+
@next_facets = []
|
18
|
+
end
|
19
|
+
|
20
|
+
def build
|
21
|
+
@facets << fetch_more_facets until limit_reached or !more_facets_available
|
22
|
+
|
23
|
+
# adjust totals
|
24
|
+
for index in 0.upto(@facets.length-2)
|
25
|
+
next_facet_total = @facets[index+1].first[:total] rescue 0
|
26
|
+
@facets[index].each do |facet|
|
27
|
+
facet[:total] -= next_facet_total
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# flatten
|
32
|
+
@facets.flatten!
|
33
|
+
|
34
|
+
# sort
|
35
|
+
@facets.sort_by! {|f| f[:total] }.reverse!
|
36
|
+
|
37
|
+
# delete superfluous elements
|
38
|
+
@facets.slice!(@limit, @facets.length)
|
39
|
+
|
40
|
+
# add included objs
|
41
|
+
if @include_objs
|
42
|
+
@facets.each do |facet|
|
43
|
+
include_objs_query = @query.dup
|
44
|
+
include_objs_query << {field: @attribute, operator: :__in__, value: facet[:value]}
|
45
|
+
search = VeritySearchEngine.new(@klass, include_objs_query, 0, @include_objs, @attribute, :desc)
|
46
|
+
facet[:results] = search.results.map {|o_id| {id: o_id.to_s}}
|
47
|
+
# this gives a true total!
|
48
|
+
facet[:total] = search.total
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
@facets
|
53
|
+
end
|
54
|
+
|
55
|
+
protected
|
56
|
+
def limit_reached
|
57
|
+
(@fake_limit -= 1) < 0
|
58
|
+
end
|
59
|
+
|
60
|
+
def fetch_more_facets
|
61
|
+
@next_facets
|
62
|
+
end
|
63
|
+
|
64
|
+
def more_facets_available
|
65
|
+
@next_facets = []
|
66
|
+
|
67
|
+
search = build_search
|
68
|
+
return false if search.results.empty?
|
69
|
+
|
70
|
+
sample_object = Fiona7::WriteObj.where(obj_id: search.results).first
|
71
|
+
return false if sample_object.nil?
|
72
|
+
new_values = get_attribute_values(sample_object)
|
73
|
+
|
74
|
+
new_values.each do |new_value|
|
75
|
+
next if @known_values.include?(new_value)
|
76
|
+
@known_values << new_value
|
77
|
+
|
78
|
+
@next_facets << {
|
79
|
+
value: new_value,
|
80
|
+
total: search.total
|
81
|
+
}
|
82
|
+
end
|
83
|
+
|
84
|
+
return !@next_facets.empty?
|
85
|
+
end
|
86
|
+
|
87
|
+
def build_search
|
88
|
+
facet_query = @query.dup
|
89
|
+
facet_query << {field: @attribute, operator: :__not_in__, value: serialize_known_values} unless @known_values.empty?
|
90
|
+
facet_query << any_value_present_in_attribute_query
|
91
|
+
# search engine likes to return object which do not exist anymore
|
92
|
+
# hence we try ten objects
|
93
|
+
facet_size = 10
|
94
|
+
facet_offset = 0
|
95
|
+
facet_sort = @attribute
|
96
|
+
facet_order = :desc
|
97
|
+
|
98
|
+
VeritySearchEngine.new(@klass, facet_query, facet_offset, facet_size, facet_sort, facet_order)
|
99
|
+
end
|
100
|
+
|
101
|
+
# TODO: remove this ugly code
|
102
|
+
def get_attribute_values(sample_object)
|
103
|
+
# TODO: extend this code to handle stringlists and multienums
|
104
|
+
type_definition = Fiona7::TypeRegister.instance.read_mangled(sample_object.obj_class)
|
105
|
+
attribute = type_definition.find_attribute(@attribute)
|
106
|
+
|
107
|
+
return nil unless attribute
|
108
|
+
|
109
|
+
if attribute.type == :stringlist
|
110
|
+
# TODO: remove deserialization duplication
|
111
|
+
deserialized = ::JSON.parse(sample_object[attribute.real_name]) rescue []
|
112
|
+
deserialized.kind_of?(Array) ? deserialized : []
|
113
|
+
elsif attribute.real_type == :multienum
|
114
|
+
sample_object[attribute.real_name] || []
|
115
|
+
else
|
116
|
+
# TODO: add warning/handling for wrong attributes
|
117
|
+
[sample_object[attribute.real_name].to_s]
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def any_value_present_in_attribute_query
|
122
|
+
letters = ('a'..'z').map {|l| "*#{l}*" }
|
123
|
+
numbers = ('0'..'9').map {|l| "*#{l}*" }
|
124
|
+
sanity_patterns = letters + numbers
|
125
|
+
|
126
|
+
{field: @attribute, operator: :__in__, value: sanity_patterns}
|
127
|
+
end
|
128
|
+
|
129
|
+
def serialize_known_values
|
130
|
+
@known_values.map do |kv|
|
131
|
+
kv.blank? ? "dummy123dummy456dummy" : kv.to_s
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
end
|
@@ -1,14 +1,72 @@
|
|
1
1
|
Rails.application.routes.draw do
|
2
|
-
|
2
|
+
mount Scrivito::SdkEngine, at: '/', as: :scrivito_engine
|
3
|
+
end
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
Scrivito::SdkEngine.routes.draw do
|
6
|
+
get 'scrivito', to: 'scrivito/ui#index'
|
7
|
+
get 'scrivito/*application_path', to: 'scrivito/ui#index', format: false
|
8
|
+
|
9
|
+
scope '__scrivito', module: 'scrivito' do
|
10
|
+
get ':id', to: 'cms_dispatch#index', as: :base_id, constraints: {id: /\h{4,}/}
|
11
|
+
|
12
|
+
resources :objs, controller: 'objs', only: [:show, :create, :update, :destroy],
|
13
|
+
defaults: {format: :json} do
|
14
|
+
collection do
|
15
|
+
get :page_class_selection
|
16
|
+
get :search
|
17
|
+
end
|
18
|
+
|
19
|
+
member do
|
20
|
+
get :widget
|
21
|
+
get :widget_class_selection
|
22
|
+
get :widget_modification
|
23
|
+
get :conflicting_workspaces
|
24
|
+
get :is_outdated
|
25
|
+
get :binary_no_cache
|
26
|
+
|
27
|
+
post :copy
|
28
|
+
post :duplicate
|
29
|
+
|
30
|
+
put :revert
|
31
|
+
put :restore
|
32
|
+
put :mark_resolved
|
33
|
+
put :destroy_widget
|
34
|
+
put :revert_widget
|
35
|
+
put :restore_widget
|
36
|
+
put :transfer_modifications
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
resources :tasks, controller: 'tasks', only: [:show], defaults: {format: :json}
|
8
41
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
42
|
+
get 'blobs/upload_permission' => 'blobs#upload_permission', defaults: {format: :json}
|
43
|
+
put 'blobs/activate_upload' => 'blobs#activate_upload', defaults: {format: :json}
|
44
|
+
|
45
|
+
resources :workspaces,
|
46
|
+
controller: 'workspaces',
|
47
|
+
only: [:index, :show, :create, :destroy],
|
48
|
+
defaults: {format: :json} do
|
49
|
+
member do
|
50
|
+
put :rename
|
51
|
+
put :memberships
|
52
|
+
put :rebase
|
53
|
+
put :publish
|
54
|
+
get :check
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
get 'users/suggest' => 'users#suggest', defaults: {format: :json}
|
59
|
+
get 'suggest_completion' => 'completion#suggest', defaults: {format: :json}
|
60
|
+
|
61
|
+
get 'render_widget/:id/show_widget/:widget_id' => 'cms_dispatch#show_widget'
|
62
|
+
get 'render_widget/:id/widget_details/:widget_id' => 'cms_dispatch#widget_details'
|
63
|
+
|
64
|
+
get 'page_details/:id' => 'cms_dispatch#page_details'
|
65
|
+
get 'resource_details/:resource_id', to: 'ui#index'
|
66
|
+
|
67
|
+
get 'to_binary' => 'binary_redirect#to_binary', as: :binary
|
68
|
+
end
|
14
69
|
end
|
70
|
+
|
71
|
+
Scrivito::PresetRoutes.install_into(Rails.application.routes)
|
72
|
+
|
@@ -1,20 +1,72 @@
|
|
1
1
|
Rails.application.routes.draw do
|
2
|
-
|
2
|
+
mount Scrivito::SdkEngine, at: '/', as: :scrivito_engine
|
3
|
+
end
|
4
|
+
|
5
|
+
Scrivito::SdkEngine.routes.draw do
|
6
|
+
get 'scrivito', to: 'scrivito/ui#index'
|
7
|
+
get 'scrivito/*application_path', to: 'scrivito/ui#index', format: false
|
8
|
+
|
9
|
+
scope '__scrivito', module: 'scrivito' do
|
10
|
+
get ':id', to: 'cms_dispatch#index', as: :base_id, constraints: {id: /\h{4,}/}
|
11
|
+
|
12
|
+
resources :objs, controller: 'objs', only: [:show, :create, :update, :destroy],
|
13
|
+
defaults: {format: :json} do
|
14
|
+
collection do
|
15
|
+
get :page_class_selection
|
16
|
+
get :search
|
17
|
+
end
|
18
|
+
|
19
|
+
member do
|
20
|
+
get :widget
|
21
|
+
get :widget_class_selection
|
22
|
+
get :widget_modification
|
23
|
+
get :conflicting_workspaces
|
24
|
+
get :is_outdated
|
25
|
+
get :binary_no_cache
|
26
|
+
|
27
|
+
post :copy
|
28
|
+
post :duplicate
|
3
29
|
|
4
|
-
|
5
|
-
|
30
|
+
put :revert
|
31
|
+
put :restore
|
32
|
+
put :mark_resolved
|
33
|
+
put :destroy_widget
|
34
|
+
put :revert_widget
|
35
|
+
put :restore_widget
|
36
|
+
put :transfer_modifications
|
37
|
+
end
|
38
|
+
end
|
6
39
|
|
7
|
-
|
40
|
+
resources :tasks, controller: 'tasks', only: [:show], defaults: {format: :json}
|
8
41
|
|
9
|
-
|
10
|
-
|
11
|
-
constraints: { id: /\d+|[0-9a-f]{16}/ },
|
12
|
-
as: 'scrivito_id',
|
13
|
-
via: :all
|
42
|
+
get 'blobs/upload_permission' => 'blobs#upload_permission', defaults: {format: :json}
|
43
|
+
put 'blobs/activate_upload' => 'blobs#activate_upload', defaults: {format: :json}
|
14
44
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
45
|
+
resources :workspaces,
|
46
|
+
controller: 'workspaces',
|
47
|
+
only: [:index, :show, :create, :destroy],
|
48
|
+
defaults: {format: :json} do
|
49
|
+
member do
|
50
|
+
put :rename
|
51
|
+
put :memberships
|
52
|
+
put :rebase
|
53
|
+
put :publish
|
54
|
+
get :check
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
get 'users/suggest' => 'users#suggest', defaults: {format: :json}
|
59
|
+
get 'suggest_completion' => 'completion#suggest', defaults: {format: :json}
|
60
|
+
|
61
|
+
get 'render_widget/:id/show_widget/:widget_id' => 'cms_dispatch#show_widget'
|
62
|
+
get 'render_widget/:id/widget_details/:widget_id' => 'cms_dispatch#widget_details'
|
63
|
+
|
64
|
+
get 'page_details/:id' => 'cms_dispatch#page_details'
|
65
|
+
get 'resource_details/:resource_id', to: 'ui#index'
|
66
|
+
|
67
|
+
get 'to_binary' => 'binary_redirect#to_binary', as: :binary
|
68
|
+
end
|
20
69
|
end
|
70
|
+
|
71
|
+
Scrivito::PresetRoutes.install_slave_into(Rails.application.routes)
|
72
|
+
|
@@ -13,11 +13,11 @@ module Fiona7
|
|
13
13
|
|
14
14
|
protected
|
15
15
|
def scrivito_sdk_path
|
16
|
-
Gem.loaded_specs['scrivito_sdk'].
|
16
|
+
Gem.loaded_specs['scrivito_sdk'].full_gem_path
|
17
17
|
end
|
18
18
|
|
19
19
|
def fiona_connector_path
|
20
|
-
Gem.loaded_specs['infopark_fiona_connector'].
|
20
|
+
Gem.loaded_specs['infopark_fiona_connector'].full_gem_path
|
21
21
|
end
|
22
22
|
|
23
23
|
def reorder_view_paths(first, second)
|
@@ -3,15 +3,24 @@ require "fiona7/search_engine"
|
|
3
3
|
module Fiona7
|
4
4
|
class NaiveSearchEngine < SearchEngine
|
5
5
|
def results
|
6
|
-
|
6
|
+
@objects || execute_search
|
7
|
+
@objects.map {|o| o.id}
|
8
|
+
end
|
9
|
+
|
10
|
+
def objects
|
11
|
+
@objects || execute_search
|
12
|
+
@objects
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
def execute_search
|
7
17
|
fetch_all
|
8
18
|
apply_filters
|
9
19
|
exclude_widgets
|
10
20
|
order_results
|
11
21
|
limit_size
|
12
|
-
end
|
22
|
+
end
|
13
23
|
|
14
|
-
protected
|
15
24
|
def fetch_all
|
16
25
|
obj_class_filter = @query.find {|q| (q[:field] == :_obj_class || q[:field] == "_obj_class") && q[:operator] == :equal }
|
17
26
|
id_filter = @query.find {|q| (q[:field] == :id || q[:field] == "id") && q[:operator] == :equal }
|
@@ -77,7 +86,7 @@ module Fiona7
|
|
77
86
|
|
78
87
|
def limit_size
|
79
88
|
@count = @all.count
|
80
|
-
if @all.kind_of?(Array)
|
89
|
+
@objects = if @all.kind_of?(Array)
|
81
90
|
@all[@offset, @limit] || []
|
82
91
|
else
|
83
92
|
@all.offset(@offset).limit(@limit).to_a
|
@@ -91,7 +100,7 @@ module Fiona7
|
|
91
100
|
value = filter[:value]
|
92
101
|
|
93
102
|
case filter[:operator]
|
94
|
-
when :equal
|
103
|
+
when :equals, :equal
|
95
104
|
if field == :_modification || field == "_modification"
|
96
105
|
if value != ["new", "edited", "deleted"]
|
97
106
|
raise "Unsupported modification values: #{value.inspect}. Only #{["new", "edited", "deleted"].inspect} are supported"
|
@@ -99,6 +108,30 @@ module Fiona7
|
|
99
108
|
# TODO: this can be solved with AR, faster
|
100
109
|
@all = @all.to_a.select {|o| o.edited? }
|
101
110
|
end
|
111
|
+
elsif field == :_path
|
112
|
+
value = [value] unless value.is_a?(Array)
|
113
|
+
value.map{|v| v.gsub!('.', '_') }
|
114
|
+
if (@all.is_a?(Array))
|
115
|
+
@all = @all.select do |o|
|
116
|
+
value.include?(o.path)
|
117
|
+
end
|
118
|
+
else
|
119
|
+
@all = @all.where(:path => value)
|
120
|
+
end
|
121
|
+
elsif field == :_parent_path
|
122
|
+
parent_obj = @klass.where(path: value).first
|
123
|
+
if parent_obj
|
124
|
+
parent_obj_id = parent_obj.id
|
125
|
+
if (@all.is_a?(Array))
|
126
|
+
@all = @all.select do |o|
|
127
|
+
o.parent_obj_id == parent_obj_id
|
128
|
+
end
|
129
|
+
else
|
130
|
+
@all = @all.where(:parent_obj_id => parent_obj_id)
|
131
|
+
end
|
132
|
+
else
|
133
|
+
@all = []
|
134
|
+
end
|
102
135
|
else
|
103
136
|
if value.is_a?(Array)
|
104
137
|
@all = @all.to_a.select do |o|
|
@@ -127,6 +160,8 @@ module Fiona7
|
|
127
160
|
end
|
128
161
|
when :prefix, :prefix_search
|
129
162
|
if !@all.is_a?(Array) && field.to_sym == :_path
|
163
|
+
# TODO: handle this properly
|
164
|
+
value = value.first if value.kind_of?(Array)
|
130
165
|
@all = @all.where("path LIKE ?", "#{value}%")
|
131
166
|
else
|
132
167
|
@all = @all.to_a.select {|o| o.send(:[], resolve_field_name(o,field)).to_s.start_with?(value) }
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "fiona7/type_register"
|
2
|
+
|
3
|
+
module Fiona7
|
4
|
+
class ObjClassesFromCms
|
5
|
+
def initialize(type_register=Fiona7::TypeRegister.instance)
|
6
|
+
@type_register = type_register
|
7
|
+
end
|
8
|
+
|
9
|
+
def obj_classes
|
10
|
+
@type_register.read_all.map(&:virtual_name)
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|