odoo创建一个模块

odoo创建一个模块,创建odoo模块,odoo创建模块,odoo二次开发

启动/停止Odoo服务器

Odoo使用客户端/服务器体系结构,其中客户端是通过RPC访问Odoo服务器的Web浏览器。

尽管可以将支持客户端功能(例如,新数据表示,例如交互式地图)添加到客户端,但是业务逻辑和扩展通常在服务器端执行。

为了启动服务器,只需在外壳中调用命令odoo-bin,并在必要时将完整路径添加到文件中:

通过Ctrl-C从终端单击两次或终止相应的OS进程来停止服务器。

构建一个Odoo模块

服务器扩展和客户端扩展都打包为模块,可以选择将其加载到数据库中

Odoo模块可以向Odoo系统添加全新的业务逻辑,也可以更改和扩展现有的业务逻辑:可以创建一个模块以将您所在国家/地区的会计规则添加到Odoo的通用会计支持中,而下一个模块增加了对车队的实时可视化支持。

因此,Odoo中的所有内容都以模块开始和结束。

模块组成

Odoo模块可以包含许多元素:

业务对象
声明为Python类,Odoo会根据其配置自动保留这些资源
对象视图
定义业务对象的UI显示
资料档案
声明模型元数据的XML或CSV文件:

Web控制器
处理来自网络浏览器的请求
静态网页数据
网络界面或网站使用的图像,CSS或javascript文件

模块结构

每个模块都是模块目录中的一个目录。使用--addons-path 选项指定模块目录。

大多数命令行选项也可以使用配置文件设置

Odoo模块由其清单声明。

模块也是带有文件的 Python包__init__.py,其中包含模块中各种Python文件的导入说明。

例如,如果模块具有单个mymodule.py文件,则 __init__.py 可能包含:

Odoo提供了一种帮助建立新模块的机制,odoo-bin有一个子命令脚手架可以创建一个空模块:

该命令为您的模块创建一个子目录,并自动为模块创建一堆标准文件。它们中的大多数仅包含注释的代码或XML。本教程将说明大多数这些文件的用法。

行使

模块创建

使用上面的命令行创建一个空模块Open Academy,并将其安装在Odoo中。

  1. 调用命令odoo-bin scaffold openacademy addons
  2. 使清单文件适应您的模块。
  3. 不要理会其他文件。

openacademy/__manifest__.py

openacademy/__init__.py

openacademy/controllers/controllers.py

openacademy/demo/demo.xml

openacademy/models/models.py

openacademy/security/ir.model.access.csv

openacademy/views/templates.xml

openacademy/views/views.xml

 

对象关系映射

Odoo的关键组件是ORM层。该层避免了必须手动编写大多数SQL的情况,并提供了可扩展性和安全性服务。(可以编写原始SQL查询,但需要注意,因为它绕过了所有Odoo身份验证和安全机制。)

将业务对象声明为Python类扩展 Model,将其集成到自动化持久性系统中。

可以通过在定义时设置多个属性来配置模型。最重要的属性是_name,是必需的, 它定义了Odoo系统中模型的名称。这是模型的最低限度的完整定义:

模型领域

字段用于定义模型可以存储的内容和位置。字段被定义为模型类的属性:

共同属性

与模型本身非常相似,可以通过将配置属性作为参数传递来配置其字段:

一些属性在所有字段上都可用,这是最常见的属性:

stringunicode,默认值:字段名称)
UI中字段的标签(用户可见)。
requiredbool,默认:False
如果True,该字段不能为空,则它必须具有默认值或在创建记录时始终被赋予一个值。
helpunicode,默认:''
长格式,为用户界面中的用户提供帮助工具提示。
indexbool,默认:False
请求Odoo在列上创建数据库索引

简单的字段

字段分为两大类:“简单”字段是直接存储在模型表中的原子值,而“关系”字段则链接(相同模型或不同模型的)记录。

简单字段的例子是BooleanDateChar

保留栏位

Odoo在所有模型中创建了一些字段(可以禁用某些字段的自动创建)。这些字段由系统管理,不应该写入。如有需要或有用,可以阅读它们:

idId
其模型中记录的唯一标识符。
create_dateDatetime
记录的创建日期。
create_uidMany2one
创建记录的用户。
write_dateDatetime
记录的最后修改日期。
write_uidMany2one
最后修改记录的用户。

特殊字段

默认情况下,Odoo还要求name所有模型上都有一个字段,用于显示和搜索行为。可以通过设置覆盖用于这些目的的字段_rec_name

行使

定义模型

openacademy模块中定义一个新的数据模型Course。一门课程有标题和描述。课程必须有标题。

编辑文件openacademy/models/models.py以包含课程类。

openacademy/models/models.py

资料档案

Odoo是一个高度数据驱动的系统。尽管行为是使用Python代码自定义的 ,但模块的部分值是在它加载时设置的数据中。

有些模块的存在只是为了添加数据到Odoo

通过数据文件(带有<record>元素的XML文件 )声明模块数据。每个<record>元素都会创建或更新数据库记录。

  • model 是记录的Odoo模型的名称。
  • id是一个外部标识符,它允许引用记录(而不必知道其数据库内标识符)。
  • <field>元素具有一个 name,这是模型中字段的名称(例如description)。他们的主体是字段值。

必须在清单文件(即模块模板文件)中声明要加载的数据文件,可以在'data'列表中(始终加载)或在'demo'列表中声明数据文件(仅在演示模式下加载)。

行使

定义演示数据

创建演示数据,并用一些演示课程填充“课程”模型。

编辑文件openacademy/demo/demo.xml以包含一些数据。

openacademy/demo/demo.xml

仅在安装或更新模块时才加载数据文件的内容。

进行一些更改后,请不要忘记使用 odoo-bin -u openacademy将更改保存到数据库中。

操作和菜单

操作和菜单是数据库中的常规记录,通常通过数据文件声明。可以通过三种方式触发动作:

  1. 通过单击菜单项(链接到特定操作)
  2. 通过单击视图中的按钮(如果这些按钮已连接到动作)
  3. 作为对对象的上下文动作

由于菜单的声明有些复杂,因此有一个<menuitem> 快捷方式来声明ir.ui.menu,并将其更轻松地连接到相应的动作。

危险

必须在XML文件中的相应菜单之前声明该操作。

数据文件是按顺序执行的,在id创建菜单之前,动作必须存在于数据库中。

行使

定义新菜单项

定义新的菜单项以访问OpenAcademy菜单项下的课程。用户应该能够:

  • 显示所有课程的清单
  • 创建/修改课程
  1. openacademy/views/openacademy.xml通过动作创建并触发该动作的菜单
  2. 将它添加到data列表openacademy/__manifest__.py

openacademy/__manifest__.py

openacademy/views/openacademy.xml

基本观点

视图定义了模型记录的显示方式。每种视图类型都代表一种可视化模式(记录列表,它们的聚合图等等)。可以通过视图的类型(例如,合作伙伴列表)来通用地请求视图,也可以通过其ID来请求视图。对于一般请求,将使用具有正确类型和最低优先级的视图(因此,每种类型的最低优先级视图是该类型的默认视图)。

视图继承允许更改在其他地方声明的视图(添加或删除内容)。

通用视图声明

视图被声明为模型的记录ir.ui.view。视图类型由arch字段的根元素隐含:

危险

该视图的内容是XML。

因此arch必须将该字段声明为type="xml"才能正确解析。

树视图

树视图(也称为列表视图)以表格形式显示记录。

他们的根本要素是<tree>。树形视图的最简单形式只是列出了要在表中显示的所有字段(每个字段作为一列):

form视图

表单用于创建和编辑单个记录。

他们的根本要素是<form>。它们由高级结构元素(组-group,笔记本-notebook)和交互元素(按钮和字段-field)组成:

行使

使用XML自定义表单视图

为课程对象创建自己的表单视图。显示的数据应为:课程的名称和说明。

openacademy/views/openacademy.xml

行使

笔记本 – 标签<notebook>

在“课程表”视图中,将“说明”字段放在选项卡下,这样以后可以轻松添加包含其他信息的其他选项卡。

修改“课程”表单视图,如下所示:

openacademy/views/openacademy.xml

表单视图也可以使用纯HTML以获得更灵活的布局:

搜索视图

搜索视图自定义与列表视图(和其他聚合视图)关联的搜索字段。它们的根元素是,<search>并且由定义可以在哪些字段上搜索的字段组成:

如果该模型不存在搜索视图,则Odoo会生成一个仅允许在name字段中搜索的视图。

行使

搜索课程

允许根据标题或描述搜索课程。

openacademy/views/openacademy.xml

模型之间的关系

来自模型的记录可以与来自另一个模型的记录相关。例如,销售订单记录与包含客户数据的客户记录相关;它也与其销售订单项记录有关。

行使

创建会话模型

对于模块开放学院,我们考虑了模型的会话:会话是在给定时间教了给观众一个疗程的发生。

对于Open Academy模块(openacademy),我们考虑了一个会话模型。会话是发生在给定的时间为给定的听众讲授的课程的。

创建会话模型。会话具有名称,开始日期,持续时间和座位数。添加一个动作和一个菜单项以显示它们。通过菜单项使新模型可见。

  1. openacademy/models/models.py中创建会话类
  2. 添加对openacademy/view/openacademy.xml中会话对象的访问权限。

openacademy/models/models.py

openacademy/views/openacademy.xml

digits=(6, 2)指定浮点数的精度:6是数字的总数,而2是逗号后的数字。请注意,它导致逗号之前的数字位数最大为4

关系领域

关系字段链接相同模型(层次结构)或不同模型之间的记录。

关系字段类型为:

Many2one(other_model, ondelete='set null')
与其他对象的简单链接:

也可以看看

外键

One2many(other_model, related_field)
虚关系,与Many2one(多对一)相反。One2many充当记录的容器,访问它会导致一个(可能是空的)记录集:

危险

因为One2many是一个虚拟关系,所以在另一个模型中必须有一个Many2one字段 other_model,其名称必须related_field

Many2many(other_model)
双向多重关系,一侧的任何记录都可以与另一侧的任何数量的记录相关。表现为记录的容器,对其进行访问也会导致记录集可能为空:

行使

一对多关系

使用many2one,修改“课程”和“会话”模型以反映它们与其他模型的关系:

  • 课程有负责任的用户;该字段的值是内置模型的记录res.users
  • 一次会议有一位老师; 该字段的值是内置模型的记录res.partner
  • 会议与课程有关; 该字段的值是模型的记录,openacademy.course是必填项。
  • 调整视图。
  1. 将相关Many2one字段添加到模型;
  2. 在视图中添加它们。

openacademy/models/models.py

openacademy/views/openacademy.xml

行使

多对一关系

利用逆向关系字段one2many对模型进行修改,以反映课程与会话之间的关系。

  1. 修改Course类;
  2. 在课程表视图中添加字段。

openacademy/models/models.py

openacademy/views/openacademy.xml

行使

多个多对多关系

使用多个关系字段,修改会话模型以将每个会话与一组参与者相关联。参加者将由合作伙伴记录代表,因此我们将涉及内置模型res.partner。相应地调整视图。

使用关系字段many2many,修改会话模型,将每个会话与一组参与者关联起来。参会者将由合作伙伴记录表示,因此我们将关联到内置模型res.partner。相应地调整视图。

  1. 修改Session类;
  2. 在表单视图中添加字段。

openacademy/models/models.py

openacademy/views/openacademy.xml

遗产

模型继承

Odoo提供了两种继承机制,以模块化方式扩展现有模型。

第一个继承机制允许模块修改另一个模块中定义的模型的行为:

  • 向模型添加字段,
  • 覆盖模型上字段的定义,
  • 向模型添加约束,
  • 向模型添加方法
  • 覆盖模型上的现有方法。

第二种继承机制(委托)允许将模型的每个记录链接到父模型中的记录,并提供对父记录的字段的透明访问。

inheritance_methods

也可以看看

  • _inherit
  • _inherits

查看继承

Odoo不需要修改现有的视图(通过覆盖它们),它提供了视图继承,在根视图之上应用子“扩展”视图,并且可以从父视图添加或删除内容。

扩展视图使用inherit_id字段引用其父视图,而不是单个视图,它的arch字段由任意数量的xpath元素组成,这些 元素选择和更改其父视图的内容:

expr
在父视图中选择单个元素的XPath表达式。如果不匹配任何元素或匹配多个元素,则会引发错误
position
应用于匹配元素的操作:

inside
xpath在匹配元素的末尾附加的主体
replace
xpath的主体替换匹配的元素,用$0原始元素替换新主体中出现的任何节点
before
xpath的主体作为兄弟元素插入到匹配的元素之前
after
xpath的主体作为兄弟元素插入到匹配的元素之后
attributes
使用xpath主体中的特殊的attribute元素修改匹配元素的属性

匹配单个元素时,position可以直接在要查找的元素上设置属性。下面的两个继承将给出相同的结果。

行使

更改现有内容

  • 使用模型继承,修改现有的Partner 模型以添加一个instructor布尔字段和一个多对多字段,该字段对应于会话-伙伴关系
  • 使用视图继承,在伙伴表单视图中显示此字段

这是引入开发人员模式检查视图,找到其外部ID以及放置新字段的位置的机会。

  1. 创建一个文件openacademy/models/partner.py并将其导入 __init__.py
  2. 创建一个文件openacademy/views/partner.xml并将其添加到 __manifest__.py

openacademy/__init__.py

openacademy/__manifest__.py

openacademy/partner.py

openacademy/views/partner.xml

在Odoo中,搜索域是对记录条件进行编码的值。域是用于选择模型记录子集的条件列表。每个条件都是一个三元组,其中包含一个字段名称,一个运算符和一个值。

例如,当在产品模型上使用时,以下域会选择单价超过1000的所有服务

默认情况下,标准与隐式AND组合。逻辑运算符 &(AND),|(OR)和!(NOT)可用于显式组合条件。它们在前缀位置使用(运算符插入在其参数之前而不是参数之间)。例如,选择“服务单价不在1000到2000之间的产品”:

一个domain参数可以被添加到相关的领域,限制有效记录试图选择在客户端界面记录时的关系。

行使

关系字段上的域

当为Session选择讲师时,只有讲师(讲师设置为True的合作伙伴)应该是可见的。

openacademy/models/models.py

声明为文本列表的域在服务器端计算,不能引用右侧的动态值。在客户端计算声明为字符串的域,并允许在右侧计算字段名称。

行使

更复杂的域

创建新的合作伙伴类别教师/一级教师/二级。会话的讲师可以是任何级别的讲师或老师。

  1. 修改会话模型的域
  2. 进行修改openacademy/view/partner.xml以访问 合作伙伴类别

openacademy/models/models.py

openacademy/views/partner.xml

计算字段和默认值

到目前为止,字段已直接存储在数据库中或直接从数据库中检索。也可以计算字段。在这种情况下,不会从数据库中检索字段的值,而是通过调用模型的方法即时计算出该值。

要创建计算字段,请创建字段并将其属性compute设置为方法名。计算方法应该简单地在self中的每个记录上设置要计算的字段值。

危险

self 是一个集合

对象self是一个记录集,即记录的有序集合。它支持集合上的标准Python操作(例如 len(self)iter(self))以及额外的集合操作(​​例如)recs1 + recs2

self上迭代会一个接一个地给出记录,其中每个记录本身就是一个大小为1的集合。您可以使用点符号访问/分配单个记录上的字段,比如record.name

依存关系

计算字段的值通常取决于计算记录上的其他字段的值。ORM希望开发人员使用装饰器depends()指定对计算方法的依赖关系。ORM使用给定的依赖项来触发字段的重新计算,每当它的一些依赖项被修改时:

行使

计算字段

  • 将占用席位的百分比添加到会话模型中
  • 在树视图和表单视图中显示该字段
  • 将该字段显示为进度条
  1. 会话添加计算字段
  2. 在“会话”视图中显示该字段:

openacademy/models/models.py

openacademy/views/openacademy.xml

默认值

可以给任何字段一个默认值。在字段定义中,添加选项default=X,其中X要么是一个Python文字值(布尔值、整数、浮点值、字符串),要么是一个获取记录集并返回值的函数:

该对象self.env可以访问请求参数和其他有用的东西:

  • self.env.cr还是self._cr数据库游标对象;或者 它用于查询数据库
  • self.env.uid还是self._uid当前用户的数据库ID
  • self.env.user 是当前用户的记录
  • self.env.context还是self._context上下文字典
  • self.env.ref(xml_id) 返回与XML id对应的记录
  • self.env[model_name] 返回给定模型的实例

行使

活动对象–默认值

  • 将start_date默认值定义为今天(请参阅参考资料 Date)。
  • active在“会话”类中添加一个字段,并将会话默认设置为活动状态。

openacademy/models/models.py

openacademy/views/openacademy.xml

Odoo具有内置规则,可以将active字段设置为False不可见来进行记录。

不断变化

“ onchange”机制为客户端界面提供了一种方法,只要用户在字段中填写了值,便无需用户将任何内容保存到数据库即可更新表单。

例如,假设一个模型有三个字段amountunit_priceprice,并且您想在修改任何其他字段时更新表单上的价格。为此,请定义一个方法,该方法在self表单视图中表示记录,并用其修饰onchange() 以指定必须在哪个字段上触发记录。您所做的任何更改 self都会反映在表格上。

对于计算字段,onchange可以通过使用“会话”表单来看到有价值的行为:更改席位或参与者的数量,并taken_seats会自动更新进度栏。

行使

警告

添加一个明确的onchange来警告无效值,例如席位数为负数,或参与者多于席位。openacademy/models/models.py

模型约束

Odoo提供了两种方法来设置自动验证的不变量: Python constraintsSQL constraints

Python约束被定义为修饰了constrains()的方法,并在记录集上调用。装饰器指定约束中涉及哪些字段,以便在修改其中一个字段时自动计算约束。如果不满足其不变性,则该方法将会抛出异常:

行使

添加Python约束

添加一个约束来检查讲师是否出现在他/她自己会议的与会者中。

openacademy/models/models.py

SQL约束是通过模型属性_sql_constraints定义的。后者被分配给一个字符串的三组列表(namesql_definitionmessage),其中name是一个有效的SQL约束名,sql_definition是一个table_constraint表达式,并且message是错误消息。

行使

添加SQL约束

PostgreSQL的文档的帮助下,添加以下约束:

  1. 检查课程说明和课程标题是否不同
  2. 使课程名称唯一

openacademy/models/models.py

行使

练习6-添加重复选项

由于我们为课程名称的唯一性添加了一个约束,因此无法再使用“重复”功能(表格‣重复)。

重新实现自己的“copy”方法,该方法可以复制“Course”对象,将原始名称更改为“ [原始名称]的副本”。openacademy/models/models.py

进阶检视

树视图

树视图可以采用补充属性来进一步自定义其行为:

decoration-{$name}
允许根据相应记录的属性更改行文本的样式。

值是Python表达式。对于每条记录,将使用记录的属性作为上下文值评估表达式,如果值为true,则将相应样式应用于行。以下是上下文中可用的其他一些值:

  • uid:当前用户的ID,
  • today:当前本地日期,形式为字符串YYYY-MM-DD
  • now:与today当前时间的增加相同。该值的格式为YYYY-MM-DD hh:mm:ss

{$name}可以是bffont-weight: bold), (it ),font-style: italic或任何自举上下文颜色dangerinfomutedprimarysuccesswarning)。

editable
无论是"top""bottom"。使树视图可就地编辑(而不是必须通过表单视图),该值是新行出现的位置。

行使

列表着色

修改会话树视图,使持续时间少于5天的会话显示为蓝色,持续时间超过15天的会话显示为红色。

修改会话树视图:

openacademy/views/openacademy.xml

行事历

将记录显示为日历事件。它们的根元素是<calendar>,最常见的属性是:

color
用于颜色分割的字段名称。颜色会自动分配给事件,但相同颜色段(其@color字段具有相同值的记录)中的事件将被赋予相同的颜色。
date_start
记录中包含事件开始日期/时间的字段
date_stop (可选的)
记录的字段,其中包含事件的结束日期/时间
string
记录的字段以定义每个日历事件的标签

行使

日历视图

将日历视图添加到会话模型,使用户可以查看与Open Academy相关的事件。

  1. 添加从start_dateduration计算的end_date字段。
    逆函数使字段可写,并允许在日历视图中移动会话(通过拖放)。
  2. 将日历视图添加到会话模型
  3. 并将日历视图添加到会话模型的操作中

openacademy/models/models.py

openacademy/views/openacademy.xml

搜索视图

搜索视图<field>元素可以具有@filter_domain,以覆盖为在给定字段上进行搜索而生成的域。在给定的域中, self代表用户输入的值。在下面的例子中,它是用来在两个字段进行搜索namedescription

搜索视图还可以包含<filter>元素,用作预定义搜索的切换。筛选器必须具有以下属性之一:

domain
将给定的域添加到当前搜索中
context
在当前搜索中添加一些上下文;使用键group_by将结果按给定的字段名称分组

要在操作中使用非默认搜索视图,应使用search_view_id操作记录的字段将其链接 。

该操作还可以通过context字段设置搜索字段的默认值:search_default_field_name表单的上下文键将使用提供的值初始化field_name。搜索过滤器必须有一个可选的@name才能有一个默认值,并表现为布尔值(它们只能在默认情况下启用)。

行使

搜索视图

  1. 添加一个按钮以在课程搜索视图中过滤当前用户负责的课程。使其默认为选中状态。
  2. 添加按钮以按负责任的用户对课程进行分组。

openacademy/views/openacademy.xml

甘特

警告

甘特图视图需要企业版版本中存在的web_gantt模块 。

水平条形图通常用于显示项目计划和进度,其根元素为<gantt>

行使

甘特图

添加一个甘特图,使用户能够查看链接到Open Academy模块的会话计划。这些课程应由讲师分组。

  1. 添加甘特图视图的定义,并将甘特图视图添加到 会话模型的操作中

openacademy/views/openacademy.xml

图形视图

图形视图允许对模型进行汇总概述和分析,其根元素为<graph>

透视<pivot>表(元素)是一个多维表,允许选择文件管理器和维度,以获取正确的聚合数据集,然后再移至更具图形化的概览。数据透视图与图视图共享相同的内容定义。

图形视图具有4种显示模式,使用@type属性可以选择默认模式 。

条形(默认)
在条形图中,第一维用于定义水平轴上的组,其他维用于定义每个组内的聚合条。

默认情况下,并排显示的条形图可以通过 @stacked="True"<graph>

线
二维折线图
馅饼
二维派

图形视图包含<field>带有强制@type属性的值:

row (默认)
该字段应默认汇总
measure
该字段应汇总而不是分组

警告

图形视图对数据库值执行聚合,但不适用于非存储的计算字段。

行使

图形视图

在“会话”对象中添加一个“图形”视图,该视图以条形图的形式显示每个课程的参加人数。

  1. 将与会者人数添加为存储的计算字段
  2. 然后添加相关视图

openacademy/models/models.py

openacademy/views/openacademy.xml

看板

用于组织任务,生产过程等……其根本要素是 <kanban>

看板视图显示了一组可能按列分组的卡片。每张卡代表一条记录,每列代表一个聚合字段的值。

例如,项目任务可以按阶段(每个列是一个阶段)或负责任的方式(每个列是用户)进行组织,等等。

看板视图将每张卡的结构定义为表单元素(包括基本HTML)和QWeb的混合

行使

看板视图

添加一个看板视图,该视图显示按课程分组的会话(因此,列就是课程)。

  1. 将一个整数color字段添加到会话模型
  2. 添加看板视图并更新操作

openacademy/models/models.py

openacademy/views/openacademy.xml

安全

必须配置访问控制机制以实现一致的安全策略。

基于组的访问控制机制

在模型上将组创建为常规记录res.groups,并通过菜单定义授予菜单访问权限。但是,即使没有菜单,也仍然可以间接访问对象,因此必须为组定义实际的对象级别权限(读取,写入,创建,取消链接)。它们通常是通过CSV文件插入模块内部的。也可以使用字段的groups属性来限制对视图或对象上特定字段的访问。

访问权限

访问权限定义为模型的记录ir.model.access。每个访问权限都与一个模型、一个组(或对于全局访问没有一个组)和一组权限相关联:读取,写入,创建,取消链接。此类访问权限通常由以其型号命名的CSV文件创建 ir.model.access.csv

行使

通过Odoo界面添加访问控制

创建一个新用户“ John Smith”。然后创建一个对会话模型具有读取访问权限的组“ OpenAcademy /会话读取” 。

  1. 通过 设置‣用户‣用户,创建新用户John Smith
  2. session_read通过 “设置”‣“用户”‣“组”创建一个新组,它应该对“会话”模型具有读取权限
  3. 编辑约翰·史密斯John Smith)以使他们成为session_read
  4. John Smith身份登录以检查访问权限是否正确

行使

通过模块中的数据文件添加访问控制

使用数据文件

  • 创建一个具有对所有OpenAcademy模型的完全访问权限的组OpenAcademy/Manager
  • 使会话课程对所有用户可读
  1. 创建一个新文件openacademy/security/security.xml来保存OpenAcademy Manager组
  2. 编辑openacademy/security/ir.model.access.csv具有模型访问权限的文件
  3. 最后更新openacademy/__manifest__.py以向其中添加新的数据文件

openacademy/__manifest__.py

openacademy/security/ir.model.access.csv

openacademy/security/security.xml

记录规则

记录规则将访问权限限制为给定模型的记录的子集。规则是模型的记录ir.rule,并且与模型,多个组(many2many字段),应用限制的权限以及域相关联。域指定访问权限限制到哪些记录。

这是一个规则示例,可防止删除状态不佳的潜在客户cancel。请注意,该字段的值groups必须遵循与write()ORM方法相同的约定。

行使

记录规则

为模型课程和“OpenAcademy / Manager”组添加一个记录规则,限制对课程负责人的写(write)和断开访问(unlink)。如果一个课程没有负责人,组的所有用户必须能够修改它。

在中创建新规则openacademy/security/security.xml

openacademy/security/security.xml

奇才队

向导通过动态表单描述与用户(或对话框)的交互会话。向导只是一个模型,它扩展了类TransientModel而不是Model。类TransientModel扩展了Model并重用了它所有现有的机制,有以下特点:

  • 向导记录并非永久性的;一定时间后,它们会自动从数据库中删除。这就是为什么它们被称为 瞬态的原因
  • 向导记录可以通过关系字段(many2one或many2many)引用常规记录或向导记录,但是常规记录不能通过many2one字段引用向导记录。

我们想要创建一个向导,该向导允许用户为特定会话或一次会话列表创建与会者。

行使

定义向导

创建一个向导模型,该模型与会话 模型具有多对一关系,与伙伴模型具有多对多关系。

添加一个新文件openacademy/wizard.pyopenacademy/__init__.py

openacademy/wizard.py

openacademy/security/ir.model.access.csv

启动向导

向导只是将目标字段设置为新值的窗口操作,它将在单独的对话框中打开视图(通常是form)。该动作可以通过菜单项触发,但通常是通过一个按钮触发。

启动向导的另一种方法是通过树或窗体视图的“操作”菜单。这是通过binding_model_id操作字段完成的。设置此字段将使该动作出现在该动作“绑定”到的模型的视图上。

向导使用常规视图和按钮时,通常单击表单中的任何按钮会先保存表单,然后关闭对话框。因为这在向导中通常是不可取的,所以可以使用特殊属性,该属性special="cancel"立即关闭向导而不保存表单。

行使

启动向导

  1. 定义向导的表单视图。
  2. 添加操作以在会话模型的上下文中启动它。
  3. 在向导中为会话字段定义默认值;使用context参数self._context检索当前会话。

openacademy/wizard.py

openacademy/views/openacademy.xml

行使

注册参加者

在向导中添加按钮,并实现将与会者添加到给定会话的相应方法。

openacademy/views/openacademy.xml

openacademy/wizard.py

行使

注册参加多个会议的与会者

修改向导模型,以便可以将与会者注册到多个会话。

openacademy/views/openacademy.xml

openacademy/wizard.py

国际化

通过使用名为LANG.po的文件,每个模块都可以在i18n目录中提供自己的翻译,其中LANG是语言的语言环境代码,或语言和国家/地区组合(如果它们不同)(例如pt.po或pt_BR.po)。Odoo会自动为所有启用的语言加载翻译。开发人员在创建模块时始终使用英语,然后使用Odoo的gettext POT导出功能(设置‣翻译‣导入/导出‣导出翻译而不指定语言)导出模块术语,以创建模块模板POT文件,然后导出已翻译的PO文件。许多IDE都有用于编辑和合并PO/POT文件的插件或模式。

由Odoo生成的Portable Object文件在Transifex上发布 ,使翻译软件变得容易。

默认情况下,Odoo的POT导出仅提取XML文件内的标签或Python代码中的字段定义内的标签,但是任何Python字符串都可以通过将其包围在函数中来进行翻译odoo._() (例如_("Label")

行使

翻译模块

为您的Odoo安装选择第二种语言。使用Odoo提供的功能来翻译您的模块。

  1. 建立目录 openacademy/i18n/
  2. 您需要激活开发人员模式才能访问下面提到的菜单( 设置‣激活开发人员模式 )
  3. 安装所需的任何语言( 设置‣翻译‣语言)
  4. 生成缺少的术语(设置‣翻译‣应用程序术语‣生成缺少的术语)
  5. 通过导出(设置‣翻译‣导入/导出‣导出翻译)来创建模板翻译文件, 而无需指定语言,保存在 openacademy/i18n/
  6. 通过导出(设置‣翻译‣导入/导出‣导出翻译)并指定语言来创建翻译文件 。保存在 openacademy/i18n/
  7. 打开导出的翻译文件(使用基本文本编辑器或专用的PO文件编辑器(例如POEdit)并翻译缺少的术语
  8. models.py中,为函数添加导入语句, odoo._并将缺少的字符串标记为可翻译
  9. 重复步骤3-6

openacademy/models.py

报告中

印刷报告

Odoo使用基于QWebTwitter BootstrapWkhtmltopdf的报告引擎。

报告是两个元素的组合:

  • 一个ir.actions.report为报告配置各种基本参数(默认类型,是否应在生成报告后将报告保存到数据库中,…)

    由于它是标准操作,因此与Wizards(向导)一样 ,通常将报告作为上下文项添加到树上和/或通过binding_model_id字段形成要报告的模型的视图,通常很有用的。

    在这里,我们还使用了binding_type,以使报表位于报表上下文菜单中,而不是动作菜单中。没有技术差异,但是将元素放在正确的位置会对用户有所帮助。

  • 实际报告的标准QWeb视图

    标准渲染上下文提供了许多元素,其中最重要的是:

    docs
    打印报告的记录
    user
    用户打印报告

由于报告是标准网页,因此可以通过URL使用它们,并且可以通过此URL操作输出参数,例如,可以通过http://localhost:8069/report/html/account.report_invoice/1获得Invoice报告 的HTML版本。(如果account已安装)和通过http://localhost:8069/report/pdf/account.report_invoice/1的PDF版本 。

危险

如果您的PDF报告似乎缺少样式(即,出现了文本,但样式/布局与html版本不同),则可能是您的wkhtmltopdf进程无法访问Web服务器下载它们。

如果检查服务器日志,并在生成PDF报告时发现CSS样式没有下载,则肯定是问题所在。

wkhtmltopdf过程将使用web.base.url系统参数的根路径到所有链接的文件,但此参数是每个管理员的登录时间自动更新。如果你的服务器所在背后的一些类型的代理,这可能是不可到达的。您可以通过添加以下系统参数之一来解决此问题:

  • report.url,指向您的服务器可以访问的URL(可能http://localhost:8069是类似的URL )。它将仅用于此特定目的。
  • web.base.url.freeze设置为时True,将停止对web.base.url的自动更新。

行使

为会话模型创建报告

对于每个会话,它应该显示会话的名称,其开始和结束,并列出该会话的参与者。openacademy/__manifest__.py

openacademy/reports.xml

仪表板

行使

定义仪表板

定义一个仪表板,其中包含您创建的图形视图,会话日历视图和课程列表视图(可切换到表单视图)。该仪表板应该通过菜单中的菜单项可用,并且在选择OpenAcademy主菜单后自动显示在Web客户端中。

  1. 创建一个文件openacademy/views/session_board.xml。它应包含面板视图,该视图中引用的操作,打开仪表板的操作以及对主菜单项的重新定义,以添加仪​​表板操作。
    可用仪表盘样式是11-11-22-11-1-1
  2. 更新openacademy/__manifest__.py以引用新数据文件

openacademy/__manifest__.py

openacademy/views/session_board.xml

网页服务

Web服务模块为所有Web服务提供一个公共接口:

  • XML-RPC
  • JSON-RPC

也可以通过分布式对象机制访问业务对象。它们都可以通过带有上下文视图的客户端界面进行修改。

Odoo可通过XML-RPC/JSON-RPC接口访问,该接口存在多种语言的库。

XML-RPC库

以下示例是一个Python 3程序,该程序与具有该库的Odoo服务器进行交互xmlrpc.client

行使

向客户端添加新服务

编写一个Python程序,该程序能够将XML-RPC请求发送到运行Odoo的PC(您或您的讲师的)。该程序应显示所有会议及其相应的座位数。它还应为其中一门课程创建新的会话。

可以使用名称来查找课程,而不是使用硬编码的课程ID:

JSON-RPC库

以下示例是一个Python 3程序,该程序使用标准Python库urllib.requestjson与Odoo服务器进行交互。本示例假定已安装了生产力(Productivity应用(note):

可以轻松地将示例从XML-RPC修改为JSON-RPC。

有许多使用各种语言编写的高级API可以访问Odoo系统,而无需显式地通过XML-RPC或JSON-RPC,例如:

odoo创建一个模块,创建odoo模块,odoo创建模块,odoo二次开发

 

承接各种网站开发与修改、爬虫、数据采集分析、小程序等任务

Html+Css+JS+PHP+Nodejs+Python

专治网站各种不服

一起探讨,互相学习,共同进步!有事儿您说话。

This entry was posted in Odoo and tagged by 织梦先生. Bookmark the permalink.