个人博客

搭建一个odoo简单的应用

一、简介

odoo是一个开源的框架,针对ERP的需求开展而来的,适宜于定制客户各种需求的ERP系统和电子商务系统。它可以根据客户的需求进行模块的安装于卸载,主要的模块包括:采购、出售、库存、生产、财务、CRM、网站等等。

二、安装与配置

odoo不同版本之间存在差异,这里主要使用odoo13进行讲解,使用python3.7版本。如果使用的odoo10,则需要使用python2.7的版本。

1,安装postgresql数据库

odoo框架使用的是postgresql数据库,可以在https://www.postgresql.org/download/windows/下载,然后默认安装完成即可。

安装完成时候,可以在启动菜单看到postgresql数据库。

picture

启动后,输入安装时的管理员密码,即可登录到数据库。

picture

然后在Login/Group Roles右键创建一个odoo访问数据库的账号,并配置密码和权限。

picture

picture

picture

picture

2,下载odoo13源码

访问http://nightly.odoo.com/13.0/nightly/src/,下载odoo13的zip包进行解压到项目中。

使用pycharm打开odoo13源码项目后,在项目下创建一个odoo-bin.py文件,内容为:

#!/usr/bin/env python3

# set server timezone in UTC before time module imported
__import__('os').environ['TZ'] = 'UTC'
import odoo

if __name__ == "__main__":
    odoo.cli.main()

同时也创建配置文件odoo.conf,写上配置信息:

[options]
addons_path = E:/project/python/odoo_pro/odoo-13/odoo/addons,E:/project/python/odoo_pro/odoo-13/my_demo
data_dir = E:/project/python/odoo_pro/odoo-13/data
; max_cron_threads = 2
workers = 3
db_host = 127.0.0.1
db_port = 5432
db_user = odoo
db_password = odoo
db_name = odoo_demo
; logfile = E:/project/python/odoo_pro/odoo-13/logs/odoo.log
longpolling_port = 8072
without_demo = all
admin_passwd = admin

db_host:数据库的地址。
db_port:数据库端口号。
db_user:刚才设置的数据库账号。
db_password:数据库密码。
db_name:选择的数据库名。
admin_passwd:odoo系统的admin用户的密码。
addons_path:指定odoo自带的模块包路径以及自己创建的模块包的路径。

配置好之后,我们先安装odoo的依赖,在解压的项目文件夹中,安装requirements.txt文件中的依赖:

pip3 install -r requirements.txt

picture

安装完成之后,可以使用命令启动odoo,并访问http://127.0.0.1:8069:

python3 odoo-bin.py -c odoo.conf

picture

三、搭建第一个模块应用

1,创建新应用:

首先在启动之前,我们先创建自己的模块,可以使用命令创建一个目录,一般这个模块都会被配置在配置文件中的addons_path参数中,才可以在odoo应用中找到并且安装。

mkdir my_demo
python3 odoo-bin.py scaffold todo my_demo

picture

你可以在新建的目录下看到一个odoo应用模块的组成文件夹。

再次使用python3 odoo-bin.py -c odoo.conf启动odoo,输入管理员账号admin,密码admin。登陆之后,可以在浏览器参数中加debug=1开启调试模式,以后的odoo开发会经常用到,默认讲解都是在debug模式下进行,后面不在强调。

picture

2,应用中的模块说明:

picture

init.py:python中声明包文件。
manifest.py:用于声明一个odoo的模块以及指定它的元数据,里面包含了一个字典配置信息,用于指定应用名、依赖的模块、需要加载的文件等等信息。
controllers:主要放一些逻辑处理的文件,一些http路由处理程序。
models:主要存放模型定义的文件。
demo:存放一些用于演示的数据。
security:存放一些安全相关的配置,分组以及一些规则的定义。
ir.model.access.csv:用于定义一些不同分组对模型的操作权限的配置。
views:存放的一些视图相关的文件。

3,定义一个模型:

在models/models.py文件中,配置模型的字段:

from odoo import models, fields, api

class TodoCategory(models.Model):
    _name = 'todo.category'
    _description = '分类'

    name = fields.Char(u'名称')
    task_ids = fields.One2many('todo.task', 'category_id', string=u'待办事项')
    count = fields.Integer(u'任务数量', compute='_compute_task_count')

    @api.depends('task_ids')
    def _compute_task_count(self):
        for record in self:
            record.count = len(record.task_ids)

class TodoTask(models.Model):
    _name = 'todo.task'
    _description = '待办事项'

    name = fields.Char('描述', required=True)
    is_done = fields.Boolean('已完成?')
    priority = fields.Selection([
        ('todo', '待办'),
        ('normal', '普通'),
        ('urgency', '紧急')
    ], default='todo', string='紧急程度')
    deadline = fields.Datetime(u'截止时间')
    is_expired = fields.Boolean(u'已过期', compute='_compute_is_expired')
    category_id = fields.Many2one('todo.category', string=u'分类')

    @api.depends('deadline')
    def _compute_is_expired(self):
        for record in self:
            if record.deadline:
                record.is_expired = record.deadline < fields.Datetime.now()
            else:
                record.is_expired = False

name:模型的名称,是模型的唯一标识,也代表一个表名,通常是把"."替换为""就可找到对应的数据表。
_description:对模型的描述,说明模型的作用。
default:该参数用于指定字段的默认值。
compute:用于指定计算的方法名,指定的方法都会带上@api.depends装饰器,接收的参数deadline用于表示计算时会用到的字段。

_inherit属性也是用的比较多的一个,一般用于模型的继承中,例如:_inherit=“todo.task”表示继承自todo.task模型。

而模型的字段的定义,使用fields进行字段的定义,这里使用了ORM,使用过django的就会比较熟悉这模型的定义,这里就不再讲述。

4,创建应用的菜单:

在views文件加下,新建一个menus.xml文件,并写入:

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <data>
        <!-- 主菜单定义 -->
        <menuitem id="menu_todo" name="Todo"/>
        <menuitem id="menu_todo_submenu" parent="menu_todo" name="待办事项"/>
        <!-- 菜单动作定义 -->
        <record id="action_todo_task" model="ir.actions.act_window">
            <field name="name">待办事项</field>
            <field name="res_model">todo.task</field>
            <field name="view_mode">tree,form</field>
            <field name="target">current</field>
        </record>

        <record id="action_todo_category" model="ir.actions.act_window">
            <field name="name">分类</field>
            <field name="res_model">todo.category</field>
            <field name="view_mode">tree,form</field>
            <field name="target">current</field>
        </record>
        <!-- 子菜单定义 -->
        <menuitem action="action_todo_category" id="submenu_todo_category" name="分类" parent="menu_todo_submenu" sequence="8"/>
        <menuitem action="action_todo_task" id="submenu_todo_task" name="待办事项" parent="menu_todo_submenu" sequence="10"/>
    </data>
</odoo>

act_window:表示这个动作和窗口有关,可以用于定义打开一个窗口查看视图。
name:菜单的显示名字。
res_model:指定关联的模型。
view_mode:指定查看的视图类型。
target:指定窗口打开的方式。
parent:用于指定菜单的父级菜单。

5,创建视图:

在views/views.xml文件中,写入:

<odoo>
    <data>
        <record id="todo_task_view_tree" model="ir.ui.view">
            <field name="name">todo.task.view_tree</field>
            <field name="model">todo.task</field>
            <field name="type">tree</field>
            <field name="arch" type="xml">
                <tree string="Todo">
                    <field name="name"/>
                    <field name="deadline"/>
                    <field name="category_id"/>
                    <field name="is_done"/>
                    <field name="is_expired" invisible="True"/>
                </tree>
            </field>
        </record>

        <record id="todo_task_view_form" model="ir.ui.view">
            <field name="name">todo.task.view_form</field>
            <field name="model">todo.task</field>
            <field name="type">form</field>
            <field name="arch" type="xml">
                <form string="Todo">
                    <sheet>
                        <group>
                            <group>
                                <field name="name"/>
                                <field name="category_id"/>
                                <field name="is_done"/>
                            </group>
                            <group>
                                <field name="priority"/>
                                <field name="deadline"/>
                                <field name="is_expired" readonly="True"/>
                            </group>
                        </group>
                    </sheet>
                </form>
            </field>
        </record>

        <record id="todo_category_view_tree" model="ir.ui.view">
            <field name="name">todo.category.view_tree</field>
            <field name="model">todo.category</field>
            <field name="type">tree</field>
            <field name="arch" type="xml">
                <tree string="Todo Category" editable="bottom">
                    <field name="name"/>
                    <field name="count"/>
                </tree>
            </field>
        </record>

        <record id="todo_category_view_form" model="ir.ui.view">
            <field name="name">todo.category.view_form</field>
            <field name="model">todo.category</field>
            <field name="type">form</field>
            <field name="arch" type="xml">
                <form string="Todo Category">
                    <sheet>
                        <group>
                            <group>
                                <field name="name"/>
                            </group>
                            <group>
                                <field name="count" readonly="True"/>
                            </group>
                        </group>
                    </sheet>
                </form>
            </field>
        </record>
    </data>
</odoo>

model:用于指定使用的模型。
arch:用于定义tree或者form视图的展示数据,使用来指定展示的数据。

6,配置权限:

在security/ir.model.access.csv文件中配置模型,群组,操作权限等:

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_todo_task,todo_task,model_todo_task,base.group_user,1,1,1,1
access_todo_category,todo_category,model_todo_category,base.group_user,1,1,1,1

model_id:id:一般使用model_+模型名,用于配置的模型。
group_id:id:指定群组对该模型的权限。
perm_read,perm_write,perm_create,perm_unlink:分别是读取,修改,创建,删除等权限。

7,配置模块的信息:

我们把配置的菜单信息,填写到__manifest__.py的data列表中,这样菜单的信息才会在安装的时候被加载。

'data': [
        'security/ir.model.access.csv',
        'views/views.xml',
        'views/templates.xml',
        'views/menus.xml',
],

编辑完保存之后,我们重启odoo,登陆之后在搜索应用中搜索todo,并点击安装:

picture

点击创建按钮,我们可以创建一条数据并展示在界面上,菜单栏也有我们配置的应用,到此,一个新的应用模块就搭建完成。

picture

picture

相关标签
回到顶部