ooor 1.0.6 → 1.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -113,6 +113,8 @@ That the easiest option to get started while you might not want that in producti
113
113
 
114
114
  Then just start your Rails application, your OpenERP models will be loaded as you'll see in the Rails log.
115
115
  You can then use all the OOOR API upon all loaded OpenERP models in your regular Rails code (see API usage section).
116
+ A good way to start playing with OOOR is inside the console, using:
117
+ $ ruby script/console #or jruby script/console on JRuby of course
116
118
 
117
119
  Enabling REST HTTP routes to your OpenERP models:
118
120
  in your config/route.rb, you can alternatively enable routes to all your OpenERP models by addding:
@@ -177,7 +179,7 @@ Inherited relations support:
177
179
  $ ProductProduct.find(1).categ_id #where categ_id is inherited from the ProductTemplate
178
180
 
179
181
  Please notice that loaded relations are cached (to avoid hitting OpenERP over and over)
180
- until the root object is reloaded (after save/update for instance)
182
+ until the root object is reloaded (after save/update for instance).
181
183
  Currently, save/update doesn't save the whole object graph but only the current object.
182
184
  We might change this in the future to match the way OpenERP clients are working which
183
185
  is supported by the OpenERP ORM, see issue: http://github.com/rvalyi/ooor/issues/#issue/3
@@ -252,7 +254,7 @@ the API level but it's not easy as ActiveResource has not been designed for it.
252
254
 
253
255
  Change log level:
254
256
 
255
- By default the log level is very verbose (debug level) to help newcomers to jumpstart
257
+ By default the log level is very verbose (debug level) to help newcomers to jumpstart.
256
258
  However you might want to change that. 2 solutions:
257
259
  $ Ooor.logger.level = 1 #available levels are those of the standard Ruby Logger class: 0 debug, 1 info, 2 error
258
260
  $ In the config yaml file or hash, set the :log_level parameter
@@ -1,6 +1,11 @@
1
1
  require 'xmlrpc/client'
2
2
  require 'activeresource'
3
3
 
4
+ #TODO implement method missing on the OpenObjectResource level and proxy the method upon the RPC client, as done in openerp/tools/rpc.py
5
+ #in the official web client
6
+
7
+ #TODO implement passing session credentials to RPC methods (concurrent access of different user credentials in Rails)
8
+
4
9
  class OpenObjectResource < ActiveResource::Base
5
10
 
6
11
  # ******************** class methods ********************
@@ -94,6 +99,9 @@ class OpenObjectResource < ActiveResource::Base
94
99
 
95
100
  #corresponding method for OpenERP osv.execute(self, db, uid, obj, method, *args, **kw) method
96
101
  def rpc_execute_with_all(db, uid, pass, obj, method, *args)
102
+ if args[-1].is_a? Hash
103
+ args[-1] = Ooor.global_context.merge(args[-1])
104
+ end
97
105
  logger.debug "rpc_execute_with_all: rpc_methods: 'execute', db: #{db.inspect}, uid: #{uid.inspect}, pass: #{pass.inspect}, obj: #{obj.inspect}, method: #{method}, *args: #{args.inspect}"
98
106
  try_with_pretty_error_log { client(@database && @site || Ooor.object_url).call("execute", db, uid, pass, obj, method, *args) }
99
107
  end
@@ -108,6 +116,9 @@ class OpenObjectResource < ActiveResource::Base
108
116
  end
109
117
 
110
118
  def rpc_exec_workflow_with_all(db, uid, pass, obj, action, *args)
119
+ if args[-1].is_a? Hash
120
+ args[-1] = Ooor.global_context.merge(args[-1])
121
+ end
111
122
  logger.debug "rpc_execute_with_all: rpc_methods: 'exec_workflow', db: #{db.inspect}, uid: #{uid.inspect}, pass: #{pass.inspect}, obj: #{obj.inspect}, action #{action}, *args: #{args.inspect}"
112
123
  try_with_pretty_error_log { client(@database && @site || Ooor.object_url).call("exec_workflow", db, uid, pass, obj, action, *args) }
113
124
  end
@@ -115,7 +126,7 @@ class OpenObjectResource < ActiveResource::Base
115
126
  #grab the eventual error log from OpenERP response as OpenERP doesn't enforce carefuly
116
127
  #the XML/RPC spec, see https://bugs.launchpad.net/openerp/+bug/257581
117
128
  def try_with_pretty_error_log
118
- yield
129
+ yield
119
130
  rescue RuntimeError => e
120
131
  begin
121
132
  openerp_error_hash = eval("#{ e }".gsub("wrong fault-structure: ", ""))
@@ -173,7 +184,7 @@ class OpenObjectResource < ActiveResource::Base
173
184
  scope = [scope]
174
185
  is_collection = false
175
186
  end
176
- records = rpc_execute('read', scope, *(fields + [context]))
187
+ records = rpc_execute('read', scope, fields, context)
177
188
  active_resources = []
178
189
  records.each do |record|
179
190
  r = {}
@@ -193,7 +204,7 @@ class OpenObjectResource < ActiveResource::Base
193
204
 
194
205
  # ******************** instance methods ********************
195
206
 
196
- attr_accessor :ooor_user, :ooor_password
207
+ attr_accessor :relations, :loaded_relations
197
208
 
198
209
  def pre_cast_attributes
199
210
  @attributes.each {|k, v| @attributes[k] = ((v.is_a? BigDecimal) ? Float(v) : v)}
@@ -203,6 +214,8 @@ class OpenObjectResource < ActiveResource::Base
203
214
  self.class.reload_fields_definition unless self.class.field_defined
204
215
  raise ArgumentError, "expected an attributes Hash, got #{attributes.inspect}" unless attributes.is_a?(Hash)
205
216
  @prefix_options, attributes = split_options(attributes)
217
+ @relations = {}
218
+ @loaded_relations = {}
206
219
  attributes.each do |key, value|
207
220
  case value
208
221
  when Array
@@ -264,36 +277,31 @@ class OpenObjectResource < ActiveResource::Base
264
277
 
265
278
  # ******************** fake associations like much like ActiveRecord according to the cached OpenERP data model ********************
266
279
 
267
- def relations
268
- @relations ||= {} and @relations
269
- end
270
-
271
- def relationnal_result(method_id, *arguments)
280
+ def relationnal_result(method_name, *arguments)
272
281
  self.class.reload_fields_definition unless self.class.field_defined
273
- if self.class.many2one_relations[method_id.to_s]
274
- self.class.load_relation(self.class.many2one_relations[method_id.to_s].relation, @relations[method_id.to_s][0], *arguments)
275
- elsif self.class.one2many_relations[method_id.to_s]
276
- self.class.load_relation(self.class.one2many_relations[method_id.to_s].relation, @relations[method_id.to_s], *arguments)
277
- elsif self.class.many2many_relations[method_id.to_s]
278
- self.class.load_relation(self.class.many2many_relations[method_id.to_s].relation, @relations[method_id.to_s], *arguments)
282
+ if self.class.many2one_relations.has_key?(method_name)
283
+ self.class.load_relation(self.class.many2one_relations[method_name].relation, @relations[method_name][0], *arguments)
284
+ elsif self.class.one2many_relations.has_key?(method_name)
285
+ self.class.load_relation(self.class.one2many_relations[method_name].relation, @relations[method_name], *arguments)
286
+ elsif self.class.many2many_relations.has_key?(method_name)
287
+ self.class.load_relation(self.class.many2many_relations[method_name].relation, @relations[method_name], *arguments)
279
288
  else
280
289
  false
281
290
  end
282
291
  end
283
292
 
284
- def method_missing(method_id, *arguments)
285
- @loaded_relations ||= {}
286
- result = @loaded_relations[method_id.to_s]
287
- return result if result
288
- result = relationnal_result(method_id, *arguments)
293
+ def method_missing(method_symbol, *arguments)
294
+ method_name = method_symbol.to_s
295
+ return @loaded_relations[method_name] if @loaded_relations.has_key?(method_name)
296
+ result = relationnal_result(method_name, *arguments)
289
297
  if result
290
- @loaded_relations[method_id.to_s] = result
298
+ @loaded_relations[method_name] = result
291
299
  return result
292
- elsif @relations and @relations[method_id.to_s] and !self.class.many2one_relations.empty?
300
+ elsif @relations and @relations.has_key?(method_name) and !self.class.many2one_relations.empty?
293
301
  #maybe the relation is inherited or could be inferred from a related field
294
302
  self.class.many2one_relations.each do |k, field|
295
- model = self.class.load_relation(field.relation, @relations[method_id.to_s][0], *arguments)
296
- result = model.relationnal_result(method_id, *arguments)
303
+ model = self.class.load_relation(field.relation, @relations[method_name][0], *arguments)
304
+ result = model.relationnal_result(method_name, *arguments)
297
305
  return result if result
298
306
  end
299
307
  super
@@ -5,7 +5,7 @@ module Ooor
5
5
 
6
6
  class << self
7
7
 
8
- attr_accessor :logger, :config, :all_loaded_models, :binding, :common_url, :object_url
8
+ attr_accessor :logger, :config, :all_loaded_models, :binding, :common_url, :object_url, :global_context
9
9
 
10
10
  #load the custom configuration
11
11
  def load_config(config_file=nil, env=nil)
@@ -44,6 +44,7 @@ module Ooor
44
44
  Ooor.logger.level = Ooor.config[:log_level] if Ooor.config[:log_level]
45
45
  Ooor.common_url = Ooor.config[:url].gsub(/\/$/,'') + "/common"
46
46
  Ooor.object_url = Ooor.config[:url].gsub(/\/$/,'') + "/object"
47
+ Ooor.global_context = Ooor.config[:global_context] || {}
47
48
  Ooor.config[:user_id] = global_login(Ooor.config[:username] || 'admin', Ooor.config[:password] || 'admin')
48
49
 
49
50
  #*************** load the models
data/ooor.yml CHANGED
@@ -9,6 +9,9 @@ development:
9
9
  #comment the following line if you want to load ALL the available models (slower startup), or complete it with all the OpenERP models you want to be loaded
10
10
  models: [res.partner, product.template, product.product, product.category, sale.order, sale.order.line, account.invoice]
11
11
  bootstrap: true #true if you want to load OpenObject models (will hit OpenERP server) at startup; else use Ooor.reload!(lambda {}) to reload the Ooor models at any time
12
+ #log_level: 0
13
+ #global_context:
14
+ #'lang': en_US
12
15
 
13
16
  test:
14
17
  url: http://localhost:8069/xmlrpc
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.0.6
4
+ version: 1.0.7
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: 2009-11-08 00:00:00 -02:00
12
+ date: 2009-11-09 00:00:00 -02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency