被围观了 22,083 次

可以在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.

 
目前有0条回应
Comment
Trackback
你目前的身份是游客,请输入昵称和电邮!

Verify Code   If you cannot see the CheckCode image,please refresh the page again!