infopark_fiona_connector 7.0.1.5.2.3.rc7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +5 -0
  3. data/app/assets/images/admin/minus.gif +0 -0
  4. data/app/assets/images/bg80.png +0 -0
  5. data/app/assets/images/edit.png +0 -0
  6. data/app/assets/images/icons/mm_generic.png +0 -0
  7. data/app/assets/images/icons/mm_menu.png +0 -0
  8. data/app/assets/javascripts/editmarker.js +240 -0
  9. data/app/assets/javascripts/infopark_rails_connector.js.erb +0 -0
  10. data/app/assets/stylesheets/editmarker.css +70 -0
  11. data/app/assets/stylesheets/infopark_rails_connector.css.erb +0 -0
  12. data/app/controllers/cms_controller.rb +7 -0
  13. data/app/controllers/rails_connector/default_cms_controller.rb +41 -0
  14. data/app/helpers/cms_helper.rb +7 -0
  15. data/app/helpers/cms_routing_helper.rb +7 -0
  16. data/app/helpers/rails_connector/cms_asset_helper.rb +54 -0
  17. data/app/helpers/rails_connector/cms_tag_helper.rb +4 -0
  18. data/app/helpers/rails_connector/default_cms_helper.rb +21 -0
  19. data/app/helpers/rails_connector/default_cms_routing_helper.rb +119 -0
  20. data/app/helpers/rails_connector/display_helper.rb +124 -0
  21. data/app/helpers/rails_connector/editing_helper.rb +7 -0
  22. data/app/helpers/rails_connector/layout_helper.rb +26 -0
  23. data/app/helpers/rails_connector/marker_helper.rb +371 -0
  24. data/app/helpers/rails_connector/table_of_contents_helper.rb +20 -0
  25. data/app/models/named_link.rb +2 -0
  26. data/app/views/cms/_index.html.erb +7 -0
  27. data/app/views/cms/index.html.erb +1 -0
  28. data/app/views/errors/403_forbidden.html.erb +3 -0
  29. data/app/views/errors/410_gone.html.erb +7 -0
  30. data/config/cms_routes.rb +17 -0
  31. data/config/locales/de.rails_connector.errors.yml +11 -0
  32. data/config/locales/de.rails_connector.lib.yml +6 -0
  33. data/config/locales/de.rails_connector.views.yml +9 -0
  34. data/config/locales/en.rails_connector.errors.yml +10 -0
  35. data/config/locales/en.rails_connector.lib.yml +6 -0
  36. data/config/locales/en.rails_connector.views.yml +9 -0
  37. data/lib/gem_dependencies.rb +68 -0
  38. data/lib/generators/rails_connector/install/install_generator.rb +37 -0
  39. data/lib/generators/rails_connector/install/templates/app/models/obj.rb.erb +5 -0
  40. data/lib/generators/rails_connector/install/templates/initializers/rails_connector.rb +2 -0
  41. data/lib/generators/rails_connector/install/templates/local/configuration.rb +2 -0
  42. data/lib/infopark_fiona_connector.rb +44 -0
  43. data/lib/meta_eager_loader.rb +1 -0
  44. data/lib/obj.rb +3 -0
  45. data/lib/rails_connector/attr_dict.rb +169 -0
  46. data/lib/rails_connector/attr_value_provider.bundle +0 -0
  47. data/lib/rails_connector/attr_value_provider.so +0 -0
  48. data/lib/rails_connector/attr_value_provider64.so +0 -0
  49. data/lib/rails_connector/attribute.rb +93 -0
  50. data/lib/rails_connector/authenticable.rb +37 -0
  51. data/lib/rails_connector/basic_obj.rb +571 -0
  52. data/lib/rails_connector/blob.rb +75 -0
  53. data/lib/rails_connector/blob_mapping.rb +15 -0
  54. data/lib/rails_connector/blob_mysql.rb +30 -0
  55. data/lib/rails_connector/blob_oracle.rb +37 -0
  56. data/lib/rails_connector/cache_middleware.rb +13 -0
  57. data/lib/rails_connector/channel.rb +18 -0
  58. data/lib/rails_connector/cms_accessible.rb +111 -0
  59. data/lib/rails_connector/cms_base_model.rb +62 -0
  60. data/lib/rails_connector/cms_dispatch_controller.rb +43 -0
  61. data/lib/rails_connector/cms_env.rb +65 -0
  62. data/lib/rails_connector/cms_test_request.rb +8 -0
  63. data/lib/rails_connector/configuration.rb +174 -0
  64. data/lib/rails_connector/content.rb +7 -0
  65. data/lib/rails_connector/core_extensions.rb +1 -0
  66. data/lib/rails_connector/core_extensions/time.rb +17 -0
  67. data/lib/rails_connector/date_attribute.rb +26 -0
  68. data/lib/rails_connector/default_search_request.rb +6 -0
  69. data/lib/rails_connector/engine.rb +65 -0
  70. data/lib/rails_connector/errors.rb +6 -0
  71. data/lib/rails_connector/fiona_datetime.rb +14 -0
  72. data/lib/rails_connector/fiona_engine.rb +8 -0
  73. data/lib/rails_connector/html_string.rb +17 -0
  74. data/lib/rails_connector/job.rb +10 -0
  75. data/lib/rails_connector/link.rb +148 -0
  76. data/lib/rails_connector/link_list.rb +28 -0
  77. data/lib/rails_connector/link_resolvable.rb +5 -0
  78. data/lib/rails_connector/lucene_search_request.rb +102 -0
  79. data/lib/rails_connector/markdown_string.rb +17 -0
  80. data/lib/rails_connector/meta.rb +143 -0
  81. data/lib/rails_connector/meta/eager_loader.rb +84 -0
  82. data/lib/rails_connector/named_link.rb +90 -0
  83. data/lib/rails_connector/news.rb +20 -0
  84. data/lib/rails_connector/obj_class.rb +138 -0
  85. data/lib/rails_connector/obj_class_attr.rb +5 -0
  86. data/lib/rails_connector/object_with_meta_data.rb +13 -0
  87. data/lib/rails_connector/permission.rb +37 -0
  88. data/lib/rails_connector/rack_middlewares.rb +5 -0
  89. data/lib/rails_connector/ses.rb +78 -0
  90. data/lib/rails_connector/ses/verity_accessor.rb +127 -0
  91. data/lib/rails_connector/string_tagging.rb +26 -0
  92. data/lib/rails_connector/verity_search_request.rb +86 -0
  93. data/lib/search_request.rb +2 -0
  94. data/lib/version.rb +7 -0
  95. metadata +277 -0
@@ -0,0 +1,20 @@
1
+ module RailsConnector
2
+ #
3
+ # This module contains a helper that can be used to build a table of contents of an object.
4
+ #
5
+ # @api public
6
+ module TableOfContentsHelper
7
+ #
8
+ # The <tt>table_of_contents</tt> helper method gets an object as argument and returns an array,
9
+ # which can be used as the table of contents of the given object.
10
+ #
11
+ # The returned array consists of the child objects of the given object.
12
+ # The array is sorted according to the configured sort order and the sort keys.
13
+ # It also contains only objects which the current user is permitted to view.
14
+ #
15
+ # @api public
16
+ def table_of_contents(obj)
17
+ obj.sorted_toclist.reject { |o| !o.permitted_for_user?(current_user) }
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,2 @@
1
+ # ::NamedLink is just a shortcut
2
+ ::NamedLink = RailsConnector::NamedLink
@@ -0,0 +1,7 @@
1
+ <h1 class="cms_title"><%= display_field @obj, :title %></h1>
2
+ <ul class="cms_toclist">
3
+ <% @obj.toclist.each do |item| %>
4
+ <li><%= link_to display_field(item, :title), cms_path(item) %></li>
5
+ <% end %>
6
+ </ul>
7
+ <%= display_field @obj, :body %>
@@ -0,0 +1 @@
1
+ <%= render :partial => 'index' %>
@@ -0,0 +1,3 @@
1
+ <h1><%= t(:'rails_connector.lib.cms_accessible.protected') %></h1>
2
+
3
+ <p><%= t(:"rails_connector.views.errors.forbidden.no_permissions") %></p>
@@ -0,0 +1,7 @@
1
+ <h1><%= t(:'rails_connector.lib.cms_accessible.not_released') %></h1>
2
+
3
+ <% if @valid_until && @valid_until < Time.now %>
4
+ <%= raw t(:"rails_connector.views.errors.gone.not_released_anymore", :valid_until => "<strong>#{l @valid_until}</strong>") %>
5
+ <% elsif @valid_from && Time.now < @valid_from %>
6
+ <%= raw t(:"rails_connector.views.errors.gone.not_yet_released", :valid_from => "<strong>#{l @valid_from}</strong>") %>
7
+ <% end %>
@@ -0,0 +1,17 @@
1
+ Rails.application.routes.draw do
2
+ root to: "rails_connector/cms_dispatch#index"
3
+ match ":id(/*slug)",
4
+ to: "rails_connector/cms_dispatch#index",
5
+ constraints: { id: /\d+|[0-9a-f]{16}/ },
6
+ as: "cms_id",
7
+ via: :all
8
+ match "toggle_markers/:id",
9
+ to: "rails_connector/cms_dispatch#toggle_editmarkers",
10
+ as: "toggle_markers",
11
+ via: :all
12
+ match "/*permalink",
13
+ to: "rails_connector/cms_dispatch#index",
14
+ as: "cms_permalink",
15
+ format: false,
16
+ via: :all
17
+ end
@@ -0,0 +1,11 @@
1
+ de:
2
+ rails_connector:
3
+ errors:
4
+ messages:
5
+ blank: "darf nicht leer sein"
6
+ forbidden:
7
+ no_permissions: "Sie haben nicht die notwendigen Zugriffsrechte"
8
+ gone:
9
+ not_released_anymore: "Die Datei war nur bis zum %{valid_until} veröffentlicht."
10
+ not_yet_released: "Die Datei wird erst am %{valid_from} veröffentlicht."
11
+
@@ -0,0 +1,6 @@
1
+ de:
2
+ rails_connector:
3
+ lib:
4
+ cms_accessible:
5
+ protected: "Die Datei ist geschützt"
6
+ not_released: "Die Datei wurde nicht veröffentlicht"
@@ -0,0 +1,9 @@
1
+ de:
2
+ rails_connector:
3
+ views:
4
+ errors:
5
+ forbidden:
6
+ no_permissions: "Sie haben nicht die notwendigen Zugriffsrechte"
7
+ gone:
8
+ not_released_anymore: "Die Datei war nur bis zum %{valid_until} veröffentlicht."
9
+ not_yet_released: "Die Datei wird erst am %{valid_from} veröffentlicht."
@@ -0,0 +1,10 @@
1
+ en:
2
+ rails_connector:
3
+ errors:
4
+ messages:
5
+ blank: "cannot be blank"
6
+ forbidden:
7
+ no_permissions: "You don't have the required permissions"
8
+ gone:
9
+ not_released_anymore: "The file was released only until %{valid_until}"
10
+ not_yet_released: "The file will be released on %{valid_from}"
@@ -0,0 +1,6 @@
1
+ en:
2
+ rails_connector:
3
+ lib:
4
+ cms_accessible:
5
+ protected: "This file is protected"
6
+ not_released: "The file has not been released"
@@ -0,0 +1,9 @@
1
+ en:
2
+ rails_connector:
3
+ views:
4
+ errors:
5
+ forbidden:
6
+ no_permissions: "You don't have the required permissions"
7
+ gone:
8
+ not_released_anymore: "The file was released only until %{valid_until}"
9
+ not_yet_released: "The file will be released on %{valid_from}"
@@ -0,0 +1,68 @@
1
+ class GemDependencies
2
+ def self.dependency_for(gem_name)
3
+ dependencies.detect { |dep| dep[:name] == gem_name }
4
+ end
5
+
6
+ # generates code that should be included or eval'ed inside a Gemfile.
7
+ # for every rc dependency, a 'gem' statement is generated.
8
+ # this statement specifies that dependency using the _minimum_ allowed version.
9
+ #
10
+ # example:
11
+ # if the RC depends on "json", "~> 1.2.3", the following statement will be generated:
12
+ # gem "json", "= 1.2.3"
13
+ def self.minimum_version_gemfile_code(options = {})
14
+ dependencies_minimum_versions = dependencies.map do |dependency|
15
+ minimum_version = calculate_minimum_version(dependency[:version])
16
+ if minimum_version
17
+ dependency.merge(version: "= #{minimum_version}")
18
+ else
19
+ dependency.delete(:version)
20
+ end
21
+ dependency
22
+ end
23
+
24
+ dependencies_minimum_versions.map do |dependency|
25
+ gem_name = dependency[:name]
26
+ next if gem_name == "rails"
27
+
28
+ gem_options = ""
29
+ gem_options << ", '#{dependency[:version]}'" if dependency[:version]
30
+ gem_options <<
31
+ if options[:internal] && dependency[:git]
32
+ ", :git => '#{dependency[:git]}', :ref => '#{dependency[:ref]}', :submodules => true"
33
+ elsif options[:internal] && dependency[:path]
34
+ ", :path => '#{dependency[:path]}'"
35
+ else
36
+ ""
37
+ end
38
+ # do not require the gems here, the rails connector gem needs to do that on it's own.
39
+ # if these gems were loaded without :require => false,
40
+ # the tests would not detect a failure of the rails connector to require them.
41
+ "gem '#{gem_name}'#{gem_options}, :require => false"
42
+ end.join("\n")
43
+ end
44
+
45
+ def self.minimum_version_for(gem, version = nil)
46
+ dependency ||= dependencies.detect do |dep|
47
+ dep[:name] == gem
48
+ end
49
+ version ||= dependency[:version]
50
+ calculate_minimum_version(version)
51
+ end
52
+
53
+ def self.calculate_minimum_version(version)
54
+ gem_requirement = Gem::Requirement.new(version)
55
+
56
+ minimum_requirements = gem_requirement.requirements.select do |requirement|
57
+ ["=", ">=", "~>"].include?(requirement[0])
58
+ end
59
+
60
+ if minimum_requirements.length > 1
61
+ raise "multiple minimum version requirements found for version requirement #{version}"
62
+ elsif minimum_requirements.length < 1
63
+ return nil
64
+ end
65
+
66
+ minimum_requirements[0][1]
67
+ end
68
+ end
@@ -0,0 +1,37 @@
1
+ module RailsConnector
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ desc "Copy Infopark Rails Connector files to your application."
5
+
6
+ # Normally, you'd just call 'source_root' as a class method from here,
7
+ # but we need to glob the dir ourselves. Hence our own method.
8
+ def self.source_root
9
+ @source_root ||= File.expand_path("templates", __dir__)
10
+ end
11
+
12
+ def install_configuration
13
+ copy_file "initializers/rails_connector.rb", "config/initializers/rails_connector.rb"
14
+ template "app/models/obj.rb.erb", "app/models/obj.rb"
15
+ copy_file "local/configuration.rb", "config/local/configuration.rb"
16
+ end
17
+
18
+ def append_asset_manifests
19
+ append_file("app/assets/javascripts/application.js", "//= require infopark_rails_connector")
20
+ gsub_file("app/assets/stylesheets/application.css", "*= require_tree .",
21
+ "*= require_tree .\n *= require infopark_rails_connector")
22
+ end
23
+
24
+ def remove_public_index_html
25
+ remove_file "public/index.html"
26
+ remove_file "app/assets/images/rails.png"
27
+ end
28
+
29
+ def patch_default_application_layout
30
+ gsub_file("app/views/layouts/application.html.erb", %r{</head>},
31
+ "<%= rails_connector_header_tags %>\n</head>")
32
+ gsub_file("app/views/layouts/application.html.erb", %r{</body>},
33
+ "<%= rails_connector_after_content_tags %>\n</body>")
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,5 @@
1
+ # This is the base class for accessing CMS objects.
2
+ # See the documentation for details: http://rubydoc.info/gems/infopark_<%= RailsConnector.platform %>_connector/RailsConnector/BasicObj
3
+ class Obj < RailsConnector::BasicObj
4
+ # Your custom code goes here...
5
+ end
@@ -0,0 +1,2 @@
1
+ # Name of the CMS Fiona Instance to access
2
+ RailsConnector::Configuration.instance_name = "default"
@@ -0,0 +1,2 @@
1
+ # Put your local configuration here.
2
+ # Don't forget to configure your SCM to ignore this file.
@@ -0,0 +1,44 @@
1
+ # @api public
2
+ module ::RailsConnector
3
+ PLATFORM_CLOUD = :cloud
4
+ PLATFORM_FIONA = :fiona
5
+
6
+ # return either <tt>:fiona</tt> or <tt>:cloud</tt> depending on the app's configuration.
7
+ # @return [Symbol]
8
+ def self.platform
9
+ PLATFORM_FIONA
10
+ end
11
+
12
+ def self.platform_cloud?
13
+ false
14
+ end
15
+
16
+ def self.platform_fiona?
17
+ true
18
+ end
19
+ end
20
+
21
+ require "rails_connector/core_extensions"
22
+ require "rails_connector/rack_middlewares"
23
+ require "rails_connector/errors"
24
+ require "rails_connector/fiona_datetime"
25
+ ActiveRecord::Type.register(:fiona_datetime, ::FionaDateTime)
26
+
27
+ # @api public
28
+ module RailsConnector
29
+ def self.autoload_all_sources
30
+ source_files = Dir.glob(File.expand_path("rails_connector/*.rb", __dir__)).map do |file|
31
+ File.basename(file)
32
+ end
33
+
34
+ source_files.each do |file|
35
+ name = file.gsub(".rb", "")
36
+ autoload name.camelcase, "rails_connector/#{name}"
37
+ end
38
+ end
39
+
40
+ autoload_all_sources
41
+ end
42
+
43
+ require "rails_connector/engine" if defined?(Rails)
44
+ require "rails_connector/fiona_engine" if defined?(Rails)
@@ -0,0 +1 @@
1
+ require "rails_connector/meta/eager_loader"
@@ -0,0 +1,3 @@
1
+ # empty implementation for Obj
2
+ # only unsed in case the app does not define Obj itself
3
+ ::Obj = Class.new(RailsConnector::BasicObj)
@@ -0,0 +1,169 @@
1
+ require "mime/types"
2
+ require "ostruct"
3
+
4
+ module RailsConnector
5
+ # The page related and custom data belonging to a CMS object
6
+ #
7
+ # [editor] The login of the current editor of the edited content, if set
8
+ #
9
+ # Any custom Attribute can be accessed directly or via [].
10
+ class AttrDict
11
+ def initialize(object, keys_and_values = {}, defs = {})
12
+ @object = object
13
+ @blob_dict = keys_and_values.symbolize_keys
14
+ @attr_defs = defs.symbolize_keys
15
+ @attr_cache = {}
16
+ end
17
+
18
+ def empty?
19
+ @blob_dict.empty? && @attr_defs.empty?
20
+ end
21
+
22
+ # Returns the title of the content - an HtmlString
23
+ def title
24
+ raw = @blob_dict[:title]
25
+ StringTagging.tag_as_html(raw, self)
26
+ end
27
+
28
+ def sort_keys
29
+ [sort_key1, sort_key2, sort_key3].compact
30
+ end
31
+
32
+ # The body attribute may contain binary data for Obj.binary? or be an HtmlString.
33
+ def body
34
+ if object.binary?
35
+ binary_body&.data
36
+ else
37
+ StringTagging.tag_as_html(textual_body, self)
38
+ end
39
+ end
40
+
41
+ def body_length
42
+ if binary_body
43
+ binary_body.length
44
+ elsif body
45
+ body.length
46
+ else
47
+ 0
48
+ end
49
+ end
50
+
51
+ # Ensures the body data is in a file and returns its file system path.
52
+ def body_data_path
53
+ # TODO: Braucht/will jemand Text gestreamt?
54
+ return nil unless object.binary?
55
+
56
+ binary_body&.path_of_stored_data(object.last_changed)
57
+ end
58
+
59
+ def [](key)
60
+ send key
61
+ end
62
+
63
+ def permitted_groups
64
+ permission_live_server_read
65
+ rescue NoMethodError
66
+ []
67
+ end
68
+
69
+ def permissions
70
+ @permissions ||= OpenStruct.new({ live: permitted_groups })
71
+ end
72
+
73
+ def respond_to?(method_id, include_private = false)
74
+ super || has_attribute(method_id)
75
+ end
76
+
77
+ private
78
+
79
+ attr_reader :object, :blob_dict, :attr_defs
80
+
81
+ delegate :obj_class_def, to: :object, allow_nil: true
82
+
83
+ def textual_body
84
+ return nil if object.binary?
85
+
86
+ blob_dict[:blob]
87
+ end
88
+
89
+ def binary_body
90
+ return nil unless object.binary? && has_attribute(:blob)
91
+
92
+ @binary_body ||= Blob.find(blob)
93
+ rescue RailsConnector::ResourceNotFound
94
+ nil
95
+ end
96
+
97
+ def method_missing(method_id, *args)
98
+ raise NoMethodError, "missing method - #{method_id}" unless args.empty?
99
+
100
+ attribute_value(method_id.to_s)
101
+ rescue UnknownAttributeError
102
+ raise NoMethodError, "missing method - #{method_id}"
103
+ end
104
+
105
+ def attribute_value(key)
106
+ raise UnknownAttributeError unless has_attribute(key)
107
+
108
+ key = key.to_sym
109
+ raw = blob_dict[key]
110
+ @attr_cache[key] ||=
111
+ case type_of(key)
112
+ when :markdown
113
+ StringTagging.tag_as_markdown(raw, self)
114
+ when :html
115
+ StringTagging.tag_as_html(raw.to_s, self)
116
+ when :string, :text
117
+ raw.to_s
118
+ when :date
119
+ DateAttribute.parse(raw) if raw
120
+ when :linklist
121
+ LinkList.new(raw)
122
+ when :multienum
123
+ raw || []
124
+ else
125
+ raw
126
+ end
127
+ end
128
+
129
+ # this attributes are defined by cms
130
+ # but if not set, are not existend in attr_defs
131
+ def predefined_attribute?(key)
132
+ %i(channels sort_key1 sort_key2 sort_key3).include?(key.to_sym)
133
+ end
134
+
135
+ def has_attribute(key)
136
+ key = key.to_sym
137
+ return true if object.class::PREDEFINED_ATTRIBUTES.include?(key.to_s)
138
+
139
+ blob_dict.key?(key) || attr_defs.key?(key) || class_defined_attributes.key?(key)
140
+ end
141
+
142
+ def type_of(key)
143
+ key = key.to_sym
144
+ return :linklist if key == :text_links
145
+ return :multienum if key == :channels
146
+
147
+ type_from_attr_defs(key) || type_from_class_defined_attributes(key)
148
+ end
149
+
150
+ def type_from_attr_defs(key)
151
+ attr_defs[key]["type"].to_sym
152
+ rescue StandardError
153
+ nil
154
+ end
155
+
156
+ def type_from_class_defined_attributes(key)
157
+ class_defined_attributes[key].type.to_sym
158
+ rescue StandardError
159
+ nil
160
+ end
161
+
162
+ def class_defined_attributes
163
+ obj_class_def.try(:custom_attributes) || {}
164
+ end
165
+ end
166
+
167
+ class UnknownAttributeError < StandardError
168
+ end
169
+ end