ODOO学习笔记(12):自定义模块开发

在这里插入图片描述

一、Odoo模块结构基础

  1. 基本目录结构

    • Odoo自定义模块通常有一个特定的目录结构。一个典型的模块目录包含以下文件和文件夹:
      • __init__.py:这是一个Python模块初始化文件。它使得该目录被视为一个Python模块。在这个文件中,你可以通过from. import <python_file_name>的方式导入模块中的其他Python文件。
      • __manifest__.py:这是模块的清单文件,用于定义模块的基本信息,如模块名称、版本、作者、依赖关系等。例如:
        {
            'name': 'My Custom Module',
            'version': '1.0',
            'author': 'Your Name',
            'category': 'Uncategorized',
            'description': """
                This is a custom module developed for specific business needs.
            """,
            'depends': ['base'],  # 依赖基础模块
            'data': [
                # 在这里可以添加视图文件等数据文件的路径
            ],
            'qweb': [
                # 添加QWeb模板文件路径
            ]
        }
        
      • models文件夹:用于存放模型(Model)相关的Python文件。模型定义了数据库中的表结构以及业务逻辑。例如,一个简单的自定义模型文件my_model.py可能如下:
        from odoo import models, fields, api
        
        
        class MyModel(models.Model):
            _name ='my.model'
            name = fields.Char(string='Name')
        
      • views文件夹:包含视图(View)相关的XML文件。视图用于定义用户界面,如表单视图、树视图等。一个简单的表单视图文件my_view.xml可以是这样:
        <?xml version="1.0" encoding="UTF - 8"?>
        <odoo>
            <record id="view_my_model_form_inherit" model="ir.ui.view">
                <field name="name">my.model.form.inherit</field>
                <field name="model">my.model</field>
                <field name="arch" type="xml">
                    <form string="My Model Form">
                        <field name="name"/>
                    </form>
                </field>
            </record>
        </odoo>
        
      • security文件夹:用于定义安全相关的规则,如访问控制列表(ACL)。可以通过XML文件来定义哪些用户组可以访问特定的模型和视图等。
  2. 模块的安装和升级

    • 安装:在Odoo的应用商店界面(如果是企业版)或者在开发者模式下的模块列表中,找到自定义模块并点击安装。Odoo会根据__manifest__.py文件中的依赖关系先安装依赖的模块,然后创建数据库表(基于模型定义),加载视图等数据。
    • 升级:当对模块进行修改后,如添加新的模型字段或者视图更改,升级模块时,Odoo会尝试根据修改的内容来更新数据库结构和视图等。例如,如果在模型中添加了一个新的字段,Odoo会在数据库表中添加对应的列。

二、模型开发(Model)

  1. 基础模型定义
    • 继承基础模型:在Odoo中,很多时候我们会继承已有的模型来扩展功能。例如,继承res.partner(合作伙伴模型)来添加自定义字段。
      from odoo import models, fields, api
      
      
      class ResPartnerCustom(models.Model):
          _inherit ='res.partner'
          custom_field = fields.Char(string='Custom Field')
      
    • 全新模型创建:定义新的模型,如创建一个任务管理模块的任务模型。
      class Task(models.Model):
          _name = 'task.management.task'
          name = fields.Char(string='Task Name')
          description = fields.Text(string='Description')
          due_date = fields.Date(string='Due Date')
      
  2. 模型关系定义
    • 一对多关系:例如,一个项目(project.project)可以有多个任务(task.management.task)。在任务模型中可以这样定义:
      class Task(models.Model):
          _name = 'task.management.task'
          #... 其他字段
          project_id = fields.Many2one('project.project', string='Project')
      
    • 多对多关系:假设员工(hr.employee)可以属于多个项目团队,在员工模型中可以定义如下:
      class Employee(models.Model):
          _name = 'hr.employee'
          #... 其他字段
          project_team_ids = fields.Many2many('project.project.team', string='Project Teams')
      

三、视图开发(View)

  1. 表单视图(Form View)
    • 基本表单视图:用于显示和编辑单个记录。例如,一个简单的任务表单视图。
      <?xml version="1.0" encoding="UTF - 8"?>
      <odoo>
          <record id="view_task_form" model="ir.ui.view">
              <field name="name">task.management.task.form</field>
              <field name="model">task.management.task</field>
              <field name="arch" type="xml">
                  <form string="Task Form">
                      <sheet>
                          <group>
                              <field name="name"/>
                              <field name="description"/>
                              <field name="due_date"/>
                          </group>
                      </sheet>
                  </form>
              </field>
          </record>
      </odoo>
      
    • 视图继承:可以继承已有的视图来添加或修改字段显示。例如,继承上面的任务表单视图来添加一个新字段。
      <?xml version="1.0" encoding="UTF - 8"?>
      <odoo>
          <record id="view_task_form_inherit" model="ir.ui.view">
              <field name="name">task.management.task.form.inherit</field>
              <field name="model">task.management.task</field>
              <field name="inherit_id" ref="module_name.view_task_form"/>
              <field name="arch" type="xml">
                  <field name="sheet" position="inside">
                      <field name="new_field"/>
                  </field>
              </field>
          </record>
      </odoo>
      
  2. 树视图(Tree View)
    • 树视图用于显示多个记录的列表。例如,一个任务列表树视图。
      <?xml version="1.0" encoding="UTF - 8"?>
      <odoo>
          <record id="view_task_tree" model="ir.ui.view">
              <field name="name">task.management.task.tree</field>
              <field name="model">task.management.task</field>
              <field name="arch" type="xml">
                  <tree string="Task List">
                      <field name="name"/>
                      <field name="due_date"/>
                  </tree>
              </field>
          </record>
      </odoo>
      

四、业务逻辑开发

  1. 计算字段(Computed Field)
    • 计算字段的值是根据其他字段的值通过一定的计算规则得到的。例如,在任务模型中计算任务的剩余天数。
      from odoo import models, fields, api
      
      
      class Task(models.Model):
          _name = 'task.management.task'
          #... 其他字段
          due_date = fields.Date(string='Due Date')
          today_date = fields.Date(string='Today Date', default=fields.Date.today)
          remaining_days = fields.Integer(string='Remaining Days', compute='_compute_remaining_days')
      
      
          @api.depends('due_date', 'today_date')
          def _compute_remaining_days(self):
              for task in self:
                  if task.due_date:
                      task.remaining_days=(task.due_date - task.today_date).days
                  else:
                      task.remaining_days = 0
      
  2. 约束条件(Constraints)
    • 可以在模型中定义约束条件来确保数据的合法性。例如,确保任务的截止日期大于当前日期。
      from odoo import models, fields, api
      from odoo.exceptions import ValidationError
      
      
      class Task(models.Model):
          _name = 'task.management.task'
          #... 其他字段
          due_date = fields.Date(string='Due Date')
      
      
          @api.constrains('due_date')
          def _check_due_date(self):
              for task in self:
                  if task.due_date and task.due_date < fields.Date.today():
                      raise ValidationError("Due date must be greater than or equal to today's date.")
      
1 ERP 简介 1 1.1 Odoo 历史 1 1.2 ERPⅡ 或商业智能化 2 1.2.1 什么是商业智能 4 2 Odoo 框架简介 7 2.1 python 模块分析 8 2.2 python2 还是 python3 8 3 Odoo 的安装和配置 9 3.1 PostgreSQL 数据库 10 3.2 Ubuntu14.04 下可能缺失的软件包 11 3.3 网页显示 node.js 方面 11 3.4 其他问题 12 3.5 通过命令行运行时的配置 12 3.5.1 –xmlrpc-port=8888 12 3.5.2 –addons-path=addons 12 3.5.3 数据库的一些配置 13 3.5.4 –save 13 3.6 将安装环境封装起来 13 3.7 文档编译 14 4 初入 Odoo 17 4.1 管理数据库 17 4.2 登录界面 18 4.3 Administrator 首选项 19 4.4 导入一个翻译 20 4.5 新的 Demo 用户 20 4.6 模块管理 21 4.7 修改公司信息 21 4.8 打开技术特性支持之后 22 4.9 进销存和财务系统的抽象讨论 22 4.9.1 以采购部门为例 23 4.10 安装和配置模块 24 5 创建自己的模块 27 5.1 快速生成模块骨架 27 5.1.1 python 模块的 init 文件 28 5.1.2 作为 Odoo 模块的说明文件 29 5.2 安装自定义模块 32 5.2.1 模块文件夹管理 32 5.3 一个简单的演示模块 33 5.3.1 controllers 33 5.3.2 views 33 5.3.3 models 35 5.3.4 security 37 5.3.5 美化网页 38 5.4 加分项: 通过 pgadmin3 来查看数据库 39 5.4.1 安装 39 5.4.2 连接服务器 39 5.4.3 图形化查询 40 6 Odoo 开发基础: 请假模块第一谈 43 6.1 纯理论讨论 43 6.2 定义模型 45 6.3 加入菜单 46 6.3.1 act_window 的属性 48 6.3.2 menuitem 的属性 48 6.4 视图优化 48 6.4.1 修改 tree 视图 49 6.4.2 修改 form 视图 49 6.5 完整的 views.xml 51 6.6 给模块加个图标 53 7 Odoo 开发基础: 工作计划模块第一谈 55 7.1 数据访问权限管理 61 7.1.1 access rule 62 7.1.2 record rule 62 8 扩展现有模块-继承机制 65 8.1 给模块增加 field 65 8.2 修改已有的 field 66 8.3 重载原模型的方法 66 8.3.1 什么是 Recordset 67 8.3.2 Odoo 里面的 domain 语法 68 8.3.3 recordset 的 search 方法 69 8.4 视图 xml 文件的继承式修改 70 8.4.1 视图元素添加 71 8.4.2 原视图元素属性修改 71 8.5 多态继承 72 8.6 修改其他数据文件 73 8.6.1 删除记录 73 8.6.2 更新数据 73 8.7 委托继承 74 9 理解模型内的数据文件 75 9.1 理解外部 id 75 9.2 使用外部 id 77 9.3 导出或导入数据文件 77 9.4 快捷输入标签 78 9.5 用 field 标签设置值 78 9.5.1 eval 语法 78 9.5.2 ref 属性 79 9.5.3 One2many 和 Many2many 的 eval 赋值 79 10 Odoo 开发基础: 请假模块第二谈 81 10.1 本例涉及到的数据库表格简介 89 10.2 工作流概念入门 89 10.2.1 定义工作流对象 90 10.2.2 创建节点 91 10.2.3 创建连接 91 11 Odoo 模型层详解 93 11.1 _name 93 11.2 各个表头属性 93 11.3 name 字段 94 11.4 具体模型的数据 94 11.5 模型间的关系 95 11.6 工作流 95 12 Odoo 视图层详解 97 13 附录 99 13.1 Odoo 里老的 API 99 13.2 PostgreSQL 数据库命令行操作 99 13.2.1 命令行数据库备份 99 13.3 反向代理 (reverse proxy) 99 13.3.1 安装 ngnix 软件 100 13.3.2 强制 https 连接 102 13.3.3 nginx 优化 102 13.3.4 轮询机制 102 13.4 跟踪项目源码初始化进程 102 13.4.1 base 模块 104 13.4.2 web 模块 105 13.4.3 web_kanban 模块 105 13.5 配置会计科目 105 13.5.1 配置会计科目类型 105 13.5.2 配置会计科目 106 13.6 分录 106 13.7 新建业务伙伴 106 13.7.1 新建业务伙伴标签 106 13.7.2 新建客户 106 13.8 创建新的产品 107 13.9 设置会计年度 107 13.10向供应商下单 107 13.11会计学入门 107 13.11.1财务报表 108 13.11.2原始凭证 108 13.11.3账户 108 13.11.4分类帐 109 13.11.5会计科目表 109 13.11.6报告期间 110 13.12参考资料 110
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值