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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c7013e218cfc09bfb4c0711c65904076f14f6e9d
4
- data.tar.gz: 37e409fe1330084c5ada2b5051c92381577febe1
3
+ metadata.gz: 68bb22d821a0337958de6835edebec32672e31d5
4
+ data.tar.gz: e515ccba848078b48a39b2ab22dae262dd717bda
5
5
  SHA512:
6
- metadata.gz: 09af180037d24d0008ef92c4365fa81ca9fbb503b8f07045cb1fd18e134785ddb72b8aff170c9a2c51e136b0422b6e630bef2f534f038702b0821de92254060c
7
- data.tar.gz: 2330653e660fd06751bc4bfd1ab79bfe9107b37ae441a2a98bb80ee3a85839046cd14146b4d86fa7bcf9e7d5b5cb5c714b70a7cf34fd08d120a0980d929c847c
6
+ metadata.gz: 070ab8305192ceaa8c77c959c656c89bdd06f2250e3818a2ed088f5a6920bfda147420d583e748d5ceb2ddfec0dbe7f826ea37bf068bc92cbc2a8784028fd294
7
+ data.tar.gz: fdf089b8708e2e6912945976f3d85bf328af15e62bbe8e48e08553ddc0bd8887c2ca06b788ee389831424df8a70fec0a17ec5919e1feee3bfd6fe4fef73ea39a
@@ -12,7 +12,10 @@ require 'logger'
12
12
  module Ooor
13
13
  extend ActiveSupport::Autoload
14
14
  autoload :Base
15
+ autoload :ModelSchema
15
16
  autoload :Persistence
17
+ autoload :AutosaveAssociation
18
+ autoload :NestedAttributes
16
19
  autoload :Callbacks
17
20
  autoload :Cache, 'active_support/cache'
18
21
  autoload :Serialization
@@ -96,8 +99,10 @@ module Ooor
96
99
  end
97
100
 
98
101
 
99
- def with_ooor_session(config={}, id=nil)
100
- yield Ooor.session_handler.retrieve_session(config, id)
102
+ def with_ooor_session(config={}, id=:noweb)
103
+ session = Ooor.session_handler.retrieve_session(config, id)
104
+ Ooor.session_handler.register_session(session)
105
+ yield session
101
106
  end
102
107
 
103
108
  def with_ooor_default_session(config={})
@@ -26,25 +26,49 @@ module Ooor
26
26
 
27
27
  # fakes associations like much like ActiveRecord according to the cached OpenERP data model
28
28
  def relationnal_result(method_name, *arguments)
29
- self.class.reload_fields_definition(false, object_session)
29
+ self.class.reload_fields_definition(false)
30
30
  if self.class.many2one_associations.has_key?(method_name)
31
- if !@associations[method_name]
32
- nil
33
- else
34
- id = @associations[method_name].is_a?(Integer) ? @associations[method_name] : @associations[method_name][0]
35
- rel = self.class.many2one_associations[method_name]['relation']
36
- self.class.const_get(rel).find(id, arguments.extract_options!)
37
- end
38
- elsif self.class.polymorphic_m2o_associations.has_key?(method_name) && @associations[method_name]
31
+ load_m2o_association(method_name, *arguments)
32
+ elsif self.class.polymorphic_m2o_associations.has_key?(method_name)# && @associations[method_name]
33
+ load_polymorphic_m2o_association(method_name, *arguments)
34
+ # values = @associations[method_name].split(',')
35
+ # self.class.const_get(values[0]).find(values[1], arguments.extract_options!)
36
+ else # o2m or m2m
37
+ load_x2m_association(method_name, *arguments)
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def load_polymorphic_m2o_association(method_name, *arguments)
44
+ if @associations[method_name]
39
45
  values = @associations[method_name].split(',')
40
46
  self.class.const_get(values[0]).find(values[1], arguments.extract_options!)
41
- else # o2m or m2m
42
- rel = self.class.all_fields[method_name]['relation']
43
- load_x2m_association(rel, @associations[method_name], *arguments)
47
+ else
48
+ false
49
+ end
50
+ end
51
+
52
+ def load_m2o_association(method_name, *arguments)
53
+ if !@associations[method_name]
54
+ nil
55
+ else
56
+ if @associations[method_name].is_a?(Integer)
57
+ id = @associations[method_name]
58
+ display_name = nil
59
+ else
60
+ id = @associations[method_name][0]
61
+ display_name = @associations[method_name][1]
62
+ end
63
+ rel = self.class.many2one_associations[method_name]['relation']
64
+ self.class.const_get(rel).new({id: id, _display_name: display_name}, [], true, false, true)
65
+ # self.class.const_get(rel).find(id, arguments.extract_options!)
44
66
  end
45
67
  end
46
68
 
47
- def load_x2m_association(model_key, ids, *arguments)
69
+ def load_x2m_association(method_name, *arguments)
70
+ model_key = self.class.all_fields[method_name]['relation']
71
+ ids = @associations[method_name] || []
48
72
  options = arguments.extract_options!
49
73
  related_class = self.class.const_get(model_key)
50
74
  CollectionProxy.new(related_class, {}).apply_finder_options(options.merge(ids: ids))
@@ -0,0 +1,197 @@
1
+ require 'ostruct'
2
+ require 'active_support/concern'
3
+
4
+ module Ooor
5
+ # = Ooor Autosave Association, adapted from ActiveRecord 4.1
6
+ #
7
+ # +AutosaveAssociation+ is a module that takes care of automatically saving
8
+ # associated records when their parent is saved. In addition to saving, it
9
+ # also destroys any associated records that were marked for destruction.
10
+ # (See +mark_for_destruction+ and <tt>marked_for_destruction?</tt>).
11
+ #
12
+ # Saving of the parent, its associations, and the destruction of marked
13
+ # associations, all happen inside a transaction. This should never leave the
14
+ # database in an inconsistent state.
15
+ #
16
+ # If validations for any of the associations fail, their error messages will
17
+ # be applied to the parent (TODO)
18
+ module AutosaveAssociation
19
+ extend ActiveSupport::Concern
20
+
21
+ module ClassMethods
22
+ private
23
+
24
+ # same as ActiveRecord
25
+ def define_non_cyclic_method(name, &block)
26
+ define_method(name) do |*args|
27
+ result = true; @_already_called ||= {}
28
+ # Loop prevention for validation of associations
29
+ unless @_already_called[name]
30
+ begin
31
+ @_already_called[name]=true
32
+ result = instance_eval(&block)
33
+ ensure
34
+ @_already_called[name]=false
35
+ end
36
+ end
37
+
38
+ result
39
+ end
40
+ end
41
+
42
+ # Adds validation and save callbacks for the association as specified by
43
+ # the +reflection+.
44
+ #
45
+ # For performance reasons, we don't check whether to validate at runtime.
46
+ # However the validation and callback methods are lazy and those methods
47
+ # get created when they are invoked for the very first time. However,
48
+ # this can change, for instance, when using nested attributes, which is
49
+ # called _after_ the association has been defined. Since we don't want
50
+ # the callbacks to get defined multiple times, there are guards that
51
+ # check if the save or validation methods have already been defined
52
+ # before actually defining them.
53
+ def add_autosave_association_callbacks(reflection) # TODO add support for m2o
54
+ save_method = :"autosave_associated_records_for_#{reflection.name}"
55
+ validation_method = :"validate_associated_records_for_#{reflection.name}"
56
+ collection = true #reflection.collection?
57
+ unless method_defined?(save_method)
58
+ if collection
59
+ before_save :before_save_collection_association
60
+ define_non_cyclic_method(save_method) { save_collection_association(reflection) }
61
+ before_save save_method
62
+ # NOTE Ooor is different from ActiveRecord here: we run the nested callbacks before saving
63
+ # the whole hash of values including the nested records
64
+ # Doesn't use after_save as that would save associations added in after_create/after_update twice
65
+ # after_create save_method
66
+ # after_update save_method
67
+ else
68
+ raise raise ArgumentError, "Not implemented in Ooor; seems OpenERP won't support such nested attribute in the same transaction anyhow"
69
+ end
70
+ end
71
+
72
+ if reflection.validate? && !method_defined?(validation_method)
73
+ method = (collection ? :validate_collection_association : :validate_single_association)
74
+ define_non_cyclic_method(validation_method) { send(method, reflection) }
75
+ validate validation_method
76
+ end
77
+ end
78
+ end
79
+
80
+ # Reloads the attributes of the object as usual and clears <tt>marked_for_destruction</tt> flag.
81
+ def reload(options = nil)
82
+ @marked_for_destruction = false
83
+ @destroyed_by_association = nil
84
+ super
85
+ end
86
+
87
+ # Marks this record to be destroyed as part of the parents save transaction.
88
+ # This does _not_ actually destroy the record instantly, rather child record will be destroyed
89
+ # when <tt>parent.save</tt> is called.
90
+ #
91
+ # Only useful if the <tt>:autosave</tt> option on the parent is enabled for this associated model.
92
+ def mark_for_destruction
93
+ @marked_for_destruction = true
94
+ end
95
+
96
+ # Returns whether or not this record will be destroyed as part of the parents save transaction.
97
+ #
98
+ # Only useful if the <tt>:autosave</tt> option on the parent is enabled for this associated model.
99
+ def marked_for_destruction?
100
+ @marked_for_destruction
101
+ end
102
+
103
+ # Records the association that is being destroyed and destroying this
104
+ # record in the process.
105
+ def destroyed_by_association=(reflection)
106
+ @destroyed_by_association = reflection
107
+ end
108
+
109
+ # Returns the association for the parent being destroyed.
110
+ #
111
+ # Used to avoid updating the counter cache unnecessarily.
112
+ def destroyed_by_association
113
+ @destroyed_by_association
114
+ end
115
+
116
+ # Returns whether or not this record has been changed in any way (including whether
117
+ # any of its nested autosave associations are likewise changed)
118
+ def changed_for_autosave?
119
+ new_record? || changed? || marked_for_destruction? # TODO || nested_records_changed_for_autosave?
120
+ end
121
+
122
+ private
123
+
124
+ # Returns the record for an association collection that should be validated
125
+ # or saved. If +autosave+ is +false+ only new records will be returned,
126
+ # unless the parent is/was a new record itself.
127
+ def associated_records_to_validate_or_save(association, new_record, autosave)
128
+ if new_record
129
+ association && association.target
130
+ elsif autosave
131
+ association.target.find_all { |record| record.changed_for_autosave? }
132
+ else
133
+ association.target.find_all { |record| record.new_record? }
134
+ end
135
+ end
136
+
137
+ # go through nested autosave associations that are loaded in memory (without loading
138
+ # any new ones), and return true if is changed for autosave
139
+ # def nested_records_changed_for_autosave?
140
+ # self.class.reflect_on_all_autosave_associations.any? do |reflection|
141
+ # association = association_instance_get(reflection.name)
142
+ # association && Array.wrap(association.target).any? { |a| a.changed_for_autosave? }
143
+ # end
144
+ # end
145
+
146
+ # Is used as a before_save callback to check while saving a collection
147
+ # association whether or not the parent was a new record before saving.
148
+ def before_save_collection_association
149
+ @new_record_before_save = new_record?
150
+ true
151
+ end
152
+
153
+ # Saves any new associated records, or all loaded autosave associations if
154
+ # <tt>:autosave</tt> is enabled on the association.
155
+ #
156
+ # In addition, it destroys all children that were marked for destruction
157
+ # with mark_for_destruction.
158
+ #
159
+ # This all happens inside a transaction, _if_ the Transactions module is included into
160
+ # ActiveRecord::Base after the AutosaveAssociation module, which it does by default.
161
+ def save_collection_association(reflection)
162
+ # if association = association_instance_get(reflection.name)
163
+ if target = @loaded_associations[reflection.name] #TODO use a real Association wrapper
164
+ association = OpenStruct.new(target: target)
165
+ autosave = reflection.options[:autosave]
166
+
167
+ if records = associated_records_to_validate_or_save(association, @new_record_before_save, autosave)
168
+ # NOTE saving the object with its nested associations will properly destroy records in OpenERP
169
+ # no need to do it now like in ActiveRecord
170
+ records.each do |record|
171
+ next if record.destroyed?
172
+
173
+ saved = true
174
+
175
+ if autosave != false && (@new_record_before_save || record.new_record?)
176
+ if autosave
177
+ # saved = association.insert_record(record, false)
178
+ record.run_callbacks(:save) { false }
179
+ record.run_callbacks(:create) { false }
180
+ # else
181
+ # association.insert_record(record) unless reflection.nested?
182
+ end
183
+ elsif autosave
184
+ record.run_callbacks(:save) {false}
185
+ record.run_callbacks(:update) {false}
186
+ # saved = record.save(:validate => false)
187
+ end
188
+
189
+ end
190
+ end
191
+ # reconstruct the scope now that we know the owner's id
192
+ # association.reset_scope if association.respond_to?(:reset_scope)
193
+ end
194
+ end
195
+
196
+ end
197
+ end
@@ -12,36 +12,19 @@ require 'ooor/errors'
12
12
 
13
13
  module Ooor
14
14
 
15
- # meta data shared across sessions, a cache of the data in ir_model in OpenERP.
16
- # reused accross workers in a multi-process web app (via memcache for instance).
17
- class ModelTemplate
18
-
19
- TEMPLATE_PROPERTIES = [:name, :openerp_id, :info, :access_ids, :description,
20
- :openerp_model, :field_ids, :state, :fields,
21
- :many2one_associations, :one2many_associations, :many2many_associations,
22
- :polymorphic_m2o_associations, :associations_keys,
23
- :associations, :columns]
24
-
25
- attr_accessor *TEMPLATE_PROPERTIES, :columns_hash
26
- end
27
-
28
15
  # the base class for proxies to OpenERP objects
29
16
  class Base < Ooor::MiniActiveResource
30
17
  include Naming, TypeCasting, Serialization, ReflectionOoor, Reflection
31
- include Associations, Report, FinderMethods, FieldMethods
18
+ include Associations, Report, FinderMethods, FieldMethods, AutosaveAssociation, NestedAttributes
32
19
 
33
20
  # ********************** class methods ************************************
34
21
  class << self
35
22
 
36
- attr_accessor :name, :connection, :t, :scope_prefix #template
37
- delegate *ModelTemplate::TEMPLATE_PROPERTIES, to: :t
23
+ attr_accessor :name, :session, :t, :scope_prefix
24
+ delegate *ModelSchema::TEMPLATE_PROPERTIES, to: :t
38
25
 
39
26
  # ******************** remote communication *****************************
40
27
 
41
- def create(attributes = {}, context={}, default_get_list=false, reload=true)
42
- self.new(attributes, default_get_list, context).tap { |resource| resource.save(context, reload) }
43
- end
44
-
45
28
  #OpenERP search method
46
29
  def search(domain=[], offset=0, limit=false, order=false, context={}, count=false)
47
30
  rpc_execute(:search, to_openerp_domain(domain), offset, limit, order, context, count)
@@ -60,8 +43,12 @@ module Ooor
60
43
  end
61
44
 
62
45
  def object_service(service, obj, method, *args)
63
- reload_fields_definition(false, connection.connection_session)
64
- cast_answer_to_ruby!(connection.object.object_service(service, obj, method, *cast_request_to_openerp(args)))
46
+ reload_fields_definition(false)
47
+ cast_answer_to_ruby!(session.object.object_service(service, obj, method, *cast_request_to_openerp(args)))
48
+ end
49
+
50
+ def context
51
+ session.session_context
65
52
  end
66
53
 
67
54
  def method_missing(method_symbol, *args)
@@ -71,8 +58,6 @@ module Ooor
71
58
 
72
59
  # ******************** AREL Minimal implementation ***********************
73
60
 
74
- def relation(context={}); @relation ||= Relation.new(self, context); end #TODO template
75
- def scoped(context={}); relation(context); end
76
61
  def where(opts, *rest); relation.where(opts, *rest); end
77
62
  def all(*args); relation.all(*args); end
78
63
  def limit(value); relation.limit(value); end
@@ -83,18 +68,22 @@ module Ooor
83
68
 
84
69
  def logger; Ooor.logger; end
85
70
 
71
+ private
72
+
73
+ def relation; @relation ||= Relation.new(self); end
74
+
86
75
  end
87
76
 
88
77
  self.name = "Base"
89
78
 
90
79
  # ********************** instance methods **********************************
91
80
 
92
- attr_accessor :associations, :loaded_associations, :ir_model_data_id, :object_session
81
+ attr_accessor :associations, :loaded_associations, :ir_model_data_id
93
82
 
94
83
  include Persistence, Callbacks, ActiveModel::Dirty
95
84
 
96
85
  def rpc_execute(method, *args)
97
- args += [self.class.connection.connection_session.merge(object_session)] unless args[-1].is_a? Hash
86
+ args += [self.class.context] unless args[-1].is_a? Hash
98
87
  self.class.object_service(:execute, self.class.openerp_model, method, *args)
99
88
  end
100
89
 
@@ -111,8 +100,8 @@ module Ooor
111
100
 
112
101
  #wrapper for OpenERP exec_workflow Business Process Management engine
113
102
  def wkf_action(action, context={}, reload=true)
114
- self.class.object_service(:exec_workflow, self.class.openerp_model, action, self.id, object_session)
115
- reload_fields(context) if reload
103
+ self.class.object_service(:exec_workflow, self.class.openerp_model, action, self.id, context)
104
+ reload_fields if reload
116
105
  end
117
106
 
118
107
  #Add get_report_data to obtain [report["result"],report["format]] of a concrete openERP Object
@@ -124,6 +113,10 @@ module Ooor
124
113
 
125
114
  private
126
115
 
116
+ def context
117
+ self.class.context
118
+ end
119
+
127
120
  # Ruby 1.9.compat, See also http://tenderlovemaking.com/2011/06/28/til-its-ok-to-return-nil-from-to_ary/
128
121
  def to_ary; nil; end # :nodoc:
129
122
 
@@ -25,7 +25,7 @@ module Ooor
25
25
  return ValueError.new(method, faultCode, faultString, *args)
26
26
  elsif faultCode =~ /ValidateError/
27
27
  return ValidationError.new(method, faultCode, faultString, *args)
28
- elsif faultCode =~ /AccessDenied/
28
+ elsif faultCode =~ /AccessDenied/ || faultCode =~ /Access Denied/
29
29
  return UnAuthorizedError.new(method, faultCode, faultString, *args)
30
30
  elsif faultCode =~ /AuthenticationError: Credentials not provided/
31
31
  return InvalidSessionError.new(method, faultCode, faultString, *args)
@@ -6,7 +6,7 @@ module Ooor
6
6
 
7
7
  module ClassMethods
8
8
 
9
- def reload_fields_definition(force=false, context=connection.web_session)
9
+ def reload_fields_definition(force=false)
10
10
  if force || !fields
11
11
  @t.fields = {}
12
12
  @columns_hash = {}
@@ -14,7 +14,7 @@ module Ooor
14
14
  fields_get.each { |k, field| reload_field_definition(k, field) }
15
15
  @t.associations_keys = many2one_associations.keys + one2many_associations.keys + many2many_associations.keys + polymorphic_m2o_associations.keys
16
16
  logger.debug "#{fields.size} fields loaded in model #{self.name}"
17
- Ooor.model_registry.set_template(connection.config, @t)
17
+ Ooor.model_registry.set_template(session.config, @t)
18
18
  end
19
19
  generate_accessors if fields != {} && (force || !@accessor_defined) #TODOmove in define_accessors method
20
20
  end
@@ -30,44 +30,28 @@ module Ooor
30
30
  end
31
31
  end
32
32
 
33
- # this is used by fields_for in ActionView FormHelper
34
- def define_nested_attributes_method(meth)
35
- unless self.respond_to?(meth)
36
- self.instance_eval do
37
- define_method "#{meth}_attributes=" do |*args|
38
- send("#{meth}_will_change!")
39
- @associations[meth] = args[0]
40
- @loaded_associations[meth] = args[0]
41
- end
42
- define_method "#{meth}_attributes" do |*args|
43
- @loaded_associations[meth]
44
- end
45
- end
46
- end
47
- end
48
-
49
33
  private
50
34
 
51
35
  def generate_accessors #TODO we should cache this is a module cached like the template, or eventually generate source code or both
52
36
  fields.keys.each { |meth| define_field_method meth }
53
37
  associations_keys.each { |meth| define_association_method meth }
54
- one2many_associations.keys.each { |meth| define_nested_attributes_method meth }
38
+ one2many_associations.keys.each { |meth| accepts_nested_attributes_for meth } #TODO do it for m2o too
55
39
  many2one_associations.keys.each do |meth|
56
40
  define_association_method meth
57
41
  define_m2o_association_method meth
58
42
  end
59
43
  (one2many_associations.keys + many2many_associations.keys).each do |meth|
60
44
  define_association_method meth
61
- alias_method "#{meth}_ids", meth
62
45
  alias_method "#{meth}_ids=", "#{meth}="
63
- alias_method "#{meth.to_s.singularize}_ids", meth
64
46
  alias_method "#{meth.to_s.singularize}_ids=", "#{meth}="
47
+ define_x2m_ids_association_method meth
48
+ alias_method "#{meth.to_s.singularize}_ids", "#{meth}_ids"
65
49
  end
66
50
  @accessor_defined = true
67
51
  end
68
52
 
69
53
  def define_field_method(meth)
70
- define_attribute_methods meth
54
+ define_attribute_method meth
71
55
  define_method meth do |*args|
72
56
  get_attribute(meth, *args)
73
57
  end
@@ -78,7 +62,7 @@ module Ooor
78
62
  end
79
63
 
80
64
  def define_association_method(meth)
81
- define_attribute_methods meth
65
+ define_attribute_method meth
82
66
  define_method meth do |*args|
83
67
  get_association(meth, *args)
84
68
  end
@@ -88,6 +72,12 @@ module Ooor
88
72
  end
89
73
  end
90
74
 
75
+ def define_x2m_ids_association_method(meth)
76
+ define_method "#{meth}_ids" do |*args|
77
+ @associations[meth]
78
+ end
79
+ end
80
+
91
81
  def define_m2o_association_method(meth)
92
82
  define_method "#{meth}_id" do |*args|
93
83
  if @associations[meth].is_a? Array
@@ -116,12 +106,31 @@ module Ooor
116
106
 
117
107
  end
118
108
 
109
+ attr_accessor :_display_name
110
+ alias _name _display_name
111
+
112
+ def _destroy=(dummy)
113
+ @marked_for_destruction = true unless dummy.blank? || ["false", "0", 0].index(dummy)
114
+ end
115
+
116
+ def _destroy
117
+ @marked_for_destruction
118
+ end
119
+
120
+ def lazy_load(meth, *args)
121
+ @lazy = false
122
+ load(rpc_execute('read', [id], (self.class.fast_fields + [meth]).uniq, *args || context)[0]).tap do
123
+ @lazy = false
124
+ end
125
+ end
126
+
119
127
  def get_attribute(meth, *args)
128
+ lazy_load(meth, *args) if @lazy
120
129
  if @attributes.has_key?(meth)
121
130
  @attributes[meth]
122
131
  else #lazy loading
123
132
  if @attributes["id"]
124
- @attributes[meth] = rpc_execute('read', [@attributes["id"]], [meth], *args || object_session)[0][meth]
133
+ @attributes[meth] = rpc_execute('read', [@attributes["id"]], [meth], *args || context)[0][meth]
125
134
  else
126
135
  nil
127
136
  end
@@ -137,16 +146,17 @@ module Ooor
137
146
 
138
147
  def get_association(meth, *args)
139
148
  return @associations[meth] || :undef if @skip
149
+ lazy_load(meth, *args) if @lazy
140
150
  if @loaded_associations.has_key?(meth)
141
151
  @loaded_associations[meth]
142
152
  elsif @associations.has_key?(meth)
143
153
  @loaded_associations[meth] = relationnal_result(meth, *args)
144
154
  else
145
155
  if @attributes["id"]
146
- @associations[meth] = rpc_execute('read', [@attributes["id"]], [meth], *args || object_session)[0][meth]
156
+ @associations[meth] = rpc_execute('read', [@attributes["id"]], [meth], *args || context)[0][meth]
147
157
  @loaded_associations[meth] = relationnal_result(meth, *args)
148
158
  elsif self.class.one2many_associations.has_key?(meth) || self.class.many2many_associations.has_key?(meth)
149
- load_x2m_association(self.class.all_fields[meth]['relation'], [], *args)
159
+ load_x2m_association(meth, [], *args)
150
160
  else
151
161
  nil
152
162
  end
@@ -185,7 +195,7 @@ module Ooor
185
195
  # end
186
196
 
187
197
  def method_missing(method_symbol, *arguments)
188
- self.class.reload_fields_definition(false, object_session)
198
+ self.class.reload_fields_definition(false)
189
199
  if id
190
200
  rpc_execute(method_symbol, [id], *arguments) #we assume that's an action
191
201
  else