有个需求:在odoo中点击菜单弹出Form视图,显示已存在的某一条记录,若记录不存在,则新建一条记录并显示。
该需求用Server Action来实现。具体如下:
1、创建一个model
class CFPrintServerMapping(models.Model):
_name = 'cf.print.server.user.mapping'
_description = _("Print Server and User Mapping")
@api.model
def _current_user_domain(self):
return [('id', '=', self.env.user.id)]
user_id = fields.Many2one("res.users", string="User", default=lambda self: self.env.user.id, domain=_current_user_domain)
prn_server_ip = fields.Char(string="Print Server IP")
prn_server_port = fields.Integer(string="Print Server Port", default=9999)
@api.model
def create_or_show(self):
mapping = self.search([('user_id.id','=',self.env.user.id)], limit=1)
if not mapping:
mapping = self.create({"prn_server_ip": "127.0.0.1", "prn_server_port": 9999})
action = {
'type': 'ir.actions.act_window',
'name': _('Print Server Address'),
'view_mode': 'form',
'view_type': 'form',
'res_model': 'cf.print.server.user.mapping',
'nodestroy': 'true',
'res_id': mapping.id,
'views': [(False, 'form')],
'view_id': self.env.ref("cfprint.cf_print_server_mapping_form"),
'target': 'new',
}
#这里一定要返回action,否则无法跳转到Form视图
return action
2、创建Server Action动作
<record id="act_cf_print_svr_ip" model="ir.actions.server">
<field name="name">Print Server Address</field>
<field name="type">ir.actions.server</field>
<field name="model_id" ref="model_cf_print_server_user_mapping"/>
<field name="binding_model_id" ref="model_cf_print_server_user_mapping"/>
<field name="state">code</field>
<!-- 下面这行一定要用action接收函数返回的结果,否则无法跳转到Form视图 -->
<field name="code">action = model.create_or_show()</field>
</record>
3、创建菜单
<menuitem id="menu_prn_server_addr" name="Print Server Address" parent="menu_root" action="act_cf_print_svr_ip" sequence="1"/>
在odoo12中,创建或更新Server Action时,有时会报错:
null value in column “activity_user_type" violats not-null constraint
解决方法参考:
http://www.khcloud.net:4082/?thread-463.htm