ooor 1.2.5 → 1.2.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
- self.scope_prefix + model_key.split('.').collect {|name_part| name_part.capitalize}.join
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 + 'IrModelFields').find(@field_ids)
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
- args[-1] = @ooor.global_context.merge(args[-1]) if args[-1].is_a? Hash
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
- args[-1] = @ooor.global_context.merge(args[-1]) if args[-1].is_a? Hash
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
- wizard_id = try_with_pretty_error_log { 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
+ 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
- [wizard_id, try_with_pretty_error_log { 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) }]
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, make sense?
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
 
@@ -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.5
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-05 00:00:00 -02:00
12
+ date: 2010-02-18 00:00:00 -02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency