Odoo 8.0深入浅出开发教程(十) 附录

13 附录

13.1 Odoo里老的API

_name 点号记法 对应具体SQL表名 _columns {

} 表述SQL表头

_defaults 字典值 描述默认值

_inherit

_inherits 委托继承

13.2 PostgreSQL数据库命令行操作

13.2.1 命令行数据库备份

 
    

13.3 反向代理(reverse proxy)

反向代理如下图所示【图片来自wiki】

Figure 31: 反向代理

其之所以叫做反向是相对于我们常见的代理软件而言的,软件叫做前向代理,其代理是给客户端用的,而反向代理具体是给服务器端用的。反向代理的用途有加密,安全,缓存,压缩负载均衡等等。有名的Apache软件就是一个反向代理软件,此外还有ngnix软件也是一个不错的反向代理软件。

13.3.1 安装ngnix软件

13.3.1.1 释放http默认端口号

http的默认端口号是80,这不应该被占用,可使用curl命令检测之。

其应该返回连接不上的错误:

$ curl http://localhost
curl: (7) Failed to connect to localhost port 80

如果有响应,则需要将对应的服务停用掉。然后再安装ngnix软件。

在ubuntu下安装ngnix软件很简单,使用apt-get安装即可:

sudo apt-get install ngnix

安装完了之后再 curl http://localhost 应该返回ngnix的一些信息了。

然后人们一般把默认的配置文件给删除了:

sudo rm /etc/nginx/sites-enabled/default

在 /etc/nginx/available-sites/ 编写可用网站的配置文件,如果想具体使用该网站的配置文件,就创建一个符号连接到目录 /etc/nginx/enabled-sites/ 。

具体创建一个odoo的配置文件如下:

sudo touch /etc/nginx/sites-available/odoo
sudo ln -s /etc/nginx/sites-available/odoo /etc/nginx/sites-enabled/odoo

然后开始编辑配置avilable-sites文件夹下的那个odoo文件。初步将文件修改如下:

upstream backend-odoo {
    server 127.0.0.1:8069;
}

server {
    location / {
        proxy_pass http://backend-odoo;
    }
}

这里upstream 可看作上传流,名字,然后具体对应的端口号。然后服务器server的location应该是入口点,然后proxy_pass这里的http://backend-odoo 应该就具体对应前面upstream的那个backend-odoo。具体细节后面再慢慢了解。

然后执行:

sudo nginx -t

来测试下nginx是否工作正常,正常的话再重启下nginx服务。

sudo /etc/init.d/nginx reload

然后进入浏览器输入localhost,我们已经能够正常登入odoo了。

13.3.2 强制https连接

13.3.3 nginx优化

13.3.4 轮询机制

13.4 跟踪项目源码初始化进程

首先我们看到odoo.py的main函数,正常的输入 ./odoo.py 前面的if语句都没有执行,直接跳转到openerp.cli.main() 那里。

然后接下来执行一个 openerp.cli.server.Server 对象,并调用这个对象的run方法,继而执行cli文件夹下server.py的main函数,然后args参数也传递过来了(比如 ['--addons-path=addons,myaddons'])。

接下来执行 check_root_user 函数,检查当前用户是不是root用户,如果是这样很不安全,程序终止。

首先是初始化这个对象,在openerp.tools的config.py文件中,初始化class configmanager 。一些基本的参数设置和命令行选项帮助信息等的设置。接下来处理传递过来的参数openerp.tools.config.parse_config(args) ,实际的刷参数和设置参数。

然后是 check_postgres_user 检查数据库用户是不是 postgres,如果是太过于危险,程序退出。

然后是 report_configuration 报告配置情况。

配置初始化之后,根据配置进行了一些基本的抉择,然后执行 setup_pid_file 函数,为进程创建一个文件,还不太懂。

然后是这个:

rc = openerp.service.server.start(preload=preload, stop=stop)

具体是openerp的service文件夹的server.py的start函数,参数我们假设这里都是默认值None,这个函数就是启动openerp的http服务器和cron处理器。

server这个服务器变量被定义为了一个全局变量,然后开始执行 load_server_wide_modules 这个函数,

然后接下来是:

INFO:root:now i am load the module web
INFO:root:now i am load the module web_kanban

通过调用openerp→modules文件夹下的module.py的 load_openerp_module 函数来加载某个模块。

这是避免重复加载:

global loaded
if module_name in loaded:
    return

接下来就是具体处理模块的路径问题,这里有些细节先略过,然后就是将其作为一个python模块加载进来,然后读取模块的基本信息。

作为python模块大家都清楚必须要有 __init__.py 文件,然后模块的基本信息是写在__openerp__.py 文件里面的。然后模块那边还有很多细节问题,比如 __init__.py 里面一般有

import controllers

也就是本文件夹下应该有个 controllers.py 文件,其内代码将被加载或说被执行。 然后__openerp__.py 里面描述了包的依赖,从其中我们可以看到,它们都依赖于openerp→addons里面的base 模块,这个base模块里面的细节也需要详细讨论。这些细节在这里我们先略过。现在假设web和web_kanban这两个模块都加载好了。

if openerp.evented:
    server = GeventServer(openerp.service.wsgi_server.application)
elif config['workers']:
    server = PreforkServer(openerp.service.wsgi_server.application)
else:
    server = ThreadedServer(openerp.service.wsgi_server.application)

我们再看到openerp→service的 wsgi_server.py 文件的application函数。

假设没设置代理的话,其对应的是 application_unproxied(environ, start_response) 这就是WSGI接口层的一些东西,这里的细节先略过,其中还进行了线程封装等等,然后就是:

rc = server.run(preload, stop)

就是具体开始运行服务器了。至此程序进入和用户交互的环节了。

在服务器进入和用户交互之后,如果你输入 127.0.0.1:8069 ,程序要处理两个handler:

2015-05-11 08:40:16,875 6807 INFO ? root: i found the handler  
2015-05-11 08:40:16,876 6807 INFO ? root: i found the handler 

第一个是wsgi_xmlrpc,第二个就是openerp.http.Root的一个实例。其中第一个我估计和具体xml rpc通信有关,然后第二个就是具体刷新根目录需要做的工作。然后我们看到

2015-05-11 08:40:17,011 6807 INFO ? openerp.addons.bus.bus: Bus.loop listen imbus on db postgres
2015-05-11 08:40:17,246 6807 INFO ? openerp.addons.report.models.report: You need Wkhtmltopdf to print a pdf version of the reports.
2015-05-11 08:40:17,329 6807 INFO ? openerp.http: HTTP Configuring static files
2015-05-11 08:40:17,336 6807 INFO odoo openerp.modules.loading: loading 1 modules...
2015-05-11 08:40:17,344 6807 INFO odoo openerp.modules.loading: 1 modules loaded in 0.01s, 0 queries
2015-05-11 08:40:17,361 6807 INFO odoo openerp.modules.loading: loading 47 modules...
2015-05-11 08:40:17,443 6807 INFO odoo openerp.modules.loading: 47 modules loaded in 0.08s, 0 queries
2015-05-11 08:40:18,040 6807 INFO odoo openerp.modules.loading: Modules loaded.
2015-05-11 08:40:18,041 6807 INFO odoo openerp.addons.base.ir.ir_http: Generating routing map
2015-05-11 08:40:18,643 6807 INFO odoo werkzeug: 127.0.0.1 - - [11/May/2015 08:40:18] "GET / HTTP/1.1" 200 -

程序一是建立和数据库的连接,然后进行HTTP的相关配置,然后加载模块,然后是生成寻址map,然后就是通过werkzeug进行WSGI通信,GET /。后面的内容就会更加琐碎了,就是具体什么路径什么模块,什么WSGI通信和响应等等了。这一块我们先暂时略过,先看看web和web_kanban这两个模块。这两个模块在服务器还没有启动之前就加载了,所以是些什么内容呢?然后还有base模块肯定也已经加载进去了。

13.4.1 base模块

因为其他所有的模块都依赖于base模块,所以base模块的一些内容会被其他模块调用,比如在web的controllers下的main.py中就有这样的导入语句:

from openerp.addons.base.ir.ir_qweb import AssetsBundle, QWebTemplateNotFound

这个 openerp.addons.base.ir 里面有很多py文件,要了解起来是要花费一定的时间的,这个ir_qweb.py看起来和QWEB模板系统有关。然后还有其他很多内容。。

13.4.2 web模块

随便翻翻web模块的controllers文件夹下的main.py文件,其主要和数据库管理页面还有登录页面有关。

13.4.3 web_kanban模块

这个模块没什么python代码,似乎就是前面web模块的一些数据补充?

13.5 配置会计科目

13.5.1 配置会计科目类型

看到会计→设置→科目→科目类型。

新建下面四项:

类型 编码 P&L/BS分类 结转方式
视图 视图 / 不结转(None)
收入 收入 损益表(收益)[Profit & Loss (Income Accounts)] 结转未核销往来明细(unreconciled)
支出 支出 损益表(费用)[Profit & Loss (Expense Accounts)] 结转未核销往来明细(unreconciled)
现金 现金 资产负债表(资产)[Balance Sheet (Assets Accounts)] 结转余额(Balance)

这里的P&L/BS分类还有一个Balance sheet(Liability account) 中文翻译是负债和权益类,觉得应该翻译为 资产负债表(负债) ,以后核实之后再说。

然后结转方式,参考了 这个网页 ,中文翻译一眼看过去估计只有那些专业人员才看得懂。

  1. None 原翻译是不结转, 我觉得应该翻译为无 ,意思是年末结转的时候不会考虑这个类型的科目。
  2. balance 翻译为结转余额 ,还行吧,意思是年末结转时会将这个科目的余额转为下年的期初余额。
  3. details 翻译为结转所有往来明细,还行,。意思是年末结转时会把该科目的凭证行逐行转入下年。
  4. unreconciled 翻译为结转未核销往来明细,意思是年末结帐时会把该科目未对账的凭证行逐行转入下年。可简单翻译为未对账。

13.5.2 配置会计科目

看到会计→设置→科目→科目。

需要会计科目来处理未付款的销售订单和采购订单,货物的收发两个以上,资金的收付款一个。还有一个 组织 科目视图。所以需要如下6个会计科目。

名称 code 内部类型 上级科目 账户类型 对账
最小的图 0 视图   视图 未选中
应付 AP 应付 最小的图 应付 已检查
应收 AR 应收 最小的图 应收 已检查
现金 C 流动资金 最小的图 现金 未选中
采购 P 常规科目 最小的图 支出 未选中
销售 S 常规科目 最小的图 收入 未选中

13.6 分录

这个分录也就是所谓的Journals 日记帐。在会计→设置→分录→分录那里。

新建下面三个条目:

日记账名称 code 类型 对象实体序列 默认借方科目 默认贷方科目
采购日记账 PUJ 采购 采购日记账(Purchase Journal) P购买 P购买
销售日记账 SAJ 销售 账户默认销售日志(Account Default Sales Journal) S 卖出 S 卖出
银行日记账 BNK 现金 账户日记(Account Journal) C 现金 C现金

13.7 新建业务伙伴

13.7.1 新建业务伙伴标签

在销售→设置→地址薄→合作伙伴标签那里。

新建两个业务伙伴标签: 供应商 和 客户。

13.7.2 新建客户

在销售→销售→客户那里。

点击创建来新建一个客户:

13.8 创建新的产品

在仓库→产品→产品那里或者销售→产品→产品那里可以创建新的产品。

在需求→cost price 那里输入成本价;在标价那里输入销售价。

13.9 设置会计年度

在会计→设置→会计期间→会计年度那里。

设置好一年之后可以点击创建季度从而自动生成几个季度的会计期间。

13.10 向供应商下单

在采购→采购→询价单那里。

新建一个询价单。

13.11 会计学入门

会计系统反映了企业的两个基本方面: 自己有什么和欠别人什么。资产(assert)是企业拥有或控制的能够给企业带来未来经济效益的资源。例如: 现金,物料,设备和土地等。负债(liabilities)是企业欠非其所有者(债权人)的债务,未来需要用现金、产品或服务来偿还。权益(equity)是指企业所有人对企业资产所享有的求偿权。

总的来说有:

资产 = 负债 + 所有者权益

负债已经放在所有者权益前面,因为负债应该先被满足。此外还有一个扩展的会计公式:

资产 = 负债 + 所有者名下的资本 - 所有者提取 + 收入 - 费用

其中收入减去费用的部分便是净利润(net income),如果费用大于收入,则会产生净损失(net loss)。

常见的经济业务:

  • 所有者投资 谁成立了一家公司,然后以该公司的名义存了多少钱,创始人的这笔钱叫做所有者投资,属于前面的所有者权益中的所有者名下的资本。
  • 用现金采购物料 这是将公司的现金资产转变成为另一种资产(物料),这项经济业务仅仅改变了资产形式。
  • 用现金购买设备 这和上面类似,也仅仅改变了资产形式,公司资本总数量还是没变。
  • 赊购物料 公司资产增加,赊的钱属于公司的负债。
  • 提供服务赚取现金 资产现金部分增加,右边属于收入增加。
  • 用现金支付费用 资产现金部分减少,右边费用增加,然后减去。
  • 用赊销的方式提供服务或出租设备 左边资产应收款项部分增加,右边收入部分增加。
  • 应收账款变现 左边资产由应收款变为现金,右边没有变化。
  • 支付应付款项 应付款项在左边属于现金减少,在右边属于负债减少。
  • 所有者提取现金 在左边资产现金减少,右边所有者权益减少。

13.11.1 财务报表

利润表 所有者权益表 资产负债表 现金流量表

13.11.2 原始凭证

原始凭证可以是纸质的也可以是电子版的,主要有: 销售发票,支票,订货单,供货商签发的账单,员工收入记录,银行对账单等。

13.11.3 账户

资产类账户 = 负债类账户 + 所有者权益账户

13.11.3.1 资产类账户

资产是指企业拥有或控制的预计在未来能够给企业带来一定的经济效益的资源。大多数会计系统都包含以下账户:

  • 现金账户(cash) 反映企业的现金金额,现金的增减变动情况都要记录在现金账户中。
  • 应收款项(account receivable) 是指卖方持有的买房对卖方的付款承诺。
  • 应收票据(note receivable) 也称为期票,是一种书面承诺,承诺在未来某个特定时间还款。
  • 预付款项(prepaid accounts) 代表着提前支付的未来费用。
  • 物料(supplies) 在被使用完之前属于资产,使用完之后成本将被记入费用账户。
  • 设备(equipment) 也是一项资产,随着设备的使用和耗费,其成本将一点点列为费用,这种费用成为折旧。
  • 建筑物(buildings)
  • 土地(land)
13.11.3.2 负债类账户

比较常见的负债类账户有:

  • 应付款项(account payable) 口头的或暗含以后要付款的承诺。
  • 应付票据(note payable) 较为正式的未来付款承诺。
  • 预收账款(unearned revenues) 未来企业提供产品或劳务才能清偿的负债。
  • 应计负债(accrued liabilities) 企业所欠的尚未偿还的负债。
13.11.3.3 所有者权益账户

按照前面提及的扩展会计公式,所有者权益账户分为: 所有者名下资本,所有者提取,收入和费用。

13.11.4 分类帐

信息系统中所有账户的集合叫做分类帐。

13.11.5 会计科目表

企业所使用的所有账户名称及其编号的列表叫做会计科目表。

具体编号中的科目号有国标的规定,然后子目号有的省市有规定,如果没有则自己内定。 比如按照 这个网页 的介绍,资产类编号首位科目号是1,负债是2,所有者权益是3等等。

13.11.6 报告期间

比如有年度财务报表,报告期为一年的会计报告,或者还有一个月,一季度等中期财务报告。

13.12 参考资料

  1. wiki 商业智能 wiki ERP
  2. ERP不花钱, 作者: 老肖(OSCG), 版本: 1.0 .
  3. 开源智造编写的用户手册
  4. Odoo Development Essentials , author: Daniel Reis , date: April 2015
  5. OpenERP v7 官方文档
  6. Odoo new API guideline Documentation , author: Nicolas Bessi , date: April 13, 2015 .
  7. OpenERP 应用和开发基础 , 作者: 老肖 , 版本: 0.2 .
  8. 会计学原理 第19版 作者: John J.Wild , Ken W. Shaw 等. 崔学刚译, 中国人民大学出版社.

你可能感兴趣的:(Tutorial教程,Python,Odoo&OpenERP,Odoo,8.0深入浅出开发教程)