odoo 求值上下文

视图

无论后端字段定义的属性 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=''),

)

   

jeffery 2024年9月23日
标签
存档
钉钉审批