視圖層-設(shè)計用戶界面
這一章節(jié)我們會學(xué)習(xí)用來構(gòu)建用戶界面的視圖層蜈膨。
- 視圖跟控件
- context跟domian
使用xml文件定義用戶界面
用戶界面與業(yè)務(wù)記錄一樣,都是存儲在我們Odoo的數(shù)據(jù)庫中丧叽。我們設(shè)計用戶界面其實本質(zhì)上就是使用xml文件來把Odoo中的UI從數(shù)據(jù)庫中拉出來顯示給用戶。
構(gòu)造一個新的 todo_ui 模塊.編輯__mainfest__.py
文件:
{
'name': 'User interface improvements tp the To-Do app',
'description': 'User friendly features.',
'author': 'xer',
'depends': ['todo_user'],
'data': ['views/todo_view.xml',
'views/todo_menu.xml',
'security/ir.model.access.csv',
],
}
菜單選項
菜單選項被存貯在ir.ui.menu
模型中.可以在** Settings | Technical | User Interface | Menu Items**中查看
我們在'todo_app'應(yīng)用中已經(jīng)創(chuàng)建了頂層菜單'To-Do app tasks'.現(xiàn)在來對這個菜單進(jìn)行擴(kuò)展
新建views/todo_menu.xml
.添加如下代碼
<!--Modify the top menu-->
<menuitem id="todo_app.menu_todo_task" name="To-Do"></menuitem>
<!--app menu items-->
<menuitem id="menu_todo_task_view"
name="Tasks"
parent="todo_app.menu_todo_task"
sequence="10"
action="todo_app.action_todo_task"/>
<menuitem id="menu_todo_config"
name="Configuration"
parent="todo_app.menu_todo_task"
sequence="100"
groups="base.group_system"/>
<menuitem id="menu_todo_task_stage"
name="Stages"
parent="menu_todo_config"
sequence="10"
action="action_todo_stage" />
Odoo的縮寫可以直接使用<menuitem>
這個標(biāo)簽來代替<record mode='ir.ui.view'>
- 第一行中我們直接使用了定義在'todo_app'中的菜單視圖的外部xml id.直接對其進(jìn)行改寫
- 第二行通過'parent'屬性來定義二級菜單,使用action來調(diào)用菜單動作.
- 第三行我們定義了一個設(shè)置菜單,規(guī)定了group為管理員才能獲取.
- 最后,我們添加了Stage菜單.綁定action用來顯示任務(wù)的階段.
窗口動作(actions)
窗口動作通常與菜單以及按鈕結(jié)合使用公你,它在GUI客戶端中調(diào)度每個窗口踊淳。通過domian過濾器能顯示記錄中符合條件的子集,通過context可以傳遞參數(shù)陕靠。
<act_window id="action_todo_stage"
name="To-Do Task Stages"
res_model="todo.task.stage"
view_mode="tree,form"
target="current"
context="{'default_state': 'open'}"
domain="[]"
limit="80"
/>
<act_window id="todo_app.action_todo_task"
name="To-Do Tasks"
res_model="todo.task"
view_mode="tree,form,calendar,kanban,graph,pivot"
target="current"
context="{'search_default_filter_my_tasks': True}"
/>
<act_window id="action_todo_task_stage"
name="To-Do Task Stages"
res_model="todo.task.stage"
src_model="todo.task"
multi="False"
/>
我們在'views/todo_menu.xml'中添加窗口動作,注意要把這些元素放在menu元素之前.窗口動作被存貯在'ir.actions.act_window'模型中,可使用縮寫<act_window>.
上面代碼第一個action我們打開了Task Stages模型.其中主要屬性如下所列:
- name: 在視圖層顯示的動作的名稱.
- res_model : 動作要調(diào)用的模型
- view_mode: 視圖顯示模式迂尝。第一個模式是默認(rèn)打開時的顯示方式
- target: new能打開新窗口,默認(rèn)是current剪芥,即在當(dāng)前頁面打開
- context: 在目標(biāo)視圖打開時垄开,提供傳遞的參數(shù)(傳遞上下文)。通常用來設(shè)置默認(rèn)值以及添加過濾
- domain:domain過濾規(guī)則粗俱。
-
limit: 每頁顯示的記錄數(shù)说榆。
第二個action我們重新定義了todo_app中的動作,添加了多種視圖表示模式
第三個動作并沒有綁定菜單.這個動作是注冊到了我們視圖層右上角的more選項中. - src_model :指定了在哪個模型中放置More菜單
-
multi: 這個屬性默認(rèn)為false,當(dāng)設(shè)置為True時能夠在list視圖中使用(注意到我們的More菜單只在點開具體task記錄時才可以使用)
Context(上下文)跟domain
Context 數(shù)據(jù)
上下文數(shù)據(jù)是一個保存著會話信息的字典能夠同時在用戶界面跟業(yè)務(wù)后臺中傳遞數(shù)據(jù)寸认。
- 從用戶界面角度:它能把前一個視圖中的數(shù)據(jù)签财,例如記錄ID傳遞到下一個視圖。為下一個視圖傳遞默認(rèn)值
- 從服務(wù)器角度:一些記錄集字段的值依賴于Odoo的本地設(shè)置偏塞,也可以使用context傳遞唱蒸。特別是
lang
的值,它是翻譯的關(guān)鍵.舉個例子:
{'lang': 'en_US', 'tz': 'Europe/Brussels', 'uid': 1}
- 當(dāng)打開一個表單視圖或者從按鈕上獲取一個鏈接,
active_id
被添加到context
中.它代表了當(dāng)前記錄的id,如果是列表視圖,則會有一個active_ids
包含列表中所有的記錄. - 如果要設(shè)置默認(rèn)值,要通過
default_
或者default_search_
前綴.舉例:
設(shè)置默認(rèn)user_id
字段的值
{'default_user_id' : uid}
設(shè)置一個默認(rèn)的過濾器:
{'default_search_filter_my_tasks' : 1}
Domain表達(dá)式
domian表達(dá)式是用來過濾數(shù)據(jù)記錄的灸叼。它本質(zhì)是通過Odoo的ORM模型轉(zhuǎn)換為SQL的WHERE子句神汹。domain表達(dá)式的每個條件是一個三元素的元組格式:('field_name','operator','value')
-
field_name: 是要被過濾的字段名稱庆捺。能夠使用
.
操作符來表示關(guān)聯(lián)模型的字段. - value : 必須能通過操作符跟字段進(jìn)行比較。
-
operator: 操作符屁魏。常見的如
<,>,<,>=,=,!=
-
=like
:可以使用模式匹配滔以,下劃線“_”匹配一個字符,百分號“%”匹配零或者多個字符氓拼。 -
like
:%value%
模式你画,模糊搜索。ilike
與like
類似,忽略大小寫.not like
桃漾,通過%value%
模式不匹配 -
child of
:判斷是否value的子記錄坏匪,通過_parent_name實現(xiàn)。 -
in
,not in
:判斷value是否在元素的列表里面撬统。
domain表達(dá)式是一個列表适滓,通常包含了許多個條件元組,這些條件元組直接默認(rèn)的邏輯關(guān)系是AND恋追。
條件間使用的邏輯前綴:
-
& :邏輯 AND凭迹,條件間的默認(rèn)關(guān)系。2個參數(shù)(后2個條件或者條件組合) 几于,例如:
['&', ('partner_id.coutnry_id.code', '=', 'CN'), ('partner_id.coutry_id.code', '=', 'US')]
這里的 & 就是把后面的2個條件通過AND組合起來也就是 A AND B蕊苗,但是注意到這里說的是還有“條件組合”的情況,所以還有可能是
['&', ('partner_id.coutnry_id.code', '=', 'CN'),
'&',('partner_id.coutry_id.code', '=', 'US'), ('partner_id.coutry_id.code', '=', 'GB')]
轉(zhuǎn)換為一般的表示方法則是 A AND (B AND C)沿彭,但是因為’&’是默認(rèn)的邏輯關(guān)系,所以我們其實可以不用顯式表示
[('partner_id.coutnry_id.code', '=', 'CN'),('partner_id.coutry_id.code', '=', 'US'),
('partner_id.coutry_id.code', '=', 'GB')]
更多的Domain討論可以在 Domain規(guī)則中看到
表單視圖
form視圖就像紙質(zhì)文件一樣尖滚,有著簡單的布局喉刘。
我們可以對它進(jìn)行布局的設(shè)置,現(xiàn)在讓我們通過繼承來擴(kuò)展在todo_app中定義過的form視圖.
處理相同類型的多個視圖.
同一個模型可能會有多個視圖,通過添加action的屬性view_id
,可以指定需要使用的視圖.
Odoo為我們的模型提供了最為基礎(chǔ)的form視圖,當(dāng)我們進(jìn)行視圖的修改后,Odoo會通過優(yōu)先值來調(diào)用新視圖.默認(rèn)的視圖優(yōu)先級為16.
業(yè)務(wù)文檔視圖
正常業(yè)務(wù)使用中,許多記錄都被記錄在紙質(zhì)文件上,例如發(fā)票,庫存單.因此構(gòu)建一張類似紙質(zhì)文件的視圖是十分有必要的.在我們的To-Do Task中,創(chuàng)建views/todo_views.xml文件.
<record id="view_form_todo_task_ui"
model="ir.ui.view">
<field name="model">todo.task</field>
<field name="priority">15</field>
<field name="arch" type="xml">
<form>
<header>
<!-- To add buttons and status widget-->
</header>
<sheet>
<!-- To add form content-->
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids"
widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
業(yè)務(wù)文檔視圖通常使用3個主要區(qū)域漆弄。
- header:狀態(tài)條
- sheet: 主要內(nèi)容
-
chatter:底部防止留言板一類的界面顯示
我們在chatter中使用了Odoo中mail模塊的社交網(wǎng)絡(luò)組件睦裳。
header
通常我們在頁面頭部中放置動作按鈕以及頁面的生命周期狀態(tài)。
通常action是通過放置button按鈕來實現(xiàn)的撼唾。通常使用`class="oe_highlight"可以使其高亮顯示
文檔記錄的生命周期使用'statusbar'這個窗口組件.一般使用'State'名稱的selection字段或者一個'Stage'名字的多對一字段來表示文件記錄當(dāng)前的狀態(tài).
按照目前Odoo的趨勢.逐漸使用Stage代替State來表示記錄狀態(tài).
在todo_view.xml中擴(kuò)展我們的header
<header>
<field name="state" invisible="True"/>
<button name='do_toggle_done' type="object"
attrs="{'invisible':[('state','in',['draft'])]}"
string="Toggle Done"
class="oe_highlight"/>
<field name="stage_id"
widget="statusbar"
clickable="True"
options="{'fold_field':'fold'}"/>
</header>
我們使用字段前廉邑,首先需要把該字段導(dǎo)入到view中。
上面的代碼中倒谷。首先我們把記錄的state字段設(shè)置為不可見蛛蒙,可以設(shè)置屬性invisible="True"
讓字段在客戶界面不顯示.
下面定義一個button按鈕來觸發(fā)以前定義過的do_toggle_done
方法.屬性"attrs"的定義是指當(dāng)文檔記錄的state
狀態(tài)為draft
時隱藏該按鈕.
clickable
屬性允許通過點擊status bar
來改變文檔記錄的stage字段值.
Sheet
sheet 標(biāo)簽中主要是實際數(shù)據(jù)存放的地方,它被設(shè)計成跟紙質(zhì)文檔類似的格式渤愁。它的主要結(jié)構(gòu):
- 居中的文檔標(biāo)題
- 右上角的一個按鈕盒
- 其他文檔頭部字段
- 一個用來記載額外字段的筆記本
標(biāo)題跟副標(biāo)題
在<group>
元素外的字段不會自動生成標(biāo)注牵祟。所以我, 需要為這些標(biāo)題元素添加label屬性抖格。Odoo的xml文件中可以使用html跟css語言诺苹。我們一般把標(biāo)題放在<div class='oe_title'>
標(biāo)簽下咕晋。
<sheet>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1><field name="name"/></h1>
<h3>
<span class="oe_read_only">By</span>
<label for="user_id" class="oe_edit_only"/>
<field name="user_id" class="oe_inline"/>
</h3>
</div>
</sheet>
<label>
的用法.for屬性指定了需要的字段.class="oe_edit_only"
表示只在編輯模式時顯示該字段.
巧妙的按鈕區(qū)域
右上角有一個按鈕存放的區(qū)域。我們可以在其中添加按鈕.
<div name="buttons" class="oe_right oe_button_box">
<!-- smart buttons here ...-->
</div>
我們表單的主要內(nèi)容應(yīng)該放置在<group>
標(biāo)簽中.一個字段值跟一個字段標(biāo)簽通常需要兩列收奔,而一個<group>
標(biāo)簽會在頁面布局上插入兩列掌呜。所以我們使用2個group標(biāo)簽,這樣就可以構(gòu)造左右兩個字段的布局格式坪哄。
<group name="group_top">
<group name="group_left">
<field name="date_deadline"/>
<!--<separator string="Reference"/>-->
<field name="refers_to"/>
</group>
<group name="group_right">
<field name="tag_ids" widget="many2many_tags"/>
<field name="stage_state"/>
</group>
</group>
效果如下:
我們在定義group標(biāo)簽時质蕉,可以定義一個name
屬性,這有利于關(guān)聯(lián)以及以后的擴(kuò)展.
在group標(biāo)簽中我們可以使用col
,colspan
屬性來對布局進(jìn)一步的控制.
- col代表group分割的列數(shù),默認(rèn)為2.
- colspan表示每列的尺寸大小
分頁筆記本
另一種格式化內(nèi)容的方式是使用notebook
元素.包含多重分頁節(jié)選。它能讓不常用的數(shù)據(jù)在使用時才顯示损姜。
例子:
<notebook>
<page string="Whiteboard" name="whiteboard">
<field name="docs"/>
</page>
<page>
<!--second page content -->
</page>
</notebook>
視圖語義組件
剛才我們解釋了如何結(jié)構(gòu)化表單內(nèi)容∈伟現(xiàn)在我們來講講構(gòu)造表單數(shù)據(jù)的部件。
Fields
視圖中字段同樣有許多屬性摧阅,我們可以通過定義這些屬性來重寫模型中已經(jīng)定義的字段的屬性汰蓉。
- name : 字段數(shù)據(jù)庫名字的標(biāo)識
- string : 標(biāo)簽文本。在view中定義可以重寫模型中已經(jīng)定義的string名字
- help :幫助文本棒卷,鼠標(biāo)懸停時顯示
- placeholder : 在創(chuàng)建時字段輸入框中默認(rèn)顯示的內(nèi)容顾孽。
- widget : 字段顯示的窗口化部件。
- options :一個JSON數(shù)據(jù)類型的可選參數(shù)比规,用來給窗口化部件傳參若厚。
- class :CSS樣式
- nolabel="True" :在groups視圖中不顯示字段的標(biāo)簽常用。
- invisible="True" : 字段不可見
- readonly="True" : 字段在視圖中只讀
- required="True" : 字段必須輸入
- password="True" : 字段輸入變?yōu)?*"這樣的密碼格式
- filename : 二進(jìn)制文件,上傳后保存的名字
- mode : 一對多字段使用,它指定了一對多字段在關(guān)聯(lián)字段中顯示的模式,默認(rèn)是tree,可以為form,kanban,graph.
字段的標(biāo)簽
label元素通常用來控制字段在視圖中的顯示.
<label for="name" class="oe_edit_only" />
表示只有當(dāng)處于編輯模式時才顯示字段標(biāo)簽蜒什。
注意测秸,在group元素內(nèi)嵌中,我們還要設(shè)置nolabel="True"
.
關(guān)系字段
關(guān)系字段可用的屬性有 context,domain
.這些已經(jīng)介紹過.還有一個options
屬性.我們知道,在關(guān)系型字段上,我們能夠使用快速創(chuàng)建功能來快速創(chuàng)建一個新的關(guān)聯(lián)模型記錄,通過
options={'no_open': True, 'no_create' : True}
可以關(guān)閉快速創(chuàng)建功能.
字段窗口控件
字段根據(jù)自己的類型都有默認(rèn)的窗口顯示控件.當(dāng)我們還可以自己來選擇額外的窗口顯示控件.
對于字符型字段:
- email : 用來添加一個"發(fā)送給..."的動作
- url : 格式化文本為一個可以點擊的URL地址
-
html : 一個可以轉(zhuǎn)換text到HTML內(nèi)容的控件
對于數(shù)字字段: - handle : 對于排序字段灾常,直接顯示向上向下箭頭
- float_time : 單精度時間
- monetary :價格(和精度位數(shù)相關(guān))
- progressbar :精度條霎冯,按照百分比。
關(guān)系型字段:
- many2many_tags : 展示一個類似按鈕標(biāo)簽的列表
- selection : 使用了selection 字段部件來展示many-to-one 字段
- radio : 單選標(biāo)簽
- kanban_state_selection :
- priority : 優(yōu)先級钞瀑。通常就是個數(shù)字沈撞。
按鈕
按鈕支持下面的屬性:
icon : 定義圖標(biāo)按鈕。只能在
addons/web/static/src/img/icons
中獲取string : 按鈕的字符描述
type : 一共有3個值:
1.workflow
: 觸發(fā)工作流
2.object
: 調(diào)用python方法
3.action
: 執(zhí)行窗口動作name : 根據(jù)type的取值來設(shè)置.如果是工作流,就是一個工作流信號名稱, object就是python方法名,action就是動作的外部id
args : 當(dāng)type參數(shù)是object時用來傳遞參數(shù)
context : 添加上下文內(nèi)容.
confirm : 確認(rèn)按鈕上顯示的字符
special="cancel" : 在向?qū)е惺褂?用來取消向?qū)П韱位蛘哧P(guān)閉向?qū)б晥D.
巧妙(Smart)按鈕
就是表單結(jié)構(gòu)中右上角的按鈕小盒子.
在我們的app中雕什,我們定義了了一個展示當(dāng)前task總數(shù)的按鈕,點擊它會直接列出當(dāng)前用戶的task列表記錄.
首先在 todo_model.py 文件中添加統(tǒng)計task的計算字段,
def compute_user_todo_count(self):
for task in self:
task.user_todo_count = task.search_count([('user_id', '=', task.user_id.id)])
user_todo_count = fields.Integer('User To-Do Count', compute='compute_user_todo_count')
然后在視圖層添加button按鈕
<div name="buttons" class="oe_right oe_button_box">
<button class="oe_stat_button"
type="action" icon="fa-tasks"
name="%(action_todo_task_button)d"
context="{'default_user_id': user_id}"
help="All to-dos for this user">
<field string="To-Dos" name="user_todo_count"
widget="statinfo"/>
</button>
添加 smart buttons 時,有下列屬性可以使用:
- class="oe_stat_button" :
- icon : 設(shè)置按鈕使用的圖標(biāo)
-
type 跟 name : smart button中, type 通常就是 action 而 name 的記錄則是XMLID, 這里我們就需要使用
%(action-external-id)d
來讓外部id轉(zhuǎn)為實際的數(shù)據(jù)庫id. - string :添加文本標(biāo)志.
- context : 傳遞上下文,代碼中我們傳遞了用戶的id作為action打開下一個視圖的默認(rèn)值.
-
help : 幫助文本信息
button 元素可以被看做一個容器缠俺,我們是有statinfo 這個小組件來展示字段的統(tǒng)計信息。代碼中我們顯示了一個計算字段贷岸。另外還可以在其中放入靜態(tài)文本字段 舉例:
<div> User's To-dos </div>
下面來完善我們定義的action_todo_task_button 這個動作.它必須在button 之前定義
<act_window id="action_todo_task_button"
name="To-Do Tasks"
res_model="todo.task"
view_mode="tree,form,calendar,graph,pivot"
domain="[('user_id','=',default_user_id)]"
/>
動態(tài)視圖
視圖元素提供了一些屬性同樣允許視圖根據(jù)字段的值的變化來動態(tài)的展示對應(yīng)的視圖壹士。
on change 事件
Odoo 提供的on change 機(jī)制通過監(jiān)測字段的值的改變來對目標(biāo)字段的值進(jìn)行改變。舉個例子凰盔,價格字段隨著產(chǎn)品字段的選擇的改變而產(chǎn)生變化來顯示具體產(chǎn)品的價格墓卦。
從Odoo8.0版本以后,on change 可以直接在模型python代碼中實現(xiàn)户敬。通過@api.onchange('field1', 'field2') 來實現(xiàn).
動態(tài)屬性
動態(tài)屬性能夠更好的通過 on change 機(jī)制來對用戶視圖上元素的可視化進(jìn)行控制.
group : 讓一個元素是否可見依賴當(dāng)前用戶的分組.其實是通過權(quán)限控制實現(xiàn).
- states* : 根據(jù)當(dāng)前記錄的 Stage 字段.
視圖模式
- List View(列表視圖):
<record id="view_tree_todo_task" model="ir.ui.view">
<field name="name">To-do Task tree</field>
<field name="model">todo.task</field>
<field name="arch" type="xml">
<tree colors="red:is_done==True">
<field name="name"/>
<field name="is_done"/>
</tree>
</field>
</record>
對應(yīng)屬性:
- default_order : 默認(rèn)的排序規(guī)則.
- create,delte,edit : 如果設(shè)置為 false ,讓對應(yīng)的視圖上的動作失效.
-
editable : 讓記錄能夠在列表視圖中直接被修改.
列表視圖中落剪,數(shù)字型字段能夠通過使用 sum睁本, avg, min忠怖, max 屬性來對每列的數(shù)據(jù)進(jìn)行一個統(tǒng)計操作呢堰。
<field name="amount" sum="Total Amount"/>
- 搜索視圖
搜索視圖被定義在<search>
標(biāo)簽中.
<record id="todo_app.view_filter_todo_task"
model="ir.ui.view">
<field name="model">todo.task</field>
<field name="arch" type="xml">
<search>
<field name="name" />
<field name="user_id"/>
<filter name="filter_not_done" string="Not Done"
domain="[('is_done','=',False)]"/>
<filter name="filter_done" string="Done"
domain="[('is_done','!=',False)]"/>
<separator/>
<filter name="group_user" string="By User"
context="{'group_by':'user_id'}"/>
</search>
</field>
</record>
我們使用了 name 跟 user_id 字段進(jìn)行搜索.
搜索視圖屬性:
- name : 標(biāo)識了使用的字段.
- string : 字符標(biāo)識
-
operator : 操作方式,數(shù)字類型字段默認(rèn)為
=
, 其他的是ilike
. - filter_domain : 過濾規(guī)則.提供一個可以選擇的現(xiàn)成過濾器小方塊顯示在搜索欄下拉菜單中.
- groups : 根據(jù)使用者的分組決定搜索權(quán)限.
對于過濾器元素.以下屬性可以使用:
- name : 定義了過濾器的標(biāo)識id.
- string : 過濾器在視圖中的字符標(biāo)識.
- domain : domain過濾規(guī)則.
- context : 上下文傳遞數(shù)據(jù).
- groups : 根據(jù)當(dāng)前用戶分組權(quán)限決定是否顯示本過濾器.
- 日歷視圖
<record id="view_calendar_todo_task" model="ir.ui.view">
<field name="model">todo.task</field>
<field name="arch" type="xml">
<calendar date_start="date_deadline" color="user_id"
display="[name], Stage [stage_id]">
<field name="name"></field>
<field name="stage_id"/>
</calendar>
</field>
</record>
日歷視圖屬性:
- date_start : 開始日期。
- date_end : 結(jié)束日期.
- date_delay : 持續(xù)時間,可以用來代替date_end .很好理解凡泣,end - start = delay嘛枉疼。
- all_day : 一個bool字段來決定是否是全天持續(xù)事件.
- color : 根據(jù)分組來設(shè)置一個顯示顏色
- display : 顯示的格式. 代碼中就是顯示記錄的名字跟階段狀態(tài)。
- mode :顯示模式鞋拟,默認(rèn)是 day, week, month
- 圖表視圖跟數(shù)據(jù)透視表
圖表視圖為數(shù)據(jù)提供了圖像可視化骂维。
在todo_ui/models/todo_model.py
中task模型中添加一個字段
effort_estimate = fields.Integer('effort estimate')
<record id="view_graph_todo_task" model="ir.ui.view">
<field name="model">todo.task</field>
<field name="arch" type="xml">
<graph type="bar">
<field name="stage_id"/>
<field name="effort_estimate" type="measure"/>
</graph>
</field>
</record>
圖表的type 有3個可選 bar,pie贺纲,line 航闺。
添加數(shù)據(jù)透視表
<record id="view_pivot_todo_task" model="ir.ui.view">
<field name="model">todo.task</field>
<field name="arch" type="xml">
<pivot>
<field name="stage_id" type="col"/>
<field name="user_id"/>
<field name="date_deadline" interval="week"/>
<field name="effort_estimate" type="measure"/>
</pivot>
</field>
</record>