Tagged: odoo

Mac psycopg2 安装错误记录

今天在电脑上安装Odoo的python的依赖包时,遇到了psycopg2无法正常安装的问题。提示 ld: library not found for -lssl 找不到,导致安装失败。

lssl是属于openssl的lib文件,查看系统发现openssl是正确安装的。

brew openssl info

于是查看系统的env环境发现openssl的CPPFLAGS环境变量是没有设置的,于是将openssl的环境变量均设置上。

export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"
export PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig"

再次尝试安装

pip --no-cache install psycopg2

发现能正常安装了,综上判断,安装不了应该是由于没有找到openssl所对应的lib库引起的。

Odoo邮件配置

在项目中,我们通常会使用到消息通知。然而在Odoo中,它提供来多种方式,Email、备注、消息通知。

这里我们使用Email作为消息的通知方式,那么说到Email发送消息,首先就需要配置Email到发送服务SMTP。在什么都不设置都情况下,我们需要为每一个用户都Email去设置这样都配置。极其不方便。

这里就延伸出来Odoo发送邮件都几种方式。

简单发送

mail.catchall.domain不设置

直接用发送账号发出,发件人需要与发送账号相同或者是其同一账号下的其他别名,否则会被邮件系统拒绝,如SMTPSenderRefused: 501 mail from address must be same as authorization user test@bcsytv.com。

接收方也直接回复该真实地址,非常容易理解,属于最原始的模式,最适合做邮件通知这种只集成发送不用集成接收的情况

代理发送

mail.catchall.domain设置,mail.bounce.alias不设置

间接用postmaster-odoo账号代发出,发送账号需要具有该名称授权,否则也会被邮件系统拒绝,如SMTPSenderRefused: 501 mail from address must be same as authorization user postmaster-odoo@bcsytv.com。

接收方默认回复catchall专用地址,由于属于代发,且发件地址、代发地址、回复地址都可以不相同,第一次使用还会有些颠覆邮箱观,甚至某些客户端出于谨慎还会出现欺诈提醒,但这确是目前国内用的最多的务实模式。

反弹发送

mail.catchall.domain设置,mail.bounce.alias设置

间接用bounce地址代发出,如bounce+5-res.users-2@bcsytv.com或者bounce+5@bcsytv.com,其中+5为邮件流水号,-2为单据流水号,可见前者还是单据相关邮件,接收方也默认回复catchall专用地址,因为其涉及到邮件接收等相关知识,而且国内免费邮箱服务基本没有完美支持,本文将不深入探讨,待以后ODOO邮件接收集成的时候在讨论如何配合Postfix实现完美收发自如。

认识了Odoo支持都几种发送方式后,这里我们选择第二种。

配置Odoo默认域

设置默认域

设置发件服务器

设置——技术——发件服务器

设置邮件发送服务器

设置收件服务器

设置——技术——收件服务器

设置邮件接收服务器

设定系统参数

设置——技术——系统参数

设定系统参数

如果系统参数中存在 mail.bounce.alias ,那么需要将其删除掉。

测试

设定测试内容

Process finished with exit code -1073740940 (0xC0000374)

问题重现

最近将系统升级到了Windows LTSC 2019,且使用了较新的Python(3.7.3),在调试Odoo12的时候,Pycharm直接抛出错误"Process finished with exit code -1073740940 (0xC0000374)",经过各方查证,发现问题是由于locale这个包引起的。

Locale

解决方法

控制面板—>区域

区域
设置

到此,重启计算机,问题修复。

参考来源:https://youtrack.jetbrains.com/issue/PY-33045

Uncaught Error: Unknown field state in domain

错误信息

Uncaught Error: Unknown field state in domain
http://actt.test.cn:8030/web/content/986-6511bf3/web.assets_backend.js:376
追溯:
Error: Unknown field state in domain
    at Class.compute (http://actt.test.cn:8030/web/content/986-6511bf3/web.assets_backend.js:376:55)
    at evalModifier (http://actt.test.cn:8030/web/content/986-6511bf3/web.assets_backend.js:1382:91)
    at Class._evalModifiers (http://actt.test.cn:8030/web/content/986-6511bf3/web.assets_backend.js:1385:44)
    at Class._registerModifiers (http://actt.test.cn:8030/web/content/986-6511bf3/web.assets_backend.js:1557:101)
    at Class._renderBodyCell (http://actt.test.cn:8030/web/content/986-6511bf3/web.assets_backend.js:1921:58)
    at http://actt.test.cn:8030/web/content/986-6511bf3/web.assets_backend.js:1940:132
    at Function._.map._.collect (http://actt.test.cn:8030/web/content/702-de21336/web.assets_common.js:13:270)
    at Class._renderRow [as _super] (http://actt.test.cn:8030/web/content/986-6511bf3/web.assets_backend.js:1940:82)
    at Class._renderRow (http://actt.test.cn:8030/web/content/986-6511bf3/web.assets_backend.js:1881:71)
    at Class.<anonymous> (http://actt.test.cn:8030/web/content/702-de21336/web.assets_common.js:3540:371)

准备工作

  1. 开打 Debug=assets模式
  2. 打开浏览器Debug模式

查看Console信息

错误信息

错误处理

查看错误的信息,打上断点

重新执行操作

这里可以看到67行代码中会执行一个表达式,通过this._data[0]去比较values中的值,这里再查看values的数据是什么

继续往上跟踪

发现在渲染行的时候也没有这个字段,那么问题基本可以定位了,我们没有在tree视图中添加我们需要的state字段。

继续查看我们的VIEW视图文件。

果然没有,增加上去!

重新启动、更新模块

问题解决!

Odoo12 开发之重写List记录打开方式

在Odoo中,记录的打开方式都是通过事件绑定的方式进行的,但要如何才能知道我在点击这个记录的时候触发了什么操作呢。这篇日志主要就是说明一下,在遇到这类情况的时候如何来找到正确的处理方式。

首先我们得到明确的需求,我们需要在Odoo的列表视图中重写打开记录指向的Form。

Odoo 列表视图

一、准备工作

进入Assets Debug模式

或者使用修改Url的方式

 http://localhost:8069/web?debug=assets#home

进入浏览器开发者模式(F12)

Chrome Debug

二、找寻需要的事件

事件管理

如果事件太多可以使用如下方式移除不必要的事件

接下来我们可以将不必要的实践移除后再点击行记录,如果能正确执行,那么代表我们需要的事件就还在这个列表中。

最终在我移除了大部分事件后,保留如下事件的情况下,功能还正常。那么可以断定,我需要的点击事件就是它。

跟进Js代码中,发现这个代码是这样的

proxy: function (method) {
        var self = this;
        return function () {
            var fn = (typeof method === 'string') ? self[method] : method;
            if (fn === void 0) {
                throw new Error("Couldn't find method '" + method + "' in widget " + self);
            }
            return fn.apply(self, arguments);
        };
    },

从代码中可以看出,这又是一个代理事件,那么继续打断点跟踪

最终在list_renderer.js文件见找到如何方法

    _onRowClicked: function (event) {
        // The special_click property explicitely allow events to bubble all
        // the way up to bootstrap's level rather than being stopped earlier.
        if (!$(event.target).prop('special_click')) {
            var id = $(event.currentTarget).data('id');
            if (id) {
                this.trigger_up('open_record', { id: id, target: event.target });
            }
        }
    }

再看方法引用

至此,就可以直接复写该方法来实现了。。

附上最后实现的代码~

odoo.define('ps.web.ListRenderer', function (require) {
"use strict";
var ListRenderer = require('web.ListRenderer');

ListRenderer.include({
		_onRowClicked: function (event) {
			if (this.state.model === 'combined.statements.working.paper.project') {
				let record = this.state.data.find(record => record.id === $(event.currentTarget).data('id')).data;
				this.do_action({
					type: "ir.actions.client",
					tag: 'working.papers',
					params: record
				});
			}else{
				this._super.apply(this, arguments);
			}
		}
	});
});

Odoo 10 Could not execute command lessc

这个问题出现的十分突然,早上打开项目,直接抛出“Could not execute command lessc”这个Error,导致界面加载异常。

现将处理过程做一次分析整理。

再看系统环境变量

启动程序,问题依旧。。

跟进代码

发现 os.environ 这个变量中的PATH里面被覆盖了。

调整启动配置

再次跟进代码
Over...

Archives