Class: Ooor::Session

Inherits:
Object
  • Object
show all
Includes:
ActiveSupport::Configurable, Transport
Defined in:
lib/ooor/session.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Transport

#base_jsonrpc2_url, #base_url, #get_client

Constructor Details

#initialize(config, web_session, id) ⇒ Session

Returns a new instance of Session.



36
37
38
39
40
41
42
43
44
# File 'lib/ooor/session.rb', line 36

def initialize(config, web_session, id)
  set_config(HashWithIndifferentAccess.new(config))
  Object.const_set(config[:scope_prefix], Module.new) if config[:scope_prefix]
  @models = {}
  @local_context = {}
  @web_session = web_session || {}
  @id = id || web_session[:session_id]
  Ooor.session_handler.register_session(self)
end

Instance Attribute Details

#idObject

Returns the value of attribute id.



11
12
13
# File 'lib/ooor/session.rb', line 11

def id
  @id
end

#modelsObject

Returns the value of attribute models.



11
12
13
# File 'lib/ooor/session.rb', line 11

def models
  @models
end

#web_sessionObject

Returns the value of attribute web_session.



11
12
13
# File 'lib/ooor/session.rb', line 11

def web_session
  @web_session
end

Instance Method Details

#[](model_key) ⇒ Object

TODO invert: define method here and use []



140
141
142
# File 'lib/ooor/session.rb', line 140

def [](key)
  self[key]
end

#[]=(key, value) ⇒ Object



106
107
108
# File 'lib/ooor/session.rb', line 106

def []=(key, value)
  self[key] = value
end

#class_name_from_model_key(model_key) ⇒ Object



223
224
225
# File 'lib/ooor/session.rb', line 223

def class_name_from_model_key(model_key)
  model_key.split('.').collect {|name_part| name_part.capitalize}.join
end

#commonObject



13
# File 'lib/ooor/session.rb', line 13

def common(); @common_service ||= CommonService.new(self); end

#connection_sessionObject

a part of the config that will be mixed in the context of each session



98
99
100
# File 'lib/ooor/session.rb', line 98

def connection_session
  HashWithIndifferentAccess.new(config[:connection_session] || {})
end

#const_get(model_key, lang = nil) ⇒ Object



125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/ooor/session.rb', line 125

def const_get(model_key, lang=nil);
  if config[:aliases]
    if lang && alias_data = config[:aliases][lang]
      openerp_model = alias_data[model_key] || model_key
    elsif alias_data = config[:aliases][connection_session['lang'] || :en_US]
      openerp_model = alias_data[model_key] || model_key
    else
      openerp_model = model_key
    end
  else
    openerp_model = model_key
  end
  define_openerp_model(model: openerp_model, scope_prefix: config[:scope_prefix], generate_constants: config[:generate_constants])
end

#dbObject



14
# File 'lib/ooor/session.rb', line 14

def db(); @db_service ||= DbService.new(self); end

#define_openerp_model(options) ⇒ Object

TODO param to tell if we define constants or not



193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# File 'lib/ooor/session.rb', line 193

def define_openerp_model(options) #TODO param to tell if we define constants or not
  if !models[options[:model]] || options[:reload]# || !scope.const_defined?(model_class_name)
    scope_prefix = options[:scope_prefix]
    scope = scope_prefix ? Object.const_get(scope_prefix) : Object
    model_class_name = class_name_from_model_key(options[:model])
    logger.debug "registering #{model_class_name}"
    klass = Class.new(Base)
    set_model_template!(klass, options)
    klass.name = model_class_name
    klass.scope_prefix = scope_prefix
    klass.session = self
    if options[:generate_constants] && (options[:reload] || !scope.const_defined?(model_class_name))
      scope.const_set(model_class_name, klass)
    end
    (Ooor.extensions[options[:model]] || []).each do |block|
      klass.class_eval(&block)
    end
    models[options[:model]] = klass
  end
  models[options[:model]]
end

#global_login(options = {}) ⇒ Object



110
111
112
113
# File 'lib/ooor/session.rb', line 110

def (options={})
  set_config(options)
  load_models(config[:models], config[:reload])
end

#helper_pathsObject



219
220
221
# File 'lib/ooor/session.rb', line 219

def helper_paths
  [File.dirname(__FILE__) + '/helpers/*', *config[:helper_paths]]
end

#load_models(model_names = , reload = ) ⇒ Object



144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/ooor/session.rb', line 144

def load_models(model_names=config[:models], reload=config[:reload])
  helper_paths.each do |dir|
    ::Dir[dir].each { |file| require file }
  end
  search_domain = model_names ? [['model', 'in', model_names]] : []
  models_records = read_model_data(search_domain)
  models_records.reject {|opts| opts['model'] == '_unknown' }.each do |opts|
    options = HashWithIndifferentAccess.new(opts.merge(scope_prefix: config[:scope_prefix],
                                                       reload: reload,
                                                       generate_constants: config[:generate_constants]))
    define_openerp_model(options)
  end
end

#loggerObject

def models; @models ||= {}; end



217
# File 'lib/ooor/session.rb', line 217

def logger; Ooor.logger; end

#login(db, username, password, kw = {}) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/ooor/session.rb', line 52

def (db, username, password, kw={})
  logger.debug "OOOR login - db: #{db}, username: #{username}"
  raise "Cannot login without specifying a database" unless db
  raise "Cannot login without specifying a username" unless username
  raise "Cannot login without specifying a password" unless password
  if config[:force_xml_rpc]
    send("ooor_alias_login", db, username, password)
  else
    conn = get_client(:json, "#{self.base_jsonrpc2_url}")
    response = conn.post do |req|
      req.url '/web/session/authenticate'
      req.headers['Content-Type'] = 'application/json'
      req.body = {method: 'call', params: {db: db, login: username, password: password, base_location: kw}}.to_json
    end
    web_session[:cookie] = response.headers["set-cookie"]
    json_response = JSON.parse(response.body)
    error = json_response["error"]
    if error && (error["data"]["type"] == "server_exception" || error['message'] == "Odoo Server Error")
      raise "#{error['message']} ------- #{error['data']['debug']}"
    elsif response.status == 200
      if sid_part1 = web_session[:cookie].split("sid=")[1]
        # required on v7 but not on v8+, this enables us to sniff if we are on v7
        web_session[:sid] = web_session[:cookie].split("sid=")[1].split(";")[0]
      end

      web_session[:session_id] = json_response['result']['session_id']

      user_id = json_response['result'].delete('uid')
      config[:user_id] = user_id
      web_session.merge!(json_response['result'].delete('user_context'))
      set_config(json_response['result'])
      Ooor.session_handler.register_session(self)
      user_id
    else
      raise Faraday::Error::ClientError.new(response.status, response)
    end
  end
end

#login_if_requiredObject



46
47
48
49
50
# File 'lib/ooor/session.rb', line 46

def 
  if !config[:user_id] || !web_session[:session_id]
    (config[:database], config[:username], config[:password], config[:params])
  end
end

#objectObject



15
# File 'lib/ooor/session.rb', line 15

def object(); @object_service ||= ObjectService.new(self); end

#odoo_serieObject



227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
# File 'lib/ooor/session.rb', line 227

def odoo_serie
  if config.user_id # authenticated session
    if config[:server_version_info] # v10 and onward
      config[:server_version_info][0]
    elsif config['partner_id']
      9
    elsif web_session[:sid]
      7
    else
      8
    end
  else
    json_conn = get_client(:json, base_jsonrpc2_url)
    begin
      @version_info ||= json_conn.oe_service(web_session, "/web/webclient/version_info", nil, nil, [])
      @version_info['server_serie'].to_i
    rescue # Odoo v7 doesn't have this version info service
      7
    end
  end
end

#public_controller_method(path, query_values = {}) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/ooor/session.rb', line 19

def public_controller_method(path, query_values={})
  unless defined?(Addressable)
    raise "You need to install the addressable gem for this feature"
  end
  require 'addressable/uri'
  ()
  conn = get_client(:json, "#{base_jsonrpc2_url}")
  conn.post do |req|
    req.url path
    req.headers['Content-Type'] = 'application/x-www-form-urlencoded'
    req.headers['Cookie'] = "session_id=#{web_session[:session_id]}"
    uri = Addressable::URI.new
    uri.query_values = query_values
    req.body = uri.query
  end
end

#read_model_data(search_domain) ⇒ Object



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/ooor/session.rb', line 158

def read_model_data(search_domain)
  if config[:force_xml_rpc]
    model_ids = object.object_service(:execute, "ir.model", :search, search_domain, 0, false, false, {}, false)
    models_records = object.object_service(:execute, "ir.model", :read, model_ids, ['model', 'name'])
  else
    response = object.object_service(:search_read, "ir.model", 'search_read',
            fields: ['model', 'name'],
            offset: 0,
            limit: false,
            domain: search_domain,
            sort: false,
            context: {})
    models_records = response["records"]
  end
end

#reportObject



16
# File 'lib/ooor/session.rb', line 16

def report(); @report_service ||= ReportService.new(self); end

#session_context(context = {}) ⇒ Object



121
122
123
# File 'lib/ooor/session.rb', line 121

def session_context(context={})
  connection_session.merge(web_session.slice('lang', 'tz')).merge(@local_context).merge(context) # not just lang and tz?
end

#set_config(configuration) ⇒ Object



91
92
93
94
95
# File 'lib/ooor/session.rb', line 91

def set_config(configuration)
  configuration.each do |k, v|
    config.send "#{k}=", v
  end
end

#set_model_template!(klass, options) ⇒ Object



174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/ooor/session.rb', line 174

def set_model_template!(klass, options)
  template = Ooor.model_registry.get_template(config, options[:model])
  if template
    klass.t = template
  else
    template = Ooor::ModelSchema.new
    template.openerp_model = options[:model]
    template.openerp_id = options[:id]
    template.description = options[:name]
    template.state = options[:state]
    template.many2one_associations = {}
    template.one2many_associations = {}
    template.many2many_associations = {}
    template.polymorphic_m2o_associations = {}
    template.associations_keys = []
    klass.t = template
  end
end

#with_context(context) ⇒ Object



115
116
117
118
119
# File 'lib/ooor/session.rb', line 115

def with_context(context)
  @local_context = context
  yield
  @local_context = {}
end