分类 [ 开源APP ] 下的全部文章

目录

1.      概述

2.      安装ubuntu操作系统

3.      安装jdk

4.      安装odoo

5.      安装pgAdmin

6.      准备odoo源代码

7.      安装pycharm

8.      调试odoo后端python代码

§8.1  进入odoo.py的shell命令模式(odoo v9才有)

§8.2 服务启动过程跟踪

§8.3 跟踪后端网页动作

§8.4 调试模块

9.       调试odoo前端js代码

§9.1 安装和配置chrome浏览器

§9.2 配置goagent翻墙工具

§9.3 调试前端js脚本

10.       防火墙配置

 

 

1.     概述

Pycharm是一个全功的的python和Web开发集成工具,支持Django、Flask、Google App Engine、Pyramid、web2py框架和JavaScript、CoffeeScript、TypeScript、CSS、Cython和模板语言等,以及数据库和SQL, UML & SQLAlchemy Diagrams。而且能实现远程开发和调试。本人曾经尝试在windows搭建,但是安装python的各种软件包时问题很多,最后在Linux操作系统上成功完成。

本文件讲述如何在ubuntu 14.04操作系统上搭建odoo的调试开发环境,我们采用如下的软件:

⑴、VMware-workstation-full-11,                             可从http://www.vmware.com/products/workstation/workstation-evaluation下载使用版,然后去网上搜索密钥产生器,或者采用个序列号:VA7HH-44W0Q-0818Y-RYZEV-WVRGA

⑵、ubuntu-14.10-desktop-i386,      可从http://mirrors.aliyun.com/ubuntu-releases/14.10/ubuntu-14.10-desktop-i386.iso下载。

⑶、jdk-8u40-linux-i586.tar.gz,采用命令下载:wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u40-b25/jdk-8u40-linux-i586.tar.gz

⑷、chrome最新版浏览器,可从https://dl.google.com/linux/direct/google-chrome-stable_current_i386.deb下载。

⑸、开发调试工具pycharm-professional,                     可从https://www.jetbrains.com/pycharm/download/下载Linux版本的。

⑹、翻墙工具goagent,可从https://github.com/goagent/goagent下载,此网站上有详细的安装配置文档。

⑺、odoo最新源代码,可从https://github.com/odoo/odoo/archive/8.0.zip下载。

⑻、odoo_8.0.latest_all.deb,可从https://www.odoo.com/page/download下载最新版。

 

2.     安装ubuntu操作系统

 

首先在windows上安装VMWare workstation 11,然后再创建虚拟机,给2GB内存,桥接网卡,20GB硬盘即可。

安装ubuntu 32位的桌面版,版本号是11.10,选择中文语言、重庆时区,并创建普通用户moodisk,机器取名为OdooDev。安装完后重启进入图形桌面,打开终端窗口,输入命令做如下配置:

⑴、切换到超级用户:

moodisk@OdooDev:~$ sudo -s

⑵、把系统升级到最新:

root@OdooDev:~# sed -i ‘s|cn.archive.ubuntu.com|mirrors.aliyun.com|g’ /etc/apt/sources.list

root@OdooDev:~# apt-get update -y && apt-get upgrade -y

⑶、允许root登陆:

root@OdooDev:~# passwd root

root@OdooDev:~# echo “greeter-show-manual-login=true” >> /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf

root@OdooDev:~# reboot

重启之后采用root用户登陆图形桌面,打开一个终端窗口。

⑷、安装vmware tools:

点击VMware虚拟机管理软件的菜单“虚拟机à安装VMware Tools(T)…”,这样就在虚拟机里挂载了虚拟光盘,在终端里输入如下命令安装VMware Tools:

root@OdooDev:~# tar -zxf /media/root/VMware\ Tools/VMwareTools-9.9.2-2496486.tar.gz -C /tmp

root@OdooDev:~# cd /tmp/vmware-tools-distrib

root@OdooDev:~# ./ vmware-install.pl

此后一路按回车键即可,安装完了再次重启,此后的图形桌面充满整个屏幕。

⑸、安装一些必要的软件:

root@OdooDev:~# apt-get -y install vim openssh-server

root@OdooDev:~# vim /etc/ssh/sshd_config

把PermitRootLogin参数的值改成yes

⑹、配置网卡:

root@OdooDev:~# vim /etc/network/interfaces

# interfaces(5) file used by ifup(8) and ifdown(8)

auto lo

iface lo inet loopback

auto eth0

iface eth0 inet static

address 192.168.0.12

netmask 255.255.252.0

gateway 192.168.0.1

dns-nameservers 8.8.8.8 8.8.4.4

root@OdooDev:~# reboot

Ubuntu 14.04自带的图形桌面不好看且不好用,建议更换成经典的gnome桌面,采用如下命令安装:

root@OdooDev:~# apt-get -y install gnome-session-fallback

重启系统后在图形登陆画面参见如下图操作:

 

把上面提到的软件下载到目录/root/install_softwares下,为以下各步做好准备。不过建议采用如下的命令直接安装gnome桌面:

tasksel -y install ubuntu-gnome-desktop

 

3.     安装jdk

root@OdooDev:~# cd install_softwares

root@OdooDev:~/install_softwares# tar -zxf jdk-8u40-linux-i586.tar.gz -C /opt/

root@OdooDev:~/install_softwares# cd /opt/jdk1.8.0_40/

root@OdooDev:/opt/jdk1.8.0_40# ln -s /usr/bin/update-alternatives /usr/sbin/alternatives

由于后续的一些软件安装时要用到命令alternatives,在ubuntu下此命令被命名为update-alternatives。

root@OdooDev:/opt/jdk1.8.0_40# alternatives --install /usr/bin/java java /opt/jdk1.8.0_40/bin/java 2

root@OdooDev:/opt/jdk1.8.0_40# alternatives --config java

There are 3 programs which provide 'java'.

Selection    Command

-----------------------------------------------

*  1           /opt/jdk1.8.0/bin/java

+ 2           /opt/jdk1.8.0_25/bin/java

3           /opt/jdk1.8.0_40/bin/java

 

Enter to keep the current selection[+], or type selection number: 3

 

root@OdooDev:/opt/jdk1.8.0_40# alternatives --install /usr/bin/jar jar /opt/jdk1.8.0_40/bin/jar 2

root@OdooDev:/opt/jdk1.8.0_40# alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_40/bin/javac 2

root@OdooDev:/opt/jdk1.8.0_40# alternatives --set jar /opt/jdk1.8.0_40/bin/jar

root@OdooDev:/opt/jdk1.8.0_40# alternatives --set javac /opt/jdk1.8.0_40/bin/javac

root@OdooDev:/opt/jdk1.8.0_40# cd

root@OdooDev:~# java -version

java version "1.8.0_40"

Java(TM) SE Runtime Environment (build 1.8.0_40-b25)

Java HotSpot(TM) Server VM (build 25.40-b25, mixed mode)

验证版本。

root@OdooDev:~# cat >$HOME/.bash_profile <<E”O”F

export JAVA_HOME=/opt/jdk1.8.0_40

export JRE_HOME=/opt/jdk1.8.0_40/jre

export PATH=$PATH:/opt/jdk1.8.0_40/bin:/opt/jdk1.8.0_40/jre/bin

EOF

这个命令就是设置三个环境变量JAVA_HOME、JRE_HOME、PATH。重启系统。

 

4.     安装odoo

安装一个生产环境的odoo,以便与调试环境的odoo做比较。先安装postgresql 9.4。

root@OdooDev:~# sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" >> /etc/apt/sources.list.d/pgdg.list'

root@OdooDev:~# wget -q https://www.postgresql.org/media/keys/ACCC4CF8.asc -O - | apt-key add -

root@OdooDev:~# apt-get update

root@OdooDev:~# apt-get install -y postgresql-contrib-9.4 postgresql-9.4

root@OdooDev:~# cd $HOME/install_softwares

root@OdooDev:~/install_softwares# dpkg -i odoo_8.0.latest_all.deb

会报错,因为缺少很多依赖软件包,别怕,我们再执行下面的命令安装这些软件包。

root@OdooDev:~/install_softwares# apt-get -f install

下面安装最新版的wkhtmltopdf,这是odoo 8打印报表时要求的。

root@OdooDev:~/install_softwares# wget http://download.gna.org/wkhtmltopdf/0.12/0.12.2.1/wkhtmltox-0.12.2.1_linux-trusty-i386.deb

如果是64位操作系统,那么下载wkhtmltox-0.12.2.1_linux-trusty-amd64.deb

root@OdooDev:~/install_softwares# dpkg -i wkhtmltox-0.12.2.1_linux-trusty-i386.deb

会报缺少依赖的文件包,再执行下面的命令即可安装这些包:

root@OdooDev:~/install_softwares# apt-get -f install

root@OdooDev:~/install_softwares# wget http://downloads.sourceforge.net/project/wkhtmltopdf/0.12.2.1/wkhtmltox-0.12.2.1_linux-trusty-i386.deb

root@OdooDev:~/install_softwares# update-rc.d odoo disable

odoo的主要文件被安装在目录/usr/lib/python2.7/dist-packages/openerp/下,启动脚本文件/etc/init.d/odoo,配置文件/etc/odoo/openerp-server.conf,创建的数据库用户和操作系统用户都是odoo。操作系统用户odoo用于启动odoo服务,所以为了加快网站前段的访问速度,需要把/usr/lib/python2.7/dist-packages/openerp的主人改为odoo,这样第一次访问的*.py文件就会编译成*.pyc程序,此后访问时速度就会明显加快,使用如下命令修改:

root@OdooDev:~/install_softwares# chown -R odoo: /usr/lib/python2.7/dist-packages/openerp

为了支持在线通信,还需要安装额外一些软件:

root@OdooDev:~/install_softwares# apt-get -y install python-pip python-gevent python-coverage python-coverage-dbg ttf-wqy-microhei ttf-wqy-zenhei

root@OdooDev:~/install_softwares# pip install psycogreen

为了支持我购买的功能强大的odoo website在线开发主题包theme_clean(可以在这里购买:https://www.odoo.com/apps/themes),还需要安装另外一些软件:

root@OdooDev:~/install_softwares# wget -qO- https://deb.nodesource.com/setup | bash -

root@OdooDev:~/install_softwares# apt-get install -y nodejs

root@OdooDev:~/install_softwares# npm install -g less less-plugin-clean-css

把theme_clean主题包拷贝到odoo的addons目录:

root@OdooDev:~/install_softwares# tar -xjf theme_clean.tar.bz2

root@OdooDev:~/install_softwares# cp -r theme/* /usr/lib/python2.7/dist-packages/openerp/addons/

root@OdooDev:~/install_softwares# chown -R odoo: /usr/lib/python2.7/dist-packages/openerp

通过下面命令修改数据库用户odoo的密码为123456:

root@OdooDev:~/install_softwares# su - postgres

postgres@OdooDev:~$ psql -c “alter user odoo with password ‘123456’;”

postgres@OdooDev:~$ exit

修改odoo的配置文件

root@OdooDev:~# vim /etc/odoo/openerp-server.conf

[options]

addons_path = /usr/lib/python2.7/dist-packages/openerp/addons

admin_passwd = A1B2C3

data_dir = /var/lib/odoo/.local/share/odoo

db_host = localhost

db_template = template1

db_user = odoo

db_password = 123456

dbfilter = %d_db

lang = zh_CN

list_db = False

logfile = /var/log/odoo/odoo-server.log

timezone = Asia/Shanghai

workers = 2

xmlrpc_interface = 192.168.0.12

xmlrpc_port = 8069

 

以上一些重要参数说明如下:

⑴  admin_passwd = A1B2C3:odoo超级管理员的密码修改为A1B2C3,安装完的默认密码是admin。

⑵  db_user = odoo,db_password = 123456:odoo后端连接数据库的用户名和密码。

⑶  dbfilter = %d_db:根据前段访问odoo的域名来自动选择套帐,其中%d代表域名,比如用户通过www.weisuan.com访问odoo,那么选择的套帐就是weisuan_db,同理通过www.moodisk.com访问,那么选择的套帐就是moodisk_db了。此参数配合list_db = False,在odoo的登陆界面不会出现选择套帐的列表,这样就能轻松实现SaaS部署odoo了。当然也可以通过http://www.moodisk.com:8069/web/database/selector和http://www.moodisk.com:8069/web/database/manager来手工选择套帐或管理套帐。

⑷  workers = 2:odoo服务在启动的时候产生多个服务子进程,子进程的个数是这样计算的:4+n,假如参数定义workers=n。其中有一个子进程执行/usr/bin/openerp-gevent程序,专门用于实现在线聊天的功能,其他的子进程都是执行/usr/bin/odoo.py。如果屏蔽了workers参数,那么就只有与一个odoo服务进程,没有openerp-gevent进程,所以不能在线聊天了,除非直接启动openerp-gevent服务进程,此进程同时也支持ERP业务操作。注意:odoo8如果要打印报表,workers的值必须大于或等于2。

⑸  xmlrpc_port = 8069:定义端口,由于启动odoo服务的用户是普通odoo用户,所以端口不能改成小于1024的端口号,1~1024的端口只有超级用户权限才允许监听。那么到底如何让odoo监听80端口呢?方法有两种:

①  利用iptables做端口转发,具体参见后面的防火墙部分,或者在/etc/rc.local的exit 0之前加入下面一行。

/sbin/iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8069

②  以root用户运行odoo服务:修改odoo配置文件/etc/odoo/openerp-server.conf,加入参数定义“xmlrpc_port = 80”;修改文件/usr/lib/python2.7/dist-packages/openerp/cli/server.py,在def check_root_user():行之下加入return;修改/etc/init.d/odoo,把里面的“USER=odoo”改为“USER=root”。

⑹  的

 

5.     安装pgAdmin

pgAdmin是图形化的postgresql数据库管理工具,为了便于操作数据库,建议安装它。

root@OdooDev:~# apt-get -y install pgadmin3

点击操作系统的菜单“应用程序à编程àpgAdmin III”启动pgAdmin,见下图:

 

6.     准备odoo源代码

root@OdooDev:~# unzip odoo-8.0.zip

root@OdooDev:~# cd odoo-8.0

root@OdooDev:~/odoo-8.0# cp /etc/odoo/openerp-server.conf ./

然后修改openerp-server.conf成如下所示的内容:

[options]

;addons_path = /usr/lib/python2.7/dist-packages/openerp/addons

admin_passwd = A1B2C3

;data_dir = /var/lib/odoo/.local/share/odoo

db_host = localhost

db_template = template1

db_user = odoo

db_password = 123456

dbfilter = %d_db

lang = zh_CN

list_db = False

;logfile = /var/log/odoo/odoo-server.log

timezone = Asia/Shanghai

;workers = 2

xmlrpc_interface = 192.168.0.12

xmlrpc_port = 8069

 

行首是“;”的为注释。修改openerp/cli/server.py,在def check_root_user():行之下加入return,这样root用户也能运行odoo服务了。参照之前的内容把theme_clean主题拷贝到$HOME/odoo-8.0/addons下。

源码根目录下有一个文件requirements.txt,里面包含了所依赖的软件包,采用下面的命令安装这些依赖包:

root@OdooDev:~/odoo-8.0# pip install -r requirements.txt

 

7.     安装pycharm

登陆Linux图形桌面并且打开一个终端窗口:

执行如下命令:

root@OdooDev:~/odoo-8.0# cd $HOME/install_softwares

root@OdooDev:~/install_softwares# tar -zxf pycharm-professional-4.0.5.tar.gz -C ../

root@OdooDev:~/install_softwares# cd ../pycharm-4.0.5/bin/

root@OdooDev:~/pycharm-4.0.5/bin# ./pycharm.sh

 

 

下面开始导入odoo的源代码,指定其目录即可。

 

点击上图中右上角的“Configure Python Interpreter”,配置python解释器为python2.7,然后pycharm根据python2.7建立索引,几分钟后出现如下的界面:

点击右上角的“Install requirements”安装依赖的python插件,安装过程很可能报错。配置openerp-server的启动参数,见下图:

 

 

如下图所示定义数据源:

      

下面的图直接点击“OK”。

 

到此,pycharm安装完毕,并且导入了odoo工程项目,以后启动pycharm的方法是:操作系统菜单“应用程序à编程àPycharm”。

最后我们来汉化pycharm,从这里http://yunpan.cn/cZML53YDGHskx(访问密码 03a4)下载,汉化的官方网站是https://github.com/Jythoner/pycharm。解压之后把resources_zh_CN.jar拷贝到pycharm安装目录下的lib目录下,重启pycharm即可。

 

快捷键:

 

8.     调试odoo后端python代码

在调试odoo8之前,不要单独启动odoo8服务。

§8.1 进入odoo.py的shell命令模式(odoo 9才有)

./odoo.py shell -d odoo9_db -r odoo -w pass123 --db_host=127.0.0.1  -c openerp-server.conf

>>> dir()        ----返回当前脚本的所有名字,其中openerp和self,可以进一步列,如dir(openerp)、dir(self)

>>> print self       ----查看当前模块,默认是res.users。

>>> dir(openerp)         -----查看模块openerp定义的名字和函数。

>>> help()                     ----进入帮助界面。

>>> help(openerp.osv.orm.Model.browse)                 ----获取browse()函数的帮助

>>> self.search_read([('id','=',1)],['name'])      ----查看表res_users中id为1的用户的名字。

>>> self.pool.get('neon.asset').browse([1,2])

 

§8.2  服务启动过程跟踪

Odoo.py定一了一系列的函数,最后两条语句是执行总路口,我们在main()处设置断点,然后开始跟踪调试,结果如下:

odoo.py>main():导入openerp,然后执行openerp/cli/__init__.py>main(),然后执行openerp/cli/server.py>main(args),>check_root_user()检查是否是根用户,如果是,则退出。由于我们是用root用户登录linux并做调试工作的,所以openerp/cli/server.py有一条语句改为 “if pwd.getpwuid(os.getuid())[0] == 'root1' :”,这样root用户也能运行odoo服务了。

openerp/tools/config.py>parse_config(args)分析配置文件(--config=/opt/dev/odoo8/odoo-config/openerp-server.conf)。

check_postgres_user()检查是否是postgres数据库用户,如果是则退出。

report_configuration()打印OpenERP版本信息,addons路径,数据库登录信息。

openerp/service/server.py>start(preload=None,stop=False):

装载全局模块(模块由--load命令行参数或server_wide_modules指定,默认模块是web,web_kanban),执行run(),执行start(),再执行http_spawn(self),开始监听80或者8069端口了,在执行run()时传递了application函数(在openerp/service/wsgi_server.py中定义)。服务器有三种(默认是ThreadedServer),在windows下只有ThreadedServer支持:

GeventServer if sys.modules.get("gevent").

PreforkServer if workers is defined in configuration.

ThreadedServer if none of the above are true.

 

文件openerp/service/server.py中定义了ThreadedServer服务器对应的类,类中方法run()完成:调用start()产生一个http线程和2个cron线程。http线程调用http_thread产生Werkzeug wsgi 守护服务进程,所有的web请求被传递给application函数(在openerp/service/wsgi_server.py中定义)。cron线程为每个数据库(套帐)每隔60秒钟调用_acquire_job(db_name)方法(方法的类ir_cron定义在openerp/addons/base/ir/ir_cron.py中)来处理后台任务。启动大概流程见下面的图。

 

§8.3  跟踪后端网页动作

在用pycharm 4调试odoo8时,odoo服务程序监听8072端口,而不是80,但当在pycharm里运行odoo8时又是监听80端口。我们都知道8072端口是支持在线聊天的。既然监听8072,那么我们就干脆访问http://<ip>:8072,但是网页长时间打不开。我们在/root/odoo-8.0/openerp/service/wsgi_server.py的application()函数内第一条语句处设置断点,然后debug运行odoo服务,并且在浏览器打开网页,可以开始跟踪了。有外国朋友说修改文件/root/odoo-8.0/openerp/__init__.py,参照下图注释掉两行:

然后调试odoo就是监听80端口了,而且浏览网页也正常,跟踪也顺利。但是又产生了一个新的问题:在pycharm中运行odoo,监听8072端口了。下图供参考。

 

§8.4 调试模块

模块名就是模块文件所在的目录名,当调试模块时,需要不断地修改代码,并在odoo中升级模块,才能看到修改后的效果。升级模块有两种方式,一种是在odoo的“设置”菜单中完成,一种可在启动odoo服务时升级,后一种方法比较快捷,带参数 -u 模块名 启动Odoo服务即可,比如:

./odoo.py -c openerp-server.conf -u neon_asset

其中neon_asset是我开发的资产管理模块。

 

9.     调试odoo前端js代码

前端调试要结合chrome和其插件,同时最好配置goagent翻墙软件,因为后续的js调试插件JetBrains IDE Support需要翻墙才能下载。

§9.1  安装和配置chrome浏览器

root@OdooDev:~/install_softwares# dpkg -i google-chrome-stable_current_i386.deb

如果此时直接启动chrome浏览器,那么就会报错:

我们的解决办法是:

root@OdooDev:~/install_softwares# mkdir $HOME/.chrome

root@OdooDev:~/install_softwares# vim /usr/bin/google-chrome

这样就可以正常启动chrome浏览器了。

 

§9.2  配置goagent翻墙工具

从这里http://t.cn/RwuUMo2下载(密码29b9),然后解压到/opt/GoAgent-323/目录下。参照里面的操作说明配置,对于Linux系统,注意以下几点:

root@OdooDev:~# apt-get -y install python-vte

root@OdooDev:~# python2.7 /opt/GoAgent-323/local/addto-startup.py

这一步是添加开机自动启动翻墙软件,也可以手工启动,采用命令python2.7 /opt/GoAgent-323/local/goagent-gtk.py或者python2.7 /opt/GoAgent-323/local/proxy.py

下面还要手工导入证书:

打开 Chrome 浏览器 >设置 > 显示高级设置… > HTTPS/SSL > 管理证书… > 授权中心> 导入… > 导入/opt/GoAgent-323/local目录下的 CA.crt 证书 > Edit trust settings 全部选中 > 重启浏览器

PS: goagent目前不稳定,我直接采用蓝灯(lantern)翻墙工具,速度快,还比较稳定,本博客的第一篇文章中有下载链接。

 

§9.3  调试前端js脚本

参照下图增加js调试配置:

点击“OK”后会提示需要在chrome浏览器中安装插件JetBrains IDE Support。调试时在pycharm中正常运行或者调试运行odoo8或者在系统命令窗口运行odoo8服务(root@OdooDev:~/odoo-8.0# ./odoo.py -c openerp-server.conf),然后在pycharm中调试运行js debug:

pycharm会自动启动chrome浏览器,如下图所示:

对于网站的前端调试,我还是喜欢使用chrome开发者工具或者与firefox集成的FireBug,后者有中文版,使用更人性化一些。下面简单介绍下安装和使用FireBug。先从http://download.firefox.com.cn/releases/stub/official/zh-CN/Firefox-latest.exe下载Firefox下载浏览器并安装它,安装完之后启动firefox浏览器,点击右上角的菜单(那个“三”的小图标),然后点击“添加组件”,再然后搜索firebug,搜到之后直接安装这个组件即可。最后在firefox浏览器的靠近右上角的地方出现一个小虫子的图标就是FireBug了,见下图:


现在进入odoo的商城下单,直到如下付款的界面:

选择不同的付款方法,那个“现在支付”按钮下的信息就会改变,那么现在我们来找找改变这些信息的代码在哪里。

第一种方法:点击那个小虫子打开firebug界面,然后依次参照图中的1、2、3操作:

 

上图中已经告诉我们执行的js函数,我们双击这个函数打开包含这个函数的那个js文件,并定位到目标函数。js文件一般是经过压缩的,可读性极差,点击“{}”整理代码,如下图所示:

第二种方法:参见下图操作。

 

然后再点击“PayPal”前的那个点,这样就触发了事件了,见下图:

 

10、防火墙设置

如果服务器放在公网上,等于就暴露在不安全的外部世界,合理设置防火墙规则就显得至关重要了。

安装需要的软件包:
root@OdooDev:~# apt-get -y install iptables iptables-persistent

root@OdooDev:~# update-rc.d iptables-persistent defaults

root@OdooDev:~# cat >/etc/iptables/rules.v4 <<E"O"F

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
-A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp -m multiport --dports 22,80,443,8069,8072 -j ACCEPT
-A OUTPUT -p udp --sport 53 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
-A OUTPUT -m state --state NEW -m tcp -p tcp -m multiport --dports 22,80,443,5432 -j ACCEPT
COMMIT
# Completed on Fri Mar 27 00:30:59 2015
*nat
:PREROUTING ACCEPT [2:467]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [15:1045]
:POSTROUTING ACCEPT [15:1045]
-A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8069

EOF

对于这个配置,说明如下:

(1)、放行进来的端口22,80,443,8069,8072,22号端口是ssh登陆的端口,不能禁止,否则没法远程登陆管理机器;80和443是网站服务端口,分别对应http和https协议,如果禁用了没法登陆odoo;8069是odoo的服务端口,尽管做了端口转发,还是要开启的;8072是在线聊天端口。

(2)、放行出去的端口22,80,443,5432,因为在登陆服务器后当然还希望再登陆到其他电脑,所以出去的22不能封;同时安装软件需要访问外部的80和443端口;5432是本机上的postgresql数据库,本机的odoo服务要访问数据库,对它来说当然是要出去了。

(3)、80端口转向到8069端口,采用nat技术。这样外面的人访问odoo时不用指定8069端口,直接访问域名如www.duse.com就行啦。

重启系统。
#COMMIT

 

10、模块开发

注意,如果用vim编辑,建议在文件末尾放上下面一行:
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

一些提醒:

1)、继承:首先继承一个旧类以增加字段或方法,然后添加视图内容,如:

class pet_Animal(osv.Model):
_name = 'pet.animal'
_columns = {
……
'res_partner_id':fields.many2one('res.partner','Owner'),
}

class pets_res_Partner(osv.Model):
_inherit = "res.partner"
_columns = {
'animal_ids':fields.one2many('pet.animal','res_partner_id',string="Pets"),
} #继承res.partner类,增加字段animal_ids。在写本类时考虑的角度与res.partner一样。

如果重载了方法,那么一般首先会调用super()函数。下面再来集成并修改视图:

<record id="base_view_partner_form" model="ir.ui.view">
<field name="name">res.partner.form.inherit.pet_animal</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml">
<!--Adds a new page (tab) to the view after the tab Information -->
<xpath expr="//page[@string='Information']" position="after">
<page name="pets" string="Animal Pets">
<group>
<field name="animal_ids"/>
</group>
</page>
</xpath>
</field>
</record>

关于xpath expr更详细的参见Xpath expressions in Odoo 8

可以在windows或者Linux平台上履行odoo8的开发和调试任务,工具可以选择ecplise+pydev或者pycharm+java sdk,前者是免费的,而pycharm专业版是收费的,社区版是免费的,但是社区版功能要弱一些,pycharm专业版允许无偿使用1个月,之后就必须购买序列号,不过破解它也是容易的。pycharm是专门针对python语言的集成可视化开发环境,相对于ecplise的pydev插件更专业一些,但是ecplise的开发界面更通用一些,因为只要安装相应的插件,ecplise可以用来开发任何语言的程序了,比如c, c++, java, php, python,......

本文搭建采用:ubuntu 14.04 LTS 32位桌面版,  pycharm 4.0.3专业版, jdk-8u25-linux-i586.rpm

 

1、安装基本的包

# sed -i 's|cn.archive.ubuntu.com|mirrors.aliyun.com|g'  /etc/apt/sources.list

# apt-get update && apt-get -y upgrade && apt-get -y install vim python-pip

# apt-get install -y python-dateutil python-feedparser python-ldap python-libxslt1 python-lxml python-mako python-openid python-psycopg2 python-pybabel python-pychart python-pydot python-pyparsing python-reportlab python-simplejson python-tz python-vatnumber python-vobject python-webdav python-werkzeug python-xlwt python-yaml python-zsi python-docutils python-psutil python-mock python-unittest2 python-jinja2 python-pypdf python-decorator python-passlib

# pip install gdata

# apt-get install python-gevent
# pip install psycogreen                                                ---- odoo的在线聊天要使用这个包和上一步安装的python-gevent包
# echo 'LANG="zh_CN.UTF-8"'>/etc/default/locale #解决文件的修改日期乱码的问题
# echo 'LANGUAGE="zh_CN:zh"'>>/etc/default/locale
# update-grub2

 

2、安装和配置数据库

# apt-get -y install postgresql

# /etc/init.d/postgresql restart

# sudo -u postgres psql -e --command "CREATE USER odoo WITH SUPERUSER PASSWORD 'odoo_pass'"

 

3、准备odoo8源码

# mkdir -p  /opt/dev/custom-addons && cd /opt/dev && git clone -b 8.0 https://github.com/odoo/odoo.git

# mv odoo odoo8 && mkdir /opt/dev/odoo8/odoo-config

# cp /opt/dev/odoo8/debian/openerp-server.conf /opt/dev/odoo8/odoo-config/

# cat >/opt/dev/odoo8/odoo-config/openerp-server.conf <<E'O'F

[options]
; This is the password that allows database operations:
; admin_passwd = admin
db_host = localhost
db_port = 5432
db_user = odoo
db_password = odoo_pass
addons_path = /opt/dev/odoo8/addons,/opt/dev/custom-addons
timezone = Asia/Shanghai
list_db = False
xmlrpc_port = 80
workers = 2
db_template = module_db
dbfilter = %d_db

EOF

如果没有xmlrpc_port参数,那么默认就是8069(参见程序/opt/dev/odoo8/openerp/tools/coonfig.py中的语句group.add_option("--xmlrpc-port", dest="xmlrpc_port", my_default=8069,help="specify the TCP port for the XML-RPC protocol", type="int"))。

参数list_db = False、db_template = module_db和dbfilter = %d_db主要用来把odoo配置成SaaS模式,list_db=False参数使得用户不能在登录界面上看到全部的套帐(数据库),因此无法选择套帐;dbfilter = %d_db参数指定:根据访问域名选择套帐,比如域名是www.xyz.com,那么选择的套帐就是xyz_db,另外的选择器%h表示整个域名,这对于SaaS形式的odoo非常有用。

 

4、安装pycharm

Pycharm需要JAVA JDK,从http://www.oracle.com/technetwork/java/javase/downloads/index.html?ssSourceSiteId=ocomen下载最新的JDK到/opt/dev/,比如jdk-8u25-linux-i586.rpm

# apt-get install -y alien                                ----在ubuntu上需要采用工具alien来安装rpm格式的包

# alien -i -c /opt/dev/jdk-8u25-linux-i586.rpm                        -----注意:本命令要根据下载的具体文件名来定。

# java -version           ----查看java的版本信息

 从http://www.jetbrains.com/pycharm/download/下载最新专业版的Pycharm到/opt/下,可以试用30天,之后可以破解。

# cd /opt/ && tar -xzf pycharm-professional-4.0.3.tar.gz

# mv pycharm-4.0.3 pycharm

以后在图形的Linux桌面上运行/opt/pycharm/bin/pycharm.sh就可以启动可视化的python开发界面了。

注意:直接在Lisence server里输入

server选项里边输入 http://elporfirio.com:1017/就可以了。
不行再尝试:
server选项里边输入 http://idea.imsxm.com/

 

5、在pycharm中导入odoo项目

初始启动pycharm,在图形命令窗口中执行/opt/pycharm/bin/pycharm.sh

点击“Open…”打开并导入目录/opt/dev/odoo8,在集成开发环境中点击菜单“Run-->Resume Program”或者直接按F9,出现:

点击Edit Configurations…,新建一个启动配置:

这样在pycharm中启动odoo,对应的命令就是/opt/dev/odoo8/odoo.py --config=/opt/dev/odoo8/odoo-config/openerp-server.conf

下面是pycharm的集成开发调试界面。

 

 

6、odoo服务启动分析。

由于启动服务的命令是/opt/dev/odoo8/odoo.py --config=/opt/dev/odoo8/odoo-config/openerp-server.conf,所以我们从跟踪odoo.py开始,在pycharm集成环境中双击odoo.py打开文件:

Odoo.py定一了一系列的函数,最后两条语句是执行总路口,我们在main()处设置断点,然后开始跟踪调试,结果如下:

odoo.py>main():导入openerp,然后执行openerp/cli/__init__.py>main(),然后执行openerp/cli/server.py>main(args),>check_root_user()检查是否是根用户,如果是,则退出。由于我们是用root用户登录linux并做调试工作的,所以openerp/cli/server.py有一条语句改为 “if pwd.getpwuid(os.getuid())[0] == 'root1' :”,这样root用户也能运行odoo服务了。

openerp/tools/config.py>parse_config(args)分析配置文件(--config=/opt/dev/odoo8/odoo-config/openerp-server.conf)。

check_postgres_user()检查是否是postgres数据库用户,如果是则退出。

report_configuration()打印OpenERP版本信息,addons路径,数据库登录信息。

openerp/service/server.py>start(preload=None,stop=False):

装载全局模块(模块由--load命令行参数或server_wide_modules指定,默认模块是web,web_kanban),执行run(),执行start(),再执行http_spawn(self),开始监听80或者8069端口了,在执行run()时传递了application函数(在openerp/service/wsgi_server.py中定义)。服务器有三种(默认是ThreadedServer),在windows下只有ThreadedServer支持:

GeventServer if sys.modules.get("gevent").

PreforkServer if workers is defined in configuration.

ThreadedServer if none of the above are true.

文件openerp/service/server.py中定义了ThreadedServer服务器对应的类,类中方法run()完成:调用start()产生一个http线程和2个cron线程。http线程调用http_thread产生Werkzeug wsgi 守护服务进程,所有的web请求被传递给application函数(在openerp/service/wsgi_server.py中定义)。cron线程为每个数据库(套帐)每隔60秒钟调用_acquire_job(db_name)方法(方法的类ir_cron定义在openerp/addons/base/ir/ir_cron.py中)来处理后台任务。

 

application(environ, start_response)函数调用application_unproxied(environ, start_response)函数,这是WSGI服务的总入口,它又调用environment.manage()方法创建本地环境数据集(如数据库访问参数和本地缓存),其中数据库参数:cr-数据库游标,uid-用户id号,context-当前上下文的字典。

7、odoo.py的运行参数

打开文件openerp/tools/config.py,可以看到很多服务启动时用到的参数,这些参数可以在配置文件中定义,也可以在odoo.py的命令行上指定,一些重要的参数如下:

参数名 命令行参数名 说明 默认值 举例
addons_path --addons-path 指明额外的addons目录,多个目录用逗号分隔
admin_passwd 管理员密码

admin

auto_reload

--auto-reload

是否自动重载:true|false

false

config

--config, -c

指明配置文件
data_dir

--data-dir,-D

定义Odoo数据存放目录 $HOME/.local/share/Odoo
db_host

--db_host

定义postgresql数据库的ip地址

localhost

db_maxconn
db_name

--database,-d

指定数据库名称

False

db_password

--db_password,-w

数据库密码

db_user

--db_user,-r

数据库用户名

db_port

--db_port

数据库端口
db_template --db-template 指定模板数据库

Template1

dbfilter --db-filter 定义数据库过滤器,%h表示主机名,%d表示域名(除掉www和最后的部分),如通过www.duse.com访问odoo,那么自动选择duse_db套帐。

.*

 dbfilter=%d_db
debug_mode

--debug

是否以调试方式启动

False

email_from --email-from 发送邮件的地址

False

list_db

--no-database-list 不列出全部数据库

True

当指定False时,登录时要输入数据库名,适合于odoo的SaaS应用。
logfile --logfile 日志文件
publisher_warranty_url 'http://services.openerp.com/publisher-warranty/')

root_path

指明odoo的根目录 /opt/dev/odoo8/openerp/__init__.pyc的basename
smtp_password,smtp_port, smtp_server,smtp_user
server_wide_modules --load 指明odoo服务启动时需要装入的全局模块 web,web_kanban
timezone --timezone ,-t 指明服务器的时区,如Asia/Shanghai

False

timezone = Asia/Shanghai

workers --workers odoo服务的进程个数,一般等于cpu的核心数。当大于0时,会自动产生在线聊天的后台进程并监听8072端口

0

xmlrpc_interface --xmlrpc-interface 监听的网卡ip 默认监听全部网卡
xmlrpc_port --xmlrpc-port 监听端口,当端口小于1024时必须以root用户运行odoo服务。如果仍以普通用户运行且端口为8069,但是用户又要以80端口访问时,可以运行以下命令转发:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8069

8069

xmlrpc_port = 80 或者 --xmlrpc-port=80。

一般我们设计好一个具备基本功能的数据库(套帐),比如module_db,作为数据库模板,并定义在配置文件中。

db_host = localhost

db_port = 5432

db_user = odoo

db_password = odoo_pass

db_template = module_db

addons_path = /opt/dev/odoo8/addons,/opt/dev/custom-addons

publisher_warranty_url = False

timezone = Asia/Shanghai

list_db = False

; xmlrpc_interface = 192.168.0.12

xmlrpc_port = 80

workers = 4

 

8、用户浏览网页的过程

打开网页http://hostname:8069被自动重定向到http://hostname:8069/web,这是由/opt/dev/odoo8/addons/web模块处理的,我们重点检查文件controllers/main.py,看到里面的代码:

@http.route('/', type='http', auth="none")

def index(self, s_action=None, db=None, **kw):

return http.local_redirect('/web', query=request.params, keep_hash=True)

 

@http.route('/web', type='http', auth="none")

def web_client(self, s_action=None, **kw):

ensure_db() #选择和管理数据库

if request.session.uid:

if kw.get('redirect'):

return werkzeug.utils.redirect(kw.get('redirect'), 303)

if not request.uid:

#在同一台电脑上已经登录的用户

request.uid = request.session.uid

menu_data = request.registry['ir.ui.menu'].load_menus(request.cr, request.uid, context=request.context)   #获取菜单数据

return request.render('web.webclient_bootstrap', qcontext={'menu_data': menu_data})    #调用模板webclient_bootstrap渲染成网页并返回给用户

else:

#还没有登录的用户

return login_redirect()

由此可见,渲染会调用web.webclient_bootstrap模板(在/opt/dev/odoo8/addons/web/views/webclient_templates.xml中定义),模板中采用的样式定义在文件/opt/dev/odoo8/addons/web/static/src/css/base.css中。

 

9、附录

9.1)、在列表和表单界面上,隐藏系统的“create”:

在tree 和form 后直接加  create="false", 例如
〈tree string="XXX" create="false"〉
〈form string="YYY" create="false"〉

9.2)、在系统的print和more下拉菜单下添加子菜单:

方法一:
use key2="client_action_multi" in act_window to add submenu to "More" button
<act_window name="New Sub menu"
res_model="product.product"
src_model="product.product"
key2="client_action_multi"
view_mode="form" target="new"
view_type="form"
id="act_new_sub_menu" />

方法二:
You can goto Settings >> Technical >> Action >> Action Bindings. Then in search Group By Model and Type. Find the model product.product and expand it. You can see two types, client_print_multi (for items under Print button)and client_action_relate (for items under More button). You can choose the one you want and delete those entries which you want to hide in that type.
These action bindings are stored in "ir_values" table in your database.

常见开源协议 2011年7月20日

先上图:

 

 

常见的五种简介:

 

 

  对于开源软件来说,相信每个人心中都会有自己的TOP10,尤其是那些开源软件拥护者眼中的TOP10,可能会与我们所列的TOP10有些不同。不过,这是经过全球很多开源社区高手共同讨论的结果,我们觉得这个版本的TOP10是我们所能做到的最公正、最准确的了。当然如果你不同意这样的TOP10,没关系,尽管保留你心中的TOP10。

新的开源产品记录 2010年9月12日

想必各位与我一样,平时偶尔看到又有一个好的产品开源了,于是匆忙到网上搜索其更详细的相关资料,然后看看是否适合于自己的企业,或者自己安装一番,然后自我陶醉陶醉,再然后可能又丢一边了,日后可能又忘了,再以后真的又需求了,可能压根就想不起来这个适合自己需求的开源产品,从而错失了一个好机会了。于是我还是觉得把这些新发现的优秀开源产品先记下来,以后自己可以随时查阅,各位也可以把自己认为好的开源产品加在跟帖里,谢谢先。

Linux操作系统培训目前越来越流行,更多的培训是采用现场教学方式——上机教学,那么上机教学怎么来达到把老师的电脑上的屏幕内容广播到学生电脑上呢?这可以采用软件italc来完成。本文采用ubuntu 9.04操作系统。

encfs的使用 2010年9月09日

EncFS是一个免费的,开源的,基于GPL的,FUSE级别的加密文件系统,能够透明加密文件,使用任意目录存放加密文件.EncFS 运行于 Linux 的用户空间,使用FUSE内核模块。所有写入该文件系统的文件都将被加密。EncFS 为我们提供一个用户级的加密文件系统,每个用户都可为自已的目录或文件创建一个加密的文件系统。这个文件系统只能由你加载和访问,其他用户只能看到加密后的内容。其使用FUSE库和FUSE内核模块来提供文件系统的接口。

osCommerce安装和配置 2010年9月09日

运行平台:Ubuntu8+php5+apache2+Mysql5+osCommerce2.2

osCommerce是一套国际著名的开源免费的电子商务系统。运行于PHP+MySql服务器环境。项目始于2000年,由严谨的德国人开发,是老牌的外贸网站购物程序。其特征you:

Plone是基于Zope的最主要的平台,Zope是一个非常优秀的应用服务器。原生开发语言是Python。做个比喻:Python是开发语言,相当于JAVA、C#;Zope是一套应用体系,相当于J2EE、.net;Plone相当于构建这些基础之上的一个遵循标准的技术平台或系统,包括工作流,内容管理,文档管理,权限等。企业内容管理(CMS)越来越得到了广大企业的重视,企业的电子化文件资料无疑是一种重要的知识资产,采用专门的工具来管理这些资产就显得重要而紧迫。Zope/Plone是一套老牌的内容管理软件,不过现在应该更好的开源工具了,有时间再去网上刮刮……