ooor 2.0.4 → 2.0.5
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.
- checksums.yaml +4 -4
- data/lib/ooor.rb +7 -2
- data/lib/ooor/associations.rb +37 -13
- data/lib/ooor/autosave_association.rb +197 -0
- data/lib/ooor/base.rb +21 -28
- data/lib/ooor/errors.rb +1 -1
- data/lib/ooor/field_methods.rb +37 -27
- data/lib/ooor/mini_active_resource.rb +16 -22
- data/lib/ooor/model_registry.rb +6 -1
- data/lib/ooor/model_schema.rb +25 -0
- data/lib/ooor/naming.rb +27 -13
- data/lib/ooor/nested_attributes.rb +57 -0
- data/lib/ooor/persistence.rb +247 -49
- data/lib/ooor/reflection.rb +9 -7
- data/lib/ooor/reflection_ooor.rb +17 -17
- data/lib/ooor/relation.rb +0 -1
- data/lib/ooor/relation/finder_methods.rb +4 -4
- data/lib/ooor/report.rb +9 -9
- data/lib/ooor/services.rb +1 -1
- data/lib/ooor/session.rb +72 -22
- data/lib/ooor/session_handler.rb +17 -21
- data/lib/ooor/type_casting.rb +34 -37
- data/lib/ooor/version.rb +1 -1
- data/spec/ooor_spec.rb +192 -43
- metadata +7 -9
- data/lib/ooor/connection.rb +0 -37
- data/spec/install_nightly.sh +0 -17
- data/spec/requirements.txt +0 -19
data/lib/ooor/reflection.rb
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
require 'active_support/core_ext/class/attribute'
|
2
2
|
require 'active_support/core_ext/object/inclusion'
|
3
3
|
|
4
|
-
# NOTE this is a scoped copy of ActiveRecord reflection.rb
|
5
|
-
# the few necessary hacks are explicited with a FIXME or a NOTE
|
6
|
-
# an addition Ooor specific reflection module completes this one explicitely
|
7
4
|
module Ooor
|
8
5
|
# = Active Record Reflection
|
6
|
+
# NOTE this is a shrinked copy of ActiveRecord reflection.rb
|
7
|
+
# the few necessary hacks are explicited with a FIXME or a NOTE
|
8
|
+
# an addition Ooor specific reflection module completes this one explicitely
|
9
9
|
module Reflection # :nodoc:
|
10
10
|
extend ActiveSupport::Concern
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
# NOTE we do the following differently in Ooor because we really don't want to share
|
13
|
+
# reflactions between the various sessions!!
|
14
|
+
# included do
|
15
|
+
# class_attribute :reflections
|
16
|
+
# self.reflections = {}
|
17
|
+
# end
|
16
18
|
|
17
19
|
# Reflection enables to interrogate Active Record classes and objects
|
18
20
|
# about their associations and aggregations. This information can,
|
data/lib/ooor/reflection_ooor.rb
CHANGED
@@ -6,11 +6,19 @@ module Ooor
|
|
6
6
|
module ReflectionOoor # :nodoc:
|
7
7
|
extend ActiveSupport::Concern
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
def column_for_attribute(name)
|
10
|
+
self.class.columns_hash[name.to_s]
|
11
|
+
end
|
12
12
|
|
13
13
|
module ClassMethods
|
14
|
+
def reflections
|
15
|
+
@reflections ||= {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def reflections=(reflections)
|
19
|
+
@reflections = reflections
|
20
|
+
end
|
21
|
+
|
14
22
|
def columns_hash(view_fields=nil)
|
15
23
|
if view_fields || !@t.columns_hash
|
16
24
|
view_fields ||= {}
|
@@ -30,32 +38,23 @@ module Ooor
|
|
30
38
|
def create_reflection(name)
|
31
39
|
reload_fields_definition()
|
32
40
|
options = {}
|
41
|
+
relation = all_fields[name]['relation']
|
42
|
+
options[:class_name] = relation
|
33
43
|
if many2one_associations.keys.include?(name)
|
34
44
|
macro = :belongs_to
|
35
|
-
relation = many2one_associations[name]['relation'] #TODO prefix?
|
36
|
-
const_get(relation)
|
37
|
-
options[:class_name] = relation #TODO or pass it camelized already?
|
38
45
|
elsif many2many_associations.keys.include?(name)
|
39
46
|
macro = :has_and_belongs_to_many
|
40
47
|
elsif one2many_associations.keys.include?(name)
|
41
48
|
macro = :has_many
|
42
49
|
end
|
43
50
|
reflection = Reflection::AssociationReflection.new(macro, name, options, nil)#active_record) #TODO active_record?
|
44
|
-
# case macro
|
45
|
-
# when :has_many, :belongs_to, :has_one, :has_and_belongs_to_many
|
46
|
-
# klass = options[:through] ? ThroughReflection : AssociationReflection
|
47
|
-
# reflection = klass.new(macro, name, options, active_record)
|
48
|
-
# when :composed_of
|
49
|
-
# reflection = AggregateReflection.new(macro, name, options, active_record)
|
50
|
-
# end
|
51
|
-
|
52
51
|
self.reflections = self.reflections.merge(name => reflection)
|
53
52
|
reflection
|
54
53
|
end
|
55
54
|
|
56
55
|
def reflect_on_association(association)
|
57
56
|
reflections[association] ||= create_reflection(association.to_s).tap do |reflection|
|
58
|
-
reflection.
|
57
|
+
reflection.session = session
|
59
58
|
end
|
60
59
|
end
|
61
60
|
end
|
@@ -69,7 +68,7 @@ module Ooor
|
|
69
68
|
module Reflection # :nodoc:
|
70
69
|
|
71
70
|
class MacroReflection
|
72
|
-
attr_accessor :
|
71
|
+
attr_accessor :session
|
73
72
|
end
|
74
73
|
|
75
74
|
# Holds all the meta-data about an association as it was specified in the
|
@@ -89,7 +88,8 @@ module Ooor
|
|
89
88
|
# instead. This allows plugins to hook into association object creation.
|
90
89
|
def klass
|
91
90
|
# @klass ||= active_record.send(:compute_type, class_name)
|
92
|
-
@klass ||=
|
91
|
+
# @klass ||= session.class_name_from_model_key(class_name).constantize
|
92
|
+
@klass = session.const_get(class_name)
|
93
93
|
end
|
94
94
|
|
95
95
|
def initialize(macro, name, options, active_record)
|
data/lib/ooor/relation.rb
CHANGED
@@ -41,7 +41,7 @@ module Ooor
|
|
41
41
|
#actually finds many resources specified with scope = ids_array
|
42
42
|
def find_single(scope, options)
|
43
43
|
context = options[:context] || {}
|
44
|
-
reload_fields_definition(false
|
44
|
+
reload_fields_definition(false)
|
45
45
|
fields = options[:fields] || options[:only] || fast_fields(options)
|
46
46
|
fields += options[:include] if options[:include]
|
47
47
|
|
@@ -51,7 +51,7 @@ module Ooor
|
|
51
51
|
is_collection, records = read_domain(context, fields, options)
|
52
52
|
end
|
53
53
|
active_resources = []
|
54
|
-
records.each { |record| active_resources << new(record, [],
|
54
|
+
records.each { |record| active_resources << new(record, [], true)}
|
55
55
|
if is_collection
|
56
56
|
active_resources
|
57
57
|
else
|
@@ -68,12 +68,12 @@ module Ooor
|
|
68
68
|
end
|
69
69
|
scope.map! { |item| item_to_id(item, context) }.reject! {|item| !item}
|
70
70
|
records = rpc_execute('read', scope, fields, context.dup)
|
71
|
-
records.sort_by! {|r| scope.index(r["id"])} if @
|
71
|
+
records.sort_by! {|r| scope.index(r["id"])} if @session.config[:force_xml_rpc]
|
72
72
|
return is_collection, records
|
73
73
|
end
|
74
74
|
|
75
75
|
def read_domain(context, fields, options)
|
76
|
-
if @
|
76
|
+
if @session.config[:force_xml_rpc]
|
77
77
|
domain = to_openerp_domain(options[:domain] || options[:conditions] || [])
|
78
78
|
ids = rpc_execute('search', domain, options[:offset] || 0, options[:limit] || false, options[:order] || false, context.dup)
|
79
79
|
records = rpc_execute('read', ids, fields, context.dup)
|
data/lib/ooor/report.rb
CHANGED
@@ -7,19 +7,19 @@ module Ooor
|
|
7
7
|
module ClassMethods
|
8
8
|
#Added methods to obtain report data for a model
|
9
9
|
def report(report_name, ids, report_type='pdf', context={}) #TODO move to ReportService
|
10
|
-
context =
|
11
|
-
uid = @
|
12
|
-
pass = @
|
13
|
-
db = @
|
10
|
+
context = session.object.inject_session_context(:report, false, context)[0]
|
11
|
+
uid = @session.config[:user_id]
|
12
|
+
pass = @session.config[:password]
|
13
|
+
db = @session.config[:database]
|
14
14
|
params = {model: openerp_model, id: ids[0], report_type: report_type}
|
15
|
-
|
15
|
+
session.report.report(db, uid, pass, report_name, ids, params, context)
|
16
16
|
end
|
17
17
|
|
18
18
|
def report_get(report_id)
|
19
|
-
uid = @
|
20
|
-
pass = @
|
21
|
-
db = @
|
22
|
-
|
19
|
+
uid = @session.config[:user_id]
|
20
|
+
pass = @session.config[:password]
|
21
|
+
db = @session.config[:database]
|
22
|
+
session.report.report_get(db, uid, pass, report_id)
|
23
23
|
end
|
24
24
|
|
25
25
|
def get_report_data(report_name, ids, report_type='pdf', context={})
|
data/lib/ooor/services.rb
CHANGED
@@ -66,7 +66,7 @@ module Ooor
|
|
66
66
|
|
67
67
|
def create(password=@session.config[:db_password], db_name='ooor_test', demo=true, lang='en_US', user_password=@session.config[:password] || 'admin')
|
68
68
|
@session.logger.info "creating database #{db_name} this may take a while..."
|
69
|
-
process_id = @session.get_client(:xml, @session.base_url + "/db").call("
|
69
|
+
process_id = @session.get_client(:xml, @session.base_url + "/db").call("create_database", password, db_name, demo, lang, user_password)
|
70
70
|
sleep(2)
|
71
71
|
while get_progress(password, process_id)[0] != 1
|
72
72
|
@session.logger.info "..."
|
data/lib/ooor/session.rb
CHANGED
@@ -1,38 +1,60 @@
|
|
1
1
|
require 'ooor/services'
|
2
|
+
require 'active_support/configurable'
|
3
|
+
require 'active_support/core_ext/hash/slice'
|
2
4
|
|
3
5
|
module Ooor
|
4
|
-
class Session
|
6
|
+
class Session
|
7
|
+
include ActiveSupport::Configurable
|
5
8
|
include Transport
|
6
9
|
|
7
|
-
attr_accessor :web_session, :
|
10
|
+
attr_accessor :web_session, :id, :models
|
8
11
|
|
9
12
|
def common(); @common_service ||= CommonService.new(self); end
|
10
13
|
def db(); @db_service ||= DbService.new(self); end
|
11
14
|
def object(); @object_service ||= ObjectService.new(self); end
|
12
15
|
def report(); @report_service ||= ReportService.new(self); end
|
13
16
|
|
14
|
-
def initialize(
|
15
|
-
|
16
|
-
|
17
|
+
def initialize(config, web_session, id)
|
18
|
+
set_config(_config(config))
|
19
|
+
Object.const_set(config[:scope_prefix], Module.new) if config[:scope_prefix]
|
20
|
+
@models = {}
|
21
|
+
@local_context = {}
|
17
22
|
@web_session = web_session || {}
|
18
23
|
@id = id || web_session[:session_id]
|
19
24
|
end
|
20
25
|
|
26
|
+
def set_config(configuration)
|
27
|
+
configuration.each do |k, v|
|
28
|
+
config.send "#{k}=", v
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# a part of the config that will be mixed in the context of each session
|
33
|
+
def connection_session
|
34
|
+
HashWithIndifferentAccess.new(config[:connection_session] || {})
|
35
|
+
end
|
36
|
+
|
21
37
|
def [](key)
|
22
|
-
|
38
|
+
self[key]
|
23
39
|
end
|
24
40
|
|
25
41
|
def []=(key, value)
|
26
|
-
|
42
|
+
self[key] = value
|
27
43
|
end
|
28
44
|
|
29
45
|
def global_login(options)
|
30
|
-
config.merge!(options)
|
46
|
+
config.merge!(options.symbolize_keys)
|
31
47
|
load_models(config[:models], options[:reload])
|
32
48
|
end
|
33
49
|
|
50
|
+
def with_context(context)
|
51
|
+
@local_context = context
|
52
|
+
yield
|
53
|
+
@local_context = {}
|
54
|
+
end
|
55
|
+
|
34
56
|
def session_context(context={})
|
35
|
-
connection_session.merge(web_session.slice('lang', 'tz')).merge(context) # not just lang and tz?
|
57
|
+
connection_session.merge(web_session.slice('lang', 'tz')).merge(@local_context).merge(context) # not just lang and tz?
|
36
58
|
end
|
37
59
|
|
38
60
|
def const_get(model_key, lang=nil);
|
@@ -56,27 +78,40 @@ module Ooor
|
|
56
78
|
|
57
79
|
def load_models(model_names=config[:models], reload=config[:reload])
|
58
80
|
helper_paths.each do |dir|
|
59
|
-
Dir[dir].each { |file| require file }
|
81
|
+
::Dir[dir].each { |file| require file }
|
60
82
|
end
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
83
|
+
search_domain = model_names ? [['model', 'in', model_names]] : []
|
84
|
+
models_records = read_model_data(search_domain)
|
85
|
+
models_records.reject {|opts| opts['model'] == '_unknown' }.each do |opts|
|
86
|
+
options = HashWithIndifferentAccess.new(opts.merge(scope_prefix: config[:scope_prefix],
|
87
|
+
reload: reload,
|
88
|
+
generate_constants: config[:generate_constants]))
|
67
89
|
define_openerp_model(options)
|
68
90
|
end
|
69
91
|
end
|
70
92
|
|
93
|
+
def read_model_data(search_domain)
|
94
|
+
if config[:force_xml_rpc]
|
95
|
+
model_ids = object.object_service(:execute, "ir.model", :search, search_domain, 0, false, false, {}, false)
|
96
|
+
models_records = object.object_service(:execute, "ir.model", :read, model_ids, ['model', 'name'])
|
97
|
+
else
|
98
|
+
response = object.object_service(:search_read, "ir.model", 'search_read',
|
99
|
+
fields: ['model', 'name'],
|
100
|
+
offset: 0,
|
101
|
+
limit: false,
|
102
|
+
domain: search_domain,
|
103
|
+
sort: false,
|
104
|
+
context: {})
|
105
|
+
models_records = response["records"]
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
71
109
|
def set_model_template!(klass, options)
|
72
110
|
template = Ooor.model_registry.get_template(config, options[:model])
|
73
111
|
if template
|
74
112
|
klass.t = template
|
75
|
-
klass.one2many_associations.keys.each do |meth|
|
76
|
-
klass.define_nested_attributes_method(meth)
|
77
|
-
end
|
78
113
|
else
|
79
|
-
template = Ooor::
|
114
|
+
template = Ooor::ModelSchema.new
|
80
115
|
template.openerp_model = options[:model]
|
81
116
|
template.openerp_id = options[:id]
|
82
117
|
template.description = options[:name]
|
@@ -100,7 +135,7 @@ module Ooor
|
|
100
135
|
set_model_template!(klass, options)
|
101
136
|
klass.name = model_class_name
|
102
137
|
klass.scope_prefix = scope_prefix
|
103
|
-
klass.
|
138
|
+
klass.session = self
|
104
139
|
if options[:generate_constants] && (options[:reload] || !scope.const_defined?(model_class_name))
|
105
140
|
scope.const_set(model_class_name, klass)
|
106
141
|
end
|
@@ -112,9 +147,24 @@ module Ooor
|
|
112
147
|
models[options[:model]]
|
113
148
|
end
|
114
149
|
|
115
|
-
def models; @models ||= {}; end
|
150
|
+
# def models; @models ||= {}; end
|
116
151
|
|
117
152
|
def logger; Ooor.logger; end
|
118
153
|
|
154
|
+
def helper_paths
|
155
|
+
[File.dirname(__FILE__) + '/helpers/*', *config[:helper_paths]]
|
156
|
+
end
|
157
|
+
|
158
|
+
def class_name_from_model_key(model_key)
|
159
|
+
model_key.split('.').collect {|name_part| name_part.capitalize}.join
|
160
|
+
end
|
161
|
+
|
162
|
+
private
|
163
|
+
|
164
|
+
def _config(config)
|
165
|
+
c = config.is_a?(String) ? Ooor.load_config(config, env) : config #TODO env, see old Connection
|
166
|
+
HashWithIndifferentAccess.new(c)
|
167
|
+
end
|
168
|
+
|
119
169
|
end
|
120
170
|
end
|
data/lib/ooor/session_handler.rb
CHANGED
@@ -1,49 +1,45 @@
|
|
1
1
|
require 'active_support/core_ext/hash/indifferent_access'
|
2
2
|
require 'ooor/session'
|
3
|
-
require 'ooor/connection'
|
4
3
|
|
5
4
|
module Ooor
|
6
5
|
autoload :SecureRandom, 'securerandom'
|
6
|
+
# The SessionHandler allows to retrieve a session with its loaded proxies to OpenERP
|
7
7
|
class SessionHandler
|
8
|
-
|
9
|
-
|
8
|
+
|
9
|
+
def noweb_session_spec(config)
|
10
|
+
"#{config[:url]}-#{config[:database]}-#{config[:username]}"
|
10
11
|
end
|
11
12
|
|
12
13
|
def retrieve_session(config, id=nil, web_session={})
|
13
14
|
id ||= SecureRandom.hex(16)
|
14
|
-
if
|
15
|
-
|
15
|
+
if id == :noweb
|
16
|
+
spec = noweb_session_spec(config)
|
16
17
|
else
|
17
|
-
|
18
|
+
spec = id
|
18
19
|
end
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
Ooor::Session.new(
|
20
|
+
if config[:reload] || !s = sessions[spec]
|
21
|
+
config = Ooor.default_config.merge(config) if Ooor.default_config.is_a? Hash
|
22
|
+
Ooor::Session.new(config, web_session, id)
|
23
|
+
elsif noweb_session_spec(s.config) != noweb_session_spec(config)
|
24
|
+
config = Ooor.default_config.merge(config) if Ooor.default_config.is_a? Hash
|
25
|
+
Ooor::Session.new(config, web_session, id)
|
25
26
|
else
|
26
|
-
|
27
|
-
connections[c_spec] = s.connection
|
28
|
-
end
|
27
|
+
s.tap {|s| s.web_session.merge!(web_session)} #TODO merge config also?
|
29
28
|
end
|
30
29
|
end
|
31
30
|
|
32
31
|
def register_session(session)
|
33
32
|
if session.config[:session_sharing]
|
34
33
|
spec = session.web_session[:session_id]
|
34
|
+
elsif session.id != :noweb
|
35
|
+
spec = session.id
|
35
36
|
else
|
36
|
-
spec= session.
|
37
|
+
spec = noweb_session_spec(session.config)
|
37
38
|
end
|
38
39
|
set_web_session(spec, session.web_session)
|
39
40
|
sessions[spec] = session
|
40
41
|
end
|
41
42
|
|
42
|
-
def create_new_connection(config, spec)
|
43
|
-
config = Ooor.default_config.merge(config) if Ooor.default_config.is_a? Hash
|
44
|
-
Connection.new(config)
|
45
|
-
end
|
46
|
-
|
47
43
|
def reset!
|
48
44
|
@sessions = {}
|
49
45
|
@connections = {}
|
data/lib/ooor/type_casting.rb
CHANGED
@@ -107,7 +107,9 @@ module Ooor
|
|
107
107
|
true
|
108
108
|
elsif type == 'boolean'&& value == 0 || value == "0"
|
109
109
|
false
|
110
|
-
elsif value == false
|
110
|
+
elsif value == false && type != 'boolean'
|
111
|
+
nil
|
112
|
+
elsif (type == 'char' || type == 'text') && value == "" && @attributes[skey] == nil
|
111
113
|
nil
|
112
114
|
else
|
113
115
|
value
|
@@ -120,13 +122,13 @@ module Ooor
|
|
120
122
|
elsif value.is_a?(Array) && !self.class.many2one_associations.keys.index(skey)
|
121
123
|
value.reject {|i| i == ''}.map {|i| i.is_a?(String) ? i.to_i : i}
|
122
124
|
elsif value.is_a?(String)
|
123
|
-
|
125
|
+
sanitize_association_as_string(skey, value)
|
124
126
|
else
|
125
127
|
value
|
126
128
|
end
|
127
129
|
end
|
128
130
|
|
129
|
-
def
|
131
|
+
def sanitize_association_as_string(skey, value)
|
130
132
|
if self.class.polymorphic_m2o_associations.has_key?(skey)
|
131
133
|
value
|
132
134
|
elsif self.class.many2one_associations.has_key?(skey)
|
@@ -145,56 +147,51 @@ module Ooor
|
|
145
147
|
end
|
146
148
|
|
147
149
|
def to_openerp_hash
|
148
|
-
|
149
|
-
associations =
|
150
|
-
|
150
|
+
attribute_keys, association_keys = get_changed_values
|
151
|
+
associations = {}
|
152
|
+
association_keys.each { |k| associations[k] = self.cast_association(k) }
|
153
|
+
@attributes.slice(*attribute_keys).merge(associations)
|
151
154
|
end
|
152
155
|
|
153
156
|
def get_changed_values
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
changed.each do |k|
|
158
|
-
if self.class.associations_keys.index(k)
|
159
|
-
associations[k] = @associations[k]#changes[k][1]
|
160
|
-
elsif self.class.fields.has_key?(k)
|
161
|
-
attributes[k]= @attributes[k]
|
162
|
-
elsif !BLACKLIST.index(k)
|
163
|
-
attributes[k] = changes[k][1]
|
164
|
-
end
|
165
|
-
end
|
166
|
-
return attributes, associations
|
167
|
-
end
|
168
|
-
|
169
|
-
def cast_associations_to_openerp(associations=@associations)
|
170
|
-
associations.each do |k, v|
|
171
|
-
associations[k] = self.cast_association(k, v)
|
172
|
-
end
|
157
|
+
attribute_keys = changed.select {|k| self.class.fields.has_key?(k)} - BLACKLIST
|
158
|
+
association_keys = changed.select {|k| self.class.associations_keys.index(k)}
|
159
|
+
return attribute_keys, association_keys
|
173
160
|
end
|
174
161
|
|
175
162
|
# talk OpenERP cryptic associations API
|
176
|
-
def cast_association(k
|
163
|
+
def cast_association(k)
|
177
164
|
if self.class.one2many_associations[k]
|
178
|
-
|
165
|
+
if @loaded_associations[k]
|
166
|
+
v = @loaded_associations[k].select {|i| i.changed?}
|
167
|
+
v = @associations[k] if v.empty?
|
168
|
+
else
|
169
|
+
v = @associations[k]
|
170
|
+
end
|
171
|
+
cast_o2m_association(v)
|
179
172
|
elsif self.class.many2many_associations[k]
|
173
|
+
v = @associations[k]
|
180
174
|
[[6, false, (v || []).map {|i| i.is_a?(Base) ? i.id : i}]]
|
181
175
|
elsif self.class.many2one_associations[k]
|
176
|
+
v = @associations[k] # TODO support for nested
|
182
177
|
cast_m2o_association(v)
|
183
178
|
end
|
184
179
|
end
|
185
180
|
|
186
|
-
def
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
v.collect do |value|
|
191
|
-
if value.is_a?(Base)
|
181
|
+
def cast_o2m_association(v)
|
182
|
+
v.collect do |value|
|
183
|
+
if value.is_a?(Base)
|
184
|
+
if value.new_record?
|
192
185
|
[0, 0, value.to_openerp_hash]
|
193
|
-
elsif value.
|
194
|
-
[
|
195
|
-
|
196
|
-
[1, value,
|
186
|
+
elsif value.marked_for_destruction?
|
187
|
+
[2, value.id]
|
188
|
+
elsif value.id
|
189
|
+
[1, value.id , value.to_openerp_hash]
|
197
190
|
end
|
191
|
+
elsif value.is_a?(Hash)
|
192
|
+
[0, 0, value]
|
193
|
+
else #use case?
|
194
|
+
[1, value, {}]
|
198
195
|
end
|
199
196
|
end
|
200
197
|
end
|