跳转到主要内容

让你的Odoo脚本唱起来。

项目描述

https://travis-ci.org/camptocamp/anthem.svg?branch=master

Anthem 是一个工具,用于帮助自动化Odoo实例的脚本编写,包括设置、升级、测试等。

它应该是像 oerpscenario 这样的其他工具的替代品。

创作你的歌曲

编写你的歌曲就像创建一个Python包一样简单。被圣歌(anthem)调用的歌曲函数必须有一个位置参数 ctx

ctx 实际上是执行上下文 - 你可以从中访问 ctx.env,这是一个你应该非常熟悉的Odoo环境实例。

## songs/install.py

def setup_company(ctx):
    """ Setup company """
    company = ctx.env.ref('base.main_company')
    company.name = 'My Company'


def main(ctx):
    setup_company(ctx)

日志

当使用 @anthem.logContext.logContext.log_line 执行时,歌曲可以显示一些日志。

import anthem

@anthem.log
def setup_company(ctx):
    """ Setting up company """
    company = ctx.env.ref('base.main_company')
    with ctx.log('Changing name'):
        company.name = 'My Company'
        ctx.log_line('Name changed')
    with ctx.log('Loading a logo'):
        company.logo = b64encode(LOGO_CONTENT)
        ctx.log_line('Logo changed')

函数上的装饰器将显示文档字符串的第一行。装饰器和上下文管理器都将显示执行时间。上面的例子给出了

执行你的歌曲

使用命令行 anthem。假设你的歌曲和 openerp 都在 PYTHONPATH

圣歌将执行模块 songs.install 中的 main 函数,并用一个初始化了Odoo envctx

你可以在命令行上不用 -c,而是导出环境变量 OPENERP_SERVER,带上配置文件的路径。

为了使 openerpPYTHONPATH 中,你可能需要使用 pip install -e 将其安装为一个包,或者直接修改 PYTHONPATH

为了使你的 songsPYTHONPATH 中,最好是将其制作成一个Python包。

测试

依赖项

要运行测试,你必须有运行中的Postgresql,并且你有用户的访问权限(否则你将不得不修改 tests/config/odoo.cfg,加上你的数据库用户名和密码)。

运行测试

要运行圣歌(anthem)的测试,最好在一个虚拟环境中对其做一个可编辑的安装。你还必须通过安装Odoo包来准备环境。

Odoo 9.0 (Python 2)

Odoo 10.0 (Python 2)

Odoo 11.0 (Python 3)

如果需要,你可以使用(根据版本调整)删除测试数据库

这些步骤将下载Odoo的夜间版本,将其安装为包,然后安装数据库,以便测试可以针对它运行(这也是为什么使用虚拟环境很重要的原因!)

当调用 pytest 时,你必须使用将要用于测试的Odoo数据库的配置文件定义 OPENERP_SERVER 环境变量。

歌词

歌词是为最常用的案例预先定义的代码片段,例如

加载数据

有一个能力以方便的CSV格式提供数据 - 圣歌(Anthem)能够解析并加载这些数据。 load_csv 方法是为了这样做的主要入口点

参数

描述

ctx

圣歌上下文实例

model

Odoo模型名或来自 ctx.env 的模型类

path

CSV文件的绝对路径或相对路径。如果给出相对路径,您必须在环境中提供ODOO_DATA_PATH的值或设置--odoo-data-path选项。

标题

要加载的CSV列的白名单

header_exclude

要忽略的CSV列的黑名单

fmtparams

csv_unireader的键词参数

CSV格式类似于Odoo导出格式,即:它应该包含一个字段名称集合在标题中 * 每一行连续定义一组值,用于在给定的模型上创建记录

记录

本节专门介绍针对记录的方法。

提供记录的XMLID

这就像用记录作为第一个参数,所需的XMLID作为第二个参数调用anthem.records.add_xmlid一样简单。

例如,您有一个非常特殊的res.partner记录foo

from anthem.records import add_xmlid

[...]
@anthem.log
def add_xmlid_to_foo(ctx):
    """Make Jhony Foo great again."""
    foo = ctx.env['res.partner'].create({
        'name': 'Jhony',
        'lastname': 'Foo',
    })
    add_xmlid(foo, '__setup__.res_partner_foo_jhony')

从现在起,Jhony可以称为ctx.env.ref('__setup__.res_partner_foo_jhony')

更新记录

“更新”是一个常用的术语,基本上代表更新或插入。Anthem具有执行此类操作的功能,它在Odoo数据库上。有一个名为anthem.records.create_or_update的方法,它依赖于模型、一组值和记录XMLID。

如果您的目标是首先创建记录并提供XMLID,就像前一个章节中展示的那样,create_or_update就正好符合您的需求。

示例
from anthem.records import create_or_update

[...]
@anthem.log
def create_partner_foo(ctx):
    """Ensure that Jhony Foo is known to our Company."""
    create_or_update(
        ctx,
        model='res.partner',
        xmlid='__setup__.res_partner_foo_jhony',
        values={
            'name': 'Jhony',
            'lastname': 'Foo',
        }
    )

在调用时,它会

  • 尝试通过给定的XMLID获取记录

  • 如果找到记录
    • 用给定的值更新它(在它上调用record.update(values)

  • 否则
    • 用给定的值创建记录(调用model.create(values)

    • 为它提供一个XMLID(使用anthem.records.add_xmlid

  • 无论如何:返回该记录

模块

本节专门介绍针对模块的方法。

卸载模块

有时您只需要从实例中删除特定的模块,并且希望以编程方式完成,而无需到达每个实例,搜索它并点击“卸载”按钮。Anthem可以为您完成这项工作:您只需调用一个带有您不再使用的模块名称列表的anthem.lyrics.modules.uninstall即可。

示例(假设有您想要删除的模块foobar
from anthem.lyrics.modules import uninstall

[...]
@anthem.log
def uninstall_foo(ctx):
    """Get rid of legacy `foo` and `bar`."""
    uninstall(ctx, ['foo', 'bar'])

更新模块上的翻译

以类似的方式,有时您需要更新一组模块上的翻译 - anthem.lyrics.modules.update_translations就在那里等着您:wink

示例与上一个案例类似 - 只需调用不同的方法即可。

更新模块配置

使用此功能,您可以通过Anthem歌曲预先配置模块设置:您只需要一个明确的想法需要做什么,一个配置设置模型的实例(模型名称也行)以及一个技术配置名称与所需值的映射(Python字典形式)。

以下是sale模块配置的简要示例

from anthem.lyrics import settings

[...]
@anthem.log
def define_sale_settings(ctx):
    """Configure `sale` module."""
    model = ctx.env['sale.config.settings']
    # it's okay to use 'sale.config.settings' as a string though
    model = 'sale.config.settings'
    settings(ctx, model, {
        'default_invoice_policy': 'delivery',
        ...: ...,
        'et': 'cetera',
    })

请注意:此函数不会触发设置onchange。

在Marabunta中的使用

当Anthem和Marabunta结合使用时非常强大:您可以使用以下语法在Marabunta的迁移步骤中调用一组歌曲

...
- version: 10.0.1.0.0
  operations:
    pre:
      - anthem songs.upgrade.your_pre_song::main
    post:
      - anthem songs.upgrade.your_post_song::main

使用这种方法,您在由Marabunta提供的常规升级过程中,拥有初始化在实时数据库上的完整Odoo Environment实例的全部功能。

假设您需要在迁移到下一个版本时启用多公司间交易,比如说,10.0.1.1.0。在这种情况下,您首先需要在Python侧创建一个支持这首歌

# songs.upgrade.upgrade_10_0_1_1_0.py
from anthem.lyrics import settings

[...]
@anthem.log
def enable_multicompany(ctx):
    """Set up multicompany."""
    settings(ctx, 'base.config.settings', {
        # enable multicompany as it is
        'group_light_multi_company': True,
        # enable inter-company transactions
        'module_inter_company_rules': True,
    })

 [...]
 @anthem.log
 def main(ctx):
     enable_multicompany(ctx)

然后在迁移步骤中调用它

...
- version: 10.0.1.1.0
  operations:
    post:
      - anthem songs.upgrade.upgrade_10_0_1_1_0::main

嘭!享受您的新多公司设置。

这就完了,朋友们!

感谢阅读。祝您黑客精神愉快,享受您的歌曲创作技巧!

发布历史

未发布

功能

错误修复

改进

文档

构建

0.14.0 (2023-05-16)

错误修复

  • 修复更新_translation函数,并更新black版本22.3.0

  • 将Setuptools版本固定在< 58

  • 修复Odoo 15的环境初始化

  • 修复Odoo 15的add_xmlid

改进

  • 启用Travis-CI为Odoo 14和Odoo 15测试

  • 添加:nuke_translations以允许删除已存在的翻译

0.13.0 (2019-08-29)

功能

  • 重大变更:更改默认overwrite

    lyrics.modules.update_translations为False

  • 支持Odoo SaaS版本

错误修复

  • 使lyrics.modules.update_translations与Odoo >= 11.0兼容

0.12.2 (2019-06-21)

改进

  • 将“tracking_disable=True”作为默认上下文加载CSV(避免创建“mail.message”记录并加快导入过程)

构建

  • 打包:构建通用wheels

0.12.1 (2018-11-09)

文档

  • 改进API文档

构建

  • 现在,当添加标签时,Travis会自动将lib发布到Pypi

0.12.0 (2018-03-19)

功能

  • 添加新的选项--odoo-data-path或环境变量ODOO_DATA_PATH

  • 现在,lyrics.loaders.load_csv方法现在接受一个相对路径附加到新的选项“odoo数据路径”。绝对路径仍然允许。

错误修复

  • lyrics.loaders.update_translations现在已弃用,因为它与lyrics.modules.update_translations重复

0.11.0 (2017-12-22)

功能

  • 使其与Python 3和Odoo 11兼容

构建

  • 切换到unicodecsv而不是自定义代码来处理它

  • 修复测试设置中的波动。由于某些原因,删除了tox。

  • 在构建中添加lint检查

0.10.0 (2017-09-19)

错误修复

  • 禁用Odoo的xmlrpc端口

构建

  • 添加“build-release.sh”脚本,其中包含构建和上传dist文件的命令

0.9.0 (2017-08-21)

功能

  • 新的lyrics:modules.update_translations用于从po文件更新翻译

  • 将lyrics的“uninstall”从uninstaller.uninstall移动到modules.uninstall,以前的路径仍然适用于向后兼容

  • 新的lyrics上下文管理器“records.switch_company”

0.8.0 (2017-07-24)

功能

  • 新的lyrics:定义设置,如处于界面中

  • 添加CSV加载列控制(列白名单和黑名单)

错误修复

  • 修复加载没有行的CSV时的错误

0.7.0 (2017-04-28)

改进

  • 将CSV加载器拆分为函数,以便能够从CSV获取行或将行加载进来,例如在加载之前修改行

  • create_or_update lyrics现在接受一个模型,因此我们可以更改其环境(用户、上下文等)

  • 新的lyrics来卸载模块

0.6.0 (2017-01-18)

功能

  • CSV加载器可以使用模型,以便传递上下文

错误修复

  • 通过安装来自odoo/requirements.txt的eggs来修复测试

0.5.0 (2016-10-12)

功能

  • 支持Odoo 10

  • 允许指定导入文件的编码,默认为utf8

错误修复

  • “records.add_xmlid”lyrics不再在它已存在时失败

0.4.0 (2016-08-19)

功能

  • 新的lyrics:从路径或流中加载CSV

  • 添加新的ctx.log_line以打印一个符合当前缩进的行

改进

  • 为现有的lyrics添加测试

构建

  • 最终绿色构建!

0.3.0 (2016-07-26)

功能

  • 添加–quiet模式

修复

  • 将记录的字符串编码为默认编码或utf8

  • 允许使用Ctrl-c停止anthem。

  • 将openerp的loglevel设置为ERROR,它的日志会弄乱anthem的输出

0.2.0 (2016-07-22)

功能

  • 使用上下文管理器Context.log和装饰器anthem.log,在歌曲中记录描述和计时信息。

    from anthem import log
    
    @log
    def setup_company(ctx):
        """ Setup company """
        # do stuff
        with ctx.log('other stuff'):
            # do other stuff
    
    @log
    def load_data(ctx):
        """ Load data """
        # load
    
    @log
    def main(ctx):
        setup_company(ctx)
        load_data(ctx)

    如果我们运行anthem在main上,我们将得到

    running... main
       running... Setup company
          running... other stuff
          other stuff: 0.850s
       Setup company: 1.100s
       running... Load data
       Load data: 2.900s
    main: 4.000s

0.1.3 (2016-07-07)

修复

  • 修正歌词以创建或更新记录

0.1.2 (2016-07-07)

  • 添加创建xmlid的歌词

  • 添加歌词以创建或更新记录

0.1.1 (2016-06-23)

  • 修复了在不可编辑安装中发生的崩溃。

0.1.0 (2016-06-23)

初始发布。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

anthem-0.14.0.tar.gz (29.5 kB 查看哈希)

上传时间

构建分布

anthem-0.14.0-py2.py3-none-any.whl (19.9 kB 查看哈希)

上传时间 Python 2 Python 3

由以下组织支持