ooor 1.2.5 → 1.2.6
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/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
|