odoo 开发入门教程系列-模块交互

模块交互

在上一章中,我们使用继承来修改模块的行为。在我们的房地产场景中,我们希望更进一步,能够为客户生成发票。Odoo提供了一个开发票模块,因此直接从我们的房地产模块创建发票是很简单的,也就是说,一旦某个房产设置为“已售出”,就会在Invoicing应用程序中创建发票

一个具体示例: 记账凭证(Account Move)

目标: 本节结束时:

  • 创建一个estate_account 模块

  • 创建房产时,为购买者开发票

预期效果动画地址:https://www.odoo.com/documentation/14.0/zh_CN/_images/create_inv.gif

每当我们与另一个模块交互时,我们都需要记住模块化。如果我们打算将我们的应用程序卖给房地产代理,有些人可能想要发票功能,但有些人可能不想要。

此类使用案例的常见方法是创建“链接”模块。在我们的案例中,该模块依赖estate 和account,包括房产的发票创建逻辑。采用这种方式,estateaccount模块可以独立安装。当两者都安装后,链接模块将提供新功能。

练习--创建链接模块

创建依赖estate 和account 的 estate_account 空壳模块,创建以后安装该模块。你可能会注意到,Invoicing应用也被安装了。这是意料之中的,因为你的模块依赖它。 如果你卸载Invoicing模块,你的模块也会被卸载。

说明:__init__.py为空

重启服务,安装模块

创建发票

是时候生成发票了。我们希望为estate.property模型添加功能,即我们希望在出售房产时添加一些额外的逻辑。

第一步,我们需要扩点击“Sold”按钮时调用的操作。为此,我们需要在estate_account模块中为创建一个模型,继承estate.property模型。现在,重写操作,仅返回super调用,拿个例子来说可能更清楚:

from odoo import models

class InheritedModel(models.Model):
    _inherit = "inherited.model"

    def inherited_action(self):
        return super().inherited_action()

可以找个具体的示例

https://github.com/odoo/odoo/blob/f1f48cdaab3dd7847e8546ad9887f24a9e2ed4c1/addons/account/models/account_move.py

class AccountMove(models.Model):
    _name = "account.move"
    _inherit = ['portal.mixin', 'mail.thread', 'mail.activity.mixin', 'sequence.mixin']
    _description = "Journal Entry"
    #... 略
    def action_invoice_paid(self):
        ''' Hook to be overrided called when the invoice moves to the paid state. '''
        pass
class AccountMove(models.Model):
    _inherit = 'account.move'

    def action_invoice_paid(self):
        """ When an invoice linked to a sales order selling registrations is
        paid confirm attendees. Attendees should indeed not be confirmed before
        full payment. """
        res = super(AccountMove, self).action_invoice_paid()
        self.mapped('line_ids.sale_line_ids')._update_registrations(confirm=True, mark_as_paid=True)
        return res
练习--添加创建发票的第一步
  • estate_account模块中的正确目录创建 estate_property.py 文件
  • _inherit estate.property 模块
  • 重写 action_sold 方法(你可能已经将该方法命名为不同的名称了) 以返回 super 调用

提示: 为了确保它正常工作,添加一个print 或者调试断点到重写的方法中。

新增以下文件:

odoo14\custom\estate_account\models\__init__.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from . import estate_property

odoo14\custom\estate_account\models\estate_property.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from odoo import models


class InheritedEstateProperty(models.Model):
    _inherit = "estate.property"

    def set_property_sold(self):
        return super().set_property_sold()

修改odoo14\custom\estate_account\__init__.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from . import models

它有效吗?如果没有,请检查是否正确导入了所有Python文件。

如果重写生效,我们可以继续创建发票。不幸的是,没有一种简单的方法可以知道如何在Odoo中创建任何给定的对象。大多数时候,有必要查看其模型,以找到所需的字段并提供适当的值。

学习的一个好方法是看看其他模块是如何完成你想做的事情的。例如,销售的一个基本流程是从销售订单创建发票。这看起来是一个很好的起点,因为它正是我们想要做的。花一些时间思考和理解创建发票方法。

为了创建了发票,我们需要以下信息:

  • 一个 partner_id: 顾客
  • 一个move_type: 它有几个可能的值
  • journal_id: the accounting journal

这足够创建一个张空发票。

练习--添加发票创建第二步

重写action_sold,并创建一个空的 account.move :

  • 从当前的estate.property获取 partner_id
  • move_type 应该和Customer Invoice对应

提示:

  • 使用 self.env[model_name].create(values)创建一个对象, 其中values 为一个字典。
  • create 方法不接受结果集作为字段值。

修改odoo14\custom\estate_account\models\estate_property.py

    def set_property_sold(self):
        self.env['account.move'].create({})
        return super().set_property_sold()

当房产设置为“已售出”时,你现在应该在Invoiceing/customer/Invoices中创建一个新的客户发票。

显然,到目前为止,我们没有任何发票行。要创建发票行,我们需要以下信息:

  • name:发票行的描述
  • quantity
  • price_unit

此外,发票行需要链接到发票。将发票行链接到发票的最简单、最有效的方法是在创建发票时包含所有行。为此在account.move创建中包含invoice_line_ids字段,这是一个One2many字段。One2manyMany2many使用通用ORM方法中描述的特殊“commands”。这种格式是一个按顺序执行的三元组列表,其中每个三元组都是要对结果集执行的命令。下面是一个在创建test.model时包含一个One2many字段line_ids的简单示例:

def inherited_action(self):
    self.env["test.model"].create(
        {
            "name": "Test",
            "line_ids": [
                (
                    0,
                    0,
                    {
                        "field_1": "value_1",
                        "field_2": "value_2",
                    },
                )
            ],
        }
    )
    return super().inherited_action()
练习--添加创建发票的第三步

创建account.move时添加两个发票行。每个售出的房产都将按照以下条件开具发票:

  • 售价的6%
  • 额外100.00行政费

提示:按照上面的示例在创建时添加invoice_line_ids。对于每个发票行,我们需要一个 namequantity 和price_unit

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from odoo import models
from odoo.exceptions import UserError

class InheritedEstateProperty(models.Model):
    _inherit = "estate.property"

    def set_property_sold(self):
        print('override set_property_sold')
        journal = self.env['account.move'].with_context(default_move_type='out_invoice')._get_default_journal()
        if not journal:
            raise UserError('Please define an accounting sales journal for the company')

        self.env['account.move'].create({
           'move_type': 'out_invoice',
           'partner_id': self.buyer_id,
           'journal_id': journal.id,  # company comes from the journal
            'invoice_line_ids': [{
                'name': 'Avaliable house 01',
                'quantity': 1,
                'price_unit': 0.6 * self.best_price
            },{
                'name': ' Administrative fees',
                'quantity': 1,
                'price_unit': 100
            }]
        })
        return super().set_property_sold()

重启服务,验证效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
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
### 回答1: Odoo是一种开源的企业资源计划(ERP)软件,它提供了一整套的应用程序,包括销售、采购、库存、会计、人力资源管理等。对于想要学习和掌握Odoo开发的人来说,重要的是要掌握以下几个方面。 首先,要对Python编程语言有一定的了解和掌握。Odoo的核心是由Python编写的,并使用了一些特定的框架和库。因此,熟悉Python的语法、特性和常用的库,如Flask、SQLAlchemy等,将有助于理解和编写Odoo模块和功能。 其次,要熟悉Odoo的架构和基本概念。Odoo的应用程序可以通过模块化的方式进行扩展和定制。了解Odoo模块、模型、视图、控制器和业务流程,以及它们之间的关系和作用,是理解和开发Odoo应用的基础。 然后,要学会使用Odoo开发工具和技术。Odoo提供了一套完整的开发环境,包括开发服务器、命令行工具、调试工具等。熟悉和使用这些工具,能够帮助开发人员更高效地开发、调试和测试Odoo的应用程序。 最后,要有实践和项目经验。只有通过实际的开发和项目实践,才能真正掌握Odoo开发技术和最佳实践。参与开源社区和项目、阅读文档和教程,以及实践开发自己的Odoo模块,都是非常有益的学习途径。 总的来说,要想成为Odoo开发的专家,除了掌握Python编程语言、了解Odoo的架构和基本概念以外,还需要熟悉Odoo开发工具和技术,并且不断实践和积累项目经验。通过不断学习和实践,才能逐步提升自己的Odoo开发技能,从入门到精通。 ### 回答2: Odoo是一种开源企业资源规划(ERP)软件,它提供了一套强大而灵活的工具来帮助企业管理各个业务功能。对于人们而言,学习和掌握Odoo开发可以利用其丰富的功能和自定义能力来满足各种企业需求。以下是入门和精通Odoo开发的一些建议。 首先,对于开发人员来说,了解Python编程语言是必要的。Odoo主要使用Python来开发其插件和模块,因此对于编写自定义模块和扩展现有功能非常重要。应该熟悉Python的基本概念、语法和函数,以便能够理解和修改现有的Odoo模块。 其次,学习Odoo框架的基本原理和概念是入门的关键。Odoo有一个层级化的模块结构,每个模块提供了特定的功能。了解模块、字段、视图和动作之间的关系,以及如何创建和扩展这些组件是非常重要的。 接下来,熟悉Odoo的数据库结构和ORM(对象关系映射)。Odoo提供了ORM工具来管理数据库对象和记录。了解如何创建、更新和删除数据库记录,以及如何执行高级查询和过滤是精通Odoo开发的关键。 此外,深入了解Odoo模块开发和自定义能力是进一步精通Odoo开发的一步。Odoo允许开发人员创建自己的模块,并且可以通过继承和重写现有模块的功能来自定义和扩展。了解如何创建新模块、继承现有模块的功能、覆盖和修改模块的视图和动作是非常重要的。 最后,通过实践和实际项目来提高自己的Odoo开发技能。尝试创建自己的模块、添加新功能或修改现有功能,并通过开发Odoo应用来锻炼自己的技巧。参与Odoo社区和论坛可以与其他开发人员交流经验和获取帮助。 总结起来,要成为一名经验丰富的Odoo开发人员,需要掌握Python编程语言、理解Odoo框架和数据库结构、熟悉ORM工具以及掌握模块开发和自定义能力。通过不断的实践和参与社区可以提高自己的技能水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qw_6918966011

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值