infopark_cloud_connector 6.8.0.beta.200.621.4c8e1b0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +71 -0
- data/lib/infopark_cloud_connector.rb +19 -0
- data/lib/rails_connector/attribute.rb +35 -0
- data/lib/rails_connector/blob.rb +66 -0
- data/lib/rails_connector/cache.rb +35 -0
- data/lib/rails_connector/cache_middleware.rb +17 -0
- data/lib/rails_connector/chain.rb +177 -0
- data/lib/rails_connector/cms_base_model.rb +61 -0
- data/lib/rails_connector/content_cache.rb +24 -0
- data/lib/rails_connector/controller_runtime.rb +35 -0
- data/lib/rails_connector/couch_blob.rb +44 -0
- data/lib/rails_connector/couchdb_views_source_path.rb +7 -0
- data/lib/rails_connector/date_attribute.rb +28 -0
- data/lib/rails_connector/default_search_request.rb +6 -0
- data/lib/rails_connector/elasticsearch_request.rb +78 -0
- data/lib/rails_connector/errors.rb +9 -0
- data/lib/rails_connector/link.rb +135 -0
- data/lib/rails_connector/log_subscriber.rb +29 -0
- data/lib/rails_connector/named_link.rb +72 -0
- data/lib/rails_connector/obj.rb +622 -0
- data/lib/rails_connector/obj_body.rb +60 -0
- data/lib/rails_connector/obj_class.rb +35 -0
- data/lib/rails_connector/path_conversion.rb +17 -0
- data/lib/rails_connector/permission.rb +39 -0
- data/lib/rails_connector/rack_middlewares.rb +6 -0
- data/lib/rails_connector/s3_blob.rb +67 -0
- data/lib/rails_connector/version.rb +39 -0
- data/lib/rails_connector/workspace.rb +139 -0
- data/lib/rails_connector/workspace_label.rb +10 -0
- data/lib/rails_connector/workspace_selection_middleware.rb +45 -0
- metadata +169 -0
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'restclient'
|
3
|
+
|
4
|
+
module RailsConnector
|
5
|
+
|
6
|
+
# This class provides a basic implementation for accessing a elasticsearch server.
|
7
|
+
# It can be activated by making it the superclass of SearchRequest.
|
8
|
+
# It should be customized by subclassing.
|
9
|
+
class ElasticsearchRequest
|
10
|
+
# Takes +query_string+ and +options+ for accessing Elasticsearch.
|
11
|
+
#
|
12
|
+
# +options+ is a hash and may include:
|
13
|
+
#
|
14
|
+
# <tt>:limit</tt>:: The maximum number of hits
|
15
|
+
# <tt>:offset</tt>:: The search offset
|
16
|
+
# <tt>:url</tt>:: A non-default Elasticsearch index URL
|
17
|
+
def initialize(query_string, options = {})
|
18
|
+
@query_string = query_string
|
19
|
+
@options = Configuration.search_options.merge(options)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Accesses Elasticsearch using #query and fetches search hits.
|
23
|
+
def fetch_hits
|
24
|
+
the_request = request_body
|
25
|
+
(the_request[:fields] ||= []) << :obj_id
|
26
|
+
the_request[:fields].uniq!
|
27
|
+
the_request[:from] = @options[:offset] if @options[:offset]
|
28
|
+
the_request[:size] = @options[:limit] if @options[:limit]
|
29
|
+
|
30
|
+
hits = JSON.parse(
|
31
|
+
RestClient::Request.execute(:method => :get, :url => url, :payload => the_request.to_json)
|
32
|
+
)['hits']
|
33
|
+
|
34
|
+
result = SES::SearchResult.new(hits['total'])
|
35
|
+
hits['hits'].each do |hit|
|
36
|
+
result << SES::Hit.new(hit['fields']['obj_id'], hit['_score'] / hits['max_score'], hit)
|
37
|
+
end
|
38
|
+
result
|
39
|
+
end
|
40
|
+
|
41
|
+
def request_body
|
42
|
+
{
|
43
|
+
:query => query,
|
44
|
+
:filter => filter
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
def query
|
49
|
+
{
|
50
|
+
:query_string => {
|
51
|
+
:query => @query_string.
|
52
|
+
gsub(/[^\w\*]/, ' ').
|
53
|
+
gsub(/\b(and|or|not)\b/i, '').
|
54
|
+
gsub(/\s+/, ' ').strip
|
55
|
+
}
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
def filter
|
60
|
+
now = Time.now
|
61
|
+
{
|
62
|
+
:and => [
|
63
|
+
{:not => {:term => {:obj_type => :image}}},
|
64
|
+
{:not => {:term => {:suppress_export => true}}},
|
65
|
+
{:not => {:range => {:valid_from => {:from => now.succ.to_iso, :to => '*'}}}},
|
66
|
+
{:not => {:range => {:valid_until => {:from => '*', :to => now.to_iso}}}}
|
67
|
+
]
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def url
|
74
|
+
"#{@options[:url]}/_search"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
module RailsConnector
|
2
|
+
# This class provides an interfaces for handling CMS Links.
|
3
|
+
# To format a link for rendering in an html page, use the +cms_path+ or +cms_url+ methods.
|
4
|
+
class Link
|
5
|
+
|
6
|
+
extend ActiveModel::Naming
|
7
|
+
|
8
|
+
def initialize(link_data, destination_object = nil) #:nodoc:
|
9
|
+
@link_data = link_data.symbolize_keys
|
10
|
+
@destination_object = destination_object
|
11
|
+
end
|
12
|
+
|
13
|
+
# The link's external url. Only available for external links.
|
14
|
+
# Warning: Do not output the url directly unless you know what you are doing.
|
15
|
+
# Normally you want to use the +cms_path+ or +cms_url+ methods to format a link.
|
16
|
+
def url
|
17
|
+
@link_data[:url]
|
18
|
+
end
|
19
|
+
|
20
|
+
# The link's title.
|
21
|
+
def title
|
22
|
+
@link_data[:title]
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns the link's query string as in "index.html?query_string".
|
26
|
+
# See RFC3986 for details (http://www.ietf.org/rfc/rfc3986.txt).
|
27
|
+
def query
|
28
|
+
@link_data[:query]
|
29
|
+
end
|
30
|
+
|
31
|
+
# Depricated: use Link#query instead.
|
32
|
+
# Returns the link's query string as in "index.html?query_string".
|
33
|
+
# See RFC3986 for details (http://www.ietf.org/rfc/rfc3986.txt).
|
34
|
+
def search
|
35
|
+
query
|
36
|
+
end
|
37
|
+
|
38
|
+
# Returns the link's anchor as in "index.html#anchor".
|
39
|
+
# See RFC3986 for details (http://www.ietf.org/rfc/rfc3986.txt).
|
40
|
+
def fragment
|
41
|
+
@link_data[:fragment]
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns the browser window or browser frame to be used as a target for this link.
|
45
|
+
# Example: Links that should be opened in a new window will return "_blank" as their target.
|
46
|
+
def target
|
47
|
+
@link_data[:target]
|
48
|
+
end
|
49
|
+
|
50
|
+
def id #:nodoc:
|
51
|
+
@link_data[:link_id]
|
52
|
+
end
|
53
|
+
|
54
|
+
def tag_name # :nodoc:
|
55
|
+
@link_data[:tag_name]
|
56
|
+
end
|
57
|
+
|
58
|
+
def markdown_type # :nodoc:
|
59
|
+
@link_data[:markdown_type]
|
60
|
+
end
|
61
|
+
|
62
|
+
def markdown? # :nodoc:
|
63
|
+
'markdown' == @link_data[:source_format]
|
64
|
+
end
|
65
|
+
|
66
|
+
# Returns the file extension (e.g. zip, pdf) of this link's (internal or external) target.
|
67
|
+
# Returns an empty string if the file extension is can not be determined.
|
68
|
+
def file_extension
|
69
|
+
if internal?
|
70
|
+
destination_object ? destination_object.file_extension : ""
|
71
|
+
else
|
72
|
+
path = URI.parse(url).path rescue nil
|
73
|
+
path.blank? ? "" : File.extname(path)[1..-1] || ""
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# Returns the id of the Links' destination_object.
|
78
|
+
def destination_object_id
|
79
|
+
destination
|
80
|
+
end
|
81
|
+
|
82
|
+
# Returns the title of this Link if it is set.
|
83
|
+
# Otherwise it returns the display_title of the destination object for internal Links
|
84
|
+
# or the URL for external Links.
|
85
|
+
def display_title
|
86
|
+
dt = title
|
87
|
+
dt = destination_object.display_title if dt.blank? && !external?
|
88
|
+
dt = url if dt.blank?
|
89
|
+
dt
|
90
|
+
end
|
91
|
+
|
92
|
+
# Returns true this Link links to a CMS Object.
|
93
|
+
def internal?
|
94
|
+
url.nil?
|
95
|
+
end
|
96
|
+
|
97
|
+
# Returns true if this Link links to an external URL.
|
98
|
+
def external?
|
99
|
+
!internal?
|
100
|
+
end
|
101
|
+
|
102
|
+
# An internal Link is active if it's destination object is active.
|
103
|
+
# An external Link is always active.
|
104
|
+
def active?
|
105
|
+
external? || (destination_object && destination_object.active?)
|
106
|
+
end
|
107
|
+
|
108
|
+
def external_prefix? #:nodoc:
|
109
|
+
nil != (url =~ /\s?external:/)
|
110
|
+
end
|
111
|
+
|
112
|
+
def resolved? #:nodoc:
|
113
|
+
external? || resolved_internal?
|
114
|
+
end
|
115
|
+
|
116
|
+
# Returns the destination object (+Obj+) of this Link.
|
117
|
+
def destination_object
|
118
|
+
@destination_object ||= Obj.find(destination) if resolved_internal?
|
119
|
+
end
|
120
|
+
|
121
|
+
def to_liquid # :nodoc:
|
122
|
+
LiquidSupport::LinkDrop.new(self)
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
def resolved_internal?
|
128
|
+
internal? && !destination.nil?
|
129
|
+
end
|
130
|
+
|
131
|
+
def destination
|
132
|
+
@link_data[:destination]
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module RailsConnector
|
2
|
+
class LogSubscriber < ActiveSupport::LogSubscriber
|
3
|
+
def self.runtime=(value)
|
4
|
+
Thread.current["rails_connector_cms_load_runtime"] = value
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.runtime
|
8
|
+
Thread.current["rails_connector_cms_load_runtime"] ||= 0
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.reset_runtime
|
12
|
+
rt, self.runtime = runtime, 0
|
13
|
+
rt
|
14
|
+
end
|
15
|
+
|
16
|
+
def cms_load(event)
|
17
|
+
self.class.runtime += event.duration
|
18
|
+
return unless logger.debug?
|
19
|
+
|
20
|
+
name = '%s (%.1fms)' % [event.payload[:name], event.duration]
|
21
|
+
debug " #{name} #{event.payload[:index]} #{event.payload[:keys].inspect}"
|
22
|
+
end
|
23
|
+
|
24
|
+
def logger
|
25
|
+
Rails.logger
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module RailsConnector
|
2
|
+
|
3
|
+
# This class provides methods used to retrieve objects from CMS based an entry
|
4
|
+
# in CMS of the obj_class <tt>NamedLink</tt>.
|
5
|
+
|
6
|
+
class NamedLink < Obj
|
7
|
+
|
8
|
+
class NotFound < StandardError
|
9
|
+
end
|
10
|
+
|
11
|
+
@@named_links_cache = nil
|
12
|
+
|
13
|
+
# Generates a cache of named links based on the CMS objects related link list.
|
14
|
+
# Raises exceptions if zero or more than one objects have this obj_class
|
15
|
+
def self.generate_named_links_cache #:nodoc:
|
16
|
+
return if @@named_links_cache
|
17
|
+
|
18
|
+
found_object = find_named_link_obj
|
19
|
+
if found_object.nil?
|
20
|
+
raise NotFound, "Couldn't find NamedLink CMS Object!"
|
21
|
+
else
|
22
|
+
@@named_links_cache = found_object.
|
23
|
+
related_links.
|
24
|
+
flatten(1).
|
25
|
+
each_with_object({}) do |link_obj, temp|
|
26
|
+
temp[link_obj.title] = link_obj.destination_object
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
return nil
|
31
|
+
end
|
32
|
+
|
33
|
+
# This method will be called to retrieve the NamedLink Obj.
|
34
|
+
# By default it will look for the Obj at the path "_named_links".
|
35
|
+
# Overwrite this method only if you know what you are doing.
|
36
|
+
def self.find_named_link_obj
|
37
|
+
Obj.find_by_path("/_named_links")
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.cache_expiry_time=(value) #:nodoc:
|
41
|
+
raise "NamedLink.cache_expiry_time is deprecated. NamedLink no longer has a separate cache."
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.cache_expired? #:nodoc:
|
45
|
+
true
|
46
|
+
end
|
47
|
+
|
48
|
+
# Returns the CMS object mapped to the given title or nil.
|
49
|
+
# The title can be a string of symbol.
|
50
|
+
def self.get_object(title, options = {})
|
51
|
+
object = named_links[title.to_s]
|
52
|
+
raise NotFound, "The NamedLink '#{title.to_s}' does not exist" if object.nil?
|
53
|
+
object
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.reset_cache #:nodoc:
|
57
|
+
@@named_links_cache = nil
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.named_links #:nodoc:
|
61
|
+
reset_cache if cache_expired?
|
62
|
+
generate_named_links_cache unless named_links_cache
|
63
|
+
named_links_cache
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.named_links_cache #:nodoc:
|
67
|
+
@@named_links_cache
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|