python ldap userPassword salt sha md5 encrypt

odoo自带的auth_ldap模块虽然实现了ldap统一账户的验证,但如果用户一旦修改密码就变成同名的本地用户。这是因为odoo默认先验证本地res.users信息,如果没有记录,或者有记录但密码字段为空才会去ldap服务器验证

根据其原理,可以在修改密码的时候对接上ldap的密码信息就完美了,但用modify指令写入的userPassword值是原文存储,即明文直接写入在服务器也是明文,这就需要在请求端预先加密成ldap标准的密文格式

网上看到有很多php的实现都是要写点代码什么的,照葫芦折腾几下才发现python的passlib库居然有现成拿来即用的函数

以此类推

其中ldap_bcrypt,ldap_bsdi_crypt,ldap_des_crypt,ldap_hex_md5,ldap_hex_sha1,ldap_md5,ldap_md5_crypt,ldap_pbkdf2_sha1,ldap_pbkdf2_sha256,ldap_pbkdf2_sha512,ldap_plaintext,ldap_salted_md5,ldap_salted_sha1,ldap_sha1,ldap_sha1_crypt,ldap_sha256_crypt,ldap_sha512_crypt等都是ldap加密相关的兄弟函数,可谓是应有尽有非常丰富,看来在odoo端直接集成phpLDAPadmin里各种类型的加密密码更新都是易事了

odoo addons xml develop debug auto update

odoo以开发者模式运行的话,能自动检测所有的addons目录的代码变动情况自动进行reload
这个机制对于python代码来说是够用的,但是对csv安全规则、xml数据及视图模版来说还需要更新模块才能使其生效

今天由于逐个测试安全规则条目,不断的手工更新模块不胜其烦,只好深入研究一下

odoo9开始已经将开发者模式依赖的pyinotify替换为watchdog,可能是后者的应用范围更广把,不仅提供python库,还附带shell工具

那就学习下这个叫watchmedo的命令行工具吧

看到auto-restart参数后真是让人眼前一亮,根据提示继续学习二级参数

真是太强大了,本以为还要写点小代码什么的,没想到几个选项就可以灵活组合出一个小型的监控工具

-R是目录递归监控
-p是文件模式匹配,主要是排除前端资源和pyc
-d是指定监控目录
–是watchmedo与odoo各自的命令行参数分割线

至此odoo的模块开发效率又提高了一个层次:)

centos odoo decoder jpeg not available

云服务器上传jpg图片提示IOError错误

初步判断是python pil库依赖的底层jpeg lib问题
但是本机正常无法重现,于是检查环境

对比了下发现服务器环境没有libjpeg-turbo-devel.x86_64立马补装一个,重启odoo服务错误依旧,于是继续更新Pillow库

重启odoo服务问题解决
最后回顾了下odoo requirements.txt:
odoo8 Pillow==2.5.1
odoo9 Pillow==2.7.0
其实所谓更新无非是重新安装编译一下Pillow库,没想到直接升级到3.1.0版本,希望没有什么副作用:)

odoo Many2one field create use custom view open

odoo联系人相关的信息全部存储在res.partner对象里,包括供应商、客户、员工等个人及公司相关的信息都可以归纳入内

二次开发经常会直接关联该对象可以少造很多轮子,但由于其新建联系人的默认视图view_partner_form是一个非常重且包含好多类型设置又被各种业务模块继承扩展过的大视图,这就需要为不同的应用场景开发对应业务信息的轻量级自定义视图

最开始我是从继承res.partner并重写其@api.model的fields_view_get方法来完成的

使用很简单view context新增一个view_name属性指定自定义视图名称即可

当后来对其它对象也有同样需求的时候就基本确定我悲剧的造了一个小轮子
因为这个需求是非常合理,如果要一个个对象去继承重写是非常不实现的,至少也要在共同的父类上做对接
根据这个思路从openerp.osv.Model一直寻找到openerp.models.Model的fields_view_get父级方法,其中有一段代码让人眼前一亮

这不就是传说中解决分类自选视图的相关代码:类型、模块名、视图ID确定一个视图
马上删除之前所有相关代码,view context按如下规则修改直接应用

至此,对odoo一切都是models的理念又有了进一步的理解

Odoo8、9打印中文字体配置分析详解

源码路径odoo/openerp/report/render/rml2pdf/customfonts.py

可见对于windows、mac及linux大部分发行版的默认系统字体路径都做了比较全面的配置

接着根据正则*.[Tt][Tt][FfCc]对所有配置路径下的文件扩展名做字体匹配以生成odoo可供配置选择的字体列表

一般Linux下使用最多的开源中文字体是文泉译系列,简称wqy,Centos下yum search wqy相关英文描述(中文笔者补充):

wqy-microhei-fonts.noarch : Compact Chinese fonts derived from Droid
文泉驿微米黑是一个”自由字体”。该字体包含了所有常用简体中文、繁体中文所需要的汉字(最新版本包含超过20932个汉字,完整覆盖GB2312/Big5以及GBK标准字符集)。该字体同时还包含了日文、韩文和其他几十种语言符号。以外,该字体还包含了高质量的Droid Sans拉丁符号和Droid Sans Mono等宽字体,并内置Hinting和Kerning信息。微米黑字体文件极小,特别使用于便携式电脑设备

wqy-unibit-fonts.noarch : WenQuanYi Unibit Bitmap Font
文泉驿Unibit是一款等宽的点阵字体,该字体包含了46,000多个unicode符号,超过27,000多个符合国家标准的汉字点阵字型,是已知的开源字体当中包含符号最完整的字体之一

wqy-zenhei-fonts.noarch : WenQuanYi Zen Hei CJK Font
黑体由于笔画略宽,显示对比度比宋体大,所以越来越得到桌面用户的青睐。文泉驿正黑体正是为这种目的设计的一款开源字体

据上描述可直接根据需要yum install对应的字体名称即可快速安装
当然也可以直接去文泉译官网http://wenq.org/获取最新版本及其它类型中文字体,如文泉驿点阵宋体

然后以优秀的文泉驿微米黑字体为例:

最后一行是字体文件物理位置,很不幸用了独立子目录wqy-microhei,这在官方配置列表里是没有的,不过好在扩展名正则已经支持ttc字体了,之前只有ttf字体才可匹配到,所以很多老教程都是直接在源码里加路径加扩展名匹配来解决

那不改源码最简单的方法就是从配置里与系统最低耦合的~/.fonts用户目录来存放可识别字体:

最后重启odoo,设置-配置-常规设置-报表字体-重载字体,字体下拉里就可以直接选择或者搜索到WenQuanYi Micro Hei选择并应用生效后即可完美使用中文打印各种报表了

本机同时部署odoo8和odoo9等多套开发环境注意事项

自从odoo9正式发布后,odoo8就意味着迟早要跟odoo7一样进入历史
但在一段时间的过渡期内
开发者可能要维持两套版本环境方便快速调式自己的代码能否多版本兼容运行
特别是插件开发,经常一个修改就需要到两个系统更新应用测试
以下记载各个共存环节需要注意的事项

安装方式:
因为安装包是互斥冲突的,所以必须源码安装

依赖库:
相同部分(python)或特有部分(nodejs)可以全局安装,不同部分则用上篇python-virtualenv虚拟环境隔离

数据库:
最简单一个本机帐号同名的超级账户共享使用,odoo缺省配置就能连接上了
不过最好先安装8在安装9,因为9能认识8创建的数据库而忽略,但8不太认识9创建的数据库自动连接会报错
共存之后8的控制台会例行报如下警告,要洁癖只能分别配置两个数据库帐号

版本库:
odoo8和odoo9两目录分别clone对应官方git版本库的8.0和9.0分支,独立各自日常更新

插件库:
比较灵活,我的方式是与odoo目录同级,然后配置文件共同指向

配置文件:
启动时分别指定各自独立配置,各自用不同的端口

浏览器:
虽然分属不同的端口提供服务,但因为登录标识必须要写用户本地浏览器cookie如session_id,或者犹如website_lang网站默认语言这种个性化设置。但由于cookie只匹配域名及路径就是不区分端口,所以同一个浏览器只能固定某个版本调式,如果同时使用就会发生各种意想不到的混乱错误。
当然解决方案也很简单,就是将本机127.0.0.1多设置几个如localhost这种别名来给不同的odoo版本独立访问即可

 

用python-virtualenv统一管理odoo python依赖库

odoo有些python依赖库官方yum源里没有
或者有可能版本不兼容
这就需要根据版本指定安装,默认是安装到
/usr/lib/python2.7/site-packages/
主要是本机开发环境,各种基于python的系统部署一起
长期下来感觉又回到windows时代dll库混乱的悲剧
更何况odoo8和odoo9所依赖的库和版本都不尽相同
非常需要根据应用来独立管理所对应的依赖环境

安装python-virtualenv:

创建虚拟环境:

进入虚拟环境:

进入odoo目录直接安装:

也可以直接通过pip来安装(可用阿里云等提供的国内镜像快速下载):

可能会遇到一些库对virtualenv默认的setuptools的版本有要求,根据提示升级下(Centos目前yum源python-virtualenv-1.10.1-2自带的是0.9.8版本有些低):

同时附上pip、easy_install及setup.py安装获取依赖库的阿里云镜像源配置:

以后每次使用都要先通过source命令指定对应环境下的activate初始化进入
离开则直接使用deactivate命令即可回到原生环境
当然也可以通过修改odoo.py头直接指定虚拟环境的python路径来快捷运行:

 

Odoo Bootswatch Theme fonts.googleapis.com访问速度慢

Odoo8的website模块自带Bootswatch系列主题集
Odoo9则将其独立为一个theme_bootswatch主题,可见将来主题也跟应用一样市场化了

其中某些子主题依赖谷歌fonts.googleapis.com字体,国内用户全天候访问不一定友好,可以选用360网站卫士提供的CDN服务替换以达到安全或加速的效果

360网站卫士官方说明http://libs.useso.com/

主题路径
odoo8/addons/website/static/src/css/bootswatch
odoo9/addons/theme_bootswatch

全局搜索“fonts.googleapis.com”替换成“fonts.useso.com”即可解决不稳定问题
也可以举一反三直接在odoo主目录暴力搜索替换以解决其它第三方应用或主题可能存在同样的问题

如何提交应用和主题至Odoo Apps市场

首先得有一个Odoo官网帐号,注册
https://www.odoo.com/web/signup

登录并提交您的Git仓库地址
https://apps.odoo.com/apps/upload
如:

注意:
仓库根目录每一个应用或主题都分别对应一个子目录(多个应用和主题一起发布机制)
仓库地址末尾添加#分支名称来指定版本分支(#在URL里称为锚)
分支名称用于匹配模块的系列版本号(可多个不同版本用于对应的系统版本)

仓库管理
https://apps.odoo.com/apps/dashboard/repos
一个应用多个分支版本需要分别多次提交
每个新提交仓库默认Draft状态,需要点击Scan操作变成Active状态后
就可以在My Apps中看到自己新发布的应用了
后续应用更新先提交对应分支版本
然后My Repos中执行Scan操作即可同步市场

我想出售自己的模块?
可以在官方的的应用程序平台上出售自己的模块。只要在模块描述文件__openerp__.py里简单的增加价格和货币项{‘price’: 49.99, ‘currency’: ‘EUR’}就可以开始销售您的模块。目前支持的货币为欧元和美元。官方要求在应用程序平台上出售的模块都有一个适当的描述,完整的功能截图和整体美观大方的展示页。关于如何实现这一目标,请参考以下部分的更多信息。官方保留三无模块的下架权利

我的模块要卖多少钱?
不要担心您工作应得的价值!如果有人需要你模块的功能,他们将为它支付。在任何情况下,这会使他们节约所开发的时间,所以你不应该低估你的工作。官方认为100欧元是一个很好的起点:)

我的模块如何拥有一个友好的图标和描述
从8.0版本开始,模块图标可放置于模块文件夹/static/description/icon.png
相关截图在模块描述文件中定义,可多个

富文本HTML描述则来自于模块文件夹/static/description/index.html
建议参照这个官方模板
https://github.com/odoo/odoo/blob/master/addons/crm/static/description/index.html

我的模块文档如何展示?
模块文件夹/doc/index.rst文件会被自动加载为文档。它必须是一个有效的RST文件

我的模块收入如何得到?
您在官方平台上模块收入的70%将会给你。只要发给他们每售出模块和价格编号的单据。你可以在你的销售仪表盘中找到这些信息(https://apps.odoo.com/apps/dashboard/sales)。考虑到处理这些单据需要时间请理解官方只处理累计总额不少于400欧元的单据

我的代码仓库是私有的怎么办?
要在官方平台上发布您的模块,他们需要被允许从您的私有库中读取。如果您在GitHub上,只要简单授权online-odoo用户访问即可。如果不是,您将需要授权官方的public SSH key来代替。最后不要忘记使用SSH地址来注册您的仓库好让他们确定使用SSH协议

我还有其他问题?
请直接联系官方邮箱apps@odoo.com,据说他们将会竭诚为您服务。。。

odoo开发支持国际化语言的第三方应用

英语开发并安装好应用的单语言版本
普通视图元素的string、help、sum、confirm、placeholder属性文本自动导出
QWeb模版(包括服务端和客户端两个部分),如果没有用t-translation=”off”关闭翻译,
则title、alt、label、placeholder属性文本也会自动导出
关于模型字段(Model Field),如果模型没有标注_translate = False:则string和help属性默认可导出;selection类型字段文本也可导出;translate属性设置为True,则所有存在值(values)都会导出
_constraints和_sql_constraints约束中的help、error信息会导出
其它代码里显式调用国际化字符串获取接口的参数值一同导出

管理员设置
翻译(Translations)=》导入/导出(Import / Export)=》导出翻译(Export Translations)
语言(Language)选择新语言翻译模版(New Language Empty translation template)
文件格式(File Format)选择PO File
导出应用(Apps To Export)里选择您的模块
导出(Export)=>下载《模块名.pot》文件

模块新增i18n目录
将上一步导出的文件移进去作为基准翻译模版
以此模版为基础简单的另存为其它语言文件如:zh_CN.po
或者使用PO editor等编辑软件所译即所得自动生成
还可以当前目录直接运行msginit命令默认生成操作系统对应的语言版本文件

与直接模版另存为比较多了以下三项区别:

根据语言文件内的各项原文本msgid部分翻译成对应的msgstr值
加载翻译分别选择各种语言并覆盖已存在的术语(odoo9更新模块也可达到部分效果)
选择不同的用户语言即可整体确认翻译质量

应用发布
odoo9和odoo8的翻译文件不太兼容,主要是因为各自对msgid的引用方式不同
需要分别针对不同版本的系统制作翻译文件并发布到对应分支上