ooor 1.2.8 → 1.2.9
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/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
|