ooor 1.0.9 → 1.1.0

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.
@@ -220,39 +220,52 @@ class OpenObjectResource < ActiveResource::Base
220
220
  @attributes.each {|k, v| @attributes[k] = ((v.is_a? BigDecimal) ? Float(v) : v)}
221
221
  end
222
222
 
223
- def load(attributes)
223
+ def reload_from_record!(record)
224
+ load(record.attributes, record.relations)
225
+ end
226
+
227
+ def load(attributes, relations={})
224
228
  self.class.reload_fields_definition unless self.class.field_defined
225
229
  raise ArgumentError, "expected an attributes Hash, got #{attributes.inspect}" unless attributes.is_a?(Hash)
226
230
  @prefix_options, attributes = split_options(attributes)
227
- @relations = {}
231
+ @relations = relations
228
232
  @loaded_relations = {}
229
233
  attributes.each do |key, value|
230
- case value
231
- when Array
232
- relations[key.to_s] = value #the relation because we want the method to load the association through method missing
233
- when Hash
234
- resource = find_or_create_resource_for(key) #TODO check!
235
- @attributes[key.to_s] = resource@attributes[key.to_s].new(value)
236
- else
237
- @attributes[key.to_s] = value.dup rescue value
234
+ skey = key.to_s
235
+ if self.class.many2one_relations.has_key?(skey) || self.class.one2many_relations.has_key?(skey) || self.class.many2many_relations.has_key?(skey)
236
+ relations[skey] = value #the relation because we want the method to load the association through method missing
237
+ else
238
+ case value
239
+ when self.class.many2one_relations.has_key?(skey) || self.class.one2many_relations.has_key?(skey) || self.class.many2many_relations.has_key?(skey)
240
+ relations[skey] = value #the relation because we want the method to load the association through method missing
241
+ when Hash
242
+ resource = find_or_create_resource_for(key) #TODO check!
243
+ @attributes[skey] = resource@attributes[skey].new(value)
244
+ else
245
+ @attributes[skey] = value.dup rescue value
246
+ end
238
247
  end
239
248
  end
240
249
 
241
250
  self
242
251
  end
243
252
 
244
- #compatible with the Rails way but also supports OpenERP context
253
+ #compatible with the Rails way but also supports OpenERP context; TODO: properly pass one2many and many2many object graph like GTK client
245
254
  def create(context={})
246
255
  self.pre_cast_attributes
247
- self.id = self.class.rpc_execute('create', @attributes, context)
248
- load(self.class.find(self.id, :context => context).attributes)
256
+ m2o = @relations.reject{|k, v| !self.class.many2one_relations.has_key?(k)}
257
+ vals = @attributes.merge(m2o.merge(m2o){|k, v| v.is_a?(Array) ? v[0] : v})
258
+ self.id = self.class.rpc_execute('create', vals, context)
259
+ reload_from_record!(self.class.find(self.id, :context => context))
249
260
  end
250
261
 
251
- #compatible with the Rails way but also supports OpenERP context
262
+ #compatible with the Rails way but also supports OpenERP context; TODO: properly pass one2many and many2many object graph like GTK client
252
263
  def update(context={})
253
264
  self.pre_cast_attributes
254
- self.class.rpc_execute('write', self.id, @attributes.reject{|k, v| k == 'id'}, context)
255
- load(self.class.find(self.id, :context => context).attributes)
265
+ m2o = @relations.reject{|k, v| !self.class.many2one_relations.has_key?(k)}
266
+ vals = @attributes.reject {|key, value| key == 'id'}.merge(m2o.merge(m2o){|k, v| v.is_a?(Array) ? v[0] : v})
267
+ self.class.rpc_execute('write', self.id, vals, context)
268
+ reload_from_record!(self.class.find(self.id, :context => context))
256
269
  end
257
270
 
258
271
  #compatible with the Rails way but also supports OpenERP context
@@ -281,7 +294,7 @@ class OpenObjectResource < ActiveResource::Base
281
294
  #wrapper for OpenERP exec_workflow Business Process Management engine
282
295
  def wkf_action(action, context={})
283
296
  self.class.rpc_exec_workflow(action, self.id) #FIXME looks like OpenERP exec_workflow doesn't accept context but it might be a bug
284
- load(self.class.find(self.id, :context => context).attributes)
297
+ reload_from_record!(self.class.find(self.id, :context => context))
285
298
  end
286
299
 
287
300
  def old_wizard_step(wizard_name, step='init', wizard_id=nil, form={}, context={})
@@ -308,18 +321,22 @@ class OpenObjectResource < ActiveResource::Base
308
321
  def method_missing(method_symbol, *arguments)
309
322
  method_name = method_symbol.to_s
310
323
  return @loaded_relations[method_name] if @loaded_relations.has_key?(method_name)
311
- result = relationnal_result(method_name, *arguments)
312
- if result
313
- @loaded_relations[method_name] = result
314
- return result
315
- elsif @relations and @relations.has_key?(method_name) and !self.class.many2one_relations.empty?
316
- #maybe the relation is inherited or could be inferred from a related field
317
- self.class.many2one_relations.each do |k, field|
318
- model = self.class.load_relation(field.relation, @relations[method_name][0], *arguments)
319
- result = model.relationnal_result(method_name, *arguments)
320
- return result if result
324
+ if @relations.has_key?(method_name) and !@relations[method_name]
325
+ return false
326
+ else
327
+ result = relationnal_result(method_name, *arguments)
328
+ if result
329
+ @loaded_relations[method_name] = result
330
+ return result
331
+ elsif @relations and @relations.has_key?(method_name) and !self.class.many2one_relations.empty?
332
+ #maybe the relation is inherited or could be inferred from a related field
333
+ self.class.many2one_relations.each do |k, field|
334
+ model = self.class.load_relation(field.relation, @relations[method_name][0], *arguments)
335
+ result = model.relationnal_result(method_name, *arguments)
336
+ return result if result
337
+ end
338
+ super
321
339
  end
322
- super
323
340
  end
324
341
  super
325
342
  end
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ooor
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.9
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
- - Raphael Valyi - www.akretion.com
7
+ - Raphael Valyi - www.akretion.com
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-23 00:00:00 -02:00
12
+ date: 2009-12-16 00:00:00 -02:00
13
13
  default_executable:
14
14
  dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: activeresource
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: 2.3.1
24
- version:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activeresource
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.3.1
24
+ version:
25
25
  description: OOOR exposes business object proxies to your Ruby (Rails or not) application, that map seamlessly to your remote OpenObject/OpenERP server using webservices. It extends the standard ActiveResource API.
26
26
  email: rvalyi@akretion.com
27
27
  executables: []
@@ -31,13 +31,13 @@ extensions: []
31
31
  extra_rdoc_files: []
32
32
 
33
33
  files:
34
- - README.md
35
- - MIT-LICENSE
36
- - lib/ooor.rb
37
- - lib/app/models/open_object_resource.rb
38
- - lib/app/models/open_object_ui.rb
39
- - lib/app/controllers/open_objects_controller.rb
40
- - ooor.yml
34
+ - README.md
35
+ - MIT-LICENSE
36
+ - lib/ooor.rb
37
+ - lib/app/models/open_object_resource.rb
38
+ - lib/app/models/open_object_ui.rb
39
+ - lib/app/controllers/open_objects_controller.rb
40
+ - ooor.yml
41
41
  has_rdoc: true
42
42
  homepage: http://github.com/rvalyi/ooor
43
43
  licenses: []
@@ -46,18 +46,18 @@ post_install_message:
46
46
  rdoc_options: []
47
47
 
48
48
  require_paths:
49
- - lib
49
+ - lib
50
50
  required_ruby_version: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: "0"
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: "0"
55
55
  version:
56
56
  required_rubygems_version: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- version: "0"
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: "0"
61
61
  version:
62
62
  requirements: []
63
63