Odoo下拉动作列表

odoo通过在 ir.values 创建一条 动作绑定记录, ir.actions.act_window 记录 绑定到 该下拉动作列表。

   

通常的做法

  1. 定义 临时模型用于临时保存数据
  2. 定义 弹出表单
  3. 定义 弹出动作
  4. 绑定动作到目标模型

   

   

  1. 定义一个 act_window ,用于 弹出 表单

       

<record id="action_view_sale_advance_payment_inv" model="ir.actions.act_window">

<field name="name">Invoice Order</field>

<field name="type">ir.actions.act_window</field>

<field name="res_model">sale.advance.payment.inv</field>

<field name="view_type">form</field>

<field name="view_mode">form</field>

<field name="target">new</field>

<field name="groups_id" eval="[(4,ref('sales_team.group_sale_salesman'))]"/>

</record>

   

  1. 定义一个ir.ui.view Form,用于 展示 弹出表单

   

<record id="view_sale_advance_payment_inv" model="ir.ui.view">

<field name="name">Invoice Orders</field>

<field name="model">sale.advance.payment.inv</field>

<field name="arch" type="xml">

<form string="Invoice Sales Order">

<p class="oe_grey">

Invoices will be created in draft so that you can review

them before validation.

</p>

<group>

<field name="count" invisible="[('count','=',1)]" readonly="True"/>

<field name="advance_payment_method" class="oe_inline" widget="radio"

attrs="{'invisible': [('count','&gt;',1)]}"/>

<field name="product_id"

context="{'search_default_services': 1, 'default_type': 'service', 'default_invoice_policy': 'order'}" class="oe_inline"

attrs="{'invisible': 1}"/>

<label for="amount" attrs="{'invisible': [('advance_payment_method', 'not in', ('fixed','percentage'))]}"/>

<div attrs="{'invisible': [('advance_payment_method', 'not in', ('fixed','percentage'))]}">

<field name="amount"

attrs="{'required': [('advance_payment_method', 'in', ('fixed','percentage'))]}" class="oe_inline" widget="monetary"/>

<label string="%%"

attrs="{'invisible': [('advance_payment_method', '!=', 'percentage')]}" class="oe_inline"/>

</div>

<field name="deposit_account_id" class="oe_inline"

attrs="{'invisible': ['|', ('advance_payment_method', 'not in', ('fixed', 'percentage')), ('product_id', '!=', False)]}" groups="account.group_account_manager"/>

<field name="deposit_taxes_id" class="oe_inline" widget="many2many_tags"

domain="[('type_tax_use','=','sale')]"

attrs="{'invisible': ['|', ('advance_payment_method', 'not in', ('fixed', 'percentage')), ('product_id', '!=', False)]}"/>

</group>

<footer>

<button name="create_invoices" string="Create and View Invoices" type="object"

context="{'open_invoices': True}" class="btn-primary"/>

<button name="create_invoices" string="Create Invoices" type="object"

class="btn-primary"/>

<button string="Cancel" class="btn-default" special="cancel"/>

</footer>

</form>

</field>

</record>

   

   

  1. 定义一个 model ,用于 临时保存 弹出表单的数据,以及 绑定 弹出表单的动作

       

class SaleAdvancePaymentInv(models.TransientModel):

_name = "sale.advance.payment.inv"

_description = "Sales Advance Payment Invoice"

   

@api.model

def _count(self):

return len(self._context.get('active_ids', []))

   

@api.model

def _get_advance_payment_method(self):

if self._count() == 1:

sale_obj = self.env['sale.order']

order = sale_obj.browse(self._context.get('active_ids'))[0]

if all([line.product_id.invoice_policy == 'order' for line in order.order_line]) or order.invoice_count:

return 'all'

return 'delivered'

   

   

  1. 定义一个 ir.values 记录,将 act_window 绑定到 需要展示 下拉动作的 模型

   

<!-- TODO: check if we need this -->

<record model="ir.values" id="sale_order_line_make_invoice">

<field name="model_id" ref="sale.model_sale_order_line" />

<field name="name">Invoice Orders</field>

<field name="key2">client_action_multi</field>

<field name="value" eval="'ir.actions.act_window,' + str(ref('action_view_sale_advance_payment_inv'))" />

<field name="key">action</field>

<field name="model">sale.order</field>

</record>

   

   

另外一个简洁的方式

  1. 定义 临时模型用于临时保存数据
  2. 定义 弹出表单
  3. 使用快捷tag act_window建立弹出动作并绑定动作到目标模型

   

使用 act_window 标签,快速 同时 建立 ir.actions.act_window 记录和 动作绑定记录。

   

  1. 建立 临时模型

       

class AccountInvoiceConfirm(models.TransientModel):

"""

This wizard will confirm the all the selected draft invoices

"""

   

_name = "account.invoice.confirm"

_description = "Confirm the selected invoices"

   

@api.multi

def invoice_confirm(self):

context = dict(self._context or {})

active_ids = context.get('active_ids', []) or []

   

for record in self.env['account.invoice'].browse(active_ids):

if record.state not in ('draft', 'proforma', 'proforma2'):

raise UserError(_("Selected invoice(s) cannot be confirmed as they are not in 'Draft' or 'Pro-Forma' state."))

record.action_invoice_open()

return {'type': 'ir.actions.act_window_close'}

   

   

  1. 建立 弹出表单

       

<record id="account_invoice_confirm_view" model="ir.ui.view">

<field name="name">account.invoice.confirm.form</field>

<field name="model">account.invoice.confirm</field>

<field name="arch" type="xml">

<form string="Confirm Draft Invoices">

<p class="oe_grey">

Once draft invoices are confirmed, you will not be able

to modify them. The invoices will receive a unique

number and journal items will be created in your chart

of accounts.

</p>

<footer>

<button string="Confirm Invoices" name="invoice_confirm" type="object" default_focus="1" class="btn-primary"/>

<button string="Cancel" class="btn-default" special="cancel"/>

</footer>

</form>

</field>

</record>

   

   

  1. 使用 act_window 标签 建立 弹窗 + 动作绑定

       

<act_window id="action_account_invoice_confirm"

multi="True"

key2="client_action_multi" name="Confirm Draft Invoices"

res_model="account.invoice.confirm" src_model="account.invoice"

view_mode="form" target="new" view_type="form" />