ooor 1.2.5 → 1.2.6
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.
- data/lib/app/models/open_object_resource.rb +62 -41
- data/lib/ooor.rb +11 -4
- metadata +2 -2
| @@ -18,20 +18,20 @@ class OpenObjectResource < ActiveResource::Base | |
| 18 18 | 
             
                              :openerp_database, :user_id, :scope_prefix, :ooor
         | 
| 19 19 |  | 
| 20 20 | 
             
                def class_name_from_model_key(model_key=self.openerp_model)
         | 
| 21 | 
            -
                   | 
| 21 | 
            +
                  model_key.split('.').collect {|name_part| name_part.capitalize}.join
         | 
| 22 22 | 
             
                end
         | 
| 23 23 |  | 
| 24 24 | 
             
                #similar to Object#const_get but for OpenERP model key
         | 
| 25 25 | 
             
                def const_get(model_key)
         | 
| 26 26 | 
             
                  klass_name = class_name_from_model_key(model_key)
         | 
| 27 | 
            -
                  klass = Object.const_defined?(klass_name) ? Object.const_get(klass_name) : @ooor.define_openerp_model(model_key, nil, nil, nil, nil, self.scope_prefix)
         | 
| 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 28 | 
             
                  klass.reload_fields_definition unless klass.fields_defined
         | 
| 29 29 | 
             
                  klass
         | 
| 30 30 | 
             
                end
         | 
| 31 31 |  | 
| 32 32 | 
             
                def reload_fields_definition(force = false)
         | 
| 33 33 | 
             
                  if not (self.to_s.match('IrModel') || self.to_s.match('IrModelFields')) and (force or not @fields_defined)#TODO have a way to force reloading @field_ids too eventually
         | 
| 34 | 
            -
                    fields = Object.const_get(self.scope_prefix  | 
| 34 | 
            +
                    fields = (self.scope_prefix ? Object.const_get(self.scope_prefix) : Object).const_get('IrModelFields').find(@field_ids)
         | 
| 35 35 | 
             
                    @fields = {}
         | 
| 36 36 | 
             
                    fields.each do |field|
         | 
| 37 37 | 
             
                      case field.attributes['ttype']
         | 
| @@ -74,9 +74,9 @@ class OpenObjectResource < ActiveResource::Base | |
| 74 74 |  | 
| 75 75 | 
             
                #corresponding method for OpenERP osv.execute(self, db, uid, obj, method, *args, **kw) method
         | 
| 76 76 | 
             
                def rpc_execute_with_all(db, uid, pass, obj, method, *args)
         | 
| 77 | 
            -
                   | 
| 77 | 
            +
                  clean_request_args!(args)
         | 
| 78 78 | 
             
                  logger.debug "rpc_execute_with_all: rpc_method: 'execute', db: #{db.inspect}, uid: #{uid.inspect}, pass: #{pass.inspect}, obj: #{obj.inspect}, method: #{method}, *args: #{args.inspect}"
         | 
| 79 | 
            -
                  try_with_pretty_error_log { client((@database && @site || @ooor.base_url) + "/object").call("execute",  db, uid, pass, obj, method, *args) }
         | 
| 79 | 
            +
                  try_with_pretty_error_log { cast_answer_to_ruby!(client((@database && @site || @ooor.base_url) + "/object").call("execute",  db, uid, pass, obj, method, *args)) }
         | 
| 80 80 | 
             
                end
         | 
| 81 81 |  | 
| 82 82 | 
             
                 #corresponding method for OpenERP osv.exec_workflow(self, db, uid, obj, method, *args)
         | 
| @@ -89,17 +89,20 @@ class OpenObjectResource < ActiveResource::Base | |
| 89 89 | 
             
                end
         | 
| 90 90 |  | 
| 91 91 | 
             
                def rpc_exec_workflow_with_all(db, uid, pass, obj, action, *args)
         | 
| 92 | 
            -
                   | 
| 92 | 
            +
                  clean_request_args!(args)
         | 
| 93 93 | 
             
                  logger.debug "rpc_execute_with_all: rpc_method: 'exec_workflow', db: #{db.inspect}, uid: #{uid.inspect}, pass: #{pass.inspect}, obj: #{obj.inspect}, action: #{action}, *args: #{args.inspect}"
         | 
| 94 | 
            -
                  try_with_pretty_error_log { client((@database && @site || @ooor.base_url) + "/object").call("exec_workflow", db, uid, pass, obj, action, *args) }
         | 
| 94 | 
            +
                  try_with_pretty_error_log { cast_answer_to_ruby!(client((@database && @site || @ooor.base_url) + "/object").call("exec_workflow", db, uid, pass, obj, action, *args)) }
         | 
| 95 95 | 
             
                end
         | 
| 96 96 |  | 
| 97 97 | 
             
                def old_wizard_step(wizard_name, ids, step='init', wizard_id=nil, form={}, context={}, report_type='pdf')
         | 
| 98 98 | 
             
                  context = @ooor.global_context.merge(context)
         | 
| 99 | 
            +
                  cast_request_to_openerp!(form)
         | 
| 99 100 | 
             
                  unless wizard_id
         | 
| 100 | 
            -
                     | 
| 101 | 
            +
                    logger.debug "rpc_execute_with_all: rpc_method: 'create old_wizard_step' #{wizard_name}"
         | 
| 102 | 
            +
                    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)) }
         | 
| 101 103 | 
             
                  end
         | 
| 102 | 
            -
                   | 
| 104 | 
            +
                  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}"
         | 
| 105 | 
            +
                  [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)) }]
         | 
| 103 106 | 
             
                end
         | 
| 104 107 |  | 
| 105 108 | 
             
                #grab the eventual error log from OpenERP response as OpenERP doesn't enforce carefuly
         | 
| @@ -121,6 +124,52 @@ class OpenObjectResource < ActiveResource::Base | |
| 121 124 | 
             
                    end
         | 
| 122 125 | 
             
                end
         | 
| 123 126 |  | 
| 127 | 
            +
                def clean_request_args!(args)
         | 
| 128 | 
            +
                  if args[-1].is_a? Hash
         | 
| 129 | 
            +
                    args[-1] = @ooor.global_context.merge(args[-1])
         | 
| 130 | 
            +
                  elsif args.is_a?(Array)
         | 
| 131 | 
            +
                    args += [@ooor.global_context]
         | 
| 132 | 
            +
                  end
         | 
| 133 | 
            +
                  cast_request_to_openerp!(args[-2]) if args[-2].is_a? Hash
         | 
| 134 | 
            +
                end
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                def cast_request_to_openerp!(map)
         | 
| 137 | 
            +
                  map.each do |k, v|
         | 
| 138 | 
            +
                    if !v.is_a?(Integer) && !v.is_a?(Float) && v.is_a?(Numeric) && v.respond_to?(:to_f)
         | 
| 139 | 
            +
                      map[k] = v.to_f
         | 
| 140 | 
            +
                    elsif !v.is_a?(Numeric) && !v.is_a?(Integer) && v.respond_to?(:sec) && v.respond_to?(:year)#really ensure that's a datetime type
         | 
| 141 | 
            +
                      map[k] = "#{v.year}-#{v.month}-#{v.day} #{v.hour}:#{v.min}:#{v.sec}"
         | 
| 142 | 
            +
                    elsif !v.is_a?(Numeric) && !v.is_a?(Integer) && v.respond_to?(:day) && v.respond_to?(:year)#really ensure that's a date type
         | 
| 143 | 
            +
                      map[k] = "#{v.year}-#{v.month}-#{v.day}"
         | 
| 144 | 
            +
                    end
         | 
| 145 | 
            +
                  end
         | 
| 146 | 
            +
                end
         | 
| 147 | 
            +
             | 
| 148 | 
            +
                def cast_answer_to_ruby!(answer)
         | 
| 149 | 
            +
                  reload_fields_definition() unless self.fields_defined
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                  def cast_map_to_ruby!(map)
         | 
| 152 | 
            +
                    map.each do |k, v|
         | 
| 153 | 
            +
                      if self.fields[k] && v.is_a?(String) && !v.empty?
         | 
| 154 | 
            +
                        case self.fields[k].ttype
         | 
| 155 | 
            +
                          when 'datetime'
         | 
| 156 | 
            +
                            map[k] = Time.parse(v)
         | 
| 157 | 
            +
                          when 'date'
         | 
| 158 | 
            +
                            map[k] = Date.parse(v)
         | 
| 159 | 
            +
                        end
         | 
| 160 | 
            +
                      end
         | 
| 161 | 
            +
                    end
         | 
| 162 | 
            +
                  end
         | 
| 163 | 
            +
             | 
| 164 | 
            +
                  if answer.is_a?(Array)
         | 
| 165 | 
            +
                    answer.each {|item| self.cast_map_to_ruby!(item) if item.is_a? Hash}
         | 
| 166 | 
            +
                  elsif answer.is_a?(Hash)
         | 
| 167 | 
            +
                    self.cast_map_to_ruby!(answer)
         | 
| 168 | 
            +
                  else
         | 
| 169 | 
            +
                    answer
         | 
| 170 | 
            +
                  end
         | 
| 171 | 
            +
                end
         | 
| 172 | 
            +
             | 
| 124 173 | 
             
                def method_missing(method_symbol, *arguments) self.rpc_execute(method_symbol.to_s, *arguments) end
         | 
| 125 174 |  | 
| 126 175 |  | 
| @@ -139,10 +188,10 @@ class OpenObjectResource < ActiveResource::Base | |
| 139 188 | 
             
                    end
         | 
| 140 189 | 
             
                  end
         | 
| 141 190 | 
             
                  ids = rpc_execute('search', domain, context)
         | 
| 142 | 
            -
                  find_single(ids, options)
         | 
| 191 | 
            +
                  !ids.empty? && ids[0].is_a?(Integer) && find_single(ids, options) || []
         | 
| 143 192 | 
             
                end
         | 
| 144 193 |  | 
| 145 | 
            -
                #TODO,  | 
| 194 | 
            +
                #TODO, makes sense?
         | 
| 146 195 | 
             
                def find_one; raise"Not implemented yet, go on!"; end
         | 
| 147 196 |  | 
| 148 197 | 
             
                # Find a single resource from the default URL
         | 
| @@ -184,33 +233,6 @@ class OpenObjectResource < ActiveResource::Base | |
| 184 233 |  | 
| 185 234 | 
             
              attr_accessor :relations, :loaded_relations
         | 
| 186 235 |  | 
| 187 | 
            -
              def cast_attributes_to_ruby!
         | 
| 188 | 
            -
                @attributes.each do |k, v|
         | 
| 189 | 
            -
                  if self.class.fields[k] && v.is_a?(String) && !v.empty?
         | 
| 190 | 
            -
                    case self.class.fields[k].ttype
         | 
| 191 | 
            -
                      when 'datetime'
         | 
| 192 | 
            -
                        @attributes[k] = Time.parse(v)
         | 
| 193 | 
            -
                      when 'date'
         | 
| 194 | 
            -
                        @attributes[k] = Date.parse(v)
         | 
| 195 | 
            -
                    end
         | 
| 196 | 
            -
                  end
         | 
| 197 | 
            -
                end
         | 
| 198 | 
            -
              end
         | 
| 199 | 
            -
             | 
| 200 | 
            -
              def cast_attributes_to_openerp!
         | 
| 201 | 
            -
                @attributes.each do |k, v|
         | 
| 202 | 
            -
                  @attributes[k] = ((v.is_a? BigDecimal) ? Float(v) : v)
         | 
| 203 | 
            -
                  if self.class.fields[k]
         | 
| 204 | 
            -
                    case self.class.fields[k].ttype
         | 
| 205 | 
            -
                      when 'datetime'
         | 
| 206 | 
            -
                        @attributes[k] = "#{v.year}-#{v.month}-#{v.day} #{v.hour}:#{v.min}:#{v.sec}" if v.respond_to?(:sec)
         | 
| 207 | 
            -
                      when 'date'
         | 
| 208 | 
            -
                        @attributes[k] = "#{v.year}-#{v.month}-#{v.day}" if v.respond_to?(:day)
         | 
| 209 | 
            -
                    end
         | 
| 210 | 
            -
                  end
         | 
| 211 | 
            -
                end
         | 
| 212 | 
            -
              end
         | 
| 213 | 
            -
             | 
| 214 236 | 
             
              def cast_relations_to_openerp!
         | 
| 215 237 | 
             
                @relations.reject! do |k, v| #reject non asigned many2one or empty list
         | 
| 216 238 | 
             
                  v.is_a?(Array) && (v.size == 0 or v[1].is_a?(String))
         | 
| @@ -271,7 +293,6 @@ class OpenObjectResource < ActiveResource::Base | |
| 271 293 | 
             
                    end
         | 
| 272 294 | 
             
                  end
         | 
| 273 295 | 
             
                end
         | 
| 274 | 
            -
                cast_attributes_to_ruby!
         | 
| 275 296 | 
             
                self
         | 
| 276 297 | 
             
              end
         | 
| 277 298 |  | 
| @@ -297,7 +318,6 @@ class OpenObjectResource < ActiveResource::Base | |
| 297 318 | 
             
              end
         | 
| 298 319 |  | 
| 299 320 | 
             
              def to_openerp_hash!
         | 
| 300 | 
            -
                cast_attributes_to_openerp!
         | 
| 301 321 | 
             
                cast_relations_to_openerp!
         | 
| 302 322 | 
             
                @attributes.reject {|key, value| key == 'id'}.merge(@relations)
         | 
| 303 323 | 
             
              end
         | 
| @@ -401,8 +421,9 @@ class OpenObjectResource < ActiveResource::Base | |
| 401 421 | 
             
                end
         | 
| 402 422 |  | 
| 403 423 | 
             
                return @loaded_relations[method_name] if @loaded_relations.has_key?(method_name)
         | 
| 404 | 
            -
                return false if @relations.has_key?(method_name) and !@relations[method_name]
         | 
| 424 | 
            +
                return false if @relations.has_key?(method_name) and (!@relations[method_name] || @relations[method_name].is_a?(Array) && !@relations[method_name][0])
         | 
| 405 425 |  | 
| 426 | 
            +
                return false if self.class.relations_keys.index(method_name) && !@relations[method_name]
         | 
| 406 427 | 
             
                result = relationnal_result(method_name, *arguments)
         | 
| 407 428 | 
             
                @loaded_relations[method_name] = result and return result if result
         | 
| 408 429 |  | 
    
        data/lib/ooor.rb
    CHANGED
    
    | @@ -40,19 +40,26 @@ class Ooor | |
| 40 40 | 
             
                @logger.level = config[:log_level] if config[:log_level]
         | 
| 41 41 | 
             
                @base_url = config[:url].gsub(/\/$/,'')
         | 
| 42 42 | 
             
                @global_context = config[:global_context] || {}
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                scope = Module.new and Object.const_set(config[:scope_prefix], scope) if config[:scope_prefix]
         | 
| 45 | 
            +
             | 
| 43 46 | 
             
                config[:user_id] = global_login(config[:username] || 'admin', config[:password] || 'admin')
         | 
| 44 47 |  | 
| 45 48 | 
             
                @all_loaded_models = []
         | 
| 46 49 | 
             
                OpenObjectResource.logger = @logger
         | 
| 47 | 
            -
                @ir_model_class = define_openerp_model("ir.model", nil, nil, nil, nil, config[:scope_prefix] | 
| 48 | 
            -
                define_openerp_model("ir.model.fields", nil, nil, nil, nil, config[:scope_prefix] | 
| 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])
         | 
| 49 52 |  | 
| 50 53 | 
             
                if config[:models] #we load only a customized subset of the OpenERP models
         | 
| 51 54 | 
             
                  models = @ir_model_class.find(:all, :domain => [['model', 'in', config[:models]]])
         | 
| 52 55 | 
             
                else #we load all the models
         | 
| 53 56 | 
             
                  models = @ir_model_class.find(:all).reject {|model| model.model == "ir.model" || model.model == "ir.model.fields"}
         | 
| 54 57 | 
             
                end
         | 
| 55 | 
            -
                models.each {|openerp_model| define_openerp_model(openerp_model, nil, nil, nil, nil, config[:scope_prefix] | 
| 58 | 
            +
                models.each {|openerp_model| define_openerp_model(openerp_model, nil, nil, nil, nil, config[:scope_prefix])}
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
              module Test
         | 
| 62 | 
            +
                
         | 
| 56 63 | 
             
              end
         | 
| 57 64 |  | 
| 58 65 | 
             
              def define_openerp_model(arg, url, database, user_id, pass, scope_prefix)
         | 
| @@ -81,7 +88,7 @@ class Ooor | |
| 81 88 | 
             
                klass.scope_prefix = scope_prefix
         | 
| 82 89 | 
             
                model_class_name = klass.class_name_from_model_key
         | 
| 83 90 | 
             
                @logger.info "registering #{model_class_name} as a Rails ActiveResource Model wrapper for OpenObject #{param['model']} model"
         | 
| 84 | 
            -
                Object.const_set(model_class_name, klass)
         | 
| 91 | 
            +
                (scope_prefix ? Object.const_get(scope_prefix) : Object).const_set(model_class_name, klass)
         | 
| 85 92 | 
             
                @all_loaded_models.push(klass)
         | 
| 86 93 | 
             
                klass
         | 
| 87 94 | 
             
              end
         | 
    
        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.2. | 
| 4 | 
            +
              version: 1.2.6
         | 
| 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: 2010-02- | 
| 12 | 
            +
            date: 2010-02-18 00:00:00 -02:00
         | 
| 13 13 | 
             
            default_executable: 
         | 
| 14 14 | 
             
            dependencies: 
         | 
| 15 15 | 
             
            - !ruby/object:Gem::Dependency 
         |