FAQ
1. PDF打印不了
缺少wkhtmltopdf插件
参考笔者[博客](http://mixoo.cn/2019/06/19/odoo-wkhtmltopdf-install/ )或者直接使用如下命令:
```sh
wget -O - https://raw.githubusercontent.com/jellyfrank/tools/master/wkhtml.sh|bash
```
22.04安装wkhtmltopdf 0.12.5问题
```··
dpkg: dependency problems prevent configuration of wkhtmltox:
wkhtmltox depends on libssl1.1; however:
Package libssl1.1 is not installed.
wkhtmltox depends on xfonts-75dpi; however:
Package xfonts-75dpi is not installed.
```
libssl1.1:
```sh
echo "deb http://security.ubuntu.com/ubuntu focal-security main" | sudo tee /etc/apt/sources.list.d/focal-security.list
sudo apt-get update
sudo apt-get install libssl1.1
```
xfonts-75dpi:
```sh
apt-get -y install xfonts-75dpi
```
2. PDF报表中文字体乱码
参考笔者[博客](http://mixoo.cn/2019/06/24/odoo-report-chinese/) 安装字体以解决乱码问题
3. 报表PDF打印不了条码
按如下步骤排查:
1. 检查系统wkhtmltopdf版本,要求>= 0.12.4
2. 报表切换到HTML格式 看能否正常输出条码
3. 检查条码依赖是否已安装,使用下面命令安装
```sh
apt-get install python3-reportlab
pip install -U reportlib
```
4. 检查系统参数中的report.url参数是否跟域名一致
5. (ubuntu18.04) 安装libssl1.0-dev库
```sh
apt-get install libssl1.0-dev
```
4. 混合内容问题
通常的报错内容:
Mixed Content: The page at 'https://' was loaded over HTTPS, but requested an insecure resource 'http://'. This request has been blocked; the content must be served over HTTPS.
原因在于使用https协议访问了http协议的内容。
这通常是使用反向代理软件的配置问题,以常见的Nginx为例,我们需要将服务器的响应内容由Http更改为Https:
proxy_redirect http://yourdomainhere/ https://yourdomainhere/
5. 如何修改data.xml中的no_update属性?
使用如下代码:
```xml
<function name="write" model="ir.model.data">
<function name="search" model="ir.model.data">
<value eval="[('module', '=', 'sale'), ('name', 'in', ('sale_order_personal_rule','sale_order_see_all'))]"/>
</function>
<value eval="{'noupdate': False}"/>
</function>
```
module为模块名,name为需要修改的record的xmlid中的name。
6. 为何有时候compute的方法不生效?
首先,需要判断字段类型是否是store=True的,如果是,那么检查响应的依赖字段是否更新,因为存储的计算字段只有当依赖字段发生改变时才会更新。
其次,如果是不存储的compute字段,那么检查当前record的值是否为空,为空的record不会触发compute指定的方法,而是会直接返回False
7. 由于记录规则引发的异常
由于权限设置或者编码不规范导致的异常,通常如下所示:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_http.py", line 237, in _dispatch
result = request.dispatch()
File "/usr/lib/python3/dist-packages/odoo/http.py", line 684, in dispatch
result = self._call_function(**self.params)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 360, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/service/model.py", line 94, in wrapper
return f(dbname, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 348, in checked_call
result = self.endpoint(*a, **kw)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 913, in __call__
return self.method(*args, **kw)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 532, in response_wrap
response = f(*args, **kw)
File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/main.py", line 1389, in call_kw
return self._call_kw(model, method, args, kwargs)
File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/main.py", line 1381, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/usr/lib/python3/dist-packages/odoo/api.py", line 396, in call_kw
result = _call_kw_multi(method, model, args, kwargs)
File "/usr/lib/python3/dist-packages/odoo/api.py", line 383, in _call_kw_multi
result = method(recs, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/models.py", line 1740, in name_get
result.append((record.id, convert(record[name], record)))
File "/usr/lib/python3/dist-packages/odoo/models.py", line 5662, in __getitem__
return self._fields[key].__get__(self, type(self))
File "/usr/lib/python3/dist-packages/odoo/fields.py", line 998, in __get__
record._fetch_field(self)
File "/usr/lib/python3/dist-packages/odoo/models.py", line 3065, in _fetch_field
self._read(fnames)
File "/usr/lib/python3/dist-packages/odoo/models.py", line 3176, in _read
raise self.env['ir.rule']._make_access_error('read', forbidden)
Exception
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/http.py", line 640, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 316, in _handle_exception
raise exception.with_traceback(None) from new_cause
odoo.exceptions.AccessError: 由于安全限制,不允许您访问'线索/商机' (crm.lead)记录。
记录: 5.03线索-订单不同状态下创建活动001 (id=16234)
用户:徐乐 (id=3089)
这个限制基于下列规则:
- Personal Leads
- Leads with assigned activities
如有必要,请与管理员联系以请求访问权限。
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_http.py", line 237, in _dispatch
result = request.dispatch()
File "/usr/lib/python3/dist-packages/odoo/http.py", line 684, in dispatch
result = self._call_function(**self.params)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 360, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/service/model.py", line 94, in wrapper
return f(dbname, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 348, in checked_call
result = self.endpoint(*a, **kw)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 913, in __call__
return self.method(*args, **kw)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 532, in response_wrap
response = f(*args, **kw)
File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/main.py", line 1389, in call_kw
return self._call_kw(model, method, args, kwargs)
File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/main.py", line 1381, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/usr/lib/python3/dist-packages/odoo/api.py", line 396, in call_kw
result = _call_kw_multi(method, model, args, kwargs)
File "/usr/lib/python3/dist-packages/odoo/api.py", line 383, in _call_kw_multi
result = method(recs, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/models.py", line 1740, in name_get
result.append((record.id, convert(record[name], record)))
File "/usr/lib/python3/dist-packages/odoo/models.py", line 5662, in __getitem__
return self._fields[key].__get__(self, type(self))
File "/usr/lib/python3/dist-packages/odoo/fields.py", line 998, in __get__
record._fetch_field(self)
File "/usr/lib/python3/dist-packages/odoo/models.py", line 3065, in _fetch_field
self._read(fnames)
File "/usr/lib/python3/dist-packages/odoo/models.py", line 3176, in _read
raise self.env['ir.rule']._make_access_error('read', forbidden)
Exception
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/http.py", line 640, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 316, in _handle_exception
raise exception.with_traceback(None) from new_cause
odoo.exceptions.AccessError: 由于安全限制,不允许您访问'线索/商机' (crm.lead)记录。
记录: 5.03线索-订单不同状态下创建活动001 (id=16234)
用户:徐乐 (id=3089)
这个限制基于下列规则:
- Personal Leads
- Leads with assigned activities
如有必要,请与管理员联系以请求访问权限。
如果不想设置权限,那么可以根据报错信息,定位到触发权限校验的方法名,本例中我们看到的是name_get方法,因此,我们只需要将该对象(crm.lead)的name_get方法进行提权就可以了。
def name_get(self):
""""""
return super(crm_lead,self.sudo()).name_get()
8. 创建/还原数据库失败
Database creation error: template database "template006c933e1826a5f1b3090e6192388eefa9f87f480" does not exist
配置文件中的db_template设置为template0即可解决此问题
9. 不明显的记录规则错误
一般情况下,记录规则的报错都会指出是哪个记录规则引起的报错,此类错误的排查根据提示的记录规则处理即可,但是有一类特殊的异常并没有指明它的记录规则,也就是说记录规则是空的,此类的错误的典型报错示例如下:
Records: test1 (id=63)
User: test1 (id=63)
This restriction is due to the following rules:
Contact your administrator to request access if necessary.
Implicitly accessed through 'Users' (res.users). - - -
如果按照提示去找Users对象的记录规则,是无法解决此问题的,该问题出现的原因在于与Users关联的Partner对象的记录规则有问题。通常是因为无权访问该用户的关联合作伙伴,导致用户甚至无法正常登陆。因此我们在给res.partner模型设置权限的时候一定要多注意。
10. Inherited Qweb view cannot have 'Groups' define on the record. Use 'groups' attributes inside the view definition
这个字面意思是Qweb继承视图不能设置Groups,实际上指的是Qweb的继承视图上不能设置组权限。
11. 没有依赖项的计算字段如何在每次读取的时候跳过缓存?
有时候我们定义的计算字段不依赖于本模型的任何一个字段, 而是依赖于其他模型的字段, 这个时候,我们就没有办法在有弹窗的情况下进行重新获取. 关闭弹窗后, 由于缓存的原因,获取到的值依旧是第三方模型更新前的记录.
这种情况下,可以使用另外一种神秘的辅助手段来解决:
- 查看本模型中是否存在带有inverse字段的计算字段
- 给上面的字段赋一个有效的值
以上两步以后, 当我们在更新弹窗内的关联模型的记录值,然后关闭弹窗以后, 新值就会显示在当前页面中了.
12. TaxB2C 和 TaxB2B不能同时选择
按照odoo的设计原则,用户是不能同时拥有TaxB2C和TaxB2B两种选项的,但是由于某种未知的原因,可能导致超级用户(OdooBot)同时拥有了以上两种权限,导致其他用户在修改该权限时报出异常:
A user cannot have both Tax B2B and Tax B2C.
You should go in General Settings, and choose to display Product Prices
either in 'Tax-Included' or in 'Tax-Excluded' mode
(or switch twice the mode if you are already in the desired one).
解决方法就是切换到超级管理员模式,取消其中一个选项。
13. PDF打印显示公司logo或样式缺失
发生在Ubuntu 22.04版本,由于默认系统缺失libssl1.1,导致依赖安装失败,不能正常使用。20.04可以正常使用。
使用如下命令给Ubuntu 22.04添加libssl1.1源
echo "deb http://security.ubuntu.com/ubuntu focal-security main" | sudo tee /etc/apt/sources.list.d/focal-security.list
sudo apt-get update
sudo apt-get install libssl1.1
另外 wkhtmlpdf版本要使用0.12.4或0.12.5,0.12.6会导致PDF文件页眉和页脚丢失。
还有一种常见的原因是系统使用了HTTPS证书,从而导致静态资源加载不完整。
先将Wkhtmltopdf升级到0.12.5版本, 下载地址:
dpkg -i xxxxx.deb
如果碰到依赖问题,使用:
apt-get install -f
最后在Ngnix的配置文件中,配置一下URL跳转:
proxy_redirect http://abc.com https://abc.com;
14 多数据库不能选择, 提示500错误. 日志显示: TypeError: BaseURL.replace() takes 1 positional argument but 3 were given
本错误与odoo本身无关, 是ubuntu 22.04默认安装了werkzeug 2.0.2版本, 而此版本与odoo不兼容.
处理方法,卸载python3-werkzeug, 然后去官网下载0.16.1版本的werkzeug使用.
15 定时任务没有运行
odoo定时任务直接是线性执行的,如果某个定时任务需要占用大量的运行时长,并且拥有较高的优先级,那么是有可能出现,某个任务在进程的时间内没有完成运行,导致后续的进行无法运行.当服务器重启后,由于它句有较高的优先级,因此会再次阻断其他定时任务的运行.导致死循环.
这种情况的表现就是, 有多个定时任务同时停止. 而且在日志中也可以看到某个阻断的定时任务每隔一段时间就会重新运行.
16. 访问未经授权或无效的公司
现象: 用户在未登录系统的时候出现此错误。
原因: 公用用户(id=4)未设置绑定公司,导致API校验错误,提示无权访问。(通常是把id=1的公司归档掉了,导致公共用户默认公司为空)
解决方案:根据具体的原因将对应的公司或用户重置。
17. force_save属性对计算字段不起作用
force_save只对store=True的计算字段生效。
18. Uncaught Promise > While parsing modifiers for field type: for modifier "readonly": Unknown field state in domain
在使用字段属性的时候,如果在树形列表视图中没有定义state字段,那么就会触发此错误。解决方案也很简单,在视图的arch节点中添加对state字段的引用即可。
19. 如何去除form表单中的save和create按钮?
参考本书第三部分第十九章混合服务类
20. 如何给透视图字段添加排序功能?
重载模型的read_group方法使用orderby参数进行排序。详情参考本书透视图一章。
21. Stripe gave us the following info about the problem
'Invalid URL: http://www.arcticleopard.com/payment/stripe/webhook. URLs in livemode must begin with "https://"'
在配置Stripe的时候, 虽然web.base.url已经是https了,但是还是提示URL访问使用http。
解决方法: odoo配置文件中开启proxy_mode并且配置反向代理的X-Forwarded-Host请求头。
22. 奇怪的odoo.exceptions.AccessError
报的错明明是因为安全规则问题,引发的异常,提示的规则却是空值。
错误: 安全规则中使用了没有存储的计算字段。
odoo.exceptions.AccessError:
'The requested operation ("read" on "XXXXX" (xxx.xxx)) was rejected because of the following rules:\n\n\n(Records: XXXXX (id=27852), User: Kevin (id=51))', None
23. Error: "module 'lib' has no attribute 'X509_V_FLAG_CB_ISSUER_CHECK'"
原因:cryptography版本低
pip3 uninstall cryptography
pip3 install --upgrade cryptography==36.0.2
24. ModuleNotFoundError: No module named 'Crypto'
解决方案
pip install pycryptodome
25. One2many计算赋值无效
odoo16.0后,One2many计算值的赋值机制发生了变化,以前使用的方式:
order.expense_ids = [Command.create({
"name":"123"
})]
而应该使用如下的这种方式:
expense_id = expense_obj.create({'name':'123'})
order.expense_ids = [Command.set(expense_id.ids)]
26. Missing required fields on accountable sale order line
出现此问题是因为销售订单明细行中缺少必要的字段,可能的字段如下:
product_uom: 产品单位
27. Odoo16.0财务看板中 以GL表示余额消失
此问题是由于官方于2023.04.06的一次更新中,更新了看板中余额的计算逻辑。但是这个功能其实还挺有用的,因此,我们在自己的解决方案(mommy_account_dance)中,找回了消失的余额。
具体的操作步骤,请咨询客服。
28. Missing field string information for the field 'xxxx' from the 'xxx' model
此问题多半是由于某个模块的安装状态处于to upgrade状态,某些模型信息缺失导致。具体需排查该模块的内容。
29. Website Google Fonts导致网站加载缓慢
由于众所周知的原因,fonts.googleapi.com在大陆的服务节点无法正常访问。可以使用google.com的国内节点。
替换website模块的website.scss文件:
//website/static/src/scss/website.scss
$-seen-urls: ();
@each $alias, $key in $o-font-aliases-to-keys {
$-url: o-get-font-info($alias, 'url');
@if $-url and index($-seen-urls, $-url) == null {
$-seen-urls: append($-seen-urls, $-url);
//@import url("https://fonts.googleapis.com/css?family=#{unquote($-url)}&display=swap");
@import url("https://fonts.googlefonts.cn/css?family=#{unquote($-url)}&display=swap");
} @else {
$-name: o-get-font-info($alias, 'name');
$-attachment: o-get-font-info($alias, 'attachment');
@if $-attachment {
@import url("/web/content/#{$-attachment}/google-font-#{unquote($-name)}");
}
}
}
使用fonts.googlefonts.cn替代fonts.googleapis.com
30. 源码安装 x86_64-linux-gnu-gcc错误
# odoo13(ubuntu18.04)
apt-get install libxml2-dev libxslt1-dev
31. pillow安装错误 error command errored out with exit status 1
sudo apt-get install libjpeg-dev libpng-dev zlib1g-dev
pip install --upgrade pip
32 use_2to3 is invalid WITH a downgraded setuptools<58.0
pip3 install setuptools==57.5.0 wheel
pip3 install --no-build-isolation --no-cache-dir -U vatnumber==1.2
33. python-ldap: command 'x86_64-linux-gnu-gcc' failed with exit status 1
apt-get install libldap2-dev libsasl2-dev
34. psycopg2: command 'x86_64-linux-gnu-gcc' failed with exit status 1
apt install libpq-dev
35. AttributeError: module 'lib' has no attribute 'X509_V_FLAG_NOTIFY_POLICY'
在ubuntu20.04中安装openssl时报错
AttributeError: module 'lib' has no attribute 'X509_V_FLAG_NOTIFY_POLICY'
原因是pyopenssl的版本过低
使用wheel文件安装最新版本:
pip3 install -U pyOpenSSL-24.1.0-py3-none-any.whl
36. psycopg2.errors.CheckViolation: new row for relation "ir_model_data" violates check constraint "ir_model_data_name_nospaces"
视图定义的名称中包含空格