菜单和操作

菜单

这有一个菜单项的模板:

<menuitem id="menuitem_id"
          name="Position/Of/The/Menu/Item/In/The/Tree"
          action="action_id"
          icon="NAME_FROM_LIST"
          groups="groupname"
          sequence="<integer>"/>

其中

  • id用来在菜单项表中区别不同的菜单,这个标识符是唯一的,必须的字段。
  • name定义了该菜单在menu层次中的位置。元素间通过斜杠“/”来划分。菜单名称中没有斜杠的是顶级菜单项。这个字段是必须的。
  • action指定了动作的标识符,这个动作必须在action表(ir.actions.act_window)中定义过了。我们注意到这个字段不是必须的:你可以定义没有相应动作的菜单项。当我们为菜单项定义自制的按钮,就像文件夹的功能时,这个没有动作的菜单是有用的。
  • icon指定了菜单项将会使用哪个按钮。默认的是STOCK_OPEN.
    • 可用的按钮有: STOCK_ABOUT, STOCK_ADD, STOCK_APPLY, STOCK_BOLD, STOCK_CANCEL, STOCK_CDROM, STOCK_CLEAR, STOCK_CLOSE, STOCK_COLOR_PICKER, STOCK_CONNECT, STOCK_CONVERT, STOCK_COPY, STOCK_CUT, STOCK_DELETE, STOCK_DIALOG_AUTHENTICATION, STOCK_DIALOG_ERROR, STOCK_DIALOG_INFO, STOCK_DIALOG_QUESTION, STOCK_DIALOG_WARNING, STOCK_DIRECTORY, STOCK_DISCONNECT, STOCK_DND, STOCK_DND_MULTIPLE, STOCK_EDIT, STOCK_EXECUTE, STOCK_FILE, STOCK_FIND, STOCK_FIND_AND_REPLACE, STOCK_FLOPPY, STOCK_GOTO_BOTTOM, STOCK_GOTO_FIRST, STOCK_GOTO_LAST, STOCK_GOTO_TOP, STOCK_GO_BACK, STOCK_GO_DOWN, STOCK_GO_FORWARD, STOCK_GO_UP, STOCK_HARDDISK, STOCK_HELP, STOCK_HOME, STOCK_INDENT, STOCK_INDEX, STOCK_ITALIC, STOCK_JUMP_TO, STOCK_JUSTIFY_CENTER, STOCK_JUSTIFY_FILL, STOCK_JUSTIFY_LEFT, STOCK_JUSTIFY_RIGHT, STOCK_MEDIA_FORWARD, STOCK_MEDIA_NEXT, STOCK_MEDIA_PAUSE, STOCK_MEDIA_PLAY, STOCK_MEDIA_PREVIOUS, STOCK_MEDIA_RECORD, STOCK_MEDIA_REWIND, STOCK_MEDIA_STOP, STOCK_MISSING_IMAGE, STOCK_NETWORK, STOCK_NEW, STOCK_NO, STOCK_OK, STOCK_OPEN, STOCK_PASTE, STOCK_PREFERENCES, STOCK_PRINT, STOCK_PRINT_PREVIEW, STOCK_PROPERTIES, STOCK_QUIT,STOCK_REDO, STOCK_REFRESH, STOCK_REMOVE, STOCK_REVERT_TO_SAVED, STOCK_SAVE, STOCK_SAVE_AS, STOCK_SELECT_COLOR, STOCK_SELECT_FONT, STOCK_SORT_ASCENDING, STOCK_SORT_DESCENDING, STOCK_SPELL_CHECK, STOCK_STOP, STOCK_STRIKETHROUGH, STOCK_UNDELETE, STOCK_UNDERLINE, STOCK_UNDO, STOCK_UNINDENT, STOCK_YES, STOCK_ZOOM_100, STOCK_ZOOM_FIT, STOCK_ZOOM_IN, STOCK_ZOOM_OUT, terp-account, terp-crm, terp-mrp, terp-product, terp-purchase, terp-sale, terp-tools, terp-administration, terp-hr, terp-partner, terp-project, terp-report, terp-stock
  • groups 指定哪个组的用户可以看到这个菜单(例如:groups=”admin”)。想要得到更多信息可以看“Management of Access Rights”。多个组的话可以用逗号分开(如:groups=”admin,user”)。
  • sequence 是个整数类型,用于为菜单项中的菜单排序。更高的sequence number在菜单项的更下面。这个字段不是必须的:如果sequence没有指定值,菜单项将会得到一个默认的数值10。有相同数值的菜单项按照创建顺序来排序(_order = “sequence,id“)。

例如:

在server/bin/addons/sale/sale_view.xml中,我们有:

<menuitem name="Sales Management/Sales Order/Sales Order in Progress" id="menu_action_order_tree4" action="action_order_tree4"/>

想要更改菜单项的图标:

* Highlight the menu with the icon you want to change.
* Select the "Switch to list/form" option from the "Form" menu. This will take you to the Menu editor.
* From here you can change the icon of the selected menu.

动作

介绍

actions定义系统的行为来响应用户的动作;登录的新用户,双击invoice,点击动作按钮,...

简单的动作也有很多类型:

  • Window: 打开一个新窗口
  • Report: 打印报表
    o Custom Report: 自定义报表 o RML Report: XSL:RML 报表
  • Wizard: 开始向导
  • Execute: server端方法的执行。
  • Group: 在一个组中集合多个动作

发生动作的以下事件:

  • 用户连接,
  • 用户双击菜单项,
  • 用户点击图标’print’和’action’.

事件样例

在OpenERP中,所有的动作都被描述了而没有配置。两个例子:

  • 双击菜单项时打开窗口
  • 用户连接

打开菜单

当用户打开菜单选择 “Operations > Partners > Partners Contact”,下一步是给用户该动作承诺的信息。

  1. 在IR中查询动作
  2. 执行动作
    1.如果这个动作类型是打开新窗口,它显示给用户:必须对选定的对象打开这个新窗口,并且它显示视图(form or list)和使用的文件。 2. 用户要求这个对象返回必要的信息来显示在表单视图中,字段的描述和XML视图

用户登陆

当一个新用户连接到服务器端时,客户端会搜索用于显示给该用户的首页动作。一般情况下,这个动作是:在‘Operations’部分打开菜单。

步骤是:

  1. 阅读用户文件来获取ACTION_ID
  2. 读取这个动作并且执行它

The fields

Action Name
The action name
Action Type
一直是’ir.action.act_window’
View Ref
用于显示对象的视图
Model
对象公布的model
Type of View
视图类型(Tree/Form)
Domain Value
在视图中减少可视数据的domain

The view

view描述表单视图或是数据列表如何显示在屏幕上。视图可以是Form类型或是Tree类型,这个取决于他们显示一个表单来编辑还是列表来看所有数据。

有动作打开‘Tree’模式时,一个表单就会被调用。表单视图可以从列表形式中打开。

The domain

这个参数让你可以控制在搜索视图中,哪些资源可以显示。

例如,在invoice这个实例中,你可以定义一个动作,这个动作用于打开发票没有付费的视图。

domain用Python写的,是元组的列表。这个元组有三个元素:

  • 测试必须完成的字段
  • 用于测试的运算符(<, >, =, like)
  • 已测试的值

如果你想要获得‘Draft’发票,使用以下的domain:[(‘state’,’=’,’draft’)]。

在简单的视图中,domain定义了资源,这个资源是树根(the roots of the tree)。而对于其他的资源,如果用户开发树的分支,那么即使他们不在domain中,也会被显示出来。

Window Action

动作在 Client Action 章节已经解释的很多了。这有一个动作XML记录的模板。

<record model="ir.actions.act_window" id="action_id_1">
    <field name="name">action.name</field>
    <field name="view_id" ref="view_id_1"/>
    <field name="domain">["list of 3-tuples (max 250 characters)"]</field>
    <field name="context">{"context dictionary (max 250 characters)"}</field>
    <field name="res_model">Open.object</field>
    <field name="view_type">form|tree</field>
    <field name="view_mode">form,tree|tree,form|form|tree</field>
    <field name="usage">menu</field>
    <field name="target">new</field>
</record>

其中

  • id是动作在表格“ir.actions.act_window”中的标识符。它必须是唯一的。
  • name是动作的名称(这个字段是必须的)
  • view_id是当动作被激活时要显示的视图的名称。如果这个字段没有定义,拥有最高优先级的(如果两个视图有相同的优先级,那么先定义的一类视图就会被使用。),并且与对象res_model相关的一类视图就会被使用。
  • domain是约束条件的列表,用于筛选搜索结果使更少的记录显示在视图上。约束条件列表用AND连接在一起:当所有的约束条件都满足时,表格记录就会显示在视图上。
  • context是显示在视图中的上下文字典,当动作被激活时它就会打开。在XML文件中上下文字典的声明和Python字典一样有相同的语法。想要知道更多关于上下文字典的信息可以看” The context Dictionary”这个章节。
  • res_model是这个动作发生的对象的名称。
  • view_type当某个动作必须打开一个新的表单视图时,这个字段的值是form,当某个动作必须打开一个新的列表视图时,这个字段的值是tree。
  • view_mode仅在view_type值是form时起作用,忽略其他的情况。四种可能的值是:
    • form,tree: 这个视图开始时显示为表单视图,当点击“alternate view button”时,列表视图就会显示。
    • tree,form: 这个视图开始时显示为列表视图,当点击“alternate view button”时,表单视图就会显示。
    • form: 这个视图显示为表单视图,不可能显示为列表视图。
    • tree: 这个视图显示为列表视图,不可能显示为表单视图。

(version 5 introduced graph and calendar views)

  • usage is used [+ TODO +]
  • target:视图会在新窗口打开,就像wizard似的。
  • context会传递给动作本身,并加入到全局上下文中。
<record model="ir.actions.act_window" id="a">
    <field name="name">account.account.tree1</field>
    <field name="res_model">account.account</field>
    <field name="view_type">tree</field>
    <field name="view_mode">form,tree</field>
    <field name="view_id" ref="v"/>
    <field name="domain">[('code','=','0')]</field>
    <field name="context">{'project_id': active_id}</field>
</record>

他们想要告知用户的是,用户可以在新‘tab’打开一个新窗口.

Administration > Custom > Low Level > Base > Action > Window Actions

../../_images/module_base_action_window.png

Examples of actions

This action is declared in server/bin/addons/project/project_view.xml.

<record model="ir.actions.act_window" id="open_view_my_project">
    <field name="name">project.project</field>
    <field name="res_model">project.project</field>
    <field name="view_type">tree</field>
    <field name="domain">[('parent_id','=',False), ('manager', '=', uid)]</field>
    <field name="view_id" ref="view_my_project" />
</record>

This action is declared in server/bin/addons/stock/stock_view.xml.

<record model="ir.actions.act_window" id="action_picking_form">
    <field name="name">stock.picking</field>
    <field name="res_model">stock.picking</field>
    <field name="type">ir.actions.act_window</field>
    <field name="view_type">form</field>
    <field name="view_id" ref="view_picking_form"/>
    <field name="context">{'contact_display': 'partner'}</field>
</record>

Url Action

Wizard Action

下面是个显示wizard的.XML文件。

<?xml version="1.0"?>
<openerp>
    <data>
         <wizard string="Employee Info"
                 model="hr.employee"
                 name="employee.info.wizard"
                 id="wizard_employee_info"/>
    </data>
</openerp>

wizard用wizard标签来声明。想要知道更多关于wizard XML的信息可以查看“Add A New Wizard”这个章节。

你也可以使用一下的xml entry在menu中加wizard。

<?xml version="1.0"?>
<openerp>
     <data>
     <wizard string="Employee Info"
             model="hr.employee"
             name="employee.info.wizard"
             id="wizard_employee_info"/>
     <menuitem
             name="Human Resource/Employee Info"
             action="wizard_employee_info"
             type="wizard"
             id="menu_wizard_employee_info"/>
     </data>
</openerp>

Report Action

Report declaration

报表的解释在“Reports Reporting”章节。这有一个RML报表声明的XML文件。

<?xml version="1.0"?>
<openerp>
    <data>
    <report id="sale_category_print"
            string="Sales Orders By Categories"
            model="sale.order"
            name="sale_category.print"
            rml="sale_category/report/sale_category_report.rml"
            menu="True"
            auto="False"/>
     </data>
</openerp>

报表使用report标签在“data”块中声明。报表标签中的不同参数有:

  • id : 一个标识符,必须是唯一的
  • string : 菜单文字用来调用报表
  • model : 报表会渲染的OpenERP对象
  • rml : the .RML report model. Important Note : Path is relative to addons/ directory.
  • menu : 不管报表是否通过客户端直接调用。如果报表通过wizard来调用,设置menu为False。
  • auto : 确定.RML文件是否必须使用默认的解析器解析。使用客户解析器可以为你的报表定义额外的功能。

Security

在OpenERP中三个概念要区分一下:

1.The users:通过login/password来鉴定的person 2.The groups:定义资源的访问权限 3.The roles:确定用户的roles/duties
../../_images/module_base_user.png

The users

他们代表物理人类。他们通过登录和密码来鉴别。一个用户可以属于多个groups,可以有多个roles。

一个用户有开始action。当用户登录和输入密码时,action执行。比如一个动作是打开菜单‘Operations’。

用户可用选择图标选择不同的参数选择。例如,你可以使用这些参数选择来决定工作语言。默认为英语。

当你使用OpenERP时,可以修改自己的参数选择。你可以点击菜单:User > Preferences。OpenERP管理员可以修改很多参数选择和每个用户的参数选择。

The groups

groups决定对不同资源的访问权限。这有三种权限:

  • 写权限:写入和创建
  • 读权限:读取一个文件
  • 执行权限:工作流或向导的按钮

一个用户可以属于多个groups。如果他属于多个groups,我们将总是用有最高权限的组来对选定的资源。

The roles

roles在tree上定义了一个层次结构。他在公司内部代表着不同的jobs/roles。最大的role对所有的下级roles有自动的权限。

Example:

CEO

  • Technical manager
  • Chief of projects
    • Developers
    • Testers
  • Commercial manager
  • Salesmen
  • ...

如果我们想要验证一段程序(=role Testers)的测试,一个用户会有以下roles中的一个:Testers,Chief of the project,Technical manager,CEO。

roles用于将工作流动作转换为确认,选择或是验证动作。他们的含义在Workflow章节有详细的介绍。