ooor 1.2.8 → 1.2.9
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/app/models/common_service.rb +26 -0
- data/lib/app/models/db_service.rb +26 -0
- data/lib/app/models/open_object_resource.rb +42 -21
- data/lib/app/models/uml.rb +1 -1
- data/lib/app/ui/action_window.rb +11 -0
- data/lib/app/ui/client_base.rb +39 -0
- data/lib/app/ui/form_model.rb +81 -0
- data/lib/app/ui/menu.rb +16 -0
- data/lib/ooor.rb +35 -40
- metadata +10 -5
- data/lib/app/models/open_object_ui.rb +0 -45
@@ -0,0 +1,26 @@
|
|
1
|
+
#proxies all 'common' class of OpenERP server/bin/service/web_service.py properly
|
2
|
+
module CommonService
|
3
|
+
def global_login(user, password)
|
4
|
+
@config[:username] = user
|
5
|
+
@config[:password] = password
|
6
|
+
client = OpenObjectResource.client(@base_url + "/common")
|
7
|
+
@config[:user_id] = OpenObjectResource.try_with_pretty_error_log { client.call("login", @config[:database], user, password) }
|
8
|
+
rescue Exception => error
|
9
|
+
@logger.error """login to OpenERP server failed:
|
10
|
+
#{error.inspect}
|
11
|
+
Are your sure the server is started? Are your login parameters correct? Can this server ping the OpenERP server?
|
12
|
+
login XML/RPC url was #{@config[:url].gsub(/\/$/,'') + "/common"}"""
|
13
|
+
raise
|
14
|
+
end
|
15
|
+
|
16
|
+
def login(user, password); global_login(user, password); end
|
17
|
+
|
18
|
+
#we generate methods handles for use in auto-completion tools such as jirb_swing
|
19
|
+
[:ir_get, :ir_set, :ir_del, :about, :logout, :timezone_get, :get_available_updates, :get_migration_scripts, :get_server_environment, :login_message, :check_connectivity].each do |meth|
|
20
|
+
self.instance_eval do
|
21
|
+
define_method meth do |*args|
|
22
|
+
OpenObjectResource.try_with_pretty_error_log { OpenObjectResource.client(@base_url + "/common").call(meth.to_s, *args) }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#proxies all 'db' class of OpenERP server/bin/service/web_service.py properly
|
2
|
+
module DbService
|
3
|
+
def create(password=@config[:db_password], db_name='ooor_db', demo=true, lang='en-US', user_password=@config[:password] || 'admin')
|
4
|
+
process_id = OpenObjectResource.try_with_pretty_error_log { OpenObjectResource.client(@base_url + "/db").call("create", password, db_name, demo, lang, user_password) }
|
5
|
+
@config[:database] = db_name
|
6
|
+
@config[:username] = user_password
|
7
|
+
while get_progress('admin', process_id) == [0, []]
|
8
|
+
@logger.info "..."
|
9
|
+
sleep(0.5)
|
10
|
+
end
|
11
|
+
load_models()
|
12
|
+
end
|
13
|
+
|
14
|
+
def drop(password=@config[:db_password], db_name='ooor_db')
|
15
|
+
OpenObjectResource.try_with_pretty_error_log { OpenObjectResource.client(@base_url + "/db").call("drop", password, db_name) }
|
16
|
+
end
|
17
|
+
|
18
|
+
#we generate methods handles for use in auto-completion tools such as jirb_swing
|
19
|
+
[:get_progress, :dump, :restore, :rename, :db_exist, :list, :change_admin_password, :list_lang, :server_version, :migrate_databases].each do |meth|
|
20
|
+
self.instance_eval do
|
21
|
+
define_method meth do |*args|
|
22
|
+
OpenObjectResource.try_with_pretty_error_log { OpenObjectResource.client(@base_url + "/db").call(meth.to_s, *args) }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'xmlrpc/client'
|
2
|
+
require 'rubygems'
|
2
3
|
require 'active_resource'
|
3
|
-
require 'app/
|
4
|
+
require 'app/ui/form_model'
|
4
5
|
require 'app/models/uml'
|
5
6
|
require 'set'
|
6
7
|
|
@@ -14,8 +15,8 @@ class OpenObjectResource < ActiveResource::Base
|
|
14
15
|
|
15
16
|
cattr_accessor :logger
|
16
17
|
attr_accessor :openerp_id, :info, :access_ids, :name, :openerp_model, :field_ids, :state, #model class attributes assotiated to the OpenERP ir.model
|
17
|
-
:fields, :fields_defined, :many2one_relations, :one2many_relations, :many2many_relations, :relations_keys,
|
18
|
-
:
|
18
|
+
:fields, :fields_defined, :many2one_relations, :one2many_relations, :many2many_relations, :polymorphic_m2o_relations, :relations_keys,
|
19
|
+
:database, :user_id, :scope_prefix, :ooor
|
19
20
|
|
20
21
|
def class_name_from_model_key(model_key=self.openerp_model)
|
21
22
|
model_key.split('.').collect {|name_part| name_part.capitalize}.join
|
@@ -24,7 +25,7 @@ class OpenObjectResource < ActiveResource::Base
|
|
24
25
|
#similar to Object#const_get but for OpenERP model key
|
25
26
|
def const_get(model_key)
|
26
27
|
klass_name = class_name_from_model_key(model_key)
|
27
|
-
klass = (self.scope_prefix ? Object.const_get(self.scope_prefix) : Object).const_defined?(klass_name) ? (self.scope_prefix ? Object.const_get(self.scope_prefix) : Object).const_get(klass_name) : @ooor.define_openerp_model(model_key,
|
28
|
+
klass = (self.scope_prefix ? Object.const_get(self.scope_prefix) : Object).const_defined?(klass_name) ? (self.scope_prefix ? Object.const_get(self.scope_prefix) : Object).const_get(klass_name) : @ooor.define_openerp_model(model_key, self.scope_prefix)
|
28
29
|
klass.reload_fields_definition unless klass.fields_defined
|
29
30
|
klass
|
30
31
|
end
|
@@ -41,15 +42,19 @@ class OpenObjectResource < ActiveResource::Base
|
|
41
42
|
@one2many_relations[field.attributes['name']] = field
|
42
43
|
when 'many2many'
|
43
44
|
@many2many_relations[field.attributes['name']] = field
|
45
|
+
when 'reference'
|
46
|
+
@polymorphic_m2o_relations[field.attributes['name']] = field
|
44
47
|
else
|
45
48
|
@fields[field.attributes['name']] = field
|
46
49
|
end
|
47
50
|
end
|
48
|
-
@relations_keys = @many2one_relations.
|
51
|
+
@relations_keys = @many2one_relations.keys + @one2many_relations.keys + @many2many_relations.keys + @polymorphic_m2o_relations.keys
|
49
52
|
(@fields.keys + @relations_keys).each do |meth| #generates method handlers for autompletion tools such as jirb_swing
|
50
|
-
self.
|
51
|
-
|
52
|
-
|
53
|
+
unless self.respond_to?(meth)
|
54
|
+
self.instance_eval do
|
55
|
+
define_method meth do |*args|
|
56
|
+
self.send :method_missing, *[meth, *args]
|
57
|
+
end
|
53
58
|
end
|
54
59
|
end
|
55
60
|
end
|
@@ -61,13 +66,13 @@ class OpenObjectResource < ActiveResource::Base
|
|
61
66
|
# ******************** remote communication ********************
|
62
67
|
|
63
68
|
#OpenERP search method
|
64
|
-
def search(domain, offset=0, limit=false, order=false, context={}, count=false)
|
69
|
+
def search(domain=[], offset=0, limit=false, order=false, context={}, count=false)
|
65
70
|
rpc_execute('search', domain, offset, limit, order, context, count)
|
66
71
|
end
|
67
72
|
|
68
73
|
def client(url)
|
69
74
|
@clients ||= {}
|
70
|
-
@clients[url] ||= XMLRPC::Client.new2(url)
|
75
|
+
@clients[url] ||= XMLRPC::Client.new2(url, nil, 180)
|
71
76
|
end
|
72
77
|
|
73
78
|
#corresponding method for OpenERP osv.execute(self, db, uid, obj, method, *args, **kw) method
|
@@ -108,8 +113,10 @@ class OpenObjectResource < ActiveResource::Base
|
|
108
113
|
logger.debug "rpc_execute_with_all: rpc_method: 'create old_wizard_step' #{wizard_name}"
|
109
114
|
wizard_id = try_with_pretty_error_log { cast_answer_to_ruby!(client((@database && @site || @ooor.base_url) + "/wizard").call("create", @database || @ooor.config[:database], @user_id || @ooor.config[:user_id], @password || @ooor.config[:password], wizard_name)) }
|
110
115
|
end
|
111
|
-
|
112
|
-
|
116
|
+
params = {'model' => @openerp_model, 'form' => form, 'report_type' => report_type}
|
117
|
+
params.merge!({'id' => ids[0], 'ids' => ids}) if ids
|
118
|
+
logger.debug "rpc_execute_with_all: rpc_method: 'execute old_wizard_step' #{wizard_id}, #{params.inspect}, #{step}, #{context}"
|
119
|
+
[wizard_id, try_with_pretty_error_log { cast_answer_to_ruby!(client((@database && @site || @ooor.base_url) + "/wizard").call("execute", @database || @ooor.config[:database], @user_id || @ooor.config[:user_id], @password || @ooor.config[:password], wizard_id, params, step, context)) }]
|
113
120
|
end
|
114
121
|
|
115
122
|
#grab the eventual error log from OpenERP response as OpenERP doesn't enforce carefuly
|
@@ -199,7 +206,7 @@ class OpenObjectResource < ActiveResource::Base
|
|
199
206
|
!ids.empty? && ids[0].is_a?(Integer) && find_single(ids, options) || []
|
200
207
|
end
|
201
208
|
|
202
|
-
#
|
209
|
+
#actually finds many resources specified with scope = ids_array
|
203
210
|
def find_single(scope, options)
|
204
211
|
fields = options[:fields] || []
|
205
212
|
context = options[:context] || {}
|
@@ -207,7 +214,7 @@ class OpenObjectResource < ActiveResource::Base
|
|
207
214
|
is_collection = true
|
208
215
|
scope = [scope] and is_collection = false if !scope.is_a? Array
|
209
216
|
scope.map! do |item|
|
210
|
-
if item.is_a?
|
217
|
+
if item.is_a?(String) && item.to_i == 0#triggers ir_model_data absolute reference lookup
|
211
218
|
tab = item.split(".")
|
212
219
|
domain = [['name', '=', tab[-1]]]
|
213
220
|
domain += [['module', '=', tab[-2]]] if tab[-2]
|
@@ -321,6 +328,7 @@ class OpenObjectResource < ActiveResource::Base
|
|
321
328
|
msg << "\n\n" << self.class.many2one_relations.map {|k, v| "many2one --- #{v.relation} --- #{k}"}.join("\n")
|
322
329
|
msg << "\n\n" << self.class.one2many_relations.map {|k, v| "one2many --- #{v.relation} --- #{k}"}.join("\n")
|
323
330
|
msg << "\n\n" << self.class.many2many_relations.map {|k, v| "many2many --- #{v.relation} --- #{k}"}.join("\n")
|
331
|
+
msg << "\n\n" << self.class.polymorphic_m2o_relations.map {|k, v| "polymorphic_m2o --- #{v.relation} --- #{k}"}.join("\n")
|
324
332
|
msg << "\n\nYOU CAN ALSO USE THE INHERITED FIELDS FROM THE INHERITANCE MANY2ONE RELATIONS OR THE OBJECT METHODS...\n\n"
|
325
333
|
self.class.logger.debug msg
|
326
334
|
end
|
@@ -389,7 +397,7 @@ class OpenObjectResource < ActiveResource::Base
|
|
389
397
|
|
390
398
|
def old_wizard_step(wizard_name, step='init', wizard_id=nil, form={}, context={})
|
391
399
|
result = self.class.old_wizard_step(wizard_name, [self.id], step, wizard_id, form, {})
|
392
|
-
|
400
|
+
FormModel.new(wizard_name, result[0], nil, nil, result[1], [self], self.class.ooor.global_context)
|
393
401
|
end
|
394
402
|
|
395
403
|
def type() method_missing(:type) end #skips deprecated Object#type method
|
@@ -405,6 +413,9 @@ class OpenObjectResource < ActiveResource::Base
|
|
405
413
|
load_relation(self.class.one2many_relations[method_name].relation, @relations[method_name], *arguments)
|
406
414
|
elsif self.class.many2many_relations.has_key?(method_name)
|
407
415
|
load_relation(self.class.many2many_relations[method_name].relation, @relations[method_name], *arguments)
|
416
|
+
elsif self.class.polymorphic_m2o_relations.has_key?(method_name)
|
417
|
+
values = @relations[method_name].split(',')
|
418
|
+
load_relation(values[0], values[1].to_i, *arguments)
|
408
419
|
else
|
409
420
|
false
|
410
421
|
end
|
@@ -441,18 +452,28 @@ class OpenObjectResource < ActiveResource::Base
|
|
441
452
|
|
442
453
|
#maybe the relation is inherited or could be inferred from a related field
|
443
454
|
self.class.many2one_relations.each do |k, field| #TODO could be recursive eventually
|
444
|
-
if @relations[k]
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
455
|
+
if @relations[k] #we only care if instance has a relation
|
456
|
+
related_model = self.class.const_get(field.relation)
|
457
|
+
related_model.reload_fields_definition() unless related_model.fields_defined
|
458
|
+
if related_model.relations_keys.index(method_key)
|
459
|
+
@loaded_relations[k] ||= load_relation(field.relation, @relations[k][0], *arguments)
|
460
|
+
model = @loaded_relations[k]
|
461
|
+
model.loaded_relations[method_key] ||= model.relationnal_result(method_key, *arguments)
|
462
|
+
return model.loaded_relations[method_key] if model.loaded_relations[method_key]
|
463
|
+
end
|
449
464
|
elsif is_assign
|
450
465
|
klazz = self.class.const_get(field.relation)
|
451
466
|
@relations[method_key] = arguments[0] and return if klazz.relations_keys.index(method_key)
|
452
467
|
@attributes[method_key] = arguments[0] and return if klazz.fields.keys.index(method_key)
|
453
468
|
end
|
454
469
|
end
|
455
|
-
|
470
|
+
|
471
|
+
if id
|
472
|
+
arguments += [{}] unless arguments.last.is_a?(Hash)
|
473
|
+
self.class.rpc_execute(method_key, [id], *arguments) #we assume that's an action
|
474
|
+
else
|
475
|
+
super
|
476
|
+
end
|
456
477
|
|
457
478
|
rescue RuntimeError
|
458
479
|
raise
|
data/lib/app/models/uml.rb
CHANGED
@@ -5,7 +5,7 @@ module UML
|
|
5
5
|
|
6
6
|
def print_uml(*options)
|
7
7
|
ooor = self.class.ooor
|
8
|
-
UML.print_uml(ooor.config[:models] && ooor.
|
8
|
+
UML.print_uml(ooor.config[:models] && ooor.loaded_models.select {|model| ooor.config[:models].index(model.openerp_model)} || ooor.loaded_models, options)
|
9
9
|
end
|
10
10
|
|
11
11
|
module ClassMethods
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module ActionWindowModule
|
2
|
+
def open(mode='tree', ids=nil)
|
3
|
+
if view_mode.index(mode)
|
4
|
+
the_view_id = false
|
5
|
+
relations['views'].each do |tuple|
|
6
|
+
the_view_id = tuple[0] if tuple[1] == mode
|
7
|
+
end
|
8
|
+
self.class.ooor.build_object_view(self.class.ooor.const_get(res_model), the_view_id, mode, domain || [], ids, {})
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'app/ui/form_model'
|
2
|
+
require 'app/ui/menu'
|
3
|
+
require 'app/ui/action_window'
|
4
|
+
|
5
|
+
module ClientBase
|
6
|
+
|
7
|
+
def menu_class
|
8
|
+
action_window_class()
|
9
|
+
const_get('ir.ui.menu').send :include, MenuModule
|
10
|
+
end
|
11
|
+
|
12
|
+
def action_window_class
|
13
|
+
const_get('ir.actions.act_window').send :include, ActionWindowModule
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_init_menu(user_id=@config[:user_id])
|
17
|
+
const_get('res.users').read([user_id], ['menu_id', 'name'], @global_context)
|
18
|
+
end
|
19
|
+
|
20
|
+
#Ooor can have wizards that are not object related, for instance to configure the initial database:
|
21
|
+
def old_wizard_step(wizard_name, step='init', wizard_id=nil, form={}, context={})
|
22
|
+
result = @ir_model_class.old_wizard_step(wizard_name, nil, step, wizard_id, form, {})
|
23
|
+
FormModel.new(wizard_name, result[0], nil, nil, result[1], [self], @global_context)#TODO set arch and fields
|
24
|
+
end
|
25
|
+
|
26
|
+
def build_object_view(model_class, view_id, view_mode='form', domain=[], ids=nil, context={}, toolbar=false)
|
27
|
+
#TODO put in cache eventually:
|
28
|
+
view = model_class.fields_view_get(view_id, view_mode, @global_context, toolbar)
|
29
|
+
context = @global_context.merge(context)
|
30
|
+
ids = const_get(view['model']).search(domain) unless ids #TODO replace by search_read once OpenERP has that
|
31
|
+
values = const_get(view['model']).read(ids, view['fields'], context)
|
32
|
+
models = []
|
33
|
+
ids.each_with_index do |id, k|
|
34
|
+
models << const_get(view['model']).new(values[k], [], context)
|
35
|
+
end
|
36
|
+
|
37
|
+
FormModel.new(view['name'], view['view_id'], view['arch'], view['fields'], nil, models, context, view['view_id'])
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
class FormModel
|
2
|
+
attr_accessor :name, :wizard_id, :datas, :arch, :fields, :type, :state, :view_id, :open_object_resources, :view_context
|
3
|
+
|
4
|
+
def initialize(name, wizard_id, arch, fields, data, open_object_resources, view_context, view_id=nil)
|
5
|
+
@arch = arch
|
6
|
+
@fields = fields
|
7
|
+
@name = name
|
8
|
+
@wizard_id = wizard_id
|
9
|
+
@open_object_resources = open_object_resources
|
10
|
+
@view_context = view_context
|
11
|
+
if data #it's a wizard
|
12
|
+
@datas = data['datas'].symbolize_keys!
|
13
|
+
@type = data['type']
|
14
|
+
update_wizard_state(data['state'])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_html
|
19
|
+
"<div>not implemented in OOOR core gem!</div>"
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_s
|
23
|
+
content = ""
|
24
|
+
content << @name
|
25
|
+
@open_object_resources.each do |resource|
|
26
|
+
content << "\n---------"
|
27
|
+
@fields.each do |k, v| #TODO no need for new call if many2one
|
28
|
+
if v['type'] == 'many2one'
|
29
|
+
content << "\n#{k}: #{resource.relations[k]}"
|
30
|
+
else
|
31
|
+
content << "\n#{k}: #{resource.send(k)}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def old_wizard_step(method_symbol, *arguments)
|
38
|
+
values = @datas.merge((arguments[0] || {}).symbolize_keys!)
|
39
|
+
context = @view_context.merge(arguments[1] || {})
|
40
|
+
if @open_object_resources.size == 1
|
41
|
+
open_object_resource = @open_object_resources[0]
|
42
|
+
if open_object_resource.is_a? Ooor
|
43
|
+
data = open_object_resource.ir_model_class.old_wizard_step(@name, nil, method_symbol, @wizard_id, values, context)
|
44
|
+
else
|
45
|
+
data = open_object_resource.class.old_wizard_step(@name, [open_object_resource.id], method_symbol, @wizard_id, values, context)
|
46
|
+
end
|
47
|
+
if data[1]['state'] == 'end'
|
48
|
+
if open_object_resource.is_a? Ooor
|
49
|
+
return 'end'
|
50
|
+
else
|
51
|
+
return open_object_resource.reload_from_record!(open_object_resource.class.find(open_object_resource.id, :context => context))
|
52
|
+
end
|
53
|
+
end
|
54
|
+
@arch = data[1]['arch']
|
55
|
+
@fields = data[1]['fields']
|
56
|
+
@datas.merge!(data[1]['datas'].symbolize_keys!) unless data[1]['datas'].empty?
|
57
|
+
@type = data[1]['type']
|
58
|
+
update_wizard_state(data[1]['state']) #FIXME ideally we should remove old methods
|
59
|
+
return self
|
60
|
+
else
|
61
|
+
ids = @open_object_resources.collect{ |open_object_resources| open_object_resources.id }
|
62
|
+
return open_object_resource.class.old_wizard_step(@name, ids, method_symbol, @wizard_id, values, context)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def update_wizard_state(state)
|
69
|
+
if state.is_a? Array
|
70
|
+
@state = state
|
71
|
+
@state.each do |state_item| #generates autocompletion handles
|
72
|
+
self.class_eval do
|
73
|
+
define_method state_item[0] do |*args|
|
74
|
+
self.send :old_wizard_step, *[state_item[0], *args]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
data/lib/app/ui/menu.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'app/ui/action_window'
|
2
|
+
|
3
|
+
module MenuModule
|
4
|
+
|
5
|
+
attr_accessor :menu_action
|
6
|
+
|
7
|
+
def menu_action
|
8
|
+
#TODO put in cache eventually:
|
9
|
+
action_values = self.class.ooor.const_get('ir.values').rpc_execute('get', 'action', 'tree_but_open', [['ir.ui.menu', id]], false, self.class.ooor.global_context)[0][2]#get already exists
|
10
|
+
@menu_action = self.class.ooor.const_get('ir.actions.act_window').new(action_values, []) #TODO deal with action reference instead
|
11
|
+
end
|
12
|
+
|
13
|
+
def open(mode='tree', ids=nil)
|
14
|
+
menu_action.open(mode, ids)
|
15
|
+
end
|
16
|
+
end
|
data/lib/ooor.rb
CHANGED
@@ -1,12 +1,18 @@
|
|
1
1
|
require 'logger'
|
2
|
-
require 'xmlrpc/client'
|
3
2
|
require 'app/models/open_object_resource'
|
4
3
|
require 'app/models/uml'
|
4
|
+
require 'app/models/db_service'
|
5
|
+
require 'app/models/common_service'
|
6
|
+
require 'app/ui/client_base'
|
5
7
|
|
6
8
|
class Ooor
|
7
9
|
include UML
|
10
|
+
include DbService
|
11
|
+
include CommonService
|
12
|
+
include ClientBase
|
8
13
|
|
9
|
-
|
14
|
+
cattr_accessor :default_ooor, :default_config
|
15
|
+
attr_accessor :logger, :config, :loaded_models, :base_url, :global_context, :ir_model_class
|
10
16
|
|
11
17
|
#load the custom configuration
|
12
18
|
def self.load_config(config_file=nil, env=nil)
|
@@ -20,50 +26,39 @@ class Ooor
|
|
20
26
|
raise
|
21
27
|
end
|
22
28
|
|
23
|
-
def global_login(user, password)
|
24
|
-
@config[:username] = user
|
25
|
-
@config[:password] = password
|
26
|
-
client = OpenObjectResource.client(@base_url + "/common")
|
27
|
-
OpenObjectResource.try_with_pretty_error_log { client.call("login", @config[:database], user, password)}
|
28
|
-
rescue Exception => error
|
29
|
-
@logger.error """login to OpenERP server failed:
|
30
|
-
#{error.inspect}
|
31
|
-
Are your sure the server is started? Are your login parameters correct? Can this server ping the OpenERP server?
|
32
|
-
login XML/RPC url was #{@config[:url].gsub(/\/$/,'') + "/common"}"""
|
33
|
-
raise
|
34
|
-
end
|
35
|
-
|
36
29
|
def initialize(config, env=false)
|
37
30
|
@config = config.is_a?(String) ? Ooor.load_config(config, env) : config
|
38
31
|
@config.symbolize_keys!
|
39
|
-
@logger = ((defined?(
|
32
|
+
@logger = ((defined?(Rails) && $0 != 'irb' || config[:force_rails_logger]) ? Rails.logger : Logger.new(STDOUT))
|
40
33
|
@logger.level = config[:log_level] if config[:log_level]
|
34
|
+
OpenObjectResource.logger = @logger
|
41
35
|
@base_url = config[:url].gsub(/\/$/,'')
|
42
|
-
@
|
43
|
-
|
36
|
+
@loaded_models = []
|
44
37
|
scope = Module.new and Object.const_set(config[:scope_prefix], scope) if config[:scope_prefix]
|
38
|
+
if config[:database]
|
39
|
+
load_models()
|
40
|
+
end
|
41
|
+
end
|
45
42
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
OpenObjectResource.logger = @logger
|
50
|
-
@ir_model_class = define_openerp_model("ir.model", nil, nil, nil, nil, config[:scope_prefix])
|
51
|
-
define_openerp_model("ir.model.fields", nil, nil, nil, nil, config[:scope_prefix])
|
52
|
-
define_openerp_model("ir.model.data", nil, nil, nil, nil, config[:scope_prefix])
|
43
|
+
def const_get(model_key)
|
44
|
+
@ir_model_class.const_get(model_key)
|
45
|
+
end
|
53
46
|
|
54
|
-
|
55
|
-
|
47
|
+
def load_models(to_load_models=@config[:models])
|
48
|
+
@global_context = @config[:global_context] || {}
|
49
|
+
global_login(@config[:username] || 'admin', @config[:password] || 'admin')
|
50
|
+
@ir_model_class = define_openerp_model("ir.model", @config[:scope_prefix])
|
51
|
+
define_openerp_model("ir.model.fields", @config[:scope_prefix])
|
52
|
+
if to_load_models #we load only a customized subset of the OpenERP models
|
53
|
+
models = @ir_model_class.find(:all, :domain => [['model', 'in', to_load_models]])
|
56
54
|
else #we load all the models
|
57
|
-
models = @ir_model_class.find(:all).reject {|model| ["ir.model", "ir.model.fields"
|
55
|
+
models = @ir_model_class.find(:all).reject {|model| ["ir.model", "ir.model.fields"].index model.model}
|
58
56
|
end
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
module Test
|
63
|
-
|
57
|
+
@global_context.merge!({}).merge!(@config[:global_context] || {})
|
58
|
+
models.each {|openerp_model| define_openerp_model(openerp_model, @config[:scope_prefix])}
|
64
59
|
end
|
65
60
|
|
66
|
-
def define_openerp_model(arg, url, database, user_id, pass
|
61
|
+
def define_openerp_model(arg, scope_prefix=nil, url=nil, database=nil, user_id=nil, pass=nil)
|
67
62
|
if arg.is_a?(String) && arg != 'ir.model' && arg != 'ir.model.fields'
|
68
63
|
arg = @ir_model_class.find(:first, :domain => [['model', '=', arg]])
|
69
64
|
end
|
@@ -73,7 +68,7 @@ class Ooor
|
|
73
68
|
klass.site = url || @base_url
|
74
69
|
klass.user = user_id
|
75
70
|
klass.password = pass
|
76
|
-
klass.
|
71
|
+
klass.database = database
|
77
72
|
klass.openerp_model = param['model']
|
78
73
|
klass.openerp_id = url || param['id']
|
79
74
|
klass.info = (param['info'] || '').gsub("'",' ')
|
@@ -84,20 +79,20 @@ class Ooor
|
|
84
79
|
klass.many2one_relations = {}
|
85
80
|
klass.one2many_relations = {}
|
86
81
|
klass.many2many_relations = {}
|
82
|
+
klass.polymorphic_m2o_relations = {}
|
87
83
|
klass.relations_keys = []
|
88
84
|
klass.fields = {}
|
89
85
|
klass.scope_prefix = scope_prefix
|
90
86
|
model_class_name = klass.class_name_from_model_key
|
91
87
|
@logger.info "registering #{model_class_name} as a Rails ActiveResource Model wrapper for OpenObject #{param['model']} model"
|
92
88
|
(scope_prefix ? Object.const_get(scope_prefix) : Object).const_set(model_class_name, klass)
|
93
|
-
@
|
89
|
+
@loaded_models.push(klass)
|
94
90
|
klass
|
95
91
|
end
|
96
92
|
|
97
93
|
end
|
98
94
|
|
99
|
-
#Optionnal Rails
|
100
|
-
|
101
|
-
|
102
|
-
OOOR = Ooor.new(config) if config['bootstrap']
|
95
|
+
if defined?(Rails) #Optionnal autoload in Rails:
|
96
|
+
Ooor.default_config = Ooor.load_config(false, RAILS_ENV)
|
97
|
+
Ooor.default_ooor = Ooor.new(Ooor.default_config) if Ooor.default_config['bootstrap']
|
103
98
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
version: 1.2.
|
8
|
+
- 9
|
9
|
+
version: 1.2.9
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Raphael Valyi - www.akretion.com
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-03-
|
17
|
+
date: 2010-03-10 00:00:00 -03:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -43,10 +43,15 @@ files:
|
|
43
43
|
- README.md
|
44
44
|
- MIT-LICENSE
|
45
45
|
- lib/ooor.rb
|
46
|
+
- ooor.yml
|
46
47
|
- lib/app/models/open_object_resource.rb
|
47
|
-
- lib/app/models/open_object_ui.rb
|
48
48
|
- lib/app/models/uml.rb
|
49
|
-
-
|
49
|
+
- lib/app/models/db_service.rb
|
50
|
+
- lib/app/models/common_service.rb
|
51
|
+
- lib/app/ui/action_window.rb
|
52
|
+
- lib/app/ui/client_base.rb
|
53
|
+
- lib/app/ui/form_model.rb
|
54
|
+
- lib/app/ui/menu.rb
|
50
55
|
has_rdoc: true
|
51
56
|
homepage: http://github.com/rvalyi/ooor
|
52
57
|
licenses: []
|
@@ -1,45 +0,0 @@
|
|
1
|
-
class OpenObjectLayoutedFields
|
2
|
-
attr_accessor :arch, :fields
|
3
|
-
|
4
|
-
def initialize(arch, fields)
|
5
|
-
@arch = arch
|
6
|
-
@fields = fields
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
class OpenObjectWizard < OpenObjectLayoutedFields
|
11
|
-
attr_accessor :name, :id, :datas, :arch, :fields, :type, :state, :open_object_resources
|
12
|
-
|
13
|
-
def initialize(name, id, data, open_object_resources, wizard_context)
|
14
|
-
super(data['arch'], data['fields'])
|
15
|
-
@name = name
|
16
|
-
@id = id
|
17
|
-
@open_object_resources = open_object_resources
|
18
|
-
@datas = data['datas'].symbolize_keys!
|
19
|
-
@type = data['type']
|
20
|
-
@state = data['state']
|
21
|
-
@wizard_context = wizard_context
|
22
|
-
end
|
23
|
-
|
24
|
-
def method_missing(method_symbol, *arguments)
|
25
|
-
values = @datas.merge((arguments[0] || {}).symbolize_keys!)
|
26
|
-
context = @wizard_context.merge(arguments[1] || {})
|
27
|
-
if @open_object_resources.size == 1
|
28
|
-
open_object_resource = @open_object_resources[0]
|
29
|
-
data = open_object_resource.class.old_wizard_step(@name, [open_object_resource.id], method_symbol, @id, values, context)
|
30
|
-
if data[1]['state'] == 'end'
|
31
|
-
return open_object_resource.reload_from_record!(open_object_resource.class.find(open_object_resource.id, :context => context))
|
32
|
-
end
|
33
|
-
@arch = data[1]['arch']
|
34
|
-
@fields = data[1]['fields']
|
35
|
-
@datas = data[1]['datas'].symbolize_keys!
|
36
|
-
@type = data[1]['type']
|
37
|
-
@state = data[1]['state']
|
38
|
-
return self
|
39
|
-
else
|
40
|
-
ids = @open_object_resources.collect{|open_object_resources| open_object_resources.id}
|
41
|
-
return open_object_resource.class.old_wizard_step(@name, ids, method_symbol, @id, values, context)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|