[IMP] eval action context and domain straight as they come from a tree_but_open (on menu), add APIDoc for OpenERPSession
OpenERPSession is in charge of evaluating domains and contexts. Always. bzr revid: xmo@openerp.com-20110325094119-fpd4e00w20kbgfzf
This commit is contained in:
parent
32f9914ebd
commit
0a7efc04dc
|
@ -157,12 +157,17 @@ class Menu(openerpweb.Controller):
|
||||||
|
|
||||||
@openerpweb.jsonrequest
|
@openerpweb.jsonrequest
|
||||||
def action(self, req, menu_id):
|
def action(self, req, menu_id):
|
||||||
print "QUERY"
|
Values = req.session.model('ir.values')
|
||||||
m = req.session.model('ir.values')
|
actions = Values.get('action', 'tree_but_open', [('ir.ui.menu', menu_id)], False, {})
|
||||||
r = m.get('action', 'tree_but_open', [('ir.ui.menu', menu_id)], False, {})
|
|
||||||
print r
|
for _, _, action in actions:
|
||||||
res = {"action": r}
|
print action
|
||||||
return res
|
action['context'] = req.session.eval_context(
|
||||||
|
action['context']) or {}
|
||||||
|
action['domain'] = req.session.eval_domain(
|
||||||
|
action['domain'], action['context']) or []
|
||||||
|
|
||||||
|
return {"action": actions}
|
||||||
|
|
||||||
|
|
||||||
class DataSet(openerpweb.Controller):
|
class DataSet(openerpweb.Controller):
|
||||||
|
|
|
@ -275,6 +275,15 @@ convenient ways to refer to them and their properties.
|
||||||
|
|
||||||
.. js:attribute:: sort
|
.. js:attribute:: sort
|
||||||
|
|
||||||
|
Python
|
||||||
|
++++++
|
||||||
|
|
||||||
|
.. autoclass:: openerpweb.openerpweb.OpenERPSession
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openerpweb.openerpweb.OpenERPModel
|
||||||
|
:members:
|
||||||
|
|
||||||
* Addons lifecycle (loading, execution, events, ...)
|
* Addons lifecycle (loading, execution, events, ...)
|
||||||
|
|
||||||
* Python-side
|
* Python-side
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
|
import datetime
|
||||||
import functools
|
import functools
|
||||||
import optparse
|
import optparse
|
||||||
|
import time
|
||||||
|
import dateutil.relativedelta
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
|
@ -39,6 +42,15 @@ class OpenERPModel(object):
|
||||||
|
|
||||||
|
|
||||||
class OpenERPSession(object):
|
class OpenERPSession(object):
|
||||||
|
"""
|
||||||
|
An OpenERP RPC session, a given user can own multiple such sessions
|
||||||
|
in a web session.
|
||||||
|
|
||||||
|
.. attribute:: context
|
||||||
|
|
||||||
|
The session context, a ``dict``. Can be reloaded by calling
|
||||||
|
:meth:`openerpweb.openerpweb.OpenERPSession.get_context`
|
||||||
|
"""
|
||||||
def __init__(self, server='127.0.0.1', port=8069,
|
def __init__(self, server='127.0.0.1', port=8069,
|
||||||
model_factory=OpenERPModel):
|
model_factory=OpenERPModel):
|
||||||
self._server = server
|
self._server = server
|
||||||
|
@ -49,6 +61,8 @@ class OpenERPSession(object):
|
||||||
self._password = False
|
self._password = False
|
||||||
self.model_factory = model_factory
|
self.model_factory = model_factory
|
||||||
|
|
||||||
|
self.context = {}
|
||||||
|
|
||||||
def proxy(self, service):
|
def proxy(self, service):
|
||||||
s = xmlrpctimeout.TimeoutServerProxy('http://%s:%s/xmlrpc/%s' % (self._server, self._port, service), timeout=5)
|
s = xmlrpctimeout.TimeoutServerProxy('http://%s:%s/xmlrpc/%s' % (self._server, self._port, service), timeout=5)
|
||||||
return s
|
return s
|
||||||
|
@ -62,6 +76,9 @@ class OpenERPSession(object):
|
||||||
uid = self.proxy('common').login(db, login, password)
|
uid = self.proxy('common').login(db, login, password)
|
||||||
self.bind(db, uid, password)
|
self.bind(db, uid, password)
|
||||||
self._login = login
|
self._login = login
|
||||||
|
|
||||||
|
if uid: self.get_context()
|
||||||
|
|
||||||
return uid
|
return uid
|
||||||
|
|
||||||
def execute(self, model, func, *l, **d):
|
def execute(self, model, func, *l, **d):
|
||||||
|
@ -71,8 +88,76 @@ class OpenERPSession(object):
|
||||||
return r
|
return r
|
||||||
|
|
||||||
def model(self, model):
|
def model(self, model):
|
||||||
|
""" Get an RPC proxy for the object ``model``, bound to this session.
|
||||||
|
|
||||||
|
:param model: an OpenERP model name
|
||||||
|
:type model: str
|
||||||
|
:rtype: :class:`openerpweb.openerpweb.OpenERPModel`
|
||||||
|
"""
|
||||||
return self.model_factory(self, model)
|
return self.model_factory(self, model)
|
||||||
|
|
||||||
|
def get_context(self):
|
||||||
|
""" Re-initializes the current user's session context (based on
|
||||||
|
his preferences) by calling res.users.get_context() with the old
|
||||||
|
context
|
||||||
|
|
||||||
|
:returns: the new context
|
||||||
|
"""
|
||||||
|
assert self._uid, "The user needs to be logged-in to initialize his context"
|
||||||
|
self.context = self.model('res.users').context_get(self.context)
|
||||||
|
return self.context
|
||||||
|
|
||||||
|
@property
|
||||||
|
def base_eval_context(self):
|
||||||
|
""" Default evaluation context for the session.
|
||||||
|
|
||||||
|
Used to evaluate contexts and domains.
|
||||||
|
"""
|
||||||
|
return dict(
|
||||||
|
uid=self._uid,
|
||||||
|
current_date=datetime.date.today().strftime('%Y-%m-%d'),
|
||||||
|
time=time,
|
||||||
|
datetime=datetime,
|
||||||
|
relativedelta=dateutil.relativedelta.relativedelta,
|
||||||
|
**self.context
|
||||||
|
)
|
||||||
|
|
||||||
|
def eval_context(self, context_string, context=None):
|
||||||
|
""" Evaluates the provided context_string in the context (haha) of
|
||||||
|
the context.
|
||||||
|
|
||||||
|
:param str context_string: a context to evaluate, if not a string,
|
||||||
|
will be returned as-is
|
||||||
|
:param dict context: the context to use in the evaluation, if any.
|
||||||
|
Will be merged with a default context and
|
||||||
|
the session context.
|
||||||
|
:returns: the evaluated context
|
||||||
|
:rtype: dict
|
||||||
|
"""
|
||||||
|
if not isinstance(context_string, basestring):
|
||||||
|
return context_string
|
||||||
|
|
||||||
|
return eval(context_string, dict(
|
||||||
|
self.base_eval_context,
|
||||||
|
**(context or {})))
|
||||||
|
def eval_domain(self, domain_string, context=None):
|
||||||
|
""" Evaluates the provided domain_string using the provided context
|
||||||
|
(merged with the session's evaluation context)
|
||||||
|
|
||||||
|
:param str domain_string: an OpenERP domain as a string, to evaluate.
|
||||||
|
|
||||||
|
If not a string, is returned as-is
|
||||||
|
:param dict context: the context to use in the evaluation, if any.
|
||||||
|
:returns: the evaluated domain
|
||||||
|
:rtype: list
|
||||||
|
"""
|
||||||
|
if not isinstance(domain_string, basestring):
|
||||||
|
return domain_string
|
||||||
|
|
||||||
|
return eval(domain_string, dict(
|
||||||
|
self.base_eval_context,
|
||||||
|
**(context or {})))
|
||||||
|
|
||||||
#----------------------------------------------------------
|
#----------------------------------------------------------
|
||||||
# OpenERP Web RequestHandler
|
# OpenERP Web RequestHandler
|
||||||
#----------------------------------------------------------
|
#----------------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue