scrivito_sdk 0.50.1 → 0.60.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/scrivito/objs_controller.rb +25 -21
  3. data/app/controllers/scrivito/ui_controller.rb +1 -1
  4. data/app/controllers/scrivito/webservice_controller.rb +1 -1
  5. data/app/models/scrivito/content_widget.rb +1 -3
  6. data/app/views/cms/index.html.erb +3 -0
  7. data/app/views/scrivito/objs/destroy.json.jbuilder +1 -0
  8. data/app/views/scrivito/objs/show.json.jbuilder +2 -0
  9. data/app/views/scrivito/objs/update.json.jbuilder +1 -1
  10. data/app/views/scrivito/objs/{widget_modification.json.jbuilder → widget.json.jbuilder} +0 -0
  11. data/config/ca-bundle.crt +24 -219
  12. data/config/precedence_routes.rb +60 -0
  13. data/config/routes.rb +13 -46
  14. data/lib/assets/javascripts/scrivito_ui.js +360 -202
  15. data/lib/assets/stylesheets/scrivito_sdk.css +1 -1
  16. data/lib/assets/stylesheets/scrivito_ui.css +1 -1
  17. data/lib/generators/scrivito/install/templates/app/models/download.rb +1 -3
  18. data/lib/generators/scrivito/install/templates/app/models/headline_widget.rb +1 -5
  19. data/lib/generators/scrivito/install/templates/app/models/image.rb +1 -3
  20. data/lib/generators/scrivito/install/templates/app/models/image_widget.rb +1 -5
  21. data/lib/generators/scrivito/install/templates/app/models/page.rb +3 -6
  22. data/lib/generators/scrivito/install/templates/app/models/text_widget.rb +1 -5
  23. data/lib/generators/scrivito/install/templates/scrivito/migrate/install_scrivito_migration.rb +1 -25
  24. data/lib/generators/scrivito/migration/templates/migration.erb +2 -26
  25. data/lib/generators/scrivito/page/page_generator.rb +0 -11
  26. data/lib/generators/scrivito/page/templates/model.erb +3 -7
  27. data/lib/generators/scrivito/widget/widget_generator.rb +0 -11
  28. data/lib/scrivito/attribute.rb +10 -16
  29. data/lib/scrivito/attribute_collection.rb +4 -0
  30. data/lib/scrivito/attribute_content.rb +239 -161
  31. data/lib/scrivito/attribute_definition.rb +16 -10
  32. data/lib/scrivito/attribute_definition_collection.rb +7 -4
  33. data/lib/scrivito/attribute_definition_migrator.rb +1 -3
  34. data/lib/scrivito/attribute_deserializer.rb +111 -0
  35. data/lib/scrivito/attribute_serializer.rb +189 -0
  36. data/lib/scrivito/basic_obj.rb +113 -78
  37. data/lib/scrivito/basic_widget.rb +103 -37
  38. data/lib/scrivito/binary.rb +3 -3
  39. data/lib/scrivito/cache/chainable.rb +10 -4
  40. data/lib/scrivito/cache/file_store.rb +7 -4
  41. data/lib/scrivito/cache/ram_store.rb +1 -1
  42. data/lib/scrivito/class_collection.rb +2 -2
  43. data/lib/scrivito/client_config.rb +7 -6
  44. data/lib/scrivito/cms_backend.rb +2 -2
  45. data/lib/scrivito/cms_field_tag.rb +33 -25
  46. data/lib/scrivito/cms_rest_api/{attribute_serializer.rb → legacy_attribute_serializer.rb} +1 -1
  47. data/lib/scrivito/cms_routing.rb +20 -14
  48. data/lib/scrivito/configuration.rb +1 -1
  49. data/lib/scrivito/controller_actions.rb +12 -4
  50. data/lib/scrivito/date_attribute.rb +8 -0
  51. data/lib/scrivito/diff.rb +1 -1
  52. data/lib/scrivito/editing_context.rb +1 -1
  53. data/lib/scrivito/editing_context_middleware.rb +1 -1
  54. data/lib/scrivito/errors.rb +4 -0
  55. data/lib/scrivito/link_parser.rb +6 -1
  56. data/lib/scrivito/migrations/cms_backend.rb +17 -60
  57. data/lib/scrivito/migrations/migration_store.rb +0 -1
  58. data/lib/scrivito/model_library.rb +6 -6
  59. data/lib/scrivito/obj_class.rb +34 -48
  60. data/lib/scrivito/obj_class_collection.rb +21 -3
  61. data/lib/scrivito/obj_create_params_parser.rb +2 -1
  62. data/lib/scrivito/obj_data.rb +9 -103
  63. data/lib/scrivito/obj_data_from_hash.rb +19 -21
  64. data/lib/scrivito/obj_data_from_service.rb +28 -48
  65. data/lib/scrivito/obj_params_parser.rb +14 -14
  66. data/lib/scrivito/obj_search_enumerator.rb +1 -1
  67. data/lib/scrivito/obj_update_params_parser.rb +2 -2
  68. data/lib/scrivito/restriction_set.rb +1 -1
  69. data/lib/scrivito/sdk_engine.rb +2 -2
  70. data/lib/scrivito/test_request.rb +10 -0
  71. data/lib/scrivito/type_computer.rb +5 -1
  72. data/lib/scrivito/widget_collection.rb +15 -0
  73. data/lib/scrivito/widget_garbage_collection.rb +1 -1
  74. data/lib/scrivito/widget_tag.rb +2 -0
  75. data/lib/scrivito/workspace.rb +2 -1
  76. data/lib/scrivito/workspace_data_from_service.rb +1 -0
  77. data/lib/scrivito_sdk.rb +17 -1
  78. metadata +36 -34
  79. data/app/views/scrivito/objs/modification.json.jbuilder +0 -1
  80. data/config/cms_routes.rb +0 -22
  81. data/lib/generators/scrivito/page/templates/migration.erb +0 -9
  82. data/lib/generators/scrivito/widget/templates/migration.erb +0 -7
@@ -4,6 +4,7 @@ module Scrivito
4
4
  # instance by accessing {Workspace#obj_classes}.
5
5
  #
6
6
  # @api public
7
+ # @deprecated
7
8
  class ObjClassCollection
8
9
  include Enumerable
9
10
 
@@ -18,6 +19,7 @@ module Scrivito
18
19
  # Finds an obj class by its name in the working copy of the collection.
19
20
  #
20
21
  # @api public
22
+ # @deprecated
21
23
  #
22
24
  # @example Find the obj class named "Homepage" in the "rtc" {Workspace}.
23
25
  # Workspace.find('rtc').obj_classes['Homepage']
@@ -30,21 +32,37 @@ module Scrivito
30
32
  end
31
33
  end
32
34
 
35
+ #
33
36
  # @!method each
37
+ #
34
38
  # Yields successive obj classes of the collection. Implements the +Enumerable+ interface.
39
+ #
35
40
  # @api public
36
- # @yield [ObjClass] Successive obj classes of the collection.
41
+ # @deprecated
42
+ # @see Scrivito::ObjClass.remove
43
+ #
44
+ # @yield [ObjClass] successive obj classes of the collection if the corresponding workspace
45
+ # still uses {Scrivito::ObjClass}.
46
+ # @yield [Array] an empty array if the corresponding workspace does not use {Scrivito::ObjClass}
47
+ # anymore.
48
+ #
37
49
  # @example Find all obj classes in the "rtc" {Workspace} and print their name.
38
50
  # Workspace.find('rtc').obj_classes.each do |obj_class|
39
51
  # puts obj_class.name
40
52
  # end
53
+ #
41
54
  delegate :each, to: :obj_classes
42
55
 
43
56
  private
44
57
 
45
58
  def obj_classes
46
- CmsBackend.instance.find_all_obj_class_data(workspace.revision).map do |obj_class_data|
47
- ObjClass.new(obj_class_data, workspace)
59
+ if workspace.uses_obj_classes
60
+ CmsBackend.instance.find_all_obj_class_data(workspace.revision).map do |obj_class_data|
61
+ ObjClass.new(obj_class_data, workspace)
62
+ end
63
+ else
64
+ Scrivito.print_obj_class_deprecated_warning
65
+ []
48
66
  end
49
67
  end
50
68
 
@@ -6,7 +6,8 @@ module Scrivito
6
6
 
7
7
  def convert_params(params)
8
8
  if obj_class_name = params['_obj_class']
9
- convert_field_params(ObjClass.find(obj_class_name), params)
9
+ model_class = Obj.type_computer.compute_type(obj_class_name)
10
+ convert_field_params(params, model_class.attribute_definitions)
10
11
  else
11
12
  raise ArgumentError, 'Missing "_obj_class" param'
12
13
  end
@@ -1,39 +1,5 @@
1
1
  module Scrivito
2
-
3
2
  class ObjData
4
- internal_key_list = %w[
5
- last_changed
6
- modification
7
- permalink
8
- text_links
9
- conflicts
10
- ]
11
-
12
- INTERNAL_KEYS = Set.new(internal_key_list.map { |name| "_#{name}" } )
13
-
14
- internal_comparison_key_list = %w[
15
- path
16
- permalink
17
- widget_pool
18
- ]
19
-
20
- INTERNAL_COMPARISON_KEYS = Set.new(internal_comparison_key_list.map { |name| "_#{name}" })
21
-
22
- ATTRIBUTE_DEFAULT_VALUES = {
23
- "string" => "",
24
- "text" => "",
25
- "html" => "",
26
- "multienum" => [],
27
- "linklist" => [],
28
- "referencelist" => [],
29
- "widget" => [],
30
- "enum" => nil,
31
- "binary" => nil,
32
- "date" => nil,
33
- "reference" => nil,
34
- "link" => nil,
35
- }.freeze
36
-
37
3
  def value_of(attribute_name)
38
4
  value_and_type_of(attribute_name).first
39
5
  end
@@ -42,32 +8,14 @@ module Scrivito
42
8
  value_and_type_of(attribute_name).second
43
9
  end
44
10
 
45
- def value_without_default_of(attribute_name)
46
- value_and_type_without_default_of(attribute_name).first
47
- end
48
-
49
11
  def value_and_type_of(attribute_name)
50
- if internal_attribute?(attribute_name)
51
- internal_value_and_type(attribute_name)
52
- else
53
- custom_value_and_type_with_default(attribute_name)
54
- end
55
- end
56
-
57
- def value_and_type_without_default_of(attribute_name)
58
- if internal_attribute?(attribute_name)
59
- internal_value_and_type(attribute_name)
12
+ if attribute_name.starts_with?('_')
13
+ [raw_value_and_type_of(attribute_name).first, nil]
60
14
  else
61
15
  raw_value_and_type_of(attribute_name)
62
16
  end
63
17
  end
64
18
 
65
- def all_custom_attributes
66
- @all_custom_attributes ||= all_attributes.select do |attribute|
67
- has_custom_attribute?(attribute)
68
- end
69
- end
70
-
71
19
  def to_h
72
20
  raise NotImplementedError, 'implement in subclass'
73
21
  end
@@ -76,62 +24,20 @@ module Scrivito
76
24
  raise NotImplementedError, "implement in subclass"
77
25
  end
78
26
 
79
- def has_custom_attribute?(name)
80
- raise NotImplementedError, "implement in subclass"
81
- end
82
-
83
- def all_attributes
27
+ def attribute_names_for_comparison
84
28
  raise NotImplementedError, "implement in subclass"
85
29
  end
86
30
 
87
31
  def ==(other)
88
- if other.kind_of?(ObjData)
89
- (all_attributes | other.all_attributes).each do |attr|
90
- attr = attr.to_s
91
-
92
- next if attr.start_with?('_') && !INTERNAL_COMPARISON_KEYS.include?(attr)
93
-
94
- if value_without_default_of(attr) != other.value_without_default_of(attr)
95
- return false
96
- end
97
- end
98
-
99
- return true
100
- end
101
-
102
- false
103
- end
32
+ return false unless other.is_a?(ObjData)
104
33
 
105
- private
34
+ attribute_names = attribute_names_for_comparison | other.attribute_names_for_comparison
35
+ attribute_names.reject! { |attribute_name| attribute_name.starts_with?('_') }
36
+ attribute_names += %w[_path _permalink _widget_pool]
106
37
 
107
- def custom_value_and_type_with_default(attribute_name)
108
- value, type = raw_value_and_type_of(attribute_name)
109
- value = ATTRIBUTE_DEFAULT_VALUES[type] if value.nil?
110
- [value, type]
111
- end
112
-
113
- def internal_value_and_type(attribute_name)
114
- value, type = raw_value_and_type_of(attribute_name)
115
- type = type_of_internal(attribute_name)
116
- [value, type]
117
- end
118
-
119
- def internal_attribute?(attribute_name)
120
- attribute_name.starts_with?('_')
121
- end
122
-
123
- def type_of_internal(key)
124
- case key
125
- when "_permalink"
126
- "string"
127
- when "_text_links"
128
- "linklist"
129
- when "_last_changed"
130
- "date"
131
- else
132
- nil
38
+ attribute_names.all? do |attribute_name|
39
+ value_of(attribute_name) == other.value_of(attribute_name)
133
40
  end
134
41
  end
135
42
  end
136
-
137
43
  end
@@ -1,31 +1,29 @@
1
1
  module Scrivito
2
2
 
3
- class ObjDataFromHash < ObjData
4
- def initialize(hash, type_hash = {})
5
- @hash = hash.stringify_keys
6
- @type_hash = type_hash.stringify_keys
7
- end
8
-
9
- def raw_value_and_type_of(attribute_name)
10
- [@hash[attribute_name], @type_hash[attribute_name]]
11
- end
12
-
13
- def has_custom_attribute?(name)
14
- @hash.has_key?(name) || name == '_id'
15
- end
3
+ class ObjDataFromHash < ObjData
4
+ def initialize(attributes)
5
+ @attributes = attributes.stringify_keys
6
+ end
16
7
 
17
- def all_attributes
18
- @all_attributes ||= begin
19
- @hash.keys |
20
- INTERNAL_KEYS.to_a |
21
- %w[_id]
8
+ def raw_value_and_type_of(attribute_name)
9
+ if attribute_data = @attributes[attribute_name]
10
+ if attribute_name.starts_with?('_')
11
+ [attribute_data, nil]
12
+ else
13
+ attribute_data.reverse
22
14
  end
15
+ else
16
+ [nil, nil]
23
17
  end
18
+ end
24
19
 
25
- def to_h
26
- @hash
27
- end
20
+ def attribute_names_for_comparison
21
+ @attributes.keys
22
+ end
28
23
 
24
+ def to_h
25
+ @attributes
29
26
  end
27
+ end
30
28
 
31
29
  end
@@ -6,54 +6,42 @@ module Scrivito
6
6
  end
7
7
 
8
8
  def raw_value_and_type_of(attribute_name)
9
- if attribute_name == '_widget_pool'
10
- [value_of_widget_pool, nil]
9
+ return [value_of_widget_pool, nil] if attribute_name == '_widget_pool'
10
+ if value_and_type = @data[attribute_name]
11
+ value, type = value_and_type
12
+ value = convert_value(value, type)
13
+ [value, type]
11
14
  else
12
- type_and_value = @data.fetch(attribute_name, [nil, nil])
13
-
14
- if type_and_value.present?
15
- type = if type_and_value.length == 1
16
- type_of_internal(attribute_name)
17
- else
18
- type_and_value.last
19
- end
20
-
21
- [convert_value(type_and_value.first, type), type]
22
- end
15
+ [nil, nil]
23
16
  end
24
17
  end
25
18
 
26
- def has_custom_attribute?(attribute_name)
27
- is_custom_attribute?(attribute_name) && !!@data[attribute_name]
19
+ def convert_value(value, type)
20
+ case type
21
+ when 'html' then convert_text_links(value)
22
+ when 'widget'
23
+ if value.is_a?(Hash) && value.size == 1 && value.has_key?('list')
24
+ # Legacy data with obj classes.
25
+ value['list'].map { |item| item['widget'] }
26
+ else
27
+ value
28
+ end
29
+ else value
30
+ end
28
31
  end
29
32
 
30
- def all_attributes
31
- @all_attributes ||= (@data.keys | INTERNAL_KEYS.to_a)
33
+ def attribute_names_for_comparison
34
+ @data.keys
32
35
  end
33
36
 
34
37
  def to_h
35
- @data.dup.tap do |h|
36
- h.each_pair { |k, v| h[k] = v.first }
37
- end
38
+ @data.to_h
38
39
  end
39
40
 
40
41
  private
41
42
 
42
- def convert_value(value, type)
43
- case type
44
- when "html"
45
- text_links_conversion.convert(value)
46
- when "widget"
47
- if !value
48
- []
49
- else
50
- (value['list'] || []).map do |list_item|
51
- list_item['widget']
52
- end
53
- end
54
- else
55
- value
56
- end
43
+ def convert_text_links(value)
44
+ text_links_conversion.convert(value)
57
45
  end
58
46
 
59
47
  def text_links_conversion
@@ -70,21 +58,13 @@ module Scrivito
70
58
  end
71
59
 
72
60
  def value_of_widget_pool
73
- raw_value_of_widget_pool.dup.tap do |hash|
74
- hash.each_pair do |widget_id, raw_widget_data|
75
- hash[widget_id] = self.class.new(raw_widget_data)
61
+ if widget_pool = @data['_widget_pool']
62
+ widget_pool.first.dup.tap do |hash|
63
+ hash.each_pair do |widget_id, raw_widget_data|
64
+ hash[widget_id] = self.class.new(raw_widget_data)
65
+ end
76
66
  end
77
67
  end
78
68
  end
79
-
80
- def raw_value_of_widget_pool
81
- @data['_widget_pool'].first
82
- end
83
-
84
- def is_custom_attribute?(attribute_name)
85
- !internal_attribute?(attribute_name)
86
- end
87
-
88
69
  end
89
-
90
70
  end
@@ -11,25 +11,21 @@ module Scrivito
11
11
 
12
12
  private
13
13
 
14
- def convert_field_params(obj_class, params)
14
+ def convert_field_params(params, attribute_definitions)
15
15
  params.each_pair do |key, value|
16
- if key.to_s == 'blob' && obj_class.legacy_type?
17
- params[key] = parse_binary_field_params(value)
18
- next
19
- end
20
-
21
- params[key] = case type = obj_class.attributes[key].try(:type)
22
- when 'html' then ContentConversion.convert_html_links(value, host, port)
23
- when 'linklist' then ContentConversion.convert_linklist_urls(value, host, port)
24
- when 'link' then ContentConversion.convert_link(value, host, port)
25
- when 'widget' then parse_widget_field_params(value)
26
- when 'binary' then parse_binary_field_params(value)
16
+ params[key] = case type = attribute_definitions[key.to_s].try(:type)
17
+ when 'binary' then parse_binary_params(value)
18
+ when 'html' then ContentConversion.convert_html_links(value, host, port)
19
+ when 'link' then ContentConversion.convert_link(value, host, port)
20
+ when 'linklist' then ContentConversion.convert_linklist_urls(value, host, port)
21
+ when 'widgetlist' then parse_widgetlist_params(value)
22
+ when 'date' then parse_date_params(value)
27
23
  else value
28
24
  end
29
25
  end
30
26
  end
31
27
 
32
- def parse_widget_field_params(params)
28
+ def parse_widgetlist_params(params)
33
29
  params.map do |widget_id_or_params|
34
30
  if widget_id_or_params.is_a?(Hash)
35
31
  action, widget_params = widget_id_or_params.flatten
@@ -50,8 +46,12 @@ module Scrivito
50
46
  end
51
47
  end
52
48
 
53
- def parse_binary_field_params(params)
49
+ def parse_binary_params(params)
54
50
  UploadedBinary.new(params) if params
55
51
  end
52
+
53
+ def parse_date_params(params)
54
+ DateAttribute.parse(params)
55
+ end
56
56
  end
57
57
  end
@@ -303,7 +303,7 @@ module Scrivito
303
303
 
304
304
  def convert_single_value(value)
305
305
  if value.is_a?(Time) || value.is_a?(Date)
306
- CmsRestApi::AttributeSerializer.convert_time(value)
306
+ DateAttribute.serialize(value)
307
307
  else
308
308
  value
309
309
  end
@@ -5,7 +5,7 @@ module Scrivito
5
5
  private
6
6
 
7
7
  def convert_params(params)
8
- convert_field_params(obj.obj_class, params)
8
+ convert_field_params(params, obj.attribute_definitions)
9
9
  convert_widget_pool_params(params)
10
10
  end
11
11
 
@@ -16,7 +16,7 @@ module Scrivito
16
16
  params['_widget_pool'].each_pair do |widget_id, widget_params|
17
17
  if widget_params.present?
18
18
  widget = obj.widgets[widget_id]
19
- widget_pool[widget] = convert_field_params(widget.obj_class, widget_params)
19
+ widget_pool[widget] = convert_field_params(widget_params, widget.attribute_definitions)
20
20
  end
21
21
  end
22
22
  params['_widget_pool'] = widget_pool
@@ -14,7 +14,7 @@ module Scrivito
14
14
  private
15
15
 
16
16
  def skip?(obj)
17
- !obj.has_attribute?(attribute) || obj.type_of_attribute(attribute) == 'widget'
17
+ !obj.has_attribute?(attribute) || obj.type_of_attribute(attribute) == 'widgetlist'
18
18
  end
19
19
  end
20
20