ooor 1.2.5 → 1.2.6
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/app/models/open_object_resource.rb +62 -41
- data/lib/ooor.rb +11 -4
- metadata +2 -2
@@ -18,20 +18,20 @@ class OpenObjectResource < ActiveResource::Base
|
|
18
18
|
:openerp_database, :user_id, :scope_prefix, :ooor
|
19
19
|
|
20
20
|
def class_name_from_model_key(model_key=self.openerp_model)
|
21
|
-
|
21
|
+
model_key.split('.').collect {|name_part| name_part.capitalize}.join
|
22
22
|
end
|
23
23
|
|
24
24
|
#similar to Object#const_get but for OpenERP model key
|
25
25
|
def const_get(model_key)
|
26
26
|
klass_name = class_name_from_model_key(model_key)
|
27
|
-
klass = Object.const_defined?(klass_name) ? Object.const_get(klass_name) : @ooor.define_openerp_model(model_key, nil, nil, nil, nil, self.scope_prefix)
|
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, nil, nil, nil, nil, self.scope_prefix)
|
28
28
|
klass.reload_fields_definition unless klass.fields_defined
|
29
29
|
klass
|
30
30
|
end
|
31
31
|
|
32
32
|
def reload_fields_definition(force = false)
|
33
33
|
if not (self.to_s.match('IrModel') || self.to_s.match('IrModelFields')) and (force or not @fields_defined)#TODO have a way to force reloading @field_ids too eventually
|
34
|
-
fields = Object.const_get(self.scope_prefix
|
34
|
+
fields = (self.scope_prefix ? Object.const_get(self.scope_prefix) : Object).const_get('IrModelFields').find(@field_ids)
|
35
35
|
@fields = {}
|
36
36
|
fields.each do |field|
|
37
37
|
case field.attributes['ttype']
|
@@ -74,9 +74,9 @@ class OpenObjectResource < ActiveResource::Base
|
|
74
74
|
|
75
75
|
#corresponding method for OpenERP osv.execute(self, db, uid, obj, method, *args, **kw) method
|
76
76
|
def rpc_execute_with_all(db, uid, pass, obj, method, *args)
|
77
|
-
|
77
|
+
clean_request_args!(args)
|
78
78
|
logger.debug "rpc_execute_with_all: rpc_method: 'execute', db: #{db.inspect}, uid: #{uid.inspect}, pass: #{pass.inspect}, obj: #{obj.inspect}, method: #{method}, *args: #{args.inspect}"
|
79
|
-
try_with_pretty_error_log { client((@database && @site || @ooor.base_url) + "/object").call("execute", db, uid, pass, obj, method, *args) }
|
79
|
+
try_with_pretty_error_log { cast_answer_to_ruby!(client((@database && @site || @ooor.base_url) + "/object").call("execute", db, uid, pass, obj, method, *args)) }
|
80
80
|
end
|
81
81
|
|
82
82
|
#corresponding method for OpenERP osv.exec_workflow(self, db, uid, obj, method, *args)
|
@@ -89,17 +89,20 @@ class OpenObjectResource < ActiveResource::Base
|
|
89
89
|
end
|
90
90
|
|
91
91
|
def rpc_exec_workflow_with_all(db, uid, pass, obj, action, *args)
|
92
|
-
|
92
|
+
clean_request_args!(args)
|
93
93
|
logger.debug "rpc_execute_with_all: rpc_method: 'exec_workflow', db: #{db.inspect}, uid: #{uid.inspect}, pass: #{pass.inspect}, obj: #{obj.inspect}, action: #{action}, *args: #{args.inspect}"
|
94
|
-
try_with_pretty_error_log { client((@database && @site || @ooor.base_url) + "/object").call("exec_workflow", db, uid, pass, obj, action, *args) }
|
94
|
+
try_with_pretty_error_log { cast_answer_to_ruby!(client((@database && @site || @ooor.base_url) + "/object").call("exec_workflow", db, uid, pass, obj, action, *args)) }
|
95
95
|
end
|
96
96
|
|
97
97
|
def old_wizard_step(wizard_name, ids, step='init', wizard_id=nil, form={}, context={}, report_type='pdf')
|
98
98
|
context = @ooor.global_context.merge(context)
|
99
|
+
cast_request_to_openerp!(form)
|
99
100
|
unless wizard_id
|
100
|
-
|
101
|
+
logger.debug "rpc_execute_with_all: rpc_method: 'create old_wizard_step' #{wizard_name}"
|
102
|
+
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)) }
|
101
103
|
end
|
102
|
-
|
104
|
+
logger.debug "rpc_execute_with_all: rpc_method: 'execute old_wizard_step' #{wizard_id}, #{{'model' => @openerp_model, 'form' => form, 'id' => ids[0], 'report_type' => report_type, 'ids' => ids}.inspect}, #{step}, #{context}"
|
105
|
+
[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, {'model' => @openerp_model, 'form' => form, 'id' => ids[0], 'report_type' => report_type, 'ids' => ids}, step, context)) }]
|
103
106
|
end
|
104
107
|
|
105
108
|
#grab the eventual error log from OpenERP response as OpenERP doesn't enforce carefuly
|
@@ -121,6 +124,52 @@ class OpenObjectResource < ActiveResource::Base
|
|
121
124
|
end
|
122
125
|
end
|
123
126
|
|
127
|
+
def clean_request_args!(args)
|
128
|
+
if args[-1].is_a? Hash
|
129
|
+
args[-1] = @ooor.global_context.merge(args[-1])
|
130
|
+
elsif args.is_a?(Array)
|
131
|
+
args += [@ooor.global_context]
|
132
|
+
end
|
133
|
+
cast_request_to_openerp!(args[-2]) if args[-2].is_a? Hash
|
134
|
+
end
|
135
|
+
|
136
|
+
def cast_request_to_openerp!(map)
|
137
|
+
map.each do |k, v|
|
138
|
+
if !v.is_a?(Integer) && !v.is_a?(Float) && v.is_a?(Numeric) && v.respond_to?(:to_f)
|
139
|
+
map[k] = v.to_f
|
140
|
+
elsif !v.is_a?(Numeric) && !v.is_a?(Integer) && v.respond_to?(:sec) && v.respond_to?(:year)#really ensure that's a datetime type
|
141
|
+
map[k] = "#{v.year}-#{v.month}-#{v.day} #{v.hour}:#{v.min}:#{v.sec}"
|
142
|
+
elsif !v.is_a?(Numeric) && !v.is_a?(Integer) && v.respond_to?(:day) && v.respond_to?(:year)#really ensure that's a date type
|
143
|
+
map[k] = "#{v.year}-#{v.month}-#{v.day}"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def cast_answer_to_ruby!(answer)
|
149
|
+
reload_fields_definition() unless self.fields_defined
|
150
|
+
|
151
|
+
def cast_map_to_ruby!(map)
|
152
|
+
map.each do |k, v|
|
153
|
+
if self.fields[k] && v.is_a?(String) && !v.empty?
|
154
|
+
case self.fields[k].ttype
|
155
|
+
when 'datetime'
|
156
|
+
map[k] = Time.parse(v)
|
157
|
+
when 'date'
|
158
|
+
map[k] = Date.parse(v)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
if answer.is_a?(Array)
|
165
|
+
answer.each {|item| self.cast_map_to_ruby!(item) if item.is_a? Hash}
|
166
|
+
elsif answer.is_a?(Hash)
|
167
|
+
self.cast_map_to_ruby!(answer)
|
168
|
+
else
|
169
|
+
answer
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
124
173
|
def method_missing(method_symbol, *arguments) self.rpc_execute(method_symbol.to_s, *arguments) end
|
125
174
|
|
126
175
|
|
@@ -139,10 +188,10 @@ class OpenObjectResource < ActiveResource::Base
|
|
139
188
|
end
|
140
189
|
end
|
141
190
|
ids = rpc_execute('search', domain, context)
|
142
|
-
find_single(ids, options)
|
191
|
+
!ids.empty? && ids[0].is_a?(Integer) && find_single(ids, options) || []
|
143
192
|
end
|
144
193
|
|
145
|
-
#TODO,
|
194
|
+
#TODO, makes sense?
|
146
195
|
def find_one; raise"Not implemented yet, go on!"; end
|
147
196
|
|
148
197
|
# Find a single resource from the default URL
|
@@ -184,33 +233,6 @@ class OpenObjectResource < ActiveResource::Base
|
|
184
233
|
|
185
234
|
attr_accessor :relations, :loaded_relations
|
186
235
|
|
187
|
-
def cast_attributes_to_ruby!
|
188
|
-
@attributes.each do |k, v|
|
189
|
-
if self.class.fields[k] && v.is_a?(String) && !v.empty?
|
190
|
-
case self.class.fields[k].ttype
|
191
|
-
when 'datetime'
|
192
|
-
@attributes[k] = Time.parse(v)
|
193
|
-
when 'date'
|
194
|
-
@attributes[k] = Date.parse(v)
|
195
|
-
end
|
196
|
-
end
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
def cast_attributes_to_openerp!
|
201
|
-
@attributes.each do |k, v|
|
202
|
-
@attributes[k] = ((v.is_a? BigDecimal) ? Float(v) : v)
|
203
|
-
if self.class.fields[k]
|
204
|
-
case self.class.fields[k].ttype
|
205
|
-
when 'datetime'
|
206
|
-
@attributes[k] = "#{v.year}-#{v.month}-#{v.day} #{v.hour}:#{v.min}:#{v.sec}" if v.respond_to?(:sec)
|
207
|
-
when 'date'
|
208
|
-
@attributes[k] = "#{v.year}-#{v.month}-#{v.day}" if v.respond_to?(:day)
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
236
|
def cast_relations_to_openerp!
|
215
237
|
@relations.reject! do |k, v| #reject non asigned many2one or empty list
|
216
238
|
v.is_a?(Array) && (v.size == 0 or v[1].is_a?(String))
|
@@ -271,7 +293,6 @@ class OpenObjectResource < ActiveResource::Base
|
|
271
293
|
end
|
272
294
|
end
|
273
295
|
end
|
274
|
-
cast_attributes_to_ruby!
|
275
296
|
self
|
276
297
|
end
|
277
298
|
|
@@ -297,7 +318,6 @@ class OpenObjectResource < ActiveResource::Base
|
|
297
318
|
end
|
298
319
|
|
299
320
|
def to_openerp_hash!
|
300
|
-
cast_attributes_to_openerp!
|
301
321
|
cast_relations_to_openerp!
|
302
322
|
@attributes.reject {|key, value| key == 'id'}.merge(@relations)
|
303
323
|
end
|
@@ -401,8 +421,9 @@ class OpenObjectResource < ActiveResource::Base
|
|
401
421
|
end
|
402
422
|
|
403
423
|
return @loaded_relations[method_name] if @loaded_relations.has_key?(method_name)
|
404
|
-
return false if @relations.has_key?(method_name) and !@relations[method_name]
|
424
|
+
return false if @relations.has_key?(method_name) and (!@relations[method_name] || @relations[method_name].is_a?(Array) && !@relations[method_name][0])
|
405
425
|
|
426
|
+
return false if self.class.relations_keys.index(method_name) && !@relations[method_name]
|
406
427
|
result = relationnal_result(method_name, *arguments)
|
407
428
|
@loaded_relations[method_name] = result and return result if result
|
408
429
|
|
data/lib/ooor.rb
CHANGED
@@ -40,19 +40,26 @@ class Ooor
|
|
40
40
|
@logger.level = config[:log_level] if config[:log_level]
|
41
41
|
@base_url = config[:url].gsub(/\/$/,'')
|
42
42
|
@global_context = config[:global_context] || {}
|
43
|
+
|
44
|
+
scope = Module.new and Object.const_set(config[:scope_prefix], scope) if config[:scope_prefix]
|
45
|
+
|
43
46
|
config[:user_id] = global_login(config[:username] || 'admin', config[:password] || 'admin')
|
44
47
|
|
45
48
|
@all_loaded_models = []
|
46
49
|
OpenObjectResource.logger = @logger
|
47
|
-
@ir_model_class = define_openerp_model("ir.model", nil, nil, nil, nil, config[:scope_prefix]
|
48
|
-
define_openerp_model("ir.model.fields", nil, nil, nil, nil, config[:scope_prefix]
|
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])
|
49
52
|
|
50
53
|
if config[:models] #we load only a customized subset of the OpenERP models
|
51
54
|
models = @ir_model_class.find(:all, :domain => [['model', 'in', config[:models]]])
|
52
55
|
else #we load all the models
|
53
56
|
models = @ir_model_class.find(:all).reject {|model| model.model == "ir.model" || model.model == "ir.model.fields"}
|
54
57
|
end
|
55
|
-
models.each {|openerp_model| define_openerp_model(openerp_model, nil, nil, nil, nil, config[:scope_prefix]
|
58
|
+
models.each {|openerp_model| define_openerp_model(openerp_model, nil, nil, nil, nil, config[:scope_prefix])}
|
59
|
+
end
|
60
|
+
|
61
|
+
module Test
|
62
|
+
|
56
63
|
end
|
57
64
|
|
58
65
|
def define_openerp_model(arg, url, database, user_id, pass, scope_prefix)
|
@@ -81,7 +88,7 @@ class Ooor
|
|
81
88
|
klass.scope_prefix = scope_prefix
|
82
89
|
model_class_name = klass.class_name_from_model_key
|
83
90
|
@logger.info "registering #{model_class_name} as a Rails ActiveResource Model wrapper for OpenObject #{param['model']} model"
|
84
|
-
Object.const_set(model_class_name, klass)
|
91
|
+
(scope_prefix ? Object.const_get(scope_prefix) : Object).const_set(model_class_name, klass)
|
85
92
|
@all_loaded_models.push(klass)
|
86
93
|
klass
|
87
94
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ooor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Raphael Valyi - www.akretion.com
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-18 00:00:00 -02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|