FAQ

1. PDF打印不了

缺少wkhtmltopdf插件
参考笔者[博客](http://mixoo.cn/2019/06/19/odoo-wkhtmltopdf-install/ )或者直接使用如下命令:

```sh
wget -O - https://raw.githubusercontent.com/jellyhappy/tools/master/wkhtml.sh|bash
```

2. 报表中文字体乱码

参考笔者[博客](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. 没有依赖项的计算字段如何在每次读取的时候跳过缓存?

有时候我们定义的计算字段不依赖于本模型的任何一个字段, 而是依赖于其他模型的字段, 这个时候,我们就没有办法在有弹窗的情况下进行重新获取. 关闭弹窗后, 由于缓存的原因,获取到的值依旧是第三方模型更新前的记录.

这种情况下,可以使用另外一种神秘的辅助手段来解决:

  1. 查看本模型中是否存在带有inverse字段的计算字段
  2. 给上面的字段赋一个有效的值

以上两步以后, 当我们在更新弹窗内的关联模型的记录值,然后关闭弹窗以后, 新值就会显示在当前页面中了.

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

results matching ""

    No results matching ""