ooor 1.2.8 → 1.2.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,26 @@
1
+ #proxies all 'common' class of OpenERP server/bin/service/web_service.py properly
2
+ module CommonService
3
+ def global_login(user, password)
4
+ @config[:username] = user
5
+ @config[:password] = password
6
+ client = OpenObjectResource.client(@base_url + "/common")
7
+ @config[:user_id] = OpenObjectResource.try_with_pretty_error_log { client.call("login", @config[:database], user, password) }
8
+ rescue Exception => error
9
+ @logger.error """login to OpenERP server failed:
10
+ #{error.inspect}
11
+ Are your sure the server is started? Are your login parameters correct? Can this server ping the OpenERP server?
12
+ login XML/RPC url was #{@config[:url].gsub(/\/$/,'') + "/common"}"""
13
+ raise
14
+ end
15
+
16
+ def login(user, password); global_login(user, password); end
17
+
18
+ #we generate methods handles for use in auto-completion tools such as jirb_swing
19
+ [:ir_get, :ir_set, :ir_del, :about, :logout, :timezone_get, :get_available_updates, :get_migration_scripts, :get_server_environment, :login_message, :check_connectivity].each do |meth|
20
+ self.instance_eval do
21
+ define_method meth do |*args|
22
+ OpenObjectResource.try_with_pretty_error_log { OpenObjectResource.client(@base_url + "/common").call(meth.to_s, *args) }
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ #proxies all 'db' class of OpenERP server/bin/service/web_service.py properly
2
+ module DbService
3
+ def create(password=@config[:db_password], db_name='ooor_db', demo=true, lang='en-US', user_password=@config[:password] || 'admin')
4
+ process_id = OpenObjectResource.try_with_pretty_error_log { OpenObjectResource.client(@base_url + "/db").call("create", password, db_name, demo, lang, user_password) }
5
+ @config[:database] = db_name
6
+ @config[:username] = user_password
7
+ while get_progress('admin', process_id) == [0, []]
8
+ @logger.info "..."
9
+ sleep(0.5)
10
+ end
11
+ load_models()
12
+ end
13
+
14
+ def drop(password=@config[:db_password], db_name='ooor_db')
15
+ OpenObjectResource.try_with_pretty_error_log { OpenObjectResource.client(@base_url + "/db").call("drop", password, db_name) }
16
+ end
17
+
18
+ #we generate methods handles for use in auto-completion tools such as jirb_swing
19
+ [:get_progress, :dump, :restore, :rename, :db_exist, :list, :change_admin_password, :list_lang, :server_version, :migrate_databases].each do |meth|
20
+ self.instance_eval do
21
+ define_method meth do |*args|
22
+ OpenObjectResource.try_with_pretty_error_log { OpenObjectResource.client(@base_url + "/db").call(meth.to_s, *args) }
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,6 +1,7 @@
1
1
  require 'xmlrpc/client'
2
+ require 'rubygems'
2
3
  require 'active_resource'
3
- require 'app/models/open_object_ui'
4
+ require 'app/ui/form_model'
4
5
  require 'app/models/uml'
5
6
  require 'set'
6
7
 
@@ -14,8 +15,8 @@ class OpenObjectResource < ActiveResource::Base
14
15
 
15
16
  cattr_accessor :logger
16
17
  attr_accessor :openerp_id, :info, :access_ids, :name, :openerp_model, :field_ids, :state, #model class attributes assotiated to the OpenERP ir.model
17
- :fields, :fields_defined, :many2one_relations, :one2many_relations, :many2many_relations, :relations_keys,
18
- :openerp_database, :user_id, :scope_prefix, :ooor
18
+ :fields, :fields_defined, :many2one_relations, :one2many_relations, :many2many_relations, :polymorphic_m2o_relations, :relations_keys,
19
+ :database, :user_id, :scope_prefix, :ooor
19
20
 
20
21
  def class_name_from_model_key(model_key=self.openerp_model)
21
22
  model_key.split('.').collect {|name_part| name_part.capitalize}.join
@@ -24,7 +25,7 @@ class OpenObjectResource < ActiveResource::Base
24
25
  #similar to Object#const_get but for OpenERP model key
25
26
  def const_get(model_key)
26
27
  klass_name = class_name_from_model_key(model_key)
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
+ 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, self.scope_prefix)
28
29
  klass.reload_fields_definition unless klass.fields_defined
29
30
  klass
30
31
  end
@@ -41,15 +42,19 @@ class OpenObjectResource < ActiveResource::Base
41
42
  @one2many_relations[field.attributes['name']] = field
42
43
  when 'many2many'
43
44
  @many2many_relations[field.attributes['name']] = field
45
+ when 'reference'
46
+ @polymorphic_m2o_relations[field.attributes['name']] = field
44
47
  else
45
48
  @fields[field.attributes['name']] = field
46
49
  end
47
50
  end
48
- @relations_keys = @many2one_relations.merge(@one2many_relations).merge(@many2many_relations).keys
51
+ @relations_keys = @many2one_relations.keys + @one2many_relations.keys + @many2many_relations.keys + @polymorphic_m2o_relations.keys
49
52
  (@fields.keys + @relations_keys).each do |meth| #generates method handlers for autompletion tools such as jirb_swing
50
- self.instance_eval do
51
- define_method meth do |*args|
52
- self.send :method_missing, *[meth, *args]
53
+ unless self.respond_to?(meth)
54
+ self.instance_eval do
55
+ define_method meth do |*args|
56
+ self.send :method_missing, *[meth, *args]
57
+ end
53
58
  end
54
59
  end
55
60
  end
@@ -61,13 +66,13 @@ class OpenObjectResource < ActiveResource::Base
61
66
  # ******************** remote communication ********************
62
67
 
63
68
  #OpenERP search method
64
- def search(domain, offset=0, limit=false, order=false, context={}, count=false)
69
+ def search(domain=[], offset=0, limit=false, order=false, context={}, count=false)
65
70
  rpc_execute('search', domain, offset, limit, order, context, count)
66
71
  end
67
72
 
68
73
  def client(url)
69
74
  @clients ||= {}
70
- @clients[url] ||= XMLRPC::Client.new2(url)
75
+ @clients[url] ||= XMLRPC::Client.new2(url, nil, 180)
71
76
  end
72
77
 
73
78
  #corresponding method for OpenERP osv.execute(self, db, uid, obj, method, *args, **kw) method
@@ -108,8 +113,10 @@ class OpenObjectResource < ActiveResource::Base
108
113
  logger.debug "rpc_execute_with_all: rpc_method: 'create old_wizard_step' #{wizard_name}"
109
114
  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)) }
110
115
  end
111
- 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}"
112
- [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)) }]
116
+ params = {'model' => @openerp_model, 'form' => form, 'report_type' => report_type}
117
+ params.merge!({'id' => ids[0], 'ids' => ids}) if ids
118
+ logger.debug "rpc_execute_with_all: rpc_method: 'execute old_wizard_step' #{wizard_id}, #{params.inspect}, #{step}, #{context}"
119
+ [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, params, step, context)) }]
113
120
  end
114
121
 
115
122
  #grab the eventual error log from OpenERP response as OpenERP doesn't enforce carefuly
@@ -199,7 +206,7 @@ class OpenObjectResource < ActiveResource::Base
199
206
  !ids.empty? && ids[0].is_a?(Integer) && find_single(ids, options) || []
200
207
  end
201
208
 
202
- # Find a single resource from the default URL
209
+ #actually finds many resources specified with scope = ids_array
203
210
  def find_single(scope, options)
204
211
  fields = options[:fields] || []
205
212
  context = options[:context] || {}
@@ -207,7 +214,7 @@ class OpenObjectResource < ActiveResource::Base
207
214
  is_collection = true
208
215
  scope = [scope] and is_collection = false if !scope.is_a? Array
209
216
  scope.map! do |item|
210
- if item.is_a? String #triggers ir_model_data absolute reference lookup
217
+ if item.is_a?(String) && item.to_i == 0#triggers ir_model_data absolute reference lookup
211
218
  tab = item.split(".")
212
219
  domain = [['name', '=', tab[-1]]]
213
220
  domain += [['module', '=', tab[-2]]] if tab[-2]
@@ -321,6 +328,7 @@ class OpenObjectResource < ActiveResource::Base
321
328
  msg << "\n\n" << self.class.many2one_relations.map {|k, v| "many2one --- #{v.relation} --- #{k}"}.join("\n")
322
329
  msg << "\n\n" << self.class.one2many_relations.map {|k, v| "one2many --- #{v.relation} --- #{k}"}.join("\n")
323
330
  msg << "\n\n" << self.class.many2many_relations.map {|k, v| "many2many --- #{v.relation} --- #{k}"}.join("\n")
331
+ msg << "\n\n" << self.class.polymorphic_m2o_relations.map {|k, v| "polymorphic_m2o --- #{v.relation} --- #{k}"}.join("\n")
324
332
  msg << "\n\nYOU CAN ALSO USE THE INHERITED FIELDS FROM THE INHERITANCE MANY2ONE RELATIONS OR THE OBJECT METHODS...\n\n"
325
333
  self.class.logger.debug msg
326
334
  end
@@ -389,7 +397,7 @@ class OpenObjectResource < ActiveResource::Base
389
397
 
390
398
  def old_wizard_step(wizard_name, step='init', wizard_id=nil, form={}, context={})
391
399
  result = self.class.old_wizard_step(wizard_name, [self.id], step, wizard_id, form, {})
392
- OpenObjectWizard.new(wizard_name, result[0], result[1], [self], self.class.ooor.global_context)
400
+ FormModel.new(wizard_name, result[0], nil, nil, result[1], [self], self.class.ooor.global_context)
393
401
  end
394
402
 
395
403
  def type() method_missing(:type) end #skips deprecated Object#type method
@@ -405,6 +413,9 @@ class OpenObjectResource < ActiveResource::Base
405
413
  load_relation(self.class.one2many_relations[method_name].relation, @relations[method_name], *arguments)
406
414
  elsif self.class.many2many_relations.has_key?(method_name)
407
415
  load_relation(self.class.many2many_relations[method_name].relation, @relations[method_name], *arguments)
416
+ elsif self.class.polymorphic_m2o_relations.has_key?(method_name)
417
+ values = @relations[method_name].split(',')
418
+ load_relation(values[0], values[1].to_i, *arguments)
408
419
  else
409
420
  false
410
421
  end
@@ -441,18 +452,28 @@ class OpenObjectResource < ActiveResource::Base
441
452
 
442
453
  #maybe the relation is inherited or could be inferred from a related field
443
454
  self.class.many2one_relations.each do |k, field| #TODO could be recursive eventually
444
- if @relations[k]
445
- @loaded_relations[k] ||= load_relation(field.relation, @relations[k][0], *arguments)
446
- model = @loaded_relations[k]
447
- model.loaded_relations[method_key] ||= model.relationnal_result(method_key, *arguments)
448
- return model.loaded_relations[method_key] if model.loaded_relations[method_key]
455
+ if @relations[k] #we only care if instance has a relation
456
+ related_model = self.class.const_get(field.relation)
457
+ related_model.reload_fields_definition() unless related_model.fields_defined
458
+ if related_model.relations_keys.index(method_key)
459
+ @loaded_relations[k] ||= load_relation(field.relation, @relations[k][0], *arguments)
460
+ model = @loaded_relations[k]
461
+ model.loaded_relations[method_key] ||= model.relationnal_result(method_key, *arguments)
462
+ return model.loaded_relations[method_key] if model.loaded_relations[method_key]
463
+ end
449
464
  elsif is_assign
450
465
  klazz = self.class.const_get(field.relation)
451
466
  @relations[method_key] = arguments[0] and return if klazz.relations_keys.index(method_key)
452
467
  @attributes[method_key] = arguments[0] and return if klazz.fields.keys.index(method_key)
453
468
  end
454
469
  end
455
- super
470
+
471
+ if id
472
+ arguments += [{}] unless arguments.last.is_a?(Hash)
473
+ self.class.rpc_execute(method_key, [id], *arguments) #we assume that's an action
474
+ else
475
+ super
476
+ end
456
477
 
457
478
  rescue RuntimeError
458
479
  raise
@@ -5,7 +5,7 @@ module UML
5
5
 
6
6
  def print_uml(*options)
7
7
  ooor = self.class.ooor
8
- UML.print_uml(ooor.config[:models] && ooor.all_loaded_models.select {|model| ooor.config[:models].index(model.openerp_model)} || ooor.all_loaded_models, options)
8
+ UML.print_uml(ooor.config[:models] && ooor.loaded_models.select {|model| ooor.config[:models].index(model.openerp_model)} || ooor.loaded_models, options)
9
9
  end
10
10
 
11
11
  module ClassMethods
@@ -0,0 +1,11 @@
1
+ module ActionWindowModule
2
+ def open(mode='tree', ids=nil)
3
+ if view_mode.index(mode)
4
+ the_view_id = false
5
+ relations['views'].each do |tuple|
6
+ the_view_id = tuple[0] if tuple[1] == mode
7
+ end
8
+ self.class.ooor.build_object_view(self.class.ooor.const_get(res_model), the_view_id, mode, domain || [], ids, {})
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,39 @@
1
+ require 'app/ui/form_model'
2
+ require 'app/ui/menu'
3
+ require 'app/ui/action_window'
4
+
5
+ module ClientBase
6
+
7
+ def menu_class
8
+ action_window_class()
9
+ const_get('ir.ui.menu').send :include, MenuModule
10
+ end
11
+
12
+ def action_window_class
13
+ const_get('ir.actions.act_window').send :include, ActionWindowModule
14
+ end
15
+
16
+ def get_init_menu(user_id=@config[:user_id])
17
+ const_get('res.users').read([user_id], ['menu_id', 'name'], @global_context)
18
+ end
19
+
20
+ #Ooor can have wizards that are not object related, for instance to configure the initial database:
21
+ def old_wizard_step(wizard_name, step='init', wizard_id=nil, form={}, context={})
22
+ result = @ir_model_class.old_wizard_step(wizard_name, nil, step, wizard_id, form, {})
23
+ FormModel.new(wizard_name, result[0], nil, nil, result[1], [self], @global_context)#TODO set arch and fields
24
+ end
25
+
26
+ def build_object_view(model_class, view_id, view_mode='form', domain=[], ids=nil, context={}, toolbar=false)
27
+ #TODO put in cache eventually:
28
+ view = model_class.fields_view_get(view_id, view_mode, @global_context, toolbar)
29
+ context = @global_context.merge(context)
30
+ ids = const_get(view['model']).search(domain) unless ids #TODO replace by search_read once OpenERP has that
31
+ values = const_get(view['model']).read(ids, view['fields'], context)
32
+ models = []
33
+ ids.each_with_index do |id, k|
34
+ models << const_get(view['model']).new(values[k], [], context)
35
+ end
36
+
37
+ FormModel.new(view['name'], view['view_id'], view['arch'], view['fields'], nil, models, context, view['view_id'])
38
+ end
39
+ end
@@ -0,0 +1,81 @@
1
+ class FormModel
2
+ attr_accessor :name, :wizard_id, :datas, :arch, :fields, :type, :state, :view_id, :open_object_resources, :view_context
3
+
4
+ def initialize(name, wizard_id, arch, fields, data, open_object_resources, view_context, view_id=nil)
5
+ @arch = arch
6
+ @fields = fields
7
+ @name = name
8
+ @wizard_id = wizard_id
9
+ @open_object_resources = open_object_resources
10
+ @view_context = view_context
11
+ if data #it's a wizard
12
+ @datas = data['datas'].symbolize_keys!
13
+ @type = data['type']
14
+ update_wizard_state(data['state'])
15
+ end
16
+ end
17
+
18
+ def to_html
19
+ "<div>not implemented in OOOR core gem!</div>"
20
+ end
21
+
22
+ def to_s
23
+ content = ""
24
+ content << @name
25
+ @open_object_resources.each do |resource|
26
+ content << "\n---------"
27
+ @fields.each do |k, v| #TODO no need for new call if many2one
28
+ if v['type'] == 'many2one'
29
+ content << "\n#{k}: #{resource.relations[k]}"
30
+ else
31
+ content << "\n#{k}: #{resource.send(k)}"
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ def old_wizard_step(method_symbol, *arguments)
38
+ values = @datas.merge((arguments[0] || {}).symbolize_keys!)
39
+ context = @view_context.merge(arguments[1] || {})
40
+ if @open_object_resources.size == 1
41
+ open_object_resource = @open_object_resources[0]
42
+ if open_object_resource.is_a? Ooor
43
+ data = open_object_resource.ir_model_class.old_wizard_step(@name, nil, method_symbol, @wizard_id, values, context)
44
+ else
45
+ data = open_object_resource.class.old_wizard_step(@name, [open_object_resource.id], method_symbol, @wizard_id, values, context)
46
+ end
47
+ if data[1]['state'] == 'end'
48
+ if open_object_resource.is_a? Ooor
49
+ return 'end'
50
+ else
51
+ return open_object_resource.reload_from_record!(open_object_resource.class.find(open_object_resource.id, :context => context))
52
+ end
53
+ end
54
+ @arch = data[1]['arch']
55
+ @fields = data[1]['fields']
56
+ @datas.merge!(data[1]['datas'].symbolize_keys!) unless data[1]['datas'].empty?
57
+ @type = data[1]['type']
58
+ update_wizard_state(data[1]['state']) #FIXME ideally we should remove old methods
59
+ return self
60
+ else
61
+ ids = @open_object_resources.collect{ |open_object_resources| open_object_resources.id }
62
+ return open_object_resource.class.old_wizard_step(@name, ids, method_symbol, @wizard_id, values, context)
63
+ end
64
+ end
65
+
66
+ private
67
+
68
+ def update_wizard_state(state)
69
+ if state.is_a? Array
70
+ @state = state
71
+ @state.each do |state_item| #generates autocompletion handles
72
+ self.class_eval do
73
+ define_method state_item[0] do |*args|
74
+ self.send :old_wizard_step, *[state_item[0], *args]
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ end
@@ -0,0 +1,16 @@
1
+ require 'app/ui/action_window'
2
+
3
+ module MenuModule
4
+
5
+ attr_accessor :menu_action
6
+
7
+ def menu_action
8
+ #TODO put in cache eventually:
9
+ action_values = self.class.ooor.const_get('ir.values').rpc_execute('get', 'action', 'tree_but_open', [['ir.ui.menu', id]], false, self.class.ooor.global_context)[0][2]#get already exists
10
+ @menu_action = self.class.ooor.const_get('ir.actions.act_window').new(action_values, []) #TODO deal with action reference instead
11
+ end
12
+
13
+ def open(mode='tree', ids=nil)
14
+ menu_action.open(mode, ids)
15
+ end
16
+ end
@@ -1,12 +1,18 @@
1
1
  require 'logger'
2
- require 'xmlrpc/client'
3
2
  require 'app/models/open_object_resource'
4
3
  require 'app/models/uml'
4
+ require 'app/models/db_service'
5
+ require 'app/models/common_service'
6
+ require 'app/ui/client_base'
5
7
 
6
8
  class Ooor
7
9
  include UML
10
+ include DbService
11
+ include CommonService
12
+ include ClientBase
8
13
 
9
- attr_accessor :logger, :config, :all_loaded_models, :base_url, :global_context, :ir_model_class
14
+ cattr_accessor :default_ooor, :default_config
15
+ attr_accessor :logger, :config, :loaded_models, :base_url, :global_context, :ir_model_class
10
16
 
11
17
  #load the custom configuration
12
18
  def self.load_config(config_file=nil, env=nil)
@@ -20,50 +26,39 @@ class Ooor
20
26
  raise
21
27
  end
22
28
 
23
- def global_login(user, password)
24
- @config[:username] = user
25
- @config[:password] = password
26
- client = OpenObjectResource.client(@base_url + "/common")
27
- OpenObjectResource.try_with_pretty_error_log { client.call("login", @config[:database], user, password)}
28
- rescue Exception => error
29
- @logger.error """login to OpenERP server failed:
30
- #{error.inspect}
31
- Are your sure the server is started? Are your login parameters correct? Can this server ping the OpenERP server?
32
- login XML/RPC url was #{@config[:url].gsub(/\/$/,'') + "/common"}"""
33
- raise
34
- end
35
-
36
29
  def initialize(config, env=false)
37
30
  @config = config.is_a?(String) ? Ooor.load_config(config, env) : config
38
31
  @config.symbolize_keys!
39
- @logger = ((defined?(RAILS_ENV) && $0 != 'irb') ? Rails.logger : Logger.new(STDOUT))
32
+ @logger = ((defined?(Rails) && $0 != 'irb' || config[:force_rails_logger]) ? Rails.logger : Logger.new(STDOUT))
40
33
  @logger.level = config[:log_level] if config[:log_level]
34
+ OpenObjectResource.logger = @logger
41
35
  @base_url = config[:url].gsub(/\/$/,'')
42
- @global_context = config[:global_context] || {}
43
-
36
+ @loaded_models = []
44
37
  scope = Module.new and Object.const_set(config[:scope_prefix], scope) if config[:scope_prefix]
38
+ if config[:database]
39
+ load_models()
40
+ end
41
+ end
45
42
 
46
- config[:user_id] = global_login(config[:username] || 'admin', config[:password] || 'admin')
47
-
48
- @all_loaded_models = []
49
- OpenObjectResource.logger = @logger
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])
52
- define_openerp_model("ir.model.data", nil, nil, nil, nil, config[:scope_prefix])
43
+ def const_get(model_key)
44
+ @ir_model_class.const_get(model_key)
45
+ end
53
46
 
54
- if config[:models] #we load only a customized subset of the OpenERP models
55
- models = @ir_model_class.find(:all, :domain => [['model', 'in', config[:models]]])
47
+ def load_models(to_load_models=@config[:models])
48
+ @global_context = @config[:global_context] || {}
49
+ global_login(@config[:username] || 'admin', @config[:password] || 'admin')
50
+ @ir_model_class = define_openerp_model("ir.model", @config[:scope_prefix])
51
+ define_openerp_model("ir.model.fields", @config[:scope_prefix])
52
+ if to_load_models #we load only a customized subset of the OpenERP models
53
+ models = @ir_model_class.find(:all, :domain => [['model', 'in', to_load_models]])
56
54
  else #we load all the models
57
- models = @ir_model_class.find(:all).reject {|model| ["ir.model", "ir.model.fields", "ir.model.data"].index model.model}
55
+ models = @ir_model_class.find(:all).reject {|model| ["ir.model", "ir.model.fields"].index model.model}
58
56
  end
59
- models.each {|openerp_model| define_openerp_model(openerp_model, nil, nil, nil, nil, config[:scope_prefix])}
60
- end
61
-
62
- module Test
63
-
57
+ @global_context.merge!({}).merge!(@config[:global_context] || {})
58
+ models.each {|openerp_model| define_openerp_model(openerp_model, @config[:scope_prefix])}
64
59
  end
65
60
 
66
- def define_openerp_model(arg, url, database, user_id, pass, scope_prefix)
61
+ def define_openerp_model(arg, scope_prefix=nil, url=nil, database=nil, user_id=nil, pass=nil)
67
62
  if arg.is_a?(String) && arg != 'ir.model' && arg != 'ir.model.fields'
68
63
  arg = @ir_model_class.find(:first, :domain => [['model', '=', arg]])
69
64
  end
@@ -73,7 +68,7 @@ class Ooor
73
68
  klass.site = url || @base_url
74
69
  klass.user = user_id
75
70
  klass.password = pass
76
- klass.openerp_database = database
71
+ klass.database = database
77
72
  klass.openerp_model = param['model']
78
73
  klass.openerp_id = url || param['id']
79
74
  klass.info = (param['info'] || '').gsub("'",' ')
@@ -84,20 +79,20 @@ class Ooor
84
79
  klass.many2one_relations = {}
85
80
  klass.one2many_relations = {}
86
81
  klass.many2many_relations = {}
82
+ klass.polymorphic_m2o_relations = {}
87
83
  klass.relations_keys = []
88
84
  klass.fields = {}
89
85
  klass.scope_prefix = scope_prefix
90
86
  model_class_name = klass.class_name_from_model_key
91
87
  @logger.info "registering #{model_class_name} as a Rails ActiveResource Model wrapper for OpenObject #{param['model']} model"
92
88
  (scope_prefix ? Object.const_get(scope_prefix) : Object).const_set(model_class_name, klass)
93
- @all_loaded_models.push(klass)
89
+ @loaded_models.push(klass)
94
90
  klass
95
91
  end
96
92
 
97
93
  end
98
94
 
99
- #Optionnal Rails settings:
100
- if defined?(Rails)
101
- config = Ooor.load_config(false, RAILS_ENV)
102
- OOOR = Ooor.new(config) if config['bootstrap']
95
+ if defined?(Rails) #Optionnal autoload in Rails:
96
+ Ooor.default_config = Ooor.load_config(false, RAILS_ENV)
97
+ Ooor.default_ooor = Ooor.new(Ooor.default_config) if Ooor.default_config['bootstrap']
103
98
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 1
7
7
  - 2
8
- - 8
9
- version: 1.2.8
8
+ - 9
9
+ version: 1.2.9
10
10
  platform: ruby
11
11
  authors:
12
12
  - Raphael Valyi - www.akretion.com
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-02 00:00:00 -03:00
17
+ date: 2010-03-10 00:00:00 -03:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -43,10 +43,15 @@ files:
43
43
  - README.md
44
44
  - MIT-LICENSE
45
45
  - lib/ooor.rb
46
+ - ooor.yml
46
47
  - lib/app/models/open_object_resource.rb
47
- - lib/app/models/open_object_ui.rb
48
48
  - lib/app/models/uml.rb
49
- - ooor.yml
49
+ - lib/app/models/db_service.rb
50
+ - lib/app/models/common_service.rb
51
+ - lib/app/ui/action_window.rb
52
+ - lib/app/ui/client_base.rb
53
+ - lib/app/ui/form_model.rb
54
+ - lib/app/ui/menu.rb
50
55
  has_rdoc: true
51
56
  homepage: http://github.com/rvalyi/ooor
52
57
  licenses: []
@@ -1,45 +0,0 @@
1
- class OpenObjectLayoutedFields
2
- attr_accessor :arch, :fields
3
-
4
- def initialize(arch, fields)
5
- @arch = arch
6
- @fields = fields
7
- end
8
- end
9
-
10
- class OpenObjectWizard < OpenObjectLayoutedFields
11
- attr_accessor :name, :id, :datas, :arch, :fields, :type, :state, :open_object_resources
12
-
13
- def initialize(name, id, data, open_object_resources, wizard_context)
14
- super(data['arch'], data['fields'])
15
- @name = name
16
- @id = id
17
- @open_object_resources = open_object_resources
18
- @datas = data['datas'].symbolize_keys!
19
- @type = data['type']
20
- @state = data['state']
21
- @wizard_context = wizard_context
22
- end
23
-
24
- def method_missing(method_symbol, *arguments)
25
- values = @datas.merge((arguments[0] || {}).symbolize_keys!)
26
- context = @wizard_context.merge(arguments[1] || {})
27
- if @open_object_resources.size == 1
28
- open_object_resource = @open_object_resources[0]
29
- data = open_object_resource.class.old_wizard_step(@name, [open_object_resource.id], method_symbol, @id, values, context)
30
- if data[1]['state'] == 'end'
31
- return open_object_resource.reload_from_record!(open_object_resource.class.find(open_object_resource.id, :context => context))
32
- end
33
- @arch = data[1]['arch']
34
- @fields = data[1]['fields']
35
- @datas = data[1]['datas'].symbolize_keys!
36
- @type = data[1]['type']
37
- @state = data[1]['state']
38
- return self
39
- else
40
- ids = @open_object_resources.collect{|open_object_resources| open_object_resources.id}
41
- return open_object_resource.class.old_wizard_step(@name, ids, method_symbol, @id, values, context)
42
- end
43
- end
44
-
45
- end