Odoo快速入门与实战:Python开发ERP指南(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-14 03:24:27

点击下载

作者:刘金亮

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Odoo快速入门与实战:Python开发ERP指南

Odoo快速入门与实战:Python开发ERP指南试读:

前言

Odoo是什么

Odoo是一个开放源码且功能完善的企业级管理软件平台,它不仅提供了ERP常规模块,而且还允许使用人员进行灵活的实施配置。对于前台配置解决不了的需求,还可以通过Odoo提供的平台进行二次开发。

我曾在SAP领域工作了8年,参与和主导过的项目金额超过千万元,因此我能深刻体会到一个好的ERP产品在实施过程中是多么重要。目前国内虽然也有不错的ERP产品,但全是靠厂商及其合作伙伴来实施并进行二次开发,如果甲方想要自己培养技术人员则非常困难,很少有技术人员愿意将自己的职业发展方向捆绑在一个封闭又落后的技术框架上。这时候,Odoo开源及其使用Python开发的优点就显现了出来,不仅企业可以免费配置使用,而且还可以方便地找到二次开发人员,甚至也可以找到具有学习热情的内部人员。毕竟Python的魅力及其在互联网领域越来越广的应用,决定了以后Odoo开发的难度会越来越低。

Odoo良好的可扩展性可以媲美任何主流的ERP产品,其允许按照模块实现新的需求;在二次开发的过程中,如果要修改已有功能的话,也不需要直接修改源码,只需使用继承的方式来进行增强和扩展,或者在子类中修改字段或方法。

Odoo从其前身OpenERP开始,就受到了来自社区的活跃更新的支持;目前,Odoo有数千个社区模块,几乎所有的主题都能找到相应的社区模块,这也反过来进一步吸引了更多的人员参与到Odoo的社区中来。

谁适合阅读本书

本书作为Odoo的开发指南,按照由简入难的步骤对Odoo的开发进行了全面介绍,不仅可以让你快速入门Odoo,同时也可以作为你进行项目实战的不错的参考资料。

本书适合于想使用Odoo进行开发的开发者,在阅读本书前甚至不需要具备Python基础编程知识,因为书中专门有一章(第4章)对Python进行了介绍。书中所列案例使用的代码简单明了,对于使用中会遇到的一些“坑”也给出了特别说明。

同时,本书也适合于Odoo的关键用户和最终用户,如果你在拥有Odoo系统的使用经验的前提下,还希望提升自己的开发技能,以便日后在工作中能够完成更为复杂的需求实现,那么本书将是非常好的参考用书。

如果你已经是Odoo开发人员,那么可以将本书作为不同版本之间的对比用书,毕竟从Odoo8到目前的Odoo12有了较大的变化。

最后,在校大学生也可以使用本书制作自己的案例、编写论文,甚至直接作为未来工作的编程平台。Odoo在国内的市场越来越大,特别是非一线城市对于Odoo人才的需求也越来越大,如果作为学生的你不想将自己未来的职场定位在北上广深,那么Odoo将是一个非常不错的选择。

如何阅读本书

本书在逻辑上分为三篇:基础篇、技术研发篇和实战篇。基础篇(第1~5章)包括了Odoo的介绍及安装配置、Python基础和PostgreSQL数据库介绍。不了解Odoo的读者请认真阅读第一篇,以免在后面的章节中出现不了解的名词。特别是没有Python基础的读者,最好能够认真学习第4章。

技术研发篇(第6~14章)则专注在Odoo的技术范畴内,包括了从视图到ORM和安全配置的全方位介绍,并且都是以bug管理系统的实现为示例来进行讲解的,读者在学习本篇内容时应边参考本书边动手实现。如果读者已经有Odoo基础,则可以直接下载本书的源码,在遇到不理解的内容时再查找相应知识点。

而对于实战篇(第15~19章),其内容从培训机构的管理系统的需求分析开始,再到划分模块,最后到具体的逻辑和视图的实现,非常适合有充足时间的初学者,特别是学生。

读者在阅读本书时,要注意源码的使用,具体的源码下载方式会在后续的“源码与勘误支持”部分提供。

在阅读本书的过程中,读者有任何疑问都可以访问作者网站http://www.scott-odoo.com,以进行提问和交流。

源码与勘误支持

书中提供了核心源码,而且为了便于阅读特意增加了行号。需要读者注意的是,因为排版的问题,可能将原本属于一行的代码自动换行成两行,所以请读者以行号为准,凡是不带行号的代码说明都属于上一行。

本书的示例代码以及实战项目的源码可以到GitHub下载,下载地址为:

https://github.com/ScottAI/Odoo-Python-ERP-

实战项目同时支持Odoo11和Odoo12,Odoo端的下载地址如下:

https://github.com/ScottAI/-Odoo---

实战项目的小程序端下载地址为:

https://github.com/ScottAI/lexuebao-odoo-wechat

由于作者的水平有限,加之撰写时间仓促,难免有错误或不合理之处,欢迎读者指正,你可以通过以下任何一种方式联系到作者:

作者的QQ:784680552

作者的邮箱:wkdljl@163.com

作者的个人博客:www.scott-odoo.com第一篇基础篇Odoo是当今最主流的免费管理系统和ERP系统框架,要想在企业内部更好地使用它,进行二次开发是非常有必要的,可是并非所有的情况都需要通过二次开发来完成,同时我们也应该知道,任何东西的应用都是有学习成本的,特别是企业级的应用系统。所以,本篇的主要目的是向读者介绍什么是Odoo,如何安装Odoo,如何通过配置来完成简单的需求,以及Python和PostgreSQL数据库的基础。如果读者已有Python编程基础则可直接跳过第4章,对于有其他语言编程经验的读者,仅通过学习第4章就可以掌握Odoo所用到的Python基础知识点。PostgreSQL数据库则可以在后面的实战部分完成后再进行学习,Odoo提供了良好的ORM,而我们一般不需要直接访问PostgreSQL数据库。在学习本篇的过程中,建议读者一定要多动手,如果仅仅是想了解Odoo,则可以直接阅读第3章;要想成为真正可以进行开发的工程师,则需要边学习边练习。第1章 Odoo简介

Odoo是一个完整的中小企业ERP系统,其中的模块包括管理会计、财务会计、库存管理、销售、采购管理、人力资源管理、项目管理等,总共700多个。Odoo遵循通用公共许可证(GUN),并且源码开放,个人和企业都可以在遵循GUN协议的情况下使用Odoo。

Odoo因为其高度模块化和开源免费的特点,目前在世界范围内得到了高速的发展,是SAP、Oracle以外应用最广泛的管理系统,后续我们将从发展历程和对比分析的角度来介绍一下Odoo。1.1 Odoo发展历程

结合国外科学数据维基网站(www.limswiki.org)提供的数据,我们可以梳理出Odoo的发展历程。Odoo之前的名称是OpenERP,它由当时还是学生的Fabien Pinckaers在2002年5月开发的一个小项目TinyERP发展而来。当Pinckaers在2005年完成学业时,该项目已经发展到足够大的程度,Pinckaers引入了一个合作伙伴并传播了TinyERP的开源性质。然而,到2008年7月,计划开始改变项目的名称和重点。于是,Launchck项目于2008年7月24日由Pinckaers启动,到2008年10月,该项目向OpenERP的过渡已经完成。

2010年2月,OpenERP从Sofinnova Partners手中获得了300万欧元的风险投资,用于加速公司的战略发展,包括加强管理团队、增加新SaaS OpenERP产品(www.odoo.com)的分销以及增强它的国际化。

2014年5月15日,Fabien Pinckaers宣布OpenERP更名为Odoo。Pinckaers引用了越来越多的应用模块和产品的“开箱即用集成度”,这些产品已从企业资源规划平台得到大幅度提升。Pinckaers说:“我们需要一个没有约束的品牌。我们想要一个品牌,允许我们发布销售、会计、库存、采购等ERP应用程序。但该品牌也应该适合我们的最新应用,如网站建设者、电子商务、销售点或商务智能。”

开发团队声称“Odoo”这个名字没有任何意义。有种解释是Odoo的域名已经被Pinckaers团队控制,而且团队发现“公司估价与其名称中‘O’的数量存在着直接的关联。”所以最终选择使用Odoo作为新产品名。实际上www.odoo.com这个域名从2009年到2010年一直用于分享OpenERP当时的新型软件即服务(SaaS)产品的服务。这也说明Odoo产品的模块范围远大于传统ERP领域。

发展到目前,除了免费开源的社区版以外,Odoo还提供了收费的企业版。目前该公司有员工约500人,服务用户约370万人。1.2 Odoo与主流ERP系统的对比

首先,从国际市场占有率来看,最知名的ERP系统肯定是目前市场占有率第一的SAP,不过可以这样说,Odoo与SAP并不是竞争关系,SAP的客户主要来自于世界500强等大型国际化公司,而Odoo则主要应用于中小型企业。

从产品的功能特性来说,Odoo的特点是灵活、便于二次开发以及免费开源。而SAP则是具有强大的可配置性和丰富的行业解决方案,二次开发的学习成本非常高,需要使用其特有的ABAP语言。

从国内的ERP系统市场占有率来分析,Odoo的市场份额明显更大,因为与国内的ERP产品相比,Odoo的优势比较明显。

国内ERP系统基本上都是以某个行业或模块为核心来进行客户定位、功能设计与市场营销的,比如金蝶、用友主打财务,鼎捷软件(神州数码)主打生产,其标准产品都是可以直接使用的。Odoo本质上是一个用于快速开发的基于Python的Web架构ERP系统框架,而并非行业软件。

Odoo中自带的各个模块并不是提供给大家直接使用的,绝大多数情况下它们都无法直接使用。原因很简单,其主流程虽然是完善的,但并不具备分支流程和异常流程,要想正常使用大都需要进行二次开发。而Odoo的精妙之处正在于此,大多数公司的主流程都大同小异,直接使用原生模块即可,分支流程和异常流程需要基于原生模块对其进行定制。Odoo框架的设计初衷就是让开发人员用最少的代码实现最多的功能,甚至不用代码仅用配置即可实现。因此其用于开发管理系统的开发速度可以说是其他框架或语言的10倍都不止。

综上所述,Odoo本质上其实就是一个快速实现各种定制化管理系统的框架工具,而且其本身也形成了一定的社区和生态。

那么在具体的产品上,Odoo具有哪些优势呢?下面就来讲解如下。

·电子商务。虽然SAP提供了电子商务功能,但与Odoo提供的企业网站、电子商务、企业论坛以及电子商务与ERP系统的完美结合这几点对比来看,SAP还是有其先天弱势的,SAP需要大量的实施工作。而国内的ERP产品基本上都依赖于定制开发,费时费力而且bug比较多。

·消息及邮件系统。这一点是Odoo最鲜明的特色,其在很大程度上实现了OA的大部分功能。该项功能可以完成关注信息的自动推送,内部信息的发送和群发,消息系统和企业邮箱的继承,以及与日历的集成等操作。

·客户关系管理。虽然很多ERP系统都提供CRM,但Odoo的CRM却有其自己的特色。客户的访谈和日历是集成的、会议也是集成的,以便记录客户的各种信息;所有的单据都提供了附件上传功能,以便上传自己记录的文件。

·多语言、多公司、多货币。特别是与国内的ERP产品相比,Odoo在这一点上的优势非常明显,Odoo可以根据个人用户的设置将界面自动翻译成用户的本地语言,也可以将多种货币兑换成公司的本币。这两项功能在国内的ERP产品中都是没有的,多公司则是允许一个ERP系统内有多个公司。

综上所述,可以看到Odoo在中小企业范围内是非常优秀的ERP产品,如果企业恰好没有OA系统,或者恰好从事外贸等需要多语言的业务场景,那么Odoo无疑是企业的首选。1.3 总结

本章介绍了Odoo是什么以及Odoo是如何发展而来的,并将其与国内外主流ERP系统进行了对比,分析了Odoo的主要优势。

在了解了Odoo的特点以后,你是不是对进一步了解和学习Odoo充满期待呢?那么接下来我们就来了解Odoo的安装和配置。第2章 安装与配置

本书的编写宗旨是以实用为主,也希望读者在使用本书时能够在实际环境中边操作边参考本书。本书编写案例所使用的Odoo环境是安装在云服务器上的,使用的操作系统是Ubuntu16.04,建议读者也使用该操作系统。如果身边没有合适的操作系统,又觉得在Windows系统上安装虚拟机太消耗性能,那么建议租一个云服务器作为学习使用,其性价比非常高,也符合目前的主流工程应用方向。

当然,如果硬件配置较高的话,那么在Windows上安装Linux/Unix虚拟机,然后在虚拟机上进行应用也是可以的。

这里我们还是建议大家首选Debian/Ubuntu系统,虽然Odoo在多种操作系统上都可以运行,但Odoo的开发团队一直将Debian作为参考部署平台,而且其SaaS应用也是基于Debian的。这就意味着,如果选择Debian或Ubuntu,那么从网上查找相关资料将会更容易。2.1 在Ubuntu上安装Odoo2.1.1 创建Odoo用户并授权

在Ubuntu上安装Odoo时,首先需要注意一点的是:不可以在root用户下安装Odoo。

所以第一步,我们需要在操作系统上新创建一个用户,新建用户的命令如下:1. $ sudo adduser odoo

然后,编辑文件/etc/sudoers为Odoo授权,修改文件命令如下:1. # User privilege specification 2. root ALL=(ALL:ALL) ALL 3. odoo ALL=(ALL:ALL) ALL

最后,保存退出,这样Odoo用户就拥有了root权限。

接着从当前的root用户切换到Odoo用户,并进入Odoo用户的home目录,命令如下:1. $ su odoo 2. 3. $cd ~ 2.1.2 更新依赖包并使用git克隆Odoo源码

检查一下软件包是否为最新版本,并且安装git。Ubuntu的16.04版本中已经自带了git,不管之前有没有安装git都可以按照如下代码直接执行:1. $ sudo apt update 2. $ sudo apt upgrade 3. $ sudo apt install git

更新完成后需要重启一下服务器:1. $ sudo reboot

接下来,安装Node.js:1. $ sudo apt-get install -y npm 2. $ sudo ln -s /usr/bin/nodejs /usr/bin/node 3. $ sudo npm install -g less

在安装时一定要注意系统提示的消息,如果安装不成功则需要重新执行安装命令。

安装Odoo的使用文档介绍,Odoo提供了三种安装方式,因为本书主要是讲解开发,所以这里采用源码安装的方式直接从git上下载安装,这样既便于参考源码也便于使用git更新版本。可使用如下命令下载Odoo11版本源码:1. $ git clone https://github.com/odoo/odoo.git odoo11 -b 11.0 --depth=1

如果要安装其他版本(比如Odoo12),则直接修改上面–b后的数值参数即可。

这样便可以将Odoo11的源码下载进odoo11的文件夹内。注意下载过程中的提示信息,如果超时报错则可以换时间再尝试,下载的文件一定要完整。2.1.3 安装Odoo依赖包及PostgreSQL

因为Odoo11已经完全支持Python3,所以这里需要安装Python3依赖的pip3:1. $ sudo apt-get install -y python3-pip

然后,安装如下依赖包:1. $ sudo pip3 install Babel decorator docutils ebaysdk feedparser gevent greenlet html2text Jinja2 lxml Mako MarkupSafe mock num2words ofxparse passlib Pillow psutil psycogreen psycopg2 pydot pyparsing PyPDF2 pyserial python-dateutil python-openid pytz pyusb PyYAML qrcode reportlab requests six suds-jurko vatnumber vobject Werkzeug XlsxWriter xlwt xlrd

注意提示的信息,一定要确保都安装成功。

安装完这些依赖包之后,下面开始安装PostgreSQL:1. $ sudo apt-get install -y postgresql

然后,进入postgres命令窗口并创建数据库用户odoo:1. $ sudo su - postgres 2.3. >createuser --createdb --username postgres --no-createrole --no-superuser --pwprompt odoo 4. >Enter password for new role: ***** 5. >Enter it again:***** 6. 7. >exit

安装中文字体和报表打印需要的wkhtmltopdf:1. $ sudo apt-get install ttf-wqy-zenhei -y 2. $ sudo apt-get install ttf-wqy-microhei -y 3. $ wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/ 0.12.2.1/wkhtmltox-0.12.2.1_linux-trusty-amd64.deb 4. $ sudo dpkg -i wkhtmltox-0.12.2.1_linux-trusty-amd64.deb

前两步是安装中文字体,第三步是下载wkhtmltopdf,第四步是安装wkhtmltopdf。在执行第四步的时候很可能会提示缺少依赖包,根据提示的信息使用命令sudo apt-get-f install进行安装即可。2.1.4 启动Odoo服务

以前版本的Odoo只支持Python2.7,不过从11.0版本起Odoo开始支持Python3.5及更高版本,而且就作者的实际应用经验来看,对Python3.5的支持确实是一个非常好的改进,本书的代码书写主要以Python3.5为主,如果使用Python2.7则会进行特别说明。如果读者使用的是Odoo12版本,那么也可以完全支持本书的示例代码,而且对Python3.7的支持也非常好。总体来看,对于Odoo的二次开发而言,Odoo11和Odoo12的差别并不大,都是基于Python3。

不过,Ubuntu自14.0版本开始就同时安装了Python2和Python3,我们在使用的时候,需要确定所用的是Python3.5,可以在使用前先将Python3.5(Ubuntu16默认已安装)设为默认的Python版本,然后启动Odoo服务:1. $ ./odoo-bin

接下来就可以通过浏览器查看Odoo的前端页面,验证登录情况。

默认情况下,Odoo实例使用的是8069端口,因此我们访问时浏[1]览器的地址应该是http://:8069,第一次访问时页面会进入提示创建数据库的界面,如图2-1所示。图2-1 创建数据库界面

我们可以在界面上创建数据库,不过作为开发人员,我们需要使用多个数据库,所以从命令行创建会更加方便,接下来我们就来介绍Odoo数据库的使用。

[1] 对应你的服务器ip,如果是本机,则可以使用127.0.0.1。2.2 在Windows上安装Odoo

为了便于开发和调试,我们往往会将开发的工程部署在本地,虽然可以使用远程调试在Ubuntu系统上直接进行开发,但考虑到多人协作以及全文搜索等功能的实现,一般还是会在Windows系统上安装Odoo。本节就来介绍一下,如何在Windows上安装Odoo。2.2.1 准备工作

因为前面已经详细介绍了Odoo在Ubuntu上面的安装操作,所以本节将会简单介绍Odoo在Windows上的安装,而不会提供详细的图文。首先我们要做以下几项准备。

1)Python安装,官网下载地址为https://www.python.org/,安装步骤直接选择下一步即可,不过需要注意环境变量的路径。

2)Node.js安装,从https://nodejs.org/en/上下载后直接安装。

3)PyCharm安装,下载地址为https://www.jetbrains.com。当然也可以使用其他的IDE,不过作者觉得PyCharm是Python开发的一个不错的IDE。

4)PostgreSQL数据库安装,下载地址为https://www.postgresql.org/,安装过程中直接选择下一步即可,不过需要注意密码与端口号。

5)在git上下载Odoo源码,具体可以参考2.1节的方法。2.2.2 环境配置

这些准备工作完成以后,下面就来进行一些环境的配置。

1)进入Odoo源码目录下安装虚拟环境virtualenv:1. pip install virtualenv

2)创建虚拟环境,进入刚安装的虚拟环境目录并执行:1. virtualenv.exe venv

3)激活虚拟环境,进入虚拟环境的文件夹路径后执行:1. venv\Scripts\activate

4)将Odoo下载包内的requirement.txt复制到虚拟环境内,并安装依赖包:1. pip install -r requirements.txt -i https://pypi.doubanio.com/simple

5)配置config,具体请参考2.1节的方法。

6)最后,在IDE内配置Python使用的解释器,将project interpreter设定为刚刚安装的虚拟环境内的python.exe,如图2-2所示。

这样,我们就可以在PyCharm内运行Odoo了。图2-2 PyCharm内配置Python解释器2.3 使用和创建Odoo数据库2.3.1 创建Odoo数据库

先在命令窗口中用Ctrl+C停止Odoo服务,然后回到命令提示符界面。

使用-d参数重新启动Odoo服务:1. $ ~/odoo11/odoo-bin -d testdb

注意

自Odoo9.0开始,数据库会自动创建参数中出现的新数据库,而不需要单独创建。

在启动的时候,我们可以看到窗口的提示信息,需要将testdb数据库初始化,这个过程需要等待一分钟甚至更长时间。默认情况下将会使用演示数据来初始化数据库,这些演示数据可以方便我们从业务层面了解系统的用法,在图2-1创建数据库的界面中,我们可以看到下面有一个“加载演示数据”(Load demonstration data)的复选框。我们可以通过命令行创建数据库,如果不想要演示数据,则请添加--without-demo=all参数。

访问地址http://:8069,这时,我们所看到的界面是一个登录界面,可以使用admin/admin账号进行登录,如图2-3所示的是登录后看到的最简洁的Odoo界面。图2-3 Odoo应用界面

注意

虽然作为开发人员,我们推荐使用命令行方式,但通过页面创建数据库也是完全可以的。2.3.2 语言选择

Odoo是多语言的,我们可以在自己的账号设置中选择需要的语言,比如这里选择简体中文,如图2-4所示。图2-4 Odoo语言设置界面

下面再来看看我们的Odoo界面,已经变成中文的了,如图2-5所示。图2-5 Odoo汉语界面效果

此处,你可以选择自己需要的模块进行安装,具体请参考2.5节。

管理Odoo数据库

在介绍完数据库的创建之后,下面就对Odoo数据库的管理进行专门的介绍。虽然Odoo11及以上版本都完全可以根据设置的参数自动化创建数据库,但如果我们想要新建数据库的话,就需要退出当前的用户,进入到登录界面,如图2-6所示。图2-6 Odoo登录界面

点击上方选择按钮就可以进入数据库的管理界面。数据库管理界面可以新建、备份或删除数据库,如图2-7所示。图2-7 Odoo数据库管理界面2.4 服务器配置

Odoo服务支持的参数非常多,可以使用--help参数来查看:1. $ ~/odoo11/odoo-bin --help

首先,我们来看一下这些参数是如何保存在配置文件中的,以避免每次都在命令行键入。2.4.1 Odoo服务器配置文件

在默认情况下,Odoo使用.odoorc文件来保存配置参数。在Ubuntu系统中,该文件存储于/home/odoo/路径下,Windows系统中则是与可执行文件在同一路径下。

注意

较老的版本(包括OpenERP)中是使用.openerp-serverrc作为配置文件的,Odoo是向后兼容的,但此处还是优先使用.odoorc文件。

为了更方便非root用户远程登录使用,我们可以在Ubuntu中修改一下.odoorc文件的路径,由用户的home路径修改到/etc下面:1. $ sudo mkdir /etc/odoo 2. $ sudo cp /home/odoo/.odoorc /etc/odoo/odoo.conf 3. $ sudo chown -R odoo /etc/odoo

可以看到,上述命令不仅复制了.odoorc,还将其改名为odoo.conf,这是根据个人的项目习惯来修改的,而且也便于与系统原始文件进行区分,读者可以取一个自己习惯的其他文件名。

然后,我们通过vi编辑器进入配置文件,可以看到有很多可配置的参数,一些重要的参数具体解释如下。

·addons_path:使用逗号(,)分隔扩展路径,会在路径中寻找模块,从左至右阅读,最左侧拥有最高的优先级。

·admin_passwd:是master的主控密码,可用于访问Web客户端数据库管理。建议设置一个安全性足够强的密码,设置为False会使此功能失效。

·db_user:数据库实例,在服务器启动序列期间进行初始化。

·dbfilter:用于筛选可访问的数据库,它是Pythoninterpreted正则表达式,用于不让用户选择数据库,以及使未验证的URL能够正常工作,它应该以^dbname$格式进行设置,例如dbfilter=^odoo-prod$。它支持%h和%d占位符,可用来作为HTTP请求的主机名和子域名。

·logfile:Odoo服务日志写入的地方。系统的服务日志通常位于/var/log中,若留空,或者设置为False,则日志会以标准方式进行输出。

·logrotate=True:表示按天存放日志。

·proxy_mode:当使用反向代理时,应将其设为True。

·without_demo:在生产环境中应将其设为True,这样新的数据库中就不会再有演示数据。

·workers:其值为启用的处理器数量。

·xmlrpc_port:服务监听的端口号。默认使用8069。

·data_dir:会话数据和附件存储的位置,应记得备份它。

·xmlrpc-interface:设置监听的地址。默认值会监听所有端口0.0.0.0,在使用反向代理时,可以设置为127.0.0.1,目的是只对本地请求响应。

可以通过以上参数来进行服务器的相关配置,下面是配置服务器日志记录文件的示例:1. $ sudo mkdir /var/log/odoo 2. $ sudo chown odoo /var/log/odoo 3. $ sudo vi /etc/odoo/odoo.conf 4. 5. [options] 6. 7. logfile = /var/log/odoo/odoo.log 8. logrotate = True

通过上面的配置,日志就记录在/var/log/odoo文件内了。2.4.2 远程开发

在项目中,我们的服务一般运行在服务器或者云上,而非本地,而且很多项目为了方便通常把开发机也放在远程位置,这就需要我们能够进行远程开发。

我们自然也可以选择成熟的SSH等工具来登录服务器,然后进行开发,但是那样可用的编辑工具就比较简单了,需要非常好的编程习惯和较高的编程水平,不过更多的人还是习惯在IDE(集成开发环境)内进行编程,接下来我们将介绍如何使用IDE远程开发。

因为Odoo是用Python语言开发的,所以对于IDE的选择,我们推荐使用PyCharm开发环境,因为其对Python的支持非常好。

PyCharm是支持远程开发的,我们只需要进行如下的简单设置:菜单Tools→Deployment→Configuration…,就可以看到如图2-8所示的界面。图2-8 PyCharm远程配置界面

在上面的配置窗口中,将Type设置为SFTP,地址设置为输入服务器地址,端口使用SSH默认的22,路径设置为Odoo安装所在的路径。这样设置之后,就可以在本地打开远程的工程了。2.5 安装模块

已经安装好的Odoo相当于一个ERP系统的平台,但是还不具备直接使用的能力,因为企业的业务多种多样,所以需要根据自己的业务特点选择需要的模块进行安装,应用菜单内已有的模块直接安装即可,没有的模块则需要我们单独下载或自行开发后安装。2.5.1 配置模块插件路径

如果需要安装一个安装时没有的(也就是当前在应用内搜索不到的)模块,那么需要先找到该模块的包,然后复制到odoo11/addons/路径下,最后重启就可以看到新复制过来的模块了。不过,最好不要那样做,因为我们采用的是源码安装方式,也就是说我们在addons路径下的包与GitHub上的包是一样的,后续还可以更新。如果我们将第三方或者自开发的模块安装在这里,那么会导致整个工程的后续难以运维。

一般的做法是单独配置一个或多个路径提供给自开发或第三方模块使用。比如新建一个my-modules路径,然后配置到odoo.conf文件内,命令如下:1. $ vi /etc/odoo/odoo.conf 2. 3. [options] 4. addons_path = /home/odoo11/odoo/addons,/home/odoo11/addons,/home/odoo11/my-modules

在参数addons_path上增加刚刚创建的路径就可以了,如果有多个则用逗号隔开。

注意

因为在前面作者复制了.odoorc文件并改名为odoo.conf,所以请读者在使用时根据自己的实际情况进行操作,也可以直接使用.odoorc文件。

然后就可以在my-modules路径下创建自己需要的模块了,当然将第三方的模块复制过来也是可以的。2.5.2 更新应用列表

对于这些新的模块,我们需要先更新应用列表才可以进行模块插件的安装。现在在系统内是找不到“更新应用”这个功能的,因为我们还没有激活开发者模式,关于开发者模式更具体的介绍请参考3.3节,本节主要介绍操作。

我们从前端页面进入设置界面,然后点击右下角的激活开发者模式按钮,如图2-9所示。

然后,我们可以在应用页面的左侧,看到更新应用列表,如图2-10所示。图2-9 “激活开发者模式”所在界面图2-10 “更新应用列表”界面

点击该按钮后,系统会重新加载配置文件,这时我们可以在上方的搜索框内搜索自己的新模块进行安装。2.6 总结

本章主要介绍了如何在Ubuntu系统上通过git以源码的方式安装Odoo,如何进行数据库的相关操作,以及如何进行常用的配置(如日志、anddons路径配置等)。

目前我们应该可以运行自己的Odoo实例,熟悉数据库的基本操作,并且知道如何安装一个模块。

在接下来的章节中,我们会快速地浏览一遍Odoo,查看其主要的架构并进行简单的系统配置应用。第3章 Odoo应用概览

Odoo提供了一个非常方便的开发框架,该框架将对应数据的CRUD(创建、读取、更新、删除)进行了封装,同时也对前端的视图展示进行了封装,可以让开发人员将精力全部放到业务数据和业务逻辑的处理上。

本章将主要介绍Odoo的框架,我们将围绕MVC(模型、视图、控制)三层架构进行介绍,下面首先来介绍Odoo的整体架构。3.1 整体架构

MVC是一个非常成熟的大型程序设计的分层架构,Odoo就是遵循这一设计原则进行设计的。

Odoo的分层可通过Models、Views和Actions三种对象进行处理,这三种对象是Odoo提供的具体的实现对象。

而站在更加抽象的层面,我们可以将架构分为数据层、逻辑层和视图层,这种划分更加符合通用的MVC的设计模型,下面就按照这种分层方式逐一进行介绍。

数据层是最低级别的一层,其直接与数据库交互并进行增删查改操作。在Odoo的架构中,数据库采用PostgreSQL,PostgreSQL是Odoo支持的符合RDBMS标准的数据库,而且Odoo11已经完全支持在Python3中进行运行和开发,同时PostgreSQL数据库对Python3的支持也是非常完善的。

逻辑层负责与数据层的直接交互,逻辑与数据之间的关系在企业级开发中是最为烦琐的,有编程经验的读者应该会有体会,比如要开发一个生产管理模块,如果逻辑与数据的交互全部由程序员自己编写SQL语句来完成的话,恐怕系统写完以后就会需要大量的文档来描述和梳理这些SQL语句,这一点对于后续的运维来说是非常不方便的。Odoo提供了ORM(对象关系映射)引擎,可以让Odoo的开发者非常方便地整合逻辑层和数据层。简单来说,就是我们在使用Odoo的时候,通常只需要在Python中编写create()或read()方法就可以了,而不需要使用SQL去编写create或者select语句,因为ORM引擎会根据我们的Python方法与对应的实体自动生成SQL语句,这一点会在第6章进行讨论。

展示层负责展示数据以及与用户的直接数据交互,用时下比较流行的说法就是展示层负责所有的用户体验。当然有很多功能用户是不知道的,比如在技术上,Odoo的展示层是使用rpcs(远程过程调用)来调用ORM API,然后Odoo服务器根据获取的请求返回响应,展示层获取响应数据后进行后续处理。

虽然理论上是这样的,但事实上Odoo平台提供的展示层要比前面介绍的Models、Views和Actions三种对象设计的功能更为齐全。对于业务上的一些常用功能,Odoo展示层都进行了封装,如导航菜单、列表数据、表单数据等。这一点与普通的前端开发是有差别的,但这也正体现了企业级开发的特点:尽可能归纳规律。

如果你不想使用Odoo的展示层,那么其也提供了丰富的API供你去开发自己风格的前端或者移动前端,这样Odoo就只需要处理逻辑层和数据层了。关于这种情形最出名的例子就是Erppeek.client,该命令行客户端允许用户远程与服务器连接并进行交互,在第14章,我们会介绍这个第三方工具。3.2 什么是开发者模式

ERP项目区别于其他项目的一个很大的特点就是ERP项目一般是三方项目,包括产品开发方、实施方、购买方(甲方)。产品开发方会根据行业特点完成底层功能的开发,而实施方则在现场根据需求进行配置,如增减字段、修改菜单等。

Odoo充分考虑了这一点,自Odoo10开始就提供了Odoo studio,本章虽不会重点介绍studio,但还是会简单介绍通过前端页面进行的一些配置。

关于该功能,虽然在实际项目中实施人员使用得比较多,但考虑到很多小型企业是没有实施方的,也就是说开发者和实施者是同一个人或团队,因此前端配置功能也可以归为开发者的一种开发方式。事实上,Odoo官方也将其称为开发者模式(developer mode)。

本节建议大家最好能够了解并掌握这种模式,因为这对于理解Odoo的整体架构是有帮助的。

启用开发者模式

开发者模式的启用在2.5.2节已有介绍,本节还是较为深入地再介绍一下。

在激活开发者模式的时候,可以看到有两个按钮:激活开发者模式和激活开发者模式(assets)。

我们先来介绍下后者,在Odoo中为了加快速度,页面端对JavaScript和CSS资源进行了压缩,这样做的缺点就是不便于前端页面的调试,如果我们选择了激活开发者模式(assets)选项则会加载页面需要的JS和CSS资源,但这会导致页面的浏览速度有所下降。

另外需要说明一下的是,我们未必要使用2.5.2节中介绍的方式去激活开发者模式,我们也可以通过直接修改浏览器的参数来实现这一点。例如:http://serverhost:8060/web#home;我们在浏览器中将其直接改为:http://serverhost:8060/web?debug#home;这样就相当于本页面使用了开发者模式,如果还想同时禁止压缩页面资源,则可以使用assets模式:http://serverhost:8060/web?debug=assets#home。

这些技巧可以帮助开发者提高效率,但是也可能会在跨页面的时候出现一些异常,可以在出现异常后再使用页面设置的方式去激活开发者模式。

我们还需要注意的是,在激活开发者模式以后,页面内会出现两点变化,如图3-1所示。图3-1 激活开发者模式后的设置界面

第一点变化就是菜单栏右上角的用户(Administrator)按钮之前,出现了debug的小臭虫按钮,可以看到其中有很多可以帮助我们调试程序的功能。

第二点就是在设置页面的左侧多了一个技术菜单。其中包括了通过页面进行配置的非常强大的功能,在3.3节我们将详细介绍其具体应用。3.3 开发者模式应用

为了全面了解通过页面进行配置的功能,最好的方式就是我们一起来完成一个功能模块的实现,当然这个模块会非常简单。3.3.1 模块需求简介

我们要完成的这个模块的主要功能是保存课程和教师的记录,应该保存教师和课程的关系数据。教师和课程之间是多对多的关系,一个老师可以进行多门课程的授课,一个课程可以有多个老师授课。3.3.2 向已有模型新增字段

根据需求可以看到,我们需要一个存储教师信息的模型。Odoo系统内提供了大量的模型,系统内人员相关的常用模型就是res.parter,Odoo系统内的客户、供应商、联系人等都继承使用了这个模型。集中继承使用方式可以让我们方便地使用已有的模型。

注意

继承使用会在后面的第6章和第7章中进行详细介绍,本章主要介绍前端操作。

本处需求的教师模型,就可以使用已有的联系人模型。启用开发者模式后,在应用中搜索“联系人”,可以看到如图3-2所示的界面。图3-2 联系人界面

我们选择第一个联系人目录,并且进行安装。根据需求我们需要一个教师模型,所以我们在联系人的模型中新增一个字段来标示是否为教师,这样即使是在前端我们也可以清晰地查看哪些是教师。

接下来,如何在联系人模型中增加字段呢?我们在设置|技术|数据库结构|模型内查找“联系人”模型,可以看到联系人模型的详细信息,包括联系人模型的字段,如图3-3所示。

现在,我们点击左上角的编辑按钮,然后在下面列表的底部点击添加项目,便会弹出创建字段的窗口,如图3-4所示。

我们填入如下信息:

字段名称:x_is_teacher

字段类型:boolean

字段标签:是否教师图3-3 联系人模型界面图3-4 创建字段界面

在前端页面创建字段时,字段名称必须以“x_”开头的,如果在后台创建字段则没有这种限制。

输入完成以上信息之后,点击保存&关闭按钮,此时,我们的字段就已被添加到字段列表中,但在第一个页面我们还无法看到,需要点击右上方的切换箭头来查看最后一页的信息。然后点击左上角的保存按钮,这样模型就被改变了。

目前我们修改了模型,但用户在前端却是看不到这个字段的。我们需要通过单独的视图修改步骤来让用户看到这个新增的字段。

仍然是在这个窗口中,有一个视图选项卡,点击该选项卡可以看到基于这个模型的所有视图。更改或新建一个视图将会立即生效,用户重新加载页面后就可以看到这些改变。

在视图操作中有几点是比较重要的,具体总结如下。

·视图有多种类型,包括表单、树形/列表、搜索(search)或看板。搜索视图实际上就是对顶部可用的过滤器的定义。其他的视图类型之间展示出来的差别可以直观地看出来。树形/列表的显示形式其实都是列表,在具体使用的时候可以用tree也可以用list,之所以这样是因为列表用的是tree。

·在视图列表中,我们可以看到一个模型上可以有多个基本视图定义(基本视图的继承视图字段是空的),包括tree和form,然后其他的视图可以继承基本视图进行扩展,一个扩展视图可以继承多个视图。

在当前的联系人模型(技术名称:res.partner)中可以发现两种基本视图:res.partner.form和res.partner.simplified.form,后文会详细介绍。我们在使用具体的action(可以理解为前台菜单与被点击后进入的视图封装一起的对象)的时候不需要制定具体的名字,只需要制定视图的类型,系统就会自动选择序号小的进行调用,比如前面两个视图都是form,但是默认优先调用序列为1的视图。如果要了解视图的序列号,点击视图进入详细界面即可看到。

如果想根据用户的前端界面查找对应的后台视图信息,那么我们可以使用右上角的调试按钮。现在就来介绍一下其使用方法,具体如下:

1)首先,点击上方的联系人按钮(前面已经安装过),这时可以看到页面显示出了一些联系人的图标。

2)然后,我们随便选择一个联系人,点击打开进入详细界面。

3)第三步,点开右上角的调试按钮,并选择编辑表单视图按钮。

经过如上三步操作,可以看到如图3-5所示的界面。

在该界面中,我们可以看到刚才联系人前端界面对应的后端技术信息,其后端视图名称是res.partner.form。而且我们还可以看到其序列为1,再结合前面的设置|数据库结构|模型界面,可以看到有多个res.partner.form,这也证明了系统确实优先调用序号小的视图。

图3-5下方的结构选项卡中是定义视图的XML数据,我们可以直接修改XML数据以增加我们前面新增的x_is_teacher字段,但是实际项目中千万不要这样做。因为这个视图数据是Odoo自带的模块插件,如果日后我们使用Odoo的最新版本来更新我们的项目,那么这会导致我们所做的修改被覆盖掉。正确的做法是我们应该根据已有的视图来继承扩展自己的视图。

继承需要用到外部ID(External ID),本例的外部ID是base.view_partner_form,外部ID第一个点之前的字符代表模块插件的名称,可以看出,当前的视图属于base模块,关于base模块的详细介绍可以参考3.4节。图3-5 编辑表单视图界面

下面就来介绍视图继承修改的方法,具体如下:

1)首先,我们需要找到一个锚点,然后以锚点为基准定位我们要增加的字段,一般是在锚点之前或之后。我们可以在基本视图结构XML中选取一个带有name属性的元素,一般是选择元素。此处,我们选择元素。

2)现在就来开始具体的动作。还是在联系人的详细信息界面,先后点击调试按钮和编辑表单视图按钮,接下来在新的当前窗口下方的选项卡部分选择继承的视图选项卡,点击列表底部的添加项目,会弹出一个新的窗口,其名称为创建继承于此的视图。

3)然后,在这个窗口中输入以下字段信息:

视图名称:联系人——自定义是否为教师标志

再在结构内添加如下XML代码:1. 2. 3. 4.

其他的重要字段都已经有默认值,比如模型、视图类型、继承视图这几个字段,这些都不需要进行调整,直接点击保存&关闭按钮,保存这个视图然后关闭。此时可刷新页面以查看调整后的结果,如图3-6所示。

如图3-6中的方框所示,在联系人的详细页面内新增了是否老师的复选框,这就证明我们的调整已经成功了。图3-6 视图编辑后的效果图3.3.3 新建菜单

现在,我们已经将联系人继承扩展为教师视图,因为本章的意图是快速浏览Odoo,所以不要细究只增加一个复选框是否够用的问题,我们在此假设只通过复选框区分是否为教师,其他信息还用原来联系人的字段就足够了。

不过就目前的数据而言,很明显展示出来的不都是教师,所以我们想是不是还应该做一个菜单,点击以后仅列出来“是否老师”标志为“True”的信息,以方便使用。

现在看到的系统的顶级菜单中没有教师的授课模块,我们应该先有一个一级菜单,然后在下面的二级菜单中增加一个教师菜单,后续我们还会增加课程菜单。

新建菜单可以在前端页面进行,进入设置|用户界面|菜单项目页面,点击新建按钮并且输入以下信息:

菜单:教师授课

上级菜单:空

动作:空

然后,在界面下方的子菜单选项卡内点击添加项目按钮,然后输入以下信息:

菜单:教师

完整路径:教师授课(默认,不可编辑)

动作:选择ir.actions.act_window,然后在右侧新增的下拉框中选择创建并编辑。在新弹出的窗口中输入以下信息:

  动作名称:教师

  对象:res.partner

将以上的编辑信息全部保存并且关闭。

我们仍然是在浏览器中按F5刷新页面,查看修改是否成功,刷新后的视图如图3-7所示。图3-7 添加菜单后的效果图

从图3-7中可以看到,菜单已添加成功,我们新建的这个菜单是呈树状展示的,而且二级菜单绑定了动作(action),通过这个动作我们定义了点击二级菜单后呈现的视图,动作的名称将作为这个呈现视图的名称。

动作可分为多种类型,最重要的有Window Actions、Reports Actions和Server Actions。Window Actions用于处理在前端展示的视图,Reports Actions用于运行报表,而Server Actions则用于定义自动执行的任务。目前我们重点关注的是Window Actions,这也是最常用的动作类型。

上面我们创建了一个动作,如果想编辑这个动作,可以进入设置|动作界面然后搜索自己新建的动作并编辑,在编辑的页面我们会发现很多字段都没有出现,只有简单的两个字段,这时候选择调试|编辑动作,可以看到跟创建时一样的界面。

上文创建的动作并没有完全满足我们的需求,这个动作列出了所有的联系人,其实需求只需要列出x_is_teacher为True的联系人即可。我们重新进入教师动作的编辑界面,可以看到在动作界面的右下部分有一组筛选的相关设置字段,如图3-8所示。

可以看到,有个域值(domain)字段,该字段的值可以是一个表达式,关于该表达式的用法,本书后面会有具体介绍,此处可直接根据我们的需求写出表达式,如下:1. [('x_is_teacher','=',True)]

我们希望再创建教师时,是否教师复选框是默认选中的。可以使用上下文值(context)字段来完成该功能。context是Odoo传递会话消息的方式,包括默认值的处理。这些也将与domain一样在后文中会有详细介绍,此处只介绍其值采用字典形式存放的情况。图3-8 编辑动作界面

默认值要以default_开始,本处context的表达式为:1. {'default_x_is_teacher':True}

此时我们再到教师授课|教师页面查看,因为联系人模型原来没有是否教师字段,所以查看以前的联系人可发现该值为空值。这时候我们再点击创建按钮进入新建页面,如图3-9所示。图3-9 设置默认选中效果图

从图3-9中可以看到是否老师的复选框默认是选中的,创建完成一个老师以后,再回到教师列表界面,刚创建的信息出现在了列表中,证明操作已成功。3.3.4 新建自定义模型

现在,我们已经有了保存老师数据的模型,还需要保存课程数据的模型,这里仍然按照前面的方法,访问设置|数据库结构|模型页面,然后点击创建按钮并输入如下字段信息:

模型说明:课程

模型:x_course

输入完成后,首先保存这个模型,然后再编辑,可以看到在保存后系统自动为这个模型增加了多个字段,它们是ORM引擎为每个模型都会增加的字段。

可以看到,在字段中有一个x_name(标签为Name)字段,该字段是一条记录的标题,用于快速辨识该条记录代表什么数据,比如本处该字段可以用于存放课程名称,我们可以根据自己的需求编辑该字段并调整标签。

教师与课程之间是many2many(many-to-many)的关系,我们可以在课程模型中点击新增项目按钮并输入如下字段信息:

字段名称:x_teacher_ids

字段类型:从下拉列表中选择多对多

字段标签:教师

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载