---------
更新時間
18:06 2016-09-18 星期日
15:05 2016-03-14 星期一
18:07 2016-02-19 星期五
---------
* 窗口動作
<?xml version="1.0" encoding="utf-8" ?>
<openerp>
<data>
<act_window id="action_todo_stage"
name="To-Do Task Stages"
res_model="todo.task.stage"
view_mode="tree,form" />
<act_window id="todo_app.action_todo_task"
name="To-Do Task "
res_model="todo.task"
view_mode="tree,form,calendar,gantt,graph"
target="current"
context="{'default_user_id':uid}"
domain="[]"
limit="80" />
<act_window id="action_todo_task_stage"
name="To-Do Task Stages"
res_model="todo.task.stage"
src_model="todo.task"
multi="False" />
</data>
</openerp>
可以用ir.action.act_window 重新寫上面的對象
<record id="action_todo_stage" model="ir.actions.act_window">
<field name="name">To-Do Task Stage</field>
<field name="type">ir.actions.act_window</field>
<field name="domain">["list of 3-tuples (max 250 characters)"]</field>
<field name="context">{"context dictionary (max 250 characters)"}</field>
<field name="res_model">todo.task.stage</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="todo_task_search"/>
<field name="view_id" ref="view_form_todo_task_ui" />
</record>
窗口的動作是存在 ir.actions.act_window 模型中的,我們可以在xml文件中用<act_window>來快捷定義
下面是部分屬性說明,完整的可以在 openerp/addons/base/ir/ir_actions.py 中的 ir.actions.act_window
類中可以找到
# name 顯示的標題
# type 動作類型 ,默認ir.actions.act_window
# view_id 中的 ref 值是對應視圖對象的id 觸發時用哪個視圖
# context 設置目標視圖的上下文
# domain 過濾記錄按條件,如:[["customer", "=", true]]
# res_id: 當動作打開視圖是表單視圖時,要指定的加載記錄id,只有‘view_mode’ 值為 form時才有效
否則就會新建一個記錄 如:"res_id": a_product_id,
# res_model 動作響應的目標模型
# target 如果設置為new 就打開新窗口,默認是 current
# view_mode:列出允許使用的視圖模式 如 form, tree, calendar,etc 默認是 tree,form
# view_type:設定tree時的列表是樹狀還是普通列表, tree-樹狀 form-普通列表 缺省是form
# usage: 過濾菜單和動作
# view_ids:
# views:是(view_id,view_type) 元組對列表,第一組是動作默認打開的視圖
如:"views": [[False, "tree"], [False, "form"]]
# limit 指列表視圖時,一頁的記錄數,默認是80
# auto_refresh: 在視圖中添加一個刷新功能
# groups_id:權限組 用快捷標簽則為 groups
# search_view_id 指定響應的搜索視圖(id,name) 元組對
# filter:列表視圖顯示過濾器(bool)
# auto_search: 加載默認視圖后,自動搜索
# src_model 指定可以啟動視圖的更多按鈕
# multi 設為True, 更多按鈕顯示在列表視圖,否則顯示在表單視圖
系統的默認值:
_defaults = {
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'tree,form',
'context': '{}',
'limit': 80,
'target': 'current',
'auto_refresh': 0,
'auto_search':True,
'multi': False,
}
* URL動作
ir.actions.act_url
{
"type": "ir.actions.act_url",
"url": "http://odoo.com",
"target": "self",
}
<record id="action_website_homepage" model="ir.actions.act_url">
<field name="name">Website Homepage</field>
<field name="url">/page/homepage</field>
<field name="target">self</field>
</record>
# name: 顯示名稱
# url:網址
# target: new 新開 self 本窗口
* 服務端動作(這個是非常強大,開專題講)
ir.actions.server
<record model="ir.actions.server" id="print_instance">
<field name="name">Res Partner Server Action</field>
<field name="model_id" ref="model_res_partner"/>
<field name="code">
if object.some_condition():
action = {
"type": "ir.actions.act_window",
"view_mode": "form",
"res_model": object._name,
"res_id": object.id,
}
</field>
</record>
# id 服務端動作標識
# context 上下文
# model_id 鏈接響應的模型
# condition 條優
# code python代碼設定,這里最靈活了
* 報表動作
ir.actions.report.xml
<record id="mc_crm_lead_demo_report" model="ir.actions.report.xml">
<field name="name">Marketing campaign demo report</field>
<field name="type">ir.actions.report.xml</field>
<field name="model">crm.lead</field>
<field name="report_name">crm.lead.demo</field>
<field name="report_rml">marketing_campaign_crm_demo/crm_lead_mc_demo_report.rml</field>
<field name="report_type">pdf</field>
</record>
#name 顯示名稱
#type 動作類型,固定為ir.actions.report.xml
#model 響應的模型
#report_type 報表類型 有 ('qweb-pdf', 'PDF'),
('qweb-html', 'HTML'),
('controller', 'Controller'),
('pdf', 'RML pdf (deprecated)'),
('sxw', 'RML sxw (deprecated)'),
('webkit', 'Webkit (deprecated)'),
#report_name 要用的報表模板
#groups_id 權限組
#paperformat_id
#attachment_use (bool)第二次打開還是前一次打開的結果
#attachment 附件的名稱
# report_rml rml文件路徑
快捷標簽<report> 用的屬性有一些不同,主要是 groups
<report
id="account_invoices"
model="account.invoice"
string="Invoices"
report_type="qweb-pdf"
name="account.report_invoice"
file="account.report_invoice"
attachment_use="True"
attachment="(object.state in ('open','paid')) and
('INV'+(object.number or '').replace('/','')+'.pdf')"
/>
* js調用action
在js中調用action 和直接在python 中調用action是一樣的
但是有一個比較坑的區別是 views: [[false, 'list'],[false, 'form']],
這里與form對應的時list 而不是tree 然而在python 里邊調用 action時 tree , 這個點是很難發現的。 是通過源碼查找找到的。
instance.web_calendar.CalendarView.include({
open_event: function(id, title) {
var self = this;
console.log(self,"id:",id,"title:",title,'model:',self.model);
if (self.model=='crm.phonecall'){
this.do_action({
type: 'ir.actions.act_window',
res_model: "crm.phonecall",
view_mode: 'tree',
view_type: 'tree,form',
views: [[false, 'list'],[false, 'form']],
domain:'[("previous_contact_id","=",'+id+')]',
target: 'current',
context:"{'default_previous_contact_id':"+id+"}",
}, {
on_reverse_breadcrumb: function () {
self.reload();
}
});
}else{
this._super.apply(this, arguments);
}
}
});
* py文件調用action
知識點 1. "[('id','in',[" + ','.join(map(str, sale_order_ids)) + "])]"
在實際下情況下運用py的語法. 這操作就是 把sale_order_ids 的id列表 轉換成 id字符串
就是odoo的domain的表達式是字符串
#這個是一個簡單的一個方法
model_data_obj = self.pool.get('ir.model.data')
stock_picking_tree_ids = model_data_obj.xmlid_to_res_id(
cr, SUPERUSER_ID, 'dftg_stock_picking_tree')
view_picking_form_id = model_data_obj.xmlid_to_res_id(
cr, SUPERUSER_ID, 'stock.view_picking_form')
return {
'type': 'ir.actions.act_window',
'res_model': 'stock.picking',
'view_mode': 'tree,form',
'view_type': 'form',
'name': u'查看出/入庫單',
'views': [(stock_picking_tree_ids, 'tree'), (view_picking_form_id, 'form')],
'view_id': stock_picking_tree_ids,
'domain': "[('so_id','='," + str(ids[0]) + "),('state','not in',['waiting'])]",
}
#這種方法是更常用更強大的 會動態的返回form 或者tree 很方便
適用各種需求
mod_obj = self.pool.get('ir.model.data')
act_obj = self.pool.get('ir.actions.act_window')
result = mod_obj.get_object_reference(
cr, uid, 'dftg_ext', 'fake_sale_order_action')
id = result and result[1] or False
result = act_obj.read(cr, uid, [id], context=context)[0]
# compute the number of invoices to display
if len(sale_order_ids) > 1:
result[
'domain'] = "[('id','in',[" + ','.join(map(str, sale_order_ids)) + "])]"
else:
res = mod_obj.get_object_reference(
cr, uid, 'dftg_ext', 'fake_sale_order_form')
result['views'] = [(res and res[1] or False, 'form')]
result['res_id'] = sale_order_ids and sale_order_ids[0] or False
return result
* 客戶端動作
openerp/addons/base/ir/ir_actions.py
ir.actions.client
<record id="action_client_sale_menu" model="ir.actions.client">
<field name="name">Open Sale Menu</field>
<field name="tag">reload</field>
<field name="params" eval="{'menu_id': ref('base.menu_base_partner')}"/>
</record>
#name 顯示名稱
#tag
#res_model 目標模型
#context 設置目標視圖的上下文
#params 帶上參數
#params_store