_name 点号记法 对应具体SQL表名 _columns {
} 表述SQL表头
_defaults 字典值 描述默认值
_inherit
_inherits 委托继承
反向代理如下图所示【图片来自wiki】
Figure 31: 反向代理
其之所以叫做反向是相对于我们常见的代理软件而言的,软件叫做前向代理,其代理是给客户端用的,而反向代理具体是给服务器端用的。反向代理的用途有加密,安全,缓存,压缩负载均衡等等。有名的Apache软件就是一个反向代理软件,此外还有ngnix软件也是一个不错的反向代理软件。
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了。
首先我们看到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 handler2015-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模块肯定也已经加载进去了。
因为其他所有的模块都依赖于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模板系统有关。然后还有其他很多内容。。
随便翻翻web模块的controllers文件夹下的main.py文件,其主要和数据库管理页面还有登录页面有关。
这个模块没什么python代码,似乎就是前面web模块的一些数据补充?
看到会计→设置→科目→科目类型。
新建下面四项:
类型 | 编码 | 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) 中文翻译是负债和权益类,觉得应该翻译为 资产负债表(负债) ,以后核实之后再说。
然后结转方式,参考了 这个网页 ,中文翻译一眼看过去估计只有那些专业人员才看得懂。
看到会计→设置→科目→科目。
需要会计科目来处理未付款的销售订单和采购订单,货物的收发两个以上,资金的收付款一个。还有一个 组织 科目视图。所以需要如下6个会计科目。
名称 | code | 内部类型 | 上级科目 | 账户类型 | 对账 |
---|---|---|---|---|---|
最小的图 | 0 | 视图 | 视图 | 未选中 | |
应付 | AP | 应付 | 最小的图 | 应付 | 已检查 |
应收 | AR | 应收 | 最小的图 | 应收 | 已检查 |
现金 | C | 流动资金 | 最小的图 | 现金 | 未选中 |
采购 | P | 常规科目 | 最小的图 | 支出 | 未选中 |
销售 | S | 常规科目 | 最小的图 | 收入 | 未选中 |
这个分录也就是所谓的Journals 日记帐。在会计→设置→分录→分录那里。
新建下面三个条目:
日记账名称 | code | 类型 | 对象实体序列 | 默认借方科目 | 默认贷方科目 |
---|---|---|---|---|---|
采购日记账 | PUJ | 采购 | 采购日记账(Purchase Journal) | P购买 | P购买 |
销售日记账 | SAJ | 销售 | 账户默认销售日志(Account Default Sales Journal) | S 卖出 | S 卖出 |
银行日记账 | BNK | 现金 | 账户日记(Account Journal) | C 现金 | C现金 |
在销售→设置→地址薄→合作伙伴标签那里。
新建两个业务伙伴标签: 供应商 和 客户。
在销售→销售→客户那里。
点击创建来新建一个客户:
在仓库→产品→产品那里或者销售→产品→产品那里可以创建新的产品。
在需求→cost price 那里输入成本价;在标价那里输入销售价。
在会计→设置→会计期间→会计年度那里。
设置好一年之后可以点击创建季度从而自动生成几个季度的会计期间。
在采购→采购→询价单那里。
新建一个询价单。
会计系统反映了企业的两个基本方面: 自己有什么和欠别人什么。资产(assert)是企业拥有或控制的能够给企业带来未来经济效益的资源。例如: 现金,物料,设备和土地等。负债(liabilities)是企业欠非其所有者(债权人)的债务,未来需要用现金、产品或服务来偿还。权益(equity)是指企业所有人对企业资产所享有的求偿权。
总的来说有:
资产 = 负债 + 所有者权益
负债已经放在所有者权益前面,因为负债应该先被满足。此外还有一个扩展的会计公式:
资产 = 负债 + 所有者名下的资本 - 所有者提取 + 收入 - 费用
其中收入减去费用的部分便是净利润(net income),如果费用大于收入,则会产生净损失(net loss)。
常见的经济业务:
利润表 所有者权益表 资产负债表 现金流量表
原始凭证可以是纸质的也可以是电子版的,主要有: 销售发票,支票,订货单,供货商签发的账单,员工收入记录,银行对账单等。
资产类账户 = 负债类账户 + 所有者权益账户
资产是指企业拥有或控制的预计在未来能够给企业带来一定的经济效益的资源。大多数会计系统都包含以下账户:
比较常见的负债类账户有:
按照前面提及的扩展会计公式,所有者权益账户分为: 所有者名下资本,所有者提取,收入和费用。
信息系统中所有账户的集合叫做分类帐。
企业所使用的所有账户名称及其编号的列表叫做会计科目表。
具体编号中的科目号有国标的规定,然后子目号有的省市有规定,如果没有则自己内定。 比如按照 这个网页 的介绍,资产类编号首位科目号是1,负债是2,所有者权益是3等等。
比如有年度财务报表,报告期为一年的会计报告,或者还有一个月,一季度等中期财务报告。