ooor 1.6.1 → 1.6.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -294,17 +294,33 @@ You can also create a resource and it's ir_model_data record alltogether using t
294
294
  $ ProductCategory.create(:name => 'rails_categ', :ir_model_data_id =>['product', 'categ_x']) #1st tab element is the module, 2nd the id in the module
295
295
 
296
296
 
297
+ Obtain report binary data:
298
+
299
+ To obtain the binary data of an object report simply use the function get_report_data(report_name). This function returns a list that contains the binary data encoded in base64 and a string with the file format.
300
+ Example:
301
+
302
+ $ inv = AccountInvoice.find(3)
303
+ $ report = inv.get_report_data('account.invoice') #account.invoice is the service name defined in Invoices report
304
+ $ #Save the report to a file
305
+ $ #report[1] contains the file extension and report[0] contains the binary data of the report encoded in base64
306
+ $ File.open("invoice_report.#{report[1]}", "w") {|f| f.write(Base64.decode64(report[0]))}
307
+
297
308
  Change logged user:
298
309
 
310
+ An Ooor client can have a global user logged in, to change it:
311
+
299
312
  $ Ooor.global_login('demo', 'demo')
300
313
  $ s = SaleOrder.find(2)
301
314
  $ => 'Access denied error'
302
315
 
303
- Notice that this changes the globally logged user and doesn't address the issue of
304
- different users using Ooor concurrently with different credentials as you might want
305
- for instance in a Rails web application. That second issue will be addressed at
306
- the API level but it's not easy as ActiveResource has not been designed for it.
316
+ Instead, every Ooor business objects can also belong to some specific user. To achieve that, generate your object passing
317
+ proper :user_id and :password parameters inside the context of the method creating the object (typically a find).
318
+ Notice that methods invoked on an objet use the same credentials as the business objects.
319
+ Objects generated by this object (by a call to an association for instance) will also have the same credentials.
320
+
321
+ $ p = ProductProduct.find(1, :context => {:user_id=>3, :password=>'test'})
307
322
 
323
+ This is tipycally the system you will use in a Ruby (Rails or not) web application.
308
324
 
309
325
  Change log level:
310
326
 
@@ -21,6 +21,7 @@ require 'app/ui/form_model'
21
21
  require 'app/models/uml'
22
22
  require 'app/models/type_casting'
23
23
  require 'app/models/relation'
24
+ require 'app/models/serialization'
24
25
 
25
26
  module Ooor
26
27
  class OpenObjectResource < ActiveResource::Base
@@ -28,6 +29,7 @@ module Ooor
28
29
  #include ActiveModel::Validations
29
30
  include UML
30
31
  include TypeCasting
32
+ include Serialization
31
33
 
32
34
  # ******************** class methods ********************
33
35
  class << self
@@ -172,7 +174,44 @@ module Ooor
172
174
  raise RuntimeError.new("Invalid RPC method: #{method_symbol}") if [:type!, :allowed!].index(method_symbol)
173
175
  self.rpc_execute(method_symbol.to_s, *arguments)
174
176
  end
175
-
177
+
178
+ #Added methods to obtain report data for a model
179
+ def report(report_name, ids, report_type='pdf', context={})
180
+ context = @ooor.global_context.merge(context)
181
+ params = {'model' => @openerp_model, 'id' => ids[0], 'report_type' => report_type}
182
+ @ooor.get_rpc_client("#{(@database && @site || @ooor.base_url)}/report").call("report", @database || @ooor.config[:database], @user_id || @ooor.config[:user_id], @password || @ooor.config[:password], report_name, ids, params, context)
183
+ end
184
+
185
+ def report_get(report_id, context={})
186
+ context = @ooor.global_context.merge(context)
187
+ @ooor.get_rpc_client("#{(@database && @site || @ooor.base_url)}/report").call("report_get", @database || @ooor.config[:database], @user_id || @ooor.config[:user_id], @password || @ooor.config[:password], report_id)
188
+ end
189
+
190
+ def get_report_data(report_name, ids, report_type='pdf', context={})
191
+ report_id = self.report(report_name, ids, report_type, context)
192
+ if report_id
193
+ state = false
194
+ attempt = 0
195
+ while not state
196
+ report = self.report_get(report_id, context)
197
+ state = report["state"]
198
+ attempt = 1
199
+ if not state
200
+ sleep(0.1)
201
+ attempt += 1
202
+ else
203
+ return [report["result"],report["format"]]
204
+ end
205
+ if attempt > 100
206
+ logger.debug "OOOR RPC: 'Printing Aborted!'"
207
+ break
208
+ end
209
+ end
210
+ else
211
+ logger.debug "OOOR RPC: 'report not found'"
212
+ end
213
+ return nil
214
+ end
176
215
 
177
216
  # ******************** finders low level implementation ********************
178
217
  private
@@ -239,6 +278,11 @@ module Ooor
239
278
  def object_uid; object_session[:user_id] || self.class.user_id || self.class.ooor.config[:user_id]; end
240
279
  def object_pass; object_session[:password] || self.class.password || self.class.ooor.config[:password]; end
241
280
 
281
+ # Ruby 1.9.compat, See also http://tenderlovemaking.com/2011/06/28/til-its-ok-to-return-nil-from-to_ary/
282
+ def to_ary # :nodoc:
283
+ nil
284
+ end
285
+
242
286
  #try to wrap the object context inside the query.
243
287
  def rpc_execute(method, *args)
244
288
  if args[-1].is_a? Hash
@@ -361,8 +405,8 @@ module Ooor
361
405
  def old_wizard_step(wizard_name, step='init', wizard_id=nil, form={}, context={})
362
406
  result = self.class.old_wizard_step(wizard_name, [self.id], step, wizard_id, form, {})
363
407
  FormModel.new(wizard_name, result[0], nil, nil, result[1], [self], self.class.ooor.global_context)
364
- end
365
-
408
+ end
409
+
366
410
  def log(message, context={}) rpc_execute('log', id, message, context) end
367
411
 
368
412
  def type() method_missing(:type) end #skips deprecated Object#type method
@@ -415,12 +459,17 @@ module Ooor
415
459
  rpc_execute(method_key, [id], *arguments) #we assume that's an action
416
460
  else
417
461
  super
418
- end
462
+ end
419
463
 
420
464
  rescue RuntimeError => e
421
465
  e.message << "\n" + available_fields if e.message.index("AttributeError")
422
466
  raise e
423
467
  end
468
+
469
+ #Add get_report_data to obtain [report["result"],report["format]] of a concrete openERP Object
470
+ def get_report_data(report_name, report_type="pdf", context={})
471
+ self.class.get_report_data(report_name, [self.id], report_type, context)
472
+ end
424
473
 
425
474
  end
426
475
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: ooor
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.6.1
5
+ version: 1.6.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Raphael Valyi - www.akretion.com
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-09-14 00:00:00 Z
13
+ date: 2011-09-26 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activeresource
@@ -73,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
73
73
  requirements: []
74
74
 
75
75
  rubyforge_project:
76
- rubygems_version: 1.8.5
76
+ rubygems_version: 1.8.10
77
77
  signing_key:
78
78
  specification_version: 3
79
79
  summary: OOOR - OpenObject On Ruby