odoo通過在 ir.values 創建一條 動作綁定記錄, 將 ir.actions.act_window 記錄 綁定到 該下拉動作列表。
? ?
通常的做法
- 定義 臨時模型用于臨時保存數據
- 定義 彈出表單
- 定義 彈出動作
- 綁定動作到目標模型
? ?
? ?
- 定義一個 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>
? ?
- 定義一個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','>',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>
? ?
? ?
- 定義一個 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'
? ?
? ?
- 定義一個 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>
? ?
? ?
另外一個簡潔的方式
- 定義 臨時模型用于臨時保存數據
- 定義 彈出表單
- 使用快捷tag act_window建立彈出動作并綁定動作到目標模型
? ?
使用 act_window 標簽,快速 同時 建立 ir.actions.act_window 記錄和 動作綁定記錄。
? ?
- 建立 臨時模型
? ?
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'}
? ?
? ?
- 建立 彈出表單
? ?
<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>
? ?
? ?
- 使用 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" />
? ?
? ?
Odoo下拉動作列表
技術