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