<rt id="umcai"><optgroup id="umcai"></optgroup></rt>
<tr id="umcai"><small id="umcai"></small></tr><rt id="umcai"><small id="umcai"></small></rt>
<acronym id="umcai"><small id="umcai"></small></acronym>

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" />

? ?

? ?

<rt id="umcai"><optgroup id="umcai"></optgroup></rt>
<tr id="umcai"><small id="umcai"></small></tr><rt id="umcai"><small id="umcai"></small></rt>
<acronym id="umcai"><small id="umcai"></small></acronym>