视图
无论后端字段定义的属性 domain,还是视图 使用到的 domain, 均在前端进行解析, 最终变成 search 类方法的条件
数据筛选
action 的domain, search 里面使用到的 filter
使用以下变量
const evalContext = this.env.session.user_context;
//
{
"lang": "en_US",
"tz": "Asia/Shanghai",
"uid": 2,
"allowed_company_ids": [
1
]
}
以及 额外的 上下文
function pycontext() {
const d = new Date();
const today = `${
String(d.getFullYear()).padStart(4, "0")}-${
String(d.getMonth() + 1).padStart(2, "0")}-${
String(d.getDate()).padStart(2, "0")}`;
const now = `${
String(d.getUTCFullYear()).padStart(4, "0")}-${
String(d.getUTCMonth() + 1).padStart(2, "0")}-${
String(d.getUTCDate()).padStart(2, "0")} ${
String(d.getUTCHours()).padStart(2, "0")}:${
String(d.getUTCMinutes()).padStart(2, "0")}:${
String(d.getUTCSeconds()).padStart(2, "0")}`;
const { datetime, relativedelta, time } = py.extras;
return {
current_date: today,
datetime,
time,
now,
today,
relativedelta,
context_today,
tz_offset,
};
}
备注:在 control panel 进行 domain 的解析,将 domain 表达式里面的 变量 替换为 context 里面的 对象
这个操作是通过 web client 端的 pyUtils.eval 实现的
modifer
在视图元素定义 attrs 时,可以使用 domain
或者 invisible, readonly, required 可以使用 python 表达式
字段属性 domain
在字段属性使用 domain
此时可以使用标准的上下文,在字段上指定的上下文, 以及 该记录
{
"lang": "en_US",
"tz": "Asia/Shanghai",
"uid": 2,
"allowed_company_ids": [
1
]
}
== 最终版 上下文
_getEvalContext: function (element, forDomain) {
var evalContext = element.type === 'record' ? this._getRecordEvalContext(element, forDomain) : {};
if (element.parentID) {
var parent = this.localData[element.parentID];
if (parent.type === 'list' && parent.parentID) {
parent = this.localData[parent.parentID];
}
if (parent.type === 'record') {
evalContext.parent = this._getRecordEvalContext(parent, forDomain);
}
}
// Uses "current_company_id" because "company_id" would conflict with all the company_id fields
// in general, the actual "company_id" field of the form should be used for m2o domains, not this fallback
let current_company_id;
if (session.user_context.allowed_company_ids) {
current_company_id = session.user_context.allowed_company_ids[0];
} else {
current_company_id = session.user_companies ?
session.user_companies.current_company :
false;
}
return Object.assign(
{
active_id: evalContext.id || false,
active_ids: evalContext.id ? [evalContext.id] : [],
active_model: element.model,
current_company_id,
id: evalContext.id || false,
},
pyUtils.context(),
session.user_context,
element.context,
evalContext,
);
},
record rule
用在 record rule 时,domain 可以 使用以下 变量
return {
'user': self.env.user.with_context({}),
'time': time,
'company_ids': self.env.companies.ids,
'company_id': self.env.company.id,
}
action server
用在 action server 时, domain 可以用以下变量
return {
'uid': self._uid,
'user': self.env.user,
'time': tools.safe_eval.time,
'datetime': tools.safe_eval.datetime,
'dateutil': tools.safe_eval.dateutil,
'timezone': timezone,
'float_compare': float_compare,
'b64encode': base64.b64encode,
'b64decode': base64.b64decode,
'Command': Command,
'env': self.env,
'model': model,
# Exceptions
'Warning': odoo.exceptions.Warning,
'UserError': odoo.exceptions.UserError,
# record
'record': record,
'records': records,
# helpers
'log': log,
}
action report
用在 action report , qweb渲染时 可以用以下变量
data = {
'doc_ids': docids,
'doc_model': self.model,
'docs': docs,
}
values.update(
time=time,
context_timestamp=lambda t: fields.Datetime.context_timestamp(self.with_context(tz=user.tz), t),
user=user,
res_company=self.env.company,
website=website,
web_base_url=self.env['ir.config_parameter'].sudo().get_param('web.base.url', default=''),
)