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.
@@ -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