infopark_reactor 1.10.0.beta → 1.11.0.beta2
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.
- checksums.yaml +4 -4
- data/app/models/rails_connector/abstract_model.rb +7 -0
- data/app/models/rails_connector/abstract_obj.rb +31 -0
- data/app/models/rails_connector/attribute.rb +94 -0
- data/app/models/rails_connector/blob_mapping.rb +12 -0
- data/app/models/rails_connector/channel.rb +41 -0
- data/app/models/rails_connector/content.rb +12 -0
- data/app/models/rails_connector/meta/eager_loader.rb +41 -0
- data/app/models/rails_connector/obj_class.rb +143 -0
- data/app/models/rails_connector/object_with_meta_data.rb +18 -0
- data/infopark_reactor.gemspec +4 -4
- data/lib/generators/cm/migration/USAGE +8 -0
- data/lib/generators/cm/migration/migration_generator.rb +16 -0
- data/lib/generators/cm/migration/templates/template.rb +8 -0
- data/lib/infopark_reactor.rb +35 -1
- data/lib/reactor/attributes.rb +2 -4
- data/lib/reactor/cm/attribute.rb +91 -0
- data/lib/reactor/cm/bridge.rb +50 -0
- data/lib/reactor/cm/channel.rb +18 -0
- data/lib/reactor/cm/editorial_group.rb +23 -0
- data/lib/reactor/cm/group.rb +241 -0
- data/lib/reactor/cm/language.rb +57 -0
- data/lib/reactor/cm/link.rb +136 -0
- data/lib/reactor/cm/live_group.rb +23 -0
- data/lib/reactor/cm/log_entry.rb +64 -0
- data/lib/reactor/cm/missing_credentials.rb +8 -0
- data/lib/reactor/cm/multi_xml_request.rb +102 -0
- data/lib/reactor/cm/obj.rb +544 -0
- data/lib/reactor/cm/obj_class.rb +187 -0
- data/lib/reactor/cm/object_base.rb +165 -0
- data/lib/reactor/cm/permissions.rb +44 -0
- data/lib/reactor/cm/user.rb +139 -0
- data/lib/reactor/cm/workflow.rb +41 -0
- data/lib/reactor/cm/xml_attribute.rb +36 -0
- data/lib/reactor/cm/xml_markup.rb +86 -0
- data/lib/reactor/cm/xml_multi_request_error.rb +10 -0
- data/lib/reactor/cm/xml_request.rb +83 -0
- data/lib/reactor/cm/xml_request_error.rb +11 -0
- data/lib/reactor/cm/xml_response.rb +43 -0
- data/lib/reactor/cm/xml_single_request_error.rb +21 -0
- data/lib/reactor/configuration.rb +8 -0
- data/lib/{engine.rb → reactor/engine.rb} +16 -1
- data/lib/reactor/legacy.rb +3 -3
- data/lib/reactor/link/temporary_link.rb +8 -4
- data/lib/reactor/migration.rb +87 -0
- data/lib/reactor/permission.rb +2 -2
- data/lib/reactor/persistence.rb +14 -12
- data/lib/reactor/plans/common_attribute.rb +33 -0
- data/lib/reactor/plans/common_channel.rb +32 -0
- data/lib/reactor/plans/common_group.rb +45 -0
- data/lib/reactor/plans/common_obj_class.rb +70 -0
- data/lib/reactor/plans/create_attribute.rb +33 -0
- data/lib/reactor/plans/create_channel.rb +24 -0
- data/lib/reactor/plans/create_group.rb +35 -0
- data/lib/reactor/plans/create_obj.rb +49 -0
- data/lib/reactor/plans/create_obj_class.rb +29 -0
- data/lib/reactor/plans/delete_attribute.rb +24 -0
- data/lib/reactor/plans/delete_channel.rb +22 -0
- data/lib/reactor/plans/delete_group.rb +29 -0
- data/lib/reactor/plans/delete_obj.rb +23 -0
- data/lib/reactor/plans/delete_obj_class.rb +23 -0
- data/lib/reactor/plans/prepared.rb +16 -0
- data/lib/reactor/plans/rename_group.rb +33 -0
- data/lib/reactor/plans/rename_obj_class.rb +25 -0
- data/lib/reactor/plans/update_attribute.rb +24 -0
- data/lib/reactor/plans/update_group.rb +31 -0
- data/lib/reactor/plans/update_obj.rb +31 -0
- data/lib/reactor/plans/update_obj_class.rb +27 -0
- data/lib/reactor/rails_connector_meta.rb +144 -0
- data/lib/reactor/tools/migrator.rb +136 -0
- data/lib/reactor/tools/response_handler/base.rb +23 -0
- data/lib/reactor/tools/response_handler/string.rb +20 -0
- data/lib/reactor/tools/response_handler/xml_attribute.rb +53 -0
- data/lib/reactor/tools/smart_xml_logger.rb +70 -0
- data/lib/reactor/tools/sower.rb +90 -0
- data/lib/reactor/tools/uploader.rb +134 -0
- data/lib/reactor/tools/versioner.rb +121 -0
- data/lib/reactor/tools/workflow_generator.rb +1 -1
- data/lib/reactor/tools/xml_attributes.rb +71 -0
- data/lib/reactor/version.rb +1 -1
- data/lib/tasks/cm_migrate.rake +8 -0
- data/lib/tasks/cm_seeds.rake +41 -0
- metadata +82 -13
- data/README.md +0 -186
@@ -0,0 +1,83 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'net/http'
|
3
|
+
require 'reactor/cm/xml_response'
|
4
|
+
require 'reactor/cm/xml_single_request_error'
|
5
|
+
require 'reactor/cm/xml_markup'
|
6
|
+
require 'reactor/tools/smart_xml_logger'
|
7
|
+
|
8
|
+
module Reactor
|
9
|
+
module Cm
|
10
|
+
|
11
|
+
if Rails.env.development? && false
|
12
|
+
#LOGGER = SmartXmlLogger.new(Rails.logger, :debug)
|
13
|
+
LOGGER = SmartXmlLogger.new(Kernel, :puts)
|
14
|
+
else
|
15
|
+
LOGGER = SmartXmlLogger.new(nil) # turn off logging
|
16
|
+
end
|
17
|
+
LOGGER.configure(:request, :xpath => 'cm-payload/cm-request/*', :start_indent => 2)
|
18
|
+
LOGGER.configure(:response, :xpath => 'cm-payload/cm-response/*', :start_indent => 2)
|
19
|
+
|
20
|
+
class XmlRequest
|
21
|
+
|
22
|
+
def self.token(login, instance_secret)
|
23
|
+
Digest::MD5.hexdigest(login + instance_secret)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.prepare
|
27
|
+
access = Configuration::xml_access
|
28
|
+
sanity_check(access)
|
29
|
+
xml = XmlMarkup.new
|
30
|
+
ret = nil
|
31
|
+
xml.instruct!
|
32
|
+
ret = xml.tag!('cm-payload', 'payload-id' =>'abcabc', 'timestamp' => Time.now.getutc.strftime('%Y%m%d%H%M%S'), 'version' => '6.7.3') do
|
33
|
+
xml.tag!('cm-header') do
|
34
|
+
xml.tag!('cm-sender', 'sender-id' => access[:id], 'name' => "ruby-simple-client")
|
35
|
+
xml.tag!('cm-authentication', 'login' => access[:username], 'token' => token(access[:username],access[:secret]))
|
36
|
+
end
|
37
|
+
id = self.generate_id
|
38
|
+
xml.tag!('cm-request', 'request-id' => id) do |xml2|
|
39
|
+
yield xml2 if block_given?
|
40
|
+
end
|
41
|
+
end
|
42
|
+
XmlRequest.new(ret)
|
43
|
+
end
|
44
|
+
|
45
|
+
def execute!
|
46
|
+
access = Configuration::xml_access
|
47
|
+
payload = @xml
|
48
|
+
|
49
|
+
res = Net::HTTP.new(access[:host], access[:port]).start do |http|
|
50
|
+
req = Net::HTTP::Post.new('/xml')
|
51
|
+
Reactor::Cm::LOGGER.log('REQUEST:')
|
52
|
+
Reactor::Cm::LOGGER.log_xml(:request, payload)
|
53
|
+
req.body = payload
|
54
|
+
http.request(req)
|
55
|
+
end
|
56
|
+
Reactor::Cm::LOGGER.log('RESPONSE:')
|
57
|
+
Reactor::Cm::LOGGER.log_xml(:response, res.body)
|
58
|
+
response = XmlResponse.new(res.body)
|
59
|
+
raise XmlSingleRequestError, response unless response.ok?
|
60
|
+
response
|
61
|
+
end
|
62
|
+
|
63
|
+
class << self
|
64
|
+
protected
|
65
|
+
|
66
|
+
def generate_id
|
67
|
+
rand(10000)
|
68
|
+
end
|
69
|
+
|
70
|
+
def sanity_check(access)
|
71
|
+
raise Reactor::Cm::MissingCredentials if access[:username].nil? || access[:username].empty?
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
protected
|
76
|
+
|
77
|
+
def initialize(xml)
|
78
|
+
@xml = xml
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'reactor/tools/response_handler/xml_attribute'
|
3
|
+
require 'rexml/document'
|
4
|
+
|
5
|
+
module Reactor
|
6
|
+
|
7
|
+
module Cm
|
8
|
+
|
9
|
+
class XmlResponse
|
10
|
+
|
11
|
+
attr_reader :xml
|
12
|
+
attr_reader :xml_str
|
13
|
+
|
14
|
+
def initialize(xml)
|
15
|
+
@xml_str = xml
|
16
|
+
@xml = REXML::Document.new(xml)
|
17
|
+
@handler = Reactor::ResponseHandler::XmlAttribute.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def xpath(expr)
|
21
|
+
arr = REXML::XPath.match(@xml, expr)
|
22
|
+
|
23
|
+
return arr.first if arr.length == 1
|
24
|
+
return arr
|
25
|
+
end
|
26
|
+
|
27
|
+
def ok?
|
28
|
+
xp = xpath('//cm-code')
|
29
|
+
|
30
|
+
if xp.is_a?(Array)
|
31
|
+
codes = xp.map { |result| result.attribute('numeric').value }.uniq
|
32
|
+
|
33
|
+
return codes.size == 1 && codes.first == '200'
|
34
|
+
end
|
35
|
+
|
36
|
+
xp.attribute('numeric').value == '200'
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'reactor/cm/xml_request_error'
|
3
|
+
|
4
|
+
module Reactor
|
5
|
+
module Cm
|
6
|
+
class XmlSingleRequestError < XmlRequestError
|
7
|
+
def initialize(response)
|
8
|
+
@response = response
|
9
|
+
super(phrase)
|
10
|
+
end
|
11
|
+
|
12
|
+
def phrase
|
13
|
+
result = @response.xpath('//phrase')
|
14
|
+
result = [result] unless result.kind_of?(Array)
|
15
|
+
|
16
|
+
result.map(&:to_s).join("\n")
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -2,8 +2,23 @@
|
|
2
2
|
module Reactor
|
3
3
|
|
4
4
|
class Engine < Rails::Engine
|
5
|
+
rake_tasks do
|
6
|
+
load "tasks/cm_migrate.rake"
|
7
|
+
load "tasks/cm_seeds.rake"
|
8
|
+
end
|
9
|
+
|
10
|
+
initializer "reactor.upgrade" do
|
11
|
+
if Gem::Specification.find_all_by_name('infopark_reactor_migrations').any? || Gem::Specification.find_all_by_name('infopark_rails_connector_meta').any?
|
12
|
+
raise "Please remove 'infopark_reactor_migrations' and 'infopark_rails_connector_meta' from your Gemfile. They are deprecated and no longer needed."
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
initializer "reactor.rsession" do |app|
|
17
|
+
if app.config.action_dispatch.cookies_serializer && app.config.action_dispatch.cookies_serializer != :marshal
|
18
|
+
Rails.logger.info "Cookie session serializer #{app.config.action_dispatch.cookies_serializer} unsupported. Enforcing :marshal instead."
|
19
|
+
app.config.action_dispatch.cookies_serializer = :marshal
|
20
|
+
end
|
5
21
|
|
6
|
-
initializer "reactor.rsession" do
|
7
22
|
# FIXME: extract !
|
8
23
|
AbstractController::Base.__send__(:define_method, :rsession) do
|
9
24
|
self.session[:rsession] ||= Reactor::Session.instance
|
data/lib/reactor/legacy.rb
CHANGED
@@ -46,9 +46,9 @@ module Reactor
|
|
46
46
|
|
47
47
|
def obj_from_anything(anything)
|
48
48
|
case anything
|
49
|
-
when Fixnum then
|
50
|
-
when String then
|
51
|
-
when
|
49
|
+
when Fixnum then RailsConnector::AbstractObj.find(anything)
|
50
|
+
when String then RailsConnector::AbstractObj.find_by_path(anything)
|
51
|
+
when RailsConnector::AbstractObj then anything
|
52
52
|
else raise ArgumentError, "Link target must Fixnum, String or Obj, but was #{anything.class}."
|
53
53
|
end
|
54
54
|
end
|
@@ -4,6 +4,7 @@ module Reactor
|
|
4
4
|
class TemporaryLink
|
5
5
|
attr_reader :url
|
6
6
|
attr_accessor :title
|
7
|
+
attr_accessor :target
|
7
8
|
|
8
9
|
def external? ; raise TypeError, "This link needs to be persisted to gain any meaningful information" ; end
|
9
10
|
def internal? ; false ; end
|
@@ -14,17 +15,20 @@ module Reactor
|
|
14
15
|
case anything
|
15
16
|
when Hash
|
16
17
|
link_data = anything
|
18
|
+
when Fixnum
|
19
|
+
link_data[:url] = RailsConnector::AbstractObj.find(anything).path
|
17
20
|
else
|
18
|
-
link_data[:
|
21
|
+
link_data[:url] = anything
|
19
22
|
end
|
20
23
|
|
21
|
-
self.url = link_data[:
|
24
|
+
self.url = link_data[:url] || link_data[:destination_object]
|
25
|
+
self.target = link_data[:target] if link_data.key?(:target)
|
22
26
|
self.title = link_data[:title] if link_data.key?(:title)
|
23
27
|
end
|
24
28
|
|
25
29
|
def url=(some_target)
|
26
30
|
@url = case some_target
|
27
|
-
when
|
31
|
+
when RailsConnector::AbstractObj
|
28
32
|
@destination_object = some_target
|
29
33
|
some_target.path
|
30
34
|
else
|
@@ -33,7 +37,7 @@ module Reactor
|
|
33
37
|
end
|
34
38
|
|
35
39
|
def destination_object
|
36
|
-
@destination_object ||=
|
40
|
+
@destination_object ||= RailsConnector::AbstractObj.find_by_path(url)
|
37
41
|
end
|
38
42
|
|
39
43
|
def id
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'reactor/plans/create_obj'
|
3
|
+
require 'reactor/plans/delete_obj'
|
4
|
+
require 'reactor/plans/update_obj'
|
5
|
+
require 'reactor/plans/create_obj_class'
|
6
|
+
require 'reactor/plans/delete_obj_class'
|
7
|
+
require 'reactor/plans/update_obj_class'
|
8
|
+
require 'reactor/plans/rename_obj_class'
|
9
|
+
require 'reactor/plans/create_attribute'
|
10
|
+
require 'reactor/plans/delete_attribute'
|
11
|
+
require 'reactor/plans/update_attribute'
|
12
|
+
require 'reactor/plans/create_group'
|
13
|
+
require 'reactor/plans/update_group'
|
14
|
+
require 'reactor/plans/delete_group'
|
15
|
+
require 'reactor/plans/rename_group'
|
16
|
+
require 'reactor/plans/create_channel'
|
17
|
+
require 'reactor/plans/delete_channel'
|
18
|
+
|
19
|
+
module Reactor
|
20
|
+
class Migration
|
21
|
+
METHODS = {
|
22
|
+
:create_obj => Plans::CreateObj,
|
23
|
+
:delete_obj => Plans::DeleteObj,
|
24
|
+
:update_obj => Plans::UpdateObj,
|
25
|
+
:create_class => Plans::CreateObjClass,
|
26
|
+
:delete_class => Plans::DeleteObjClass,
|
27
|
+
:update_class => Plans::UpdateObjClass,
|
28
|
+
:rename_class => Plans::RenameObjClass,
|
29
|
+
:create_attribute => Plans::CreateAttribute,
|
30
|
+
:delete_attribute => Plans::DeleteAttribute,
|
31
|
+
:update_attribute => Plans::UpdateAttribute,
|
32
|
+
:create_group => Plans::CreateGroup,
|
33
|
+
:delete_group => Plans::DeleteGroup,
|
34
|
+
:update_group => Plans::UpdateGroup,
|
35
|
+
:rename_group => Plans::RenameGroup,
|
36
|
+
:create_channel => Plans::CreateChannel,
|
37
|
+
:delete_channel => Plans::DeleteChannel
|
38
|
+
}
|
39
|
+
|
40
|
+
def self.method_missing(name, *args, &block)
|
41
|
+
if METHODS.key? name.to_sym then
|
42
|
+
instance = init(name,*args)
|
43
|
+
plan(instance,&block)
|
44
|
+
prepare(instance)
|
45
|
+
migrate(instance)
|
46
|
+
else
|
47
|
+
super(name, *args, &block)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.respond_to?(name)
|
52
|
+
METHODS.key?(name.to_sym) || super(name)
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.contains(*args)
|
56
|
+
@contained ||= []
|
57
|
+
args.flatten.each do |arg|
|
58
|
+
migration_num = arg.to_i.to_s
|
59
|
+
@contained << migration_num
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.contained
|
64
|
+
@contained || []
|
65
|
+
end
|
66
|
+
|
67
|
+
protected
|
68
|
+
def self.init(name,*args)
|
69
|
+
METHODS[name.to_sym].new(*args)
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.plan(instance,&block)
|
73
|
+
instance.instance_eval(&block) if block_given?
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.prepare(instance)
|
77
|
+
instance.prepare! if instance.respond_to? :prepare!
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.migrate(instance)
|
81
|
+
instance.migrate!
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
def initialize ; end
|
86
|
+
end
|
87
|
+
end
|
data/lib/reactor/permission.rb
CHANGED
@@ -98,8 +98,8 @@ module Reactor
|
|
98
98
|
end
|
99
99
|
|
100
100
|
def ensure_create_permission_granted(obj_id)
|
101
|
-
raise RuntimeError, "Permission check for object with id=#{obj_id.inspect} which does not exist" unless
|
102
|
-
raise Reactor::NotPermitted, 'Obj lacks neccessary permissions for creation' unless
|
101
|
+
raise RuntimeError, "Permission check for object with id=#{obj_id.inspect} which does not exist" unless RailsConnector::AbstractObj.exists?(obj_id)
|
102
|
+
raise Reactor::NotPermitted, 'Obj lacks neccessary permissions for creation' unless RailsConnector::AbstractObj.find(obj_id).permission.create_children?
|
103
103
|
return true
|
104
104
|
end
|
105
105
|
|
data/lib/reactor/persistence.rb
CHANGED
@@ -177,12 +177,12 @@ module Reactor
|
|
177
177
|
# any other reload methods (neither from RailsConnector nor from ActiveRecord)
|
178
178
|
# but tries to mimmic their behaviour.
|
179
179
|
def reload(options = nil)
|
180
|
-
|
180
|
+
RailsConnector::AbstractObj.uncached do
|
181
181
|
#super # Throws RecordNotFound when changing obj_class
|
182
182
|
# AR reload
|
183
183
|
clear_aggregation_cache
|
184
184
|
clear_association_cache
|
185
|
-
fresh_object =
|
185
|
+
fresh_object = RailsConnector::AbstractObj.find(self.id, options)
|
186
186
|
@attributes = fresh_object.instance_variable_get('@attributes')
|
187
187
|
@attributes_cache = {}
|
188
188
|
# RC reload
|
@@ -231,7 +231,7 @@ module Reactor
|
|
231
231
|
super(attributes)
|
232
232
|
end
|
233
233
|
end
|
234
|
-
elsif Reactor.rails3_1? || Reactor.rails3_2? || Reactor.rails4_0?
|
234
|
+
elsif Reactor.rails3_1? || Reactor.rails3_2? || Reactor.rails4_0? || Reactor.rails4_1?
|
235
235
|
# It should excactly match ActiveRecord::Base.new in it's behavior
|
236
236
|
# @see ActiveRecord::Base.new
|
237
237
|
def initialize(attributes = nil, options={}, &block)
|
@@ -326,7 +326,7 @@ module Reactor
|
|
326
326
|
new_links = {}.tap do |result|
|
327
327
|
linklists.map do |field|
|
328
328
|
result[field] = self.__read_link(field).map do |l|
|
329
|
-
{:link_id => l.id, :title => l.title, :destination_url => (l.internal? ? l.destination_object.path : l.url)}
|
329
|
+
{:link_id => l.id, :title => l.title, :destination_url => (l.internal? ? l.destination_object.path : l.url), :target => l.target}
|
330
330
|
end
|
331
331
|
end
|
332
332
|
end
|
@@ -339,7 +339,7 @@ module Reactor
|
|
339
339
|
links_to_remove.clear
|
340
340
|
links_to_set.clear
|
341
341
|
|
342
|
-
copy =
|
342
|
+
copy = RailsConnector::AbstractObj.uncached { RailsConnector::AbstractObj.find(self.id) }
|
343
343
|
|
344
344
|
linklists.each do |linklist|
|
345
345
|
original_link_ids = copy.__read_link(linklist).original_link_ids
|
@@ -371,6 +371,8 @@ module Reactor
|
|
371
371
|
end
|
372
372
|
end
|
373
373
|
end
|
374
|
+
|
375
|
+
self.class.connection.clear_query_cache
|
374
376
|
end
|
375
377
|
|
376
378
|
def __read_link(name)
|
@@ -385,7 +387,7 @@ module Reactor
|
|
385
387
|
# @param [true, false] recursive set to true to also copy the underlying subtree
|
386
388
|
# @param [String] new_name gives the object new name
|
387
389
|
def copy(new_parent, recursive = false, new_name = nil)
|
388
|
-
self.id = crul_obj.copy(
|
390
|
+
self.id = crul_obj.copy(RailsConnector::AbstractObj.path_from_anything(new_parent), recursive, new_name)
|
389
391
|
#self.reload
|
390
392
|
resolve_refs #?
|
391
393
|
self.id
|
@@ -412,8 +414,8 @@ module Reactor
|
|
412
414
|
end
|
413
415
|
end
|
414
416
|
|
415
|
-
if Reactor.rails4_0?
|
416
|
-
if Reactor.rails4_0_ge6?
|
417
|
+
if Reactor.rails4_0? || Reactor.rails4_1?
|
418
|
+
if Reactor.rails4_0_ge6? || Reactor.rails4_1?
|
417
419
|
alias_method :_create_record, :create
|
418
420
|
else
|
419
421
|
alias_method :create_record, :create
|
@@ -428,8 +430,8 @@ module Reactor
|
|
428
430
|
end
|
429
431
|
end
|
430
432
|
|
431
|
-
if Reactor.rails4_0?
|
432
|
-
if Reactor.rails4_0_ge6?
|
433
|
+
if Reactor.rails4_0? || Reactor.rails4_1?
|
434
|
+
if Reactor.rails4_0_ge6? || Reactor.rails4_1?
|
433
435
|
alias_method :_update_record, :update
|
434
436
|
else
|
435
437
|
alias_method :update_record, :update
|
@@ -482,7 +484,7 @@ module Reactor
|
|
482
484
|
new_name
|
483
485
|
end
|
484
486
|
|
485
|
-
if Reactor.rails4_0?
|
487
|
+
if Reactor.rails4_0? || Reactor.rails4_1?
|
486
488
|
# Detect the subclass from the inheritance column of attrs. If the inheritance column value
|
487
489
|
# is not self or a valid subclass, raises ActiveRecord::SubclassNotFound
|
488
490
|
# If this is a StrongParameters hash, and access to inheritance_column is not permitted,
|
@@ -503,7 +505,7 @@ module Reactor
|
|
503
505
|
end
|
504
506
|
end
|
505
507
|
|
506
|
-
if Reactor.rails4_0_ge6?
|
508
|
+
if Reactor.rails4_0_ge6? || Reactor.rails4_1?
|
507
509
|
alias_method :subclass_from_attributes, :subclass_from_attrs
|
508
510
|
remove_method :subclass_from_attrs
|
509
511
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Reactor
|
3
|
+
module Plans
|
4
|
+
class CommonAttribute
|
5
|
+
include Prepared
|
6
|
+
|
7
|
+
ALLOWED_PARAMS = [:callback, :helpText, :maxSize, :minSize,
|
8
|
+
:title, :values]
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@params = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def set(key,value)
|
15
|
+
@params[key.to_sym] = value
|
16
|
+
end
|
17
|
+
|
18
|
+
def migrate!
|
19
|
+
raise "#{self.class.name} did not implement migrate!"
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
def prepare_params!(attribute=nil)
|
24
|
+
@params.keys.each{|k| error("unknown parameter: #{k}") unless ALLOWED_PARAMS.include? k}
|
25
|
+
end
|
26
|
+
|
27
|
+
def migrate_params!(attribute)
|
28
|
+
@params.each{|k,v|attribute.set(k,v)}
|
29
|
+
attribute.save!
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Reactor
|
3
|
+
module Plans
|
4
|
+
class CommonChannel
|
5
|
+
include Prepared
|
6
|
+
|
7
|
+
ALLOWED_PARAMS = [:title]
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@params = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def set(key,value)
|
14
|
+
@params[key.to_sym] = value
|
15
|
+
end
|
16
|
+
|
17
|
+
def migrate!
|
18
|
+
raise "#{self.class.name} did not implement migrate!"
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
def prepare_params!(channel=nil)
|
23
|
+
@params.keys.each{|k| error("unknown parameter: #{k}") unless ALLOWED_PARAMS.include? k}
|
24
|
+
end
|
25
|
+
|
26
|
+
def migrate_params!(channel)
|
27
|
+
@params.each{|k,v|channel.send(:"#{k}=",v)}
|
28
|
+
channel.save!
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Reactor
|
3
|
+
|
4
|
+
module Plans
|
5
|
+
|
6
|
+
class CommonGroup
|
7
|
+
|
8
|
+
include Prepared
|
9
|
+
|
10
|
+
ALLOWED_PARAMS = [
|
11
|
+
:users,
|
12
|
+
:global_permissions,
|
13
|
+
:real_name,
|
14
|
+
:owner,
|
15
|
+
]
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@params = {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def set(key, value)
|
22
|
+
@params[key.to_sym] = value
|
23
|
+
end
|
24
|
+
|
25
|
+
def migrate!
|
26
|
+
raise "#{self.class.name} did not implement migrate!"
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
|
31
|
+
def prepare_params!(group = nil)
|
32
|
+
@params.keys.each { |key| error("unknown parameter: #{key}") unless ALLOWED_PARAMS.include?(key) }
|
33
|
+
end
|
34
|
+
|
35
|
+
def migrate_params!(group)
|
36
|
+
@params.each { |key, value| group.send("#{key}=", value) }
|
37
|
+
|
38
|
+
group.save!
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Reactor
|
3
|
+
module Plans
|
4
|
+
class CommonObjClass
|
5
|
+
include Prepared
|
6
|
+
|
7
|
+
ALLOWED_PARAMS = [:completionCheck, :isEnabled, :recordSetCallback, :title,
|
8
|
+
:validContentTypes, :workflowModification]
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@take_attrs = []
|
12
|
+
@drop_attrs = []
|
13
|
+
@mandatory_attrs = []
|
14
|
+
@mandatory_drop_attrs = []
|
15
|
+
@preset_attrs = {}
|
16
|
+
@params = {}
|
17
|
+
@params_options = {}
|
18
|
+
end
|
19
|
+
|
20
|
+
def set(key, value, options={})
|
21
|
+
@params_options[key.to_sym] = options
|
22
|
+
@params[key.to_sym] = value
|
23
|
+
end
|
24
|
+
|
25
|
+
def take(attr_name, opts={})
|
26
|
+
attr_name = attr_name.to_s
|
27
|
+
@take_attrs << attr_name
|
28
|
+
@drop_attrs.delete(attr_name)
|
29
|
+
@mandatory_attrs << attr_name if opts[:mandatory] == true
|
30
|
+
@mandatory_drop_attrs << attr_name if opts[:mandatory] == false
|
31
|
+
@preset_attrs[attr_name] = opts[:preset] if opts.key? :preset
|
32
|
+
end
|
33
|
+
|
34
|
+
def drop(attr_name, opts={})
|
35
|
+
attr_name = attr_name.to_s
|
36
|
+
@drop_attrs << attr_name
|
37
|
+
@take_attrs.delete(attr_name)
|
38
|
+
@mandatory_attrs.delete(attr_name)
|
39
|
+
@preset_attrs.delete(attr_name)
|
40
|
+
end
|
41
|
+
|
42
|
+
def migrate!
|
43
|
+
raise "#{self.class.name} did not implement migrate!"
|
44
|
+
end
|
45
|
+
|
46
|
+
protected
|
47
|
+
def prepare_attrs!(klass=nil)
|
48
|
+
@take_attrs.each do |attr|
|
49
|
+
error("attribute doesn't exist #{attr}") unless Reactor::Cm::Attribute.exists?(attr)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def prepare_params!(klass=nil)
|
54
|
+
@params.keys.each{|k| error("unknown parameter: #{k}") unless ALLOWED_PARAMS.include? k}
|
55
|
+
end
|
56
|
+
|
57
|
+
def migrate_attrs!(klass)
|
58
|
+
attrs = (klass.attributes + @take_attrs).uniq - @drop_attrs
|
59
|
+
klass.attributes = attrs
|
60
|
+
klass.mandatory_attributes = ((klass.mandatory_attributes + @mandatory_attrs).uniq - @drop_attrs - @mandatory_drop_attrs)
|
61
|
+
end
|
62
|
+
|
63
|
+
def migrate_params!(klass)
|
64
|
+
@params.each{|k,v|klass.set(k,v,@params_options[k])}
|
65
|
+
klass.preset_attributes.merge(@preset_attrs).each{|k,v|klass.preset(k,v)}
|
66
|
+
klass.save!
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'reactor/plans/common_attribute'
|
3
|
+
|
4
|
+
module Reactor
|
5
|
+
module Plans
|
6
|
+
class CreateAttribute < CommonAttribute
|
7
|
+
def initialize(*args)
|
8
|
+
super()
|
9
|
+
(name, type), options = separate_arguments(*args)
|
10
|
+
@name = name || options[:name]
|
11
|
+
@type = type || options[:type]
|
12
|
+
# Default values for attributes:
|
13
|
+
# isSearchableInCM: false
|
14
|
+
# isSearchableInTE: false
|
15
|
+
set(:isSearchableInCM, 0)
|
16
|
+
set(:isSearchableInTE, 0)
|
17
|
+
end
|
18
|
+
|
19
|
+
def prepare!
|
20
|
+
error("name ist nil") if @name.nil?
|
21
|
+
error("type is nil") if @type.nil?
|
22
|
+
# TODO: Type check
|
23
|
+
prepare_params!(nil)
|
24
|
+
end
|
25
|
+
|
26
|
+
def migrate!
|
27
|
+
attrib = Reactor::Cm::Attribute.create(@name, @type)
|
28
|
+
migrate_params!(attrib)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'reactor/cm/channel'
|
3
|
+
require 'reactor/plans/common_channel'
|
4
|
+
|
5
|
+
module Reactor
|
6
|
+
module Plans
|
7
|
+
class CreateChannel < CommonChannel
|
8
|
+
def initialize(*args)
|
9
|
+
super()
|
10
|
+
(name, x), options = separate_arguments(*args)
|
11
|
+
@name = name || options[:name]
|
12
|
+
end
|
13
|
+
|
14
|
+
def prepare!
|
15
|
+
error("name is nil") if @name.nil?
|
16
|
+
end
|
17
|
+
|
18
|
+
def migrate!
|
19
|
+
channel = Reactor::Cm::Channel.create(@name)
|
20
|
+
migrate_params!(channel)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|