[FIX] res.users: context_get cache was not cleared properly, due to braindead impleme...
[odoo/odoo.git] / doc / 03_module_dev_03.rst
1 .. _module-dev-views:
2
3 Views and Events
4 ================
5
6 Introduction to Views
7 ---------------------
8
9 As all data of the program is stored in objects, as explained in the Objects
10 section, how are these objects exposed to the user ? We will try to answer this
11 question in this section.
12
13 First of all, let's note that every resource type uses its own interface. For
14 example, the screen to modify a partner's data is not the same as the one to
15 modify an invoice.
16
17 Then, you have to know that the OpenERP user interface is dynamic, it means
18 that it is not described "statically" by some code, but dynamically built from
19 XML descriptions of the client screens.
20
21 From now on, we will call these screen descriptions views.
22
23 A notable characteristic of these views is that they can be edited at any
24 moment (even during the program execution). After a modification to a displayed
25 view has occurred, you simply need to close the tab corresponding to that
26 'view' and re-open it for the changes to appear. 
27
28 Views principles
29 ++++++++++++++++
30
31 Views describe how each object (type of resource) is displayed. More precisely, for each object, we can define one (or several) view(s) to describe which fields should be drawn and how.
32
33 There are two types of views:
34
35    #. form views
36    #. tree views 
37
38 .. note:: Since OpenERP 4.1, form views can also contain graphs. 
39
40
41 Form views
42 ----------
43
44 The field disposition in a form view always follows the same principle. Fields are distributed on the screen following the rules below:
45
46     * By default, each field is preceded by a label, with its name.
47     * Fields are placed on the screen from left to right, and from top to bottom, according to the order in which they are declared in the view.
48     * Every screen is divided into 4 columns, each column being able to contain either a label, or an "edition" field. As every edition field is preceded (by default) by a label with its name, there will be two fields (and their respective labels) on each line of the screen. The green and red zones on the screen-shot below, illustrate those 4 columns. They designate respectively the labels and their corresponding fields. 
49
50 .. .. figure::  images/sale_order.png
51 ..    :scale: 50
52 ..    :align: center
53
54
55 Views also support more advanced placement options:
56
57     * A view field can use several columns. For example, on the screen-shot below, the zone in the blue frame is, in fact, the only field of a "one to many". We will come back later on this note, but let's note that it uses the whole width of the screen and not only one column. 
58
59       .. .. figure::  images/sale_order_sale_order_lines.png
60       ..   :scale: 50
61       ..   :align: center
62
63     * We can also make the opposite operation: take a columns group and divide it in as many columns as desired. The surrounded green zones of the screen above are good examples. Precisely, the green framework up and on the right side takes the place of two columns, but contains 4 columns. 
64
65 As we can see below in the purple zone of the screen, there is also a way to distribute the fields of an object on different tabs.
66
67 .. .. figure::  images/sale_order_notebook.png
68 ..    :scale: 50
69 ..    :align: center
70
71 On Change
72 +++++++++
73
74 The on_change attribute defines a method that is called when the content of a view field has changed.
75
76 This method takes at least arguments: cr, uid, ids, which are the three classical arguments and also the context dictionary. You can add parameters to the method. They must correspond to other fields defined in the view, and must also be defined in the XML with fields defined this way::
77
78         <field name="name_of_field" on_change="name_of_method(other_field'_1_', ..., other_field'_n_')"/> 
79
80 The example below is from the sale order view.
81
82 You can use the 'context' keyword to access data in the context that can be used as params of the function.::
83
84         <field name="shop_id" on_change="onchange_shop_id(shop_id)"/>
85
86 .. code-block:: python
87
88         def onchange_shop_id(self, cr, uid, ids, shop_id):
89
90             v={} 
91             if shop_id:
92
93                 shop=self.pool.get('sale.shop').browse(cr,uid,shop_id) 
94                 v['project_id']=shop.project_id.id 
95                 if shop.pricelist_id.id:
96
97                     v['pricelist_id']=shop.pricelist_id.id 
98
99                 v['payment_default_id']=shop.payment_default_id.id 
100
101             return {'value':v} 
102
103
104 When editing the shop_id form field, the onchange_shop_id method of the sale_order object is called and returns a dictionary where the 'value' key contains a dictionary of the new value to use in the 'project_id', 'pricelist_id' and 'payment_default_id' fields.
105
106 Note that it is possible to change more than just the values of
107 fields. For example, it is possible to change the value of some fields
108 and the domain of other fields by returning a value of the form:
109 return {'domain': d, 'value': value}
110
111 :returns: a dictionary with any mix of the following keys:
112
113     ``domain``
114       A mapping of ``{field: domain}``.
115
116       The returned domains should be set on the fields instead of the
117       default ones.
118
119     ``value``
120       A mapping of ``{field: value}}``, the values will be set on the
121       corresponding fields and may trigger new onchanges or attrs
122       changes
123
124     ``warning`` A dict with the keys ``title`` and ``message``. Both
125       are mandatory. Indicate that an error message should be
126       displayed to the user.
127
128
129 Tree views
130 ----------
131
132 These views are used when we work in list mode (in order to visualize several resources at once) and in the search screen. These views are simpler than the form views and thus have less options.
133
134 .. .. figure::  images/tree_view.png
135 ..    :scale: 50
136 ..    :align: center
137
138 Search views
139 --------------
140
141 Search views are a new feature of OpenERP supported as of version 6.0 
142 It creates a customized search panel, and is declared quite similarly to a form view,
143 except that the view type and root element change to ``search`` instead of ``form``.
144
145 .. .. image:: images/search.png
146 ..    :scale: 50
147 ..    :align: center
148
149 Following is the list of new elements and features supported in search views.
150
151 Group tag
152 +++++++++
153
154 Unlike form group elements, search view groups support unlimited number of widget(fields or filters)
155 in a row (no automatic line wrapping), and only use the following attributes:
156
157     + ``expand``: turns on the expander icon on the group (1 for expanded by default, 0 for collapsed)
158     + ``string``: label for the group
159
160 .. code-block:: xml
161
162     <group expand="1" string="Group By...">
163        <filter string="Users" icon="terp-project" domain="[]" context="{'group_by':'user_id'}"/>
164        <filter string="Project" icon="terp-project" domain="[]" context="{'group_by':'project_id'}"/>
165        <separator orientation="vertical"/>
166        <filter string="Deadline" icon="terp-project" domain="[]" context="{'group_by':'date_deadline'}"/>
167     </group>
168
169 In the screenshot above the green area is an expandable group.
170
171 Filter tag
172 +++++++++++
173 Filters are displayed as a toggle button on search panel 
174 Filter elements can add new values in the current domain or context of the search view.
175 Filters can be added as a child element of field too, to indicate that they apply specifically
176 to that field (in this case the button's icon will smaller)
177
178 In the picture above the red area contains filters at the top of the form while
179 the blue area highlights a field and it's child filter.
180
181 .. code-block:: xml
182
183     <filter string="Current" domain="[('state','in',('open','draft'))]" help="Draft, Open and Pending Tasks" icon="terp-project"/>
184     <field name="project_id" select="1" widget="selection">
185         <filter domain="[('project_id.user_id','=',uid)]" help="My Projects" icon="terp-project"/>
186     </field>
187
188 Group By
189 ++++++++
190
191 .. code-block:: xml
192
193     <filter string="Project" icon="terp-project" domain="[]" context="{'group_by':'project_id'}"/>
194
195 Above filters groups records sharing the same ``project_id`` value. Groups are loaded
196 lazily, so the inner records are only loaded when the group is expanded.
197 The group header lines contain the common values for all records in that group, and all numeric
198 fields currently displayed in the view are replaced by the sum of the values in that group.
199
200 It is also possible to group on multiple values by specifying a list of fields instead of a single string.
201 In this case nested groups will be displayed::
202
203     <filter string="Project" icon="terp-project" domain="[]" context="{'group_by': ['project_id', 'user_id'] }"/>
204
205 Fields
206 ++++++
207
208 Field elements in search views are used to get user-provided values
209 for searches. As a result, as for group elements, they are quite
210 different than form view's fields:
211
212 * a search field can contain filters, which generally indicate that
213   both field and filter manage the same field and are related.
214
215   Those inner filters are rendered as smaller buttons, right next to
216   the field, and *must not* have a ``string`` attribute.
217
218 * a search field really builds a domain composed of ``[(field_name,
219   operator, field_value)]``. This domain can be overridden in two
220   ways:
221
222   * ``@operator`` replaces the default operator for the field (which
223     depends on its type)
224
225   * ``@filter_domain`` lets you provide a fully custom domain, which
226     will replace the default domain creation
227
228 * a search field does not create a context by default, but you can
229   provide an ``@context`` which will be evaluated and merged into the
230   wider context (as with a ``filter`` element).
231
232 To get the value of the field in your ``@context`` or
233 ``@filter_domain``, you can use the variable ``self``:
234
235 .. code-block:: xml
236
237     <field name="location_id" string="Location"
238            filter_domain="['|',('location_id','ilike',self),('location_dest_id','ilike',self)]"/>
239
240 or
241
242 .. code-block:: xml
243
244     <field name="journal_id" widget="selection"
245            context="{'journal_id':self, 'visible_id':self, 'normal_view':False}"/>
246
247 Range fields (date, datetime, time)
248 """""""""""""""""""""""""""""""""""
249
250 The range fields are composed of two input widgets (from and two)
251 instead of just one.
252
253 This leads to peculiarities (compared to non-range search fields):
254
255 * It is not possible to override the operator of a range field via
256   ``@operator``, as the domain is built of two sections and each
257   section uses a different operator.
258
259 * Instead of being a simple value (integer, string, float) ``self``
260   for use in ``@filter_domain`` and ``@context`` is a ``dict``.
261
262   Because each input widget of a range field can be empty (and the
263   field itself will still be valid), care must be taken when using
264   ``self``: it has two string keys ``"from"`` and ``"to"``, but any of
265   these keys can be either missing entirely or set to the value
266   ``False``.
267
268 Actions for Search view
269 +++++++++++++++++++++++
270
271 After declaring a search view, it will be used automatically for all tree views on the same model.
272 If several search views exist for a single model, the one with the highest priority (lowest sequence) will
273 be used. Another option is to explicitly select the search view you want to use, by setting the
274 ``search_view_id`` field of the action.
275
276 In addition to being able to pass default form values in the context of the action, OpenERP 6.0 now
277 supports passing initial values for search views too, via the context. The context keys need to match the
278 ``search_default_XXX`` format. ``XXX`` may refer to the ``name`` of a ``<field>`` or ``<filter>``
279 in the search view (as the ``name`` attribute is not required on filters, this only works for filters that have
280 an explicit ``name`` set). The value should be either the initial value for search fields, or
281 simply a boolean value for filters, to toggle them 
282
283 .. code-block:: xml
284
285     <record id="action_view_task" model="ir.actions.act_window">
286         <field name="name">Tasks</field>
287         <field name="res_model">project.task</field>
288         <field name="view_type">form</field>
289         <field name="view_mode">tree,form,calendar,gantt,graph</field>
290         <field eval="False" name="filter"/>
291         <field name="view_id" ref="view_task_tree2"/>
292         <field name="context">{"search_default_current":1,"search_default_user_id":uid}</field>
293         <field name="search_view_id" ref="view_task_search_form"/>
294     </record>
295
296 Custom Filters
297 ++++++++++++++
298
299 As of v6.0, all search views also features custom search filters, as show below.
300 Users can define their own custom filters using any of the fields available on the current model,
301 combining them with AND/OR operators. It is also possible to save any search context (the combination
302 of all currently applied domain and context values) as a personal filter, which can be recalled
303 at any time. Filters can also be turned into Shortcuts directly available in the User's homepage.
304
305 .. .. image:: images/filter.png
306 ..    :scale: 50
307 ..    :align: center
308
309
310 In above screenshot we filter Partner where Salesman = Demo user and Country = Belgium,
311 We can save this search criteria as a Shortcut or save as Filter.
312
313 Filters are user specific and can be modified via the Manage Filters option in the filters drop-down.
314
315
316 Graph views
317 -----------
318
319 A graph is a new mode of view for all views of type form. If, for example, a sale order line must be visible as list or as graph, define it like this in the action that open this sale order line. Do not set the view mode as "tree,form,graph" or "form,graph" - it must be "graph,tree" to show the graph first or "tree,graph" to show the list first. (This view mode is extra to your "form,tree" view and should have a separate menu item):
320
321 .. code-block:: xml
322
323          <field name="view_type">form</field>
324          <field name="view_mode">tree,graph</field>
325
326 view_type::
327
328         tree = (tree with shortcuts at the left), form = (switchable view form/list) 
329
330 view_mode::
331
332         tree,graph : sequences of the views when switching 
333
334 Then, the user will be able to switch from one view to the other. Unlike forms and trees, OpenERP is not able to automatically create a view on demand for the graph type. So, you must define a view for this graph:
335
336
337 .. code-block:: xml
338
339         <record model="ir.ui.view" id="view_order_line_graph">
340            <field name="name">sale.order.line.graph</field>
341            <field name="model">sale.order.line</field>
342            <field name="type">graph</field>
343            <field name="arch" type="xml">
344                  <graph string="Sales Order Lines">
345                       <field name="product_id" group="True"/>
346                       <field name="price_unit" operator="*"/>
347                 </graph>
348             </field>
349         </record>
350
351
352 The graph view
353
354 A view of type graph is just a list of fields for the graph.
355
356 Graph tag
357 ++++++++++
358
359 The default type of the graph is a pie chart - to change it to a barchart change **<graph string="Sales Order Lines">** to **<graph string="Sales Order Lines" type="bar">** You also may change the orientation.
360
361 :Example : 
362
363 .. code-block:: xml
364
365         <graph string="Sales Order Lines" orientation="horizontal" type="bar">
366
367 Field tag
368 +++++++++
369
370 The first field is the X axis. The second one is the Y axis and the optional third one is the Z axis for 3 dimensional graphs. You can apply a few attributes to each field/axis:
371
372     * **group**: if set to true, the client will group all item of the same value for this field. For each other field, it will apply an operator
373     * **operator**: the operator to apply is another field is grouped. By default it's '+'. Allowed values are:
374
375           + +: addition
376           + \*: multiply
377           + \**: exponent
378           + min: minimum of the list
379           + max: maximum of the list 
380
381 :Defining real statistics on objects:
382
383 The easiest method to compute real statistics on objects is:
384
385    1. Define a statistic object which is a postgresql view
386    2. Create a tree view and a graph view on this object 
387
388 You can get en example in all modules of the form: report\_.... Example: report_crm. 
389
390
391
392 Calendar Views
393 --------------
394
395 Calendar view provides timeline/schedule view for the data.
396
397 View Specification
398 ++++++++++++++++++
399
400 Here is an example view:
401
402 .. code-block:: xml
403
404     <calendar color="user_id" date_delay="planned_hours" date_start="date_start" string="Tasks">
405         <field name="name"/>
406         <field name="project_id"/>
407     </calendar>
408
409 Here is the list of supported attributes for ``calendar`` tag:
410
411     ``string``
412         The title string for the view.
413
414     ``date_start``
415         A ``datetime`` field to specify the starting date for the calendar item. This 
416         attribute is required.
417         
418     ``date_stop``
419         A ``datetime`` field to specify the end date. Ignored if ``date_delay`` 
420         attribute is specified.
421         
422     ``date_delay``
423         A ``numeric`` field to specify time in hours for a record. This attribute
424         will get preference over ``date_stop`` and ``date_stop`` will be ignored.
425         
426     ``day_length``
427         An ``integer`` value to specify working day length. Default is ``8`` hours.
428         
429     ``color``
430         A field, generally ``many2one``, to colorize calendar/gantt items.
431         
432     ``mode``
433         A string value to set default view/zoom mode. For ``calendar`` view, this can be
434         one of following (default is ``month``):
435         
436         * ``day``
437         * ``week``
438         * ``month``
439    
440 Screenshots
441 +++++++++++
442
443 Month Calendar:
444
445 .. .. figure::  images/calendar_month.png
446 ..     :scale: 50%
447 ..     :align: center
448
449 Week Calendar:
450     
451 .. .. figure::  images/calendar_week.png
452 ..     :scale: 50%
453 ..     :align: center
454
455
456 Gantt Views
457 -----------
458
459 Gantt view provides timeline view for the data. Generally, it can be used to display
460 project tasks and resource allocation.
461
462 A Gantt chart is a graphical display of all the tasks that a project is composed of.
463 Each bar on the chart is a graphical representation of the length of time the task is
464 planned to take.
465
466 A resource allocation summary bar is shown on top of all the grouped tasks,
467 representing how effectively the resources are allocated among the tasks.
468
469 Color coding of the summary bar is as follows:
470
471     * `Gray` shows that the resource is not allocated to any task at that time          
472     * `Blue` shows that the resource is fully allocated at that time.
473     * `Red` shows that the resource is overallocated
474
475 View Specification
476 ++++++++++++++++++
477
478 Here is an example view:
479
480 .. code-block:: xml
481
482     <gantt color="user_id" date_delay="planned_hours" date_start="date_start" string="Tasks">
483         <level object="project.project" link="project_id" domain="[]">
484             <field name="name"/>
485         </level>
486     </gantt>
487
488 The ``attributes`` accepted by the ``gantt`` tag are similar to ``calendar`` view tag. The
489 ``level`` tag is used to group the records by some ``many2one`` field. Currently, only
490 one level is supported.
491
492 Here is the list of supported attributes for ``gantt`` tag:
493
494     ``string``
495         The title string for the view.
496
497     ``date_start``
498         A ``datetime`` field to specify the starting date for the gantt item. This 
499         attribute is required.
500         
501     ``date_stop``
502         A ``datetime`` field to specify the end date. Ignored if ``date_delay`` 
503         attribute is specified.
504         
505     ``date_delay``
506         A ``numeric`` field to specify time in hours for a record. This attribute
507         will get preference over ``date_stop`` and ``date_stop`` will be ignored.
508         
509     ``day_length``
510         An ``integer`` value to specify working day length. Default is ``8`` hours.
511         
512     ``color``
513         A field, generally ``many2one``, to colorize calendar/gantt items.
514         
515     ``mode``
516         A string value to set default view/zoom mode. For ``gantt`` view, this can be
517         one of following (default is ``month``):
518         
519         * ``day``
520         * ``3days``
521         * ``week``
522         * ``3weeks``
523         * ``month``
524         * ``3months``
525         * ``year``
526         * ``3years``
527         * ``5years``
528
529 The ``level`` tag supports following attributes:
530
531     ``object``
532         An openerp object having many2one relationship with view object.
533
534     ``link``
535         The field name in current object that links to the given ``object``.
536
537     ``domain``
538         The domain to be used to filter the given ``object`` records.
539
540 Drag and Drop
541 +++++++++++++
542
543 The left side pane displays list of the tasks grouped by the given ``level`` field.
544 You can reorder or change the group of any records by dragging them.
545
546 The main content pane displays horizontal bars plotted on a timeline grid. A group
547 of bars are summarized with a top summary bar displaying resource allocation of all
548 the underlying tasks.
549
550 You can change the task start time by dragging the tasks horizontally. While
551 end time can be changed by dragging right end of a bar.
552
553 .. note::
554
555     The time is calculated considering ``day_length`` so a bar will span more
556     then one day if total time for a task is greater then ``day_length`` value.
557     
558 Screenshots
559 +++++++++++
560     
561 .. .. figure::  images/gantt.png
562 ..     :scale: 50%
563 ..     :align: center
564
565
566 Design Elements
567 ---------------
568
569 The files describing the views are of the form:
570
571 :Example:
572
573 .. code-block:: xml
574
575     <?xml version="1.0"?>
576     <openerp>
577        <data>
578            [view definitions]
579        </data>
580     </openerp>
581
582 The view definitions contain mainly three types of tags:
583
584     * **<record>** tags with the attribute model="ir.ui.view", which contain the view definitions themselves
585     * **<record>** tags with the attribute model="ir.actions.act_window", which link actions to these views
586     * **<menuitem>** tags, which create entries in the menu, and link them with actions
587
588 New : You can specify groups for whom the menu is accessible using the groups 
589 attribute in the `menuitem` tag.
590
591 New : You can now add shortcut using the `shortcut` tag.
592
593 :Example:
594
595 .. code-block:: xml
596
597     <shortcut 
598         name="Draft Purchase Order (Proposals)" 
599         model="purchase.order" 
600         logins="demo" 
601         menu="m"/>
602
603 Note that you should add an id attribute on the `menuitem` which is referred by 
604 menu attribute.
605
606 .. code-block:: xml
607
608     <record model="ir.ui.view" id="v">
609         <field name="name">sale.order.form</field>
610         <field name="model">sale.order</field>
611         <field name="priority" eval="2"/>
612         <field name="arch" type="xml">
613                 <form string="Sale Order">
614                     .........
615                 </form>
616         </field>
617     </record>
618
619 Default value for the priority field : 16. When not specified the system will use the view with the lower priority.
620
621 View Types
622 ++++++++++
623
624 Tree View
625 """""""""
626 You can specify the columns to include in the list, along with some details of
627 the list's appearance. The search fields aren't specified here, they're 
628 specified by the `select` attribute in the form view fields.
629
630 .. code-block:: xml
631
632         <record id="view_location_tree2" model="ir.ui.view">
633             <field name="name">stock.location.tree</field>
634             <field name="model">stock.location</field>
635             <field name="type">tree</field>
636             <field name="priority" eval="2"/>
637             <field name="arch" type="xml">
638                 <tree 
639                         colors="blue:usage=='view';darkred:usage=='internal'">
640                         
641                     <field name="complete_name"/>
642                     <field name="usage"/>
643                     <field 
644                         name="stock_real" 
645                         invisible="'product_id' not in context"/>
646                     <field 
647                         name="stock_virtual" 
648                         invisible="'product_id' not in context"/>
649                 </tree>
650             </field>
651         </record>
652
653 That example is just a flat list, but you can also display a real tree structure
654 by specifying a `field_parent`. The name is a bit misleading, though; the field
655 you specify must contain a list of all **child** entries.
656
657 .. code-block:: xml
658
659         <record id="view_location_tree" model="ir.ui.view">
660             <field name="name">stock.location.tree</field>
661             <field name="model">stock.location</field>
662             <field name="type">tree</field>
663             <field name="field_parent">child_ids</field>
664             <field name="arch" type="xml">
665                 <tree toolbar="1">
666                     <field icon="icon" name="name"/>
667                 </tree>
668             </field>
669         </record>
670
671
672 On the `tree` element, the following attributes are supported:
673
674 colors
675         Conditions for applying different colors to items in the list. The default
676         is black.
677 toolbar
678         Set this to 1 if you want a tree structure to list the top level entries
679         in a separate toolbar area. When you click on an entry in the toolbar, all
680         its descendants will be displayed in the main tree. The value is ignored
681         for flat lists.
682
683 Grouping Elements
684 +++++++++++++++++
685
686 Separator
687 """""""""
688
689 Adds a separator line
690
691 :Example:
692
693 .. code-block:: xml
694
695     <separator string="Links" colspan="4"/>
696
697 The string attribute defines its label and the colspan attribute defines his horizontal size (in number of columns).
698
699 Notebook
700 """"""""
701
702 <notebook>: With notebooks you can distribute the view fields on different tabs (each one defined by a page tag). You can use the tabpos properties to set tab at: up, down, left, right.
703
704 :Example:
705
706 .. code-block:: xml
707
708     <notebook colspan="4">....</notebook>
709
710 Group
711 """""
712
713 <group>: groups several columns and split the group in as many columns as desired.
714
715     * **colspan**: the number of columns to use
716     * **rowspan**: the number of rows to use
717     * **expand**: if we should expand the group or not
718     * **col**: the number of columns to provide (to its children)
719     * **string**: (optional) If set, a frame will be drawn around the group of fields, with a label containing the string. Otherwise, the frame will be invisible.
720
721 :Example:
722
723 .. code-block:: xml
724
725     <group col="3" colspan="2">
726         <field name="invoiced" select="2"/>
727         <button colspan="1" name="make_invoice" states="confirmed" string="Make Invoice"
728             type="object"/>
729     </group>
730
731 Page
732 """"
733
734 Defines a new notebook page for the view.
735
736 :Example:
737
738 .. code-block:: xml
739
740     <page string="Order Line"> ... </page>:
741
742 * **string**: defines the name of the page.
743
744 Data Elements
745 +++++++++++++
746
747 Field
748 """""
749
750 :guilabel:`attributes for the "field" tag`
751
752     * ``select="1"``: mark this field as being one of the search criteria for 
753         this resource's search view. A value of 1 means that the field is
754         included in the basic search, and a value of 2 means that it is in
755         the advanced search.
756
757     * ``colspan="4"``: the number of columns on which a field must extend.
758
759     * ``readonly="1"``: set the widget as read only
760
761     * ``required="1"``: the field is marked as required. If a field is marked as required, a user has to fill it the system won't save the resource if the field is not filled. This attribute supersede the required field value defined in the object.
762
763     * ``nolabel="1"``: hides the label of the field (but the field is not hidden in the search view).
764
765     * ``invisible="True"``: hides both the label and the field.
766
767     * ``password="True"``: replace field values by asterisks, "*".
768
769     * ``string=""``: change the field label. Note that this label is also used in the search view: see select attribute above).
770
771     * ``domain``: can restrict the domain.
772           + Example: domain="[('partner_id','=',partner_id)]"
773
774     * ``widget``: can change the widget.
775           + Example: widget="one2many_list"
776                 - one2one_list
777                 - one2many_list
778                 - many2one_list
779                 - many2many
780                 - url
781                 - email
782                 - image
783                 - float_time
784                 - reference
785
786     * ``mode``: sequences of the views when switching.            
787         + Example: mode="tree,graph"
788
789     * ``on_change``: define a function that is called when the content of the field changes.
790           + Example: on_change="onchange_partner(type,partner_id)"
791           + See ViewsSpecialProperties for details
792
793     * ``attrs``: Permits to define attributes of a field depends on other fields of the same window. (It can be use on     page, group, button and notebook tag also)
794           + Format: "{'attribute':[('field_name','operator','value'),('field_name','operator','value')],'attribute2':[('field_name','operator','value'),]}"
795           + where attribute will be readonly, invisible, required
796           + Default value: {}.
797           + Example: (in product.product)
798
799         .. code-block:: xml
800
801             <field digits="(14, 3)" name="volume" attrs="{'readonly':[('type','=','service')]}"/>
802
803     * ``eval``: evaluate the attribute content as if it was Python code (see :ref:`below <eval-attribute-link>` for example)
804
805     * ``default_focus``: set to ``1`` to put the focus (cursor position) on this field when the form is first opened.
806       There can only be one field within a view having this attribute set to ``1`` **(new as of 5.2)**
807
808         .. code-block:: xml
809
810             <field name="name" default_focus=”1”/> 
811
812
813 Example
814
815 Here's the source code of the view of a sale order object. This is the same object as the object shown on the screen shots of the presentation.
816
817 :Example:
818
819 .. code-block:: xml
820
821     <?xml version="1.0"?>
822     <openerp>
823         <data>
824         <record id="view_partner_form" model="ir.ui.view">
825                 <field name="name">res.partner.form</field>
826                 <field name="model">res.partner</field>
827                 <field name="type">form</field>
828                 <field name="arch" type="xml">
829                 <form string="Partners">
830                     <group colspan="4" col="6">
831                         <field name="name" select="1"/>
832                         <field name="ref" select="1"/>
833                         <field name="customer" select="1"/>
834                         <field domain="[('domain', '=', 'partner')]" name="title"/>
835                         <field name="lang" select="2"/>
836                         <field name="supplier" select="2"/>
837                     </group>
838                     <notebook colspan="4">
839                         <page string="General">
840                             <field colspan="4" mode="form,tree" name="address"
841                              nolabel="1" select="1">
842                                 <form string="Partner Contacts">
843                                     <field name="name" select="2"/>
844                                     <field domain="[('domain', '=', 'contact')]" name="title"/>
845                                     <field name="function"/>
846                                     <field name="type" select="2"/>
847                                     <field name="street" select="2"/>
848                                     <field name="street2"/>
849                                     <newline/>
850                                     <field name="zip" select="2"/>
851                                     <field name="city" select="2"/>
852                                     <newline/>
853                                     <field completion="1" name="country_id" select="2"/>
854                                     <field name="state_id" select="2"/>
855                                     <newline/>
856                                     <field name="phone"/>
857                                     <field name="fax"/>
858                                     <newline/>
859                                     <field name="mobile"/>
860                                     <field name="email" select="2" widget="email"/>
861                                 </form>
862                                 <tree string="Partner Contacts">
863                                     <field name="name"/>
864                                     <field name="zip"/>
865                                     <field name="city"/>
866                                     <field name="country_id"/>
867                                     <field name="phone"/>
868                                     <field name="email"/>
869                                 </tree>
870                             </field>
871                             <separator colspan="4" string="Categories"/>
872                             <field colspan="4" name="category_id" nolabel="1" select="2"/>
873                         </page>
874                         <page string="Sales &amp; Purchases">
875                             <separator string="General Information" colspan="4"/>
876                             <field name="user_id" select="2"/>
877                             <field name="active" select="2"/>
878                             <field name="website" widget="url"/>
879                             <field name="date" select="2"/>
880                             <field name="parent_id"/>
881                             <newline/>
882                         </page>
883                         <page string="History">
884                             <field colspan="4" name="events" nolabel="1" widget="one2many_list"/>
885                         </page>
886                         <page string="Notes">
887                             <field colspan="4" name="comment" nolabel="1"/>
888                         </page>
889                     </notebook>
890                 </form>
891                 </field>
892             </record>
893         <menuitem
894                 action="action_partner_form"
895                 id="menu_partner_form"
896                 parent="base.menu_base_partner"
897                 sequence="2"/>
898         </data>
899      </openerp>
900
901 .. _eval-attribute-link:
902
903 The eval attribute
904 //////////////////
905
906 The **eval** attribute evaluate its content as if it was Python code. This
907 allows you to define values that are not strings.
908
909 Normally, content inside *<field>* tags are always evaluated as strings.
910
911 .. describe:: Example 1:
912
913 .. code-block:: xml
914
915     <field name="value">2.3</field>
916
917 This will evaluate to the string ``'2.3'`` and not the float ``2.3``
918
919 .. describe:: Example 2:
920
921 .. code-block:: xml
922
923     <field name="value">False</field>
924
925 This will evaluate to the string ``'False'`` and not the boolean
926 ``False``. This is especially tricky because Python's conversion rules
927 consider any non-empty string to be ``True``, so the above code will
928 end up storing the opposite of what is desired. 
929
930 If you want to evaluate the value to a float, a boolean or another
931 type, except string, you need to use the **eval** attribute:
932
933 .. code-block:: xml
934
935     <field name="value" eval="2.3" />
936     <field name="value" eval="False" />
937
938 Button
939 """"""
940
941 Adds a button to the current view. Allows the user to perform various
942 actions on the current record.
943
944 After a button has been clicked, the record should always be reloaded.
945
946 Buttons have the following attributes:
947
948 ``@type``
949   Defines the type of action performed when the button is activated:
950
951   ``workflow`` (default)
952     The button will send a workflow signal [#]_ on the current model
953     using the ``@name`` of the button as workflow signal name and
954     providing the record id as parameter (in a list).
955
956     The workflow signal may return an action descriptor, which should
957     be executed. Otherwise it will return ``False``.
958
959   ``object``
960     The button will execute the method of name ``@name`` on the
961     current model, providing the record id as parameter (in a
962     list). This call may return an action descriptor to execute.
963
964   ``action``
965     The button will trigger the execution of an action
966     (``ir.actions.actions``). The ``id`` of this action is the
967     ``@name`` of the button.
968
969     From there, follows the normal action-execution workflow.
970
971 ``@special``
972   Only has one possible value currently: ``cancel``, which indicates
973   that the popup should be closed without performing any RPC call or
974   action resolution.
975
976   .. note::
977      Only meaningful within a popup-type window (e.g. a
978      wizard). Otherwise, is a noop.
979
980   .. warning::
981
982      ``@special`` and ``@type`` are incompatible.
983
984 ``@name``
985   The button's identifier, used to indicate which method should be
986   called, which signal sent or which action executed.
987
988 ``@confirm``
989   A confirmation popup to display before executing the button's
990   task. If the confirmation is dismissed the button's task *must not*
991   be executed.
992
993 ``@string``
994   The label which should be displayed on the button [#]_.
995
996 ``@icon``
997   Display an icon on the button, if absent the button is text-only
998   [#]_.
999
1000 ``@states``, ``@attrs``, ``@invisible``
1001   Standard OpenERP meaning for those view attributes
1002
1003 ``@default_focus``
1004   If set to a truthy value (``1``), automatically selects that button
1005   so it is used if ``RETURN`` is pressed while on the form.
1006
1007   May be ignored by the client.
1008
1009   .. versionadded:: 6.0
1010
1011 :Example:
1012
1013 .. code-block:: xml
1014
1015     <button name="order_confirm" states="draft" string="Confirm Order" icon="gtk-execute"/>
1016     <button name="_action_open_window" string="Open Margins" type="object" default_focus=”1”/>
1017
1018 Label
1019 """""
1020
1021 Adds a simple label using the string attribute as caption.
1022
1023 :Example:
1024
1025 .. code-block:: xml
1026
1027     <label string="Test"/>
1028
1029 New Line
1030 """"""""
1031
1032 Force a return to the line even if all the columns of the view are not filled in.
1033
1034 :Example:
1035
1036 .. code-block:: xml
1037
1038     <newline/>
1039
1040 .. [#] via ``exec_workflow`` on the ``object`` rpc endpoint
1041
1042 .. [#] in form view, in list view buttons have no label
1043
1044 .. [#] behavior in list view is undefined, as list view buttons don't
1045        have labels.
1046
1047
1048 Inheritance in Views 
1049 --------------------
1050
1051 When you create and inherit objects in some custom or specific modules, it is better to inherit (than to replace) from an existing view to add/modify/delete some fields and preserve the others.
1052
1053 :Example:
1054
1055 .. code-block:: xml
1056
1057         <record model="ir.ui.view" id="view_partner_form">
1058             <field name="name">res.partner.form.inherit</field>
1059             <field name="model">res.partner</field>
1060             <field name="inherit_id" ref="base.view_partner_form"/>
1061             <field name="arch" type="xml">
1062                 <notebook position="inside">
1063                     <page string="Relations">
1064                         <field name="relation_ids" colspan="4" nolabel="1"/>
1065                     </page>
1066                 </notebook>
1067             </field>
1068         </record>
1069
1070 This will add a page to the notebook of the ``res.partner.form`` view in the 
1071 base module.
1072
1073 The inheritance engine will parse the existing view and search for the root nodes of
1074
1075 .. code-block:: xml
1076
1077         <field name="arch" type="xml">
1078
1079 It will append or edit the content of this tag. If this tag has some attributes, 
1080 it will look in the parent view for a node with matching attributes (except 
1081 position).
1082
1083 You can use these values in the position attribute:
1084
1085     * inside (default): your values will be appended inside the tag
1086     * after: add the content after the tag
1087     * before: add the content before the tag
1088     * replace: replace the content of the tag. 
1089
1090 Replacing Content
1091 +++++++++++++++++
1092
1093 .. code-block:: xml
1094
1095         <record model="ir.ui.view" id="view_partner_form1">
1096             <field name="name">res.partner.form.inherit1</field>
1097             <field name="model">res.partner</field>
1098             <field name="inherit_id" ref="base.view_partner_form"/>
1099             <field name="arch" type="xml">
1100                 <page string="Extra Info" position="replace">
1101                     <field name="relation_ids" colspan="4" nolabel="1"/>
1102                 </page>
1103             </field>
1104         </record>
1105
1106 Will replace the content of the Extra Info tab of the notebook with the ``relation_ids`` field.
1107
1108 The parent and the inherited views are correctly updated with ``--update=all`` argument like any other views.
1109
1110 Deleting Content
1111 ++++++++++++++++
1112
1113 To delete a field from a form, an empty element with ``position="replace"`` attribute is used. Example:
1114
1115 .. code-block:: xml
1116
1117         <record model="ir.ui.view" id="view_partner_form2">
1118             <field name="name">res.partner.form.inherit2</field>
1119             <field name="model">res.partner</field>
1120             <field name="inherit_id" ref="base.view_partner_form"/>
1121             <field name="arch" type="xml">
1122                 <field name="lang" position="replace"/>
1123             </field>
1124         </record>
1125
1126 Inserting Content
1127 +++++++++++++++++
1128
1129 To add a field into a form before the specified tag use ``position="before"`` attribute. 
1130
1131 .. code-block:: xml
1132
1133         <record model="ir.ui.view" id="view_partner_form3">
1134             <field name="name">res.partner.form.inherit3</field>
1135             <field name="model">res.partner</field>
1136             <field name="inherit_id" ref="base.view_partner_form"/>
1137             <field name="arch" type="xml">
1138                 <field name="lang" position="before">
1139                     <field name="relation_ids"/>
1140                 </field>
1141             </field>
1142         </record>
1143         
1144 Will add ``relation_ids`` field before the ``lang`` field.      
1145
1146 To add a field into a form after the specified tag use ``position="after"`` attribute. 
1147
1148 .. code-block:: xml
1149
1150         <record model="ir.ui.view" id="view_partner_form4">
1151             <field name="name">res.partner.form.inherit4</field>
1152             <field name="model">res.partner</field>
1153             <field name="inherit_id" ref="base.view_partner_form"/>
1154             <field name="arch" type="xml">
1155                 <field name="lang" position="after">
1156                     <field name="relation_ids"/>
1157                 </field>
1158             </field>
1159         </record>
1160         
1161 Will add ``relation_ids`` field after the ``lang`` field.
1162
1163
1164 Multiple Changes
1165 ++++++++++++++++
1166
1167 To make changes in more than one location, wrap the fields in a data element.
1168
1169 .. code-block:: xml
1170
1171     <record model="ir.ui.view" id="view_partner_form5">
1172         <field name="name">res.partner.form.inherit5</field>
1173         <field name="model">res.partner</field>
1174         <field name="inherit_id" ref="base.view_partner_form"/>
1175         <field name="arch" type="xml">
1176             <data>
1177                 <field name="lang" position="replace"/>
1178                 <field name="website" position="after">
1179                     <field name="lang"/>
1180                 </field>
1181             </data>
1182         </field>
1183     </record>
1184
1185 Will delete the ``lang`` field from its usual location, and display it after
1186 the ``website`` field.
1187
1188 .. _xpath-element-inheritance:
1189
1190 XPath Element
1191 +++++++++++++
1192
1193 Sometimes a view is too complicated to let you simply identify a target field
1194 by name. For example, the field might appear in two places. When that happens,
1195 you can use an ``xpath`` element to describe where your changes should be 
1196 placed. 
1197
1198 .. code-block:: xml
1199
1200     <record model="ir.ui.view" id="view_partner_form6">
1201         <field name="name">res.partner.form.inherit6</field>
1202         <field name="model">res.partner</field>
1203         <field name="inherit_id" ref="base.view_partner_form"/>
1204         <field name="arch" type="xml">
1205             <data>
1206                 <xpath 
1207                     expr="//field[@name='address']/form/field[@name='email']"
1208                     position="after">
1209                     <field name="age"/>
1210                 </xpath>
1211                 <xpath 
1212                     expr="//field[@name='address']/tree/field[@name='email']"
1213                     position="after">
1214                     <field name="age"/>
1215                 </xpath>
1216             </data>
1217         </field>
1218     </record>
1219     
1220 Will add the ``age`` field after the ``email`` field in both the form and tree 
1221 view of the address list.       
1222
1223
1224 Specify the views you want to use
1225 ---------------------------------
1226
1227 There are some cases where you would like to specify a view other than the default:
1228
1229 - If there are several form or tree views for an object.
1230 - If you want to change the form or tree view used by a relational field 
1231   (one2many for example).
1232
1233 Using the priority field
1234 ++++++++++++++++++++++++
1235
1236 This field is available in the view definition, and is 16 by default. By 
1237 default, OpenERP will display a model using the view with the highest priority
1238 (the smallest number). For example, imagine we have two views for a simple model.
1239 The model *client* with two fields : **firstname** and **lastname**. We will define
1240 two views, one which shows the firstname first, and the other one which shows 
1241 the lastname first.
1242
1243 .. code-block:: xml
1244     :linenos:
1245
1246     <!--
1247         Here is the first view for the model 'client'.
1248         We don't specify a priority field, which means 
1249         by default 16.
1250     -->
1251     <record model="ir.ui.view" id="client_form_view_1">
1252         <field name="name">client.form.view1</field>
1253         <field name="model">client</field>
1254         <field name="type">form</fiel>
1255         <field name="arch" type="xml">
1256             <field name="firstname"/>
1257             <field name="lastname"/>
1258         </field>
1259     </record>
1260
1261     <!--
1262         A second view, which show fields in an other order.
1263         We specify a priority of 15.
1264     -->
1265     <record model="ir.ui.view" id="client_form_view_2">
1266         <field name="name">client.form.view2</field>
1267         <field name="model">client</field>
1268         <field name="priority" eval="15"/>
1269         <field name="type">form</fiel>
1270         <field name="arch" type="xml">
1271             <field name="lastname"/>
1272             <field name="firstname"/>
1273         </field>
1274     </record>
1275
1276 Now, each time OpenERP will have to show a form view for our object *client*, it will have the choice between two views.
1277 **It will always use the second one, because it has a higher priority !** Unless you tell it to use the first one !
1278
1279 Specify per-action view
1280 +++++++++++++++++++++++
1281
1282 To illustrate this point, we will create 2 menus which show a form view for this *client* object :
1283
1284 .. code-block:: xml
1285     :linenos:
1286
1287     <!--
1288         This action open the default view (in our case,
1289         the view with the highest priority, the second one)
1290     -->
1291     <record 
1292         model="ir.actions.act_window" 
1293         id="client_form_action">
1294         <field name="name">client.form.action</field>
1295         <field name="res_model">client</field>
1296         <field name="view_type">form</field>
1297         <field name="view_mode">form</field>
1298     </record>
1299
1300     <!--
1301         This action open the view we specify.
1302     -->
1303     <record 
1304         model="ir.actions.act_window" 
1305         id="client_form_action1">
1306         <field name="name">client.form.action1</field>
1307         <field name="res_model">client</field>
1308         <field name="view_type">form</field>
1309         <field name="view_mode">form</field>
1310         <field name="view_id" ref="client_form_view_1"/>
1311     </record>
1312
1313     <menuitem id="menu_id" name="Client main menu"/>
1314     <menuitem 
1315         id="menu_id_1" 
1316         name="Here we don't specify the view"
1317         action="client_form_action" parent="menu_id"/>
1318     <menuitem 
1319         id="menu_id_1" 
1320         name="Here we specify the view"
1321         action="client_form_action1" parent="menu_id"/>
1322
1323 As you can see on line *19*, we can specify a view. That means that when we open 
1324 the second menu, OpenERP will use the form view *client_form_view_1*, regardless
1325 of its priority.
1326
1327 .. note::
1328
1329     Remember to use the module name (*module.view_id*) in the *ref* attribute if 
1330     you are referring to a view defined in another module.
1331
1332 Specify views for related fields
1333 ++++++++++++++++++++++++++++++++
1334
1335 Using the context
1336 """""""""""""""""
1337
1338 The *view_id* method works very well for menus/actions, but how can you specify the view to use for a one2many
1339 field, for example? When you have a one2many field, two views are used, a tree view (**in blue**), and a form view when
1340 you click on the add button (**in red**).
1341
1342 .. .. figure::  images/one2many_views.png
1343 ..     :scale: 70%
1344 ..     :align: center
1345
1346 When you add a one2many field in a form view, you do something like this :
1347
1348 .. code-block:: xml
1349
1350     <field name="order_line" colspan="4" nolabel="1"/>
1351
1352 If you want to specify the views to use, you can add a *context* attribute, and
1353 specify a view id for each type of view supported, exactly like the action's 
1354 *view_id* attribute:
1355
1356 .. code-block:: xml
1357
1358     <field name="order_line" colspan="4" nolabel="1"
1359            context="{'form_view_ref' : 'module.view_id', 'tree_view_ref' : 'model.view_id'}"/>
1360
1361 If you don't specify the views, OpenERP will choose one in this order :
1362
1363 1. It will use the <form> or <tree> view defined **inside** the field (see below)
1364 2. Else, it will use the views with the highest priority for this object.
1365 3. Finally, it will generate default empty views, with all fields.
1366
1367 .. note::
1368
1369     The context keys are named <view_type>_view_ref.
1370
1371 .. note::
1372
1373     By default, OpenERP will never use a view that is not defined for your object. If you have two models, with the
1374     same fields, but a different model name, OpenERP will never use the view of one for the other,
1375     even if one model inherit an other.
1376
1377     You can force this by manually specifying the view, either in the action or in the context.
1378
1379 Using subviews
1380 """"""""""""""
1381
1382 In the case of relational fields, you can create a view directly inside a field :
1383
1384 .. code-block:: xml
1385
1386     <record model="ir.ui.view" id="some_view">
1387         <field name="name">some.view</field>
1388         <field name="type">form</field>
1389         <field name="model">some.model.with.one2many</field>
1390         <field name="arch" type="xml">
1391             <field name="..."/>
1392             
1393             <!-- <=== order_line is a one2many field -->
1394             <field name="order_line" colspan="4" nolabel="1">
1395                 <form>
1396                     <field name="qty"/>
1397                     ...
1398                 </form>
1399                 <tree>
1400                     <field name="qty"/>
1401                     ...
1402                 </tree>
1403             </field>
1404     </field>
1405
1406 If you or another developer want to inherit from this view in another module,
1407 you need to inherit from the parent view and then modify the child fields.
1408 With child views, you'll often need to use an :ref:`xpath-element-inheritance`
1409 to describe exactly where to place your new fields.
1410
1411 .. code-block:: xml
1412
1413     <record model="ir.ui.view" id="some_inherited_view">
1414         <field name="name">some.inherited.view</field>
1415         <field name="type">form</field>
1416         <field name="model">some.model.with.one2many</field>
1417         <field name="inherit_id" ref="core_module.some_view"/>
1418         <field name="arch" type="xml">
1419             <data>
1420                 <xpath 
1421                    expr="//field[@name='order_line']/form/field[@name='qty']"
1422                    position="after">
1423                    <field name="size"/>
1424                 </xpath>
1425                 <xpath 
1426                    expr="//field[@name='order_line']/tree/field[@name='qty']"
1427                    position="after">
1428                    <field name="size"/>
1429                 </xpath>
1430             </data>
1431     </field>
1432
1433 One down side of defining a subview like this is that it can't be inherited on
1434 its own, it can only be inherited with the parent view. Your views will be more
1435 flexible if you define the child views separately and then specify which child
1436 view to use as part of the one2many field.
1437
1438