序言:时间是我们最宝贵的财富,珍惜手上的每个时分
目录
近期有一个基于 Odoo服务台(helpdesk)的项目开发,web端显示的原始需求很简单:
增加一些字段,并填入表单内。效果图如下
看似如此简单的一个前段修改,却隐藏了不少坑。
按往常修改网页的套路,我找到了 helpdesk 的xml文件,并通过继承对进行修改:
- "1.0" encoding="utf-8"?>
- <odoo>
-
- <template id="ticket_submit_form" inherit_id="website_helpdesk_form.ticket_submit_form">
- <xpath expr="//div[@class='container']" position="replace">
但是刷新后控制台竟然无任何效果,这让我怀疑是否是 xpath写错了,于是直接修改原始模块文件,升级模块后界面显示巍然不动,真的是个奇异事件。
气急败坏下,我卸载了模块,然后重新安装helpdesk,“奇迹”发生了:我打的 ???出现了!
但是我依旧很懵,重新安装模块后可以看到修改,但是我继续修改qweb,页面又不变化了。
这种情况下想要做到心如止水谈何容易,在我崩溃边缘的时候,突然想到是否是初始化的时候使用了 hooks 或者其他的方法,所以只会依据qweb初始化一次?
顺着这个思路,我翻看了helpdesk下的py文件,终于发现了问题:
-
- @api.model_create_multi
- def create(self, vals_list):
- teams = super(HelpdeskTeam, self).create(vals_list)
- teams.filtered('use_website_helpdesk_form')._ensure_submit_form_view()
- return teams
-
- def write(self, vals):
- if 'use_website_helpdesk_form' in vals and vals['use_website_helpdesk_form']:
- self._ensure_submit_form_view()
- return super(HelpdeskTeam, self).write(vals)
-
- def unlink(self):
- teams_with_submit_form = self.filtered(lambda t: t.website_form_view_id is not False)
- for team in teams_with_submit_form:
- team.website_form_view_id.unlink()
- return super(HelpdeskTeam, self).unlink()
-
- def _ensure_submit_form_view(self):
- for team in self:
- if not team.website_form_view_id:
- default_form = etree.fromstring(self.env.ref('website_helpdesk_form.ticket_submit_form').arch)
- xmlid = 'website_helpdesk_form.team_form_' + str(team.id)
- form_template = self.env['ir.ui.view'].create({
- 'type': 'qweb',
- 'arch': etree.tostring(default_form),
- 'name': xmlid,
- 'key': xmlid
- })
- self.env['ir.model.data'].create({
- 'module': 'website_helpdesk_form',
- 'name': xmlid.split('.')[1],
- 'model': 'ir.ui.view',
- 'res_id': form_template.id,
- 'noupdate': True
- })
-
- team.write({'website_form_view_id': form_template.id})
每一个 helpdesk实例,都会依据xml模版创建一个qweb数据!!!!
所以无论怎么修改,已有的helpdesk web界面,都不会发生变化!!!
基于如上缘由,每次调试xml的时候,需要手动去web新建一个 helpdesk记录。下图就是我的冤种测试记录。
经过多次的调试,终于得到最终结果。
虽说完成了工作,但是依旧无法理解这样做的用法。
非要从代码层面解释,是可以在python里灵活的为服务台创建不同的web界面。
但是 目前odoo15没有任何自定义的设置,也许这是个 future 且官方早有解释,但我才懒的翻github,就拭目以待吧!!!
odoo开发部署实施.
wx号: _ro_cd